diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java index 608af3a..32cc8a4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java @@ -2,48 +2,47 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.delivery.decorator.ByteDecorator; +import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @AllArgsConstructor public class FieldDecoratorManger { - private final RuleDictDao ruleDictDao; + private final RuleConfigRegistry ruleDictDao; // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 // (1)静态的业务字段是字典里面可以配置的 // (2)动态的业务字段是通过规则生成的 public String contentMerge(String ruleJson, String sceneConent, String dynamicContent) { - List ruleDictList = ruleDictDao.getRuleDictConfig(); - Map ruleDictMap = ruleDictList.stream().collect( - Collectors.toMap(RuleDict::getId, e -> e)); - List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); - for (Map ruleMap : ruleMapList) { - String ruleType = String.valueOf(ruleMap.get("ruleType")); - ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); - NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); - byteDecorator.nodeDecoratorRule(nodeDecoratorParm); - } +// List ruleDictList = ruleDictDao.getRuleDictConfig(); +// Map ruleDictMap = ruleDictList.stream().collect( +// Collectors.toMap(RuleDict::getId, e -> e)); +// List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); +// for (Map ruleMap : ruleMapList) { +// String ruleType = String.valueOf(ruleMap.get("ruleType")); +// ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); +// NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); +// byteDecorator.nodeDecoratorRule(nodeDecoratorParm); +// } return null; } - - private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { - NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() - .contents(sceneConent) - .dynamicContent(dynamicContent) - .ruletypeId(ruletypeId) - .ruleDictMap(ruleDictMap) - .build(); - return nodeDecoratorParm; - } +// +// private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { +// NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() +// .contents(sceneConent) +// .dynamicContent(dynamicContent) +// .ruletypeId(ruletypeId) +// .ruleDictMap(ruleDictMap) +// .build(); +// return nodeDecoratorParm; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java index 608af3a..32cc8a4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java @@ -2,48 +2,47 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.delivery.decorator.ByteDecorator; +import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @AllArgsConstructor public class FieldDecoratorManger { - private final RuleDictDao ruleDictDao; + private final RuleConfigRegistry ruleDictDao; // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 // (1)静态的业务字段是字典里面可以配置的 // (2)动态的业务字段是通过规则生成的 public String contentMerge(String ruleJson, String sceneConent, String dynamicContent) { - List ruleDictList = ruleDictDao.getRuleDictConfig(); - Map ruleDictMap = ruleDictList.stream().collect( - Collectors.toMap(RuleDict::getId, e -> e)); - List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); - for (Map ruleMap : ruleMapList) { - String ruleType = String.valueOf(ruleMap.get("ruleType")); - ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); - NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); - byteDecorator.nodeDecoratorRule(nodeDecoratorParm); - } +// List ruleDictList = ruleDictDao.getRuleDictConfig(); +// Map ruleDictMap = ruleDictList.stream().collect( +// Collectors.toMap(RuleDict::getId, e -> e)); +// List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); +// for (Map ruleMap : ruleMapList) { +// String ruleType = String.valueOf(ruleMap.get("ruleType")); +// ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); +// NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); +// byteDecorator.nodeDecoratorRule(nodeDecoratorParm); +// } return null; } - - private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { - NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() - .contents(sceneConent) - .dynamicContent(dynamicContent) - .ruletypeId(ruletypeId) - .ruleDictMap(ruleDictMap) - .build(); - return nodeDecoratorParm; - } +// +// private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { +// NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() +// .contents(sceneConent) +// .dynamicContent(dynamicContent) +// .ruletypeId(ruletypeId) +// .ruleDictMap(ruleDictMap) +// .build(); +// return nodeDecoratorParm; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java index 652970c..b204ac3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java @@ -1,56 +1,56 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@AllArgsConstructor -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", - JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Component; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Component("logicalDecorator") +//@AllArgsConstructor +//@Slf4j +//public class LogicalShiftDecorator implements ByteDecorator { +// +//// private final FieldRuleEngineMapper fieldRuleEngineMapper; +//// +//// //字节位移 +//// @Override +//// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +//// String logicalValue = ""; +//// RuleEvaluator fieldRuleEngine = new RuleEvaluator(); +//// try { +//// Map env2 = new HashMap(); +//// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +//// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +//// for (String contentId : contentIdList) { +//// RuleDict ruleDict = ruleDictMap.get(contentId); +//// if (ruleDict.getCode().contains("#")) { +//// //使用动态的值 +//// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +//// } +//// env2.put(ruleDict.getName(), ruleDict.getCode()); +//// } +//// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +//// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +//// return null; +//// } +//// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +//// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +//// return values; +//// } catch (Exception ex) { +//// log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", +//// JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +//// return null; +//// } +//// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java index 608af3a..32cc8a4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java @@ -2,48 +2,47 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.delivery.decorator.ByteDecorator; +import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @AllArgsConstructor public class FieldDecoratorManger { - private final RuleDictDao ruleDictDao; + private final RuleConfigRegistry ruleDictDao; // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 // (1)静态的业务字段是字典里面可以配置的 // (2)动态的业务字段是通过规则生成的 public String contentMerge(String ruleJson, String sceneConent, String dynamicContent) { - List ruleDictList = ruleDictDao.getRuleDictConfig(); - Map ruleDictMap = ruleDictList.stream().collect( - Collectors.toMap(RuleDict::getId, e -> e)); - List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); - for (Map ruleMap : ruleMapList) { - String ruleType = String.valueOf(ruleMap.get("ruleType")); - ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); - NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); - byteDecorator.nodeDecoratorRule(nodeDecoratorParm); - } +// List ruleDictList = ruleDictDao.getRuleDictConfig(); +// Map ruleDictMap = ruleDictList.stream().collect( +// Collectors.toMap(RuleDict::getId, e -> e)); +// List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); +// for (Map ruleMap : ruleMapList) { +// String ruleType = String.valueOf(ruleMap.get("ruleType")); +// ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); +// NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); +// byteDecorator.nodeDecoratorRule(nodeDecoratorParm); +// } return null; } - - private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { - NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() - .contents(sceneConent) - .dynamicContent(dynamicContent) - .ruletypeId(ruletypeId) - .ruleDictMap(ruleDictMap) - .build(); - return nodeDecoratorParm; - } +// +// private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { +// NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() +// .contents(sceneConent) +// .dynamicContent(dynamicContent) +// .ruletypeId(ruletypeId) +// .ruleDictMap(ruleDictMap) +// .build(); +// return nodeDecoratorParm; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java index 652970c..b204ac3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java @@ -1,56 +1,56 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@AllArgsConstructor -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", - JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Component; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Component("logicalDecorator") +//@AllArgsConstructor +//@Slf4j +//public class LogicalShiftDecorator implements ByteDecorator { +// +//// private final FieldRuleEngineMapper fieldRuleEngineMapper; +//// +//// //字节位移 +//// @Override +//// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +//// String logicalValue = ""; +//// RuleEvaluator fieldRuleEngine = new RuleEvaluator(); +//// try { +//// Map env2 = new HashMap(); +//// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +//// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +//// for (String contentId : contentIdList) { +//// RuleDict ruleDict = ruleDictMap.get(contentId); +//// if (ruleDict.getCode().contains("#")) { +//// //使用动态的值 +//// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +//// } +//// env2.put(ruleDict.getName(), ruleDict.getCode()); +//// } +//// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +//// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +//// return null; +//// } +//// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +//// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +//// return values; +//// } catch (Exception ex) { +//// log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", +//// JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +//// return null; +//// } +//// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java index 346468f..822fead 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@AllArgsConstructor -@Slf4j -public class OperationDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("optionDecorator") +//@AllArgsConstructor +//@Slf4j +//public class OperationDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //混合运算,有常量或者乘除的缩放 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java index 608af3a..32cc8a4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java @@ -2,48 +2,47 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.delivery.decorator.ByteDecorator; +import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @AllArgsConstructor public class FieldDecoratorManger { - private final RuleDictDao ruleDictDao; + private final RuleConfigRegistry ruleDictDao; // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 // (1)静态的业务字段是字典里面可以配置的 // (2)动态的业务字段是通过规则生成的 public String contentMerge(String ruleJson, String sceneConent, String dynamicContent) { - List ruleDictList = ruleDictDao.getRuleDictConfig(); - Map ruleDictMap = ruleDictList.stream().collect( - Collectors.toMap(RuleDict::getId, e -> e)); - List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); - for (Map ruleMap : ruleMapList) { - String ruleType = String.valueOf(ruleMap.get("ruleType")); - ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); - NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); - byteDecorator.nodeDecoratorRule(nodeDecoratorParm); - } +// List ruleDictList = ruleDictDao.getRuleDictConfig(); +// Map ruleDictMap = ruleDictList.stream().collect( +// Collectors.toMap(RuleDict::getId, e -> e)); +// List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); +// for (Map ruleMap : ruleMapList) { +// String ruleType = String.valueOf(ruleMap.get("ruleType")); +// ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); +// NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); +// byteDecorator.nodeDecoratorRule(nodeDecoratorParm); +// } return null; } - - private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { - NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() - .contents(sceneConent) - .dynamicContent(dynamicContent) - .ruletypeId(ruletypeId) - .ruleDictMap(ruleDictMap) - .build(); - return nodeDecoratorParm; - } +// +// private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { +// NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() +// .contents(sceneConent) +// .dynamicContent(dynamicContent) +// .ruletypeId(ruletypeId) +// .ruleDictMap(ruleDictMap) +// .build(); +// return nodeDecoratorParm; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java index 652970c..b204ac3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java @@ -1,56 +1,56 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@AllArgsConstructor -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", - JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Component; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Component("logicalDecorator") +//@AllArgsConstructor +//@Slf4j +//public class LogicalShiftDecorator implements ByteDecorator { +// +//// private final FieldRuleEngineMapper fieldRuleEngineMapper; +//// +//// //字节位移 +//// @Override +//// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +//// String logicalValue = ""; +//// RuleEvaluator fieldRuleEngine = new RuleEvaluator(); +//// try { +//// Map env2 = new HashMap(); +//// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +//// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +//// for (String contentId : contentIdList) { +//// RuleDict ruleDict = ruleDictMap.get(contentId); +//// if (ruleDict.getCode().contains("#")) { +//// //使用动态的值 +//// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +//// } +//// env2.put(ruleDict.getName(), ruleDict.getCode()); +//// } +//// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +//// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +//// return null; +//// } +//// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +//// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +//// return values; +//// } catch (Exception ex) { +//// log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", +//// JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +//// return null; +//// } +//// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java index 346468f..822fead 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@AllArgsConstructor -@Slf4j -public class OperationDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("optionDecorator") +//@AllArgsConstructor +//@Slf4j +//public class OperationDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //混合运算,有常量或者乘除的缩放 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java index 50fb0a7..7a8bccb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@AllArgsConstructor -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +////精度计算 +//@AllArgsConstructor +//@Registry("precisionDecorator") +//@Slf4j +//public class PrecisionDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java index 608af3a..32cc8a4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java @@ -2,48 +2,47 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.delivery.decorator.ByteDecorator; +import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @AllArgsConstructor public class FieldDecoratorManger { - private final RuleDictDao ruleDictDao; + private final RuleConfigRegistry ruleDictDao; // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 // (1)静态的业务字段是字典里面可以配置的 // (2)动态的业务字段是通过规则生成的 public String contentMerge(String ruleJson, String sceneConent, String dynamicContent) { - List ruleDictList = ruleDictDao.getRuleDictConfig(); - Map ruleDictMap = ruleDictList.stream().collect( - Collectors.toMap(RuleDict::getId, e -> e)); - List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); - for (Map ruleMap : ruleMapList) { - String ruleType = String.valueOf(ruleMap.get("ruleType")); - ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); - NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); - byteDecorator.nodeDecoratorRule(nodeDecoratorParm); - } +// List ruleDictList = ruleDictDao.getRuleDictConfig(); +// Map ruleDictMap = ruleDictList.stream().collect( +// Collectors.toMap(RuleDict::getId, e -> e)); +// List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); +// for (Map ruleMap : ruleMapList) { +// String ruleType = String.valueOf(ruleMap.get("ruleType")); +// ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); +// NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); +// byteDecorator.nodeDecoratorRule(nodeDecoratorParm); +// } return null; } - - private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { - NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() - .contents(sceneConent) - .dynamicContent(dynamicContent) - .ruletypeId(ruletypeId) - .ruleDictMap(ruleDictMap) - .build(); - return nodeDecoratorParm; - } +// +// private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { +// NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() +// .contents(sceneConent) +// .dynamicContent(dynamicContent) +// .ruletypeId(ruletypeId) +// .ruleDictMap(ruleDictMap) +// .build(); +// return nodeDecoratorParm; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java index 652970c..b204ac3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java @@ -1,56 +1,56 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@AllArgsConstructor -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", - JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Component; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Component("logicalDecorator") +//@AllArgsConstructor +//@Slf4j +//public class LogicalShiftDecorator implements ByteDecorator { +// +//// private final FieldRuleEngineMapper fieldRuleEngineMapper; +//// +//// //字节位移 +//// @Override +//// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +//// String logicalValue = ""; +//// RuleEvaluator fieldRuleEngine = new RuleEvaluator(); +//// try { +//// Map env2 = new HashMap(); +//// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +//// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +//// for (String contentId : contentIdList) { +//// RuleDict ruleDict = ruleDictMap.get(contentId); +//// if (ruleDict.getCode().contains("#")) { +//// //使用动态的值 +//// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +//// } +//// env2.put(ruleDict.getName(), ruleDict.getCode()); +//// } +//// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +//// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +//// return null; +//// } +//// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +//// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +//// return values; +//// } catch (Exception ex) { +//// log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", +//// JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +//// return null; +//// } +//// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java index 346468f..822fead 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@AllArgsConstructor -@Slf4j -public class OperationDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("optionDecorator") +//@AllArgsConstructor +//@Slf4j +//public class OperationDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //混合运算,有常量或者乘除的缩放 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java index 50fb0a7..7a8bccb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@AllArgsConstructor -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +////精度计算 +//@AllArgsConstructor +//@Registry("precisionDecorator") +//@Slf4j +//public class PrecisionDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java index da39235..27f9cc7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java @@ -1,54 +1,53 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@AllArgsConstructor -@Slf4j -public class RuleDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("ruleDecorator") +//@AllArgsConstructor +//@Slf4j +//public class RuleDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //吃我一套正则表达式 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (Exception ex) { +// log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java index 608af3a..32cc8a4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java @@ -2,48 +2,47 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.delivery.decorator.ByteDecorator; +import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @AllArgsConstructor public class FieldDecoratorManger { - private final RuleDictDao ruleDictDao; + private final RuleConfigRegistry ruleDictDao; // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 // (1)静态的业务字段是字典里面可以配置的 // (2)动态的业务字段是通过规则生成的 public String contentMerge(String ruleJson, String sceneConent, String dynamicContent) { - List ruleDictList = ruleDictDao.getRuleDictConfig(); - Map ruleDictMap = ruleDictList.stream().collect( - Collectors.toMap(RuleDict::getId, e -> e)); - List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); - for (Map ruleMap : ruleMapList) { - String ruleType = String.valueOf(ruleMap.get("ruleType")); - ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); - NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); - byteDecorator.nodeDecoratorRule(nodeDecoratorParm); - } +// List ruleDictList = ruleDictDao.getRuleDictConfig(); +// Map ruleDictMap = ruleDictList.stream().collect( +// Collectors.toMap(RuleDict::getId, e -> e)); +// List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); +// for (Map ruleMap : ruleMapList) { +// String ruleType = String.valueOf(ruleMap.get("ruleType")); +// ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); +// NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); +// byteDecorator.nodeDecoratorRule(nodeDecoratorParm); +// } return null; } - - private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { - NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() - .contents(sceneConent) - .dynamicContent(dynamicContent) - .ruletypeId(ruletypeId) - .ruleDictMap(ruleDictMap) - .build(); - return nodeDecoratorParm; - } +// +// private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { +// NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() +// .contents(sceneConent) +// .dynamicContent(dynamicContent) +// .ruletypeId(ruletypeId) +// .ruleDictMap(ruleDictMap) +// .build(); +// return nodeDecoratorParm; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java index 652970c..b204ac3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java @@ -1,56 +1,56 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@AllArgsConstructor -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", - JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Component; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Component("logicalDecorator") +//@AllArgsConstructor +//@Slf4j +//public class LogicalShiftDecorator implements ByteDecorator { +// +//// private final FieldRuleEngineMapper fieldRuleEngineMapper; +//// +//// //字节位移 +//// @Override +//// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +//// String logicalValue = ""; +//// RuleEvaluator fieldRuleEngine = new RuleEvaluator(); +//// try { +//// Map env2 = new HashMap(); +//// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +//// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +//// for (String contentId : contentIdList) { +//// RuleDict ruleDict = ruleDictMap.get(contentId); +//// if (ruleDict.getCode().contains("#")) { +//// //使用动态的值 +//// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +//// } +//// env2.put(ruleDict.getName(), ruleDict.getCode()); +//// } +//// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +//// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +//// return null; +//// } +//// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +//// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +//// return values; +//// } catch (Exception ex) { +//// log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", +//// JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +//// return null; +//// } +//// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java index 346468f..822fead 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@AllArgsConstructor -@Slf4j -public class OperationDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("optionDecorator") +//@AllArgsConstructor +//@Slf4j +//public class OperationDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //混合运算,有常量或者乘除的缩放 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java index 50fb0a7..7a8bccb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@AllArgsConstructor -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +////精度计算 +//@AllArgsConstructor +//@Registry("precisionDecorator") +//@Slf4j +//public class PrecisionDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java index da39235..27f9cc7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java @@ -1,54 +1,53 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@AllArgsConstructor -@Slf4j -public class RuleDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("ruleDecorator") +//@AllArgsConstructor +//@Slf4j +//public class RuleDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //吃我一套正则表达式 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (Exception ex) { +// log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java index 7f5cbf3..c043f97 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java @@ -2,6 +2,6 @@ import java.util.Map; -public interface ComandeEventService { +public interface ComandeEventService{ Map loadComandeEventConfig(String protocolId,String scene); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java index 608af3a..32cc8a4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java @@ -2,48 +2,47 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.delivery.decorator.ByteDecorator; +import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @AllArgsConstructor public class FieldDecoratorManger { - private final RuleDictDao ruleDictDao; + private final RuleConfigRegistry ruleDictDao; // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 // (1)静态的业务字段是字典里面可以配置的 // (2)动态的业务字段是通过规则生成的 public String contentMerge(String ruleJson, String sceneConent, String dynamicContent) { - List ruleDictList = ruleDictDao.getRuleDictConfig(); - Map ruleDictMap = ruleDictList.stream().collect( - Collectors.toMap(RuleDict::getId, e -> e)); - List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); - for (Map ruleMap : ruleMapList) { - String ruleType = String.valueOf(ruleMap.get("ruleType")); - ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); - NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); - byteDecorator.nodeDecoratorRule(nodeDecoratorParm); - } +// List ruleDictList = ruleDictDao.getRuleDictConfig(); +// Map ruleDictMap = ruleDictList.stream().collect( +// Collectors.toMap(RuleDict::getId, e -> e)); +// List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); +// for (Map ruleMap : ruleMapList) { +// String ruleType = String.valueOf(ruleMap.get("ruleType")); +// ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); +// NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); +// byteDecorator.nodeDecoratorRule(nodeDecoratorParm); +// } return null; } - - private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { - NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() - .contents(sceneConent) - .dynamicContent(dynamicContent) - .ruletypeId(ruletypeId) - .ruleDictMap(ruleDictMap) - .build(); - return nodeDecoratorParm; - } +// +// private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { +// NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() +// .contents(sceneConent) +// .dynamicContent(dynamicContent) +// .ruletypeId(ruletypeId) +// .ruleDictMap(ruleDictMap) +// .build(); +// return nodeDecoratorParm; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java index 652970c..b204ac3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java @@ -1,56 +1,56 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@AllArgsConstructor -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", - JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Component; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Component("logicalDecorator") +//@AllArgsConstructor +//@Slf4j +//public class LogicalShiftDecorator implements ByteDecorator { +// +//// private final FieldRuleEngineMapper fieldRuleEngineMapper; +//// +//// //字节位移 +//// @Override +//// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +//// String logicalValue = ""; +//// RuleEvaluator fieldRuleEngine = new RuleEvaluator(); +//// try { +//// Map env2 = new HashMap(); +//// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +//// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +//// for (String contentId : contentIdList) { +//// RuleDict ruleDict = ruleDictMap.get(contentId); +//// if (ruleDict.getCode().contains("#")) { +//// //使用动态的值 +//// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +//// } +//// env2.put(ruleDict.getName(), ruleDict.getCode()); +//// } +//// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +//// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +//// return null; +//// } +//// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +//// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +//// return values; +//// } catch (Exception ex) { +//// log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", +//// JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +//// return null; +//// } +//// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java index 346468f..822fead 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@AllArgsConstructor -@Slf4j -public class OperationDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("optionDecorator") +//@AllArgsConstructor +//@Slf4j +//public class OperationDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //混合运算,有常量或者乘除的缩放 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java index 50fb0a7..7a8bccb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@AllArgsConstructor -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +////精度计算 +//@AllArgsConstructor +//@Registry("precisionDecorator") +//@Slf4j +//public class PrecisionDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java index da39235..27f9cc7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java @@ -1,54 +1,53 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@AllArgsConstructor -@Slf4j -public class RuleDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("ruleDecorator") +//@AllArgsConstructor +//@Slf4j +//public class RuleDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //吃我一套正则表达式 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (Exception ex) { +// log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java index 7f5cbf3..c043f97 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java @@ -2,6 +2,6 @@ import java.util.Map; -public interface ComandeEventService { +public interface ComandeEventService{ Map loadComandeEventConfig(String protocolId,String scene); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java index 476ad84..aaf1837 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java @@ -2,46 +2,46 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.dao.CommandEventDao; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @Slf4j @AllArgsConstructor -public class ComandeEventServiceImpl implements ComandeEventService { +public class ComandeEventServiceImpl implements ComandeEventRegistry { - private final CommandEventDao commandEventDao; + // private final CommandEventDao commandEventDao; // 加密bean 固定字段出现变化的字段解析,业务字段的有序内容 @Override - public Map loadComandeEventConfig(String protocolId,String sceneName) { - CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); - if (ObjectUtil.isEmpty(commandEventConfig)) { - log.error("协议{},没有配置成功接收回复配置,清排查原因"); - return null; - } - String replyJson = commandEventConfig.getReplyContentJson(); - List> replyMapList = JSONArray.parseObject(replyJson, List.class); - List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); - Map fixMap = fixList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); - List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) - .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) - .collect(Collectors.toList()); - Map commandConfigMap = new HashMap<>(); - commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); - commandConfigMap.put("fixContent", fixMap); - commandConfigMap.put("bizContent", contentList); - return commandConfigMap; + public Map loadComandeEventConfig(String protocolId, String sceneName) { +// CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); +// if (ObjectUtil.isEmpty(commandEventConfig)) { +// log.error("协议{},没有配置成功接收回复配置,清排查原因"); +// return null; +// } +// String replyJson = commandEventConfig.getReplyContentJson(); +// List> replyMapList = JSONArray.parseObject(replyJson, List.class); +// List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); +// Map fixMap = fixList.stream() +// .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); +// List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) +// .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) +// .collect(Collectors.toList()); +// Map commandConfigMap = new HashMap<>(); +// commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); +// commandConfigMap.put("fixContent", fixMap); +// commandConfigMap.put("bizContent", contentList); +// return commandConfigMap; + return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java index 608af3a..32cc8a4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java @@ -2,48 +2,47 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.delivery.decorator.ByteDecorator; +import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @AllArgsConstructor public class FieldDecoratorManger { - private final RuleDictDao ruleDictDao; + private final RuleConfigRegistry ruleDictDao; // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 // (1)静态的业务字段是字典里面可以配置的 // (2)动态的业务字段是通过规则生成的 public String contentMerge(String ruleJson, String sceneConent, String dynamicContent) { - List ruleDictList = ruleDictDao.getRuleDictConfig(); - Map ruleDictMap = ruleDictList.stream().collect( - Collectors.toMap(RuleDict::getId, e -> e)); - List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); - for (Map ruleMap : ruleMapList) { - String ruleType = String.valueOf(ruleMap.get("ruleType")); - ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); - NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); - byteDecorator.nodeDecoratorRule(nodeDecoratorParm); - } +// List ruleDictList = ruleDictDao.getRuleDictConfig(); +// Map ruleDictMap = ruleDictList.stream().collect( +// Collectors.toMap(RuleDict::getId, e -> e)); +// List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); +// for (Map ruleMap : ruleMapList) { +// String ruleType = String.valueOf(ruleMap.get("ruleType")); +// ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); +// NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); +// byteDecorator.nodeDecoratorRule(nodeDecoratorParm); +// } return null; } - - private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { - NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() - .contents(sceneConent) - .dynamicContent(dynamicContent) - .ruletypeId(ruletypeId) - .ruleDictMap(ruleDictMap) - .build(); - return nodeDecoratorParm; - } +// +// private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { +// NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() +// .contents(sceneConent) +// .dynamicContent(dynamicContent) +// .ruletypeId(ruletypeId) +// .ruleDictMap(ruleDictMap) +// .build(); +// return nodeDecoratorParm; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java index 652970c..b204ac3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java @@ -1,56 +1,56 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@AllArgsConstructor -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", - JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Component; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Component("logicalDecorator") +//@AllArgsConstructor +//@Slf4j +//public class LogicalShiftDecorator implements ByteDecorator { +// +//// private final FieldRuleEngineMapper fieldRuleEngineMapper; +//// +//// //字节位移 +//// @Override +//// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +//// String logicalValue = ""; +//// RuleEvaluator fieldRuleEngine = new RuleEvaluator(); +//// try { +//// Map env2 = new HashMap(); +//// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +//// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +//// for (String contentId : contentIdList) { +//// RuleDict ruleDict = ruleDictMap.get(contentId); +//// if (ruleDict.getCode().contains("#")) { +//// //使用动态的值 +//// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +//// } +//// env2.put(ruleDict.getName(), ruleDict.getCode()); +//// } +//// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +//// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +//// return null; +//// } +//// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +//// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +//// return values; +//// } catch (Exception ex) { +//// log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", +//// JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +//// return null; +//// } +//// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java index 346468f..822fead 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@AllArgsConstructor -@Slf4j -public class OperationDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("optionDecorator") +//@AllArgsConstructor +//@Slf4j +//public class OperationDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //混合运算,有常量或者乘除的缩放 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java index 50fb0a7..7a8bccb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@AllArgsConstructor -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +////精度计算 +//@AllArgsConstructor +//@Registry("precisionDecorator") +//@Slf4j +//public class PrecisionDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java index da39235..27f9cc7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java @@ -1,54 +1,53 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@AllArgsConstructor -@Slf4j -public class RuleDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("ruleDecorator") +//@AllArgsConstructor +//@Slf4j +//public class RuleDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //吃我一套正则表达式 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (Exception ex) { +// log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java index 7f5cbf3..c043f97 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java @@ -2,6 +2,6 @@ import java.util.Map; -public interface ComandeEventService { +public interface ComandeEventService{ Map loadComandeEventConfig(String protocolId,String scene); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java index 476ad84..aaf1837 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java @@ -2,46 +2,46 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.dao.CommandEventDao; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @Slf4j @AllArgsConstructor -public class ComandeEventServiceImpl implements ComandeEventService { +public class ComandeEventServiceImpl implements ComandeEventRegistry { - private final CommandEventDao commandEventDao; + // private final CommandEventDao commandEventDao; // 加密bean 固定字段出现变化的字段解析,业务字段的有序内容 @Override - public Map loadComandeEventConfig(String protocolId,String sceneName) { - CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); - if (ObjectUtil.isEmpty(commandEventConfig)) { - log.error("协议{},没有配置成功接收回复配置,清排查原因"); - return null; - } - String replyJson = commandEventConfig.getReplyContentJson(); - List> replyMapList = JSONArray.parseObject(replyJson, List.class); - List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); - Map fixMap = fixList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); - List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) - .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) - .collect(Collectors.toList()); - Map commandConfigMap = new HashMap<>(); - commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); - commandConfigMap.put("fixContent", fixMap); - commandConfigMap.put("bizContent", contentList); - return commandConfigMap; + public Map loadComandeEventConfig(String protocolId, String sceneName) { +// CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); +// if (ObjectUtil.isEmpty(commandEventConfig)) { +// log.error("协议{},没有配置成功接收回复配置,清排查原因"); +// return null; +// } +// String replyJson = commandEventConfig.getReplyContentJson(); +// List> replyMapList = JSONArray.parseObject(replyJson, List.class); +// List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); +// Map fixMap = fixList.stream() +// .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); +// List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) +// .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) +// .collect(Collectors.toList()); +// Map commandConfigMap = new HashMap<>(); +// commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); +// commandConfigMap.put("fixContent", fixMap); +// commandConfigMap.put("bizContent", contentList); +// return commandConfigMap; + return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 128b09d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java index 608af3a..32cc8a4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java @@ -2,48 +2,47 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.delivery.decorator.ByteDecorator; +import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @AllArgsConstructor public class FieldDecoratorManger { - private final RuleDictDao ruleDictDao; + private final RuleConfigRegistry ruleDictDao; // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 // (1)静态的业务字段是字典里面可以配置的 // (2)动态的业务字段是通过规则生成的 public String contentMerge(String ruleJson, String sceneConent, String dynamicContent) { - List ruleDictList = ruleDictDao.getRuleDictConfig(); - Map ruleDictMap = ruleDictList.stream().collect( - Collectors.toMap(RuleDict::getId, e -> e)); - List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); - for (Map ruleMap : ruleMapList) { - String ruleType = String.valueOf(ruleMap.get("ruleType")); - ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); - NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); - byteDecorator.nodeDecoratorRule(nodeDecoratorParm); - } +// List ruleDictList = ruleDictDao.getRuleDictConfig(); +// Map ruleDictMap = ruleDictList.stream().collect( +// Collectors.toMap(RuleDict::getId, e -> e)); +// List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); +// for (Map ruleMap : ruleMapList) { +// String ruleType = String.valueOf(ruleMap.get("ruleType")); +// ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); +// NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); +// byteDecorator.nodeDecoratorRule(nodeDecoratorParm); +// } return null; } - - private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { - NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() - .contents(sceneConent) - .dynamicContent(dynamicContent) - .ruletypeId(ruletypeId) - .ruleDictMap(ruleDictMap) - .build(); - return nodeDecoratorParm; - } +// +// private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { +// NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() +// .contents(sceneConent) +// .dynamicContent(dynamicContent) +// .ruletypeId(ruletypeId) +// .ruleDictMap(ruleDictMap) +// .build(); +// return nodeDecoratorParm; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java index 652970c..b204ac3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java @@ -1,56 +1,56 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@AllArgsConstructor -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", - JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Component; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Component("logicalDecorator") +//@AllArgsConstructor +//@Slf4j +//public class LogicalShiftDecorator implements ByteDecorator { +// +//// private final FieldRuleEngineMapper fieldRuleEngineMapper; +//// +//// //字节位移 +//// @Override +//// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +//// String logicalValue = ""; +//// RuleEvaluator fieldRuleEngine = new RuleEvaluator(); +//// try { +//// Map env2 = new HashMap(); +//// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +//// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +//// for (String contentId : contentIdList) { +//// RuleDict ruleDict = ruleDictMap.get(contentId); +//// if (ruleDict.getCode().contains("#")) { +//// //使用动态的值 +//// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +//// } +//// env2.put(ruleDict.getName(), ruleDict.getCode()); +//// } +//// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +//// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +//// return null; +//// } +//// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +//// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +//// return values; +//// } catch (Exception ex) { +//// log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", +//// JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +//// return null; +//// } +//// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java index 346468f..822fead 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@AllArgsConstructor -@Slf4j -public class OperationDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("optionDecorator") +//@AllArgsConstructor +//@Slf4j +//public class OperationDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //混合运算,有常量或者乘除的缩放 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java index 50fb0a7..7a8bccb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@AllArgsConstructor -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +////精度计算 +//@AllArgsConstructor +//@Registry("precisionDecorator") +//@Slf4j +//public class PrecisionDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java index da39235..27f9cc7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java @@ -1,54 +1,53 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@AllArgsConstructor -@Slf4j -public class RuleDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("ruleDecorator") +//@AllArgsConstructor +//@Slf4j +//public class RuleDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //吃我一套正则表达式 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (Exception ex) { +// log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java index 7f5cbf3..c043f97 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java @@ -2,6 +2,6 @@ import java.util.Map; -public interface ComandeEventService { +public interface ComandeEventService{ Map loadComandeEventConfig(String protocolId,String scene); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java index 476ad84..aaf1837 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java @@ -2,46 +2,46 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.dao.CommandEventDao; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @Slf4j @AllArgsConstructor -public class ComandeEventServiceImpl implements ComandeEventService { +public class ComandeEventServiceImpl implements ComandeEventRegistry { - private final CommandEventDao commandEventDao; + // private final CommandEventDao commandEventDao; // 加密bean 固定字段出现变化的字段解析,业务字段的有序内容 @Override - public Map loadComandeEventConfig(String protocolId,String sceneName) { - CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); - if (ObjectUtil.isEmpty(commandEventConfig)) { - log.error("协议{},没有配置成功接收回复配置,清排查原因"); - return null; - } - String replyJson = commandEventConfig.getReplyContentJson(); - List> replyMapList = JSONArray.parseObject(replyJson, List.class); - List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); - Map fixMap = fixList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); - List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) - .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) - .collect(Collectors.toList()); - Map commandConfigMap = new HashMap<>(); - commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); - commandConfigMap.put("fixContent", fixMap); - commandConfigMap.put("bizContent", contentList); - return commandConfigMap; + public Map loadComandeEventConfig(String protocolId, String sceneName) { +// CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); +// if (ObjectUtil.isEmpty(commandEventConfig)) { +// log.error("协议{},没有配置成功接收回复配置,清排查原因"); +// return null; +// } +// String replyJson = commandEventConfig.getReplyContentJson(); +// List> replyMapList = JSONArray.parseObject(replyJson, List.class); +// List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); +// Map fixMap = fixList.stream() +// .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); +// List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) +// .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) +// .collect(Collectors.toList()); +// Map commandConfigMap = new HashMap<>(); +// commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); +// commandConfigMap.put("fixContent", fixMap); +// commandConfigMap.put("bizContent", contentList); +// return commandConfigMap; + return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 128b09d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java deleted file mode 100644 index 4016b0b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface DatagramEventMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java index 608af3a..32cc8a4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java @@ -2,48 +2,47 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.delivery.decorator.ByteDecorator; +import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @AllArgsConstructor public class FieldDecoratorManger { - private final RuleDictDao ruleDictDao; + private final RuleConfigRegistry ruleDictDao; // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 // (1)静态的业务字段是字典里面可以配置的 // (2)动态的业务字段是通过规则生成的 public String contentMerge(String ruleJson, String sceneConent, String dynamicContent) { - List ruleDictList = ruleDictDao.getRuleDictConfig(); - Map ruleDictMap = ruleDictList.stream().collect( - Collectors.toMap(RuleDict::getId, e -> e)); - List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); - for (Map ruleMap : ruleMapList) { - String ruleType = String.valueOf(ruleMap.get("ruleType")); - ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); - NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); - byteDecorator.nodeDecoratorRule(nodeDecoratorParm); - } +// List ruleDictList = ruleDictDao.getRuleDictConfig(); +// Map ruleDictMap = ruleDictList.stream().collect( +// Collectors.toMap(RuleDict::getId, e -> e)); +// List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); +// for (Map ruleMap : ruleMapList) { +// String ruleType = String.valueOf(ruleMap.get("ruleType")); +// ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); +// NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); +// byteDecorator.nodeDecoratorRule(nodeDecoratorParm); +// } return null; } - - private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { - NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() - .contents(sceneConent) - .dynamicContent(dynamicContent) - .ruletypeId(ruletypeId) - .ruleDictMap(ruleDictMap) - .build(); - return nodeDecoratorParm; - } +// +// private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { +// NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() +// .contents(sceneConent) +// .dynamicContent(dynamicContent) +// .ruletypeId(ruletypeId) +// .ruleDictMap(ruleDictMap) +// .build(); +// return nodeDecoratorParm; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java index 652970c..b204ac3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java @@ -1,56 +1,56 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@AllArgsConstructor -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", - JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Component; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Component("logicalDecorator") +//@AllArgsConstructor +//@Slf4j +//public class LogicalShiftDecorator implements ByteDecorator { +// +//// private final FieldRuleEngineMapper fieldRuleEngineMapper; +//// +//// //字节位移 +//// @Override +//// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +//// String logicalValue = ""; +//// RuleEvaluator fieldRuleEngine = new RuleEvaluator(); +//// try { +//// Map env2 = new HashMap(); +//// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +//// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +//// for (String contentId : contentIdList) { +//// RuleDict ruleDict = ruleDictMap.get(contentId); +//// if (ruleDict.getCode().contains("#")) { +//// //使用动态的值 +//// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +//// } +//// env2.put(ruleDict.getName(), ruleDict.getCode()); +//// } +//// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +//// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +//// return null; +//// } +//// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +//// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +//// return values; +//// } catch (Exception ex) { +//// log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", +//// JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +//// return null; +//// } +//// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java index 346468f..822fead 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@AllArgsConstructor -@Slf4j -public class OperationDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("optionDecorator") +//@AllArgsConstructor +//@Slf4j +//public class OperationDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //混合运算,有常量或者乘除的缩放 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java index 50fb0a7..7a8bccb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@AllArgsConstructor -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +////精度计算 +//@AllArgsConstructor +//@Registry("precisionDecorator") +//@Slf4j +//public class PrecisionDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java index da39235..27f9cc7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java @@ -1,54 +1,53 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@AllArgsConstructor -@Slf4j -public class RuleDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("ruleDecorator") +//@AllArgsConstructor +//@Slf4j +//public class RuleDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //吃我一套正则表达式 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (Exception ex) { +// log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java index 7f5cbf3..c043f97 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java @@ -2,6 +2,6 @@ import java.util.Map; -public interface ComandeEventService { +public interface ComandeEventService{ Map loadComandeEventConfig(String protocolId,String scene); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java index 476ad84..aaf1837 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java @@ -2,46 +2,46 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.dao.CommandEventDao; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @Slf4j @AllArgsConstructor -public class ComandeEventServiceImpl implements ComandeEventService { +public class ComandeEventServiceImpl implements ComandeEventRegistry { - private final CommandEventDao commandEventDao; + // private final CommandEventDao commandEventDao; // 加密bean 固定字段出现变化的字段解析,业务字段的有序内容 @Override - public Map loadComandeEventConfig(String protocolId,String sceneName) { - CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); - if (ObjectUtil.isEmpty(commandEventConfig)) { - log.error("协议{},没有配置成功接收回复配置,清排查原因"); - return null; - } - String replyJson = commandEventConfig.getReplyContentJson(); - List> replyMapList = JSONArray.parseObject(replyJson, List.class); - List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); - Map fixMap = fixList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); - List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) - .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) - .collect(Collectors.toList()); - Map commandConfigMap = new HashMap<>(); - commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); - commandConfigMap.put("fixContent", fixMap); - commandConfigMap.put("bizContent", contentList); - return commandConfigMap; + public Map loadComandeEventConfig(String protocolId, String sceneName) { +// CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); +// if (ObjectUtil.isEmpty(commandEventConfig)) { +// log.error("协议{},没有配置成功接收回复配置,清排查原因"); +// return null; +// } +// String replyJson = commandEventConfig.getReplyContentJson(); +// List> replyMapList = JSONArray.parseObject(replyJson, List.class); +// List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); +// Map fixMap = fixList.stream() +// .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); +// List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) +// .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) +// .collect(Collectors.toList()); +// Map commandConfigMap = new HashMap<>(); +// commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); +// commandConfigMap.put("fixContent", fixMap); +// commandConfigMap.put("bizContent", contentList); +// return commandConfigMap; + return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 128b09d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java deleted file mode 100644 index 4016b0b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface DatagramEventMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java deleted file mode 100644 index 597c306..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.apache.ibatis.annotations.Mapper; - -public interface FieldConfigMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java index 608af3a..32cc8a4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java @@ -2,48 +2,47 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.delivery.decorator.ByteDecorator; +import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @AllArgsConstructor public class FieldDecoratorManger { - private final RuleDictDao ruleDictDao; + private final RuleConfigRegistry ruleDictDao; // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 // (1)静态的业务字段是字典里面可以配置的 // (2)动态的业务字段是通过规则生成的 public String contentMerge(String ruleJson, String sceneConent, String dynamicContent) { - List ruleDictList = ruleDictDao.getRuleDictConfig(); - Map ruleDictMap = ruleDictList.stream().collect( - Collectors.toMap(RuleDict::getId, e -> e)); - List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); - for (Map ruleMap : ruleMapList) { - String ruleType = String.valueOf(ruleMap.get("ruleType")); - ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); - NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); - byteDecorator.nodeDecoratorRule(nodeDecoratorParm); - } +// List ruleDictList = ruleDictDao.getRuleDictConfig(); +// Map ruleDictMap = ruleDictList.stream().collect( +// Collectors.toMap(RuleDict::getId, e -> e)); +// List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); +// for (Map ruleMap : ruleMapList) { +// String ruleType = String.valueOf(ruleMap.get("ruleType")); +// ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); +// NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); +// byteDecorator.nodeDecoratorRule(nodeDecoratorParm); +// } return null; } - - private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { - NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() - .contents(sceneConent) - .dynamicContent(dynamicContent) - .ruletypeId(ruletypeId) - .ruleDictMap(ruleDictMap) - .build(); - return nodeDecoratorParm; - } +// +// private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { +// NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() +// .contents(sceneConent) +// .dynamicContent(dynamicContent) +// .ruletypeId(ruletypeId) +// .ruleDictMap(ruleDictMap) +// .build(); +// return nodeDecoratorParm; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java index 652970c..b204ac3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java @@ -1,56 +1,56 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@AllArgsConstructor -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", - JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Component; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Component("logicalDecorator") +//@AllArgsConstructor +//@Slf4j +//public class LogicalShiftDecorator implements ByteDecorator { +// +//// private final FieldRuleEngineMapper fieldRuleEngineMapper; +//// +//// //字节位移 +//// @Override +//// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +//// String logicalValue = ""; +//// RuleEvaluator fieldRuleEngine = new RuleEvaluator(); +//// try { +//// Map env2 = new HashMap(); +//// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +//// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +//// for (String contentId : contentIdList) { +//// RuleDict ruleDict = ruleDictMap.get(contentId); +//// if (ruleDict.getCode().contains("#")) { +//// //使用动态的值 +//// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +//// } +//// env2.put(ruleDict.getName(), ruleDict.getCode()); +//// } +//// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +//// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +//// return null; +//// } +//// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +//// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +//// return values; +//// } catch (Exception ex) { +//// log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", +//// JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +//// return null; +//// } +//// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java index 346468f..822fead 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@AllArgsConstructor -@Slf4j -public class OperationDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("optionDecorator") +//@AllArgsConstructor +//@Slf4j +//public class OperationDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //混合运算,有常量或者乘除的缩放 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java index 50fb0a7..7a8bccb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@AllArgsConstructor -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +////精度计算 +//@AllArgsConstructor +//@Registry("precisionDecorator") +//@Slf4j +//public class PrecisionDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java index da39235..27f9cc7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java @@ -1,54 +1,53 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@AllArgsConstructor -@Slf4j -public class RuleDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("ruleDecorator") +//@AllArgsConstructor +//@Slf4j +//public class RuleDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //吃我一套正则表达式 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (Exception ex) { +// log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java index 7f5cbf3..c043f97 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java @@ -2,6 +2,6 @@ import java.util.Map; -public interface ComandeEventService { +public interface ComandeEventService{ Map loadComandeEventConfig(String protocolId,String scene); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java index 476ad84..aaf1837 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java @@ -2,46 +2,46 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.dao.CommandEventDao; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @Slf4j @AllArgsConstructor -public class ComandeEventServiceImpl implements ComandeEventService { +public class ComandeEventServiceImpl implements ComandeEventRegistry { - private final CommandEventDao commandEventDao; + // private final CommandEventDao commandEventDao; // 加密bean 固定字段出现变化的字段解析,业务字段的有序内容 @Override - public Map loadComandeEventConfig(String protocolId,String sceneName) { - CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); - if (ObjectUtil.isEmpty(commandEventConfig)) { - log.error("协议{},没有配置成功接收回复配置,清排查原因"); - return null; - } - String replyJson = commandEventConfig.getReplyContentJson(); - List> replyMapList = JSONArray.parseObject(replyJson, List.class); - List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); - Map fixMap = fixList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); - List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) - .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) - .collect(Collectors.toList()); - Map commandConfigMap = new HashMap<>(); - commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); - commandConfigMap.put("fixContent", fixMap); - commandConfigMap.put("bizContent", contentList); - return commandConfigMap; + public Map loadComandeEventConfig(String protocolId, String sceneName) { +// CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); +// if (ObjectUtil.isEmpty(commandEventConfig)) { +// log.error("协议{},没有配置成功接收回复配置,清排查原因"); +// return null; +// } +// String replyJson = commandEventConfig.getReplyContentJson(); +// List> replyMapList = JSONArray.parseObject(replyJson, List.class); +// List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); +// Map fixMap = fixList.stream() +// .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); +// List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) +// .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) +// .collect(Collectors.toList()); +// Map commandConfigMap = new HashMap<>(); +// commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); +// commandConfigMap.put("fixContent", fixMap); +// commandConfigMap.put("bizContent", contentList); +// return commandConfigMap; + return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 128b09d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java deleted file mode 100644 index 4016b0b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface DatagramEventMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java deleted file mode 100644 index 597c306..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.apache.ibatis.annotations.Mapper; - -public interface FieldConfigMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java deleted file mode 100644 index a31680a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.PreRuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface PreRuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java index 608af3a..32cc8a4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java @@ -2,48 +2,47 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.delivery.decorator.ByteDecorator; +import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @AllArgsConstructor public class FieldDecoratorManger { - private final RuleDictDao ruleDictDao; + private final RuleConfigRegistry ruleDictDao; // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 // (1)静态的业务字段是字典里面可以配置的 // (2)动态的业务字段是通过规则生成的 public String contentMerge(String ruleJson, String sceneConent, String dynamicContent) { - List ruleDictList = ruleDictDao.getRuleDictConfig(); - Map ruleDictMap = ruleDictList.stream().collect( - Collectors.toMap(RuleDict::getId, e -> e)); - List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); - for (Map ruleMap : ruleMapList) { - String ruleType = String.valueOf(ruleMap.get("ruleType")); - ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); - NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); - byteDecorator.nodeDecoratorRule(nodeDecoratorParm); - } +// List ruleDictList = ruleDictDao.getRuleDictConfig(); +// Map ruleDictMap = ruleDictList.stream().collect( +// Collectors.toMap(RuleDict::getId, e -> e)); +// List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); +// for (Map ruleMap : ruleMapList) { +// String ruleType = String.valueOf(ruleMap.get("ruleType")); +// ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); +// NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); +// byteDecorator.nodeDecoratorRule(nodeDecoratorParm); +// } return null; } - - private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { - NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() - .contents(sceneConent) - .dynamicContent(dynamicContent) - .ruletypeId(ruletypeId) - .ruleDictMap(ruleDictMap) - .build(); - return nodeDecoratorParm; - } +// +// private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { +// NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() +// .contents(sceneConent) +// .dynamicContent(dynamicContent) +// .ruletypeId(ruletypeId) +// .ruleDictMap(ruleDictMap) +// .build(); +// return nodeDecoratorParm; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java index 652970c..b204ac3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java @@ -1,56 +1,56 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@AllArgsConstructor -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", - JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Component; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Component("logicalDecorator") +//@AllArgsConstructor +//@Slf4j +//public class LogicalShiftDecorator implements ByteDecorator { +// +//// private final FieldRuleEngineMapper fieldRuleEngineMapper; +//// +//// //字节位移 +//// @Override +//// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +//// String logicalValue = ""; +//// RuleEvaluator fieldRuleEngine = new RuleEvaluator(); +//// try { +//// Map env2 = new HashMap(); +//// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +//// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +//// for (String contentId : contentIdList) { +//// RuleDict ruleDict = ruleDictMap.get(contentId); +//// if (ruleDict.getCode().contains("#")) { +//// //使用动态的值 +//// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +//// } +//// env2.put(ruleDict.getName(), ruleDict.getCode()); +//// } +//// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +//// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +//// return null; +//// } +//// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +//// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +//// return values; +//// } catch (Exception ex) { +//// log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", +//// JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +//// return null; +//// } +//// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java index 346468f..822fead 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@AllArgsConstructor -@Slf4j -public class OperationDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("optionDecorator") +//@AllArgsConstructor +//@Slf4j +//public class OperationDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //混合运算,有常量或者乘除的缩放 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java index 50fb0a7..7a8bccb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@AllArgsConstructor -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +////精度计算 +//@AllArgsConstructor +//@Registry("precisionDecorator") +//@Slf4j +//public class PrecisionDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java index da39235..27f9cc7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java @@ -1,54 +1,53 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@AllArgsConstructor -@Slf4j -public class RuleDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("ruleDecorator") +//@AllArgsConstructor +//@Slf4j +//public class RuleDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //吃我一套正则表达式 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (Exception ex) { +// log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java index 7f5cbf3..c043f97 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java @@ -2,6 +2,6 @@ import java.util.Map; -public interface ComandeEventService { +public interface ComandeEventService{ Map loadComandeEventConfig(String protocolId,String scene); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java index 476ad84..aaf1837 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java @@ -2,46 +2,46 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.dao.CommandEventDao; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @Slf4j @AllArgsConstructor -public class ComandeEventServiceImpl implements ComandeEventService { +public class ComandeEventServiceImpl implements ComandeEventRegistry { - private final CommandEventDao commandEventDao; + // private final CommandEventDao commandEventDao; // 加密bean 固定字段出现变化的字段解析,业务字段的有序内容 @Override - public Map loadComandeEventConfig(String protocolId,String sceneName) { - CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); - if (ObjectUtil.isEmpty(commandEventConfig)) { - log.error("协议{},没有配置成功接收回复配置,清排查原因"); - return null; - } - String replyJson = commandEventConfig.getReplyContentJson(); - List> replyMapList = JSONArray.parseObject(replyJson, List.class); - List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); - Map fixMap = fixList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); - List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) - .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) - .collect(Collectors.toList()); - Map commandConfigMap = new HashMap<>(); - commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); - commandConfigMap.put("fixContent", fixMap); - commandConfigMap.put("bizContent", contentList); - return commandConfigMap; + public Map loadComandeEventConfig(String protocolId, String sceneName) { +// CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); +// if (ObjectUtil.isEmpty(commandEventConfig)) { +// log.error("协议{},没有配置成功接收回复配置,清排查原因"); +// return null; +// } +// String replyJson = commandEventConfig.getReplyContentJson(); +// List> replyMapList = JSONArray.parseObject(replyJson, List.class); +// List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); +// Map fixMap = fixList.stream() +// .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); +// List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) +// .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) +// .collect(Collectors.toList()); +// Map commandConfigMap = new HashMap<>(); +// commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); +// commandConfigMap.put("fixContent", fixMap); +// commandConfigMap.put("bizContent", contentList); +// return commandConfigMap; + return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 128b09d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java deleted file mode 100644 index 4016b0b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface DatagramEventMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java deleted file mode 100644 index 597c306..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.apache.ibatis.annotations.Mapper; - -public interface FieldConfigMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java deleted file mode 100644 index a31680a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.PreRuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface PreRuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java deleted file mode 100644 index 9060a69..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface ProtocolConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java index 608af3a..32cc8a4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java @@ -2,48 +2,47 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.delivery.decorator.ByteDecorator; +import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @AllArgsConstructor public class FieldDecoratorManger { - private final RuleDictDao ruleDictDao; + private final RuleConfigRegistry ruleDictDao; // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 // (1)静态的业务字段是字典里面可以配置的 // (2)动态的业务字段是通过规则生成的 public String contentMerge(String ruleJson, String sceneConent, String dynamicContent) { - List ruleDictList = ruleDictDao.getRuleDictConfig(); - Map ruleDictMap = ruleDictList.stream().collect( - Collectors.toMap(RuleDict::getId, e -> e)); - List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); - for (Map ruleMap : ruleMapList) { - String ruleType = String.valueOf(ruleMap.get("ruleType")); - ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); - NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); - byteDecorator.nodeDecoratorRule(nodeDecoratorParm); - } +// List ruleDictList = ruleDictDao.getRuleDictConfig(); +// Map ruleDictMap = ruleDictList.stream().collect( +// Collectors.toMap(RuleDict::getId, e -> e)); +// List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); +// for (Map ruleMap : ruleMapList) { +// String ruleType = String.valueOf(ruleMap.get("ruleType")); +// ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); +// NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); +// byteDecorator.nodeDecoratorRule(nodeDecoratorParm); +// } return null; } - - private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { - NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() - .contents(sceneConent) - .dynamicContent(dynamicContent) - .ruletypeId(ruletypeId) - .ruleDictMap(ruleDictMap) - .build(); - return nodeDecoratorParm; - } +// +// private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { +// NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() +// .contents(sceneConent) +// .dynamicContent(dynamicContent) +// .ruletypeId(ruletypeId) +// .ruleDictMap(ruleDictMap) +// .build(); +// return nodeDecoratorParm; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java index 652970c..b204ac3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java @@ -1,56 +1,56 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@AllArgsConstructor -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", - JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Component; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Component("logicalDecorator") +//@AllArgsConstructor +//@Slf4j +//public class LogicalShiftDecorator implements ByteDecorator { +// +//// private final FieldRuleEngineMapper fieldRuleEngineMapper; +//// +//// //字节位移 +//// @Override +//// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +//// String logicalValue = ""; +//// RuleEvaluator fieldRuleEngine = new RuleEvaluator(); +//// try { +//// Map env2 = new HashMap(); +//// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +//// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +//// for (String contentId : contentIdList) { +//// RuleDict ruleDict = ruleDictMap.get(contentId); +//// if (ruleDict.getCode().contains("#")) { +//// //使用动态的值 +//// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +//// } +//// env2.put(ruleDict.getName(), ruleDict.getCode()); +//// } +//// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +//// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +//// return null; +//// } +//// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +//// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +//// return values; +//// } catch (Exception ex) { +//// log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", +//// JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +//// return null; +//// } +//// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java index 346468f..822fead 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@AllArgsConstructor -@Slf4j -public class OperationDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("optionDecorator") +//@AllArgsConstructor +//@Slf4j +//public class OperationDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //混合运算,有常量或者乘除的缩放 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java index 50fb0a7..7a8bccb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@AllArgsConstructor -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +////精度计算 +//@AllArgsConstructor +//@Registry("precisionDecorator") +//@Slf4j +//public class PrecisionDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java index da39235..27f9cc7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java @@ -1,54 +1,53 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@AllArgsConstructor -@Slf4j -public class RuleDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("ruleDecorator") +//@AllArgsConstructor +//@Slf4j +//public class RuleDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //吃我一套正则表达式 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (Exception ex) { +// log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java index 7f5cbf3..c043f97 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java @@ -2,6 +2,6 @@ import java.util.Map; -public interface ComandeEventService { +public interface ComandeEventService{ Map loadComandeEventConfig(String protocolId,String scene); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java index 476ad84..aaf1837 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java @@ -2,46 +2,46 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.dao.CommandEventDao; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @Slf4j @AllArgsConstructor -public class ComandeEventServiceImpl implements ComandeEventService { +public class ComandeEventServiceImpl implements ComandeEventRegistry { - private final CommandEventDao commandEventDao; + // private final CommandEventDao commandEventDao; // 加密bean 固定字段出现变化的字段解析,业务字段的有序内容 @Override - public Map loadComandeEventConfig(String protocolId,String sceneName) { - CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); - if (ObjectUtil.isEmpty(commandEventConfig)) { - log.error("协议{},没有配置成功接收回复配置,清排查原因"); - return null; - } - String replyJson = commandEventConfig.getReplyContentJson(); - List> replyMapList = JSONArray.parseObject(replyJson, List.class); - List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); - Map fixMap = fixList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); - List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) - .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) - .collect(Collectors.toList()); - Map commandConfigMap = new HashMap<>(); - commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); - commandConfigMap.put("fixContent", fixMap); - commandConfigMap.put("bizContent", contentList); - return commandConfigMap; + public Map loadComandeEventConfig(String protocolId, String sceneName) { +// CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); +// if (ObjectUtil.isEmpty(commandEventConfig)) { +// log.error("协议{},没有配置成功接收回复配置,清排查原因"); +// return null; +// } +// String replyJson = commandEventConfig.getReplyContentJson(); +// List> replyMapList = JSONArray.parseObject(replyJson, List.class); +// List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); +// Map fixMap = fixList.stream() +// .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); +// List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) +// .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) +// .collect(Collectors.toList()); +// Map commandConfigMap = new HashMap<>(); +// commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); +// commandConfigMap.put("fixContent", fixMap); +// commandConfigMap.put("bizContent", contentList); +// return commandConfigMap; + return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 128b09d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java deleted file mode 100644 index 4016b0b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface DatagramEventMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java deleted file mode 100644 index 597c306..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.apache.ibatis.annotations.Mapper; - -public interface FieldConfigMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java deleted file mode 100644 index a31680a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.PreRuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface PreRuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java deleted file mode 100644 index 9060a69..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface ProtocolConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java deleted file mode 100644 index 6fa6936..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java index 608af3a..32cc8a4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java @@ -2,48 +2,47 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.delivery.decorator.ByteDecorator; +import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @AllArgsConstructor public class FieldDecoratorManger { - private final RuleDictDao ruleDictDao; + private final RuleConfigRegistry ruleDictDao; // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 // (1)静态的业务字段是字典里面可以配置的 // (2)动态的业务字段是通过规则生成的 public String contentMerge(String ruleJson, String sceneConent, String dynamicContent) { - List ruleDictList = ruleDictDao.getRuleDictConfig(); - Map ruleDictMap = ruleDictList.stream().collect( - Collectors.toMap(RuleDict::getId, e -> e)); - List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); - for (Map ruleMap : ruleMapList) { - String ruleType = String.valueOf(ruleMap.get("ruleType")); - ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); - NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); - byteDecorator.nodeDecoratorRule(nodeDecoratorParm); - } +// List ruleDictList = ruleDictDao.getRuleDictConfig(); +// Map ruleDictMap = ruleDictList.stream().collect( +// Collectors.toMap(RuleDict::getId, e -> e)); +// List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); +// for (Map ruleMap : ruleMapList) { +// String ruleType = String.valueOf(ruleMap.get("ruleType")); +// ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); +// NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); +// byteDecorator.nodeDecoratorRule(nodeDecoratorParm); +// } return null; } - - private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { - NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() - .contents(sceneConent) - .dynamicContent(dynamicContent) - .ruletypeId(ruletypeId) - .ruleDictMap(ruleDictMap) - .build(); - return nodeDecoratorParm; - } +// +// private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { +// NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() +// .contents(sceneConent) +// .dynamicContent(dynamicContent) +// .ruletypeId(ruletypeId) +// .ruleDictMap(ruleDictMap) +// .build(); +// return nodeDecoratorParm; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java index 652970c..b204ac3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java @@ -1,56 +1,56 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@AllArgsConstructor -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", - JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Component; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Component("logicalDecorator") +//@AllArgsConstructor +//@Slf4j +//public class LogicalShiftDecorator implements ByteDecorator { +// +//// private final FieldRuleEngineMapper fieldRuleEngineMapper; +//// +//// //字节位移 +//// @Override +//// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +//// String logicalValue = ""; +//// RuleEvaluator fieldRuleEngine = new RuleEvaluator(); +//// try { +//// Map env2 = new HashMap(); +//// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +//// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +//// for (String contentId : contentIdList) { +//// RuleDict ruleDict = ruleDictMap.get(contentId); +//// if (ruleDict.getCode().contains("#")) { +//// //使用动态的值 +//// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +//// } +//// env2.put(ruleDict.getName(), ruleDict.getCode()); +//// } +//// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +//// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +//// return null; +//// } +//// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +//// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +//// return values; +//// } catch (Exception ex) { +//// log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", +//// JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +//// return null; +//// } +//// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java index 346468f..822fead 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@AllArgsConstructor -@Slf4j -public class OperationDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("optionDecorator") +//@AllArgsConstructor +//@Slf4j +//public class OperationDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //混合运算,有常量或者乘除的缩放 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java index 50fb0a7..7a8bccb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@AllArgsConstructor -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +////精度计算 +//@AllArgsConstructor +//@Registry("precisionDecorator") +//@Slf4j +//public class PrecisionDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java index da39235..27f9cc7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java @@ -1,54 +1,53 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@AllArgsConstructor -@Slf4j -public class RuleDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("ruleDecorator") +//@AllArgsConstructor +//@Slf4j +//public class RuleDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //吃我一套正则表达式 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (Exception ex) { +// log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java index 7f5cbf3..c043f97 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java @@ -2,6 +2,6 @@ import java.util.Map; -public interface ComandeEventService { +public interface ComandeEventService{ Map loadComandeEventConfig(String protocolId,String scene); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java index 476ad84..aaf1837 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java @@ -2,46 +2,46 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.dao.CommandEventDao; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @Slf4j @AllArgsConstructor -public class ComandeEventServiceImpl implements ComandeEventService { +public class ComandeEventServiceImpl implements ComandeEventRegistry { - private final CommandEventDao commandEventDao; + // private final CommandEventDao commandEventDao; // 加密bean 固定字段出现变化的字段解析,业务字段的有序内容 @Override - public Map loadComandeEventConfig(String protocolId,String sceneName) { - CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); - if (ObjectUtil.isEmpty(commandEventConfig)) { - log.error("协议{},没有配置成功接收回复配置,清排查原因"); - return null; - } - String replyJson = commandEventConfig.getReplyContentJson(); - List> replyMapList = JSONArray.parseObject(replyJson, List.class); - List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); - Map fixMap = fixList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); - List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) - .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) - .collect(Collectors.toList()); - Map commandConfigMap = new HashMap<>(); - commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); - commandConfigMap.put("fixContent", fixMap); - commandConfigMap.put("bizContent", contentList); - return commandConfigMap; + public Map loadComandeEventConfig(String protocolId, String sceneName) { +// CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); +// if (ObjectUtil.isEmpty(commandEventConfig)) { +// log.error("协议{},没有配置成功接收回复配置,清排查原因"); +// return null; +// } +// String replyJson = commandEventConfig.getReplyContentJson(); +// List> replyMapList = JSONArray.parseObject(replyJson, List.class); +// List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); +// Map fixMap = fixList.stream() +// .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); +// List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) +// .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) +// .collect(Collectors.toList()); +// Map commandConfigMap = new HashMap<>(); +// commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); +// commandConfigMap.put("fixContent", fixMap); +// commandConfigMap.put("bizContent", contentList); +// return commandConfigMap; + return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 128b09d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java deleted file mode 100644 index 4016b0b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface DatagramEventMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java deleted file mode 100644 index 597c306..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.apache.ibatis.annotations.Mapper; - -public interface FieldConfigMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java deleted file mode 100644 index a31680a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.PreRuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface PreRuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java deleted file mode 100644 index 9060a69..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface ProtocolConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java deleted file mode 100644 index 6fa6936..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java deleted file mode 100644 index 582a705..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleDict; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleDictMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java index 608af3a..32cc8a4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java @@ -2,48 +2,47 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.delivery.decorator.ByteDecorator; +import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @AllArgsConstructor public class FieldDecoratorManger { - private final RuleDictDao ruleDictDao; + private final RuleConfigRegistry ruleDictDao; // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 // (1)静态的业务字段是字典里面可以配置的 // (2)动态的业务字段是通过规则生成的 public String contentMerge(String ruleJson, String sceneConent, String dynamicContent) { - List ruleDictList = ruleDictDao.getRuleDictConfig(); - Map ruleDictMap = ruleDictList.stream().collect( - Collectors.toMap(RuleDict::getId, e -> e)); - List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); - for (Map ruleMap : ruleMapList) { - String ruleType = String.valueOf(ruleMap.get("ruleType")); - ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); - NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); - byteDecorator.nodeDecoratorRule(nodeDecoratorParm); - } +// List ruleDictList = ruleDictDao.getRuleDictConfig(); +// Map ruleDictMap = ruleDictList.stream().collect( +// Collectors.toMap(RuleDict::getId, e -> e)); +// List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); +// for (Map ruleMap : ruleMapList) { +// String ruleType = String.valueOf(ruleMap.get("ruleType")); +// ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); +// NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); +// byteDecorator.nodeDecoratorRule(nodeDecoratorParm); +// } return null; } - - private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { - NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() - .contents(sceneConent) - .dynamicContent(dynamicContent) - .ruletypeId(ruletypeId) - .ruleDictMap(ruleDictMap) - .build(); - return nodeDecoratorParm; - } +// +// private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { +// NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() +// .contents(sceneConent) +// .dynamicContent(dynamicContent) +// .ruletypeId(ruletypeId) +// .ruleDictMap(ruleDictMap) +// .build(); +// return nodeDecoratorParm; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java index 652970c..b204ac3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java @@ -1,56 +1,56 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@AllArgsConstructor -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", - JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Component; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Component("logicalDecorator") +//@AllArgsConstructor +//@Slf4j +//public class LogicalShiftDecorator implements ByteDecorator { +// +//// private final FieldRuleEngineMapper fieldRuleEngineMapper; +//// +//// //字节位移 +//// @Override +//// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +//// String logicalValue = ""; +//// RuleEvaluator fieldRuleEngine = new RuleEvaluator(); +//// try { +//// Map env2 = new HashMap(); +//// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +//// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +//// for (String contentId : contentIdList) { +//// RuleDict ruleDict = ruleDictMap.get(contentId); +//// if (ruleDict.getCode().contains("#")) { +//// //使用动态的值 +//// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +//// } +//// env2.put(ruleDict.getName(), ruleDict.getCode()); +//// } +//// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +//// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +//// return null; +//// } +//// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +//// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +//// return values; +//// } catch (Exception ex) { +//// log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", +//// JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +//// return null; +//// } +//// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java index 346468f..822fead 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@AllArgsConstructor -@Slf4j -public class OperationDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("optionDecorator") +//@AllArgsConstructor +//@Slf4j +//public class OperationDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //混合运算,有常量或者乘除的缩放 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java index 50fb0a7..7a8bccb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@AllArgsConstructor -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +////精度计算 +//@AllArgsConstructor +//@Registry("precisionDecorator") +//@Slf4j +//public class PrecisionDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java index da39235..27f9cc7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java @@ -1,54 +1,53 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@AllArgsConstructor -@Slf4j -public class RuleDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("ruleDecorator") +//@AllArgsConstructor +//@Slf4j +//public class RuleDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //吃我一套正则表达式 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (Exception ex) { +// log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java index 7f5cbf3..c043f97 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java @@ -2,6 +2,6 @@ import java.util.Map; -public interface ComandeEventService { +public interface ComandeEventService{ Map loadComandeEventConfig(String protocolId,String scene); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java index 476ad84..aaf1837 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java @@ -2,46 +2,46 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.dao.CommandEventDao; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @Slf4j @AllArgsConstructor -public class ComandeEventServiceImpl implements ComandeEventService { +public class ComandeEventServiceImpl implements ComandeEventRegistry { - private final CommandEventDao commandEventDao; + // private final CommandEventDao commandEventDao; // 加密bean 固定字段出现变化的字段解析,业务字段的有序内容 @Override - public Map loadComandeEventConfig(String protocolId,String sceneName) { - CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); - if (ObjectUtil.isEmpty(commandEventConfig)) { - log.error("协议{},没有配置成功接收回复配置,清排查原因"); - return null; - } - String replyJson = commandEventConfig.getReplyContentJson(); - List> replyMapList = JSONArray.parseObject(replyJson, List.class); - List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); - Map fixMap = fixList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); - List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) - .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) - .collect(Collectors.toList()); - Map commandConfigMap = new HashMap<>(); - commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); - commandConfigMap.put("fixContent", fixMap); - commandConfigMap.put("bizContent", contentList); - return commandConfigMap; + public Map loadComandeEventConfig(String protocolId, String sceneName) { +// CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); +// if (ObjectUtil.isEmpty(commandEventConfig)) { +// log.error("协议{},没有配置成功接收回复配置,清排查原因"); +// return null; +// } +// String replyJson = commandEventConfig.getReplyContentJson(); +// List> replyMapList = JSONArray.parseObject(replyJson, List.class); +// List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); +// Map fixMap = fixList.stream() +// .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); +// List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) +// .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) +// .collect(Collectors.toList()); +// Map commandConfigMap = new HashMap<>(); +// commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); +// commandConfigMap.put("fixContent", fixMap); +// commandConfigMap.put("bizContent", contentList); +// return commandConfigMap; + return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 128b09d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java deleted file mode 100644 index 4016b0b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface DatagramEventMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java deleted file mode 100644 index 597c306..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.apache.ibatis.annotations.Mapper; - -public interface FieldConfigMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java deleted file mode 100644 index a31680a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.PreRuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface PreRuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java deleted file mode 100644 index 9060a69..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface ProtocolConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java deleted file mode 100644 index 6fa6936..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java deleted file mode 100644 index 582a705..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleDict; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleDictMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java deleted file mode 100644 index 6e302c8..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.CommandEventMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Optional; - -@Component -public class CommandEventDao { - - @Resource - private CommandEventMapper commandEventMapper; - - public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId) - .eq("scene", sceneName) - .eq("enabled", 1); - List commandEventConfig = commandEventMapper.selectList(queryWrapper); - Optional optionalEventConfig = commandEventConfig.stream().findFirst(); - return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java index 608af3a..32cc8a4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java @@ -2,48 +2,47 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.delivery.decorator.ByteDecorator; +import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @AllArgsConstructor public class FieldDecoratorManger { - private final RuleDictDao ruleDictDao; + private final RuleConfigRegistry ruleDictDao; // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 // (1)静态的业务字段是字典里面可以配置的 // (2)动态的业务字段是通过规则生成的 public String contentMerge(String ruleJson, String sceneConent, String dynamicContent) { - List ruleDictList = ruleDictDao.getRuleDictConfig(); - Map ruleDictMap = ruleDictList.stream().collect( - Collectors.toMap(RuleDict::getId, e -> e)); - List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); - for (Map ruleMap : ruleMapList) { - String ruleType = String.valueOf(ruleMap.get("ruleType")); - ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); - NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); - byteDecorator.nodeDecoratorRule(nodeDecoratorParm); - } +// List ruleDictList = ruleDictDao.getRuleDictConfig(); +// Map ruleDictMap = ruleDictList.stream().collect( +// Collectors.toMap(RuleDict::getId, e -> e)); +// List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); +// for (Map ruleMap : ruleMapList) { +// String ruleType = String.valueOf(ruleMap.get("ruleType")); +// ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); +// NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); +// byteDecorator.nodeDecoratorRule(nodeDecoratorParm); +// } return null; } - - private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { - NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() - .contents(sceneConent) - .dynamicContent(dynamicContent) - .ruletypeId(ruletypeId) - .ruleDictMap(ruleDictMap) - .build(); - return nodeDecoratorParm; - } +// +// private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { +// NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() +// .contents(sceneConent) +// .dynamicContent(dynamicContent) +// .ruletypeId(ruletypeId) +// .ruleDictMap(ruleDictMap) +// .build(); +// return nodeDecoratorParm; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java index 652970c..b204ac3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java @@ -1,56 +1,56 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@AllArgsConstructor -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", - JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Component; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Component("logicalDecorator") +//@AllArgsConstructor +//@Slf4j +//public class LogicalShiftDecorator implements ByteDecorator { +// +//// private final FieldRuleEngineMapper fieldRuleEngineMapper; +//// +//// //字节位移 +//// @Override +//// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +//// String logicalValue = ""; +//// RuleEvaluator fieldRuleEngine = new RuleEvaluator(); +//// try { +//// Map env2 = new HashMap(); +//// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +//// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +//// for (String contentId : contentIdList) { +//// RuleDict ruleDict = ruleDictMap.get(contentId); +//// if (ruleDict.getCode().contains("#")) { +//// //使用动态的值 +//// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +//// } +//// env2.put(ruleDict.getName(), ruleDict.getCode()); +//// } +//// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +//// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +//// return null; +//// } +//// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +//// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +//// return values; +//// } catch (Exception ex) { +//// log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", +//// JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +//// return null; +//// } +//// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java index 346468f..822fead 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@AllArgsConstructor -@Slf4j -public class OperationDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("optionDecorator") +//@AllArgsConstructor +//@Slf4j +//public class OperationDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //混合运算,有常量或者乘除的缩放 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java index 50fb0a7..7a8bccb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@AllArgsConstructor -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +////精度计算 +//@AllArgsConstructor +//@Registry("precisionDecorator") +//@Slf4j +//public class PrecisionDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java index da39235..27f9cc7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java @@ -1,54 +1,53 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@AllArgsConstructor -@Slf4j -public class RuleDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("ruleDecorator") +//@AllArgsConstructor +//@Slf4j +//public class RuleDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //吃我一套正则表达式 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (Exception ex) { +// log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java index 7f5cbf3..c043f97 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java @@ -2,6 +2,6 @@ import java.util.Map; -public interface ComandeEventService { +public interface ComandeEventService{ Map loadComandeEventConfig(String protocolId,String scene); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java index 476ad84..aaf1837 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java @@ -2,46 +2,46 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.dao.CommandEventDao; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @Slf4j @AllArgsConstructor -public class ComandeEventServiceImpl implements ComandeEventService { +public class ComandeEventServiceImpl implements ComandeEventRegistry { - private final CommandEventDao commandEventDao; + // private final CommandEventDao commandEventDao; // 加密bean 固定字段出现变化的字段解析,业务字段的有序内容 @Override - public Map loadComandeEventConfig(String protocolId,String sceneName) { - CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); - if (ObjectUtil.isEmpty(commandEventConfig)) { - log.error("协议{},没有配置成功接收回复配置,清排查原因"); - return null; - } - String replyJson = commandEventConfig.getReplyContentJson(); - List> replyMapList = JSONArray.parseObject(replyJson, List.class); - List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); - Map fixMap = fixList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); - List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) - .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) - .collect(Collectors.toList()); - Map commandConfigMap = new HashMap<>(); - commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); - commandConfigMap.put("fixContent", fixMap); - commandConfigMap.put("bizContent", contentList); - return commandConfigMap; + public Map loadComandeEventConfig(String protocolId, String sceneName) { +// CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); +// if (ObjectUtil.isEmpty(commandEventConfig)) { +// log.error("协议{},没有配置成功接收回复配置,清排查原因"); +// return null; +// } +// String replyJson = commandEventConfig.getReplyContentJson(); +// List> replyMapList = JSONArray.parseObject(replyJson, List.class); +// List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); +// Map fixMap = fixList.stream() +// .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); +// List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) +// .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) +// .collect(Collectors.toList()); +// Map commandConfigMap = new HashMap<>(); +// commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); +// commandConfigMap.put("fixContent", fixMap); +// commandConfigMap.put("bizContent", contentList); +// return commandConfigMap; + return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 128b09d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java deleted file mode 100644 index 4016b0b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface DatagramEventMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java deleted file mode 100644 index 597c306..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.apache.ibatis.annotations.Mapper; - -public interface FieldConfigMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java deleted file mode 100644 index a31680a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.PreRuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface PreRuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java deleted file mode 100644 index 9060a69..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface ProtocolConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java deleted file mode 100644 index 6fa6936..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java deleted file mode 100644 index 582a705..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleDict; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleDictMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java deleted file mode 100644 index 6e302c8..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.CommandEventMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Optional; - -@Component -public class CommandEventDao { - - @Resource - private CommandEventMapper commandEventMapper; - - public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId) - .eq("scene", sceneName) - .eq("enabled", 1); - List commandEventConfig = commandEventMapper.selectList(queryWrapper); - Optional optionalEventConfig = commandEventConfig.stream().findFirst(); - return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java deleted file mode 100644 index 9137e4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.FieldConfigMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class FieldConfigDao { - - @Resource - private FieldConfigMapper fieldConfigMapper; - - public FieldConfig getFieldConfigById(String fieldId) { - FieldConfig fieldConfig = fieldConfigMapper.selectById(fieldId); - return fieldConfig; - } - - public List getFieldConfigs(String protocolId,Integer isFixed) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",isFixed); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - - public List getStorageFieldConfig(String protocolId) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",1) - .eq("is_storage",1); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java index 608af3a..32cc8a4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java @@ -2,48 +2,47 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.delivery.decorator.ByteDecorator; +import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @AllArgsConstructor public class FieldDecoratorManger { - private final RuleDictDao ruleDictDao; + private final RuleConfigRegistry ruleDictDao; // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 // (1)静态的业务字段是字典里面可以配置的 // (2)动态的业务字段是通过规则生成的 public String contentMerge(String ruleJson, String sceneConent, String dynamicContent) { - List ruleDictList = ruleDictDao.getRuleDictConfig(); - Map ruleDictMap = ruleDictList.stream().collect( - Collectors.toMap(RuleDict::getId, e -> e)); - List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); - for (Map ruleMap : ruleMapList) { - String ruleType = String.valueOf(ruleMap.get("ruleType")); - ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); - NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); - byteDecorator.nodeDecoratorRule(nodeDecoratorParm); - } +// List ruleDictList = ruleDictDao.getRuleDictConfig(); +// Map ruleDictMap = ruleDictList.stream().collect( +// Collectors.toMap(RuleDict::getId, e -> e)); +// List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); +// for (Map ruleMap : ruleMapList) { +// String ruleType = String.valueOf(ruleMap.get("ruleType")); +// ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); +// NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); +// byteDecorator.nodeDecoratorRule(nodeDecoratorParm); +// } return null; } - - private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { - NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() - .contents(sceneConent) - .dynamicContent(dynamicContent) - .ruletypeId(ruletypeId) - .ruleDictMap(ruleDictMap) - .build(); - return nodeDecoratorParm; - } +// +// private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { +// NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() +// .contents(sceneConent) +// .dynamicContent(dynamicContent) +// .ruletypeId(ruletypeId) +// .ruleDictMap(ruleDictMap) +// .build(); +// return nodeDecoratorParm; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java index 652970c..b204ac3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java @@ -1,56 +1,56 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@AllArgsConstructor -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", - JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Component; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Component("logicalDecorator") +//@AllArgsConstructor +//@Slf4j +//public class LogicalShiftDecorator implements ByteDecorator { +// +//// private final FieldRuleEngineMapper fieldRuleEngineMapper; +//// +//// //字节位移 +//// @Override +//// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +//// String logicalValue = ""; +//// RuleEvaluator fieldRuleEngine = new RuleEvaluator(); +//// try { +//// Map env2 = new HashMap(); +//// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +//// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +//// for (String contentId : contentIdList) { +//// RuleDict ruleDict = ruleDictMap.get(contentId); +//// if (ruleDict.getCode().contains("#")) { +//// //使用动态的值 +//// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +//// } +//// env2.put(ruleDict.getName(), ruleDict.getCode()); +//// } +//// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +//// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +//// return null; +//// } +//// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +//// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +//// return values; +//// } catch (Exception ex) { +//// log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", +//// JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +//// return null; +//// } +//// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java index 346468f..822fead 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@AllArgsConstructor -@Slf4j -public class OperationDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("optionDecorator") +//@AllArgsConstructor +//@Slf4j +//public class OperationDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //混合运算,有常量或者乘除的缩放 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java index 50fb0a7..7a8bccb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@AllArgsConstructor -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +////精度计算 +//@AllArgsConstructor +//@Registry("precisionDecorator") +//@Slf4j +//public class PrecisionDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java index da39235..27f9cc7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java @@ -1,54 +1,53 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@AllArgsConstructor -@Slf4j -public class RuleDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("ruleDecorator") +//@AllArgsConstructor +//@Slf4j +//public class RuleDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //吃我一套正则表达式 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (Exception ex) { +// log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java index 7f5cbf3..c043f97 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java @@ -2,6 +2,6 @@ import java.util.Map; -public interface ComandeEventService { +public interface ComandeEventService{ Map loadComandeEventConfig(String protocolId,String scene); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java index 476ad84..aaf1837 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java @@ -2,46 +2,46 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.dao.CommandEventDao; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @Slf4j @AllArgsConstructor -public class ComandeEventServiceImpl implements ComandeEventService { +public class ComandeEventServiceImpl implements ComandeEventRegistry { - private final CommandEventDao commandEventDao; + // private final CommandEventDao commandEventDao; // 加密bean 固定字段出现变化的字段解析,业务字段的有序内容 @Override - public Map loadComandeEventConfig(String protocolId,String sceneName) { - CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); - if (ObjectUtil.isEmpty(commandEventConfig)) { - log.error("协议{},没有配置成功接收回复配置,清排查原因"); - return null; - } - String replyJson = commandEventConfig.getReplyContentJson(); - List> replyMapList = JSONArray.parseObject(replyJson, List.class); - List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); - Map fixMap = fixList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); - List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) - .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) - .collect(Collectors.toList()); - Map commandConfigMap = new HashMap<>(); - commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); - commandConfigMap.put("fixContent", fixMap); - commandConfigMap.put("bizContent", contentList); - return commandConfigMap; + public Map loadComandeEventConfig(String protocolId, String sceneName) { +// CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); +// if (ObjectUtil.isEmpty(commandEventConfig)) { +// log.error("协议{},没有配置成功接收回复配置,清排查原因"); +// return null; +// } +// String replyJson = commandEventConfig.getReplyContentJson(); +// List> replyMapList = JSONArray.parseObject(replyJson, List.class); +// List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); +// Map fixMap = fixList.stream() +// .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); +// List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) +// .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) +// .collect(Collectors.toList()); +// Map commandConfigMap = new HashMap<>(); +// commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); +// commandConfigMap.put("fixContent", fixMap); +// commandConfigMap.put("bizContent", contentList); +// return commandConfigMap; + return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 128b09d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java deleted file mode 100644 index 4016b0b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface DatagramEventMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java deleted file mode 100644 index 597c306..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.apache.ibatis.annotations.Mapper; - -public interface FieldConfigMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java deleted file mode 100644 index a31680a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.PreRuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface PreRuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java deleted file mode 100644 index 9060a69..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface ProtocolConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java deleted file mode 100644 index 6fa6936..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java deleted file mode 100644 index 582a705..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleDict; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleDictMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java deleted file mode 100644 index 6e302c8..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.CommandEventMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Optional; - -@Component -public class CommandEventDao { - - @Resource - private CommandEventMapper commandEventMapper; - - public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId) - .eq("scene", sceneName) - .eq("enabled", 1); - List commandEventConfig = commandEventMapper.selectList(queryWrapper); - Optional optionalEventConfig = commandEventConfig.stream().findFirst(); - return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java deleted file mode 100644 index 9137e4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.FieldConfigMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class FieldConfigDao { - - @Resource - private FieldConfigMapper fieldConfigMapper; - - public FieldConfig getFieldConfigById(String fieldId) { - FieldConfig fieldConfig = fieldConfigMapper.selectById(fieldId); - return fieldConfig; - } - - public List getFieldConfigs(String protocolId,Integer isFixed) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",isFixed); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - - public List getStorageFieldConfig(String protocolId) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",1) - .eq("is_storage",1); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java deleted file mode 100644 index 67bff6b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.mapper.PreRuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class PreRuleConfigDao { - - @Resource - private PreRuleConfigMapper preRuleConfigMapper; - - public List getPreRuleList(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return preRuleConfigMapper.selectList(queryWrapper); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java index 608af3a..32cc8a4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java @@ -2,48 +2,47 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.delivery.decorator.ByteDecorator; +import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @AllArgsConstructor public class FieldDecoratorManger { - private final RuleDictDao ruleDictDao; + private final RuleConfigRegistry ruleDictDao; // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 // (1)静态的业务字段是字典里面可以配置的 // (2)动态的业务字段是通过规则生成的 public String contentMerge(String ruleJson, String sceneConent, String dynamicContent) { - List ruleDictList = ruleDictDao.getRuleDictConfig(); - Map ruleDictMap = ruleDictList.stream().collect( - Collectors.toMap(RuleDict::getId, e -> e)); - List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); - for (Map ruleMap : ruleMapList) { - String ruleType = String.valueOf(ruleMap.get("ruleType")); - ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); - NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); - byteDecorator.nodeDecoratorRule(nodeDecoratorParm); - } +// List ruleDictList = ruleDictDao.getRuleDictConfig(); +// Map ruleDictMap = ruleDictList.stream().collect( +// Collectors.toMap(RuleDict::getId, e -> e)); +// List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); +// for (Map ruleMap : ruleMapList) { +// String ruleType = String.valueOf(ruleMap.get("ruleType")); +// ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); +// NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); +// byteDecorator.nodeDecoratorRule(nodeDecoratorParm); +// } return null; } - - private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { - NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() - .contents(sceneConent) - .dynamicContent(dynamicContent) - .ruletypeId(ruletypeId) - .ruleDictMap(ruleDictMap) - .build(); - return nodeDecoratorParm; - } +// +// private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { +// NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() +// .contents(sceneConent) +// .dynamicContent(dynamicContent) +// .ruletypeId(ruletypeId) +// .ruleDictMap(ruleDictMap) +// .build(); +// return nodeDecoratorParm; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java index 652970c..b204ac3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java @@ -1,56 +1,56 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@AllArgsConstructor -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", - JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Component; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Component("logicalDecorator") +//@AllArgsConstructor +//@Slf4j +//public class LogicalShiftDecorator implements ByteDecorator { +// +//// private final FieldRuleEngineMapper fieldRuleEngineMapper; +//// +//// //字节位移 +//// @Override +//// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +//// String logicalValue = ""; +//// RuleEvaluator fieldRuleEngine = new RuleEvaluator(); +//// try { +//// Map env2 = new HashMap(); +//// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +//// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +//// for (String contentId : contentIdList) { +//// RuleDict ruleDict = ruleDictMap.get(contentId); +//// if (ruleDict.getCode().contains("#")) { +//// //使用动态的值 +//// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +//// } +//// env2.put(ruleDict.getName(), ruleDict.getCode()); +//// } +//// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +//// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +//// return null; +//// } +//// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +//// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +//// return values; +//// } catch (Exception ex) { +//// log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", +//// JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +//// return null; +//// } +//// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java index 346468f..822fead 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@AllArgsConstructor -@Slf4j -public class OperationDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("optionDecorator") +//@AllArgsConstructor +//@Slf4j +//public class OperationDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //混合运算,有常量或者乘除的缩放 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java index 50fb0a7..7a8bccb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@AllArgsConstructor -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +////精度计算 +//@AllArgsConstructor +//@Registry("precisionDecorator") +//@Slf4j +//public class PrecisionDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java index da39235..27f9cc7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java @@ -1,54 +1,53 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@AllArgsConstructor -@Slf4j -public class RuleDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("ruleDecorator") +//@AllArgsConstructor +//@Slf4j +//public class RuleDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //吃我一套正则表达式 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (Exception ex) { +// log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java index 7f5cbf3..c043f97 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java @@ -2,6 +2,6 @@ import java.util.Map; -public interface ComandeEventService { +public interface ComandeEventService{ Map loadComandeEventConfig(String protocolId,String scene); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java index 476ad84..aaf1837 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java @@ -2,46 +2,46 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.dao.CommandEventDao; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @Slf4j @AllArgsConstructor -public class ComandeEventServiceImpl implements ComandeEventService { +public class ComandeEventServiceImpl implements ComandeEventRegistry { - private final CommandEventDao commandEventDao; + // private final CommandEventDao commandEventDao; // 加密bean 固定字段出现变化的字段解析,业务字段的有序内容 @Override - public Map loadComandeEventConfig(String protocolId,String sceneName) { - CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); - if (ObjectUtil.isEmpty(commandEventConfig)) { - log.error("协议{},没有配置成功接收回复配置,清排查原因"); - return null; - } - String replyJson = commandEventConfig.getReplyContentJson(); - List> replyMapList = JSONArray.parseObject(replyJson, List.class); - List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); - Map fixMap = fixList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); - List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) - .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) - .collect(Collectors.toList()); - Map commandConfigMap = new HashMap<>(); - commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); - commandConfigMap.put("fixContent", fixMap); - commandConfigMap.put("bizContent", contentList); - return commandConfigMap; + public Map loadComandeEventConfig(String protocolId, String sceneName) { +// CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); +// if (ObjectUtil.isEmpty(commandEventConfig)) { +// log.error("协议{},没有配置成功接收回复配置,清排查原因"); +// return null; +// } +// String replyJson = commandEventConfig.getReplyContentJson(); +// List> replyMapList = JSONArray.parseObject(replyJson, List.class); +// List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); +// Map fixMap = fixList.stream() +// .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); +// List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) +// .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) +// .collect(Collectors.toList()); +// Map commandConfigMap = new HashMap<>(); +// commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); +// commandConfigMap.put("fixContent", fixMap); +// commandConfigMap.put("bizContent", contentList); +// return commandConfigMap; + return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 128b09d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java deleted file mode 100644 index 4016b0b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface DatagramEventMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java deleted file mode 100644 index 597c306..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.apache.ibatis.annotations.Mapper; - -public interface FieldConfigMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java deleted file mode 100644 index a31680a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.PreRuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface PreRuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java deleted file mode 100644 index 9060a69..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface ProtocolConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java deleted file mode 100644 index 6fa6936..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java deleted file mode 100644 index 582a705..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleDict; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleDictMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java deleted file mode 100644 index 6e302c8..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.CommandEventMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Optional; - -@Component -public class CommandEventDao { - - @Resource - private CommandEventMapper commandEventMapper; - - public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId) - .eq("scene", sceneName) - .eq("enabled", 1); - List commandEventConfig = commandEventMapper.selectList(queryWrapper); - Optional optionalEventConfig = commandEventConfig.stream().findFirst(); - return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java deleted file mode 100644 index 9137e4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.FieldConfigMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class FieldConfigDao { - - @Resource - private FieldConfigMapper fieldConfigMapper; - - public FieldConfig getFieldConfigById(String fieldId) { - FieldConfig fieldConfig = fieldConfigMapper.selectById(fieldId); - return fieldConfig; - } - - public List getFieldConfigs(String protocolId,Integer isFixed) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",isFixed); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - - public List getStorageFieldConfig(String protocolId) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",1) - .eq("is_storage",1); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java deleted file mode 100644 index 67bff6b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.mapper.PreRuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class PreRuleConfigDao { - - @Resource - private PreRuleConfigMapper preRuleConfigMapper; - - public List getPreRuleList(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return preRuleConfigMapper.selectList(queryWrapper); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java deleted file mode 100644 index d69ea85..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.RuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleConfigDao { - - @Resource - private RuleConfigMapper ruleConfigMapper; - - public RuleConfig getNextRuleConfig(String ruleFields) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("parse_rule_json", ruleFields); - return ruleConfigMapper.selectOne(queryWrapper); - } - - - public List getRuleConfigById(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return ruleConfigMapper.selectList(queryWrapper); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java index 608af3a..32cc8a4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java @@ -2,48 +2,47 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.delivery.decorator.ByteDecorator; +import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @AllArgsConstructor public class FieldDecoratorManger { - private final RuleDictDao ruleDictDao; + private final RuleConfigRegistry ruleDictDao; // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 // (1)静态的业务字段是字典里面可以配置的 // (2)动态的业务字段是通过规则生成的 public String contentMerge(String ruleJson, String sceneConent, String dynamicContent) { - List ruleDictList = ruleDictDao.getRuleDictConfig(); - Map ruleDictMap = ruleDictList.stream().collect( - Collectors.toMap(RuleDict::getId, e -> e)); - List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); - for (Map ruleMap : ruleMapList) { - String ruleType = String.valueOf(ruleMap.get("ruleType")); - ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); - NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); - byteDecorator.nodeDecoratorRule(nodeDecoratorParm); - } +// List ruleDictList = ruleDictDao.getRuleDictConfig(); +// Map ruleDictMap = ruleDictList.stream().collect( +// Collectors.toMap(RuleDict::getId, e -> e)); +// List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); +// for (Map ruleMap : ruleMapList) { +// String ruleType = String.valueOf(ruleMap.get("ruleType")); +// ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); +// NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); +// byteDecorator.nodeDecoratorRule(nodeDecoratorParm); +// } return null; } - - private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { - NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() - .contents(sceneConent) - .dynamicContent(dynamicContent) - .ruletypeId(ruletypeId) - .ruleDictMap(ruleDictMap) - .build(); - return nodeDecoratorParm; - } +// +// private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { +// NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() +// .contents(sceneConent) +// .dynamicContent(dynamicContent) +// .ruletypeId(ruletypeId) +// .ruleDictMap(ruleDictMap) +// .build(); +// return nodeDecoratorParm; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java index 652970c..b204ac3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java @@ -1,56 +1,56 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@AllArgsConstructor -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", - JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Component; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Component("logicalDecorator") +//@AllArgsConstructor +//@Slf4j +//public class LogicalShiftDecorator implements ByteDecorator { +// +//// private final FieldRuleEngineMapper fieldRuleEngineMapper; +//// +//// //字节位移 +//// @Override +//// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +//// String logicalValue = ""; +//// RuleEvaluator fieldRuleEngine = new RuleEvaluator(); +//// try { +//// Map env2 = new HashMap(); +//// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +//// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +//// for (String contentId : contentIdList) { +//// RuleDict ruleDict = ruleDictMap.get(contentId); +//// if (ruleDict.getCode().contains("#")) { +//// //使用动态的值 +//// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +//// } +//// env2.put(ruleDict.getName(), ruleDict.getCode()); +//// } +//// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +//// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +//// return null; +//// } +//// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +//// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +//// return values; +//// } catch (Exception ex) { +//// log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", +//// JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +//// return null; +//// } +//// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java index 346468f..822fead 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@AllArgsConstructor -@Slf4j -public class OperationDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("optionDecorator") +//@AllArgsConstructor +//@Slf4j +//public class OperationDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //混合运算,有常量或者乘除的缩放 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java index 50fb0a7..7a8bccb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@AllArgsConstructor -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +////精度计算 +//@AllArgsConstructor +//@Registry("precisionDecorator") +//@Slf4j +//public class PrecisionDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java index da39235..27f9cc7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java @@ -1,54 +1,53 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@AllArgsConstructor -@Slf4j -public class RuleDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("ruleDecorator") +//@AllArgsConstructor +//@Slf4j +//public class RuleDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //吃我一套正则表达式 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (Exception ex) { +// log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java index 7f5cbf3..c043f97 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java @@ -2,6 +2,6 @@ import java.util.Map; -public interface ComandeEventService { +public interface ComandeEventService{ Map loadComandeEventConfig(String protocolId,String scene); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java index 476ad84..aaf1837 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java @@ -2,46 +2,46 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.dao.CommandEventDao; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @Slf4j @AllArgsConstructor -public class ComandeEventServiceImpl implements ComandeEventService { +public class ComandeEventServiceImpl implements ComandeEventRegistry { - private final CommandEventDao commandEventDao; + // private final CommandEventDao commandEventDao; // 加密bean 固定字段出现变化的字段解析,业务字段的有序内容 @Override - public Map loadComandeEventConfig(String protocolId,String sceneName) { - CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); - if (ObjectUtil.isEmpty(commandEventConfig)) { - log.error("协议{},没有配置成功接收回复配置,清排查原因"); - return null; - } - String replyJson = commandEventConfig.getReplyContentJson(); - List> replyMapList = JSONArray.parseObject(replyJson, List.class); - List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); - Map fixMap = fixList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); - List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) - .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) - .collect(Collectors.toList()); - Map commandConfigMap = new HashMap<>(); - commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); - commandConfigMap.put("fixContent", fixMap); - commandConfigMap.put("bizContent", contentList); - return commandConfigMap; + public Map loadComandeEventConfig(String protocolId, String sceneName) { +// CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); +// if (ObjectUtil.isEmpty(commandEventConfig)) { +// log.error("协议{},没有配置成功接收回复配置,清排查原因"); +// return null; +// } +// String replyJson = commandEventConfig.getReplyContentJson(); +// List> replyMapList = JSONArray.parseObject(replyJson, List.class); +// List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); +// Map fixMap = fixList.stream() +// .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); +// List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) +// .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) +// .collect(Collectors.toList()); +// Map commandConfigMap = new HashMap<>(); +// commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); +// commandConfigMap.put("fixContent", fixMap); +// commandConfigMap.put("bizContent", contentList); +// return commandConfigMap; + return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 128b09d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java deleted file mode 100644 index 4016b0b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface DatagramEventMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java deleted file mode 100644 index 597c306..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.apache.ibatis.annotations.Mapper; - -public interface FieldConfigMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java deleted file mode 100644 index a31680a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.PreRuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface PreRuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java deleted file mode 100644 index 9060a69..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface ProtocolConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java deleted file mode 100644 index 6fa6936..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java deleted file mode 100644 index 582a705..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleDict; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleDictMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java deleted file mode 100644 index 6e302c8..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.CommandEventMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Optional; - -@Component -public class CommandEventDao { - - @Resource - private CommandEventMapper commandEventMapper; - - public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId) - .eq("scene", sceneName) - .eq("enabled", 1); - List commandEventConfig = commandEventMapper.selectList(queryWrapper); - Optional optionalEventConfig = commandEventConfig.stream().findFirst(); - return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java deleted file mode 100644 index 9137e4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.FieldConfigMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class FieldConfigDao { - - @Resource - private FieldConfigMapper fieldConfigMapper; - - public FieldConfig getFieldConfigById(String fieldId) { - FieldConfig fieldConfig = fieldConfigMapper.selectById(fieldId); - return fieldConfig; - } - - public List getFieldConfigs(String protocolId,Integer isFixed) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",isFixed); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - - public List getStorageFieldConfig(String protocolId) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",1) - .eq("is_storage",1); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java deleted file mode 100644 index 67bff6b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.mapper.PreRuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class PreRuleConfigDao { - - @Resource - private PreRuleConfigMapper preRuleConfigMapper; - - public List getPreRuleList(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return preRuleConfigMapper.selectList(queryWrapper); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java deleted file mode 100644 index d69ea85..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.RuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleConfigDao { - - @Resource - private RuleConfigMapper ruleConfigMapper; - - public RuleConfig getNextRuleConfig(String ruleFields) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("parse_rule_json", ruleFields); - return ruleConfigMapper.selectOne(queryWrapper); - } - - - public List getRuleConfigById(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return ruleConfigMapper.selectList(queryWrapper); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java deleted file mode 100644 index 932c185..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.RuleDictMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleDictDao { - - @Resource - private RuleDictMapper ruleDictMapper; - - public List getRuleDictConfig() { - List ruleDictList = ruleDictMapper.selectList(null); - return ruleDictList; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java index 608af3a..32cc8a4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java @@ -2,48 +2,47 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.delivery.decorator.ByteDecorator; +import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @AllArgsConstructor public class FieldDecoratorManger { - private final RuleDictDao ruleDictDao; + private final RuleConfigRegistry ruleDictDao; // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 // (1)静态的业务字段是字典里面可以配置的 // (2)动态的业务字段是通过规则生成的 public String contentMerge(String ruleJson, String sceneConent, String dynamicContent) { - List ruleDictList = ruleDictDao.getRuleDictConfig(); - Map ruleDictMap = ruleDictList.stream().collect( - Collectors.toMap(RuleDict::getId, e -> e)); - List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); - for (Map ruleMap : ruleMapList) { - String ruleType = String.valueOf(ruleMap.get("ruleType")); - ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); - NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); - byteDecorator.nodeDecoratorRule(nodeDecoratorParm); - } +// List ruleDictList = ruleDictDao.getRuleDictConfig(); +// Map ruleDictMap = ruleDictList.stream().collect( +// Collectors.toMap(RuleDict::getId, e -> e)); +// List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); +// for (Map ruleMap : ruleMapList) { +// String ruleType = String.valueOf(ruleMap.get("ruleType")); +// ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); +// NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); +// byteDecorator.nodeDecoratorRule(nodeDecoratorParm); +// } return null; } - - private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { - NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() - .contents(sceneConent) - .dynamicContent(dynamicContent) - .ruletypeId(ruletypeId) - .ruleDictMap(ruleDictMap) - .build(); - return nodeDecoratorParm; - } +// +// private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { +// NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() +// .contents(sceneConent) +// .dynamicContent(dynamicContent) +// .ruletypeId(ruletypeId) +// .ruleDictMap(ruleDictMap) +// .build(); +// return nodeDecoratorParm; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java index 652970c..b204ac3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java @@ -1,56 +1,56 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@AllArgsConstructor -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", - JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Component; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Component("logicalDecorator") +//@AllArgsConstructor +//@Slf4j +//public class LogicalShiftDecorator implements ByteDecorator { +// +//// private final FieldRuleEngineMapper fieldRuleEngineMapper; +//// +//// //字节位移 +//// @Override +//// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +//// String logicalValue = ""; +//// RuleEvaluator fieldRuleEngine = new RuleEvaluator(); +//// try { +//// Map env2 = new HashMap(); +//// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +//// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +//// for (String contentId : contentIdList) { +//// RuleDict ruleDict = ruleDictMap.get(contentId); +//// if (ruleDict.getCode().contains("#")) { +//// //使用动态的值 +//// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +//// } +//// env2.put(ruleDict.getName(), ruleDict.getCode()); +//// } +//// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +//// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +//// return null; +//// } +//// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +//// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +//// return values; +//// } catch (Exception ex) { +//// log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", +//// JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +//// return null; +//// } +//// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java index 346468f..822fead 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@AllArgsConstructor -@Slf4j -public class OperationDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("optionDecorator") +//@AllArgsConstructor +//@Slf4j +//public class OperationDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //混合运算,有常量或者乘除的缩放 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java index 50fb0a7..7a8bccb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@AllArgsConstructor -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +////精度计算 +//@AllArgsConstructor +//@Registry("precisionDecorator") +//@Slf4j +//public class PrecisionDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java index da39235..27f9cc7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java @@ -1,54 +1,53 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@AllArgsConstructor -@Slf4j -public class RuleDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("ruleDecorator") +//@AllArgsConstructor +//@Slf4j +//public class RuleDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //吃我一套正则表达式 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (Exception ex) { +// log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java index 7f5cbf3..c043f97 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java @@ -2,6 +2,6 @@ import java.util.Map; -public interface ComandeEventService { +public interface ComandeEventService{ Map loadComandeEventConfig(String protocolId,String scene); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java index 476ad84..aaf1837 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java @@ -2,46 +2,46 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.dao.CommandEventDao; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @Slf4j @AllArgsConstructor -public class ComandeEventServiceImpl implements ComandeEventService { +public class ComandeEventServiceImpl implements ComandeEventRegistry { - private final CommandEventDao commandEventDao; + // private final CommandEventDao commandEventDao; // 加密bean 固定字段出现变化的字段解析,业务字段的有序内容 @Override - public Map loadComandeEventConfig(String protocolId,String sceneName) { - CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); - if (ObjectUtil.isEmpty(commandEventConfig)) { - log.error("协议{},没有配置成功接收回复配置,清排查原因"); - return null; - } - String replyJson = commandEventConfig.getReplyContentJson(); - List> replyMapList = JSONArray.parseObject(replyJson, List.class); - List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); - Map fixMap = fixList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); - List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) - .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) - .collect(Collectors.toList()); - Map commandConfigMap = new HashMap<>(); - commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); - commandConfigMap.put("fixContent", fixMap); - commandConfigMap.put("bizContent", contentList); - return commandConfigMap; + public Map loadComandeEventConfig(String protocolId, String sceneName) { +// CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); +// if (ObjectUtil.isEmpty(commandEventConfig)) { +// log.error("协议{},没有配置成功接收回复配置,清排查原因"); +// return null; +// } +// String replyJson = commandEventConfig.getReplyContentJson(); +// List> replyMapList = JSONArray.parseObject(replyJson, List.class); +// List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); +// Map fixMap = fixList.stream() +// .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); +// List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) +// .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) +// .collect(Collectors.toList()); +// Map commandConfigMap = new HashMap<>(); +// commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); +// commandConfigMap.put("fixContent", fixMap); +// commandConfigMap.put("bizContent", contentList); +// return commandConfigMap; + return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 128b09d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java deleted file mode 100644 index 4016b0b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface DatagramEventMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java deleted file mode 100644 index 597c306..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.apache.ibatis.annotations.Mapper; - -public interface FieldConfigMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java deleted file mode 100644 index a31680a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.PreRuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface PreRuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java deleted file mode 100644 index 9060a69..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface ProtocolConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java deleted file mode 100644 index 6fa6936..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java deleted file mode 100644 index 582a705..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleDict; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleDictMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java deleted file mode 100644 index 6e302c8..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.CommandEventMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Optional; - -@Component -public class CommandEventDao { - - @Resource - private CommandEventMapper commandEventMapper; - - public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId) - .eq("scene", sceneName) - .eq("enabled", 1); - List commandEventConfig = commandEventMapper.selectList(queryWrapper); - Optional optionalEventConfig = commandEventConfig.stream().findFirst(); - return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java deleted file mode 100644 index 9137e4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.FieldConfigMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class FieldConfigDao { - - @Resource - private FieldConfigMapper fieldConfigMapper; - - public FieldConfig getFieldConfigById(String fieldId) { - FieldConfig fieldConfig = fieldConfigMapper.selectById(fieldId); - return fieldConfig; - } - - public List getFieldConfigs(String protocolId,Integer isFixed) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",isFixed); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - - public List getStorageFieldConfig(String protocolId) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",1) - .eq("is_storage",1); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java deleted file mode 100644 index 67bff6b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.mapper.PreRuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class PreRuleConfigDao { - - @Resource - private PreRuleConfigMapper preRuleConfigMapper; - - public List getPreRuleList(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return preRuleConfigMapper.selectList(queryWrapper); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java deleted file mode 100644 index d69ea85..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.RuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleConfigDao { - - @Resource - private RuleConfigMapper ruleConfigMapper; - - public RuleConfig getNextRuleConfig(String ruleFields) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("parse_rule_json", ruleFields); - return ruleConfigMapper.selectOne(queryWrapper); - } - - - public List getRuleConfigById(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return ruleConfigMapper.selectList(queryWrapper); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java deleted file mode 100644 index 932c185..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.RuleDictMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleDictDao { - - @Resource - private RuleDictMapper ruleDictMapper; - - public List getRuleDictConfig() { - List ruleDictList = ruleDictMapper.selectList(null); - return ruleDictList; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java index 9f9e279..43bc4d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java @@ -10,20 +10,15 @@ import io.netty.channel.socket.nio.NioServerSocketChannel; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import javax.annotation.PreDestroy; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static cn.hutool.core.util.ClassUtil.getClasses; /** * SensorhubServer netty服务端 */ @Slf4j -@Service +@Component public class SensorhubServer { /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java index 608af3a..32cc8a4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java @@ -2,48 +2,47 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.delivery.decorator.ByteDecorator; +import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @AllArgsConstructor public class FieldDecoratorManger { - private final RuleDictDao ruleDictDao; + private final RuleConfigRegistry ruleDictDao; // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 // (1)静态的业务字段是字典里面可以配置的 // (2)动态的业务字段是通过规则生成的 public String contentMerge(String ruleJson, String sceneConent, String dynamicContent) { - List ruleDictList = ruleDictDao.getRuleDictConfig(); - Map ruleDictMap = ruleDictList.stream().collect( - Collectors.toMap(RuleDict::getId, e -> e)); - List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); - for (Map ruleMap : ruleMapList) { - String ruleType = String.valueOf(ruleMap.get("ruleType")); - ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); - NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); - byteDecorator.nodeDecoratorRule(nodeDecoratorParm); - } +// List ruleDictList = ruleDictDao.getRuleDictConfig(); +// Map ruleDictMap = ruleDictList.stream().collect( +// Collectors.toMap(RuleDict::getId, e -> e)); +// List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); +// for (Map ruleMap : ruleMapList) { +// String ruleType = String.valueOf(ruleMap.get("ruleType")); +// ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); +// NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); +// byteDecorator.nodeDecoratorRule(nodeDecoratorParm); +// } return null; } - - private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { - NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() - .contents(sceneConent) - .dynamicContent(dynamicContent) - .ruletypeId(ruletypeId) - .ruleDictMap(ruleDictMap) - .build(); - return nodeDecoratorParm; - } +// +// private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { +// NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() +// .contents(sceneConent) +// .dynamicContent(dynamicContent) +// .ruletypeId(ruletypeId) +// .ruleDictMap(ruleDictMap) +// .build(); +// return nodeDecoratorParm; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java index 652970c..b204ac3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java @@ -1,56 +1,56 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@AllArgsConstructor -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", - JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Component; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Component("logicalDecorator") +//@AllArgsConstructor +//@Slf4j +//public class LogicalShiftDecorator implements ByteDecorator { +// +//// private final FieldRuleEngineMapper fieldRuleEngineMapper; +//// +//// //字节位移 +//// @Override +//// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +//// String logicalValue = ""; +//// RuleEvaluator fieldRuleEngine = new RuleEvaluator(); +//// try { +//// Map env2 = new HashMap(); +//// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +//// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +//// for (String contentId : contentIdList) { +//// RuleDict ruleDict = ruleDictMap.get(contentId); +//// if (ruleDict.getCode().contains("#")) { +//// //使用动态的值 +//// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +//// } +//// env2.put(ruleDict.getName(), ruleDict.getCode()); +//// } +//// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +//// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +//// return null; +//// } +//// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +//// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +//// return values; +//// } catch (Exception ex) { +//// log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", +//// JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +//// return null; +//// } +//// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java index 346468f..822fead 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@AllArgsConstructor -@Slf4j -public class OperationDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("optionDecorator") +//@AllArgsConstructor +//@Slf4j +//public class OperationDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //混合运算,有常量或者乘除的缩放 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java index 50fb0a7..7a8bccb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@AllArgsConstructor -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +////精度计算 +//@AllArgsConstructor +//@Registry("precisionDecorator") +//@Slf4j +//public class PrecisionDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java index da39235..27f9cc7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java @@ -1,54 +1,53 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@AllArgsConstructor -@Slf4j -public class RuleDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("ruleDecorator") +//@AllArgsConstructor +//@Slf4j +//public class RuleDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //吃我一套正则表达式 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (Exception ex) { +// log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java index 7f5cbf3..c043f97 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java @@ -2,6 +2,6 @@ import java.util.Map; -public interface ComandeEventService { +public interface ComandeEventService{ Map loadComandeEventConfig(String protocolId,String scene); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java index 476ad84..aaf1837 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java @@ -2,46 +2,46 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.dao.CommandEventDao; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @Slf4j @AllArgsConstructor -public class ComandeEventServiceImpl implements ComandeEventService { +public class ComandeEventServiceImpl implements ComandeEventRegistry { - private final CommandEventDao commandEventDao; + // private final CommandEventDao commandEventDao; // 加密bean 固定字段出现变化的字段解析,业务字段的有序内容 @Override - public Map loadComandeEventConfig(String protocolId,String sceneName) { - CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); - if (ObjectUtil.isEmpty(commandEventConfig)) { - log.error("协议{},没有配置成功接收回复配置,清排查原因"); - return null; - } - String replyJson = commandEventConfig.getReplyContentJson(); - List> replyMapList = JSONArray.parseObject(replyJson, List.class); - List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); - Map fixMap = fixList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); - List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) - .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) - .collect(Collectors.toList()); - Map commandConfigMap = new HashMap<>(); - commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); - commandConfigMap.put("fixContent", fixMap); - commandConfigMap.put("bizContent", contentList); - return commandConfigMap; + public Map loadComandeEventConfig(String protocolId, String sceneName) { +// CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); +// if (ObjectUtil.isEmpty(commandEventConfig)) { +// log.error("协议{},没有配置成功接收回复配置,清排查原因"); +// return null; +// } +// String replyJson = commandEventConfig.getReplyContentJson(); +// List> replyMapList = JSONArray.parseObject(replyJson, List.class); +// List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); +// Map fixMap = fixList.stream() +// .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); +// List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) +// .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) +// .collect(Collectors.toList()); +// Map commandConfigMap = new HashMap<>(); +// commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); +// commandConfigMap.put("fixContent", fixMap); +// commandConfigMap.put("bizContent", contentList); +// return commandConfigMap; + return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 128b09d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java deleted file mode 100644 index 4016b0b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface DatagramEventMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java deleted file mode 100644 index 597c306..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.apache.ibatis.annotations.Mapper; - -public interface FieldConfigMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java deleted file mode 100644 index a31680a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.PreRuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface PreRuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java deleted file mode 100644 index 9060a69..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface ProtocolConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java deleted file mode 100644 index 6fa6936..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java deleted file mode 100644 index 582a705..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleDict; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleDictMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java deleted file mode 100644 index 6e302c8..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.CommandEventMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Optional; - -@Component -public class CommandEventDao { - - @Resource - private CommandEventMapper commandEventMapper; - - public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId) - .eq("scene", sceneName) - .eq("enabled", 1); - List commandEventConfig = commandEventMapper.selectList(queryWrapper); - Optional optionalEventConfig = commandEventConfig.stream().findFirst(); - return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java deleted file mode 100644 index 9137e4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.FieldConfigMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class FieldConfigDao { - - @Resource - private FieldConfigMapper fieldConfigMapper; - - public FieldConfig getFieldConfigById(String fieldId) { - FieldConfig fieldConfig = fieldConfigMapper.selectById(fieldId); - return fieldConfig; - } - - public List getFieldConfigs(String protocolId,Integer isFixed) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",isFixed); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - - public List getStorageFieldConfig(String protocolId) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",1) - .eq("is_storage",1); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java deleted file mode 100644 index 67bff6b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.mapper.PreRuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class PreRuleConfigDao { - - @Resource - private PreRuleConfigMapper preRuleConfigMapper; - - public List getPreRuleList(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return preRuleConfigMapper.selectList(queryWrapper); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java deleted file mode 100644 index d69ea85..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.RuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleConfigDao { - - @Resource - private RuleConfigMapper ruleConfigMapper; - - public RuleConfig getNextRuleConfig(String ruleFields) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("parse_rule_json", ruleFields); - return ruleConfigMapper.selectOne(queryWrapper); - } - - - public List getRuleConfigById(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return ruleConfigMapper.selectList(queryWrapper); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java deleted file mode 100644 index 932c185..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.RuleDictMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleDictDao { - - @Resource - private RuleDictMapper ruleDictMapper; - - public List getRuleDictConfig() { - List ruleDictList = ruleDictMapper.selectList(null); - return ruleDictList; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java index 9f9e279..43bc4d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java @@ -10,20 +10,15 @@ import io.netty.channel.socket.nio.NioServerSocketChannel; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import javax.annotation.PreDestroy; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static cn.hutool.core.util.ClassUtil.getClasses; /** * SensorhubServer netty服务端 */ @Slf4j -@Service +@Component public class SensorhubServer { /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java index 2c79ff5..9a28c36 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java @@ -11,13 +11,13 @@ import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioSocketChannel; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClient 客户端 */ @Slf4j -@Service +@Registry public final class SensorhubClient { public static void main(String[] args) throws Exception { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java index 608af3a..32cc8a4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java @@ -2,48 +2,47 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.delivery.decorator.ByteDecorator; +import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @AllArgsConstructor public class FieldDecoratorManger { - private final RuleDictDao ruleDictDao; + private final RuleConfigRegistry ruleDictDao; // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 // (1)静态的业务字段是字典里面可以配置的 // (2)动态的业务字段是通过规则生成的 public String contentMerge(String ruleJson, String sceneConent, String dynamicContent) { - List ruleDictList = ruleDictDao.getRuleDictConfig(); - Map ruleDictMap = ruleDictList.stream().collect( - Collectors.toMap(RuleDict::getId, e -> e)); - List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); - for (Map ruleMap : ruleMapList) { - String ruleType = String.valueOf(ruleMap.get("ruleType")); - ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); - NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); - byteDecorator.nodeDecoratorRule(nodeDecoratorParm); - } +// List ruleDictList = ruleDictDao.getRuleDictConfig(); +// Map ruleDictMap = ruleDictList.stream().collect( +// Collectors.toMap(RuleDict::getId, e -> e)); +// List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); +// for (Map ruleMap : ruleMapList) { +// String ruleType = String.valueOf(ruleMap.get("ruleType")); +// ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); +// NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); +// byteDecorator.nodeDecoratorRule(nodeDecoratorParm); +// } return null; } - - private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { - NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() - .contents(sceneConent) - .dynamicContent(dynamicContent) - .ruletypeId(ruletypeId) - .ruleDictMap(ruleDictMap) - .build(); - return nodeDecoratorParm; - } +// +// private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { +// NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() +// .contents(sceneConent) +// .dynamicContent(dynamicContent) +// .ruletypeId(ruletypeId) +// .ruleDictMap(ruleDictMap) +// .build(); +// return nodeDecoratorParm; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java index 652970c..b204ac3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java @@ -1,56 +1,56 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@AllArgsConstructor -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", - JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Component; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Component("logicalDecorator") +//@AllArgsConstructor +//@Slf4j +//public class LogicalShiftDecorator implements ByteDecorator { +// +//// private final FieldRuleEngineMapper fieldRuleEngineMapper; +//// +//// //字节位移 +//// @Override +//// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +//// String logicalValue = ""; +//// RuleEvaluator fieldRuleEngine = new RuleEvaluator(); +//// try { +//// Map env2 = new HashMap(); +//// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +//// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +//// for (String contentId : contentIdList) { +//// RuleDict ruleDict = ruleDictMap.get(contentId); +//// if (ruleDict.getCode().contains("#")) { +//// //使用动态的值 +//// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +//// } +//// env2.put(ruleDict.getName(), ruleDict.getCode()); +//// } +//// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +//// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +//// return null; +//// } +//// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +//// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +//// return values; +//// } catch (Exception ex) { +//// log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", +//// JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +//// return null; +//// } +//// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java index 346468f..822fead 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@AllArgsConstructor -@Slf4j -public class OperationDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("optionDecorator") +//@AllArgsConstructor +//@Slf4j +//public class OperationDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //混合运算,有常量或者乘除的缩放 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java index 50fb0a7..7a8bccb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@AllArgsConstructor -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +////精度计算 +//@AllArgsConstructor +//@Registry("precisionDecorator") +//@Slf4j +//public class PrecisionDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java index da39235..27f9cc7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java @@ -1,54 +1,53 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@AllArgsConstructor -@Slf4j -public class RuleDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("ruleDecorator") +//@AllArgsConstructor +//@Slf4j +//public class RuleDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //吃我一套正则表达式 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (Exception ex) { +// log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java index 7f5cbf3..c043f97 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java @@ -2,6 +2,6 @@ import java.util.Map; -public interface ComandeEventService { +public interface ComandeEventService{ Map loadComandeEventConfig(String protocolId,String scene); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java index 476ad84..aaf1837 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java @@ -2,46 +2,46 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.dao.CommandEventDao; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @Slf4j @AllArgsConstructor -public class ComandeEventServiceImpl implements ComandeEventService { +public class ComandeEventServiceImpl implements ComandeEventRegistry { - private final CommandEventDao commandEventDao; + // private final CommandEventDao commandEventDao; // 加密bean 固定字段出现变化的字段解析,业务字段的有序内容 @Override - public Map loadComandeEventConfig(String protocolId,String sceneName) { - CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); - if (ObjectUtil.isEmpty(commandEventConfig)) { - log.error("协议{},没有配置成功接收回复配置,清排查原因"); - return null; - } - String replyJson = commandEventConfig.getReplyContentJson(); - List> replyMapList = JSONArray.parseObject(replyJson, List.class); - List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); - Map fixMap = fixList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); - List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) - .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) - .collect(Collectors.toList()); - Map commandConfigMap = new HashMap<>(); - commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); - commandConfigMap.put("fixContent", fixMap); - commandConfigMap.put("bizContent", contentList); - return commandConfigMap; + public Map loadComandeEventConfig(String protocolId, String sceneName) { +// CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); +// if (ObjectUtil.isEmpty(commandEventConfig)) { +// log.error("协议{},没有配置成功接收回复配置,清排查原因"); +// return null; +// } +// String replyJson = commandEventConfig.getReplyContentJson(); +// List> replyMapList = JSONArray.parseObject(replyJson, List.class); +// List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); +// Map fixMap = fixList.stream() +// .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); +// List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) +// .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) +// .collect(Collectors.toList()); +// Map commandConfigMap = new HashMap<>(); +// commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); +// commandConfigMap.put("fixContent", fixMap); +// commandConfigMap.put("bizContent", contentList); +// return commandConfigMap; + return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 128b09d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java deleted file mode 100644 index 4016b0b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface DatagramEventMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java deleted file mode 100644 index 597c306..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.apache.ibatis.annotations.Mapper; - -public interface FieldConfigMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java deleted file mode 100644 index a31680a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.PreRuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface PreRuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java deleted file mode 100644 index 9060a69..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface ProtocolConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java deleted file mode 100644 index 6fa6936..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java deleted file mode 100644 index 582a705..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleDict; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleDictMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java deleted file mode 100644 index 6e302c8..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.CommandEventMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Optional; - -@Component -public class CommandEventDao { - - @Resource - private CommandEventMapper commandEventMapper; - - public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId) - .eq("scene", sceneName) - .eq("enabled", 1); - List commandEventConfig = commandEventMapper.selectList(queryWrapper); - Optional optionalEventConfig = commandEventConfig.stream().findFirst(); - return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java deleted file mode 100644 index 9137e4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.FieldConfigMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class FieldConfigDao { - - @Resource - private FieldConfigMapper fieldConfigMapper; - - public FieldConfig getFieldConfigById(String fieldId) { - FieldConfig fieldConfig = fieldConfigMapper.selectById(fieldId); - return fieldConfig; - } - - public List getFieldConfigs(String protocolId,Integer isFixed) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",isFixed); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - - public List getStorageFieldConfig(String protocolId) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",1) - .eq("is_storage",1); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java deleted file mode 100644 index 67bff6b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.mapper.PreRuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class PreRuleConfigDao { - - @Resource - private PreRuleConfigMapper preRuleConfigMapper; - - public List getPreRuleList(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return preRuleConfigMapper.selectList(queryWrapper); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java deleted file mode 100644 index d69ea85..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.RuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleConfigDao { - - @Resource - private RuleConfigMapper ruleConfigMapper; - - public RuleConfig getNextRuleConfig(String ruleFields) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("parse_rule_json", ruleFields); - return ruleConfigMapper.selectOne(queryWrapper); - } - - - public List getRuleConfigById(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return ruleConfigMapper.selectList(queryWrapper); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java deleted file mode 100644 index 932c185..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.RuleDictMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleDictDao { - - @Resource - private RuleDictMapper ruleDictMapper; - - public List getRuleDictConfig() { - List ruleDictList = ruleDictMapper.selectList(null); - return ruleDictList; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java index 9f9e279..43bc4d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java @@ -10,20 +10,15 @@ import io.netty.channel.socket.nio.NioServerSocketChannel; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import javax.annotation.PreDestroy; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static cn.hutool.core.util.ClassUtil.getClasses; /** * SensorhubServer netty服务端 */ @Slf4j -@Service +@Component public class SensorhubServer { /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java index 2c79ff5..9a28c36 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java @@ -11,13 +11,13 @@ import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioSocketChannel; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClient 客户端 */ @Slf4j -@Service +@Registry public final class SensorhubClient { public static void main(String[] args) throws Exception { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java index 9774be0..477c3f7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java @@ -6,12 +6,12 @@ import io.netty.channel.socket.SocketChannel; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientChannelInitialHandler */ -@Service +@Registry public class SensorhubClientChannelInitialHandler extends ChannelInitializer { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java index 608af3a..32cc8a4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java @@ -2,48 +2,47 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.delivery.decorator.ByteDecorator; +import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @AllArgsConstructor public class FieldDecoratorManger { - private final RuleDictDao ruleDictDao; + private final RuleConfigRegistry ruleDictDao; // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 // (1)静态的业务字段是字典里面可以配置的 // (2)动态的业务字段是通过规则生成的 public String contentMerge(String ruleJson, String sceneConent, String dynamicContent) { - List ruleDictList = ruleDictDao.getRuleDictConfig(); - Map ruleDictMap = ruleDictList.stream().collect( - Collectors.toMap(RuleDict::getId, e -> e)); - List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); - for (Map ruleMap : ruleMapList) { - String ruleType = String.valueOf(ruleMap.get("ruleType")); - ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); - NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); - byteDecorator.nodeDecoratorRule(nodeDecoratorParm); - } +// List ruleDictList = ruleDictDao.getRuleDictConfig(); +// Map ruleDictMap = ruleDictList.stream().collect( +// Collectors.toMap(RuleDict::getId, e -> e)); +// List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); +// for (Map ruleMap : ruleMapList) { +// String ruleType = String.valueOf(ruleMap.get("ruleType")); +// ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); +// NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); +// byteDecorator.nodeDecoratorRule(nodeDecoratorParm); +// } return null; } - - private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { - NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() - .contents(sceneConent) - .dynamicContent(dynamicContent) - .ruletypeId(ruletypeId) - .ruleDictMap(ruleDictMap) - .build(); - return nodeDecoratorParm; - } +// +// private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { +// NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() +// .contents(sceneConent) +// .dynamicContent(dynamicContent) +// .ruletypeId(ruletypeId) +// .ruleDictMap(ruleDictMap) +// .build(); +// return nodeDecoratorParm; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java index 652970c..b204ac3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java @@ -1,56 +1,56 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@AllArgsConstructor -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", - JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Component; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Component("logicalDecorator") +//@AllArgsConstructor +//@Slf4j +//public class LogicalShiftDecorator implements ByteDecorator { +// +//// private final FieldRuleEngineMapper fieldRuleEngineMapper; +//// +//// //字节位移 +//// @Override +//// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +//// String logicalValue = ""; +//// RuleEvaluator fieldRuleEngine = new RuleEvaluator(); +//// try { +//// Map env2 = new HashMap(); +//// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +//// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +//// for (String contentId : contentIdList) { +//// RuleDict ruleDict = ruleDictMap.get(contentId); +//// if (ruleDict.getCode().contains("#")) { +//// //使用动态的值 +//// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +//// } +//// env2.put(ruleDict.getName(), ruleDict.getCode()); +//// } +//// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +//// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +//// return null; +//// } +//// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +//// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +//// return values; +//// } catch (Exception ex) { +//// log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", +//// JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +//// return null; +//// } +//// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java index 346468f..822fead 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@AllArgsConstructor -@Slf4j -public class OperationDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("optionDecorator") +//@AllArgsConstructor +//@Slf4j +//public class OperationDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //混合运算,有常量或者乘除的缩放 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java index 50fb0a7..7a8bccb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@AllArgsConstructor -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +////精度计算 +//@AllArgsConstructor +//@Registry("precisionDecorator") +//@Slf4j +//public class PrecisionDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java index da39235..27f9cc7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java @@ -1,54 +1,53 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@AllArgsConstructor -@Slf4j -public class RuleDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("ruleDecorator") +//@AllArgsConstructor +//@Slf4j +//public class RuleDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //吃我一套正则表达式 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (Exception ex) { +// log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java index 7f5cbf3..c043f97 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java @@ -2,6 +2,6 @@ import java.util.Map; -public interface ComandeEventService { +public interface ComandeEventService{ Map loadComandeEventConfig(String protocolId,String scene); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java index 476ad84..aaf1837 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java @@ -2,46 +2,46 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.dao.CommandEventDao; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @Slf4j @AllArgsConstructor -public class ComandeEventServiceImpl implements ComandeEventService { +public class ComandeEventServiceImpl implements ComandeEventRegistry { - private final CommandEventDao commandEventDao; + // private final CommandEventDao commandEventDao; // 加密bean 固定字段出现变化的字段解析,业务字段的有序内容 @Override - public Map loadComandeEventConfig(String protocolId,String sceneName) { - CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); - if (ObjectUtil.isEmpty(commandEventConfig)) { - log.error("协议{},没有配置成功接收回复配置,清排查原因"); - return null; - } - String replyJson = commandEventConfig.getReplyContentJson(); - List> replyMapList = JSONArray.parseObject(replyJson, List.class); - List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); - Map fixMap = fixList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); - List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) - .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) - .collect(Collectors.toList()); - Map commandConfigMap = new HashMap<>(); - commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); - commandConfigMap.put("fixContent", fixMap); - commandConfigMap.put("bizContent", contentList); - return commandConfigMap; + public Map loadComandeEventConfig(String protocolId, String sceneName) { +// CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); +// if (ObjectUtil.isEmpty(commandEventConfig)) { +// log.error("协议{},没有配置成功接收回复配置,清排查原因"); +// return null; +// } +// String replyJson = commandEventConfig.getReplyContentJson(); +// List> replyMapList = JSONArray.parseObject(replyJson, List.class); +// List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); +// Map fixMap = fixList.stream() +// .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); +// List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) +// .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) +// .collect(Collectors.toList()); +// Map commandConfigMap = new HashMap<>(); +// commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); +// commandConfigMap.put("fixContent", fixMap); +// commandConfigMap.put("bizContent", contentList); +// return commandConfigMap; + return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 128b09d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java deleted file mode 100644 index 4016b0b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface DatagramEventMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java deleted file mode 100644 index 597c306..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.apache.ibatis.annotations.Mapper; - -public interface FieldConfigMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java deleted file mode 100644 index a31680a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.PreRuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface PreRuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java deleted file mode 100644 index 9060a69..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface ProtocolConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java deleted file mode 100644 index 6fa6936..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java deleted file mode 100644 index 582a705..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleDict; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleDictMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java deleted file mode 100644 index 6e302c8..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.CommandEventMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Optional; - -@Component -public class CommandEventDao { - - @Resource - private CommandEventMapper commandEventMapper; - - public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId) - .eq("scene", sceneName) - .eq("enabled", 1); - List commandEventConfig = commandEventMapper.selectList(queryWrapper); - Optional optionalEventConfig = commandEventConfig.stream().findFirst(); - return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java deleted file mode 100644 index 9137e4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.FieldConfigMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class FieldConfigDao { - - @Resource - private FieldConfigMapper fieldConfigMapper; - - public FieldConfig getFieldConfigById(String fieldId) { - FieldConfig fieldConfig = fieldConfigMapper.selectById(fieldId); - return fieldConfig; - } - - public List getFieldConfigs(String protocolId,Integer isFixed) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",isFixed); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - - public List getStorageFieldConfig(String protocolId) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",1) - .eq("is_storage",1); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java deleted file mode 100644 index 67bff6b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.mapper.PreRuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class PreRuleConfigDao { - - @Resource - private PreRuleConfigMapper preRuleConfigMapper; - - public List getPreRuleList(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return preRuleConfigMapper.selectList(queryWrapper); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java deleted file mode 100644 index d69ea85..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.RuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleConfigDao { - - @Resource - private RuleConfigMapper ruleConfigMapper; - - public RuleConfig getNextRuleConfig(String ruleFields) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("parse_rule_json", ruleFields); - return ruleConfigMapper.selectOne(queryWrapper); - } - - - public List getRuleConfigById(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return ruleConfigMapper.selectList(queryWrapper); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java deleted file mode 100644 index 932c185..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.RuleDictMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleDictDao { - - @Resource - private RuleDictMapper ruleDictMapper; - - public List getRuleDictConfig() { - List ruleDictList = ruleDictMapper.selectList(null); - return ruleDictList; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java index 9f9e279..43bc4d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java @@ -10,20 +10,15 @@ import io.netty.channel.socket.nio.NioServerSocketChannel; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import javax.annotation.PreDestroy; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static cn.hutool.core.util.ClassUtil.getClasses; /** * SensorhubServer netty服务端 */ @Slf4j -@Service +@Component public class SensorhubServer { /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java index 2c79ff5..9a28c36 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java @@ -11,13 +11,13 @@ import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioSocketChannel; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClient 客户端 */ @Slf4j -@Service +@Registry public final class SensorhubClient { public static void main(String[] args) throws Exception { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java index 9774be0..477c3f7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java @@ -6,12 +6,12 @@ import io.netty.channel.socket.SocketChannel; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientChannelInitialHandler */ -@Service +@Registry public class SensorhubClientChannelInitialHandler extends ChannelInitializer { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java index 346f4b3..73560e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java @@ -5,13 +5,13 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientHandler */ @Slf4j -@Service +@Registry public class SensorhubClientHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java index 608af3a..32cc8a4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java @@ -2,48 +2,47 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.delivery.decorator.ByteDecorator; +import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @AllArgsConstructor public class FieldDecoratorManger { - private final RuleDictDao ruleDictDao; + private final RuleConfigRegistry ruleDictDao; // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 // (1)静态的业务字段是字典里面可以配置的 // (2)动态的业务字段是通过规则生成的 public String contentMerge(String ruleJson, String sceneConent, String dynamicContent) { - List ruleDictList = ruleDictDao.getRuleDictConfig(); - Map ruleDictMap = ruleDictList.stream().collect( - Collectors.toMap(RuleDict::getId, e -> e)); - List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); - for (Map ruleMap : ruleMapList) { - String ruleType = String.valueOf(ruleMap.get("ruleType")); - ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); - NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); - byteDecorator.nodeDecoratorRule(nodeDecoratorParm); - } +// List ruleDictList = ruleDictDao.getRuleDictConfig(); +// Map ruleDictMap = ruleDictList.stream().collect( +// Collectors.toMap(RuleDict::getId, e -> e)); +// List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); +// for (Map ruleMap : ruleMapList) { +// String ruleType = String.valueOf(ruleMap.get("ruleType")); +// ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); +// NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); +// byteDecorator.nodeDecoratorRule(nodeDecoratorParm); +// } return null; } - - private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { - NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() - .contents(sceneConent) - .dynamicContent(dynamicContent) - .ruletypeId(ruletypeId) - .ruleDictMap(ruleDictMap) - .build(); - return nodeDecoratorParm; - } +// +// private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { +// NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() +// .contents(sceneConent) +// .dynamicContent(dynamicContent) +// .ruletypeId(ruletypeId) +// .ruleDictMap(ruleDictMap) +// .build(); +// return nodeDecoratorParm; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java index 652970c..b204ac3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java @@ -1,56 +1,56 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@AllArgsConstructor -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", - JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Component; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Component("logicalDecorator") +//@AllArgsConstructor +//@Slf4j +//public class LogicalShiftDecorator implements ByteDecorator { +// +//// private final FieldRuleEngineMapper fieldRuleEngineMapper; +//// +//// //字节位移 +//// @Override +//// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +//// String logicalValue = ""; +//// RuleEvaluator fieldRuleEngine = new RuleEvaluator(); +//// try { +//// Map env2 = new HashMap(); +//// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +//// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +//// for (String contentId : contentIdList) { +//// RuleDict ruleDict = ruleDictMap.get(contentId); +//// if (ruleDict.getCode().contains("#")) { +//// //使用动态的值 +//// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +//// } +//// env2.put(ruleDict.getName(), ruleDict.getCode()); +//// } +//// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +//// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +//// return null; +//// } +//// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +//// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +//// return values; +//// } catch (Exception ex) { +//// log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", +//// JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +//// return null; +//// } +//// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java index 346468f..822fead 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@AllArgsConstructor -@Slf4j -public class OperationDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("optionDecorator") +//@AllArgsConstructor +//@Slf4j +//public class OperationDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //混合运算,有常量或者乘除的缩放 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java index 50fb0a7..7a8bccb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@AllArgsConstructor -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +////精度计算 +//@AllArgsConstructor +//@Registry("precisionDecorator") +//@Slf4j +//public class PrecisionDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java index da39235..27f9cc7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java @@ -1,54 +1,53 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@AllArgsConstructor -@Slf4j -public class RuleDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("ruleDecorator") +//@AllArgsConstructor +//@Slf4j +//public class RuleDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //吃我一套正则表达式 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (Exception ex) { +// log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java index 7f5cbf3..c043f97 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java @@ -2,6 +2,6 @@ import java.util.Map; -public interface ComandeEventService { +public interface ComandeEventService{ Map loadComandeEventConfig(String protocolId,String scene); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java index 476ad84..aaf1837 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java @@ -2,46 +2,46 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.dao.CommandEventDao; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @Slf4j @AllArgsConstructor -public class ComandeEventServiceImpl implements ComandeEventService { +public class ComandeEventServiceImpl implements ComandeEventRegistry { - private final CommandEventDao commandEventDao; + // private final CommandEventDao commandEventDao; // 加密bean 固定字段出现变化的字段解析,业务字段的有序内容 @Override - public Map loadComandeEventConfig(String protocolId,String sceneName) { - CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); - if (ObjectUtil.isEmpty(commandEventConfig)) { - log.error("协议{},没有配置成功接收回复配置,清排查原因"); - return null; - } - String replyJson = commandEventConfig.getReplyContentJson(); - List> replyMapList = JSONArray.parseObject(replyJson, List.class); - List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); - Map fixMap = fixList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); - List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) - .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) - .collect(Collectors.toList()); - Map commandConfigMap = new HashMap<>(); - commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); - commandConfigMap.put("fixContent", fixMap); - commandConfigMap.put("bizContent", contentList); - return commandConfigMap; + public Map loadComandeEventConfig(String protocolId, String sceneName) { +// CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); +// if (ObjectUtil.isEmpty(commandEventConfig)) { +// log.error("协议{},没有配置成功接收回复配置,清排查原因"); +// return null; +// } +// String replyJson = commandEventConfig.getReplyContentJson(); +// List> replyMapList = JSONArray.parseObject(replyJson, List.class); +// List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); +// Map fixMap = fixList.stream() +// .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); +// List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) +// .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) +// .collect(Collectors.toList()); +// Map commandConfigMap = new HashMap<>(); +// commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); +// commandConfigMap.put("fixContent", fixMap); +// commandConfigMap.put("bizContent", contentList); +// return commandConfigMap; + return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 128b09d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java deleted file mode 100644 index 4016b0b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface DatagramEventMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java deleted file mode 100644 index 597c306..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.apache.ibatis.annotations.Mapper; - -public interface FieldConfigMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java deleted file mode 100644 index a31680a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.PreRuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface PreRuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java deleted file mode 100644 index 9060a69..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface ProtocolConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java deleted file mode 100644 index 6fa6936..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java deleted file mode 100644 index 582a705..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleDict; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleDictMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java deleted file mode 100644 index 6e302c8..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.CommandEventMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Optional; - -@Component -public class CommandEventDao { - - @Resource - private CommandEventMapper commandEventMapper; - - public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId) - .eq("scene", sceneName) - .eq("enabled", 1); - List commandEventConfig = commandEventMapper.selectList(queryWrapper); - Optional optionalEventConfig = commandEventConfig.stream().findFirst(); - return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java deleted file mode 100644 index 9137e4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.FieldConfigMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class FieldConfigDao { - - @Resource - private FieldConfigMapper fieldConfigMapper; - - public FieldConfig getFieldConfigById(String fieldId) { - FieldConfig fieldConfig = fieldConfigMapper.selectById(fieldId); - return fieldConfig; - } - - public List getFieldConfigs(String protocolId,Integer isFixed) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",isFixed); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - - public List getStorageFieldConfig(String protocolId) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",1) - .eq("is_storage",1); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java deleted file mode 100644 index 67bff6b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.mapper.PreRuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class PreRuleConfigDao { - - @Resource - private PreRuleConfigMapper preRuleConfigMapper; - - public List getPreRuleList(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return preRuleConfigMapper.selectList(queryWrapper); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java deleted file mode 100644 index d69ea85..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.RuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleConfigDao { - - @Resource - private RuleConfigMapper ruleConfigMapper; - - public RuleConfig getNextRuleConfig(String ruleFields) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("parse_rule_json", ruleFields); - return ruleConfigMapper.selectOne(queryWrapper); - } - - - public List getRuleConfigById(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return ruleConfigMapper.selectList(queryWrapper); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java deleted file mode 100644 index 932c185..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.RuleDictMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleDictDao { - - @Resource - private RuleDictMapper ruleDictMapper; - - public List getRuleDictConfig() { - List ruleDictList = ruleDictMapper.selectList(null); - return ruleDictList; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java index 9f9e279..43bc4d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java @@ -10,20 +10,15 @@ import io.netty.channel.socket.nio.NioServerSocketChannel; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import javax.annotation.PreDestroy; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static cn.hutool.core.util.ClassUtil.getClasses; /** * SensorhubServer netty服务端 */ @Slf4j -@Service +@Component public class SensorhubServer { /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java index 2c79ff5..9a28c36 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java @@ -11,13 +11,13 @@ import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioSocketChannel; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClient 客户端 */ @Slf4j -@Service +@Registry public final class SensorhubClient { public static void main(String[] args) throws Exception { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java index 9774be0..477c3f7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java @@ -6,12 +6,12 @@ import io.netty.channel.socket.SocketChannel; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientChannelInitialHandler */ -@Service +@Registry public class SensorhubClientChannelInitialHandler extends ChannelInitializer { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java index 346f4b3..73560e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java @@ -5,13 +5,13 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientHandler */ @Slf4j -@Service +@Registry public class SensorhubClientHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java index 5c1c6f2..d990af5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java @@ -4,12 +4,12 @@ import com.casic.missiles.pojo.Msg; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** * SensorhubServerHandler */ -@Service +@Component public class SensorhubServerHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java index 608af3a..32cc8a4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java @@ -2,48 +2,47 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.delivery.decorator.ByteDecorator; +import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @AllArgsConstructor public class FieldDecoratorManger { - private final RuleDictDao ruleDictDao; + private final RuleConfigRegistry ruleDictDao; // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 // (1)静态的业务字段是字典里面可以配置的 // (2)动态的业务字段是通过规则生成的 public String contentMerge(String ruleJson, String sceneConent, String dynamicContent) { - List ruleDictList = ruleDictDao.getRuleDictConfig(); - Map ruleDictMap = ruleDictList.stream().collect( - Collectors.toMap(RuleDict::getId, e -> e)); - List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); - for (Map ruleMap : ruleMapList) { - String ruleType = String.valueOf(ruleMap.get("ruleType")); - ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); - NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); - byteDecorator.nodeDecoratorRule(nodeDecoratorParm); - } +// List ruleDictList = ruleDictDao.getRuleDictConfig(); +// Map ruleDictMap = ruleDictList.stream().collect( +// Collectors.toMap(RuleDict::getId, e -> e)); +// List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); +// for (Map ruleMap : ruleMapList) { +// String ruleType = String.valueOf(ruleMap.get("ruleType")); +// ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); +// NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); +// byteDecorator.nodeDecoratorRule(nodeDecoratorParm); +// } return null; } - - private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { - NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() - .contents(sceneConent) - .dynamicContent(dynamicContent) - .ruletypeId(ruletypeId) - .ruleDictMap(ruleDictMap) - .build(); - return nodeDecoratorParm; - } +// +// private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { +// NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() +// .contents(sceneConent) +// .dynamicContent(dynamicContent) +// .ruletypeId(ruletypeId) +// .ruleDictMap(ruleDictMap) +// .build(); +// return nodeDecoratorParm; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java index 652970c..b204ac3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java @@ -1,56 +1,56 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@AllArgsConstructor -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", - JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Component; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Component("logicalDecorator") +//@AllArgsConstructor +//@Slf4j +//public class LogicalShiftDecorator implements ByteDecorator { +// +//// private final FieldRuleEngineMapper fieldRuleEngineMapper; +//// +//// //字节位移 +//// @Override +//// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +//// String logicalValue = ""; +//// RuleEvaluator fieldRuleEngine = new RuleEvaluator(); +//// try { +//// Map env2 = new HashMap(); +//// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +//// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +//// for (String contentId : contentIdList) { +//// RuleDict ruleDict = ruleDictMap.get(contentId); +//// if (ruleDict.getCode().contains("#")) { +//// //使用动态的值 +//// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +//// } +//// env2.put(ruleDict.getName(), ruleDict.getCode()); +//// } +//// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +//// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +//// return null; +//// } +//// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +//// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +//// return values; +//// } catch (Exception ex) { +//// log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", +//// JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +//// return null; +//// } +//// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java index 346468f..822fead 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@AllArgsConstructor -@Slf4j -public class OperationDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("optionDecorator") +//@AllArgsConstructor +//@Slf4j +//public class OperationDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //混合运算,有常量或者乘除的缩放 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java index 50fb0a7..7a8bccb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@AllArgsConstructor -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +////精度计算 +//@AllArgsConstructor +//@Registry("precisionDecorator") +//@Slf4j +//public class PrecisionDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java index da39235..27f9cc7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java @@ -1,54 +1,53 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@AllArgsConstructor -@Slf4j -public class RuleDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("ruleDecorator") +//@AllArgsConstructor +//@Slf4j +//public class RuleDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //吃我一套正则表达式 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (Exception ex) { +// log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java index 7f5cbf3..c043f97 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java @@ -2,6 +2,6 @@ import java.util.Map; -public interface ComandeEventService { +public interface ComandeEventService{ Map loadComandeEventConfig(String protocolId,String scene); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java index 476ad84..aaf1837 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java @@ -2,46 +2,46 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.dao.CommandEventDao; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @Slf4j @AllArgsConstructor -public class ComandeEventServiceImpl implements ComandeEventService { +public class ComandeEventServiceImpl implements ComandeEventRegistry { - private final CommandEventDao commandEventDao; + // private final CommandEventDao commandEventDao; // 加密bean 固定字段出现变化的字段解析,业务字段的有序内容 @Override - public Map loadComandeEventConfig(String protocolId,String sceneName) { - CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); - if (ObjectUtil.isEmpty(commandEventConfig)) { - log.error("协议{},没有配置成功接收回复配置,清排查原因"); - return null; - } - String replyJson = commandEventConfig.getReplyContentJson(); - List> replyMapList = JSONArray.parseObject(replyJson, List.class); - List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); - Map fixMap = fixList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); - List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) - .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) - .collect(Collectors.toList()); - Map commandConfigMap = new HashMap<>(); - commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); - commandConfigMap.put("fixContent", fixMap); - commandConfigMap.put("bizContent", contentList); - return commandConfigMap; + public Map loadComandeEventConfig(String protocolId, String sceneName) { +// CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); +// if (ObjectUtil.isEmpty(commandEventConfig)) { +// log.error("协议{},没有配置成功接收回复配置,清排查原因"); +// return null; +// } +// String replyJson = commandEventConfig.getReplyContentJson(); +// List> replyMapList = JSONArray.parseObject(replyJson, List.class); +// List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); +// Map fixMap = fixList.stream() +// .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); +// List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) +// .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) +// .collect(Collectors.toList()); +// Map commandConfigMap = new HashMap<>(); +// commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); +// commandConfigMap.put("fixContent", fixMap); +// commandConfigMap.put("bizContent", contentList); +// return commandConfigMap; + return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 128b09d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java deleted file mode 100644 index 4016b0b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface DatagramEventMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java deleted file mode 100644 index 597c306..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.apache.ibatis.annotations.Mapper; - -public interface FieldConfigMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java deleted file mode 100644 index a31680a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.PreRuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface PreRuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java deleted file mode 100644 index 9060a69..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface ProtocolConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java deleted file mode 100644 index 6fa6936..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java deleted file mode 100644 index 582a705..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleDict; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleDictMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java deleted file mode 100644 index 6e302c8..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.CommandEventMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Optional; - -@Component -public class CommandEventDao { - - @Resource - private CommandEventMapper commandEventMapper; - - public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId) - .eq("scene", sceneName) - .eq("enabled", 1); - List commandEventConfig = commandEventMapper.selectList(queryWrapper); - Optional optionalEventConfig = commandEventConfig.stream().findFirst(); - return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java deleted file mode 100644 index 9137e4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.FieldConfigMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class FieldConfigDao { - - @Resource - private FieldConfigMapper fieldConfigMapper; - - public FieldConfig getFieldConfigById(String fieldId) { - FieldConfig fieldConfig = fieldConfigMapper.selectById(fieldId); - return fieldConfig; - } - - public List getFieldConfigs(String protocolId,Integer isFixed) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",isFixed); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - - public List getStorageFieldConfig(String protocolId) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",1) - .eq("is_storage",1); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java deleted file mode 100644 index 67bff6b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.mapper.PreRuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class PreRuleConfigDao { - - @Resource - private PreRuleConfigMapper preRuleConfigMapper; - - public List getPreRuleList(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return preRuleConfigMapper.selectList(queryWrapper); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java deleted file mode 100644 index d69ea85..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.RuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleConfigDao { - - @Resource - private RuleConfigMapper ruleConfigMapper; - - public RuleConfig getNextRuleConfig(String ruleFields) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("parse_rule_json", ruleFields); - return ruleConfigMapper.selectOne(queryWrapper); - } - - - public List getRuleConfigById(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return ruleConfigMapper.selectList(queryWrapper); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java deleted file mode 100644 index 932c185..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.RuleDictMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleDictDao { - - @Resource - private RuleDictMapper ruleDictMapper; - - public List getRuleDictConfig() { - List ruleDictList = ruleDictMapper.selectList(null); - return ruleDictList; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java index 9f9e279..43bc4d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java @@ -10,20 +10,15 @@ import io.netty.channel.socket.nio.NioServerSocketChannel; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import javax.annotation.PreDestroy; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static cn.hutool.core.util.ClassUtil.getClasses; /** * SensorhubServer netty服务端 */ @Slf4j -@Service +@Component public class SensorhubServer { /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java index 2c79ff5..9a28c36 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java @@ -11,13 +11,13 @@ import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioSocketChannel; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClient 客户端 */ @Slf4j -@Service +@Registry public final class SensorhubClient { public static void main(String[] args) throws Exception { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java index 9774be0..477c3f7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java @@ -6,12 +6,12 @@ import io.netty.channel.socket.SocketChannel; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientChannelInitialHandler */ -@Service +@Registry public class SensorhubClientChannelInitialHandler extends ChannelInitializer { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java index 346f4b3..73560e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java @@ -5,13 +5,13 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientHandler */ @Slf4j -@Service +@Registry public class SensorhubClientHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java index 5c1c6f2..d990af5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java @@ -4,12 +4,12 @@ import com.casic.missiles.pojo.Msg; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** * SensorhubServerHandler */ -@Service +@Component public class SensorhubServerHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 67283ae..af3172c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,41 +1,37 @@ package com.casic.missiles.parser; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultProtocolConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.*; +import com.casic.missiles.registry.FieldConfigRegistry; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; -import java.nio.charset.Charset; import java.util.HashMap; import java.util.List; import java.util.Map; -@Service("genericProtocolParser") +/** + * @author + */ +@Component("genericProtocolParser") @Slf4j -@AllArgsConstructor +@RequiredArgsConstructor public class GenericProtocolParser implements ProtocolParser { - private final LeadingCodeMatcher leadingCodeMatcher; private final List frameStructDispenserList; - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorInstanceSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; // 匹配首字母前导码=> 帧结构匹配前导码=> // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 @@ -44,18 +40,19 @@ public Boolean doParseProtocol(ByteBuf byteBuf) { String protocolContent = ByteBufUtil.hexDump(byteBuf); //匹配前导码 - List preCodeConfigs = leadingCodeMatcher.matchLeadingCode(protocolContent); + List preCodeConfigs = LeadingCodeMatcher.matchFrameLeadingCode(protocolContent); //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 if (preCodeConfigs.size() == 0) { - return rematch(byteBuf,protocolContent); + return rematch(byteBuf, protocolContent); } - //暂时先取第一个 + //暂时先取第一个,提升速度,使用享元模式, 减少类的创建销毁与构建 ProtocolConfig protocolConfig = preCodeConfigs.get(0); + AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); ByteBuf wholeDatagramByte = null; //通过匹配帧结构获取完整的数据包 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, preCodeConfigs.get(0))) != null) { + if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, protocolFactory)) != null) { break; } } @@ -68,76 +65,78 @@ * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 */ - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId, wholeDatagramByte); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap, protocolId); - //选取规则对应的流程实例 - DatagramEventConfig datagramEventConfig = processorInstanceSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); + //进行规则字段解析,进行匹配规则 + RuleConfig ruleConfig = getRuleConfig(protocolFactory, wholeDatagramByte); + if (ruleConfig == null) { + return false; + } //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, wholeDatagramByte); + ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte); + //以下进行业务的规则解析,同时选定流程实例 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); + DatagramEventProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain, + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText, protocolId); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain); //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); + datagramEventProvider.storeData(bizDataMap); return true; } - private Boolean rematch(ByteBuf byteBuf,String protocolContent) { + /** + * 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 + */ + private Boolean rematch(ByteBuf byteBuf, String protocolContent) { //重置位判断 byteBuf.resetReaderIndex(); //判断重置是否前移,如果没有前移,则直接判为匹配失败 if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { return false; } else { + //递归执行 return doParseProtocol(byteBuf); } } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; + //获取匹配规则->匹配规则 + private RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + //取出其中参与逻辑provider并判空 + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); + String rulePrepareFields = protocolConfig.getRulePrepareFields(); + //固定字段 + if (StringUtils.isNotEmpty(rulePrepareFields)) { + //获取统一固定字段解析 + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + //获取该协议的字段配置,用于协议规则匹配 + List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); + //获取规则 + RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, + rulePrepareFields, protocolFieldConfigs); + return ruleConfig; + } + return null; } - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + //数据构建,获取固定字段的store和业务字段store + private Map buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + Map bizDataMap = new HashMap<>(); + Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); + Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); + bizDataMap.putAll(ruleStoreObjectMap); + bizDataMap.putAll(protocolStoreObjectMap); return bizDataMap; } - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java index 608af3a..32cc8a4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java @@ -2,48 +2,47 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.delivery.decorator.ByteDecorator; +import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @AllArgsConstructor public class FieldDecoratorManger { - private final RuleDictDao ruleDictDao; + private final RuleConfigRegistry ruleDictDao; // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 // (1)静态的业务字段是字典里面可以配置的 // (2)动态的业务字段是通过规则生成的 public String contentMerge(String ruleJson, String sceneConent, String dynamicContent) { - List ruleDictList = ruleDictDao.getRuleDictConfig(); - Map ruleDictMap = ruleDictList.stream().collect( - Collectors.toMap(RuleDict::getId, e -> e)); - List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); - for (Map ruleMap : ruleMapList) { - String ruleType = String.valueOf(ruleMap.get("ruleType")); - ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); - NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); - byteDecorator.nodeDecoratorRule(nodeDecoratorParm); - } +// List ruleDictList = ruleDictDao.getRuleDictConfig(); +// Map ruleDictMap = ruleDictList.stream().collect( +// Collectors.toMap(RuleDict::getId, e -> e)); +// List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); +// for (Map ruleMap : ruleMapList) { +// String ruleType = String.valueOf(ruleMap.get("ruleType")); +// ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); +// NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); +// byteDecorator.nodeDecoratorRule(nodeDecoratorParm); +// } return null; } - - private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { - NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() - .contents(sceneConent) - .dynamicContent(dynamicContent) - .ruletypeId(ruletypeId) - .ruleDictMap(ruleDictMap) - .build(); - return nodeDecoratorParm; - } +// +// private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { +// NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() +// .contents(sceneConent) +// .dynamicContent(dynamicContent) +// .ruletypeId(ruletypeId) +// .ruleDictMap(ruleDictMap) +// .build(); +// return nodeDecoratorParm; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java index 652970c..b204ac3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java @@ -1,56 +1,56 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@AllArgsConstructor -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", - JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Component; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Component("logicalDecorator") +//@AllArgsConstructor +//@Slf4j +//public class LogicalShiftDecorator implements ByteDecorator { +// +//// private final FieldRuleEngineMapper fieldRuleEngineMapper; +//// +//// //字节位移 +//// @Override +//// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +//// String logicalValue = ""; +//// RuleEvaluator fieldRuleEngine = new RuleEvaluator(); +//// try { +//// Map env2 = new HashMap(); +//// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +//// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +//// for (String contentId : contentIdList) { +//// RuleDict ruleDict = ruleDictMap.get(contentId); +//// if (ruleDict.getCode().contains("#")) { +//// //使用动态的值 +//// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +//// } +//// env2.put(ruleDict.getName(), ruleDict.getCode()); +//// } +//// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +//// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +//// return null; +//// } +//// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +//// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +//// return values; +//// } catch (Exception ex) { +//// log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", +//// JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +//// return null; +//// } +//// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java index 346468f..822fead 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@AllArgsConstructor -@Slf4j -public class OperationDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("optionDecorator") +//@AllArgsConstructor +//@Slf4j +//public class OperationDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //混合运算,有常量或者乘除的缩放 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java index 50fb0a7..7a8bccb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@AllArgsConstructor -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +////精度计算 +//@AllArgsConstructor +//@Registry("precisionDecorator") +//@Slf4j +//public class PrecisionDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java index da39235..27f9cc7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java @@ -1,54 +1,53 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@AllArgsConstructor -@Slf4j -public class RuleDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("ruleDecorator") +//@AllArgsConstructor +//@Slf4j +//public class RuleDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //吃我一套正则表达式 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (Exception ex) { +// log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java index 7f5cbf3..c043f97 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java @@ -2,6 +2,6 @@ import java.util.Map; -public interface ComandeEventService { +public interface ComandeEventService{ Map loadComandeEventConfig(String protocolId,String scene); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java index 476ad84..aaf1837 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java @@ -2,46 +2,46 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.dao.CommandEventDao; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @Slf4j @AllArgsConstructor -public class ComandeEventServiceImpl implements ComandeEventService { +public class ComandeEventServiceImpl implements ComandeEventRegistry { - private final CommandEventDao commandEventDao; + // private final CommandEventDao commandEventDao; // 加密bean 固定字段出现变化的字段解析,业务字段的有序内容 @Override - public Map loadComandeEventConfig(String protocolId,String sceneName) { - CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); - if (ObjectUtil.isEmpty(commandEventConfig)) { - log.error("协议{},没有配置成功接收回复配置,清排查原因"); - return null; - } - String replyJson = commandEventConfig.getReplyContentJson(); - List> replyMapList = JSONArray.parseObject(replyJson, List.class); - List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); - Map fixMap = fixList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); - List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) - .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) - .collect(Collectors.toList()); - Map commandConfigMap = new HashMap<>(); - commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); - commandConfigMap.put("fixContent", fixMap); - commandConfigMap.put("bizContent", contentList); - return commandConfigMap; + public Map loadComandeEventConfig(String protocolId, String sceneName) { +// CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); +// if (ObjectUtil.isEmpty(commandEventConfig)) { +// log.error("协议{},没有配置成功接收回复配置,清排查原因"); +// return null; +// } +// String replyJson = commandEventConfig.getReplyContentJson(); +// List> replyMapList = JSONArray.parseObject(replyJson, List.class); +// List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); +// Map fixMap = fixList.stream() +// .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); +// List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) +// .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) +// .collect(Collectors.toList()); +// Map commandConfigMap = new HashMap<>(); +// commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); +// commandConfigMap.put("fixContent", fixMap); +// commandConfigMap.put("bizContent", contentList); +// return commandConfigMap; + return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 128b09d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java deleted file mode 100644 index 4016b0b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface DatagramEventMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java deleted file mode 100644 index 597c306..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.apache.ibatis.annotations.Mapper; - -public interface FieldConfigMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java deleted file mode 100644 index a31680a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.PreRuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface PreRuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java deleted file mode 100644 index 9060a69..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface ProtocolConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java deleted file mode 100644 index 6fa6936..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java deleted file mode 100644 index 582a705..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleDict; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleDictMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java deleted file mode 100644 index 6e302c8..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.CommandEventMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Optional; - -@Component -public class CommandEventDao { - - @Resource - private CommandEventMapper commandEventMapper; - - public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId) - .eq("scene", sceneName) - .eq("enabled", 1); - List commandEventConfig = commandEventMapper.selectList(queryWrapper); - Optional optionalEventConfig = commandEventConfig.stream().findFirst(); - return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java deleted file mode 100644 index 9137e4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.FieldConfigMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class FieldConfigDao { - - @Resource - private FieldConfigMapper fieldConfigMapper; - - public FieldConfig getFieldConfigById(String fieldId) { - FieldConfig fieldConfig = fieldConfigMapper.selectById(fieldId); - return fieldConfig; - } - - public List getFieldConfigs(String protocolId,Integer isFixed) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",isFixed); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - - public List getStorageFieldConfig(String protocolId) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",1) - .eq("is_storage",1); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java deleted file mode 100644 index 67bff6b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.mapper.PreRuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class PreRuleConfigDao { - - @Resource - private PreRuleConfigMapper preRuleConfigMapper; - - public List getPreRuleList(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return preRuleConfigMapper.selectList(queryWrapper); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java deleted file mode 100644 index d69ea85..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.RuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleConfigDao { - - @Resource - private RuleConfigMapper ruleConfigMapper; - - public RuleConfig getNextRuleConfig(String ruleFields) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("parse_rule_json", ruleFields); - return ruleConfigMapper.selectOne(queryWrapper); - } - - - public List getRuleConfigById(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return ruleConfigMapper.selectList(queryWrapper); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java deleted file mode 100644 index 932c185..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.RuleDictMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleDictDao { - - @Resource - private RuleDictMapper ruleDictMapper; - - public List getRuleDictConfig() { - List ruleDictList = ruleDictMapper.selectList(null); - return ruleDictList; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java index 9f9e279..43bc4d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java @@ -10,20 +10,15 @@ import io.netty.channel.socket.nio.NioServerSocketChannel; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import javax.annotation.PreDestroy; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static cn.hutool.core.util.ClassUtil.getClasses; /** * SensorhubServer netty服务端 */ @Slf4j -@Service +@Component public class SensorhubServer { /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java index 2c79ff5..9a28c36 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java @@ -11,13 +11,13 @@ import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioSocketChannel; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClient 客户端 */ @Slf4j -@Service +@Registry public final class SensorhubClient { public static void main(String[] args) throws Exception { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java index 9774be0..477c3f7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java @@ -6,12 +6,12 @@ import io.netty.channel.socket.SocketChannel; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientChannelInitialHandler */ -@Service +@Registry public class SensorhubClientChannelInitialHandler extends ChannelInitializer { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java index 346f4b3..73560e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java @@ -5,13 +5,13 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientHandler */ @Slf4j -@Service +@Registry public class SensorhubClientHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java index 5c1c6f2..d990af5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java @@ -4,12 +4,12 @@ import com.casic.missiles.pojo.Msg; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** * SensorhubServerHandler */ -@Service +@Component public class SensorhubServerHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 67283ae..af3172c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,41 +1,37 @@ package com.casic.missiles.parser; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultProtocolConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.*; +import com.casic.missiles.registry.FieldConfigRegistry; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; -import java.nio.charset.Charset; import java.util.HashMap; import java.util.List; import java.util.Map; -@Service("genericProtocolParser") +/** + * @author + */ +@Component("genericProtocolParser") @Slf4j -@AllArgsConstructor +@RequiredArgsConstructor public class GenericProtocolParser implements ProtocolParser { - private final LeadingCodeMatcher leadingCodeMatcher; private final List frameStructDispenserList; - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorInstanceSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; // 匹配首字母前导码=> 帧结构匹配前导码=> // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 @@ -44,18 +40,19 @@ public Boolean doParseProtocol(ByteBuf byteBuf) { String protocolContent = ByteBufUtil.hexDump(byteBuf); //匹配前导码 - List preCodeConfigs = leadingCodeMatcher.matchLeadingCode(protocolContent); + List preCodeConfigs = LeadingCodeMatcher.matchFrameLeadingCode(protocolContent); //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 if (preCodeConfigs.size() == 0) { - return rematch(byteBuf,protocolContent); + return rematch(byteBuf, protocolContent); } - //暂时先取第一个 + //暂时先取第一个,提升速度,使用享元模式, 减少类的创建销毁与构建 ProtocolConfig protocolConfig = preCodeConfigs.get(0); + AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); ByteBuf wholeDatagramByte = null; //通过匹配帧结构获取完整的数据包 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, preCodeConfigs.get(0))) != null) { + if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, protocolFactory)) != null) { break; } } @@ -68,76 +65,78 @@ * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 */ - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId, wholeDatagramByte); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap, protocolId); - //选取规则对应的流程实例 - DatagramEventConfig datagramEventConfig = processorInstanceSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); + //进行规则字段解析,进行匹配规则 + RuleConfig ruleConfig = getRuleConfig(protocolFactory, wholeDatagramByte); + if (ruleConfig == null) { + return false; + } //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, wholeDatagramByte); + ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte); + //以下进行业务的规则解析,同时选定流程实例 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); + DatagramEventProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain, + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText, protocolId); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain); //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); + datagramEventProvider.storeData(bizDataMap); return true; } - private Boolean rematch(ByteBuf byteBuf,String protocolContent) { + /** + * 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 + */ + private Boolean rematch(ByteBuf byteBuf, String protocolContent) { //重置位判断 byteBuf.resetReaderIndex(); //判断重置是否前移,如果没有前移,则直接判为匹配失败 if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { return false; } else { + //递归执行 return doParseProtocol(byteBuf); } } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; + //获取匹配规则->匹配规则 + private RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + //取出其中参与逻辑provider并判空 + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); + String rulePrepareFields = protocolConfig.getRulePrepareFields(); + //固定字段 + if (StringUtils.isNotEmpty(rulePrepareFields)) { + //获取统一固定字段解析 + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + //获取该协议的字段配置,用于协议规则匹配 + List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); + //获取规则 + RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, + rulePrepareFields, protocolFieldConfigs); + return ruleConfig; + } + return null; } - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + //数据构建,获取固定字段的store和业务字段store + private Map buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + Map bizDataMap = new HashMap<>(); + Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); + Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); + bizDataMap.putAll(ruleStoreObjectMap); + bizDataMap.putAll(protocolStoreObjectMap); return bizDataMap; } - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java index 8a46e32..16ce2e5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java @@ -3,6 +3,7 @@ import io.netty.buffer.ByteBuf; public interface ProtocolParser { + Boolean doParseProtocol(ByteBuf byteBuf); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java index 608af3a..32cc8a4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java @@ -2,48 +2,47 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.delivery.decorator.ByteDecorator; +import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @AllArgsConstructor public class FieldDecoratorManger { - private final RuleDictDao ruleDictDao; + private final RuleConfigRegistry ruleDictDao; // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 // (1)静态的业务字段是字典里面可以配置的 // (2)动态的业务字段是通过规则生成的 public String contentMerge(String ruleJson, String sceneConent, String dynamicContent) { - List ruleDictList = ruleDictDao.getRuleDictConfig(); - Map ruleDictMap = ruleDictList.stream().collect( - Collectors.toMap(RuleDict::getId, e -> e)); - List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); - for (Map ruleMap : ruleMapList) { - String ruleType = String.valueOf(ruleMap.get("ruleType")); - ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); - NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); - byteDecorator.nodeDecoratorRule(nodeDecoratorParm); - } +// List ruleDictList = ruleDictDao.getRuleDictConfig(); +// Map ruleDictMap = ruleDictList.stream().collect( +// Collectors.toMap(RuleDict::getId, e -> e)); +// List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); +// for (Map ruleMap : ruleMapList) { +// String ruleType = String.valueOf(ruleMap.get("ruleType")); +// ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); +// NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); +// byteDecorator.nodeDecoratorRule(nodeDecoratorParm); +// } return null; } - - private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { - NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() - .contents(sceneConent) - .dynamicContent(dynamicContent) - .ruletypeId(ruletypeId) - .ruleDictMap(ruleDictMap) - .build(); - return nodeDecoratorParm; - } +// +// private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { +// NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() +// .contents(sceneConent) +// .dynamicContent(dynamicContent) +// .ruletypeId(ruletypeId) +// .ruleDictMap(ruleDictMap) +// .build(); +// return nodeDecoratorParm; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java index 652970c..b204ac3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java @@ -1,56 +1,56 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@AllArgsConstructor -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", - JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Component; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Component("logicalDecorator") +//@AllArgsConstructor +//@Slf4j +//public class LogicalShiftDecorator implements ByteDecorator { +// +//// private final FieldRuleEngineMapper fieldRuleEngineMapper; +//// +//// //字节位移 +//// @Override +//// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +//// String logicalValue = ""; +//// RuleEvaluator fieldRuleEngine = new RuleEvaluator(); +//// try { +//// Map env2 = new HashMap(); +//// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +//// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +//// for (String contentId : contentIdList) { +//// RuleDict ruleDict = ruleDictMap.get(contentId); +//// if (ruleDict.getCode().contains("#")) { +//// //使用动态的值 +//// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +//// } +//// env2.put(ruleDict.getName(), ruleDict.getCode()); +//// } +//// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +//// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +//// return null; +//// } +//// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +//// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +//// return values; +//// } catch (Exception ex) { +//// log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", +//// JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +//// return null; +//// } +//// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java index 346468f..822fead 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@AllArgsConstructor -@Slf4j -public class OperationDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("optionDecorator") +//@AllArgsConstructor +//@Slf4j +//public class OperationDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //混合运算,有常量或者乘除的缩放 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java index 50fb0a7..7a8bccb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@AllArgsConstructor -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +////精度计算 +//@AllArgsConstructor +//@Registry("precisionDecorator") +//@Slf4j +//public class PrecisionDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java index da39235..27f9cc7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java @@ -1,54 +1,53 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@AllArgsConstructor -@Slf4j -public class RuleDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("ruleDecorator") +//@AllArgsConstructor +//@Slf4j +//public class RuleDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //吃我一套正则表达式 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (Exception ex) { +// log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java index 7f5cbf3..c043f97 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java @@ -2,6 +2,6 @@ import java.util.Map; -public interface ComandeEventService { +public interface ComandeEventService{ Map loadComandeEventConfig(String protocolId,String scene); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java index 476ad84..aaf1837 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java @@ -2,46 +2,46 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.dao.CommandEventDao; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @Slf4j @AllArgsConstructor -public class ComandeEventServiceImpl implements ComandeEventService { +public class ComandeEventServiceImpl implements ComandeEventRegistry { - private final CommandEventDao commandEventDao; + // private final CommandEventDao commandEventDao; // 加密bean 固定字段出现变化的字段解析,业务字段的有序内容 @Override - public Map loadComandeEventConfig(String protocolId,String sceneName) { - CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); - if (ObjectUtil.isEmpty(commandEventConfig)) { - log.error("协议{},没有配置成功接收回复配置,清排查原因"); - return null; - } - String replyJson = commandEventConfig.getReplyContentJson(); - List> replyMapList = JSONArray.parseObject(replyJson, List.class); - List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); - Map fixMap = fixList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); - List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) - .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) - .collect(Collectors.toList()); - Map commandConfigMap = new HashMap<>(); - commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); - commandConfigMap.put("fixContent", fixMap); - commandConfigMap.put("bizContent", contentList); - return commandConfigMap; + public Map loadComandeEventConfig(String protocolId, String sceneName) { +// CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); +// if (ObjectUtil.isEmpty(commandEventConfig)) { +// log.error("协议{},没有配置成功接收回复配置,清排查原因"); +// return null; +// } +// String replyJson = commandEventConfig.getReplyContentJson(); +// List> replyMapList = JSONArray.parseObject(replyJson, List.class); +// List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); +// Map fixMap = fixList.stream() +// .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); +// List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) +// .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) +// .collect(Collectors.toList()); +// Map commandConfigMap = new HashMap<>(); +// commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); +// commandConfigMap.put("fixContent", fixMap); +// commandConfigMap.put("bizContent", contentList); +// return commandConfigMap; + return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 128b09d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java deleted file mode 100644 index 4016b0b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface DatagramEventMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java deleted file mode 100644 index 597c306..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.apache.ibatis.annotations.Mapper; - -public interface FieldConfigMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java deleted file mode 100644 index a31680a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.PreRuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface PreRuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java deleted file mode 100644 index 9060a69..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface ProtocolConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java deleted file mode 100644 index 6fa6936..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java deleted file mode 100644 index 582a705..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleDict; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleDictMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java deleted file mode 100644 index 6e302c8..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.CommandEventMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Optional; - -@Component -public class CommandEventDao { - - @Resource - private CommandEventMapper commandEventMapper; - - public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId) - .eq("scene", sceneName) - .eq("enabled", 1); - List commandEventConfig = commandEventMapper.selectList(queryWrapper); - Optional optionalEventConfig = commandEventConfig.stream().findFirst(); - return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java deleted file mode 100644 index 9137e4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.FieldConfigMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class FieldConfigDao { - - @Resource - private FieldConfigMapper fieldConfigMapper; - - public FieldConfig getFieldConfigById(String fieldId) { - FieldConfig fieldConfig = fieldConfigMapper.selectById(fieldId); - return fieldConfig; - } - - public List getFieldConfigs(String protocolId,Integer isFixed) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",isFixed); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - - public List getStorageFieldConfig(String protocolId) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",1) - .eq("is_storage",1); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java deleted file mode 100644 index 67bff6b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.mapper.PreRuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class PreRuleConfigDao { - - @Resource - private PreRuleConfigMapper preRuleConfigMapper; - - public List getPreRuleList(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return preRuleConfigMapper.selectList(queryWrapper); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java deleted file mode 100644 index d69ea85..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.RuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleConfigDao { - - @Resource - private RuleConfigMapper ruleConfigMapper; - - public RuleConfig getNextRuleConfig(String ruleFields) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("parse_rule_json", ruleFields); - return ruleConfigMapper.selectOne(queryWrapper); - } - - - public List getRuleConfigById(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return ruleConfigMapper.selectList(queryWrapper); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java deleted file mode 100644 index 932c185..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.RuleDictMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleDictDao { - - @Resource - private RuleDictMapper ruleDictMapper; - - public List getRuleDictConfig() { - List ruleDictList = ruleDictMapper.selectList(null); - return ruleDictList; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java index 9f9e279..43bc4d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java @@ -10,20 +10,15 @@ import io.netty.channel.socket.nio.NioServerSocketChannel; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import javax.annotation.PreDestroy; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static cn.hutool.core.util.ClassUtil.getClasses; /** * SensorhubServer netty服务端 */ @Slf4j -@Service +@Component public class SensorhubServer { /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java index 2c79ff5..9a28c36 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java @@ -11,13 +11,13 @@ import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioSocketChannel; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClient 客户端 */ @Slf4j -@Service +@Registry public final class SensorhubClient { public static void main(String[] args) throws Exception { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java index 9774be0..477c3f7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java @@ -6,12 +6,12 @@ import io.netty.channel.socket.SocketChannel; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientChannelInitialHandler */ -@Service +@Registry public class SensorhubClientChannelInitialHandler extends ChannelInitializer { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java index 346f4b3..73560e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java @@ -5,13 +5,13 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientHandler */ @Slf4j -@Service +@Registry public class SensorhubClientHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java index 5c1c6f2..d990af5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java @@ -4,12 +4,12 @@ import com.casic.missiles.pojo.Msg; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** * SensorhubServerHandler */ -@Service +@Component public class SensorhubServerHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 67283ae..af3172c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,41 +1,37 @@ package com.casic.missiles.parser; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultProtocolConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.*; +import com.casic.missiles.registry.FieldConfigRegistry; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; -import java.nio.charset.Charset; import java.util.HashMap; import java.util.List; import java.util.Map; -@Service("genericProtocolParser") +/** + * @author + */ +@Component("genericProtocolParser") @Slf4j -@AllArgsConstructor +@RequiredArgsConstructor public class GenericProtocolParser implements ProtocolParser { - private final LeadingCodeMatcher leadingCodeMatcher; private final List frameStructDispenserList; - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorInstanceSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; // 匹配首字母前导码=> 帧结构匹配前导码=> // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 @@ -44,18 +40,19 @@ public Boolean doParseProtocol(ByteBuf byteBuf) { String protocolContent = ByteBufUtil.hexDump(byteBuf); //匹配前导码 - List preCodeConfigs = leadingCodeMatcher.matchLeadingCode(protocolContent); + List preCodeConfigs = LeadingCodeMatcher.matchFrameLeadingCode(protocolContent); //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 if (preCodeConfigs.size() == 0) { - return rematch(byteBuf,protocolContent); + return rematch(byteBuf, protocolContent); } - //暂时先取第一个 + //暂时先取第一个,提升速度,使用享元模式, 减少类的创建销毁与构建 ProtocolConfig protocolConfig = preCodeConfigs.get(0); + AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); ByteBuf wholeDatagramByte = null; //通过匹配帧结构获取完整的数据包 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, preCodeConfigs.get(0))) != null) { + if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, protocolFactory)) != null) { break; } } @@ -68,76 +65,78 @@ * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 */ - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId, wholeDatagramByte); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap, protocolId); - //选取规则对应的流程实例 - DatagramEventConfig datagramEventConfig = processorInstanceSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); + //进行规则字段解析,进行匹配规则 + RuleConfig ruleConfig = getRuleConfig(protocolFactory, wholeDatagramByte); + if (ruleConfig == null) { + return false; + } //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, wholeDatagramByte); + ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte); + //以下进行业务的规则解析,同时选定流程实例 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); + DatagramEventProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain, + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText, protocolId); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain); //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); + datagramEventProvider.storeData(bizDataMap); return true; } - private Boolean rematch(ByteBuf byteBuf,String protocolContent) { + /** + * 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 + */ + private Boolean rematch(ByteBuf byteBuf, String protocolContent) { //重置位判断 byteBuf.resetReaderIndex(); //判断重置是否前移,如果没有前移,则直接判为匹配失败 if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { return false; } else { + //递归执行 return doParseProtocol(byteBuf); } } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; + //获取匹配规则->匹配规则 + private RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + //取出其中参与逻辑provider并判空 + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); + String rulePrepareFields = protocolConfig.getRulePrepareFields(); + //固定字段 + if (StringUtils.isNotEmpty(rulePrepareFields)) { + //获取统一固定字段解析 + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + //获取该协议的字段配置,用于协议规则匹配 + List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); + //获取规则 + RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, + rulePrepareFields, protocolFieldConfigs); + return ruleConfig; + } + return null; } - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + //数据构建,获取固定字段的store和业务字段store + private Map buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + Map bizDataMap = new HashMap<>(); + Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); + Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); + bizDataMap.putAll(ruleStoreObjectMap); + bizDataMap.putAll(protocolStoreObjectMap); return bizDataMap; } - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java index 8a46e32..16ce2e5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java @@ -3,6 +3,7 @@ import io.netty.buffer.ByteBuf; public interface ProtocolParser { + Boolean doParseProtocol(ByteBuf byteBuf); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java new file mode 100644 index 0000000..f7814af --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java @@ -0,0 +1,35 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.ProtocolConfigProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.ProtocolConfig; + +/** + * 存放基本协议的的加载信息 + */ +public class AbstractProtocolConfigFactory { + private final ProtocolConfigProvider protocolConfigProvider; + private final ProtocolFieldConfigProvider protocolFieldConfigProvider; + private final RuleConfigProvider ruleConfigProvider; + + public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { + this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); + this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); + this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); + } + + public ProtocolConfigProvider getProtocolConfigProvider() { + return protocolConfigProvider; + } + + public ProtocolFieldConfigProvider getProtocolFieldConfigProvider() { + return protocolFieldConfigProvider; + } + + public RuleConfigProvider getRuleConfigProvider() { + return ruleConfigProvider; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java index 608af3a..32cc8a4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java @@ -2,48 +2,47 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.delivery.decorator.ByteDecorator; +import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @AllArgsConstructor public class FieldDecoratorManger { - private final RuleDictDao ruleDictDao; + private final RuleConfigRegistry ruleDictDao; // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 // (1)静态的业务字段是字典里面可以配置的 // (2)动态的业务字段是通过规则生成的 public String contentMerge(String ruleJson, String sceneConent, String dynamicContent) { - List ruleDictList = ruleDictDao.getRuleDictConfig(); - Map ruleDictMap = ruleDictList.stream().collect( - Collectors.toMap(RuleDict::getId, e -> e)); - List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); - for (Map ruleMap : ruleMapList) { - String ruleType = String.valueOf(ruleMap.get("ruleType")); - ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); - NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); - byteDecorator.nodeDecoratorRule(nodeDecoratorParm); - } +// List ruleDictList = ruleDictDao.getRuleDictConfig(); +// Map ruleDictMap = ruleDictList.stream().collect( +// Collectors.toMap(RuleDict::getId, e -> e)); +// List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); +// for (Map ruleMap : ruleMapList) { +// String ruleType = String.valueOf(ruleMap.get("ruleType")); +// ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); +// NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); +// byteDecorator.nodeDecoratorRule(nodeDecoratorParm); +// } return null; } - - private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { - NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() - .contents(sceneConent) - .dynamicContent(dynamicContent) - .ruletypeId(ruletypeId) - .ruleDictMap(ruleDictMap) - .build(); - return nodeDecoratorParm; - } +// +// private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { +// NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() +// .contents(sceneConent) +// .dynamicContent(dynamicContent) +// .ruletypeId(ruletypeId) +// .ruleDictMap(ruleDictMap) +// .build(); +// return nodeDecoratorParm; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java index 652970c..b204ac3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java @@ -1,56 +1,56 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@AllArgsConstructor -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", - JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Component; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Component("logicalDecorator") +//@AllArgsConstructor +//@Slf4j +//public class LogicalShiftDecorator implements ByteDecorator { +// +//// private final FieldRuleEngineMapper fieldRuleEngineMapper; +//// +//// //字节位移 +//// @Override +//// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +//// String logicalValue = ""; +//// RuleEvaluator fieldRuleEngine = new RuleEvaluator(); +//// try { +//// Map env2 = new HashMap(); +//// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +//// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +//// for (String contentId : contentIdList) { +//// RuleDict ruleDict = ruleDictMap.get(contentId); +//// if (ruleDict.getCode().contains("#")) { +//// //使用动态的值 +//// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +//// } +//// env2.put(ruleDict.getName(), ruleDict.getCode()); +//// } +//// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +//// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +//// return null; +//// } +//// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +//// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +//// return values; +//// } catch (Exception ex) { +//// log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", +//// JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +//// return null; +//// } +//// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java index 346468f..822fead 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@AllArgsConstructor -@Slf4j -public class OperationDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("optionDecorator") +//@AllArgsConstructor +//@Slf4j +//public class OperationDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //混合运算,有常量或者乘除的缩放 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java index 50fb0a7..7a8bccb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@AllArgsConstructor -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +////精度计算 +//@AllArgsConstructor +//@Registry("precisionDecorator") +//@Slf4j +//public class PrecisionDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java index da39235..27f9cc7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java @@ -1,54 +1,53 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@AllArgsConstructor -@Slf4j -public class RuleDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("ruleDecorator") +//@AllArgsConstructor +//@Slf4j +//public class RuleDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //吃我一套正则表达式 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (Exception ex) { +// log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java index 7f5cbf3..c043f97 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java @@ -2,6 +2,6 @@ import java.util.Map; -public interface ComandeEventService { +public interface ComandeEventService{ Map loadComandeEventConfig(String protocolId,String scene); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java index 476ad84..aaf1837 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java @@ -2,46 +2,46 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.dao.CommandEventDao; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @Slf4j @AllArgsConstructor -public class ComandeEventServiceImpl implements ComandeEventService { +public class ComandeEventServiceImpl implements ComandeEventRegistry { - private final CommandEventDao commandEventDao; + // private final CommandEventDao commandEventDao; // 加密bean 固定字段出现变化的字段解析,业务字段的有序内容 @Override - public Map loadComandeEventConfig(String protocolId,String sceneName) { - CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); - if (ObjectUtil.isEmpty(commandEventConfig)) { - log.error("协议{},没有配置成功接收回复配置,清排查原因"); - return null; - } - String replyJson = commandEventConfig.getReplyContentJson(); - List> replyMapList = JSONArray.parseObject(replyJson, List.class); - List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); - Map fixMap = fixList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); - List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) - .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) - .collect(Collectors.toList()); - Map commandConfigMap = new HashMap<>(); - commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); - commandConfigMap.put("fixContent", fixMap); - commandConfigMap.put("bizContent", contentList); - return commandConfigMap; + public Map loadComandeEventConfig(String protocolId, String sceneName) { +// CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); +// if (ObjectUtil.isEmpty(commandEventConfig)) { +// log.error("协议{},没有配置成功接收回复配置,清排查原因"); +// return null; +// } +// String replyJson = commandEventConfig.getReplyContentJson(); +// List> replyMapList = JSONArray.parseObject(replyJson, List.class); +// List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); +// Map fixMap = fixList.stream() +// .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); +// List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) +// .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) +// .collect(Collectors.toList()); +// Map commandConfigMap = new HashMap<>(); +// commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); +// commandConfigMap.put("fixContent", fixMap); +// commandConfigMap.put("bizContent", contentList); +// return commandConfigMap; + return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 128b09d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java deleted file mode 100644 index 4016b0b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface DatagramEventMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java deleted file mode 100644 index 597c306..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.apache.ibatis.annotations.Mapper; - -public interface FieldConfigMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java deleted file mode 100644 index a31680a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.PreRuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface PreRuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java deleted file mode 100644 index 9060a69..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface ProtocolConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java deleted file mode 100644 index 6fa6936..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java deleted file mode 100644 index 582a705..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleDict; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleDictMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java deleted file mode 100644 index 6e302c8..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.CommandEventMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Optional; - -@Component -public class CommandEventDao { - - @Resource - private CommandEventMapper commandEventMapper; - - public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId) - .eq("scene", sceneName) - .eq("enabled", 1); - List commandEventConfig = commandEventMapper.selectList(queryWrapper); - Optional optionalEventConfig = commandEventConfig.stream().findFirst(); - return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java deleted file mode 100644 index 9137e4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.FieldConfigMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class FieldConfigDao { - - @Resource - private FieldConfigMapper fieldConfigMapper; - - public FieldConfig getFieldConfigById(String fieldId) { - FieldConfig fieldConfig = fieldConfigMapper.selectById(fieldId); - return fieldConfig; - } - - public List getFieldConfigs(String protocolId,Integer isFixed) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",isFixed); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - - public List getStorageFieldConfig(String protocolId) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",1) - .eq("is_storage",1); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java deleted file mode 100644 index 67bff6b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.mapper.PreRuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class PreRuleConfigDao { - - @Resource - private PreRuleConfigMapper preRuleConfigMapper; - - public List getPreRuleList(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return preRuleConfigMapper.selectList(queryWrapper); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java deleted file mode 100644 index d69ea85..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.RuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleConfigDao { - - @Resource - private RuleConfigMapper ruleConfigMapper; - - public RuleConfig getNextRuleConfig(String ruleFields) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("parse_rule_json", ruleFields); - return ruleConfigMapper.selectOne(queryWrapper); - } - - - public List getRuleConfigById(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return ruleConfigMapper.selectList(queryWrapper); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java deleted file mode 100644 index 932c185..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.RuleDictMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleDictDao { - - @Resource - private RuleDictMapper ruleDictMapper; - - public List getRuleDictConfig() { - List ruleDictList = ruleDictMapper.selectList(null); - return ruleDictList; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java index 9f9e279..43bc4d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java @@ -10,20 +10,15 @@ import io.netty.channel.socket.nio.NioServerSocketChannel; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import javax.annotation.PreDestroy; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static cn.hutool.core.util.ClassUtil.getClasses; /** * SensorhubServer netty服务端 */ @Slf4j -@Service +@Component public class SensorhubServer { /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java index 2c79ff5..9a28c36 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java @@ -11,13 +11,13 @@ import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioSocketChannel; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClient 客户端 */ @Slf4j -@Service +@Registry public final class SensorhubClient { public static void main(String[] args) throws Exception { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java index 9774be0..477c3f7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java @@ -6,12 +6,12 @@ import io.netty.channel.socket.SocketChannel; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientChannelInitialHandler */ -@Service +@Registry public class SensorhubClientChannelInitialHandler extends ChannelInitializer { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java index 346f4b3..73560e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java @@ -5,13 +5,13 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientHandler */ @Slf4j -@Service +@Registry public class SensorhubClientHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java index 5c1c6f2..d990af5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java @@ -4,12 +4,12 @@ import com.casic.missiles.pojo.Msg; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** * SensorhubServerHandler */ -@Service +@Component public class SensorhubServerHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 67283ae..af3172c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,41 +1,37 @@ package com.casic.missiles.parser; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultProtocolConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.*; +import com.casic.missiles.registry.FieldConfigRegistry; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; -import java.nio.charset.Charset; import java.util.HashMap; import java.util.List; import java.util.Map; -@Service("genericProtocolParser") +/** + * @author + */ +@Component("genericProtocolParser") @Slf4j -@AllArgsConstructor +@RequiredArgsConstructor public class GenericProtocolParser implements ProtocolParser { - private final LeadingCodeMatcher leadingCodeMatcher; private final List frameStructDispenserList; - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorInstanceSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; // 匹配首字母前导码=> 帧结构匹配前导码=> // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 @@ -44,18 +40,19 @@ public Boolean doParseProtocol(ByteBuf byteBuf) { String protocolContent = ByteBufUtil.hexDump(byteBuf); //匹配前导码 - List preCodeConfigs = leadingCodeMatcher.matchLeadingCode(protocolContent); + List preCodeConfigs = LeadingCodeMatcher.matchFrameLeadingCode(protocolContent); //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 if (preCodeConfigs.size() == 0) { - return rematch(byteBuf,protocolContent); + return rematch(byteBuf, protocolContent); } - //暂时先取第一个 + //暂时先取第一个,提升速度,使用享元模式, 减少类的创建销毁与构建 ProtocolConfig protocolConfig = preCodeConfigs.get(0); + AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); ByteBuf wholeDatagramByte = null; //通过匹配帧结构获取完整的数据包 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, preCodeConfigs.get(0))) != null) { + if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, protocolFactory)) != null) { break; } } @@ -68,76 +65,78 @@ * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 */ - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId, wholeDatagramByte); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap, protocolId); - //选取规则对应的流程实例 - DatagramEventConfig datagramEventConfig = processorInstanceSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); + //进行规则字段解析,进行匹配规则 + RuleConfig ruleConfig = getRuleConfig(protocolFactory, wholeDatagramByte); + if (ruleConfig == null) { + return false; + } //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, wholeDatagramByte); + ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte); + //以下进行业务的规则解析,同时选定流程实例 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); + DatagramEventProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain, + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText, protocolId); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain); //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); + datagramEventProvider.storeData(bizDataMap); return true; } - private Boolean rematch(ByteBuf byteBuf,String protocolContent) { + /** + * 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 + */ + private Boolean rematch(ByteBuf byteBuf, String protocolContent) { //重置位判断 byteBuf.resetReaderIndex(); //判断重置是否前移,如果没有前移,则直接判为匹配失败 if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { return false; } else { + //递归执行 return doParseProtocol(byteBuf); } } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; + //获取匹配规则->匹配规则 + private RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + //取出其中参与逻辑provider并判空 + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); + String rulePrepareFields = protocolConfig.getRulePrepareFields(); + //固定字段 + if (StringUtils.isNotEmpty(rulePrepareFields)) { + //获取统一固定字段解析 + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + //获取该协议的字段配置,用于协议规则匹配 + List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); + //获取规则 + RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, + rulePrepareFields, protocolFieldConfigs); + return ruleConfig; + } + return null; } - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + //数据构建,获取固定字段的store和业务字段store + private Map buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + Map bizDataMap = new HashMap<>(); + Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); + Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); + bizDataMap.putAll(ruleStoreObjectMap); + bizDataMap.putAll(protocolStoreObjectMap); return bizDataMap; } - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java index 8a46e32..16ce2e5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java @@ -3,6 +3,7 @@ import io.netty.buffer.ByteBuf; public interface ProtocolParser { + Boolean doParseProtocol(ByteBuf byteBuf); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java new file mode 100644 index 0000000..f7814af --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java @@ -0,0 +1,35 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.ProtocolConfigProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.ProtocolConfig; + +/** + * 存放基本协议的的加载信息 + */ +public class AbstractProtocolConfigFactory { + private final ProtocolConfigProvider protocolConfigProvider; + private final ProtocolFieldConfigProvider protocolFieldConfigProvider; + private final RuleConfigProvider ruleConfigProvider; + + public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { + this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); + this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); + this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); + } + + public ProtocolConfigProvider getProtocolConfigProvider() { + return protocolConfigProvider; + } + + public ProtocolFieldConfigProvider getProtocolFieldConfigProvider() { + return protocolFieldConfigProvider; + } + + public RuleConfigProvider getRuleConfigProvider() { + return ruleConfigProvider; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java new file mode 100644 index 0000000..6e36147 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java @@ -0,0 +1,57 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.CombinedFieldConfigProvider; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.FieldConfigProvider; +import com.casic.missiles.parser.provider.FieldRuleConfigProvider; + +/** + * 存放规则相关的的的加载信息 + */ +public class AbstractRuleConfigFactory { + + /** + * 处理字节 + */ + private final FieldConfigProvider fieldConfigProvider; + /** + * 处理组合字节解析的解码器 + */ + private final CombinedFieldConfigProvider combinedFieldConfigProvider; + /** + * 处理负责字节解析的规则配置 + */ + private final FieldRuleConfigProvider fieldRuleConfigProvider; + /** + * 处理实例流程 + */ + private final DatagramEventProvider datagramEventProvider; + + + public AbstractRuleConfigFactory(Long ruleId) { + this.fieldConfigProvider = new FieldConfigProvider(ruleId); + this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); + this.fieldRuleConfigProvider = new FieldRuleConfigProvider(ruleId); + this.datagramEventProvider = new DatagramEventProvider(ruleId); + } + + public FieldConfigProvider getFieldConfigProvider() { + return fieldConfigProvider; + } + + public CombinedFieldConfigProvider getCombinedFieldConfigProvider() { + return combinedFieldConfigProvider; + } + + public FieldRuleConfigProvider getFieldRuleConfigProvider() { + return fieldRuleConfigProvider; + } + + public DatagramEventProvider getDatagramEventProvider() { + return datagramEventProvider; + } + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java index 608af3a..32cc8a4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java @@ -2,48 +2,47 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.delivery.decorator.ByteDecorator; +import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @AllArgsConstructor public class FieldDecoratorManger { - private final RuleDictDao ruleDictDao; + private final RuleConfigRegistry ruleDictDao; // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 // (1)静态的业务字段是字典里面可以配置的 // (2)动态的业务字段是通过规则生成的 public String contentMerge(String ruleJson, String sceneConent, String dynamicContent) { - List ruleDictList = ruleDictDao.getRuleDictConfig(); - Map ruleDictMap = ruleDictList.stream().collect( - Collectors.toMap(RuleDict::getId, e -> e)); - List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); - for (Map ruleMap : ruleMapList) { - String ruleType = String.valueOf(ruleMap.get("ruleType")); - ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); - NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); - byteDecorator.nodeDecoratorRule(nodeDecoratorParm); - } +// List ruleDictList = ruleDictDao.getRuleDictConfig(); +// Map ruleDictMap = ruleDictList.stream().collect( +// Collectors.toMap(RuleDict::getId, e -> e)); +// List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); +// for (Map ruleMap : ruleMapList) { +// String ruleType = String.valueOf(ruleMap.get("ruleType")); +// ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); +// NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); +// byteDecorator.nodeDecoratorRule(nodeDecoratorParm); +// } return null; } - - private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { - NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() - .contents(sceneConent) - .dynamicContent(dynamicContent) - .ruletypeId(ruletypeId) - .ruleDictMap(ruleDictMap) - .build(); - return nodeDecoratorParm; - } +// +// private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { +// NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() +// .contents(sceneConent) +// .dynamicContent(dynamicContent) +// .ruletypeId(ruletypeId) +// .ruleDictMap(ruleDictMap) +// .build(); +// return nodeDecoratorParm; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java index 652970c..b204ac3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java @@ -1,56 +1,56 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@AllArgsConstructor -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", - JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Component; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Component("logicalDecorator") +//@AllArgsConstructor +//@Slf4j +//public class LogicalShiftDecorator implements ByteDecorator { +// +//// private final FieldRuleEngineMapper fieldRuleEngineMapper; +//// +//// //字节位移 +//// @Override +//// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +//// String logicalValue = ""; +//// RuleEvaluator fieldRuleEngine = new RuleEvaluator(); +//// try { +//// Map env2 = new HashMap(); +//// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +//// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +//// for (String contentId : contentIdList) { +//// RuleDict ruleDict = ruleDictMap.get(contentId); +//// if (ruleDict.getCode().contains("#")) { +//// //使用动态的值 +//// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +//// } +//// env2.put(ruleDict.getName(), ruleDict.getCode()); +//// } +//// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +//// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +//// return null; +//// } +//// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +//// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +//// return values; +//// } catch (Exception ex) { +//// log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", +//// JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +//// return null; +//// } +//// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java index 346468f..822fead 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@AllArgsConstructor -@Slf4j -public class OperationDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("optionDecorator") +//@AllArgsConstructor +//@Slf4j +//public class OperationDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //混合运算,有常量或者乘除的缩放 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java index 50fb0a7..7a8bccb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@AllArgsConstructor -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +////精度计算 +//@AllArgsConstructor +//@Registry("precisionDecorator") +//@Slf4j +//public class PrecisionDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java index da39235..27f9cc7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java @@ -1,54 +1,53 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@AllArgsConstructor -@Slf4j -public class RuleDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("ruleDecorator") +//@AllArgsConstructor +//@Slf4j +//public class RuleDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //吃我一套正则表达式 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (Exception ex) { +// log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java index 7f5cbf3..c043f97 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java @@ -2,6 +2,6 @@ import java.util.Map; -public interface ComandeEventService { +public interface ComandeEventService{ Map loadComandeEventConfig(String protocolId,String scene); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java index 476ad84..aaf1837 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java @@ -2,46 +2,46 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.dao.CommandEventDao; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @Slf4j @AllArgsConstructor -public class ComandeEventServiceImpl implements ComandeEventService { +public class ComandeEventServiceImpl implements ComandeEventRegistry { - private final CommandEventDao commandEventDao; + // private final CommandEventDao commandEventDao; // 加密bean 固定字段出现变化的字段解析,业务字段的有序内容 @Override - public Map loadComandeEventConfig(String protocolId,String sceneName) { - CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); - if (ObjectUtil.isEmpty(commandEventConfig)) { - log.error("协议{},没有配置成功接收回复配置,清排查原因"); - return null; - } - String replyJson = commandEventConfig.getReplyContentJson(); - List> replyMapList = JSONArray.parseObject(replyJson, List.class); - List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); - Map fixMap = fixList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); - List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) - .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) - .collect(Collectors.toList()); - Map commandConfigMap = new HashMap<>(); - commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); - commandConfigMap.put("fixContent", fixMap); - commandConfigMap.put("bizContent", contentList); - return commandConfigMap; + public Map loadComandeEventConfig(String protocolId, String sceneName) { +// CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); +// if (ObjectUtil.isEmpty(commandEventConfig)) { +// log.error("协议{},没有配置成功接收回复配置,清排查原因"); +// return null; +// } +// String replyJson = commandEventConfig.getReplyContentJson(); +// List> replyMapList = JSONArray.parseObject(replyJson, List.class); +// List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); +// Map fixMap = fixList.stream() +// .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); +// List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) +// .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) +// .collect(Collectors.toList()); +// Map commandConfigMap = new HashMap<>(); +// commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); +// commandConfigMap.put("fixContent", fixMap); +// commandConfigMap.put("bizContent", contentList); +// return commandConfigMap; + return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 128b09d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java deleted file mode 100644 index 4016b0b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface DatagramEventMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java deleted file mode 100644 index 597c306..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.apache.ibatis.annotations.Mapper; - -public interface FieldConfigMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java deleted file mode 100644 index a31680a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.PreRuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface PreRuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java deleted file mode 100644 index 9060a69..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface ProtocolConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java deleted file mode 100644 index 6fa6936..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java deleted file mode 100644 index 582a705..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleDict; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleDictMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java deleted file mode 100644 index 6e302c8..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.CommandEventMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Optional; - -@Component -public class CommandEventDao { - - @Resource - private CommandEventMapper commandEventMapper; - - public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId) - .eq("scene", sceneName) - .eq("enabled", 1); - List commandEventConfig = commandEventMapper.selectList(queryWrapper); - Optional optionalEventConfig = commandEventConfig.stream().findFirst(); - return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java deleted file mode 100644 index 9137e4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.FieldConfigMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class FieldConfigDao { - - @Resource - private FieldConfigMapper fieldConfigMapper; - - public FieldConfig getFieldConfigById(String fieldId) { - FieldConfig fieldConfig = fieldConfigMapper.selectById(fieldId); - return fieldConfig; - } - - public List getFieldConfigs(String protocolId,Integer isFixed) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",isFixed); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - - public List getStorageFieldConfig(String protocolId) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",1) - .eq("is_storage",1); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java deleted file mode 100644 index 67bff6b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.mapper.PreRuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class PreRuleConfigDao { - - @Resource - private PreRuleConfigMapper preRuleConfigMapper; - - public List getPreRuleList(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return preRuleConfigMapper.selectList(queryWrapper); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java deleted file mode 100644 index d69ea85..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.RuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleConfigDao { - - @Resource - private RuleConfigMapper ruleConfigMapper; - - public RuleConfig getNextRuleConfig(String ruleFields) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("parse_rule_json", ruleFields); - return ruleConfigMapper.selectOne(queryWrapper); - } - - - public List getRuleConfigById(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return ruleConfigMapper.selectList(queryWrapper); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java deleted file mode 100644 index 932c185..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.RuleDictMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleDictDao { - - @Resource - private RuleDictMapper ruleDictMapper; - - public List getRuleDictConfig() { - List ruleDictList = ruleDictMapper.selectList(null); - return ruleDictList; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java index 9f9e279..43bc4d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java @@ -10,20 +10,15 @@ import io.netty.channel.socket.nio.NioServerSocketChannel; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import javax.annotation.PreDestroy; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static cn.hutool.core.util.ClassUtil.getClasses; /** * SensorhubServer netty服务端 */ @Slf4j -@Service +@Component public class SensorhubServer { /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java index 2c79ff5..9a28c36 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java @@ -11,13 +11,13 @@ import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioSocketChannel; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClient 客户端 */ @Slf4j -@Service +@Registry public final class SensorhubClient { public static void main(String[] args) throws Exception { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java index 9774be0..477c3f7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java @@ -6,12 +6,12 @@ import io.netty.channel.socket.SocketChannel; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientChannelInitialHandler */ -@Service +@Registry public class SensorhubClientChannelInitialHandler extends ChannelInitializer { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java index 346f4b3..73560e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java @@ -5,13 +5,13 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientHandler */ @Slf4j -@Service +@Registry public class SensorhubClientHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java index 5c1c6f2..d990af5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java @@ -4,12 +4,12 @@ import com.casic.missiles.pojo.Msg; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** * SensorhubServerHandler */ -@Service +@Component public class SensorhubServerHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 67283ae..af3172c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,41 +1,37 @@ package com.casic.missiles.parser; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultProtocolConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.*; +import com.casic.missiles.registry.FieldConfigRegistry; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; -import java.nio.charset.Charset; import java.util.HashMap; import java.util.List; import java.util.Map; -@Service("genericProtocolParser") +/** + * @author + */ +@Component("genericProtocolParser") @Slf4j -@AllArgsConstructor +@RequiredArgsConstructor public class GenericProtocolParser implements ProtocolParser { - private final LeadingCodeMatcher leadingCodeMatcher; private final List frameStructDispenserList; - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorInstanceSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; // 匹配首字母前导码=> 帧结构匹配前导码=> // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 @@ -44,18 +40,19 @@ public Boolean doParseProtocol(ByteBuf byteBuf) { String protocolContent = ByteBufUtil.hexDump(byteBuf); //匹配前导码 - List preCodeConfigs = leadingCodeMatcher.matchLeadingCode(protocolContent); + List preCodeConfigs = LeadingCodeMatcher.matchFrameLeadingCode(protocolContent); //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 if (preCodeConfigs.size() == 0) { - return rematch(byteBuf,protocolContent); + return rematch(byteBuf, protocolContent); } - //暂时先取第一个 + //暂时先取第一个,提升速度,使用享元模式, 减少类的创建销毁与构建 ProtocolConfig protocolConfig = preCodeConfigs.get(0); + AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); ByteBuf wholeDatagramByte = null; //通过匹配帧结构获取完整的数据包 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, preCodeConfigs.get(0))) != null) { + if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, protocolFactory)) != null) { break; } } @@ -68,76 +65,78 @@ * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 */ - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId, wholeDatagramByte); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap, protocolId); - //选取规则对应的流程实例 - DatagramEventConfig datagramEventConfig = processorInstanceSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); + //进行规则字段解析,进行匹配规则 + RuleConfig ruleConfig = getRuleConfig(protocolFactory, wholeDatagramByte); + if (ruleConfig == null) { + return false; + } //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, wholeDatagramByte); + ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte); + //以下进行业务的规则解析,同时选定流程实例 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); + DatagramEventProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain, + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText, protocolId); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain); //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); + datagramEventProvider.storeData(bizDataMap); return true; } - private Boolean rematch(ByteBuf byteBuf,String protocolContent) { + /** + * 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 + */ + private Boolean rematch(ByteBuf byteBuf, String protocolContent) { //重置位判断 byteBuf.resetReaderIndex(); //判断重置是否前移,如果没有前移,则直接判为匹配失败 if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { return false; } else { + //递归执行 return doParseProtocol(byteBuf); } } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; + //获取匹配规则->匹配规则 + private RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + //取出其中参与逻辑provider并判空 + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); + String rulePrepareFields = protocolConfig.getRulePrepareFields(); + //固定字段 + if (StringUtils.isNotEmpty(rulePrepareFields)) { + //获取统一固定字段解析 + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + //获取该协议的字段配置,用于协议规则匹配 + List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); + //获取规则 + RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, + rulePrepareFields, protocolFieldConfigs); + return ruleConfig; + } + return null; } - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + //数据构建,获取固定字段的store和业务字段store + private Map buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + Map bizDataMap = new HashMap<>(); + Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); + Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); + bizDataMap.putAll(ruleStoreObjectMap); + bizDataMap.putAll(protocolStoreObjectMap); return bizDataMap; } - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java index 8a46e32..16ce2e5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java @@ -3,6 +3,7 @@ import io.netty.buffer.ByteBuf; public interface ProtocolParser { + Boolean doParseProtocol(ByteBuf byteBuf); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java new file mode 100644 index 0000000..f7814af --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java @@ -0,0 +1,35 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.ProtocolConfigProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.ProtocolConfig; + +/** + * 存放基本协议的的加载信息 + */ +public class AbstractProtocolConfigFactory { + private final ProtocolConfigProvider protocolConfigProvider; + private final ProtocolFieldConfigProvider protocolFieldConfigProvider; + private final RuleConfigProvider ruleConfigProvider; + + public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { + this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); + this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); + this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); + } + + public ProtocolConfigProvider getProtocolConfigProvider() { + return protocolConfigProvider; + } + + public ProtocolFieldConfigProvider getProtocolFieldConfigProvider() { + return protocolFieldConfigProvider; + } + + public RuleConfigProvider getRuleConfigProvider() { + return ruleConfigProvider; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java new file mode 100644 index 0000000..6e36147 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java @@ -0,0 +1,57 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.CombinedFieldConfigProvider; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.FieldConfigProvider; +import com.casic.missiles.parser.provider.FieldRuleConfigProvider; + +/** + * 存放规则相关的的的加载信息 + */ +public class AbstractRuleConfigFactory { + + /** + * 处理字节 + */ + private final FieldConfigProvider fieldConfigProvider; + /** + * 处理组合字节解析的解码器 + */ + private final CombinedFieldConfigProvider combinedFieldConfigProvider; + /** + * 处理负责字节解析的规则配置 + */ + private final FieldRuleConfigProvider fieldRuleConfigProvider; + /** + * 处理实例流程 + */ + private final DatagramEventProvider datagramEventProvider; + + + public AbstractRuleConfigFactory(Long ruleId) { + this.fieldConfigProvider = new FieldConfigProvider(ruleId); + this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); + this.fieldRuleConfigProvider = new FieldRuleConfigProvider(ruleId); + this.datagramEventProvider = new DatagramEventProvider(ruleId); + } + + public FieldConfigProvider getFieldConfigProvider() { + return fieldConfigProvider; + } + + public CombinedFieldConfigProvider getCombinedFieldConfigProvider() { + return combinedFieldConfigProvider; + } + + public FieldRuleConfigProvider getFieldRuleConfigProvider() { + return fieldRuleConfigProvider; + } + + public DatagramEventProvider getDatagramEventProvider() { + return datagramEventProvider; + } + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java deleted file mode 100644 index 6e1719a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.factory; - - -import com.casic.missiles.pojo.ProtocolConfig; - -import java.util.List; - -/** - * 数据库访问优化(暂时未做) - *

- * 1、初始化协议解析配置,并存放到处存放缓存,对协议基本配置进行管理 - * 2、其中流程中所有的配置都经过此类进行管理,进行调用获取,增强解析速度 - */ -public interface DatagramFactory { - - /** - * 初始化 - */ - List datagramInit(); - - /** - * 根据前导码配置匹配,模糊匹配获取所有的报文项 - */ - List match(); - - /** - * 根据前导码匹配,返回报文项 - */ - List filer(); - - /** - * 保证数据的唯一性选择器 - */ - List selectOne(); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java index 608af3a..32cc8a4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java @@ -2,48 +2,47 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.delivery.decorator.ByteDecorator; +import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @AllArgsConstructor public class FieldDecoratorManger { - private final RuleDictDao ruleDictDao; + private final RuleConfigRegistry ruleDictDao; // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 // (1)静态的业务字段是字典里面可以配置的 // (2)动态的业务字段是通过规则生成的 public String contentMerge(String ruleJson, String sceneConent, String dynamicContent) { - List ruleDictList = ruleDictDao.getRuleDictConfig(); - Map ruleDictMap = ruleDictList.stream().collect( - Collectors.toMap(RuleDict::getId, e -> e)); - List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); - for (Map ruleMap : ruleMapList) { - String ruleType = String.valueOf(ruleMap.get("ruleType")); - ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); - NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); - byteDecorator.nodeDecoratorRule(nodeDecoratorParm); - } +// List ruleDictList = ruleDictDao.getRuleDictConfig(); +// Map ruleDictMap = ruleDictList.stream().collect( +// Collectors.toMap(RuleDict::getId, e -> e)); +// List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); +// for (Map ruleMap : ruleMapList) { +// String ruleType = String.valueOf(ruleMap.get("ruleType")); +// ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); +// NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); +// byteDecorator.nodeDecoratorRule(nodeDecoratorParm); +// } return null; } - - private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { - NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() - .contents(sceneConent) - .dynamicContent(dynamicContent) - .ruletypeId(ruletypeId) - .ruleDictMap(ruleDictMap) - .build(); - return nodeDecoratorParm; - } +// +// private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { +// NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() +// .contents(sceneConent) +// .dynamicContent(dynamicContent) +// .ruletypeId(ruletypeId) +// .ruleDictMap(ruleDictMap) +// .build(); +// return nodeDecoratorParm; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java index 652970c..b204ac3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java @@ -1,56 +1,56 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@AllArgsConstructor -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", - JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Component; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Component("logicalDecorator") +//@AllArgsConstructor +//@Slf4j +//public class LogicalShiftDecorator implements ByteDecorator { +// +//// private final FieldRuleEngineMapper fieldRuleEngineMapper; +//// +//// //字节位移 +//// @Override +//// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +//// String logicalValue = ""; +//// RuleEvaluator fieldRuleEngine = new RuleEvaluator(); +//// try { +//// Map env2 = new HashMap(); +//// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +//// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +//// for (String contentId : contentIdList) { +//// RuleDict ruleDict = ruleDictMap.get(contentId); +//// if (ruleDict.getCode().contains("#")) { +//// //使用动态的值 +//// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +//// } +//// env2.put(ruleDict.getName(), ruleDict.getCode()); +//// } +//// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +//// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +//// return null; +//// } +//// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +//// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +//// return values; +//// } catch (Exception ex) { +//// log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", +//// JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +//// return null; +//// } +//// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java index 346468f..822fead 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@AllArgsConstructor -@Slf4j -public class OperationDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("optionDecorator") +//@AllArgsConstructor +//@Slf4j +//public class OperationDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //混合运算,有常量或者乘除的缩放 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java index 50fb0a7..7a8bccb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@AllArgsConstructor -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +////精度计算 +//@AllArgsConstructor +//@Registry("precisionDecorator") +//@Slf4j +//public class PrecisionDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java index da39235..27f9cc7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java @@ -1,54 +1,53 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@AllArgsConstructor -@Slf4j -public class RuleDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("ruleDecorator") +//@AllArgsConstructor +//@Slf4j +//public class RuleDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //吃我一套正则表达式 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (Exception ex) { +// log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java index 7f5cbf3..c043f97 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java @@ -2,6 +2,6 @@ import java.util.Map; -public interface ComandeEventService { +public interface ComandeEventService{ Map loadComandeEventConfig(String protocolId,String scene); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java index 476ad84..aaf1837 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java @@ -2,46 +2,46 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.dao.CommandEventDao; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @Slf4j @AllArgsConstructor -public class ComandeEventServiceImpl implements ComandeEventService { +public class ComandeEventServiceImpl implements ComandeEventRegistry { - private final CommandEventDao commandEventDao; + // private final CommandEventDao commandEventDao; // 加密bean 固定字段出现变化的字段解析,业务字段的有序内容 @Override - public Map loadComandeEventConfig(String protocolId,String sceneName) { - CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); - if (ObjectUtil.isEmpty(commandEventConfig)) { - log.error("协议{},没有配置成功接收回复配置,清排查原因"); - return null; - } - String replyJson = commandEventConfig.getReplyContentJson(); - List> replyMapList = JSONArray.parseObject(replyJson, List.class); - List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); - Map fixMap = fixList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); - List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) - .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) - .collect(Collectors.toList()); - Map commandConfigMap = new HashMap<>(); - commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); - commandConfigMap.put("fixContent", fixMap); - commandConfigMap.put("bizContent", contentList); - return commandConfigMap; + public Map loadComandeEventConfig(String protocolId, String sceneName) { +// CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); +// if (ObjectUtil.isEmpty(commandEventConfig)) { +// log.error("协议{},没有配置成功接收回复配置,清排查原因"); +// return null; +// } +// String replyJson = commandEventConfig.getReplyContentJson(); +// List> replyMapList = JSONArray.parseObject(replyJson, List.class); +// List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); +// Map fixMap = fixList.stream() +// .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); +// List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) +// .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) +// .collect(Collectors.toList()); +// Map commandConfigMap = new HashMap<>(); +// commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); +// commandConfigMap.put("fixContent", fixMap); +// commandConfigMap.put("bizContent", contentList); +// return commandConfigMap; + return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 128b09d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java deleted file mode 100644 index 4016b0b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface DatagramEventMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java deleted file mode 100644 index 597c306..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.apache.ibatis.annotations.Mapper; - -public interface FieldConfigMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java deleted file mode 100644 index a31680a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.PreRuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface PreRuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java deleted file mode 100644 index 9060a69..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface ProtocolConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java deleted file mode 100644 index 6fa6936..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java deleted file mode 100644 index 582a705..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleDict; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleDictMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java deleted file mode 100644 index 6e302c8..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.CommandEventMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Optional; - -@Component -public class CommandEventDao { - - @Resource - private CommandEventMapper commandEventMapper; - - public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId) - .eq("scene", sceneName) - .eq("enabled", 1); - List commandEventConfig = commandEventMapper.selectList(queryWrapper); - Optional optionalEventConfig = commandEventConfig.stream().findFirst(); - return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java deleted file mode 100644 index 9137e4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.FieldConfigMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class FieldConfigDao { - - @Resource - private FieldConfigMapper fieldConfigMapper; - - public FieldConfig getFieldConfigById(String fieldId) { - FieldConfig fieldConfig = fieldConfigMapper.selectById(fieldId); - return fieldConfig; - } - - public List getFieldConfigs(String protocolId,Integer isFixed) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",isFixed); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - - public List getStorageFieldConfig(String protocolId) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",1) - .eq("is_storage",1); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java deleted file mode 100644 index 67bff6b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.mapper.PreRuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class PreRuleConfigDao { - - @Resource - private PreRuleConfigMapper preRuleConfigMapper; - - public List getPreRuleList(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return preRuleConfigMapper.selectList(queryWrapper); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java deleted file mode 100644 index d69ea85..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.RuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleConfigDao { - - @Resource - private RuleConfigMapper ruleConfigMapper; - - public RuleConfig getNextRuleConfig(String ruleFields) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("parse_rule_json", ruleFields); - return ruleConfigMapper.selectOne(queryWrapper); - } - - - public List getRuleConfigById(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return ruleConfigMapper.selectList(queryWrapper); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java deleted file mode 100644 index 932c185..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.RuleDictMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleDictDao { - - @Resource - private RuleDictMapper ruleDictMapper; - - public List getRuleDictConfig() { - List ruleDictList = ruleDictMapper.selectList(null); - return ruleDictList; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java index 9f9e279..43bc4d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java @@ -10,20 +10,15 @@ import io.netty.channel.socket.nio.NioServerSocketChannel; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import javax.annotation.PreDestroy; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static cn.hutool.core.util.ClassUtil.getClasses; /** * SensorhubServer netty服务端 */ @Slf4j -@Service +@Component public class SensorhubServer { /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java index 2c79ff5..9a28c36 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java @@ -11,13 +11,13 @@ import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioSocketChannel; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClient 客户端 */ @Slf4j -@Service +@Registry public final class SensorhubClient { public static void main(String[] args) throws Exception { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java index 9774be0..477c3f7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java @@ -6,12 +6,12 @@ import io.netty.channel.socket.SocketChannel; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientChannelInitialHandler */ -@Service +@Registry public class SensorhubClientChannelInitialHandler extends ChannelInitializer { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java index 346f4b3..73560e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java @@ -5,13 +5,13 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientHandler */ @Slf4j -@Service +@Registry public class SensorhubClientHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java index 5c1c6f2..d990af5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java @@ -4,12 +4,12 @@ import com.casic.missiles.pojo.Msg; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** * SensorhubServerHandler */ -@Service +@Component public class SensorhubServerHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 67283ae..af3172c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,41 +1,37 @@ package com.casic.missiles.parser; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultProtocolConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.*; +import com.casic.missiles.registry.FieldConfigRegistry; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; -import java.nio.charset.Charset; import java.util.HashMap; import java.util.List; import java.util.Map; -@Service("genericProtocolParser") +/** + * @author + */ +@Component("genericProtocolParser") @Slf4j -@AllArgsConstructor +@RequiredArgsConstructor public class GenericProtocolParser implements ProtocolParser { - private final LeadingCodeMatcher leadingCodeMatcher; private final List frameStructDispenserList; - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorInstanceSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; // 匹配首字母前导码=> 帧结构匹配前导码=> // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 @@ -44,18 +40,19 @@ public Boolean doParseProtocol(ByteBuf byteBuf) { String protocolContent = ByteBufUtil.hexDump(byteBuf); //匹配前导码 - List preCodeConfigs = leadingCodeMatcher.matchLeadingCode(protocolContent); + List preCodeConfigs = LeadingCodeMatcher.matchFrameLeadingCode(protocolContent); //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 if (preCodeConfigs.size() == 0) { - return rematch(byteBuf,protocolContent); + return rematch(byteBuf, protocolContent); } - //暂时先取第一个 + //暂时先取第一个,提升速度,使用享元模式, 减少类的创建销毁与构建 ProtocolConfig protocolConfig = preCodeConfigs.get(0); + AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); ByteBuf wholeDatagramByte = null; //通过匹配帧结构获取完整的数据包 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, preCodeConfigs.get(0))) != null) { + if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, protocolFactory)) != null) { break; } } @@ -68,76 +65,78 @@ * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 */ - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId, wholeDatagramByte); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap, protocolId); - //选取规则对应的流程实例 - DatagramEventConfig datagramEventConfig = processorInstanceSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); + //进行规则字段解析,进行匹配规则 + RuleConfig ruleConfig = getRuleConfig(protocolFactory, wholeDatagramByte); + if (ruleConfig == null) { + return false; + } //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, wholeDatagramByte); + ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte); + //以下进行业务的规则解析,同时选定流程实例 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); + DatagramEventProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain, + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText, protocolId); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain); //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); + datagramEventProvider.storeData(bizDataMap); return true; } - private Boolean rematch(ByteBuf byteBuf,String protocolContent) { + /** + * 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 + */ + private Boolean rematch(ByteBuf byteBuf, String protocolContent) { //重置位判断 byteBuf.resetReaderIndex(); //判断重置是否前移,如果没有前移,则直接判为匹配失败 if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { return false; } else { + //递归执行 return doParseProtocol(byteBuf); } } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; + //获取匹配规则->匹配规则 + private RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + //取出其中参与逻辑provider并判空 + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); + String rulePrepareFields = protocolConfig.getRulePrepareFields(); + //固定字段 + if (StringUtils.isNotEmpty(rulePrepareFields)) { + //获取统一固定字段解析 + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + //获取该协议的字段配置,用于协议规则匹配 + List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); + //获取规则 + RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, + rulePrepareFields, protocolFieldConfigs); + return ruleConfig; + } + return null; } - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + //数据构建,获取固定字段的store和业务字段store + private Map buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + Map bizDataMap = new HashMap<>(); + Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); + Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); + bizDataMap.putAll(ruleStoreObjectMap); + bizDataMap.putAll(protocolStoreObjectMap); return bizDataMap; } - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java index 8a46e32..16ce2e5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java @@ -3,6 +3,7 @@ import io.netty.buffer.ByteBuf; public interface ProtocolParser { + Boolean doParseProtocol(ByteBuf byteBuf); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java new file mode 100644 index 0000000..f7814af --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java @@ -0,0 +1,35 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.ProtocolConfigProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.ProtocolConfig; + +/** + * 存放基本协议的的加载信息 + */ +public class AbstractProtocolConfigFactory { + private final ProtocolConfigProvider protocolConfigProvider; + private final ProtocolFieldConfigProvider protocolFieldConfigProvider; + private final RuleConfigProvider ruleConfigProvider; + + public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { + this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); + this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); + this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); + } + + public ProtocolConfigProvider getProtocolConfigProvider() { + return protocolConfigProvider; + } + + public ProtocolFieldConfigProvider getProtocolFieldConfigProvider() { + return protocolFieldConfigProvider; + } + + public RuleConfigProvider getRuleConfigProvider() { + return ruleConfigProvider; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java new file mode 100644 index 0000000..6e36147 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java @@ -0,0 +1,57 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.CombinedFieldConfigProvider; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.FieldConfigProvider; +import com.casic.missiles.parser.provider.FieldRuleConfigProvider; + +/** + * 存放规则相关的的的加载信息 + */ +public class AbstractRuleConfigFactory { + + /** + * 处理字节 + */ + private final FieldConfigProvider fieldConfigProvider; + /** + * 处理组合字节解析的解码器 + */ + private final CombinedFieldConfigProvider combinedFieldConfigProvider; + /** + * 处理负责字节解析的规则配置 + */ + private final FieldRuleConfigProvider fieldRuleConfigProvider; + /** + * 处理实例流程 + */ + private final DatagramEventProvider datagramEventProvider; + + + public AbstractRuleConfigFactory(Long ruleId) { + this.fieldConfigProvider = new FieldConfigProvider(ruleId); + this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); + this.fieldRuleConfigProvider = new FieldRuleConfigProvider(ruleId); + this.datagramEventProvider = new DatagramEventProvider(ruleId); + } + + public FieldConfigProvider getFieldConfigProvider() { + return fieldConfigProvider; + } + + public CombinedFieldConfigProvider getCombinedFieldConfigProvider() { + return combinedFieldConfigProvider; + } + + public FieldRuleConfigProvider getFieldRuleConfigProvider() { + return fieldRuleConfigProvider; + } + + public DatagramEventProvider getDatagramEventProvider() { + return datagramEventProvider; + } + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java deleted file mode 100644 index 6e1719a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.factory; - - -import com.casic.missiles.pojo.ProtocolConfig; - -import java.util.List; - -/** - * 数据库访问优化(暂时未做) - *

- * 1、初始化协议解析配置,并存放到处存放缓存,对协议基本配置进行管理 - * 2、其中流程中所有的配置都经过此类进行管理,进行调用获取,增强解析速度 - */ -public interface DatagramFactory { - - /** - * 初始化 - */ - List datagramInit(); - - /** - * 根据前导码配置匹配,模糊匹配获取所有的报文项 - */ - List match(); - - /** - * 根据前导码匹配,返回报文项 - */ - List filer(); - - /** - * 保证数据的唯一性选择器 - */ - List selectOne(); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java new file mode 100644 index 0000000..87444a0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java @@ -0,0 +1,18 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +import java.util.List; + +/** + * 直接用,还是边用边创建 + */ +public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { + + + public DefaultProtocolConfigFactory(ProtocolConfig protocolConfig) { + super(protocolConfig); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java index 608af3a..32cc8a4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java @@ -2,48 +2,47 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.delivery.decorator.ByteDecorator; +import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @AllArgsConstructor public class FieldDecoratorManger { - private final RuleDictDao ruleDictDao; + private final RuleConfigRegistry ruleDictDao; // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 // (1)静态的业务字段是字典里面可以配置的 // (2)动态的业务字段是通过规则生成的 public String contentMerge(String ruleJson, String sceneConent, String dynamicContent) { - List ruleDictList = ruleDictDao.getRuleDictConfig(); - Map ruleDictMap = ruleDictList.stream().collect( - Collectors.toMap(RuleDict::getId, e -> e)); - List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); - for (Map ruleMap : ruleMapList) { - String ruleType = String.valueOf(ruleMap.get("ruleType")); - ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); - NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); - byteDecorator.nodeDecoratorRule(nodeDecoratorParm); - } +// List ruleDictList = ruleDictDao.getRuleDictConfig(); +// Map ruleDictMap = ruleDictList.stream().collect( +// Collectors.toMap(RuleDict::getId, e -> e)); +// List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); +// for (Map ruleMap : ruleMapList) { +// String ruleType = String.valueOf(ruleMap.get("ruleType")); +// ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); +// NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); +// byteDecorator.nodeDecoratorRule(nodeDecoratorParm); +// } return null; } - - private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { - NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() - .contents(sceneConent) - .dynamicContent(dynamicContent) - .ruletypeId(ruletypeId) - .ruleDictMap(ruleDictMap) - .build(); - return nodeDecoratorParm; - } +// +// private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { +// NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() +// .contents(sceneConent) +// .dynamicContent(dynamicContent) +// .ruletypeId(ruletypeId) +// .ruleDictMap(ruleDictMap) +// .build(); +// return nodeDecoratorParm; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java index 652970c..b204ac3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java @@ -1,56 +1,56 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@AllArgsConstructor -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", - JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Component; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Component("logicalDecorator") +//@AllArgsConstructor +//@Slf4j +//public class LogicalShiftDecorator implements ByteDecorator { +// +//// private final FieldRuleEngineMapper fieldRuleEngineMapper; +//// +//// //字节位移 +//// @Override +//// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +//// String logicalValue = ""; +//// RuleEvaluator fieldRuleEngine = new RuleEvaluator(); +//// try { +//// Map env2 = new HashMap(); +//// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +//// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +//// for (String contentId : contentIdList) { +//// RuleDict ruleDict = ruleDictMap.get(contentId); +//// if (ruleDict.getCode().contains("#")) { +//// //使用动态的值 +//// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +//// } +//// env2.put(ruleDict.getName(), ruleDict.getCode()); +//// } +//// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +//// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +//// return null; +//// } +//// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +//// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +//// return values; +//// } catch (Exception ex) { +//// log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", +//// JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +//// return null; +//// } +//// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java index 346468f..822fead 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@AllArgsConstructor -@Slf4j -public class OperationDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("optionDecorator") +//@AllArgsConstructor +//@Slf4j +//public class OperationDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //混合运算,有常量或者乘除的缩放 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java index 50fb0a7..7a8bccb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@AllArgsConstructor -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +////精度计算 +//@AllArgsConstructor +//@Registry("precisionDecorator") +//@Slf4j +//public class PrecisionDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java index da39235..27f9cc7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java @@ -1,54 +1,53 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@AllArgsConstructor -@Slf4j -public class RuleDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("ruleDecorator") +//@AllArgsConstructor +//@Slf4j +//public class RuleDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //吃我一套正则表达式 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (Exception ex) { +// log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java index 7f5cbf3..c043f97 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java @@ -2,6 +2,6 @@ import java.util.Map; -public interface ComandeEventService { +public interface ComandeEventService{ Map loadComandeEventConfig(String protocolId,String scene); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java index 476ad84..aaf1837 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java @@ -2,46 +2,46 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.dao.CommandEventDao; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @Slf4j @AllArgsConstructor -public class ComandeEventServiceImpl implements ComandeEventService { +public class ComandeEventServiceImpl implements ComandeEventRegistry { - private final CommandEventDao commandEventDao; + // private final CommandEventDao commandEventDao; // 加密bean 固定字段出现变化的字段解析,业务字段的有序内容 @Override - public Map loadComandeEventConfig(String protocolId,String sceneName) { - CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); - if (ObjectUtil.isEmpty(commandEventConfig)) { - log.error("协议{},没有配置成功接收回复配置,清排查原因"); - return null; - } - String replyJson = commandEventConfig.getReplyContentJson(); - List> replyMapList = JSONArray.parseObject(replyJson, List.class); - List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); - Map fixMap = fixList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); - List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) - .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) - .collect(Collectors.toList()); - Map commandConfigMap = new HashMap<>(); - commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); - commandConfigMap.put("fixContent", fixMap); - commandConfigMap.put("bizContent", contentList); - return commandConfigMap; + public Map loadComandeEventConfig(String protocolId, String sceneName) { +// CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); +// if (ObjectUtil.isEmpty(commandEventConfig)) { +// log.error("协议{},没有配置成功接收回复配置,清排查原因"); +// return null; +// } +// String replyJson = commandEventConfig.getReplyContentJson(); +// List> replyMapList = JSONArray.parseObject(replyJson, List.class); +// List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); +// Map fixMap = fixList.stream() +// .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); +// List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) +// .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) +// .collect(Collectors.toList()); +// Map commandConfigMap = new HashMap<>(); +// commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); +// commandConfigMap.put("fixContent", fixMap); +// commandConfigMap.put("bizContent", contentList); +// return commandConfigMap; + return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 128b09d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java deleted file mode 100644 index 4016b0b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface DatagramEventMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java deleted file mode 100644 index 597c306..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.apache.ibatis.annotations.Mapper; - -public interface FieldConfigMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java deleted file mode 100644 index a31680a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.PreRuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface PreRuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java deleted file mode 100644 index 9060a69..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface ProtocolConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java deleted file mode 100644 index 6fa6936..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java deleted file mode 100644 index 582a705..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleDict; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleDictMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java deleted file mode 100644 index 6e302c8..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.CommandEventMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Optional; - -@Component -public class CommandEventDao { - - @Resource - private CommandEventMapper commandEventMapper; - - public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId) - .eq("scene", sceneName) - .eq("enabled", 1); - List commandEventConfig = commandEventMapper.selectList(queryWrapper); - Optional optionalEventConfig = commandEventConfig.stream().findFirst(); - return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java deleted file mode 100644 index 9137e4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.FieldConfigMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class FieldConfigDao { - - @Resource - private FieldConfigMapper fieldConfigMapper; - - public FieldConfig getFieldConfigById(String fieldId) { - FieldConfig fieldConfig = fieldConfigMapper.selectById(fieldId); - return fieldConfig; - } - - public List getFieldConfigs(String protocolId,Integer isFixed) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",isFixed); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - - public List getStorageFieldConfig(String protocolId) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",1) - .eq("is_storage",1); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java deleted file mode 100644 index 67bff6b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.mapper.PreRuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class PreRuleConfigDao { - - @Resource - private PreRuleConfigMapper preRuleConfigMapper; - - public List getPreRuleList(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return preRuleConfigMapper.selectList(queryWrapper); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java deleted file mode 100644 index d69ea85..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.RuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleConfigDao { - - @Resource - private RuleConfigMapper ruleConfigMapper; - - public RuleConfig getNextRuleConfig(String ruleFields) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("parse_rule_json", ruleFields); - return ruleConfigMapper.selectOne(queryWrapper); - } - - - public List getRuleConfigById(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return ruleConfigMapper.selectList(queryWrapper); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java deleted file mode 100644 index 932c185..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.RuleDictMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleDictDao { - - @Resource - private RuleDictMapper ruleDictMapper; - - public List getRuleDictConfig() { - List ruleDictList = ruleDictMapper.selectList(null); - return ruleDictList; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java index 9f9e279..43bc4d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java @@ -10,20 +10,15 @@ import io.netty.channel.socket.nio.NioServerSocketChannel; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import javax.annotation.PreDestroy; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static cn.hutool.core.util.ClassUtil.getClasses; /** * SensorhubServer netty服务端 */ @Slf4j -@Service +@Component public class SensorhubServer { /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java index 2c79ff5..9a28c36 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java @@ -11,13 +11,13 @@ import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioSocketChannel; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClient 客户端 */ @Slf4j -@Service +@Registry public final class SensorhubClient { public static void main(String[] args) throws Exception { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java index 9774be0..477c3f7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java @@ -6,12 +6,12 @@ import io.netty.channel.socket.SocketChannel; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientChannelInitialHandler */ -@Service +@Registry public class SensorhubClientChannelInitialHandler extends ChannelInitializer { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java index 346f4b3..73560e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java @@ -5,13 +5,13 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientHandler */ @Slf4j -@Service +@Registry public class SensorhubClientHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java index 5c1c6f2..d990af5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java @@ -4,12 +4,12 @@ import com.casic.missiles.pojo.Msg; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** * SensorhubServerHandler */ -@Service +@Component public class SensorhubServerHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 67283ae..af3172c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,41 +1,37 @@ package com.casic.missiles.parser; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultProtocolConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.*; +import com.casic.missiles.registry.FieldConfigRegistry; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; -import java.nio.charset.Charset; import java.util.HashMap; import java.util.List; import java.util.Map; -@Service("genericProtocolParser") +/** + * @author + */ +@Component("genericProtocolParser") @Slf4j -@AllArgsConstructor +@RequiredArgsConstructor public class GenericProtocolParser implements ProtocolParser { - private final LeadingCodeMatcher leadingCodeMatcher; private final List frameStructDispenserList; - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorInstanceSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; // 匹配首字母前导码=> 帧结构匹配前导码=> // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 @@ -44,18 +40,19 @@ public Boolean doParseProtocol(ByteBuf byteBuf) { String protocolContent = ByteBufUtil.hexDump(byteBuf); //匹配前导码 - List preCodeConfigs = leadingCodeMatcher.matchLeadingCode(protocolContent); + List preCodeConfigs = LeadingCodeMatcher.matchFrameLeadingCode(protocolContent); //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 if (preCodeConfigs.size() == 0) { - return rematch(byteBuf,protocolContent); + return rematch(byteBuf, protocolContent); } - //暂时先取第一个 + //暂时先取第一个,提升速度,使用享元模式, 减少类的创建销毁与构建 ProtocolConfig protocolConfig = preCodeConfigs.get(0); + AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); ByteBuf wholeDatagramByte = null; //通过匹配帧结构获取完整的数据包 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, preCodeConfigs.get(0))) != null) { + if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, protocolFactory)) != null) { break; } } @@ -68,76 +65,78 @@ * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 */ - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId, wholeDatagramByte); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap, protocolId); - //选取规则对应的流程实例 - DatagramEventConfig datagramEventConfig = processorInstanceSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); + //进行规则字段解析,进行匹配规则 + RuleConfig ruleConfig = getRuleConfig(protocolFactory, wholeDatagramByte); + if (ruleConfig == null) { + return false; + } //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, wholeDatagramByte); + ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte); + //以下进行业务的规则解析,同时选定流程实例 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); + DatagramEventProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain, + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText, protocolId); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain); //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); + datagramEventProvider.storeData(bizDataMap); return true; } - private Boolean rematch(ByteBuf byteBuf,String protocolContent) { + /** + * 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 + */ + private Boolean rematch(ByteBuf byteBuf, String protocolContent) { //重置位判断 byteBuf.resetReaderIndex(); //判断重置是否前移,如果没有前移,则直接判为匹配失败 if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { return false; } else { + //递归执行 return doParseProtocol(byteBuf); } } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; + //获取匹配规则->匹配规则 + private RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + //取出其中参与逻辑provider并判空 + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); + String rulePrepareFields = protocolConfig.getRulePrepareFields(); + //固定字段 + if (StringUtils.isNotEmpty(rulePrepareFields)) { + //获取统一固定字段解析 + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + //获取该协议的字段配置,用于协议规则匹配 + List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); + //获取规则 + RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, + rulePrepareFields, protocolFieldConfigs); + return ruleConfig; + } + return null; } - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + //数据构建,获取固定字段的store和业务字段store + private Map buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + Map bizDataMap = new HashMap<>(); + Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); + Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); + bizDataMap.putAll(ruleStoreObjectMap); + bizDataMap.putAll(protocolStoreObjectMap); return bizDataMap; } - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java index 8a46e32..16ce2e5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java @@ -3,6 +3,7 @@ import io.netty.buffer.ByteBuf; public interface ProtocolParser { + Boolean doParseProtocol(ByteBuf byteBuf); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java new file mode 100644 index 0000000..f7814af --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java @@ -0,0 +1,35 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.ProtocolConfigProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.ProtocolConfig; + +/** + * 存放基本协议的的加载信息 + */ +public class AbstractProtocolConfigFactory { + private final ProtocolConfigProvider protocolConfigProvider; + private final ProtocolFieldConfigProvider protocolFieldConfigProvider; + private final RuleConfigProvider ruleConfigProvider; + + public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { + this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); + this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); + this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); + } + + public ProtocolConfigProvider getProtocolConfigProvider() { + return protocolConfigProvider; + } + + public ProtocolFieldConfigProvider getProtocolFieldConfigProvider() { + return protocolFieldConfigProvider; + } + + public RuleConfigProvider getRuleConfigProvider() { + return ruleConfigProvider; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java new file mode 100644 index 0000000..6e36147 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java @@ -0,0 +1,57 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.CombinedFieldConfigProvider; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.FieldConfigProvider; +import com.casic.missiles.parser.provider.FieldRuleConfigProvider; + +/** + * 存放规则相关的的的加载信息 + */ +public class AbstractRuleConfigFactory { + + /** + * 处理字节 + */ + private final FieldConfigProvider fieldConfigProvider; + /** + * 处理组合字节解析的解码器 + */ + private final CombinedFieldConfigProvider combinedFieldConfigProvider; + /** + * 处理负责字节解析的规则配置 + */ + private final FieldRuleConfigProvider fieldRuleConfigProvider; + /** + * 处理实例流程 + */ + private final DatagramEventProvider datagramEventProvider; + + + public AbstractRuleConfigFactory(Long ruleId) { + this.fieldConfigProvider = new FieldConfigProvider(ruleId); + this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); + this.fieldRuleConfigProvider = new FieldRuleConfigProvider(ruleId); + this.datagramEventProvider = new DatagramEventProvider(ruleId); + } + + public FieldConfigProvider getFieldConfigProvider() { + return fieldConfigProvider; + } + + public CombinedFieldConfigProvider getCombinedFieldConfigProvider() { + return combinedFieldConfigProvider; + } + + public FieldRuleConfigProvider getFieldRuleConfigProvider() { + return fieldRuleConfigProvider; + } + + public DatagramEventProvider getDatagramEventProvider() { + return datagramEventProvider; + } + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java deleted file mode 100644 index 6e1719a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.factory; - - -import com.casic.missiles.pojo.ProtocolConfig; - -import java.util.List; - -/** - * 数据库访问优化(暂时未做) - *

- * 1、初始化协议解析配置,并存放到处存放缓存,对协议基本配置进行管理 - * 2、其中流程中所有的配置都经过此类进行管理,进行调用获取,增强解析速度 - */ -public interface DatagramFactory { - - /** - * 初始化 - */ - List datagramInit(); - - /** - * 根据前导码配置匹配,模糊匹配获取所有的报文项 - */ - List match(); - - /** - * 根据前导码匹配,返回报文项 - */ - List filer(); - - /** - * 保证数据的唯一性选择器 - */ - List selectOne(); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java new file mode 100644 index 0000000..87444a0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java @@ -0,0 +1,18 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +import java.util.List; + +/** + * 直接用,还是边用边创建 + */ +public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { + + + public DefaultProtocolConfigFactory(ProtocolConfig protocolConfig) { + super(protocolConfig); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java new file mode 100644 index 0000000..cce0c7c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java @@ -0,0 +1,12 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; + +public class DefaultRuleFactory extends AbstractRuleConfigFactory { + + public DefaultRuleFactory(Long ruleId) { + super(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java index 608af3a..32cc8a4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java @@ -2,48 +2,47 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.delivery.decorator.ByteDecorator; +import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @AllArgsConstructor public class FieldDecoratorManger { - private final RuleDictDao ruleDictDao; + private final RuleConfigRegistry ruleDictDao; // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 // (1)静态的业务字段是字典里面可以配置的 // (2)动态的业务字段是通过规则生成的 public String contentMerge(String ruleJson, String sceneConent, String dynamicContent) { - List ruleDictList = ruleDictDao.getRuleDictConfig(); - Map ruleDictMap = ruleDictList.stream().collect( - Collectors.toMap(RuleDict::getId, e -> e)); - List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); - for (Map ruleMap : ruleMapList) { - String ruleType = String.valueOf(ruleMap.get("ruleType")); - ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); - NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); - byteDecorator.nodeDecoratorRule(nodeDecoratorParm); - } +// List ruleDictList = ruleDictDao.getRuleDictConfig(); +// Map ruleDictMap = ruleDictList.stream().collect( +// Collectors.toMap(RuleDict::getId, e -> e)); +// List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); +// for (Map ruleMap : ruleMapList) { +// String ruleType = String.valueOf(ruleMap.get("ruleType")); +// ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); +// NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); +// byteDecorator.nodeDecoratorRule(nodeDecoratorParm); +// } return null; } - - private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { - NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() - .contents(sceneConent) - .dynamicContent(dynamicContent) - .ruletypeId(ruletypeId) - .ruleDictMap(ruleDictMap) - .build(); - return nodeDecoratorParm; - } +// +// private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { +// NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() +// .contents(sceneConent) +// .dynamicContent(dynamicContent) +// .ruletypeId(ruletypeId) +// .ruleDictMap(ruleDictMap) +// .build(); +// return nodeDecoratorParm; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java index 652970c..b204ac3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java @@ -1,56 +1,56 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@AllArgsConstructor -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", - JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Component; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Component("logicalDecorator") +//@AllArgsConstructor +//@Slf4j +//public class LogicalShiftDecorator implements ByteDecorator { +// +//// private final FieldRuleEngineMapper fieldRuleEngineMapper; +//// +//// //字节位移 +//// @Override +//// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +//// String logicalValue = ""; +//// RuleEvaluator fieldRuleEngine = new RuleEvaluator(); +//// try { +//// Map env2 = new HashMap(); +//// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +//// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +//// for (String contentId : contentIdList) { +//// RuleDict ruleDict = ruleDictMap.get(contentId); +//// if (ruleDict.getCode().contains("#")) { +//// //使用动态的值 +//// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +//// } +//// env2.put(ruleDict.getName(), ruleDict.getCode()); +//// } +//// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +//// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +//// return null; +//// } +//// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +//// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +//// return values; +//// } catch (Exception ex) { +//// log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", +//// JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +//// return null; +//// } +//// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java index 346468f..822fead 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@AllArgsConstructor -@Slf4j -public class OperationDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("optionDecorator") +//@AllArgsConstructor +//@Slf4j +//public class OperationDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //混合运算,有常量或者乘除的缩放 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java index 50fb0a7..7a8bccb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@AllArgsConstructor -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +////精度计算 +//@AllArgsConstructor +//@Registry("precisionDecorator") +//@Slf4j +//public class PrecisionDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java index da39235..27f9cc7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java @@ -1,54 +1,53 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@AllArgsConstructor -@Slf4j -public class RuleDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("ruleDecorator") +//@AllArgsConstructor +//@Slf4j +//public class RuleDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //吃我一套正则表达式 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (Exception ex) { +// log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java index 7f5cbf3..c043f97 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java @@ -2,6 +2,6 @@ import java.util.Map; -public interface ComandeEventService { +public interface ComandeEventService{ Map loadComandeEventConfig(String protocolId,String scene); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java index 476ad84..aaf1837 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java @@ -2,46 +2,46 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.dao.CommandEventDao; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @Slf4j @AllArgsConstructor -public class ComandeEventServiceImpl implements ComandeEventService { +public class ComandeEventServiceImpl implements ComandeEventRegistry { - private final CommandEventDao commandEventDao; + // private final CommandEventDao commandEventDao; // 加密bean 固定字段出现变化的字段解析,业务字段的有序内容 @Override - public Map loadComandeEventConfig(String protocolId,String sceneName) { - CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); - if (ObjectUtil.isEmpty(commandEventConfig)) { - log.error("协议{},没有配置成功接收回复配置,清排查原因"); - return null; - } - String replyJson = commandEventConfig.getReplyContentJson(); - List> replyMapList = JSONArray.parseObject(replyJson, List.class); - List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); - Map fixMap = fixList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); - List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) - .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) - .collect(Collectors.toList()); - Map commandConfigMap = new HashMap<>(); - commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); - commandConfigMap.put("fixContent", fixMap); - commandConfigMap.put("bizContent", contentList); - return commandConfigMap; + public Map loadComandeEventConfig(String protocolId, String sceneName) { +// CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); +// if (ObjectUtil.isEmpty(commandEventConfig)) { +// log.error("协议{},没有配置成功接收回复配置,清排查原因"); +// return null; +// } +// String replyJson = commandEventConfig.getReplyContentJson(); +// List> replyMapList = JSONArray.parseObject(replyJson, List.class); +// List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); +// Map fixMap = fixList.stream() +// .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); +// List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) +// .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) +// .collect(Collectors.toList()); +// Map commandConfigMap = new HashMap<>(); +// commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); +// commandConfigMap.put("fixContent", fixMap); +// commandConfigMap.put("bizContent", contentList); +// return commandConfigMap; + return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 128b09d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java deleted file mode 100644 index 4016b0b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface DatagramEventMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java deleted file mode 100644 index 597c306..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.apache.ibatis.annotations.Mapper; - -public interface FieldConfigMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java deleted file mode 100644 index a31680a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.PreRuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface PreRuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java deleted file mode 100644 index 9060a69..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface ProtocolConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java deleted file mode 100644 index 6fa6936..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java deleted file mode 100644 index 582a705..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleDict; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleDictMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java deleted file mode 100644 index 6e302c8..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.CommandEventMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Optional; - -@Component -public class CommandEventDao { - - @Resource - private CommandEventMapper commandEventMapper; - - public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId) - .eq("scene", sceneName) - .eq("enabled", 1); - List commandEventConfig = commandEventMapper.selectList(queryWrapper); - Optional optionalEventConfig = commandEventConfig.stream().findFirst(); - return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java deleted file mode 100644 index 9137e4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.FieldConfigMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class FieldConfigDao { - - @Resource - private FieldConfigMapper fieldConfigMapper; - - public FieldConfig getFieldConfigById(String fieldId) { - FieldConfig fieldConfig = fieldConfigMapper.selectById(fieldId); - return fieldConfig; - } - - public List getFieldConfigs(String protocolId,Integer isFixed) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",isFixed); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - - public List getStorageFieldConfig(String protocolId) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",1) - .eq("is_storage",1); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java deleted file mode 100644 index 67bff6b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.mapper.PreRuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class PreRuleConfigDao { - - @Resource - private PreRuleConfigMapper preRuleConfigMapper; - - public List getPreRuleList(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return preRuleConfigMapper.selectList(queryWrapper); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java deleted file mode 100644 index d69ea85..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.RuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleConfigDao { - - @Resource - private RuleConfigMapper ruleConfigMapper; - - public RuleConfig getNextRuleConfig(String ruleFields) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("parse_rule_json", ruleFields); - return ruleConfigMapper.selectOne(queryWrapper); - } - - - public List getRuleConfigById(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return ruleConfigMapper.selectList(queryWrapper); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java deleted file mode 100644 index 932c185..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.RuleDictMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleDictDao { - - @Resource - private RuleDictMapper ruleDictMapper; - - public List getRuleDictConfig() { - List ruleDictList = ruleDictMapper.selectList(null); - return ruleDictList; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java index 9f9e279..43bc4d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java @@ -10,20 +10,15 @@ import io.netty.channel.socket.nio.NioServerSocketChannel; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import javax.annotation.PreDestroy; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static cn.hutool.core.util.ClassUtil.getClasses; /** * SensorhubServer netty服务端 */ @Slf4j -@Service +@Component public class SensorhubServer { /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java index 2c79ff5..9a28c36 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java @@ -11,13 +11,13 @@ import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioSocketChannel; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClient 客户端 */ @Slf4j -@Service +@Registry public final class SensorhubClient { public static void main(String[] args) throws Exception { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java index 9774be0..477c3f7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java @@ -6,12 +6,12 @@ import io.netty.channel.socket.SocketChannel; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientChannelInitialHandler */ -@Service +@Registry public class SensorhubClientChannelInitialHandler extends ChannelInitializer { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java index 346f4b3..73560e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java @@ -5,13 +5,13 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientHandler */ @Slf4j -@Service +@Registry public class SensorhubClientHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java index 5c1c6f2..d990af5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java @@ -4,12 +4,12 @@ import com.casic.missiles.pojo.Msg; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** * SensorhubServerHandler */ -@Service +@Component public class SensorhubServerHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 67283ae..af3172c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,41 +1,37 @@ package com.casic.missiles.parser; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultProtocolConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.*; +import com.casic.missiles.registry.FieldConfigRegistry; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; -import java.nio.charset.Charset; import java.util.HashMap; import java.util.List; import java.util.Map; -@Service("genericProtocolParser") +/** + * @author + */ +@Component("genericProtocolParser") @Slf4j -@AllArgsConstructor +@RequiredArgsConstructor public class GenericProtocolParser implements ProtocolParser { - private final LeadingCodeMatcher leadingCodeMatcher; private final List frameStructDispenserList; - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorInstanceSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; // 匹配首字母前导码=> 帧结构匹配前导码=> // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 @@ -44,18 +40,19 @@ public Boolean doParseProtocol(ByteBuf byteBuf) { String protocolContent = ByteBufUtil.hexDump(byteBuf); //匹配前导码 - List preCodeConfigs = leadingCodeMatcher.matchLeadingCode(protocolContent); + List preCodeConfigs = LeadingCodeMatcher.matchFrameLeadingCode(protocolContent); //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 if (preCodeConfigs.size() == 0) { - return rematch(byteBuf,protocolContent); + return rematch(byteBuf, protocolContent); } - //暂时先取第一个 + //暂时先取第一个,提升速度,使用享元模式, 减少类的创建销毁与构建 ProtocolConfig protocolConfig = preCodeConfigs.get(0); + AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); ByteBuf wholeDatagramByte = null; //通过匹配帧结构获取完整的数据包 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, preCodeConfigs.get(0))) != null) { + if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, protocolFactory)) != null) { break; } } @@ -68,76 +65,78 @@ * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 */ - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId, wholeDatagramByte); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap, protocolId); - //选取规则对应的流程实例 - DatagramEventConfig datagramEventConfig = processorInstanceSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); + //进行规则字段解析,进行匹配规则 + RuleConfig ruleConfig = getRuleConfig(protocolFactory, wholeDatagramByte); + if (ruleConfig == null) { + return false; + } //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, wholeDatagramByte); + ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte); + //以下进行业务的规则解析,同时选定流程实例 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); + DatagramEventProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain, + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText, protocolId); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain); //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); + datagramEventProvider.storeData(bizDataMap); return true; } - private Boolean rematch(ByteBuf byteBuf,String protocolContent) { + /** + * 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 + */ + private Boolean rematch(ByteBuf byteBuf, String protocolContent) { //重置位判断 byteBuf.resetReaderIndex(); //判断重置是否前移,如果没有前移,则直接判为匹配失败 if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { return false; } else { + //递归执行 return doParseProtocol(byteBuf); } } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; + //获取匹配规则->匹配规则 + private RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + //取出其中参与逻辑provider并判空 + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); + String rulePrepareFields = protocolConfig.getRulePrepareFields(); + //固定字段 + if (StringUtils.isNotEmpty(rulePrepareFields)) { + //获取统一固定字段解析 + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + //获取该协议的字段配置,用于协议规则匹配 + List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); + //获取规则 + RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, + rulePrepareFields, protocolFieldConfigs); + return ruleConfig; + } + return null; } - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + //数据构建,获取固定字段的store和业务字段store + private Map buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + Map bizDataMap = new HashMap<>(); + Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); + Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); + bizDataMap.putAll(ruleStoreObjectMap); + bizDataMap.putAll(protocolStoreObjectMap); return bizDataMap; } - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java index 8a46e32..16ce2e5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java @@ -3,6 +3,7 @@ import io.netty.buffer.ByteBuf; public interface ProtocolParser { + Boolean doParseProtocol(ByteBuf byteBuf); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java new file mode 100644 index 0000000..f7814af --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java @@ -0,0 +1,35 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.ProtocolConfigProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.ProtocolConfig; + +/** + * 存放基本协议的的加载信息 + */ +public class AbstractProtocolConfigFactory { + private final ProtocolConfigProvider protocolConfigProvider; + private final ProtocolFieldConfigProvider protocolFieldConfigProvider; + private final RuleConfigProvider ruleConfigProvider; + + public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { + this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); + this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); + this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); + } + + public ProtocolConfigProvider getProtocolConfigProvider() { + return protocolConfigProvider; + } + + public ProtocolFieldConfigProvider getProtocolFieldConfigProvider() { + return protocolFieldConfigProvider; + } + + public RuleConfigProvider getRuleConfigProvider() { + return ruleConfigProvider; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java new file mode 100644 index 0000000..6e36147 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java @@ -0,0 +1,57 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.CombinedFieldConfigProvider; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.FieldConfigProvider; +import com.casic.missiles.parser.provider.FieldRuleConfigProvider; + +/** + * 存放规则相关的的的加载信息 + */ +public class AbstractRuleConfigFactory { + + /** + * 处理字节 + */ + private final FieldConfigProvider fieldConfigProvider; + /** + * 处理组合字节解析的解码器 + */ + private final CombinedFieldConfigProvider combinedFieldConfigProvider; + /** + * 处理负责字节解析的规则配置 + */ + private final FieldRuleConfigProvider fieldRuleConfigProvider; + /** + * 处理实例流程 + */ + private final DatagramEventProvider datagramEventProvider; + + + public AbstractRuleConfigFactory(Long ruleId) { + this.fieldConfigProvider = new FieldConfigProvider(ruleId); + this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); + this.fieldRuleConfigProvider = new FieldRuleConfigProvider(ruleId); + this.datagramEventProvider = new DatagramEventProvider(ruleId); + } + + public FieldConfigProvider getFieldConfigProvider() { + return fieldConfigProvider; + } + + public CombinedFieldConfigProvider getCombinedFieldConfigProvider() { + return combinedFieldConfigProvider; + } + + public FieldRuleConfigProvider getFieldRuleConfigProvider() { + return fieldRuleConfigProvider; + } + + public DatagramEventProvider getDatagramEventProvider() { + return datagramEventProvider; + } + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java deleted file mode 100644 index 6e1719a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.factory; - - -import com.casic.missiles.pojo.ProtocolConfig; - -import java.util.List; - -/** - * 数据库访问优化(暂时未做) - *

- * 1、初始化协议解析配置,并存放到处存放缓存,对协议基本配置进行管理 - * 2、其中流程中所有的配置都经过此类进行管理,进行调用获取,增强解析速度 - */ -public interface DatagramFactory { - - /** - * 初始化 - */ - List datagramInit(); - - /** - * 根据前导码配置匹配,模糊匹配获取所有的报文项 - */ - List match(); - - /** - * 根据前导码匹配,返回报文项 - */ - List filer(); - - /** - * 保证数据的唯一性选择器 - */ - List selectOne(); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java new file mode 100644 index 0000000..87444a0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java @@ -0,0 +1,18 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +import java.util.List; + +/** + * 直接用,还是边用边创建 + */ +public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { + + + public DefaultProtocolConfigFactory(ProtocolConfig protocolConfig) { + super(protocolConfig); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java new file mode 100644 index 0000000..cce0c7c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java @@ -0,0 +1,12 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; + +public class DefaultRuleFactory extends AbstractRuleConfigFactory { + + public DefaultRuleFactory(Long ruleId) { + super(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java deleted file mode 100644 index 9ee97e0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.casic.missiles.parser.instance; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service -@Slf4j -@AllArgsConstructor -public class GeneralProcessor { - - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; - - /** - * 统一固定字段解析=>进行规则的查询的判断 - * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 - * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 - */ - @Deprecated - public boolean parseWholeDatagram(ByteBuf buffer, ProtocolConfig protocolConfig) { - try { - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap,protocolId); - //选取规则对应的流程= - DatagramEventConfig datagramEventConfig = processorSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); - //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); - //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); - //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); - //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); - //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); - return true; - } catch (Exception ex) { - log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", - ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); - return false; - } - } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; - } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); - } - - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); - return bizDataMap; - } - - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java index 608af3a..32cc8a4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java @@ -2,48 +2,47 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.delivery.decorator.ByteDecorator; +import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @AllArgsConstructor public class FieldDecoratorManger { - private final RuleDictDao ruleDictDao; + private final RuleConfigRegistry ruleDictDao; // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 // (1)静态的业务字段是字典里面可以配置的 // (2)动态的业务字段是通过规则生成的 public String contentMerge(String ruleJson, String sceneConent, String dynamicContent) { - List ruleDictList = ruleDictDao.getRuleDictConfig(); - Map ruleDictMap = ruleDictList.stream().collect( - Collectors.toMap(RuleDict::getId, e -> e)); - List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); - for (Map ruleMap : ruleMapList) { - String ruleType = String.valueOf(ruleMap.get("ruleType")); - ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); - NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); - byteDecorator.nodeDecoratorRule(nodeDecoratorParm); - } +// List ruleDictList = ruleDictDao.getRuleDictConfig(); +// Map ruleDictMap = ruleDictList.stream().collect( +// Collectors.toMap(RuleDict::getId, e -> e)); +// List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); +// for (Map ruleMap : ruleMapList) { +// String ruleType = String.valueOf(ruleMap.get("ruleType")); +// ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); +// NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); +// byteDecorator.nodeDecoratorRule(nodeDecoratorParm); +// } return null; } - - private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { - NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() - .contents(sceneConent) - .dynamicContent(dynamicContent) - .ruletypeId(ruletypeId) - .ruleDictMap(ruleDictMap) - .build(); - return nodeDecoratorParm; - } +// +// private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { +// NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() +// .contents(sceneConent) +// .dynamicContent(dynamicContent) +// .ruletypeId(ruletypeId) +// .ruleDictMap(ruleDictMap) +// .build(); +// return nodeDecoratorParm; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java index 652970c..b204ac3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java @@ -1,56 +1,56 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@AllArgsConstructor -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", - JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Component; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Component("logicalDecorator") +//@AllArgsConstructor +//@Slf4j +//public class LogicalShiftDecorator implements ByteDecorator { +// +//// private final FieldRuleEngineMapper fieldRuleEngineMapper; +//// +//// //字节位移 +//// @Override +//// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +//// String logicalValue = ""; +//// RuleEvaluator fieldRuleEngine = new RuleEvaluator(); +//// try { +//// Map env2 = new HashMap(); +//// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +//// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +//// for (String contentId : contentIdList) { +//// RuleDict ruleDict = ruleDictMap.get(contentId); +//// if (ruleDict.getCode().contains("#")) { +//// //使用动态的值 +//// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +//// } +//// env2.put(ruleDict.getName(), ruleDict.getCode()); +//// } +//// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +//// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +//// return null; +//// } +//// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +//// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +//// return values; +//// } catch (Exception ex) { +//// log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", +//// JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +//// return null; +//// } +//// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java index 346468f..822fead 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@AllArgsConstructor -@Slf4j -public class OperationDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("optionDecorator") +//@AllArgsConstructor +//@Slf4j +//public class OperationDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //混合运算,有常量或者乘除的缩放 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java index 50fb0a7..7a8bccb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@AllArgsConstructor -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +////精度计算 +//@AllArgsConstructor +//@Registry("precisionDecorator") +//@Slf4j +//public class PrecisionDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java index da39235..27f9cc7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java @@ -1,54 +1,53 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@AllArgsConstructor -@Slf4j -public class RuleDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("ruleDecorator") +//@AllArgsConstructor +//@Slf4j +//public class RuleDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //吃我一套正则表达式 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (Exception ex) { +// log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java index 7f5cbf3..c043f97 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java @@ -2,6 +2,6 @@ import java.util.Map; -public interface ComandeEventService { +public interface ComandeEventService{ Map loadComandeEventConfig(String protocolId,String scene); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java index 476ad84..aaf1837 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java @@ -2,46 +2,46 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.dao.CommandEventDao; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @Slf4j @AllArgsConstructor -public class ComandeEventServiceImpl implements ComandeEventService { +public class ComandeEventServiceImpl implements ComandeEventRegistry { - private final CommandEventDao commandEventDao; + // private final CommandEventDao commandEventDao; // 加密bean 固定字段出现变化的字段解析,业务字段的有序内容 @Override - public Map loadComandeEventConfig(String protocolId,String sceneName) { - CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); - if (ObjectUtil.isEmpty(commandEventConfig)) { - log.error("协议{},没有配置成功接收回复配置,清排查原因"); - return null; - } - String replyJson = commandEventConfig.getReplyContentJson(); - List> replyMapList = JSONArray.parseObject(replyJson, List.class); - List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); - Map fixMap = fixList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); - List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) - .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) - .collect(Collectors.toList()); - Map commandConfigMap = new HashMap<>(); - commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); - commandConfigMap.put("fixContent", fixMap); - commandConfigMap.put("bizContent", contentList); - return commandConfigMap; + public Map loadComandeEventConfig(String protocolId, String sceneName) { +// CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); +// if (ObjectUtil.isEmpty(commandEventConfig)) { +// log.error("协议{},没有配置成功接收回复配置,清排查原因"); +// return null; +// } +// String replyJson = commandEventConfig.getReplyContentJson(); +// List> replyMapList = JSONArray.parseObject(replyJson, List.class); +// List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); +// Map fixMap = fixList.stream() +// .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); +// List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) +// .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) +// .collect(Collectors.toList()); +// Map commandConfigMap = new HashMap<>(); +// commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); +// commandConfigMap.put("fixContent", fixMap); +// commandConfigMap.put("bizContent", contentList); +// return commandConfigMap; + return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 128b09d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java deleted file mode 100644 index 4016b0b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface DatagramEventMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java deleted file mode 100644 index 597c306..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.apache.ibatis.annotations.Mapper; - -public interface FieldConfigMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java deleted file mode 100644 index a31680a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.PreRuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface PreRuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java deleted file mode 100644 index 9060a69..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface ProtocolConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java deleted file mode 100644 index 6fa6936..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java deleted file mode 100644 index 582a705..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleDict; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleDictMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java deleted file mode 100644 index 6e302c8..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.CommandEventMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Optional; - -@Component -public class CommandEventDao { - - @Resource - private CommandEventMapper commandEventMapper; - - public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId) - .eq("scene", sceneName) - .eq("enabled", 1); - List commandEventConfig = commandEventMapper.selectList(queryWrapper); - Optional optionalEventConfig = commandEventConfig.stream().findFirst(); - return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java deleted file mode 100644 index 9137e4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.FieldConfigMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class FieldConfigDao { - - @Resource - private FieldConfigMapper fieldConfigMapper; - - public FieldConfig getFieldConfigById(String fieldId) { - FieldConfig fieldConfig = fieldConfigMapper.selectById(fieldId); - return fieldConfig; - } - - public List getFieldConfigs(String protocolId,Integer isFixed) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",isFixed); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - - public List getStorageFieldConfig(String protocolId) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",1) - .eq("is_storage",1); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java deleted file mode 100644 index 67bff6b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.mapper.PreRuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class PreRuleConfigDao { - - @Resource - private PreRuleConfigMapper preRuleConfigMapper; - - public List getPreRuleList(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return preRuleConfigMapper.selectList(queryWrapper); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java deleted file mode 100644 index d69ea85..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.RuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleConfigDao { - - @Resource - private RuleConfigMapper ruleConfigMapper; - - public RuleConfig getNextRuleConfig(String ruleFields) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("parse_rule_json", ruleFields); - return ruleConfigMapper.selectOne(queryWrapper); - } - - - public List getRuleConfigById(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return ruleConfigMapper.selectList(queryWrapper); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java deleted file mode 100644 index 932c185..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.RuleDictMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleDictDao { - - @Resource - private RuleDictMapper ruleDictMapper; - - public List getRuleDictConfig() { - List ruleDictList = ruleDictMapper.selectList(null); - return ruleDictList; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java index 9f9e279..43bc4d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java @@ -10,20 +10,15 @@ import io.netty.channel.socket.nio.NioServerSocketChannel; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import javax.annotation.PreDestroy; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static cn.hutool.core.util.ClassUtil.getClasses; /** * SensorhubServer netty服务端 */ @Slf4j -@Service +@Component public class SensorhubServer { /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java index 2c79ff5..9a28c36 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java @@ -11,13 +11,13 @@ import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioSocketChannel; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClient 客户端 */ @Slf4j -@Service +@Registry public final class SensorhubClient { public static void main(String[] args) throws Exception { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java index 9774be0..477c3f7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java @@ -6,12 +6,12 @@ import io.netty.channel.socket.SocketChannel; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientChannelInitialHandler */ -@Service +@Registry public class SensorhubClientChannelInitialHandler extends ChannelInitializer { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java index 346f4b3..73560e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java @@ -5,13 +5,13 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientHandler */ @Slf4j -@Service +@Registry public class SensorhubClientHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java index 5c1c6f2..d990af5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java @@ -4,12 +4,12 @@ import com.casic.missiles.pojo.Msg; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** * SensorhubServerHandler */ -@Service +@Component public class SensorhubServerHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 67283ae..af3172c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,41 +1,37 @@ package com.casic.missiles.parser; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultProtocolConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.*; +import com.casic.missiles.registry.FieldConfigRegistry; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; -import java.nio.charset.Charset; import java.util.HashMap; import java.util.List; import java.util.Map; -@Service("genericProtocolParser") +/** + * @author + */ +@Component("genericProtocolParser") @Slf4j -@AllArgsConstructor +@RequiredArgsConstructor public class GenericProtocolParser implements ProtocolParser { - private final LeadingCodeMatcher leadingCodeMatcher; private final List frameStructDispenserList; - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorInstanceSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; // 匹配首字母前导码=> 帧结构匹配前导码=> // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 @@ -44,18 +40,19 @@ public Boolean doParseProtocol(ByteBuf byteBuf) { String protocolContent = ByteBufUtil.hexDump(byteBuf); //匹配前导码 - List preCodeConfigs = leadingCodeMatcher.matchLeadingCode(protocolContent); + List preCodeConfigs = LeadingCodeMatcher.matchFrameLeadingCode(protocolContent); //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 if (preCodeConfigs.size() == 0) { - return rematch(byteBuf,protocolContent); + return rematch(byteBuf, protocolContent); } - //暂时先取第一个 + //暂时先取第一个,提升速度,使用享元模式, 减少类的创建销毁与构建 ProtocolConfig protocolConfig = preCodeConfigs.get(0); + AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); ByteBuf wholeDatagramByte = null; //通过匹配帧结构获取完整的数据包 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, preCodeConfigs.get(0))) != null) { + if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, protocolFactory)) != null) { break; } } @@ -68,76 +65,78 @@ * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 */ - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId, wholeDatagramByte); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap, protocolId); - //选取规则对应的流程实例 - DatagramEventConfig datagramEventConfig = processorInstanceSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); + //进行规则字段解析,进行匹配规则 + RuleConfig ruleConfig = getRuleConfig(protocolFactory, wholeDatagramByte); + if (ruleConfig == null) { + return false; + } //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, wholeDatagramByte); + ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte); + //以下进行业务的规则解析,同时选定流程实例 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); + DatagramEventProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain, + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText, protocolId); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain); //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); + datagramEventProvider.storeData(bizDataMap); return true; } - private Boolean rematch(ByteBuf byteBuf,String protocolContent) { + /** + * 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 + */ + private Boolean rematch(ByteBuf byteBuf, String protocolContent) { //重置位判断 byteBuf.resetReaderIndex(); //判断重置是否前移,如果没有前移,则直接判为匹配失败 if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { return false; } else { + //递归执行 return doParseProtocol(byteBuf); } } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; + //获取匹配规则->匹配规则 + private RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + //取出其中参与逻辑provider并判空 + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); + String rulePrepareFields = protocolConfig.getRulePrepareFields(); + //固定字段 + if (StringUtils.isNotEmpty(rulePrepareFields)) { + //获取统一固定字段解析 + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + //获取该协议的字段配置,用于协议规则匹配 + List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); + //获取规则 + RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, + rulePrepareFields, protocolFieldConfigs); + return ruleConfig; + } + return null; } - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + //数据构建,获取固定字段的store和业务字段store + private Map buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + Map bizDataMap = new HashMap<>(); + Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); + Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); + bizDataMap.putAll(ruleStoreObjectMap); + bizDataMap.putAll(protocolStoreObjectMap); return bizDataMap; } - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java index 8a46e32..16ce2e5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java @@ -3,6 +3,7 @@ import io.netty.buffer.ByteBuf; public interface ProtocolParser { + Boolean doParseProtocol(ByteBuf byteBuf); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java new file mode 100644 index 0000000..f7814af --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java @@ -0,0 +1,35 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.ProtocolConfigProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.ProtocolConfig; + +/** + * 存放基本协议的的加载信息 + */ +public class AbstractProtocolConfigFactory { + private final ProtocolConfigProvider protocolConfigProvider; + private final ProtocolFieldConfigProvider protocolFieldConfigProvider; + private final RuleConfigProvider ruleConfigProvider; + + public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { + this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); + this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); + this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); + } + + public ProtocolConfigProvider getProtocolConfigProvider() { + return protocolConfigProvider; + } + + public ProtocolFieldConfigProvider getProtocolFieldConfigProvider() { + return protocolFieldConfigProvider; + } + + public RuleConfigProvider getRuleConfigProvider() { + return ruleConfigProvider; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java new file mode 100644 index 0000000..6e36147 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java @@ -0,0 +1,57 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.CombinedFieldConfigProvider; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.FieldConfigProvider; +import com.casic.missiles.parser.provider.FieldRuleConfigProvider; + +/** + * 存放规则相关的的的加载信息 + */ +public class AbstractRuleConfigFactory { + + /** + * 处理字节 + */ + private final FieldConfigProvider fieldConfigProvider; + /** + * 处理组合字节解析的解码器 + */ + private final CombinedFieldConfigProvider combinedFieldConfigProvider; + /** + * 处理负责字节解析的规则配置 + */ + private final FieldRuleConfigProvider fieldRuleConfigProvider; + /** + * 处理实例流程 + */ + private final DatagramEventProvider datagramEventProvider; + + + public AbstractRuleConfigFactory(Long ruleId) { + this.fieldConfigProvider = new FieldConfigProvider(ruleId); + this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); + this.fieldRuleConfigProvider = new FieldRuleConfigProvider(ruleId); + this.datagramEventProvider = new DatagramEventProvider(ruleId); + } + + public FieldConfigProvider getFieldConfigProvider() { + return fieldConfigProvider; + } + + public CombinedFieldConfigProvider getCombinedFieldConfigProvider() { + return combinedFieldConfigProvider; + } + + public FieldRuleConfigProvider getFieldRuleConfigProvider() { + return fieldRuleConfigProvider; + } + + public DatagramEventProvider getDatagramEventProvider() { + return datagramEventProvider; + } + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java deleted file mode 100644 index 6e1719a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.factory; - - -import com.casic.missiles.pojo.ProtocolConfig; - -import java.util.List; - -/** - * 数据库访问优化(暂时未做) - *

- * 1、初始化协议解析配置,并存放到处存放缓存,对协议基本配置进行管理 - * 2、其中流程中所有的配置都经过此类进行管理,进行调用获取,增强解析速度 - */ -public interface DatagramFactory { - - /** - * 初始化 - */ - List datagramInit(); - - /** - * 根据前导码配置匹配,模糊匹配获取所有的报文项 - */ - List match(); - - /** - * 根据前导码匹配,返回报文项 - */ - List filer(); - - /** - * 保证数据的唯一性选择器 - */ - List selectOne(); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java new file mode 100644 index 0000000..87444a0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java @@ -0,0 +1,18 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +import java.util.List; + +/** + * 直接用,还是边用边创建 + */ +public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { + + + public DefaultProtocolConfigFactory(ProtocolConfig protocolConfig) { + super(protocolConfig); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java new file mode 100644 index 0000000..cce0c7c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java @@ -0,0 +1,12 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; + +public class DefaultRuleFactory extends AbstractRuleConfigFactory { + + public DefaultRuleFactory(Long ruleId) { + super(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java deleted file mode 100644 index 9ee97e0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.casic.missiles.parser.instance; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service -@Slf4j -@AllArgsConstructor -public class GeneralProcessor { - - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; - - /** - * 统一固定字段解析=>进行规则的查询的判断 - * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 - * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 - */ - @Deprecated - public boolean parseWholeDatagram(ByteBuf buffer, ProtocolConfig protocolConfig) { - try { - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap,protocolId); - //选取规则对应的流程= - DatagramEventConfig datagramEventConfig = processorSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); - //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); - //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); - //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); - //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); - //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); - return true; - } catch (Exception ex) { - log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", - ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); - return false; - } - } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; - } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); - } - - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); - return bizDataMap; - } - - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java index 25e7ad8..6a5777e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java @@ -1,23 +1,31 @@ package com.casic.missiles.parser.instance.impl; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.mapper.DatagramEventMapper; import com.casic.missiles.pojo.DatagramEventConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.SpringContextUtil; -@Service -@AllArgsConstructor +import java.util.List; +import java.util.Optional; + +/** + * @author cz + * + */ public class DefaultProcessorInstanceSelector implements ProcessorInstanceSelector { - private final DatagramEventMapper datagramEventMapper; + private static List datagramEventConfigs; + + static { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + datagramEventConfigs = datagramEventRegistry.getDatagramEventList(); + } @Override public DatagramEventConfig getProcessorInstance(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("rule_id", protocolId); - return datagramEventMapper.selectOne(queryWrapper); + Optional optionalSelectInstance = datagramEventConfigs.stream() + .filter(e -> e.getId().equals(protocolId)).limit(1).findFirst(); + return optionalSelectInstance.isPresent() ? optionalSelectInstance.get() : null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java index 608af3a..32cc8a4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java @@ -2,48 +2,47 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.delivery.decorator.ByteDecorator; +import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @AllArgsConstructor public class FieldDecoratorManger { - private final RuleDictDao ruleDictDao; + private final RuleConfigRegistry ruleDictDao; // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 // (1)静态的业务字段是字典里面可以配置的 // (2)动态的业务字段是通过规则生成的 public String contentMerge(String ruleJson, String sceneConent, String dynamicContent) { - List ruleDictList = ruleDictDao.getRuleDictConfig(); - Map ruleDictMap = ruleDictList.stream().collect( - Collectors.toMap(RuleDict::getId, e -> e)); - List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); - for (Map ruleMap : ruleMapList) { - String ruleType = String.valueOf(ruleMap.get("ruleType")); - ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); - NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); - byteDecorator.nodeDecoratorRule(nodeDecoratorParm); - } +// List ruleDictList = ruleDictDao.getRuleDictConfig(); +// Map ruleDictMap = ruleDictList.stream().collect( +// Collectors.toMap(RuleDict::getId, e -> e)); +// List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); +// for (Map ruleMap : ruleMapList) { +// String ruleType = String.valueOf(ruleMap.get("ruleType")); +// ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); +// NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); +// byteDecorator.nodeDecoratorRule(nodeDecoratorParm); +// } return null; } - - private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { - NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() - .contents(sceneConent) - .dynamicContent(dynamicContent) - .ruletypeId(ruletypeId) - .ruleDictMap(ruleDictMap) - .build(); - return nodeDecoratorParm; - } +// +// private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { +// NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() +// .contents(sceneConent) +// .dynamicContent(dynamicContent) +// .ruletypeId(ruletypeId) +// .ruleDictMap(ruleDictMap) +// .build(); +// return nodeDecoratorParm; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java index 652970c..b204ac3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java @@ -1,56 +1,56 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@AllArgsConstructor -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", - JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Component; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Component("logicalDecorator") +//@AllArgsConstructor +//@Slf4j +//public class LogicalShiftDecorator implements ByteDecorator { +// +//// private final FieldRuleEngineMapper fieldRuleEngineMapper; +//// +//// //字节位移 +//// @Override +//// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +//// String logicalValue = ""; +//// RuleEvaluator fieldRuleEngine = new RuleEvaluator(); +//// try { +//// Map env2 = new HashMap(); +//// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +//// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +//// for (String contentId : contentIdList) { +//// RuleDict ruleDict = ruleDictMap.get(contentId); +//// if (ruleDict.getCode().contains("#")) { +//// //使用动态的值 +//// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +//// } +//// env2.put(ruleDict.getName(), ruleDict.getCode()); +//// } +//// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +//// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +//// return null; +//// } +//// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +//// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +//// return values; +//// } catch (Exception ex) { +//// log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", +//// JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +//// return null; +//// } +//// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java index 346468f..822fead 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@AllArgsConstructor -@Slf4j -public class OperationDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("optionDecorator") +//@AllArgsConstructor +//@Slf4j +//public class OperationDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //混合运算,有常量或者乘除的缩放 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java index 50fb0a7..7a8bccb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@AllArgsConstructor -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +////精度计算 +//@AllArgsConstructor +//@Registry("precisionDecorator") +//@Slf4j +//public class PrecisionDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java index da39235..27f9cc7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java @@ -1,54 +1,53 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@AllArgsConstructor -@Slf4j -public class RuleDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("ruleDecorator") +//@AllArgsConstructor +//@Slf4j +//public class RuleDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //吃我一套正则表达式 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (Exception ex) { +// log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java index 7f5cbf3..c043f97 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java @@ -2,6 +2,6 @@ import java.util.Map; -public interface ComandeEventService { +public interface ComandeEventService{ Map loadComandeEventConfig(String protocolId,String scene); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java index 476ad84..aaf1837 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java @@ -2,46 +2,46 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.dao.CommandEventDao; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @Slf4j @AllArgsConstructor -public class ComandeEventServiceImpl implements ComandeEventService { +public class ComandeEventServiceImpl implements ComandeEventRegistry { - private final CommandEventDao commandEventDao; + // private final CommandEventDao commandEventDao; // 加密bean 固定字段出现变化的字段解析,业务字段的有序内容 @Override - public Map loadComandeEventConfig(String protocolId,String sceneName) { - CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); - if (ObjectUtil.isEmpty(commandEventConfig)) { - log.error("协议{},没有配置成功接收回复配置,清排查原因"); - return null; - } - String replyJson = commandEventConfig.getReplyContentJson(); - List> replyMapList = JSONArray.parseObject(replyJson, List.class); - List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); - Map fixMap = fixList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); - List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) - .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) - .collect(Collectors.toList()); - Map commandConfigMap = new HashMap<>(); - commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); - commandConfigMap.put("fixContent", fixMap); - commandConfigMap.put("bizContent", contentList); - return commandConfigMap; + public Map loadComandeEventConfig(String protocolId, String sceneName) { +// CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); +// if (ObjectUtil.isEmpty(commandEventConfig)) { +// log.error("协议{},没有配置成功接收回复配置,清排查原因"); +// return null; +// } +// String replyJson = commandEventConfig.getReplyContentJson(); +// List> replyMapList = JSONArray.parseObject(replyJson, List.class); +// List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); +// Map fixMap = fixList.stream() +// .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); +// List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) +// .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) +// .collect(Collectors.toList()); +// Map commandConfigMap = new HashMap<>(); +// commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); +// commandConfigMap.put("fixContent", fixMap); +// commandConfigMap.put("bizContent", contentList); +// return commandConfigMap; + return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 128b09d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java deleted file mode 100644 index 4016b0b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface DatagramEventMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java deleted file mode 100644 index 597c306..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.apache.ibatis.annotations.Mapper; - -public interface FieldConfigMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java deleted file mode 100644 index a31680a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.PreRuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface PreRuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java deleted file mode 100644 index 9060a69..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface ProtocolConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java deleted file mode 100644 index 6fa6936..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java deleted file mode 100644 index 582a705..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleDict; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleDictMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java deleted file mode 100644 index 6e302c8..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.CommandEventMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Optional; - -@Component -public class CommandEventDao { - - @Resource - private CommandEventMapper commandEventMapper; - - public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId) - .eq("scene", sceneName) - .eq("enabled", 1); - List commandEventConfig = commandEventMapper.selectList(queryWrapper); - Optional optionalEventConfig = commandEventConfig.stream().findFirst(); - return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java deleted file mode 100644 index 9137e4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.FieldConfigMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class FieldConfigDao { - - @Resource - private FieldConfigMapper fieldConfigMapper; - - public FieldConfig getFieldConfigById(String fieldId) { - FieldConfig fieldConfig = fieldConfigMapper.selectById(fieldId); - return fieldConfig; - } - - public List getFieldConfigs(String protocolId,Integer isFixed) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",isFixed); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - - public List getStorageFieldConfig(String protocolId) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",1) - .eq("is_storage",1); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java deleted file mode 100644 index 67bff6b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.mapper.PreRuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class PreRuleConfigDao { - - @Resource - private PreRuleConfigMapper preRuleConfigMapper; - - public List getPreRuleList(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return preRuleConfigMapper.selectList(queryWrapper); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java deleted file mode 100644 index d69ea85..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.RuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleConfigDao { - - @Resource - private RuleConfigMapper ruleConfigMapper; - - public RuleConfig getNextRuleConfig(String ruleFields) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("parse_rule_json", ruleFields); - return ruleConfigMapper.selectOne(queryWrapper); - } - - - public List getRuleConfigById(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return ruleConfigMapper.selectList(queryWrapper); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java deleted file mode 100644 index 932c185..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.RuleDictMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleDictDao { - - @Resource - private RuleDictMapper ruleDictMapper; - - public List getRuleDictConfig() { - List ruleDictList = ruleDictMapper.selectList(null); - return ruleDictList; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java index 9f9e279..43bc4d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java @@ -10,20 +10,15 @@ import io.netty.channel.socket.nio.NioServerSocketChannel; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import javax.annotation.PreDestroy; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static cn.hutool.core.util.ClassUtil.getClasses; /** * SensorhubServer netty服务端 */ @Slf4j -@Service +@Component public class SensorhubServer { /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java index 2c79ff5..9a28c36 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java @@ -11,13 +11,13 @@ import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioSocketChannel; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClient 客户端 */ @Slf4j -@Service +@Registry public final class SensorhubClient { public static void main(String[] args) throws Exception { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java index 9774be0..477c3f7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java @@ -6,12 +6,12 @@ import io.netty.channel.socket.SocketChannel; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientChannelInitialHandler */ -@Service +@Registry public class SensorhubClientChannelInitialHandler extends ChannelInitializer { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java index 346f4b3..73560e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java @@ -5,13 +5,13 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientHandler */ @Slf4j -@Service +@Registry public class SensorhubClientHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java index 5c1c6f2..d990af5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java @@ -4,12 +4,12 @@ import com.casic.missiles.pojo.Msg; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** * SensorhubServerHandler */ -@Service +@Component public class SensorhubServerHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 67283ae..af3172c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,41 +1,37 @@ package com.casic.missiles.parser; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultProtocolConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.*; +import com.casic.missiles.registry.FieldConfigRegistry; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; -import java.nio.charset.Charset; import java.util.HashMap; import java.util.List; import java.util.Map; -@Service("genericProtocolParser") +/** + * @author + */ +@Component("genericProtocolParser") @Slf4j -@AllArgsConstructor +@RequiredArgsConstructor public class GenericProtocolParser implements ProtocolParser { - private final LeadingCodeMatcher leadingCodeMatcher; private final List frameStructDispenserList; - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorInstanceSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; // 匹配首字母前导码=> 帧结构匹配前导码=> // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 @@ -44,18 +40,19 @@ public Boolean doParseProtocol(ByteBuf byteBuf) { String protocolContent = ByteBufUtil.hexDump(byteBuf); //匹配前导码 - List preCodeConfigs = leadingCodeMatcher.matchLeadingCode(protocolContent); + List preCodeConfigs = LeadingCodeMatcher.matchFrameLeadingCode(protocolContent); //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 if (preCodeConfigs.size() == 0) { - return rematch(byteBuf,protocolContent); + return rematch(byteBuf, protocolContent); } - //暂时先取第一个 + //暂时先取第一个,提升速度,使用享元模式, 减少类的创建销毁与构建 ProtocolConfig protocolConfig = preCodeConfigs.get(0); + AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); ByteBuf wholeDatagramByte = null; //通过匹配帧结构获取完整的数据包 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, preCodeConfigs.get(0))) != null) { + if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, protocolFactory)) != null) { break; } } @@ -68,76 +65,78 @@ * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 */ - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId, wholeDatagramByte); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap, protocolId); - //选取规则对应的流程实例 - DatagramEventConfig datagramEventConfig = processorInstanceSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); + //进行规则字段解析,进行匹配规则 + RuleConfig ruleConfig = getRuleConfig(protocolFactory, wholeDatagramByte); + if (ruleConfig == null) { + return false; + } //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, wholeDatagramByte); + ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte); + //以下进行业务的规则解析,同时选定流程实例 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); + DatagramEventProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain, + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText, protocolId); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain); //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); + datagramEventProvider.storeData(bizDataMap); return true; } - private Boolean rematch(ByteBuf byteBuf,String protocolContent) { + /** + * 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 + */ + private Boolean rematch(ByteBuf byteBuf, String protocolContent) { //重置位判断 byteBuf.resetReaderIndex(); //判断重置是否前移,如果没有前移,则直接判为匹配失败 if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { return false; } else { + //递归执行 return doParseProtocol(byteBuf); } } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; + //获取匹配规则->匹配规则 + private RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + //取出其中参与逻辑provider并判空 + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); + String rulePrepareFields = protocolConfig.getRulePrepareFields(); + //固定字段 + if (StringUtils.isNotEmpty(rulePrepareFields)) { + //获取统一固定字段解析 + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + //获取该协议的字段配置,用于协议规则匹配 + List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); + //获取规则 + RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, + rulePrepareFields, protocolFieldConfigs); + return ruleConfig; + } + return null; } - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + //数据构建,获取固定字段的store和业务字段store + private Map buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + Map bizDataMap = new HashMap<>(); + Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); + Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); + bizDataMap.putAll(ruleStoreObjectMap); + bizDataMap.putAll(protocolStoreObjectMap); return bizDataMap; } - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java index 8a46e32..16ce2e5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java @@ -3,6 +3,7 @@ import io.netty.buffer.ByteBuf; public interface ProtocolParser { + Boolean doParseProtocol(ByteBuf byteBuf); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java new file mode 100644 index 0000000..f7814af --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java @@ -0,0 +1,35 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.ProtocolConfigProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.ProtocolConfig; + +/** + * 存放基本协议的的加载信息 + */ +public class AbstractProtocolConfigFactory { + private final ProtocolConfigProvider protocolConfigProvider; + private final ProtocolFieldConfigProvider protocolFieldConfigProvider; + private final RuleConfigProvider ruleConfigProvider; + + public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { + this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); + this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); + this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); + } + + public ProtocolConfigProvider getProtocolConfigProvider() { + return protocolConfigProvider; + } + + public ProtocolFieldConfigProvider getProtocolFieldConfigProvider() { + return protocolFieldConfigProvider; + } + + public RuleConfigProvider getRuleConfigProvider() { + return ruleConfigProvider; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java new file mode 100644 index 0000000..6e36147 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java @@ -0,0 +1,57 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.CombinedFieldConfigProvider; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.FieldConfigProvider; +import com.casic.missiles.parser.provider.FieldRuleConfigProvider; + +/** + * 存放规则相关的的的加载信息 + */ +public class AbstractRuleConfigFactory { + + /** + * 处理字节 + */ + private final FieldConfigProvider fieldConfigProvider; + /** + * 处理组合字节解析的解码器 + */ + private final CombinedFieldConfigProvider combinedFieldConfigProvider; + /** + * 处理负责字节解析的规则配置 + */ + private final FieldRuleConfigProvider fieldRuleConfigProvider; + /** + * 处理实例流程 + */ + private final DatagramEventProvider datagramEventProvider; + + + public AbstractRuleConfigFactory(Long ruleId) { + this.fieldConfigProvider = new FieldConfigProvider(ruleId); + this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); + this.fieldRuleConfigProvider = new FieldRuleConfigProvider(ruleId); + this.datagramEventProvider = new DatagramEventProvider(ruleId); + } + + public FieldConfigProvider getFieldConfigProvider() { + return fieldConfigProvider; + } + + public CombinedFieldConfigProvider getCombinedFieldConfigProvider() { + return combinedFieldConfigProvider; + } + + public FieldRuleConfigProvider getFieldRuleConfigProvider() { + return fieldRuleConfigProvider; + } + + public DatagramEventProvider getDatagramEventProvider() { + return datagramEventProvider; + } + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java deleted file mode 100644 index 6e1719a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.factory; - - -import com.casic.missiles.pojo.ProtocolConfig; - -import java.util.List; - -/** - * 数据库访问优化(暂时未做) - *

- * 1、初始化协议解析配置,并存放到处存放缓存,对协议基本配置进行管理 - * 2、其中流程中所有的配置都经过此类进行管理,进行调用获取,增强解析速度 - */ -public interface DatagramFactory { - - /** - * 初始化 - */ - List datagramInit(); - - /** - * 根据前导码配置匹配,模糊匹配获取所有的报文项 - */ - List match(); - - /** - * 根据前导码匹配,返回报文项 - */ - List filer(); - - /** - * 保证数据的唯一性选择器 - */ - List selectOne(); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java new file mode 100644 index 0000000..87444a0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java @@ -0,0 +1,18 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +import java.util.List; + +/** + * 直接用,还是边用边创建 + */ +public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { + + + public DefaultProtocolConfigFactory(ProtocolConfig protocolConfig) { + super(protocolConfig); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java new file mode 100644 index 0000000..cce0c7c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java @@ -0,0 +1,12 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; + +public class DefaultRuleFactory extends AbstractRuleConfigFactory { + + public DefaultRuleFactory(Long ruleId) { + super(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java deleted file mode 100644 index 9ee97e0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.casic.missiles.parser.instance; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service -@Slf4j -@AllArgsConstructor -public class GeneralProcessor { - - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; - - /** - * 统一固定字段解析=>进行规则的查询的判断 - * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 - * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 - */ - @Deprecated - public boolean parseWholeDatagram(ByteBuf buffer, ProtocolConfig protocolConfig) { - try { - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap,protocolId); - //选取规则对应的流程= - DatagramEventConfig datagramEventConfig = processorSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); - //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); - //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); - //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); - //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); - //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); - return true; - } catch (Exception ex) { - log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", - ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); - return false; - } - } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; - } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); - } - - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); - return bizDataMap; - } - - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java index 25e7ad8..6a5777e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java @@ -1,23 +1,31 @@ package com.casic.missiles.parser.instance.impl; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.mapper.DatagramEventMapper; import com.casic.missiles.pojo.DatagramEventConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.SpringContextUtil; -@Service -@AllArgsConstructor +import java.util.List; +import java.util.Optional; + +/** + * @author cz + * + */ public class DefaultProcessorInstanceSelector implements ProcessorInstanceSelector { - private final DatagramEventMapper datagramEventMapper; + private static List datagramEventConfigs; + + static { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + datagramEventConfigs = datagramEventRegistry.getDatagramEventList(); + } @Override public DatagramEventConfig getProcessorInstance(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("rule_id", protocolId); - return datagramEventMapper.selectOne(queryWrapper); + Optional optionalSelectInstance = datagramEventConfigs.stream() + .filter(e -> e.getId().equals(protocolId)).limit(1).findFirst(); + return optionalSelectInstance.isPresent() ? optionalSelectInstance.get() : null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a778671..7b56a43 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,16 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import io.netty.buffer.ByteBuf; /** - * 分析匹配情况 - * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 - * 2、匹配不成功,有后续帧,可以进行下次匹配。 - * 3、匹配不成功,无后续帧,可以进行丢弃。 + * 分析匹配情况 + * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 + * 2、匹配不成功,有后续帧,可以进行下次匹配。 + * 3、匹配不成功,无后续帧,可以进行丢弃。 */ -public interface FrameStructMatcher{ +public interface FrameStructMatcher { - ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig); + ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java index 608af3a..32cc8a4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java @@ -2,48 +2,47 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.delivery.decorator.ByteDecorator; +import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @AllArgsConstructor public class FieldDecoratorManger { - private final RuleDictDao ruleDictDao; + private final RuleConfigRegistry ruleDictDao; // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 // (1)静态的业务字段是字典里面可以配置的 // (2)动态的业务字段是通过规则生成的 public String contentMerge(String ruleJson, String sceneConent, String dynamicContent) { - List ruleDictList = ruleDictDao.getRuleDictConfig(); - Map ruleDictMap = ruleDictList.stream().collect( - Collectors.toMap(RuleDict::getId, e -> e)); - List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); - for (Map ruleMap : ruleMapList) { - String ruleType = String.valueOf(ruleMap.get("ruleType")); - ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); - NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); - byteDecorator.nodeDecoratorRule(nodeDecoratorParm); - } +// List ruleDictList = ruleDictDao.getRuleDictConfig(); +// Map ruleDictMap = ruleDictList.stream().collect( +// Collectors.toMap(RuleDict::getId, e -> e)); +// List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); +// for (Map ruleMap : ruleMapList) { +// String ruleType = String.valueOf(ruleMap.get("ruleType")); +// ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); +// NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); +// byteDecorator.nodeDecoratorRule(nodeDecoratorParm); +// } return null; } - - private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { - NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() - .contents(sceneConent) - .dynamicContent(dynamicContent) - .ruletypeId(ruletypeId) - .ruleDictMap(ruleDictMap) - .build(); - return nodeDecoratorParm; - } +// +// private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { +// NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() +// .contents(sceneConent) +// .dynamicContent(dynamicContent) +// .ruletypeId(ruletypeId) +// .ruleDictMap(ruleDictMap) +// .build(); +// return nodeDecoratorParm; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java index 652970c..b204ac3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java @@ -1,56 +1,56 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@AllArgsConstructor -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", - JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Component; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Component("logicalDecorator") +//@AllArgsConstructor +//@Slf4j +//public class LogicalShiftDecorator implements ByteDecorator { +// +//// private final FieldRuleEngineMapper fieldRuleEngineMapper; +//// +//// //字节位移 +//// @Override +//// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +//// String logicalValue = ""; +//// RuleEvaluator fieldRuleEngine = new RuleEvaluator(); +//// try { +//// Map env2 = new HashMap(); +//// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +//// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +//// for (String contentId : contentIdList) { +//// RuleDict ruleDict = ruleDictMap.get(contentId); +//// if (ruleDict.getCode().contains("#")) { +//// //使用动态的值 +//// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +//// } +//// env2.put(ruleDict.getName(), ruleDict.getCode()); +//// } +//// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +//// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +//// return null; +//// } +//// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +//// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +//// return values; +//// } catch (Exception ex) { +//// log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", +//// JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +//// return null; +//// } +//// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java index 346468f..822fead 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@AllArgsConstructor -@Slf4j -public class OperationDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("optionDecorator") +//@AllArgsConstructor +//@Slf4j +//public class OperationDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //混合运算,有常量或者乘除的缩放 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java index 50fb0a7..7a8bccb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@AllArgsConstructor -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +////精度计算 +//@AllArgsConstructor +//@Registry("precisionDecorator") +//@Slf4j +//public class PrecisionDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java index da39235..27f9cc7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java @@ -1,54 +1,53 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@AllArgsConstructor -@Slf4j -public class RuleDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("ruleDecorator") +//@AllArgsConstructor +//@Slf4j +//public class RuleDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //吃我一套正则表达式 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (Exception ex) { +// log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java index 7f5cbf3..c043f97 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java @@ -2,6 +2,6 @@ import java.util.Map; -public interface ComandeEventService { +public interface ComandeEventService{ Map loadComandeEventConfig(String protocolId,String scene); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java index 476ad84..aaf1837 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java @@ -2,46 +2,46 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.dao.CommandEventDao; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @Slf4j @AllArgsConstructor -public class ComandeEventServiceImpl implements ComandeEventService { +public class ComandeEventServiceImpl implements ComandeEventRegistry { - private final CommandEventDao commandEventDao; + // private final CommandEventDao commandEventDao; // 加密bean 固定字段出现变化的字段解析,业务字段的有序内容 @Override - public Map loadComandeEventConfig(String protocolId,String sceneName) { - CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); - if (ObjectUtil.isEmpty(commandEventConfig)) { - log.error("协议{},没有配置成功接收回复配置,清排查原因"); - return null; - } - String replyJson = commandEventConfig.getReplyContentJson(); - List> replyMapList = JSONArray.parseObject(replyJson, List.class); - List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); - Map fixMap = fixList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); - List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) - .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) - .collect(Collectors.toList()); - Map commandConfigMap = new HashMap<>(); - commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); - commandConfigMap.put("fixContent", fixMap); - commandConfigMap.put("bizContent", contentList); - return commandConfigMap; + public Map loadComandeEventConfig(String protocolId, String sceneName) { +// CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); +// if (ObjectUtil.isEmpty(commandEventConfig)) { +// log.error("协议{},没有配置成功接收回复配置,清排查原因"); +// return null; +// } +// String replyJson = commandEventConfig.getReplyContentJson(); +// List> replyMapList = JSONArray.parseObject(replyJson, List.class); +// List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); +// Map fixMap = fixList.stream() +// .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); +// List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) +// .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) +// .collect(Collectors.toList()); +// Map commandConfigMap = new HashMap<>(); +// commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); +// commandConfigMap.put("fixContent", fixMap); +// commandConfigMap.put("bizContent", contentList); +// return commandConfigMap; + return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 128b09d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java deleted file mode 100644 index 4016b0b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface DatagramEventMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java deleted file mode 100644 index 597c306..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.apache.ibatis.annotations.Mapper; - -public interface FieldConfigMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java deleted file mode 100644 index a31680a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.PreRuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface PreRuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java deleted file mode 100644 index 9060a69..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface ProtocolConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java deleted file mode 100644 index 6fa6936..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java deleted file mode 100644 index 582a705..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleDict; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleDictMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java deleted file mode 100644 index 6e302c8..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.CommandEventMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Optional; - -@Component -public class CommandEventDao { - - @Resource - private CommandEventMapper commandEventMapper; - - public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId) - .eq("scene", sceneName) - .eq("enabled", 1); - List commandEventConfig = commandEventMapper.selectList(queryWrapper); - Optional optionalEventConfig = commandEventConfig.stream().findFirst(); - return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java deleted file mode 100644 index 9137e4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.FieldConfigMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class FieldConfigDao { - - @Resource - private FieldConfigMapper fieldConfigMapper; - - public FieldConfig getFieldConfigById(String fieldId) { - FieldConfig fieldConfig = fieldConfigMapper.selectById(fieldId); - return fieldConfig; - } - - public List getFieldConfigs(String protocolId,Integer isFixed) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",isFixed); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - - public List getStorageFieldConfig(String protocolId) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",1) - .eq("is_storage",1); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java deleted file mode 100644 index 67bff6b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.mapper.PreRuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class PreRuleConfigDao { - - @Resource - private PreRuleConfigMapper preRuleConfigMapper; - - public List getPreRuleList(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return preRuleConfigMapper.selectList(queryWrapper); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java deleted file mode 100644 index d69ea85..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.RuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleConfigDao { - - @Resource - private RuleConfigMapper ruleConfigMapper; - - public RuleConfig getNextRuleConfig(String ruleFields) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("parse_rule_json", ruleFields); - return ruleConfigMapper.selectOne(queryWrapper); - } - - - public List getRuleConfigById(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return ruleConfigMapper.selectList(queryWrapper); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java deleted file mode 100644 index 932c185..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.RuleDictMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleDictDao { - - @Resource - private RuleDictMapper ruleDictMapper; - - public List getRuleDictConfig() { - List ruleDictList = ruleDictMapper.selectList(null); - return ruleDictList; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java index 9f9e279..43bc4d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java @@ -10,20 +10,15 @@ import io.netty.channel.socket.nio.NioServerSocketChannel; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import javax.annotation.PreDestroy; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static cn.hutool.core.util.ClassUtil.getClasses; /** * SensorhubServer netty服务端 */ @Slf4j -@Service +@Component public class SensorhubServer { /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java index 2c79ff5..9a28c36 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java @@ -11,13 +11,13 @@ import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioSocketChannel; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClient 客户端 */ @Slf4j -@Service +@Registry public final class SensorhubClient { public static void main(String[] args) throws Exception { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java index 9774be0..477c3f7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java @@ -6,12 +6,12 @@ import io.netty.channel.socket.SocketChannel; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientChannelInitialHandler */ -@Service +@Registry public class SensorhubClientChannelInitialHandler extends ChannelInitializer { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java index 346f4b3..73560e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java @@ -5,13 +5,13 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientHandler */ @Slf4j -@Service +@Registry public class SensorhubClientHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java index 5c1c6f2..d990af5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java @@ -4,12 +4,12 @@ import com.casic.missiles.pojo.Msg; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** * SensorhubServerHandler */ -@Service +@Component public class SensorhubServerHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 67283ae..af3172c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,41 +1,37 @@ package com.casic.missiles.parser; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultProtocolConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.*; +import com.casic.missiles.registry.FieldConfigRegistry; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; -import java.nio.charset.Charset; import java.util.HashMap; import java.util.List; import java.util.Map; -@Service("genericProtocolParser") +/** + * @author + */ +@Component("genericProtocolParser") @Slf4j -@AllArgsConstructor +@RequiredArgsConstructor public class GenericProtocolParser implements ProtocolParser { - private final LeadingCodeMatcher leadingCodeMatcher; private final List frameStructDispenserList; - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorInstanceSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; // 匹配首字母前导码=> 帧结构匹配前导码=> // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 @@ -44,18 +40,19 @@ public Boolean doParseProtocol(ByteBuf byteBuf) { String protocolContent = ByteBufUtil.hexDump(byteBuf); //匹配前导码 - List preCodeConfigs = leadingCodeMatcher.matchLeadingCode(protocolContent); + List preCodeConfigs = LeadingCodeMatcher.matchFrameLeadingCode(protocolContent); //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 if (preCodeConfigs.size() == 0) { - return rematch(byteBuf,protocolContent); + return rematch(byteBuf, protocolContent); } - //暂时先取第一个 + //暂时先取第一个,提升速度,使用享元模式, 减少类的创建销毁与构建 ProtocolConfig protocolConfig = preCodeConfigs.get(0); + AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); ByteBuf wholeDatagramByte = null; //通过匹配帧结构获取完整的数据包 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, preCodeConfigs.get(0))) != null) { + if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, protocolFactory)) != null) { break; } } @@ -68,76 +65,78 @@ * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 */ - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId, wholeDatagramByte); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap, protocolId); - //选取规则对应的流程实例 - DatagramEventConfig datagramEventConfig = processorInstanceSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); + //进行规则字段解析,进行匹配规则 + RuleConfig ruleConfig = getRuleConfig(protocolFactory, wholeDatagramByte); + if (ruleConfig == null) { + return false; + } //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, wholeDatagramByte); + ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte); + //以下进行业务的规则解析,同时选定流程实例 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); + DatagramEventProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain, + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText, protocolId); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain); //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); + datagramEventProvider.storeData(bizDataMap); return true; } - private Boolean rematch(ByteBuf byteBuf,String protocolContent) { + /** + * 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 + */ + private Boolean rematch(ByteBuf byteBuf, String protocolContent) { //重置位判断 byteBuf.resetReaderIndex(); //判断重置是否前移,如果没有前移,则直接判为匹配失败 if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { return false; } else { + //递归执行 return doParseProtocol(byteBuf); } } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; + //获取匹配规则->匹配规则 + private RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + //取出其中参与逻辑provider并判空 + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); + String rulePrepareFields = protocolConfig.getRulePrepareFields(); + //固定字段 + if (StringUtils.isNotEmpty(rulePrepareFields)) { + //获取统一固定字段解析 + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + //获取该协议的字段配置,用于协议规则匹配 + List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); + //获取规则 + RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, + rulePrepareFields, protocolFieldConfigs); + return ruleConfig; + } + return null; } - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + //数据构建,获取固定字段的store和业务字段store + private Map buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + Map bizDataMap = new HashMap<>(); + Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); + Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); + bizDataMap.putAll(ruleStoreObjectMap); + bizDataMap.putAll(protocolStoreObjectMap); return bizDataMap; } - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java index 8a46e32..16ce2e5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java @@ -3,6 +3,7 @@ import io.netty.buffer.ByteBuf; public interface ProtocolParser { + Boolean doParseProtocol(ByteBuf byteBuf); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java new file mode 100644 index 0000000..f7814af --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java @@ -0,0 +1,35 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.ProtocolConfigProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.ProtocolConfig; + +/** + * 存放基本协议的的加载信息 + */ +public class AbstractProtocolConfigFactory { + private final ProtocolConfigProvider protocolConfigProvider; + private final ProtocolFieldConfigProvider protocolFieldConfigProvider; + private final RuleConfigProvider ruleConfigProvider; + + public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { + this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); + this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); + this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); + } + + public ProtocolConfigProvider getProtocolConfigProvider() { + return protocolConfigProvider; + } + + public ProtocolFieldConfigProvider getProtocolFieldConfigProvider() { + return protocolFieldConfigProvider; + } + + public RuleConfigProvider getRuleConfigProvider() { + return ruleConfigProvider; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java new file mode 100644 index 0000000..6e36147 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java @@ -0,0 +1,57 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.CombinedFieldConfigProvider; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.FieldConfigProvider; +import com.casic.missiles.parser.provider.FieldRuleConfigProvider; + +/** + * 存放规则相关的的的加载信息 + */ +public class AbstractRuleConfigFactory { + + /** + * 处理字节 + */ + private final FieldConfigProvider fieldConfigProvider; + /** + * 处理组合字节解析的解码器 + */ + private final CombinedFieldConfigProvider combinedFieldConfigProvider; + /** + * 处理负责字节解析的规则配置 + */ + private final FieldRuleConfigProvider fieldRuleConfigProvider; + /** + * 处理实例流程 + */ + private final DatagramEventProvider datagramEventProvider; + + + public AbstractRuleConfigFactory(Long ruleId) { + this.fieldConfigProvider = new FieldConfigProvider(ruleId); + this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); + this.fieldRuleConfigProvider = new FieldRuleConfigProvider(ruleId); + this.datagramEventProvider = new DatagramEventProvider(ruleId); + } + + public FieldConfigProvider getFieldConfigProvider() { + return fieldConfigProvider; + } + + public CombinedFieldConfigProvider getCombinedFieldConfigProvider() { + return combinedFieldConfigProvider; + } + + public FieldRuleConfigProvider getFieldRuleConfigProvider() { + return fieldRuleConfigProvider; + } + + public DatagramEventProvider getDatagramEventProvider() { + return datagramEventProvider; + } + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java deleted file mode 100644 index 6e1719a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.factory; - - -import com.casic.missiles.pojo.ProtocolConfig; - -import java.util.List; - -/** - * 数据库访问优化(暂时未做) - *

- * 1、初始化协议解析配置,并存放到处存放缓存,对协议基本配置进行管理 - * 2、其中流程中所有的配置都经过此类进行管理,进行调用获取,增强解析速度 - */ -public interface DatagramFactory { - - /** - * 初始化 - */ - List datagramInit(); - - /** - * 根据前导码配置匹配,模糊匹配获取所有的报文项 - */ - List match(); - - /** - * 根据前导码匹配,返回报文项 - */ - List filer(); - - /** - * 保证数据的唯一性选择器 - */ - List selectOne(); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java new file mode 100644 index 0000000..87444a0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java @@ -0,0 +1,18 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +import java.util.List; + +/** + * 直接用,还是边用边创建 + */ +public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { + + + public DefaultProtocolConfigFactory(ProtocolConfig protocolConfig) { + super(protocolConfig); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java new file mode 100644 index 0000000..cce0c7c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java @@ -0,0 +1,12 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; + +public class DefaultRuleFactory extends AbstractRuleConfigFactory { + + public DefaultRuleFactory(Long ruleId) { + super(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java deleted file mode 100644 index 9ee97e0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.casic.missiles.parser.instance; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service -@Slf4j -@AllArgsConstructor -public class GeneralProcessor { - - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; - - /** - * 统一固定字段解析=>进行规则的查询的判断 - * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 - * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 - */ - @Deprecated - public boolean parseWholeDatagram(ByteBuf buffer, ProtocolConfig protocolConfig) { - try { - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap,protocolId); - //选取规则对应的流程= - DatagramEventConfig datagramEventConfig = processorSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); - //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); - //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); - //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); - //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); - //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); - return true; - } catch (Exception ex) { - log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", - ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); - return false; - } - } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; - } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); - } - - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); - return bizDataMap; - } - - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java index 25e7ad8..6a5777e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java @@ -1,23 +1,31 @@ package com.casic.missiles.parser.instance.impl; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.mapper.DatagramEventMapper; import com.casic.missiles.pojo.DatagramEventConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.SpringContextUtil; -@Service -@AllArgsConstructor +import java.util.List; +import java.util.Optional; + +/** + * @author cz + * + */ public class DefaultProcessorInstanceSelector implements ProcessorInstanceSelector { - private final DatagramEventMapper datagramEventMapper; + private static List datagramEventConfigs; + + static { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + datagramEventConfigs = datagramEventRegistry.getDatagramEventList(); + } @Override public DatagramEventConfig getProcessorInstance(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("rule_id", protocolId); - return datagramEventMapper.selectOne(queryWrapper); + Optional optionalSelectInstance = datagramEventConfigs.stream() + .filter(e -> e.getId().equals(protocolId)).limit(1).findFirst(); + return optionalSelectInstance.isPresent() ? optionalSelectInstance.get() : null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a778671..7b56a43 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,16 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import io.netty.buffer.ByteBuf; /** - * 分析匹配情况 - * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 - * 2、匹配不成功,有后续帧,可以进行下次匹配。 - * 3、匹配不成功,无后续帧,可以进行丢弃。 + * 分析匹配情况 + * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 + * 2、匹配不成功,有后续帧,可以进行下次匹配。 + * 3、匹配不成功,无后续帧,可以进行丢弃。 */ -public interface FrameStructMatcher{ +public interface FrameStructMatcher { - ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig); + ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 05320ab..8ebea78 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,23 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.ProtocolConfigMapper; +import com.casic.missiles.parser.provider.ProtocolConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Component; import java.util.List; import java.util.stream.Collectors; -@Component -@AllArgsConstructor public class LeadingCodeMatcher { - private final ProtocolConfigMapper protocolMapper; - //** 1、首字母匹配前导码, // 2、以匹配出的前导码是否在报文中条件进行前导码的匹配二次筛选 - public List matchLeadingCode(String protocolContent){ + public static List matchFrameLeadingCode(String protocolContent){ List initialConfigs = initialMatch(protocolContent); List preCodeConfigs = initialConfigs.stream() .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) @@ -26,13 +19,16 @@ } //初始化匹配前导码内容 - private List initialMatch(String protocolContent) { - String protocolStr = protocolContent.charAt(0) + ""; - QueryWrapper queryWrapper = new QueryWrapper() - .likeRight("pre_fix", protocolStr); - List protocolConfigList = protocolMapper.selectList(queryWrapper); - return protocolConfigList; + private static List initialMatch(String protocolContent) { + String firstFrameChar = protocolContent.charAt(0) + ""; + ProtocolConfigProvider protocolConfigProvider=new ProtocolConfigProvider(firstFrameChar); + return protocolConfigProvider.getMatchList(); } + + + + + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java index 608af3a..32cc8a4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java @@ -2,48 +2,47 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.delivery.decorator.ByteDecorator; +import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @AllArgsConstructor public class FieldDecoratorManger { - private final RuleDictDao ruleDictDao; + private final RuleConfigRegistry ruleDictDao; // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 // (1)静态的业务字段是字典里面可以配置的 // (2)动态的业务字段是通过规则生成的 public String contentMerge(String ruleJson, String sceneConent, String dynamicContent) { - List ruleDictList = ruleDictDao.getRuleDictConfig(); - Map ruleDictMap = ruleDictList.stream().collect( - Collectors.toMap(RuleDict::getId, e -> e)); - List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); - for (Map ruleMap : ruleMapList) { - String ruleType = String.valueOf(ruleMap.get("ruleType")); - ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); - NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); - byteDecorator.nodeDecoratorRule(nodeDecoratorParm); - } +// List ruleDictList = ruleDictDao.getRuleDictConfig(); +// Map ruleDictMap = ruleDictList.stream().collect( +// Collectors.toMap(RuleDict::getId, e -> e)); +// List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); +// for (Map ruleMap : ruleMapList) { +// String ruleType = String.valueOf(ruleMap.get("ruleType")); +// ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); +// NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); +// byteDecorator.nodeDecoratorRule(nodeDecoratorParm); +// } return null; } - - private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { - NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() - .contents(sceneConent) - .dynamicContent(dynamicContent) - .ruletypeId(ruletypeId) - .ruleDictMap(ruleDictMap) - .build(); - return nodeDecoratorParm; - } +// +// private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { +// NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() +// .contents(sceneConent) +// .dynamicContent(dynamicContent) +// .ruletypeId(ruletypeId) +// .ruleDictMap(ruleDictMap) +// .build(); +// return nodeDecoratorParm; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java index 652970c..b204ac3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java @@ -1,56 +1,56 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@AllArgsConstructor -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", - JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Component; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Component("logicalDecorator") +//@AllArgsConstructor +//@Slf4j +//public class LogicalShiftDecorator implements ByteDecorator { +// +//// private final FieldRuleEngineMapper fieldRuleEngineMapper; +//// +//// //字节位移 +//// @Override +//// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +//// String logicalValue = ""; +//// RuleEvaluator fieldRuleEngine = new RuleEvaluator(); +//// try { +//// Map env2 = new HashMap(); +//// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +//// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +//// for (String contentId : contentIdList) { +//// RuleDict ruleDict = ruleDictMap.get(contentId); +//// if (ruleDict.getCode().contains("#")) { +//// //使用动态的值 +//// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +//// } +//// env2.put(ruleDict.getName(), ruleDict.getCode()); +//// } +//// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +//// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +//// return null; +//// } +//// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +//// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +//// return values; +//// } catch (Exception ex) { +//// log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", +//// JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +//// return null; +//// } +//// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java index 346468f..822fead 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@AllArgsConstructor -@Slf4j -public class OperationDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("optionDecorator") +//@AllArgsConstructor +//@Slf4j +//public class OperationDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //混合运算,有常量或者乘除的缩放 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java index 50fb0a7..7a8bccb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@AllArgsConstructor -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +////精度计算 +//@AllArgsConstructor +//@Registry("precisionDecorator") +//@Slf4j +//public class PrecisionDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java index da39235..27f9cc7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java @@ -1,54 +1,53 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@AllArgsConstructor -@Slf4j -public class RuleDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("ruleDecorator") +//@AllArgsConstructor +//@Slf4j +//public class RuleDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //吃我一套正则表达式 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (Exception ex) { +// log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java index 7f5cbf3..c043f97 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java @@ -2,6 +2,6 @@ import java.util.Map; -public interface ComandeEventService { +public interface ComandeEventService{ Map loadComandeEventConfig(String protocolId,String scene); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java index 476ad84..aaf1837 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java @@ -2,46 +2,46 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.dao.CommandEventDao; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @Slf4j @AllArgsConstructor -public class ComandeEventServiceImpl implements ComandeEventService { +public class ComandeEventServiceImpl implements ComandeEventRegistry { - private final CommandEventDao commandEventDao; + // private final CommandEventDao commandEventDao; // 加密bean 固定字段出现变化的字段解析,业务字段的有序内容 @Override - public Map loadComandeEventConfig(String protocolId,String sceneName) { - CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); - if (ObjectUtil.isEmpty(commandEventConfig)) { - log.error("协议{},没有配置成功接收回复配置,清排查原因"); - return null; - } - String replyJson = commandEventConfig.getReplyContentJson(); - List> replyMapList = JSONArray.parseObject(replyJson, List.class); - List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); - Map fixMap = fixList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); - List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) - .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) - .collect(Collectors.toList()); - Map commandConfigMap = new HashMap<>(); - commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); - commandConfigMap.put("fixContent", fixMap); - commandConfigMap.put("bizContent", contentList); - return commandConfigMap; + public Map loadComandeEventConfig(String protocolId, String sceneName) { +// CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); +// if (ObjectUtil.isEmpty(commandEventConfig)) { +// log.error("协议{},没有配置成功接收回复配置,清排查原因"); +// return null; +// } +// String replyJson = commandEventConfig.getReplyContentJson(); +// List> replyMapList = JSONArray.parseObject(replyJson, List.class); +// List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); +// Map fixMap = fixList.stream() +// .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); +// List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) +// .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) +// .collect(Collectors.toList()); +// Map commandConfigMap = new HashMap<>(); +// commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); +// commandConfigMap.put("fixContent", fixMap); +// commandConfigMap.put("bizContent", contentList); +// return commandConfigMap; + return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 128b09d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java deleted file mode 100644 index 4016b0b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface DatagramEventMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java deleted file mode 100644 index 597c306..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.apache.ibatis.annotations.Mapper; - -public interface FieldConfigMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java deleted file mode 100644 index a31680a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.PreRuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface PreRuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java deleted file mode 100644 index 9060a69..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface ProtocolConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java deleted file mode 100644 index 6fa6936..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java deleted file mode 100644 index 582a705..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleDict; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleDictMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java deleted file mode 100644 index 6e302c8..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.CommandEventMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Optional; - -@Component -public class CommandEventDao { - - @Resource - private CommandEventMapper commandEventMapper; - - public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId) - .eq("scene", sceneName) - .eq("enabled", 1); - List commandEventConfig = commandEventMapper.selectList(queryWrapper); - Optional optionalEventConfig = commandEventConfig.stream().findFirst(); - return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java deleted file mode 100644 index 9137e4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.FieldConfigMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class FieldConfigDao { - - @Resource - private FieldConfigMapper fieldConfigMapper; - - public FieldConfig getFieldConfigById(String fieldId) { - FieldConfig fieldConfig = fieldConfigMapper.selectById(fieldId); - return fieldConfig; - } - - public List getFieldConfigs(String protocolId,Integer isFixed) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",isFixed); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - - public List getStorageFieldConfig(String protocolId) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",1) - .eq("is_storage",1); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java deleted file mode 100644 index 67bff6b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.mapper.PreRuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class PreRuleConfigDao { - - @Resource - private PreRuleConfigMapper preRuleConfigMapper; - - public List getPreRuleList(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return preRuleConfigMapper.selectList(queryWrapper); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java deleted file mode 100644 index d69ea85..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.RuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleConfigDao { - - @Resource - private RuleConfigMapper ruleConfigMapper; - - public RuleConfig getNextRuleConfig(String ruleFields) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("parse_rule_json", ruleFields); - return ruleConfigMapper.selectOne(queryWrapper); - } - - - public List getRuleConfigById(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return ruleConfigMapper.selectList(queryWrapper); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java deleted file mode 100644 index 932c185..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.RuleDictMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleDictDao { - - @Resource - private RuleDictMapper ruleDictMapper; - - public List getRuleDictConfig() { - List ruleDictList = ruleDictMapper.selectList(null); - return ruleDictList; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java index 9f9e279..43bc4d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java @@ -10,20 +10,15 @@ import io.netty.channel.socket.nio.NioServerSocketChannel; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import javax.annotation.PreDestroy; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static cn.hutool.core.util.ClassUtil.getClasses; /** * SensorhubServer netty服务端 */ @Slf4j -@Service +@Component public class SensorhubServer { /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java index 2c79ff5..9a28c36 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java @@ -11,13 +11,13 @@ import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioSocketChannel; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClient 客户端 */ @Slf4j -@Service +@Registry public final class SensorhubClient { public static void main(String[] args) throws Exception { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java index 9774be0..477c3f7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java @@ -6,12 +6,12 @@ import io.netty.channel.socket.SocketChannel; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientChannelInitialHandler */ -@Service +@Registry public class SensorhubClientChannelInitialHandler extends ChannelInitializer { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java index 346f4b3..73560e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java @@ -5,13 +5,13 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientHandler */ @Slf4j -@Service +@Registry public class SensorhubClientHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java index 5c1c6f2..d990af5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java @@ -4,12 +4,12 @@ import com.casic.missiles.pojo.Msg; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** * SensorhubServerHandler */ -@Service +@Component public class SensorhubServerHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 67283ae..af3172c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,41 +1,37 @@ package com.casic.missiles.parser; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultProtocolConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.*; +import com.casic.missiles.registry.FieldConfigRegistry; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; -import java.nio.charset.Charset; import java.util.HashMap; import java.util.List; import java.util.Map; -@Service("genericProtocolParser") +/** + * @author + */ +@Component("genericProtocolParser") @Slf4j -@AllArgsConstructor +@RequiredArgsConstructor public class GenericProtocolParser implements ProtocolParser { - private final LeadingCodeMatcher leadingCodeMatcher; private final List frameStructDispenserList; - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorInstanceSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; // 匹配首字母前导码=> 帧结构匹配前导码=> // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 @@ -44,18 +40,19 @@ public Boolean doParseProtocol(ByteBuf byteBuf) { String protocolContent = ByteBufUtil.hexDump(byteBuf); //匹配前导码 - List preCodeConfigs = leadingCodeMatcher.matchLeadingCode(protocolContent); + List preCodeConfigs = LeadingCodeMatcher.matchFrameLeadingCode(protocolContent); //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 if (preCodeConfigs.size() == 0) { - return rematch(byteBuf,protocolContent); + return rematch(byteBuf, protocolContent); } - //暂时先取第一个 + //暂时先取第一个,提升速度,使用享元模式, 减少类的创建销毁与构建 ProtocolConfig protocolConfig = preCodeConfigs.get(0); + AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); ByteBuf wholeDatagramByte = null; //通过匹配帧结构获取完整的数据包 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, preCodeConfigs.get(0))) != null) { + if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, protocolFactory)) != null) { break; } } @@ -68,76 +65,78 @@ * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 */ - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId, wholeDatagramByte); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap, protocolId); - //选取规则对应的流程实例 - DatagramEventConfig datagramEventConfig = processorInstanceSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); + //进行规则字段解析,进行匹配规则 + RuleConfig ruleConfig = getRuleConfig(protocolFactory, wholeDatagramByte); + if (ruleConfig == null) { + return false; + } //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, wholeDatagramByte); + ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte); + //以下进行业务的规则解析,同时选定流程实例 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); + DatagramEventProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain, + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText, protocolId); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain); //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); + datagramEventProvider.storeData(bizDataMap); return true; } - private Boolean rematch(ByteBuf byteBuf,String protocolContent) { + /** + * 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 + */ + private Boolean rematch(ByteBuf byteBuf, String protocolContent) { //重置位判断 byteBuf.resetReaderIndex(); //判断重置是否前移,如果没有前移,则直接判为匹配失败 if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { return false; } else { + //递归执行 return doParseProtocol(byteBuf); } } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; + //获取匹配规则->匹配规则 + private RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + //取出其中参与逻辑provider并判空 + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); + String rulePrepareFields = protocolConfig.getRulePrepareFields(); + //固定字段 + if (StringUtils.isNotEmpty(rulePrepareFields)) { + //获取统一固定字段解析 + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + //获取该协议的字段配置,用于协议规则匹配 + List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); + //获取规则 + RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, + rulePrepareFields, protocolFieldConfigs); + return ruleConfig; + } + return null; } - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + //数据构建,获取固定字段的store和业务字段store + private Map buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + Map bizDataMap = new HashMap<>(); + Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); + Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); + bizDataMap.putAll(ruleStoreObjectMap); + bizDataMap.putAll(protocolStoreObjectMap); return bizDataMap; } - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java index 8a46e32..16ce2e5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java @@ -3,6 +3,7 @@ import io.netty.buffer.ByteBuf; public interface ProtocolParser { + Boolean doParseProtocol(ByteBuf byteBuf); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java new file mode 100644 index 0000000..f7814af --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java @@ -0,0 +1,35 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.ProtocolConfigProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.ProtocolConfig; + +/** + * 存放基本协议的的加载信息 + */ +public class AbstractProtocolConfigFactory { + private final ProtocolConfigProvider protocolConfigProvider; + private final ProtocolFieldConfigProvider protocolFieldConfigProvider; + private final RuleConfigProvider ruleConfigProvider; + + public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { + this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); + this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); + this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); + } + + public ProtocolConfigProvider getProtocolConfigProvider() { + return protocolConfigProvider; + } + + public ProtocolFieldConfigProvider getProtocolFieldConfigProvider() { + return protocolFieldConfigProvider; + } + + public RuleConfigProvider getRuleConfigProvider() { + return ruleConfigProvider; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java new file mode 100644 index 0000000..6e36147 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java @@ -0,0 +1,57 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.CombinedFieldConfigProvider; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.FieldConfigProvider; +import com.casic.missiles.parser.provider.FieldRuleConfigProvider; + +/** + * 存放规则相关的的的加载信息 + */ +public class AbstractRuleConfigFactory { + + /** + * 处理字节 + */ + private final FieldConfigProvider fieldConfigProvider; + /** + * 处理组合字节解析的解码器 + */ + private final CombinedFieldConfigProvider combinedFieldConfigProvider; + /** + * 处理负责字节解析的规则配置 + */ + private final FieldRuleConfigProvider fieldRuleConfigProvider; + /** + * 处理实例流程 + */ + private final DatagramEventProvider datagramEventProvider; + + + public AbstractRuleConfigFactory(Long ruleId) { + this.fieldConfigProvider = new FieldConfigProvider(ruleId); + this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); + this.fieldRuleConfigProvider = new FieldRuleConfigProvider(ruleId); + this.datagramEventProvider = new DatagramEventProvider(ruleId); + } + + public FieldConfigProvider getFieldConfigProvider() { + return fieldConfigProvider; + } + + public CombinedFieldConfigProvider getCombinedFieldConfigProvider() { + return combinedFieldConfigProvider; + } + + public FieldRuleConfigProvider getFieldRuleConfigProvider() { + return fieldRuleConfigProvider; + } + + public DatagramEventProvider getDatagramEventProvider() { + return datagramEventProvider; + } + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java deleted file mode 100644 index 6e1719a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.factory; - - -import com.casic.missiles.pojo.ProtocolConfig; - -import java.util.List; - -/** - * 数据库访问优化(暂时未做) - *

- * 1、初始化协议解析配置,并存放到处存放缓存,对协议基本配置进行管理 - * 2、其中流程中所有的配置都经过此类进行管理,进行调用获取,增强解析速度 - */ -public interface DatagramFactory { - - /** - * 初始化 - */ - List datagramInit(); - - /** - * 根据前导码配置匹配,模糊匹配获取所有的报文项 - */ - List match(); - - /** - * 根据前导码匹配,返回报文项 - */ - List filer(); - - /** - * 保证数据的唯一性选择器 - */ - List selectOne(); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java new file mode 100644 index 0000000..87444a0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java @@ -0,0 +1,18 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +import java.util.List; + +/** + * 直接用,还是边用边创建 + */ +public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { + + + public DefaultProtocolConfigFactory(ProtocolConfig protocolConfig) { + super(protocolConfig); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java new file mode 100644 index 0000000..cce0c7c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java @@ -0,0 +1,12 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; + +public class DefaultRuleFactory extends AbstractRuleConfigFactory { + + public DefaultRuleFactory(Long ruleId) { + super(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java deleted file mode 100644 index 9ee97e0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.casic.missiles.parser.instance; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service -@Slf4j -@AllArgsConstructor -public class GeneralProcessor { - - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; - - /** - * 统一固定字段解析=>进行规则的查询的判断 - * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 - * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 - */ - @Deprecated - public boolean parseWholeDatagram(ByteBuf buffer, ProtocolConfig protocolConfig) { - try { - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap,protocolId); - //选取规则对应的流程= - DatagramEventConfig datagramEventConfig = processorSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); - //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); - //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); - //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); - //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); - //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); - return true; - } catch (Exception ex) { - log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", - ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); - return false; - } - } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; - } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); - } - - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); - return bizDataMap; - } - - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java index 25e7ad8..6a5777e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java @@ -1,23 +1,31 @@ package com.casic.missiles.parser.instance.impl; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.mapper.DatagramEventMapper; import com.casic.missiles.pojo.DatagramEventConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.SpringContextUtil; -@Service -@AllArgsConstructor +import java.util.List; +import java.util.Optional; + +/** + * @author cz + * + */ public class DefaultProcessorInstanceSelector implements ProcessorInstanceSelector { - private final DatagramEventMapper datagramEventMapper; + private static List datagramEventConfigs; + + static { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + datagramEventConfigs = datagramEventRegistry.getDatagramEventList(); + } @Override public DatagramEventConfig getProcessorInstance(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("rule_id", protocolId); - return datagramEventMapper.selectOne(queryWrapper); + Optional optionalSelectInstance = datagramEventConfigs.stream() + .filter(e -> e.getId().equals(protocolId)).limit(1).findFirst(); + return optionalSelectInstance.isPresent() ? optionalSelectInstance.get() : null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a778671..7b56a43 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,16 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import io.netty.buffer.ByteBuf; /** - * 分析匹配情况 - * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 - * 2、匹配不成功,有后续帧,可以进行下次匹配。 - * 3、匹配不成功,无后续帧,可以进行丢弃。 + * 分析匹配情况 + * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 + * 2、匹配不成功,有后续帧,可以进行下次匹配。 + * 3、匹配不成功,无后续帧,可以进行丢弃。 */ -public interface FrameStructMatcher{ +public interface FrameStructMatcher { - ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig); + ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 05320ab..8ebea78 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,23 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.ProtocolConfigMapper; +import com.casic.missiles.parser.provider.ProtocolConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Component; import java.util.List; import java.util.stream.Collectors; -@Component -@AllArgsConstructor public class LeadingCodeMatcher { - private final ProtocolConfigMapper protocolMapper; - //** 1、首字母匹配前导码, // 2、以匹配出的前导码是否在报文中条件进行前导码的匹配二次筛选 - public List matchLeadingCode(String protocolContent){ + public static List matchFrameLeadingCode(String protocolContent){ List initialConfigs = initialMatch(protocolContent); List preCodeConfigs = initialConfigs.stream() .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) @@ -26,13 +19,16 @@ } //初始化匹配前导码内容 - private List initialMatch(String protocolContent) { - String protocolStr = protocolContent.charAt(0) + ""; - QueryWrapper queryWrapper = new QueryWrapper() - .likeRight("pre_fix", protocolStr); - List protocolConfigList = protocolMapper.selectList(queryWrapper); - return protocolConfigList; + private static List initialMatch(String protocolContent) { + String firstFrameChar = protocolContent.charAt(0) + ""; + ProtocolConfigProvider protocolConfigProvider=new ProtocolConfigProvider(firstFrameChar); + return protocolConfigProvider.getMatchList(); } + + + + + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index cf2113d..e915877 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -1,32 +1,35 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(0) -@Service +@Component public class FrameLengthMatcher implements FrameStructMatcher { - @Autowired - private FieldParser fieldParser; - //超过长度 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { String dataGramContent = ByteBufUtil.hexDump(byteBuf); - if (StringUtils.isEmpty(protocolConfig.getUnpackId()) && StringUtils.isEmpty(protocolConfig.getTailStr())) { - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + //当不存在结尾标志和拆包标志,可以直接使用长度进行匹配 + if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { if (dataGramContent.length() >= totalLength) {//等于长度返回true,超出长度,切断 - ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, protocolConfig, totalLength); + ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, totalLength); return wholeDatagramByte; } else { //读的标志位前移舍弃 @@ -38,7 +41,7 @@ return null; } - private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, Integer totalLength) { byteBuf.readBytes(totalLength); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, totalLength - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java index 608af3a..32cc8a4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java @@ -2,48 +2,47 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.delivery.decorator.ByteDecorator; +import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @AllArgsConstructor public class FieldDecoratorManger { - private final RuleDictDao ruleDictDao; + private final RuleConfigRegistry ruleDictDao; // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 // (1)静态的业务字段是字典里面可以配置的 // (2)动态的业务字段是通过规则生成的 public String contentMerge(String ruleJson, String sceneConent, String dynamicContent) { - List ruleDictList = ruleDictDao.getRuleDictConfig(); - Map ruleDictMap = ruleDictList.stream().collect( - Collectors.toMap(RuleDict::getId, e -> e)); - List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); - for (Map ruleMap : ruleMapList) { - String ruleType = String.valueOf(ruleMap.get("ruleType")); - ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); - NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); - byteDecorator.nodeDecoratorRule(nodeDecoratorParm); - } +// List ruleDictList = ruleDictDao.getRuleDictConfig(); +// Map ruleDictMap = ruleDictList.stream().collect( +// Collectors.toMap(RuleDict::getId, e -> e)); +// List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); +// for (Map ruleMap : ruleMapList) { +// String ruleType = String.valueOf(ruleMap.get("ruleType")); +// ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); +// NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); +// byteDecorator.nodeDecoratorRule(nodeDecoratorParm); +// } return null; } - - private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { - NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() - .contents(sceneConent) - .dynamicContent(dynamicContent) - .ruletypeId(ruletypeId) - .ruleDictMap(ruleDictMap) - .build(); - return nodeDecoratorParm; - } +// +// private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { +// NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() +// .contents(sceneConent) +// .dynamicContent(dynamicContent) +// .ruletypeId(ruletypeId) +// .ruleDictMap(ruleDictMap) +// .build(); +// return nodeDecoratorParm; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java index 652970c..b204ac3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java @@ -1,56 +1,56 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@AllArgsConstructor -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", - JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Component; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Component("logicalDecorator") +//@AllArgsConstructor +//@Slf4j +//public class LogicalShiftDecorator implements ByteDecorator { +// +//// private final FieldRuleEngineMapper fieldRuleEngineMapper; +//// +//// //字节位移 +//// @Override +//// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +//// String logicalValue = ""; +//// RuleEvaluator fieldRuleEngine = new RuleEvaluator(); +//// try { +//// Map env2 = new HashMap(); +//// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +//// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +//// for (String contentId : contentIdList) { +//// RuleDict ruleDict = ruleDictMap.get(contentId); +//// if (ruleDict.getCode().contains("#")) { +//// //使用动态的值 +//// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +//// } +//// env2.put(ruleDict.getName(), ruleDict.getCode()); +//// } +//// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +//// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +//// return null; +//// } +//// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +//// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +//// return values; +//// } catch (Exception ex) { +//// log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", +//// JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +//// return null; +//// } +//// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java index 346468f..822fead 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@AllArgsConstructor -@Slf4j -public class OperationDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("optionDecorator") +//@AllArgsConstructor +//@Slf4j +//public class OperationDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //混合运算,有常量或者乘除的缩放 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java index 50fb0a7..7a8bccb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@AllArgsConstructor -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +////精度计算 +//@AllArgsConstructor +//@Registry("precisionDecorator") +//@Slf4j +//public class PrecisionDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java index da39235..27f9cc7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java @@ -1,54 +1,53 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@AllArgsConstructor -@Slf4j -public class RuleDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("ruleDecorator") +//@AllArgsConstructor +//@Slf4j +//public class RuleDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //吃我一套正则表达式 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (Exception ex) { +// log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java index 7f5cbf3..c043f97 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java @@ -2,6 +2,6 @@ import java.util.Map; -public interface ComandeEventService { +public interface ComandeEventService{ Map loadComandeEventConfig(String protocolId,String scene); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java index 476ad84..aaf1837 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java @@ -2,46 +2,46 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.dao.CommandEventDao; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @Slf4j @AllArgsConstructor -public class ComandeEventServiceImpl implements ComandeEventService { +public class ComandeEventServiceImpl implements ComandeEventRegistry { - private final CommandEventDao commandEventDao; + // private final CommandEventDao commandEventDao; // 加密bean 固定字段出现变化的字段解析,业务字段的有序内容 @Override - public Map loadComandeEventConfig(String protocolId,String sceneName) { - CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); - if (ObjectUtil.isEmpty(commandEventConfig)) { - log.error("协议{},没有配置成功接收回复配置,清排查原因"); - return null; - } - String replyJson = commandEventConfig.getReplyContentJson(); - List> replyMapList = JSONArray.parseObject(replyJson, List.class); - List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); - Map fixMap = fixList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); - List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) - .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) - .collect(Collectors.toList()); - Map commandConfigMap = new HashMap<>(); - commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); - commandConfigMap.put("fixContent", fixMap); - commandConfigMap.put("bizContent", contentList); - return commandConfigMap; + public Map loadComandeEventConfig(String protocolId, String sceneName) { +// CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); +// if (ObjectUtil.isEmpty(commandEventConfig)) { +// log.error("协议{},没有配置成功接收回复配置,清排查原因"); +// return null; +// } +// String replyJson = commandEventConfig.getReplyContentJson(); +// List> replyMapList = JSONArray.parseObject(replyJson, List.class); +// List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); +// Map fixMap = fixList.stream() +// .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); +// List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) +// .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) +// .collect(Collectors.toList()); +// Map commandConfigMap = new HashMap<>(); +// commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); +// commandConfigMap.put("fixContent", fixMap); +// commandConfigMap.put("bizContent", contentList); +// return commandConfigMap; + return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 128b09d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java deleted file mode 100644 index 4016b0b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface DatagramEventMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java deleted file mode 100644 index 597c306..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.apache.ibatis.annotations.Mapper; - -public interface FieldConfigMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java deleted file mode 100644 index a31680a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.PreRuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface PreRuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java deleted file mode 100644 index 9060a69..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface ProtocolConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java deleted file mode 100644 index 6fa6936..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java deleted file mode 100644 index 582a705..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleDict; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleDictMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java deleted file mode 100644 index 6e302c8..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.CommandEventMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Optional; - -@Component -public class CommandEventDao { - - @Resource - private CommandEventMapper commandEventMapper; - - public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId) - .eq("scene", sceneName) - .eq("enabled", 1); - List commandEventConfig = commandEventMapper.selectList(queryWrapper); - Optional optionalEventConfig = commandEventConfig.stream().findFirst(); - return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java deleted file mode 100644 index 9137e4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.FieldConfigMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class FieldConfigDao { - - @Resource - private FieldConfigMapper fieldConfigMapper; - - public FieldConfig getFieldConfigById(String fieldId) { - FieldConfig fieldConfig = fieldConfigMapper.selectById(fieldId); - return fieldConfig; - } - - public List getFieldConfigs(String protocolId,Integer isFixed) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",isFixed); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - - public List getStorageFieldConfig(String protocolId) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",1) - .eq("is_storage",1); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java deleted file mode 100644 index 67bff6b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.mapper.PreRuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class PreRuleConfigDao { - - @Resource - private PreRuleConfigMapper preRuleConfigMapper; - - public List getPreRuleList(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return preRuleConfigMapper.selectList(queryWrapper); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java deleted file mode 100644 index d69ea85..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.RuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleConfigDao { - - @Resource - private RuleConfigMapper ruleConfigMapper; - - public RuleConfig getNextRuleConfig(String ruleFields) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("parse_rule_json", ruleFields); - return ruleConfigMapper.selectOne(queryWrapper); - } - - - public List getRuleConfigById(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return ruleConfigMapper.selectList(queryWrapper); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java deleted file mode 100644 index 932c185..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.RuleDictMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleDictDao { - - @Resource - private RuleDictMapper ruleDictMapper; - - public List getRuleDictConfig() { - List ruleDictList = ruleDictMapper.selectList(null); - return ruleDictList; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java index 9f9e279..43bc4d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java @@ -10,20 +10,15 @@ import io.netty.channel.socket.nio.NioServerSocketChannel; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import javax.annotation.PreDestroy; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static cn.hutool.core.util.ClassUtil.getClasses; /** * SensorhubServer netty服务端 */ @Slf4j -@Service +@Component public class SensorhubServer { /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java index 2c79ff5..9a28c36 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java @@ -11,13 +11,13 @@ import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioSocketChannel; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClient 客户端 */ @Slf4j -@Service +@Registry public final class SensorhubClient { public static void main(String[] args) throws Exception { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java index 9774be0..477c3f7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java @@ -6,12 +6,12 @@ import io.netty.channel.socket.SocketChannel; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientChannelInitialHandler */ -@Service +@Registry public class SensorhubClientChannelInitialHandler extends ChannelInitializer { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java index 346f4b3..73560e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java @@ -5,13 +5,13 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientHandler */ @Slf4j -@Service +@Registry public class SensorhubClientHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java index 5c1c6f2..d990af5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java @@ -4,12 +4,12 @@ import com.casic.missiles.pojo.Msg; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** * SensorhubServerHandler */ -@Service +@Component public class SensorhubServerHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 67283ae..af3172c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,41 +1,37 @@ package com.casic.missiles.parser; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultProtocolConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.*; +import com.casic.missiles.registry.FieldConfigRegistry; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; -import java.nio.charset.Charset; import java.util.HashMap; import java.util.List; import java.util.Map; -@Service("genericProtocolParser") +/** + * @author + */ +@Component("genericProtocolParser") @Slf4j -@AllArgsConstructor +@RequiredArgsConstructor public class GenericProtocolParser implements ProtocolParser { - private final LeadingCodeMatcher leadingCodeMatcher; private final List frameStructDispenserList; - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorInstanceSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; // 匹配首字母前导码=> 帧结构匹配前导码=> // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 @@ -44,18 +40,19 @@ public Boolean doParseProtocol(ByteBuf byteBuf) { String protocolContent = ByteBufUtil.hexDump(byteBuf); //匹配前导码 - List preCodeConfigs = leadingCodeMatcher.matchLeadingCode(protocolContent); + List preCodeConfigs = LeadingCodeMatcher.matchFrameLeadingCode(protocolContent); //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 if (preCodeConfigs.size() == 0) { - return rematch(byteBuf,protocolContent); + return rematch(byteBuf, protocolContent); } - //暂时先取第一个 + //暂时先取第一个,提升速度,使用享元模式, 减少类的创建销毁与构建 ProtocolConfig protocolConfig = preCodeConfigs.get(0); + AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); ByteBuf wholeDatagramByte = null; //通过匹配帧结构获取完整的数据包 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, preCodeConfigs.get(0))) != null) { + if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, protocolFactory)) != null) { break; } } @@ -68,76 +65,78 @@ * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 */ - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId, wholeDatagramByte); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap, protocolId); - //选取规则对应的流程实例 - DatagramEventConfig datagramEventConfig = processorInstanceSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); + //进行规则字段解析,进行匹配规则 + RuleConfig ruleConfig = getRuleConfig(protocolFactory, wholeDatagramByte); + if (ruleConfig == null) { + return false; + } //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, wholeDatagramByte); + ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte); + //以下进行业务的规则解析,同时选定流程实例 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); + DatagramEventProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain, + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText, protocolId); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain); //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); + datagramEventProvider.storeData(bizDataMap); return true; } - private Boolean rematch(ByteBuf byteBuf,String protocolContent) { + /** + * 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 + */ + private Boolean rematch(ByteBuf byteBuf, String protocolContent) { //重置位判断 byteBuf.resetReaderIndex(); //判断重置是否前移,如果没有前移,则直接判为匹配失败 if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { return false; } else { + //递归执行 return doParseProtocol(byteBuf); } } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; + //获取匹配规则->匹配规则 + private RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + //取出其中参与逻辑provider并判空 + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); + String rulePrepareFields = protocolConfig.getRulePrepareFields(); + //固定字段 + if (StringUtils.isNotEmpty(rulePrepareFields)) { + //获取统一固定字段解析 + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + //获取该协议的字段配置,用于协议规则匹配 + List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); + //获取规则 + RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, + rulePrepareFields, protocolFieldConfigs); + return ruleConfig; + } + return null; } - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + //数据构建,获取固定字段的store和业务字段store + private Map buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + Map bizDataMap = new HashMap<>(); + Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); + Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); + bizDataMap.putAll(ruleStoreObjectMap); + bizDataMap.putAll(protocolStoreObjectMap); return bizDataMap; } - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java index 8a46e32..16ce2e5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java @@ -3,6 +3,7 @@ import io.netty.buffer.ByteBuf; public interface ProtocolParser { + Boolean doParseProtocol(ByteBuf byteBuf); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java new file mode 100644 index 0000000..f7814af --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java @@ -0,0 +1,35 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.ProtocolConfigProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.ProtocolConfig; + +/** + * 存放基本协议的的加载信息 + */ +public class AbstractProtocolConfigFactory { + private final ProtocolConfigProvider protocolConfigProvider; + private final ProtocolFieldConfigProvider protocolFieldConfigProvider; + private final RuleConfigProvider ruleConfigProvider; + + public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { + this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); + this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); + this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); + } + + public ProtocolConfigProvider getProtocolConfigProvider() { + return protocolConfigProvider; + } + + public ProtocolFieldConfigProvider getProtocolFieldConfigProvider() { + return protocolFieldConfigProvider; + } + + public RuleConfigProvider getRuleConfigProvider() { + return ruleConfigProvider; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java new file mode 100644 index 0000000..6e36147 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java @@ -0,0 +1,57 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.CombinedFieldConfigProvider; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.FieldConfigProvider; +import com.casic.missiles.parser.provider.FieldRuleConfigProvider; + +/** + * 存放规则相关的的的加载信息 + */ +public class AbstractRuleConfigFactory { + + /** + * 处理字节 + */ + private final FieldConfigProvider fieldConfigProvider; + /** + * 处理组合字节解析的解码器 + */ + private final CombinedFieldConfigProvider combinedFieldConfigProvider; + /** + * 处理负责字节解析的规则配置 + */ + private final FieldRuleConfigProvider fieldRuleConfigProvider; + /** + * 处理实例流程 + */ + private final DatagramEventProvider datagramEventProvider; + + + public AbstractRuleConfigFactory(Long ruleId) { + this.fieldConfigProvider = new FieldConfigProvider(ruleId); + this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); + this.fieldRuleConfigProvider = new FieldRuleConfigProvider(ruleId); + this.datagramEventProvider = new DatagramEventProvider(ruleId); + } + + public FieldConfigProvider getFieldConfigProvider() { + return fieldConfigProvider; + } + + public CombinedFieldConfigProvider getCombinedFieldConfigProvider() { + return combinedFieldConfigProvider; + } + + public FieldRuleConfigProvider getFieldRuleConfigProvider() { + return fieldRuleConfigProvider; + } + + public DatagramEventProvider getDatagramEventProvider() { + return datagramEventProvider; + } + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java deleted file mode 100644 index 6e1719a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.factory; - - -import com.casic.missiles.pojo.ProtocolConfig; - -import java.util.List; - -/** - * 数据库访问优化(暂时未做) - *

- * 1、初始化协议解析配置,并存放到处存放缓存,对协议基本配置进行管理 - * 2、其中流程中所有的配置都经过此类进行管理,进行调用获取,增强解析速度 - */ -public interface DatagramFactory { - - /** - * 初始化 - */ - List datagramInit(); - - /** - * 根据前导码配置匹配,模糊匹配获取所有的报文项 - */ - List match(); - - /** - * 根据前导码匹配,返回报文项 - */ - List filer(); - - /** - * 保证数据的唯一性选择器 - */ - List selectOne(); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java new file mode 100644 index 0000000..87444a0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java @@ -0,0 +1,18 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +import java.util.List; + +/** + * 直接用,还是边用边创建 + */ +public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { + + + public DefaultProtocolConfigFactory(ProtocolConfig protocolConfig) { + super(protocolConfig); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java new file mode 100644 index 0000000..cce0c7c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java @@ -0,0 +1,12 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; + +public class DefaultRuleFactory extends AbstractRuleConfigFactory { + + public DefaultRuleFactory(Long ruleId) { + super(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java deleted file mode 100644 index 9ee97e0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.casic.missiles.parser.instance; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service -@Slf4j -@AllArgsConstructor -public class GeneralProcessor { - - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; - - /** - * 统一固定字段解析=>进行规则的查询的判断 - * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 - * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 - */ - @Deprecated - public boolean parseWholeDatagram(ByteBuf buffer, ProtocolConfig protocolConfig) { - try { - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap,protocolId); - //选取规则对应的流程= - DatagramEventConfig datagramEventConfig = processorSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); - //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); - //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); - //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); - //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); - //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); - return true; - } catch (Exception ex) { - log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", - ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); - return false; - } - } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; - } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); - } - - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); - return bizDataMap; - } - - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java index 25e7ad8..6a5777e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java @@ -1,23 +1,31 @@ package com.casic.missiles.parser.instance.impl; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.mapper.DatagramEventMapper; import com.casic.missiles.pojo.DatagramEventConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.SpringContextUtil; -@Service -@AllArgsConstructor +import java.util.List; +import java.util.Optional; + +/** + * @author cz + * + */ public class DefaultProcessorInstanceSelector implements ProcessorInstanceSelector { - private final DatagramEventMapper datagramEventMapper; + private static List datagramEventConfigs; + + static { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + datagramEventConfigs = datagramEventRegistry.getDatagramEventList(); + } @Override public DatagramEventConfig getProcessorInstance(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("rule_id", protocolId); - return datagramEventMapper.selectOne(queryWrapper); + Optional optionalSelectInstance = datagramEventConfigs.stream() + .filter(e -> e.getId().equals(protocolId)).limit(1).findFirst(); + return optionalSelectInstance.isPresent() ? optionalSelectInstance.get() : null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a778671..7b56a43 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,16 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import io.netty.buffer.ByteBuf; /** - * 分析匹配情况 - * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 - * 2、匹配不成功,有后续帧,可以进行下次匹配。 - * 3、匹配不成功,无后续帧,可以进行丢弃。 + * 分析匹配情况 + * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 + * 2、匹配不成功,有后续帧,可以进行下次匹配。 + * 3、匹配不成功,无后续帧,可以进行丢弃。 */ -public interface FrameStructMatcher{ +public interface FrameStructMatcher { - ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig); + ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 05320ab..8ebea78 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,23 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.ProtocolConfigMapper; +import com.casic.missiles.parser.provider.ProtocolConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Component; import java.util.List; import java.util.stream.Collectors; -@Component -@AllArgsConstructor public class LeadingCodeMatcher { - private final ProtocolConfigMapper protocolMapper; - //** 1、首字母匹配前导码, // 2、以匹配出的前导码是否在报文中条件进行前导码的匹配二次筛选 - public List matchLeadingCode(String protocolContent){ + public static List matchFrameLeadingCode(String protocolContent){ List initialConfigs = initialMatch(protocolContent); List preCodeConfigs = initialConfigs.stream() .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) @@ -26,13 +19,16 @@ } //初始化匹配前导码内容 - private List initialMatch(String protocolContent) { - String protocolStr = protocolContent.charAt(0) + ""; - QueryWrapper queryWrapper = new QueryWrapper() - .likeRight("pre_fix", protocolStr); - List protocolConfigList = protocolMapper.selectList(queryWrapper); - return protocolConfigList; + private static List initialMatch(String protocolContent) { + String firstFrameChar = protocolContent.charAt(0) + ""; + ProtocolConfigProvider protocolConfigProvider=new ProtocolConfigProvider(firstFrameChar); + return protocolConfigProvider.getMatchList(); } + + + + + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index cf2113d..e915877 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -1,32 +1,35 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(0) -@Service +@Component public class FrameLengthMatcher implements FrameStructMatcher { - @Autowired - private FieldParser fieldParser; - //超过长度 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { String dataGramContent = ByteBufUtil.hexDump(byteBuf); - if (StringUtils.isEmpty(protocolConfig.getUnpackId()) && StringUtils.isEmpty(protocolConfig.getTailStr())) { - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + //当不存在结尾标志和拆包标志,可以直接使用长度进行匹配 + if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { if (dataGramContent.length() >= totalLength) {//等于长度返回true,超出长度,切断 - ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, protocolConfig, totalLength); + ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, totalLength); return wholeDatagramByte; } else { //读的标志位前移舍弃 @@ -38,7 +41,7 @@ return null; } - private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, Integer totalLength) { byteBuf.readBytes(totalLength); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, totalLength - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 2bfc213..d527ad0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; @@ -13,7 +13,7 @@ import lombok.AllArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.nio.charset.Charset; import java.util.Map; @@ -22,32 +22,30 @@ * 后续标志验证 */ @Order(1) -@Service +@Component @AllArgsConstructor -public class FrameMarkMatcher implements FrameStructMatcher { - - private final FieldConfigDao fieldConfigDao; - private final FieldParser fieldParser; - private final FieldResolver fieldResolverManger; +public class FrameMarkMatcher implements FrameStructMatcher, FixedPropertyEnum { //帧后续标志=>结束,进行帧的重组=>有后续,1、帧移位判别 2、继续接收帧 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig UnpackConfig = StringUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getUnpackId()); - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); - Integer upback = 0; + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); ByteBuf mergeWholeFrameByte = null; - if (!ObjectUtil.isEmpty(UnpackConfig)) { - while (hasNextFullFrame(byteBuf, protocolConfig)) { - upback = (Integer) fieldResolverManger.filedParserManger(byteBuf, UnpackConfig, null); + if (!ObjectUtil.isEmpty(unpackFlag)) { + while (hasNextFullFrame(byteBuf, protocolConfig, protocolFieldConfigProvider)) { //是否存在后续位 - if (upback == 1) {//使用esayRule + if (unpackFlag == 1) {//使用esayRule //表示可以截取 - mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolConfig, totalLength); + mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolFieldConfigProvider, protocolConfig); return mergeWholeFrameByte; } else { - byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig)); + byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig, protocolFieldConfigProvider)); } } } @@ -56,7 +54,8 @@ //选取第一个帧,将业务内容和后面部分分开 //计算数据报文-业务内容 - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolFieldConfigProvider protocolFieldConfigProvider, ProtocolConfig protocolConfig) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); //截取完整报文 byteBuf.readBytes(totalLength); ByteBuf byteBufContent = byteBuf.slice(0, byteBuf.readerIndex()); @@ -68,15 +67,15 @@ String tail = ""; System.out.println(ByteBufUtil.hexDump(byteBufContent)); //会存在多个帧拼接在一起的的情况,进行合并处理 - while (hasNextFullFrame(byteBufContent, protocolConfig)) { - Integer currentFrameLength = fieldParser.getTotalLength(protocolConfig, byteBufContent); + while (hasNextFullFrame(byteBufContent, protocolConfig, protocolFieldConfigProvider)) { + Integer currentFrameLength = protocolFieldConfigProvider.getTotalLength(byteBufContent, protocolConfig); byteBufContent.readBytes(currentFrameLength); ByteBuf currentbyteBuf = byteBufContent.slice(0, byteBufContent.readerIndex()); byteBufContent.markReaderIndex();//读的标志位前移 System.out.println(ByteBufUtil.hexDump(byteBufContent)); String hexDump = currentbyteBuf.toString(Charset.forName("ISO-8859-1")); //获取当前固定帧结构的关系map - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, currentbyteBuf); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(currentbyteBuf, protocolConfig); if (StringUtils.isEmpty(mergeFrameStr)) { //首次获取业务数据报文 mergeFrameStr += hexDump.substring(0, currentFrameFixedProperty.get("tailPosition")); @@ -95,22 +94,22 @@ /** * 获取平移到下一帧起始位置 */ - public int getNextFrameOffset(ByteBuf buffer, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, buffer); - return currentFrameFixedProperty.get("totalLength"); + public int getNextFrameOffset(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + return currentFrameFixedProperty.get(TOTAL_LENGTH); } /** * 判断是否出错进行整个帧的 */ - public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, byteBuf); + public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); //保证读取位置不在固定位置,是可变的业务内容 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("fixedPosition")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(FIXED_POSITION)) { return false; } //判断读取是否操作帧长度 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("totalLength")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(TOTAL_LENGTH)) { return false; } return true; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java index 608af3a..32cc8a4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java @@ -2,48 +2,47 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.delivery.decorator.ByteDecorator; +import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @AllArgsConstructor public class FieldDecoratorManger { - private final RuleDictDao ruleDictDao; + private final RuleConfigRegistry ruleDictDao; // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 // (1)静态的业务字段是字典里面可以配置的 // (2)动态的业务字段是通过规则生成的 public String contentMerge(String ruleJson, String sceneConent, String dynamicContent) { - List ruleDictList = ruleDictDao.getRuleDictConfig(); - Map ruleDictMap = ruleDictList.stream().collect( - Collectors.toMap(RuleDict::getId, e -> e)); - List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); - for (Map ruleMap : ruleMapList) { - String ruleType = String.valueOf(ruleMap.get("ruleType")); - ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); - NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); - byteDecorator.nodeDecoratorRule(nodeDecoratorParm); - } +// List ruleDictList = ruleDictDao.getRuleDictConfig(); +// Map ruleDictMap = ruleDictList.stream().collect( +// Collectors.toMap(RuleDict::getId, e -> e)); +// List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); +// for (Map ruleMap : ruleMapList) { +// String ruleType = String.valueOf(ruleMap.get("ruleType")); +// ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); +// NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); +// byteDecorator.nodeDecoratorRule(nodeDecoratorParm); +// } return null; } - - private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { - NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() - .contents(sceneConent) - .dynamicContent(dynamicContent) - .ruletypeId(ruletypeId) - .ruleDictMap(ruleDictMap) - .build(); - return nodeDecoratorParm; - } +// +// private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { +// NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() +// .contents(sceneConent) +// .dynamicContent(dynamicContent) +// .ruletypeId(ruletypeId) +// .ruleDictMap(ruleDictMap) +// .build(); +// return nodeDecoratorParm; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java index 652970c..b204ac3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java @@ -1,56 +1,56 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@AllArgsConstructor -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", - JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Component; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Component("logicalDecorator") +//@AllArgsConstructor +//@Slf4j +//public class LogicalShiftDecorator implements ByteDecorator { +// +//// private final FieldRuleEngineMapper fieldRuleEngineMapper; +//// +//// //字节位移 +//// @Override +//// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +//// String logicalValue = ""; +//// RuleEvaluator fieldRuleEngine = new RuleEvaluator(); +//// try { +//// Map env2 = new HashMap(); +//// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +//// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +//// for (String contentId : contentIdList) { +//// RuleDict ruleDict = ruleDictMap.get(contentId); +//// if (ruleDict.getCode().contains("#")) { +//// //使用动态的值 +//// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +//// } +//// env2.put(ruleDict.getName(), ruleDict.getCode()); +//// } +//// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +//// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +//// return null; +//// } +//// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +//// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +//// return values; +//// } catch (Exception ex) { +//// log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", +//// JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +//// return null; +//// } +//// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java index 346468f..822fead 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@AllArgsConstructor -@Slf4j -public class OperationDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("optionDecorator") +//@AllArgsConstructor +//@Slf4j +//public class OperationDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //混合运算,有常量或者乘除的缩放 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java index 50fb0a7..7a8bccb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@AllArgsConstructor -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +////精度计算 +//@AllArgsConstructor +//@Registry("precisionDecorator") +//@Slf4j +//public class PrecisionDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java index da39235..27f9cc7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java @@ -1,54 +1,53 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@AllArgsConstructor -@Slf4j -public class RuleDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("ruleDecorator") +//@AllArgsConstructor +//@Slf4j +//public class RuleDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //吃我一套正则表达式 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (Exception ex) { +// log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java index 7f5cbf3..c043f97 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java @@ -2,6 +2,6 @@ import java.util.Map; -public interface ComandeEventService { +public interface ComandeEventService{ Map loadComandeEventConfig(String protocolId,String scene); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java index 476ad84..aaf1837 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java @@ -2,46 +2,46 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.dao.CommandEventDao; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @Slf4j @AllArgsConstructor -public class ComandeEventServiceImpl implements ComandeEventService { +public class ComandeEventServiceImpl implements ComandeEventRegistry { - private final CommandEventDao commandEventDao; + // private final CommandEventDao commandEventDao; // 加密bean 固定字段出现变化的字段解析,业务字段的有序内容 @Override - public Map loadComandeEventConfig(String protocolId,String sceneName) { - CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); - if (ObjectUtil.isEmpty(commandEventConfig)) { - log.error("协议{},没有配置成功接收回复配置,清排查原因"); - return null; - } - String replyJson = commandEventConfig.getReplyContentJson(); - List> replyMapList = JSONArray.parseObject(replyJson, List.class); - List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); - Map fixMap = fixList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); - List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) - .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) - .collect(Collectors.toList()); - Map commandConfigMap = new HashMap<>(); - commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); - commandConfigMap.put("fixContent", fixMap); - commandConfigMap.put("bizContent", contentList); - return commandConfigMap; + public Map loadComandeEventConfig(String protocolId, String sceneName) { +// CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); +// if (ObjectUtil.isEmpty(commandEventConfig)) { +// log.error("协议{},没有配置成功接收回复配置,清排查原因"); +// return null; +// } +// String replyJson = commandEventConfig.getReplyContentJson(); +// List> replyMapList = JSONArray.parseObject(replyJson, List.class); +// List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); +// Map fixMap = fixList.stream() +// .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); +// List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) +// .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) +// .collect(Collectors.toList()); +// Map commandConfigMap = new HashMap<>(); +// commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); +// commandConfigMap.put("fixContent", fixMap); +// commandConfigMap.put("bizContent", contentList); +// return commandConfigMap; + return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 128b09d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java deleted file mode 100644 index 4016b0b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface DatagramEventMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java deleted file mode 100644 index 597c306..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.apache.ibatis.annotations.Mapper; - -public interface FieldConfigMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java deleted file mode 100644 index a31680a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.PreRuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface PreRuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java deleted file mode 100644 index 9060a69..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface ProtocolConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java deleted file mode 100644 index 6fa6936..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java deleted file mode 100644 index 582a705..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleDict; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleDictMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java deleted file mode 100644 index 6e302c8..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.CommandEventMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Optional; - -@Component -public class CommandEventDao { - - @Resource - private CommandEventMapper commandEventMapper; - - public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId) - .eq("scene", sceneName) - .eq("enabled", 1); - List commandEventConfig = commandEventMapper.selectList(queryWrapper); - Optional optionalEventConfig = commandEventConfig.stream().findFirst(); - return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java deleted file mode 100644 index 9137e4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.FieldConfigMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class FieldConfigDao { - - @Resource - private FieldConfigMapper fieldConfigMapper; - - public FieldConfig getFieldConfigById(String fieldId) { - FieldConfig fieldConfig = fieldConfigMapper.selectById(fieldId); - return fieldConfig; - } - - public List getFieldConfigs(String protocolId,Integer isFixed) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",isFixed); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - - public List getStorageFieldConfig(String protocolId) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",1) - .eq("is_storage",1); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java deleted file mode 100644 index 67bff6b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.mapper.PreRuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class PreRuleConfigDao { - - @Resource - private PreRuleConfigMapper preRuleConfigMapper; - - public List getPreRuleList(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return preRuleConfigMapper.selectList(queryWrapper); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java deleted file mode 100644 index d69ea85..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.RuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleConfigDao { - - @Resource - private RuleConfigMapper ruleConfigMapper; - - public RuleConfig getNextRuleConfig(String ruleFields) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("parse_rule_json", ruleFields); - return ruleConfigMapper.selectOne(queryWrapper); - } - - - public List getRuleConfigById(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return ruleConfigMapper.selectList(queryWrapper); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java deleted file mode 100644 index 932c185..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.RuleDictMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleDictDao { - - @Resource - private RuleDictMapper ruleDictMapper; - - public List getRuleDictConfig() { - List ruleDictList = ruleDictMapper.selectList(null); - return ruleDictList; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java index 9f9e279..43bc4d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java @@ -10,20 +10,15 @@ import io.netty.channel.socket.nio.NioServerSocketChannel; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import javax.annotation.PreDestroy; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static cn.hutool.core.util.ClassUtil.getClasses; /** * SensorhubServer netty服务端 */ @Slf4j -@Service +@Component public class SensorhubServer { /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java index 2c79ff5..9a28c36 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java @@ -11,13 +11,13 @@ import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioSocketChannel; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClient 客户端 */ @Slf4j -@Service +@Registry public final class SensorhubClient { public static void main(String[] args) throws Exception { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java index 9774be0..477c3f7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java @@ -6,12 +6,12 @@ import io.netty.channel.socket.SocketChannel; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientChannelInitialHandler */ -@Service +@Registry public class SensorhubClientChannelInitialHandler extends ChannelInitializer { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java index 346f4b3..73560e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java @@ -5,13 +5,13 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientHandler */ @Slf4j -@Service +@Registry public class SensorhubClientHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java index 5c1c6f2..d990af5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java @@ -4,12 +4,12 @@ import com.casic.missiles.pojo.Msg; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** * SensorhubServerHandler */ -@Service +@Component public class SensorhubServerHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 67283ae..af3172c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,41 +1,37 @@ package com.casic.missiles.parser; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultProtocolConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.*; +import com.casic.missiles.registry.FieldConfigRegistry; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; -import java.nio.charset.Charset; import java.util.HashMap; import java.util.List; import java.util.Map; -@Service("genericProtocolParser") +/** + * @author + */ +@Component("genericProtocolParser") @Slf4j -@AllArgsConstructor +@RequiredArgsConstructor public class GenericProtocolParser implements ProtocolParser { - private final LeadingCodeMatcher leadingCodeMatcher; private final List frameStructDispenserList; - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorInstanceSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; // 匹配首字母前导码=> 帧结构匹配前导码=> // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 @@ -44,18 +40,19 @@ public Boolean doParseProtocol(ByteBuf byteBuf) { String protocolContent = ByteBufUtil.hexDump(byteBuf); //匹配前导码 - List preCodeConfigs = leadingCodeMatcher.matchLeadingCode(protocolContent); + List preCodeConfigs = LeadingCodeMatcher.matchFrameLeadingCode(protocolContent); //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 if (preCodeConfigs.size() == 0) { - return rematch(byteBuf,protocolContent); + return rematch(byteBuf, protocolContent); } - //暂时先取第一个 + //暂时先取第一个,提升速度,使用享元模式, 减少类的创建销毁与构建 ProtocolConfig protocolConfig = preCodeConfigs.get(0); + AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); ByteBuf wholeDatagramByte = null; //通过匹配帧结构获取完整的数据包 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, preCodeConfigs.get(0))) != null) { + if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, protocolFactory)) != null) { break; } } @@ -68,76 +65,78 @@ * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 */ - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId, wholeDatagramByte); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap, protocolId); - //选取规则对应的流程实例 - DatagramEventConfig datagramEventConfig = processorInstanceSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); + //进行规则字段解析,进行匹配规则 + RuleConfig ruleConfig = getRuleConfig(protocolFactory, wholeDatagramByte); + if (ruleConfig == null) { + return false; + } //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, wholeDatagramByte); + ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte); + //以下进行业务的规则解析,同时选定流程实例 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); + DatagramEventProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain, + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText, protocolId); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain); //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); + datagramEventProvider.storeData(bizDataMap); return true; } - private Boolean rematch(ByteBuf byteBuf,String protocolContent) { + /** + * 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 + */ + private Boolean rematch(ByteBuf byteBuf, String protocolContent) { //重置位判断 byteBuf.resetReaderIndex(); //判断重置是否前移,如果没有前移,则直接判为匹配失败 if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { return false; } else { + //递归执行 return doParseProtocol(byteBuf); } } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; + //获取匹配规则->匹配规则 + private RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + //取出其中参与逻辑provider并判空 + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); + String rulePrepareFields = protocolConfig.getRulePrepareFields(); + //固定字段 + if (StringUtils.isNotEmpty(rulePrepareFields)) { + //获取统一固定字段解析 + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + //获取该协议的字段配置,用于协议规则匹配 + List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); + //获取规则 + RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, + rulePrepareFields, protocolFieldConfigs); + return ruleConfig; + } + return null; } - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + //数据构建,获取固定字段的store和业务字段store + private Map buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + Map bizDataMap = new HashMap<>(); + Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); + Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); + bizDataMap.putAll(ruleStoreObjectMap); + bizDataMap.putAll(protocolStoreObjectMap); return bizDataMap; } - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java index 8a46e32..16ce2e5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java @@ -3,6 +3,7 @@ import io.netty.buffer.ByteBuf; public interface ProtocolParser { + Boolean doParseProtocol(ByteBuf byteBuf); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java new file mode 100644 index 0000000..f7814af --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java @@ -0,0 +1,35 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.ProtocolConfigProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.ProtocolConfig; + +/** + * 存放基本协议的的加载信息 + */ +public class AbstractProtocolConfigFactory { + private final ProtocolConfigProvider protocolConfigProvider; + private final ProtocolFieldConfigProvider protocolFieldConfigProvider; + private final RuleConfigProvider ruleConfigProvider; + + public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { + this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); + this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); + this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); + } + + public ProtocolConfigProvider getProtocolConfigProvider() { + return protocolConfigProvider; + } + + public ProtocolFieldConfigProvider getProtocolFieldConfigProvider() { + return protocolFieldConfigProvider; + } + + public RuleConfigProvider getRuleConfigProvider() { + return ruleConfigProvider; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java new file mode 100644 index 0000000..6e36147 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java @@ -0,0 +1,57 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.CombinedFieldConfigProvider; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.FieldConfigProvider; +import com.casic.missiles.parser.provider.FieldRuleConfigProvider; + +/** + * 存放规则相关的的的加载信息 + */ +public class AbstractRuleConfigFactory { + + /** + * 处理字节 + */ + private final FieldConfigProvider fieldConfigProvider; + /** + * 处理组合字节解析的解码器 + */ + private final CombinedFieldConfigProvider combinedFieldConfigProvider; + /** + * 处理负责字节解析的规则配置 + */ + private final FieldRuleConfigProvider fieldRuleConfigProvider; + /** + * 处理实例流程 + */ + private final DatagramEventProvider datagramEventProvider; + + + public AbstractRuleConfigFactory(Long ruleId) { + this.fieldConfigProvider = new FieldConfigProvider(ruleId); + this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); + this.fieldRuleConfigProvider = new FieldRuleConfigProvider(ruleId); + this.datagramEventProvider = new DatagramEventProvider(ruleId); + } + + public FieldConfigProvider getFieldConfigProvider() { + return fieldConfigProvider; + } + + public CombinedFieldConfigProvider getCombinedFieldConfigProvider() { + return combinedFieldConfigProvider; + } + + public FieldRuleConfigProvider getFieldRuleConfigProvider() { + return fieldRuleConfigProvider; + } + + public DatagramEventProvider getDatagramEventProvider() { + return datagramEventProvider; + } + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java deleted file mode 100644 index 6e1719a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.factory; - - -import com.casic.missiles.pojo.ProtocolConfig; - -import java.util.List; - -/** - * 数据库访问优化(暂时未做) - *

- * 1、初始化协议解析配置,并存放到处存放缓存,对协议基本配置进行管理 - * 2、其中流程中所有的配置都经过此类进行管理,进行调用获取,增强解析速度 - */ -public interface DatagramFactory { - - /** - * 初始化 - */ - List datagramInit(); - - /** - * 根据前导码配置匹配,模糊匹配获取所有的报文项 - */ - List match(); - - /** - * 根据前导码匹配,返回报文项 - */ - List filer(); - - /** - * 保证数据的唯一性选择器 - */ - List selectOne(); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java new file mode 100644 index 0000000..87444a0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java @@ -0,0 +1,18 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +import java.util.List; + +/** + * 直接用,还是边用边创建 + */ +public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { + + + public DefaultProtocolConfigFactory(ProtocolConfig protocolConfig) { + super(protocolConfig); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java new file mode 100644 index 0000000..cce0c7c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java @@ -0,0 +1,12 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; + +public class DefaultRuleFactory extends AbstractRuleConfigFactory { + + public DefaultRuleFactory(Long ruleId) { + super(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java deleted file mode 100644 index 9ee97e0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.casic.missiles.parser.instance; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service -@Slf4j -@AllArgsConstructor -public class GeneralProcessor { - - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; - - /** - * 统一固定字段解析=>进行规则的查询的判断 - * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 - * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 - */ - @Deprecated - public boolean parseWholeDatagram(ByteBuf buffer, ProtocolConfig protocolConfig) { - try { - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap,protocolId); - //选取规则对应的流程= - DatagramEventConfig datagramEventConfig = processorSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); - //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); - //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); - //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); - //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); - //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); - return true; - } catch (Exception ex) { - log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", - ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); - return false; - } - } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; - } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); - } - - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); - return bizDataMap; - } - - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java index 25e7ad8..6a5777e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java @@ -1,23 +1,31 @@ package com.casic.missiles.parser.instance.impl; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.mapper.DatagramEventMapper; import com.casic.missiles.pojo.DatagramEventConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.SpringContextUtil; -@Service -@AllArgsConstructor +import java.util.List; +import java.util.Optional; + +/** + * @author cz + * + */ public class DefaultProcessorInstanceSelector implements ProcessorInstanceSelector { - private final DatagramEventMapper datagramEventMapper; + private static List datagramEventConfigs; + + static { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + datagramEventConfigs = datagramEventRegistry.getDatagramEventList(); + } @Override public DatagramEventConfig getProcessorInstance(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("rule_id", protocolId); - return datagramEventMapper.selectOne(queryWrapper); + Optional optionalSelectInstance = datagramEventConfigs.stream() + .filter(e -> e.getId().equals(protocolId)).limit(1).findFirst(); + return optionalSelectInstance.isPresent() ? optionalSelectInstance.get() : null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a778671..7b56a43 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,16 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import io.netty.buffer.ByteBuf; /** - * 分析匹配情况 - * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 - * 2、匹配不成功,有后续帧,可以进行下次匹配。 - * 3、匹配不成功,无后续帧,可以进行丢弃。 + * 分析匹配情况 + * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 + * 2、匹配不成功,有后续帧,可以进行下次匹配。 + * 3、匹配不成功,无后续帧,可以进行丢弃。 */ -public interface FrameStructMatcher{ +public interface FrameStructMatcher { - ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig); + ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 05320ab..8ebea78 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,23 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.ProtocolConfigMapper; +import com.casic.missiles.parser.provider.ProtocolConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Component; import java.util.List; import java.util.stream.Collectors; -@Component -@AllArgsConstructor public class LeadingCodeMatcher { - private final ProtocolConfigMapper protocolMapper; - //** 1、首字母匹配前导码, // 2、以匹配出的前导码是否在报文中条件进行前导码的匹配二次筛选 - public List matchLeadingCode(String protocolContent){ + public static List matchFrameLeadingCode(String protocolContent){ List initialConfigs = initialMatch(protocolContent); List preCodeConfigs = initialConfigs.stream() .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) @@ -26,13 +19,16 @@ } //初始化匹配前导码内容 - private List initialMatch(String protocolContent) { - String protocolStr = protocolContent.charAt(0) + ""; - QueryWrapper queryWrapper = new QueryWrapper() - .likeRight("pre_fix", protocolStr); - List protocolConfigList = protocolMapper.selectList(queryWrapper); - return protocolConfigList; + private static List initialMatch(String protocolContent) { + String firstFrameChar = protocolContent.charAt(0) + ""; + ProtocolConfigProvider protocolConfigProvider=new ProtocolConfigProvider(firstFrameChar); + return protocolConfigProvider.getMatchList(); } + + + + + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index cf2113d..e915877 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -1,32 +1,35 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(0) -@Service +@Component public class FrameLengthMatcher implements FrameStructMatcher { - @Autowired - private FieldParser fieldParser; - //超过长度 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { String dataGramContent = ByteBufUtil.hexDump(byteBuf); - if (StringUtils.isEmpty(protocolConfig.getUnpackId()) && StringUtils.isEmpty(protocolConfig.getTailStr())) { - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + //当不存在结尾标志和拆包标志,可以直接使用长度进行匹配 + if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { if (dataGramContent.length() >= totalLength) {//等于长度返回true,超出长度,切断 - ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, protocolConfig, totalLength); + ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, totalLength); return wholeDatagramByte; } else { //读的标志位前移舍弃 @@ -38,7 +41,7 @@ return null; } - private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, Integer totalLength) { byteBuf.readBytes(totalLength); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, totalLength - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 2bfc213..d527ad0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; @@ -13,7 +13,7 @@ import lombok.AllArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.nio.charset.Charset; import java.util.Map; @@ -22,32 +22,30 @@ * 后续标志验证 */ @Order(1) -@Service +@Component @AllArgsConstructor -public class FrameMarkMatcher implements FrameStructMatcher { - - private final FieldConfigDao fieldConfigDao; - private final FieldParser fieldParser; - private final FieldResolver fieldResolverManger; +public class FrameMarkMatcher implements FrameStructMatcher, FixedPropertyEnum { //帧后续标志=>结束,进行帧的重组=>有后续,1、帧移位判别 2、继续接收帧 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig UnpackConfig = StringUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getUnpackId()); - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); - Integer upback = 0; + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); ByteBuf mergeWholeFrameByte = null; - if (!ObjectUtil.isEmpty(UnpackConfig)) { - while (hasNextFullFrame(byteBuf, protocolConfig)) { - upback = (Integer) fieldResolverManger.filedParserManger(byteBuf, UnpackConfig, null); + if (!ObjectUtil.isEmpty(unpackFlag)) { + while (hasNextFullFrame(byteBuf, protocolConfig, protocolFieldConfigProvider)) { //是否存在后续位 - if (upback == 1) {//使用esayRule + if (unpackFlag == 1) {//使用esayRule //表示可以截取 - mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolConfig, totalLength); + mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolFieldConfigProvider, protocolConfig); return mergeWholeFrameByte; } else { - byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig)); + byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig, protocolFieldConfigProvider)); } } } @@ -56,7 +54,8 @@ //选取第一个帧,将业务内容和后面部分分开 //计算数据报文-业务内容 - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolFieldConfigProvider protocolFieldConfigProvider, ProtocolConfig protocolConfig) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); //截取完整报文 byteBuf.readBytes(totalLength); ByteBuf byteBufContent = byteBuf.slice(0, byteBuf.readerIndex()); @@ -68,15 +67,15 @@ String tail = ""; System.out.println(ByteBufUtil.hexDump(byteBufContent)); //会存在多个帧拼接在一起的的情况,进行合并处理 - while (hasNextFullFrame(byteBufContent, protocolConfig)) { - Integer currentFrameLength = fieldParser.getTotalLength(protocolConfig, byteBufContent); + while (hasNextFullFrame(byteBufContent, protocolConfig, protocolFieldConfigProvider)) { + Integer currentFrameLength = protocolFieldConfigProvider.getTotalLength(byteBufContent, protocolConfig); byteBufContent.readBytes(currentFrameLength); ByteBuf currentbyteBuf = byteBufContent.slice(0, byteBufContent.readerIndex()); byteBufContent.markReaderIndex();//读的标志位前移 System.out.println(ByteBufUtil.hexDump(byteBufContent)); String hexDump = currentbyteBuf.toString(Charset.forName("ISO-8859-1")); //获取当前固定帧结构的关系map - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, currentbyteBuf); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(currentbyteBuf, protocolConfig); if (StringUtils.isEmpty(mergeFrameStr)) { //首次获取业务数据报文 mergeFrameStr += hexDump.substring(0, currentFrameFixedProperty.get("tailPosition")); @@ -95,22 +94,22 @@ /** * 获取平移到下一帧起始位置 */ - public int getNextFrameOffset(ByteBuf buffer, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, buffer); - return currentFrameFixedProperty.get("totalLength"); + public int getNextFrameOffset(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + return currentFrameFixedProperty.get(TOTAL_LENGTH); } /** * 判断是否出错进行整个帧的 */ - public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, byteBuf); + public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); //保证读取位置不在固定位置,是可变的业务内容 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("fixedPosition")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(FIXED_POSITION)) { return false; } //判断读取是否操作帧长度 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("totalLength")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(TOTAL_LENGTH)) { return false; } return true; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 76a3784..c3a1bab 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -1,50 +1,50 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.parser.instance.GeneralProcessor; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; +import io.netty.buffer.ByteBufUtil;; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(2) -@Service +@Component public class FrameTailMatcher implements FrameStructMatcher { - @Resource - private FieldConfigDao fieldConfigDao; - @Autowired - private GeneralProcessor generalProcessor; - //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig tailFieldConfig = StringUtils.isEmpty(protocolConfig.getTailStr()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getTailStr()); - if (!ObjectUtil.isEmpty(tailFieldConfig)) { - String tailStr = tailFieldConfig.getFieldName(); + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfig protocolFieldConfig = ObjectUtils.isEmpty(protocolConfig.getTailStr()) ? null : + fieldConfigProvider.getFieldConfigById(protocolConfig.getTailStr()); + if (!ObjectUtil.isEmpty(protocolFieldConfig)) { + String tailStr = protocolFieldConfig.getFieldName(); String dataGramContent = ByteBufUtil.hexDump(byteBuf); Boolean tailFlag = ByteBufUtil.hexDump(byteBuf).contains(tailStr); if (!tailFlag) { //使用esayRule return null; } else if (dataGramContent.indexOf(tailStr) < dataGramContent.length() - tailStr.length()) { Integer length = dataGramContent.indexOf(tailStr) + tailStr.length(); - ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, protocolConfig, length); + ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, length); return wholeDatagramByte; //存在粘包 } } return null; } - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer length) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, Integer length) { byteBuf.readBytes(length); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, length - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java index 608af3a..32cc8a4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java @@ -2,48 +2,47 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.delivery.decorator.ByteDecorator; +import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @AllArgsConstructor public class FieldDecoratorManger { - private final RuleDictDao ruleDictDao; + private final RuleConfigRegistry ruleDictDao; // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 // (1)静态的业务字段是字典里面可以配置的 // (2)动态的业务字段是通过规则生成的 public String contentMerge(String ruleJson, String sceneConent, String dynamicContent) { - List ruleDictList = ruleDictDao.getRuleDictConfig(); - Map ruleDictMap = ruleDictList.stream().collect( - Collectors.toMap(RuleDict::getId, e -> e)); - List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); - for (Map ruleMap : ruleMapList) { - String ruleType = String.valueOf(ruleMap.get("ruleType")); - ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); - NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); - byteDecorator.nodeDecoratorRule(nodeDecoratorParm); - } +// List ruleDictList = ruleDictDao.getRuleDictConfig(); +// Map ruleDictMap = ruleDictList.stream().collect( +// Collectors.toMap(RuleDict::getId, e -> e)); +// List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); +// for (Map ruleMap : ruleMapList) { +// String ruleType = String.valueOf(ruleMap.get("ruleType")); +// ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); +// NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); +// byteDecorator.nodeDecoratorRule(nodeDecoratorParm); +// } return null; } - - private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { - NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() - .contents(sceneConent) - .dynamicContent(dynamicContent) - .ruletypeId(ruletypeId) - .ruleDictMap(ruleDictMap) - .build(); - return nodeDecoratorParm; - } +// +// private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { +// NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() +// .contents(sceneConent) +// .dynamicContent(dynamicContent) +// .ruletypeId(ruletypeId) +// .ruleDictMap(ruleDictMap) +// .build(); +// return nodeDecoratorParm; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java index 652970c..b204ac3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java @@ -1,56 +1,56 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@AllArgsConstructor -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", - JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Component; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Component("logicalDecorator") +//@AllArgsConstructor +//@Slf4j +//public class LogicalShiftDecorator implements ByteDecorator { +// +//// private final FieldRuleEngineMapper fieldRuleEngineMapper; +//// +//// //字节位移 +//// @Override +//// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +//// String logicalValue = ""; +//// RuleEvaluator fieldRuleEngine = new RuleEvaluator(); +//// try { +//// Map env2 = new HashMap(); +//// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +//// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +//// for (String contentId : contentIdList) { +//// RuleDict ruleDict = ruleDictMap.get(contentId); +//// if (ruleDict.getCode().contains("#")) { +//// //使用动态的值 +//// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +//// } +//// env2.put(ruleDict.getName(), ruleDict.getCode()); +//// } +//// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +//// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +//// return null; +//// } +//// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +//// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +//// return values; +//// } catch (Exception ex) { +//// log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", +//// JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +//// return null; +//// } +//// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java index 346468f..822fead 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@AllArgsConstructor -@Slf4j -public class OperationDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("optionDecorator") +//@AllArgsConstructor +//@Slf4j +//public class OperationDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //混合运算,有常量或者乘除的缩放 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java index 50fb0a7..7a8bccb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@AllArgsConstructor -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +////精度计算 +//@AllArgsConstructor +//@Registry("precisionDecorator") +//@Slf4j +//public class PrecisionDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java index da39235..27f9cc7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java @@ -1,54 +1,53 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@AllArgsConstructor -@Slf4j -public class RuleDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("ruleDecorator") +//@AllArgsConstructor +//@Slf4j +//public class RuleDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //吃我一套正则表达式 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (Exception ex) { +// log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java index 7f5cbf3..c043f97 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java @@ -2,6 +2,6 @@ import java.util.Map; -public interface ComandeEventService { +public interface ComandeEventService{ Map loadComandeEventConfig(String protocolId,String scene); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java index 476ad84..aaf1837 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java @@ -2,46 +2,46 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.dao.CommandEventDao; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @Slf4j @AllArgsConstructor -public class ComandeEventServiceImpl implements ComandeEventService { +public class ComandeEventServiceImpl implements ComandeEventRegistry { - private final CommandEventDao commandEventDao; + // private final CommandEventDao commandEventDao; // 加密bean 固定字段出现变化的字段解析,业务字段的有序内容 @Override - public Map loadComandeEventConfig(String protocolId,String sceneName) { - CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); - if (ObjectUtil.isEmpty(commandEventConfig)) { - log.error("协议{},没有配置成功接收回复配置,清排查原因"); - return null; - } - String replyJson = commandEventConfig.getReplyContentJson(); - List> replyMapList = JSONArray.parseObject(replyJson, List.class); - List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); - Map fixMap = fixList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); - List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) - .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) - .collect(Collectors.toList()); - Map commandConfigMap = new HashMap<>(); - commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); - commandConfigMap.put("fixContent", fixMap); - commandConfigMap.put("bizContent", contentList); - return commandConfigMap; + public Map loadComandeEventConfig(String protocolId, String sceneName) { +// CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); +// if (ObjectUtil.isEmpty(commandEventConfig)) { +// log.error("协议{},没有配置成功接收回复配置,清排查原因"); +// return null; +// } +// String replyJson = commandEventConfig.getReplyContentJson(); +// List> replyMapList = JSONArray.parseObject(replyJson, List.class); +// List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); +// Map fixMap = fixList.stream() +// .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); +// List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) +// .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) +// .collect(Collectors.toList()); +// Map commandConfigMap = new HashMap<>(); +// commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); +// commandConfigMap.put("fixContent", fixMap); +// commandConfigMap.put("bizContent", contentList); +// return commandConfigMap; + return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 128b09d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java deleted file mode 100644 index 4016b0b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface DatagramEventMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java deleted file mode 100644 index 597c306..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.apache.ibatis.annotations.Mapper; - -public interface FieldConfigMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java deleted file mode 100644 index a31680a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.PreRuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface PreRuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java deleted file mode 100644 index 9060a69..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface ProtocolConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java deleted file mode 100644 index 6fa6936..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java deleted file mode 100644 index 582a705..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleDict; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleDictMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java deleted file mode 100644 index 6e302c8..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.CommandEventMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Optional; - -@Component -public class CommandEventDao { - - @Resource - private CommandEventMapper commandEventMapper; - - public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId) - .eq("scene", sceneName) - .eq("enabled", 1); - List commandEventConfig = commandEventMapper.selectList(queryWrapper); - Optional optionalEventConfig = commandEventConfig.stream().findFirst(); - return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java deleted file mode 100644 index 9137e4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.FieldConfigMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class FieldConfigDao { - - @Resource - private FieldConfigMapper fieldConfigMapper; - - public FieldConfig getFieldConfigById(String fieldId) { - FieldConfig fieldConfig = fieldConfigMapper.selectById(fieldId); - return fieldConfig; - } - - public List getFieldConfigs(String protocolId,Integer isFixed) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",isFixed); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - - public List getStorageFieldConfig(String protocolId) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",1) - .eq("is_storage",1); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java deleted file mode 100644 index 67bff6b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.mapper.PreRuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class PreRuleConfigDao { - - @Resource - private PreRuleConfigMapper preRuleConfigMapper; - - public List getPreRuleList(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return preRuleConfigMapper.selectList(queryWrapper); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java deleted file mode 100644 index d69ea85..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.RuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleConfigDao { - - @Resource - private RuleConfigMapper ruleConfigMapper; - - public RuleConfig getNextRuleConfig(String ruleFields) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("parse_rule_json", ruleFields); - return ruleConfigMapper.selectOne(queryWrapper); - } - - - public List getRuleConfigById(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return ruleConfigMapper.selectList(queryWrapper); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java deleted file mode 100644 index 932c185..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.RuleDictMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleDictDao { - - @Resource - private RuleDictMapper ruleDictMapper; - - public List getRuleDictConfig() { - List ruleDictList = ruleDictMapper.selectList(null); - return ruleDictList; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java index 9f9e279..43bc4d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java @@ -10,20 +10,15 @@ import io.netty.channel.socket.nio.NioServerSocketChannel; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import javax.annotation.PreDestroy; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static cn.hutool.core.util.ClassUtil.getClasses; /** * SensorhubServer netty服务端 */ @Slf4j -@Service +@Component public class SensorhubServer { /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java index 2c79ff5..9a28c36 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java @@ -11,13 +11,13 @@ import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioSocketChannel; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClient 客户端 */ @Slf4j -@Service +@Registry public final class SensorhubClient { public static void main(String[] args) throws Exception { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java index 9774be0..477c3f7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java @@ -6,12 +6,12 @@ import io.netty.channel.socket.SocketChannel; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientChannelInitialHandler */ -@Service +@Registry public class SensorhubClientChannelInitialHandler extends ChannelInitializer { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java index 346f4b3..73560e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java @@ -5,13 +5,13 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientHandler */ @Slf4j -@Service +@Registry public class SensorhubClientHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java index 5c1c6f2..d990af5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java @@ -4,12 +4,12 @@ import com.casic.missiles.pojo.Msg; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** * SensorhubServerHandler */ -@Service +@Component public class SensorhubServerHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 67283ae..af3172c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,41 +1,37 @@ package com.casic.missiles.parser; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultProtocolConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.*; +import com.casic.missiles.registry.FieldConfigRegistry; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; -import java.nio.charset.Charset; import java.util.HashMap; import java.util.List; import java.util.Map; -@Service("genericProtocolParser") +/** + * @author + */ +@Component("genericProtocolParser") @Slf4j -@AllArgsConstructor +@RequiredArgsConstructor public class GenericProtocolParser implements ProtocolParser { - private final LeadingCodeMatcher leadingCodeMatcher; private final List frameStructDispenserList; - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorInstanceSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; // 匹配首字母前导码=> 帧结构匹配前导码=> // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 @@ -44,18 +40,19 @@ public Boolean doParseProtocol(ByteBuf byteBuf) { String protocolContent = ByteBufUtil.hexDump(byteBuf); //匹配前导码 - List preCodeConfigs = leadingCodeMatcher.matchLeadingCode(protocolContent); + List preCodeConfigs = LeadingCodeMatcher.matchFrameLeadingCode(protocolContent); //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 if (preCodeConfigs.size() == 0) { - return rematch(byteBuf,protocolContent); + return rematch(byteBuf, protocolContent); } - //暂时先取第一个 + //暂时先取第一个,提升速度,使用享元模式, 减少类的创建销毁与构建 ProtocolConfig protocolConfig = preCodeConfigs.get(0); + AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); ByteBuf wholeDatagramByte = null; //通过匹配帧结构获取完整的数据包 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, preCodeConfigs.get(0))) != null) { + if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, protocolFactory)) != null) { break; } } @@ -68,76 +65,78 @@ * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 */ - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId, wholeDatagramByte); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap, protocolId); - //选取规则对应的流程实例 - DatagramEventConfig datagramEventConfig = processorInstanceSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); + //进行规则字段解析,进行匹配规则 + RuleConfig ruleConfig = getRuleConfig(protocolFactory, wholeDatagramByte); + if (ruleConfig == null) { + return false; + } //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, wholeDatagramByte); + ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte); + //以下进行业务的规则解析,同时选定流程实例 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); + DatagramEventProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain, + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText, protocolId); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain); //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); + datagramEventProvider.storeData(bizDataMap); return true; } - private Boolean rematch(ByteBuf byteBuf,String protocolContent) { + /** + * 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 + */ + private Boolean rematch(ByteBuf byteBuf, String protocolContent) { //重置位判断 byteBuf.resetReaderIndex(); //判断重置是否前移,如果没有前移,则直接判为匹配失败 if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { return false; } else { + //递归执行 return doParseProtocol(byteBuf); } } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; + //获取匹配规则->匹配规则 + private RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + //取出其中参与逻辑provider并判空 + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); + String rulePrepareFields = protocolConfig.getRulePrepareFields(); + //固定字段 + if (StringUtils.isNotEmpty(rulePrepareFields)) { + //获取统一固定字段解析 + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + //获取该协议的字段配置,用于协议规则匹配 + List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); + //获取规则 + RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, + rulePrepareFields, protocolFieldConfigs); + return ruleConfig; + } + return null; } - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + //数据构建,获取固定字段的store和业务字段store + private Map buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + Map bizDataMap = new HashMap<>(); + Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); + Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); + bizDataMap.putAll(ruleStoreObjectMap); + bizDataMap.putAll(protocolStoreObjectMap); return bizDataMap; } - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java index 8a46e32..16ce2e5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java @@ -3,6 +3,7 @@ import io.netty.buffer.ByteBuf; public interface ProtocolParser { + Boolean doParseProtocol(ByteBuf byteBuf); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java new file mode 100644 index 0000000..f7814af --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java @@ -0,0 +1,35 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.ProtocolConfigProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.ProtocolConfig; + +/** + * 存放基本协议的的加载信息 + */ +public class AbstractProtocolConfigFactory { + private final ProtocolConfigProvider protocolConfigProvider; + private final ProtocolFieldConfigProvider protocolFieldConfigProvider; + private final RuleConfigProvider ruleConfigProvider; + + public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { + this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); + this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); + this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); + } + + public ProtocolConfigProvider getProtocolConfigProvider() { + return protocolConfigProvider; + } + + public ProtocolFieldConfigProvider getProtocolFieldConfigProvider() { + return protocolFieldConfigProvider; + } + + public RuleConfigProvider getRuleConfigProvider() { + return ruleConfigProvider; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java new file mode 100644 index 0000000..6e36147 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java @@ -0,0 +1,57 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.CombinedFieldConfigProvider; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.FieldConfigProvider; +import com.casic.missiles.parser.provider.FieldRuleConfigProvider; + +/** + * 存放规则相关的的的加载信息 + */ +public class AbstractRuleConfigFactory { + + /** + * 处理字节 + */ + private final FieldConfigProvider fieldConfigProvider; + /** + * 处理组合字节解析的解码器 + */ + private final CombinedFieldConfigProvider combinedFieldConfigProvider; + /** + * 处理负责字节解析的规则配置 + */ + private final FieldRuleConfigProvider fieldRuleConfigProvider; + /** + * 处理实例流程 + */ + private final DatagramEventProvider datagramEventProvider; + + + public AbstractRuleConfigFactory(Long ruleId) { + this.fieldConfigProvider = new FieldConfigProvider(ruleId); + this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); + this.fieldRuleConfigProvider = new FieldRuleConfigProvider(ruleId); + this.datagramEventProvider = new DatagramEventProvider(ruleId); + } + + public FieldConfigProvider getFieldConfigProvider() { + return fieldConfigProvider; + } + + public CombinedFieldConfigProvider getCombinedFieldConfigProvider() { + return combinedFieldConfigProvider; + } + + public FieldRuleConfigProvider getFieldRuleConfigProvider() { + return fieldRuleConfigProvider; + } + + public DatagramEventProvider getDatagramEventProvider() { + return datagramEventProvider; + } + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java deleted file mode 100644 index 6e1719a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.factory; - - -import com.casic.missiles.pojo.ProtocolConfig; - -import java.util.List; - -/** - * 数据库访问优化(暂时未做) - *

- * 1、初始化协议解析配置,并存放到处存放缓存,对协议基本配置进行管理 - * 2、其中流程中所有的配置都经过此类进行管理,进行调用获取,增强解析速度 - */ -public interface DatagramFactory { - - /** - * 初始化 - */ - List datagramInit(); - - /** - * 根据前导码配置匹配,模糊匹配获取所有的报文项 - */ - List match(); - - /** - * 根据前导码匹配,返回报文项 - */ - List filer(); - - /** - * 保证数据的唯一性选择器 - */ - List selectOne(); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java new file mode 100644 index 0000000..87444a0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java @@ -0,0 +1,18 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +import java.util.List; + +/** + * 直接用,还是边用边创建 + */ +public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { + + + public DefaultProtocolConfigFactory(ProtocolConfig protocolConfig) { + super(protocolConfig); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java new file mode 100644 index 0000000..cce0c7c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java @@ -0,0 +1,12 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; + +public class DefaultRuleFactory extends AbstractRuleConfigFactory { + + public DefaultRuleFactory(Long ruleId) { + super(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java deleted file mode 100644 index 9ee97e0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.casic.missiles.parser.instance; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service -@Slf4j -@AllArgsConstructor -public class GeneralProcessor { - - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; - - /** - * 统一固定字段解析=>进行规则的查询的判断 - * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 - * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 - */ - @Deprecated - public boolean parseWholeDatagram(ByteBuf buffer, ProtocolConfig protocolConfig) { - try { - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap,protocolId); - //选取规则对应的流程= - DatagramEventConfig datagramEventConfig = processorSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); - //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); - //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); - //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); - //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); - //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); - return true; - } catch (Exception ex) { - log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", - ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); - return false; - } - } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; - } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); - } - - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); - return bizDataMap; - } - - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java index 25e7ad8..6a5777e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java @@ -1,23 +1,31 @@ package com.casic.missiles.parser.instance.impl; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.mapper.DatagramEventMapper; import com.casic.missiles.pojo.DatagramEventConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.SpringContextUtil; -@Service -@AllArgsConstructor +import java.util.List; +import java.util.Optional; + +/** + * @author cz + * + */ public class DefaultProcessorInstanceSelector implements ProcessorInstanceSelector { - private final DatagramEventMapper datagramEventMapper; + private static List datagramEventConfigs; + + static { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + datagramEventConfigs = datagramEventRegistry.getDatagramEventList(); + } @Override public DatagramEventConfig getProcessorInstance(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("rule_id", protocolId); - return datagramEventMapper.selectOne(queryWrapper); + Optional optionalSelectInstance = datagramEventConfigs.stream() + .filter(e -> e.getId().equals(protocolId)).limit(1).findFirst(); + return optionalSelectInstance.isPresent() ? optionalSelectInstance.get() : null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a778671..7b56a43 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,16 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import io.netty.buffer.ByteBuf; /** - * 分析匹配情况 - * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 - * 2、匹配不成功,有后续帧,可以进行下次匹配。 - * 3、匹配不成功,无后续帧,可以进行丢弃。 + * 分析匹配情况 + * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 + * 2、匹配不成功,有后续帧,可以进行下次匹配。 + * 3、匹配不成功,无后续帧,可以进行丢弃。 */ -public interface FrameStructMatcher{ +public interface FrameStructMatcher { - ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig); + ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 05320ab..8ebea78 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,23 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.ProtocolConfigMapper; +import com.casic.missiles.parser.provider.ProtocolConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Component; import java.util.List; import java.util.stream.Collectors; -@Component -@AllArgsConstructor public class LeadingCodeMatcher { - private final ProtocolConfigMapper protocolMapper; - //** 1、首字母匹配前导码, // 2、以匹配出的前导码是否在报文中条件进行前导码的匹配二次筛选 - public List matchLeadingCode(String protocolContent){ + public static List matchFrameLeadingCode(String protocolContent){ List initialConfigs = initialMatch(protocolContent); List preCodeConfigs = initialConfigs.stream() .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) @@ -26,13 +19,16 @@ } //初始化匹配前导码内容 - private List initialMatch(String protocolContent) { - String protocolStr = protocolContent.charAt(0) + ""; - QueryWrapper queryWrapper = new QueryWrapper() - .likeRight("pre_fix", protocolStr); - List protocolConfigList = protocolMapper.selectList(queryWrapper); - return protocolConfigList; + private static List initialMatch(String protocolContent) { + String firstFrameChar = protocolContent.charAt(0) + ""; + ProtocolConfigProvider protocolConfigProvider=new ProtocolConfigProvider(firstFrameChar); + return protocolConfigProvider.getMatchList(); } + + + + + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index cf2113d..e915877 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -1,32 +1,35 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(0) -@Service +@Component public class FrameLengthMatcher implements FrameStructMatcher { - @Autowired - private FieldParser fieldParser; - //超过长度 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { String dataGramContent = ByteBufUtil.hexDump(byteBuf); - if (StringUtils.isEmpty(protocolConfig.getUnpackId()) && StringUtils.isEmpty(protocolConfig.getTailStr())) { - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + //当不存在结尾标志和拆包标志,可以直接使用长度进行匹配 + if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { if (dataGramContent.length() >= totalLength) {//等于长度返回true,超出长度,切断 - ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, protocolConfig, totalLength); + ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, totalLength); return wholeDatagramByte; } else { //读的标志位前移舍弃 @@ -38,7 +41,7 @@ return null; } - private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, Integer totalLength) { byteBuf.readBytes(totalLength); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, totalLength - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 2bfc213..d527ad0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; @@ -13,7 +13,7 @@ import lombok.AllArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.nio.charset.Charset; import java.util.Map; @@ -22,32 +22,30 @@ * 后续标志验证 */ @Order(1) -@Service +@Component @AllArgsConstructor -public class FrameMarkMatcher implements FrameStructMatcher { - - private final FieldConfigDao fieldConfigDao; - private final FieldParser fieldParser; - private final FieldResolver fieldResolverManger; +public class FrameMarkMatcher implements FrameStructMatcher, FixedPropertyEnum { //帧后续标志=>结束,进行帧的重组=>有后续,1、帧移位判别 2、继续接收帧 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig UnpackConfig = StringUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getUnpackId()); - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); - Integer upback = 0; + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); ByteBuf mergeWholeFrameByte = null; - if (!ObjectUtil.isEmpty(UnpackConfig)) { - while (hasNextFullFrame(byteBuf, protocolConfig)) { - upback = (Integer) fieldResolverManger.filedParserManger(byteBuf, UnpackConfig, null); + if (!ObjectUtil.isEmpty(unpackFlag)) { + while (hasNextFullFrame(byteBuf, protocolConfig, protocolFieldConfigProvider)) { //是否存在后续位 - if (upback == 1) {//使用esayRule + if (unpackFlag == 1) {//使用esayRule //表示可以截取 - mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolConfig, totalLength); + mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolFieldConfigProvider, protocolConfig); return mergeWholeFrameByte; } else { - byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig)); + byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig, protocolFieldConfigProvider)); } } } @@ -56,7 +54,8 @@ //选取第一个帧,将业务内容和后面部分分开 //计算数据报文-业务内容 - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolFieldConfigProvider protocolFieldConfigProvider, ProtocolConfig protocolConfig) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); //截取完整报文 byteBuf.readBytes(totalLength); ByteBuf byteBufContent = byteBuf.slice(0, byteBuf.readerIndex()); @@ -68,15 +67,15 @@ String tail = ""; System.out.println(ByteBufUtil.hexDump(byteBufContent)); //会存在多个帧拼接在一起的的情况,进行合并处理 - while (hasNextFullFrame(byteBufContent, protocolConfig)) { - Integer currentFrameLength = fieldParser.getTotalLength(protocolConfig, byteBufContent); + while (hasNextFullFrame(byteBufContent, protocolConfig, protocolFieldConfigProvider)) { + Integer currentFrameLength = protocolFieldConfigProvider.getTotalLength(byteBufContent, protocolConfig); byteBufContent.readBytes(currentFrameLength); ByteBuf currentbyteBuf = byteBufContent.slice(0, byteBufContent.readerIndex()); byteBufContent.markReaderIndex();//读的标志位前移 System.out.println(ByteBufUtil.hexDump(byteBufContent)); String hexDump = currentbyteBuf.toString(Charset.forName("ISO-8859-1")); //获取当前固定帧结构的关系map - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, currentbyteBuf); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(currentbyteBuf, protocolConfig); if (StringUtils.isEmpty(mergeFrameStr)) { //首次获取业务数据报文 mergeFrameStr += hexDump.substring(0, currentFrameFixedProperty.get("tailPosition")); @@ -95,22 +94,22 @@ /** * 获取平移到下一帧起始位置 */ - public int getNextFrameOffset(ByteBuf buffer, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, buffer); - return currentFrameFixedProperty.get("totalLength"); + public int getNextFrameOffset(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + return currentFrameFixedProperty.get(TOTAL_LENGTH); } /** * 判断是否出错进行整个帧的 */ - public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, byteBuf); + public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); //保证读取位置不在固定位置,是可变的业务内容 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("fixedPosition")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(FIXED_POSITION)) { return false; } //判断读取是否操作帧长度 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("totalLength")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(TOTAL_LENGTH)) { return false; } return true; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 76a3784..c3a1bab 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -1,50 +1,50 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.parser.instance.GeneralProcessor; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; +import io.netty.buffer.ByteBufUtil;; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(2) -@Service +@Component public class FrameTailMatcher implements FrameStructMatcher { - @Resource - private FieldConfigDao fieldConfigDao; - @Autowired - private GeneralProcessor generalProcessor; - //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig tailFieldConfig = StringUtils.isEmpty(protocolConfig.getTailStr()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getTailStr()); - if (!ObjectUtil.isEmpty(tailFieldConfig)) { - String tailStr = tailFieldConfig.getFieldName(); + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfig protocolFieldConfig = ObjectUtils.isEmpty(protocolConfig.getTailStr()) ? null : + fieldConfigProvider.getFieldConfigById(protocolConfig.getTailStr()); + if (!ObjectUtil.isEmpty(protocolFieldConfig)) { + String tailStr = protocolFieldConfig.getFieldName(); String dataGramContent = ByteBufUtil.hexDump(byteBuf); Boolean tailFlag = ByteBufUtil.hexDump(byteBuf).contains(tailStr); if (!tailFlag) { //使用esayRule return null; } else if (dataGramContent.indexOf(tailStr) < dataGramContent.length() - tailStr.length()) { Integer length = dataGramContent.indexOf(tailStr) + tailStr.length(); - ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, protocolConfig, length); + ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, length); return wholeDatagramByte; //存在粘包 } } return null; } - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer length) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, Integer length) { byteBuf.readBytes(length); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, length - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java new file mode 100644 index 0000000..5f1c177 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java @@ -0,0 +1,73 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.combined.GenericCombinedFieldResolver; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.CombinedFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class CombinedFieldConfigProvider { + + + /** + * 作为临时配置列表缓存使用 + */ + private final List combinedFieldConfigList; + private Map storeObjectMap = new HashMap<>(); + + public CombinedFieldConfigProvider(Long ruleId) { + CombinedFieldConfigRegistry combinedFieldConfigRegistry = SpringContextUtil.getBean(CombinedFieldConfigRegistry.class); + combinedFieldConfigList = combinedFieldConfigRegistry.getCombinedFieldConfigList(ruleId); + } + + public void parseDataField(RuleConfig ruleConfig, String clearZeroPlain,Map fieldConfigsMap ) { + if (showSkip()) { + return; + } + //匹配对应的数据,然后进行相关的字段解析 + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver(); + combinedFieldResolver.parseDataField(combinedFieldConfigList, byteBuf, storeObjectMap,fieldConfigsMap); + } + + + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getCombinedFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return combinedFieldConfigList.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public List getCombinedFieldConfigList() { + return combinedFieldConfigList; + } + + /* 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(combinedFieldConfigList) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java index 608af3a..32cc8a4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java @@ -2,48 +2,47 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.delivery.decorator.ByteDecorator; +import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @AllArgsConstructor public class FieldDecoratorManger { - private final RuleDictDao ruleDictDao; + private final RuleConfigRegistry ruleDictDao; // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 // (1)静态的业务字段是字典里面可以配置的 // (2)动态的业务字段是通过规则生成的 public String contentMerge(String ruleJson, String sceneConent, String dynamicContent) { - List ruleDictList = ruleDictDao.getRuleDictConfig(); - Map ruleDictMap = ruleDictList.stream().collect( - Collectors.toMap(RuleDict::getId, e -> e)); - List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); - for (Map ruleMap : ruleMapList) { - String ruleType = String.valueOf(ruleMap.get("ruleType")); - ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); - NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); - byteDecorator.nodeDecoratorRule(nodeDecoratorParm); - } +// List ruleDictList = ruleDictDao.getRuleDictConfig(); +// Map ruleDictMap = ruleDictList.stream().collect( +// Collectors.toMap(RuleDict::getId, e -> e)); +// List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); +// for (Map ruleMap : ruleMapList) { +// String ruleType = String.valueOf(ruleMap.get("ruleType")); +// ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); +// NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); +// byteDecorator.nodeDecoratorRule(nodeDecoratorParm); +// } return null; } - - private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { - NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() - .contents(sceneConent) - .dynamicContent(dynamicContent) - .ruletypeId(ruletypeId) - .ruleDictMap(ruleDictMap) - .build(); - return nodeDecoratorParm; - } +// +// private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { +// NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() +// .contents(sceneConent) +// .dynamicContent(dynamicContent) +// .ruletypeId(ruletypeId) +// .ruleDictMap(ruleDictMap) +// .build(); +// return nodeDecoratorParm; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java index 652970c..b204ac3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java @@ -1,56 +1,56 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@AllArgsConstructor -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", - JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Component; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Component("logicalDecorator") +//@AllArgsConstructor +//@Slf4j +//public class LogicalShiftDecorator implements ByteDecorator { +// +//// private final FieldRuleEngineMapper fieldRuleEngineMapper; +//// +//// //字节位移 +//// @Override +//// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +//// String logicalValue = ""; +//// RuleEvaluator fieldRuleEngine = new RuleEvaluator(); +//// try { +//// Map env2 = new HashMap(); +//// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +//// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +//// for (String contentId : contentIdList) { +//// RuleDict ruleDict = ruleDictMap.get(contentId); +//// if (ruleDict.getCode().contains("#")) { +//// //使用动态的值 +//// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +//// } +//// env2.put(ruleDict.getName(), ruleDict.getCode()); +//// } +//// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +//// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +//// return null; +//// } +//// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +//// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +//// return values; +//// } catch (Exception ex) { +//// log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", +//// JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +//// return null; +//// } +//// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java index 346468f..822fead 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@AllArgsConstructor -@Slf4j -public class OperationDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("optionDecorator") +//@AllArgsConstructor +//@Slf4j +//public class OperationDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //混合运算,有常量或者乘除的缩放 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java index 50fb0a7..7a8bccb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@AllArgsConstructor -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +////精度计算 +//@AllArgsConstructor +//@Registry("precisionDecorator") +//@Slf4j +//public class PrecisionDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java index da39235..27f9cc7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java @@ -1,54 +1,53 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@AllArgsConstructor -@Slf4j -public class RuleDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("ruleDecorator") +//@AllArgsConstructor +//@Slf4j +//public class RuleDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //吃我一套正则表达式 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (Exception ex) { +// log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java index 7f5cbf3..c043f97 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java @@ -2,6 +2,6 @@ import java.util.Map; -public interface ComandeEventService { +public interface ComandeEventService{ Map loadComandeEventConfig(String protocolId,String scene); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java index 476ad84..aaf1837 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java @@ -2,46 +2,46 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.dao.CommandEventDao; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @Slf4j @AllArgsConstructor -public class ComandeEventServiceImpl implements ComandeEventService { +public class ComandeEventServiceImpl implements ComandeEventRegistry { - private final CommandEventDao commandEventDao; + // private final CommandEventDao commandEventDao; // 加密bean 固定字段出现变化的字段解析,业务字段的有序内容 @Override - public Map loadComandeEventConfig(String protocolId,String sceneName) { - CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); - if (ObjectUtil.isEmpty(commandEventConfig)) { - log.error("协议{},没有配置成功接收回复配置,清排查原因"); - return null; - } - String replyJson = commandEventConfig.getReplyContentJson(); - List> replyMapList = JSONArray.parseObject(replyJson, List.class); - List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); - Map fixMap = fixList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); - List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) - .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) - .collect(Collectors.toList()); - Map commandConfigMap = new HashMap<>(); - commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); - commandConfigMap.put("fixContent", fixMap); - commandConfigMap.put("bizContent", contentList); - return commandConfigMap; + public Map loadComandeEventConfig(String protocolId, String sceneName) { +// CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); +// if (ObjectUtil.isEmpty(commandEventConfig)) { +// log.error("协议{},没有配置成功接收回复配置,清排查原因"); +// return null; +// } +// String replyJson = commandEventConfig.getReplyContentJson(); +// List> replyMapList = JSONArray.parseObject(replyJson, List.class); +// List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); +// Map fixMap = fixList.stream() +// .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); +// List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) +// .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) +// .collect(Collectors.toList()); +// Map commandConfigMap = new HashMap<>(); +// commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); +// commandConfigMap.put("fixContent", fixMap); +// commandConfigMap.put("bizContent", contentList); +// return commandConfigMap; + return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 128b09d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java deleted file mode 100644 index 4016b0b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface DatagramEventMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java deleted file mode 100644 index 597c306..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.apache.ibatis.annotations.Mapper; - -public interface FieldConfigMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java deleted file mode 100644 index a31680a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.PreRuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface PreRuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java deleted file mode 100644 index 9060a69..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface ProtocolConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java deleted file mode 100644 index 6fa6936..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java deleted file mode 100644 index 582a705..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleDict; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleDictMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java deleted file mode 100644 index 6e302c8..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.CommandEventMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Optional; - -@Component -public class CommandEventDao { - - @Resource - private CommandEventMapper commandEventMapper; - - public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId) - .eq("scene", sceneName) - .eq("enabled", 1); - List commandEventConfig = commandEventMapper.selectList(queryWrapper); - Optional optionalEventConfig = commandEventConfig.stream().findFirst(); - return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java deleted file mode 100644 index 9137e4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.FieldConfigMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class FieldConfigDao { - - @Resource - private FieldConfigMapper fieldConfigMapper; - - public FieldConfig getFieldConfigById(String fieldId) { - FieldConfig fieldConfig = fieldConfigMapper.selectById(fieldId); - return fieldConfig; - } - - public List getFieldConfigs(String protocolId,Integer isFixed) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",isFixed); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - - public List getStorageFieldConfig(String protocolId) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",1) - .eq("is_storage",1); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java deleted file mode 100644 index 67bff6b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.mapper.PreRuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class PreRuleConfigDao { - - @Resource - private PreRuleConfigMapper preRuleConfigMapper; - - public List getPreRuleList(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return preRuleConfigMapper.selectList(queryWrapper); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java deleted file mode 100644 index d69ea85..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.RuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleConfigDao { - - @Resource - private RuleConfigMapper ruleConfigMapper; - - public RuleConfig getNextRuleConfig(String ruleFields) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("parse_rule_json", ruleFields); - return ruleConfigMapper.selectOne(queryWrapper); - } - - - public List getRuleConfigById(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return ruleConfigMapper.selectList(queryWrapper); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java deleted file mode 100644 index 932c185..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.RuleDictMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleDictDao { - - @Resource - private RuleDictMapper ruleDictMapper; - - public List getRuleDictConfig() { - List ruleDictList = ruleDictMapper.selectList(null); - return ruleDictList; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java index 9f9e279..43bc4d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java @@ -10,20 +10,15 @@ import io.netty.channel.socket.nio.NioServerSocketChannel; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import javax.annotation.PreDestroy; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static cn.hutool.core.util.ClassUtil.getClasses; /** * SensorhubServer netty服务端 */ @Slf4j -@Service +@Component public class SensorhubServer { /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java index 2c79ff5..9a28c36 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java @@ -11,13 +11,13 @@ import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioSocketChannel; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClient 客户端 */ @Slf4j -@Service +@Registry public final class SensorhubClient { public static void main(String[] args) throws Exception { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java index 9774be0..477c3f7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java @@ -6,12 +6,12 @@ import io.netty.channel.socket.SocketChannel; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientChannelInitialHandler */ -@Service +@Registry public class SensorhubClientChannelInitialHandler extends ChannelInitializer { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java index 346f4b3..73560e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java @@ -5,13 +5,13 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientHandler */ @Slf4j -@Service +@Registry public class SensorhubClientHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java index 5c1c6f2..d990af5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java @@ -4,12 +4,12 @@ import com.casic.missiles.pojo.Msg; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** * SensorhubServerHandler */ -@Service +@Component public class SensorhubServerHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 67283ae..af3172c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,41 +1,37 @@ package com.casic.missiles.parser; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultProtocolConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.*; +import com.casic.missiles.registry.FieldConfigRegistry; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; -import java.nio.charset.Charset; import java.util.HashMap; import java.util.List; import java.util.Map; -@Service("genericProtocolParser") +/** + * @author + */ +@Component("genericProtocolParser") @Slf4j -@AllArgsConstructor +@RequiredArgsConstructor public class GenericProtocolParser implements ProtocolParser { - private final LeadingCodeMatcher leadingCodeMatcher; private final List frameStructDispenserList; - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorInstanceSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; // 匹配首字母前导码=> 帧结构匹配前导码=> // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 @@ -44,18 +40,19 @@ public Boolean doParseProtocol(ByteBuf byteBuf) { String protocolContent = ByteBufUtil.hexDump(byteBuf); //匹配前导码 - List preCodeConfigs = leadingCodeMatcher.matchLeadingCode(protocolContent); + List preCodeConfigs = LeadingCodeMatcher.matchFrameLeadingCode(protocolContent); //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 if (preCodeConfigs.size() == 0) { - return rematch(byteBuf,protocolContent); + return rematch(byteBuf, protocolContent); } - //暂时先取第一个 + //暂时先取第一个,提升速度,使用享元模式, 减少类的创建销毁与构建 ProtocolConfig protocolConfig = preCodeConfigs.get(0); + AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); ByteBuf wholeDatagramByte = null; //通过匹配帧结构获取完整的数据包 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, preCodeConfigs.get(0))) != null) { + if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, protocolFactory)) != null) { break; } } @@ -68,76 +65,78 @@ * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 */ - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId, wholeDatagramByte); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap, protocolId); - //选取规则对应的流程实例 - DatagramEventConfig datagramEventConfig = processorInstanceSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); + //进行规则字段解析,进行匹配规则 + RuleConfig ruleConfig = getRuleConfig(protocolFactory, wholeDatagramByte); + if (ruleConfig == null) { + return false; + } //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, wholeDatagramByte); + ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte); + //以下进行业务的规则解析,同时选定流程实例 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); + DatagramEventProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain, + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText, protocolId); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain); //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); + datagramEventProvider.storeData(bizDataMap); return true; } - private Boolean rematch(ByteBuf byteBuf,String protocolContent) { + /** + * 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 + */ + private Boolean rematch(ByteBuf byteBuf, String protocolContent) { //重置位判断 byteBuf.resetReaderIndex(); //判断重置是否前移,如果没有前移,则直接判为匹配失败 if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { return false; } else { + //递归执行 return doParseProtocol(byteBuf); } } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; + //获取匹配规则->匹配规则 + private RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + //取出其中参与逻辑provider并判空 + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); + String rulePrepareFields = protocolConfig.getRulePrepareFields(); + //固定字段 + if (StringUtils.isNotEmpty(rulePrepareFields)) { + //获取统一固定字段解析 + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + //获取该协议的字段配置,用于协议规则匹配 + List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); + //获取规则 + RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, + rulePrepareFields, protocolFieldConfigs); + return ruleConfig; + } + return null; } - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + //数据构建,获取固定字段的store和业务字段store + private Map buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + Map bizDataMap = new HashMap<>(); + Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); + Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); + bizDataMap.putAll(ruleStoreObjectMap); + bizDataMap.putAll(protocolStoreObjectMap); return bizDataMap; } - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java index 8a46e32..16ce2e5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java @@ -3,6 +3,7 @@ import io.netty.buffer.ByteBuf; public interface ProtocolParser { + Boolean doParseProtocol(ByteBuf byteBuf); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java new file mode 100644 index 0000000..f7814af --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java @@ -0,0 +1,35 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.ProtocolConfigProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.ProtocolConfig; + +/** + * 存放基本协议的的加载信息 + */ +public class AbstractProtocolConfigFactory { + private final ProtocolConfigProvider protocolConfigProvider; + private final ProtocolFieldConfigProvider protocolFieldConfigProvider; + private final RuleConfigProvider ruleConfigProvider; + + public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { + this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); + this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); + this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); + } + + public ProtocolConfigProvider getProtocolConfigProvider() { + return protocolConfigProvider; + } + + public ProtocolFieldConfigProvider getProtocolFieldConfigProvider() { + return protocolFieldConfigProvider; + } + + public RuleConfigProvider getRuleConfigProvider() { + return ruleConfigProvider; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java new file mode 100644 index 0000000..6e36147 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java @@ -0,0 +1,57 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.CombinedFieldConfigProvider; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.FieldConfigProvider; +import com.casic.missiles.parser.provider.FieldRuleConfigProvider; + +/** + * 存放规则相关的的的加载信息 + */ +public class AbstractRuleConfigFactory { + + /** + * 处理字节 + */ + private final FieldConfigProvider fieldConfigProvider; + /** + * 处理组合字节解析的解码器 + */ + private final CombinedFieldConfigProvider combinedFieldConfigProvider; + /** + * 处理负责字节解析的规则配置 + */ + private final FieldRuleConfigProvider fieldRuleConfigProvider; + /** + * 处理实例流程 + */ + private final DatagramEventProvider datagramEventProvider; + + + public AbstractRuleConfigFactory(Long ruleId) { + this.fieldConfigProvider = new FieldConfigProvider(ruleId); + this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); + this.fieldRuleConfigProvider = new FieldRuleConfigProvider(ruleId); + this.datagramEventProvider = new DatagramEventProvider(ruleId); + } + + public FieldConfigProvider getFieldConfigProvider() { + return fieldConfigProvider; + } + + public CombinedFieldConfigProvider getCombinedFieldConfigProvider() { + return combinedFieldConfigProvider; + } + + public FieldRuleConfigProvider getFieldRuleConfigProvider() { + return fieldRuleConfigProvider; + } + + public DatagramEventProvider getDatagramEventProvider() { + return datagramEventProvider; + } + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java deleted file mode 100644 index 6e1719a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.factory; - - -import com.casic.missiles.pojo.ProtocolConfig; - -import java.util.List; - -/** - * 数据库访问优化(暂时未做) - *

- * 1、初始化协议解析配置,并存放到处存放缓存,对协议基本配置进行管理 - * 2、其中流程中所有的配置都经过此类进行管理,进行调用获取,增强解析速度 - */ -public interface DatagramFactory { - - /** - * 初始化 - */ - List datagramInit(); - - /** - * 根据前导码配置匹配,模糊匹配获取所有的报文项 - */ - List match(); - - /** - * 根据前导码匹配,返回报文项 - */ - List filer(); - - /** - * 保证数据的唯一性选择器 - */ - List selectOne(); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java new file mode 100644 index 0000000..87444a0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java @@ -0,0 +1,18 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +import java.util.List; + +/** + * 直接用,还是边用边创建 + */ +public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { + + + public DefaultProtocolConfigFactory(ProtocolConfig protocolConfig) { + super(protocolConfig); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java new file mode 100644 index 0000000..cce0c7c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java @@ -0,0 +1,12 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; + +public class DefaultRuleFactory extends AbstractRuleConfigFactory { + + public DefaultRuleFactory(Long ruleId) { + super(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java deleted file mode 100644 index 9ee97e0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.casic.missiles.parser.instance; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service -@Slf4j -@AllArgsConstructor -public class GeneralProcessor { - - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; - - /** - * 统一固定字段解析=>进行规则的查询的判断 - * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 - * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 - */ - @Deprecated - public boolean parseWholeDatagram(ByteBuf buffer, ProtocolConfig protocolConfig) { - try { - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap,protocolId); - //选取规则对应的流程= - DatagramEventConfig datagramEventConfig = processorSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); - //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); - //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); - //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); - //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); - //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); - return true; - } catch (Exception ex) { - log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", - ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); - return false; - } - } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; - } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); - } - - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); - return bizDataMap; - } - - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java index 25e7ad8..6a5777e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java @@ -1,23 +1,31 @@ package com.casic.missiles.parser.instance.impl; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.mapper.DatagramEventMapper; import com.casic.missiles.pojo.DatagramEventConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.SpringContextUtil; -@Service -@AllArgsConstructor +import java.util.List; +import java.util.Optional; + +/** + * @author cz + * + */ public class DefaultProcessorInstanceSelector implements ProcessorInstanceSelector { - private final DatagramEventMapper datagramEventMapper; + private static List datagramEventConfigs; + + static { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + datagramEventConfigs = datagramEventRegistry.getDatagramEventList(); + } @Override public DatagramEventConfig getProcessorInstance(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("rule_id", protocolId); - return datagramEventMapper.selectOne(queryWrapper); + Optional optionalSelectInstance = datagramEventConfigs.stream() + .filter(e -> e.getId().equals(protocolId)).limit(1).findFirst(); + return optionalSelectInstance.isPresent() ? optionalSelectInstance.get() : null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a778671..7b56a43 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,16 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import io.netty.buffer.ByteBuf; /** - * 分析匹配情况 - * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 - * 2、匹配不成功,有后续帧,可以进行下次匹配。 - * 3、匹配不成功,无后续帧,可以进行丢弃。 + * 分析匹配情况 + * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 + * 2、匹配不成功,有后续帧,可以进行下次匹配。 + * 3、匹配不成功,无后续帧,可以进行丢弃。 */ -public interface FrameStructMatcher{ +public interface FrameStructMatcher { - ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig); + ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 05320ab..8ebea78 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,23 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.ProtocolConfigMapper; +import com.casic.missiles.parser.provider.ProtocolConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Component; import java.util.List; import java.util.stream.Collectors; -@Component -@AllArgsConstructor public class LeadingCodeMatcher { - private final ProtocolConfigMapper protocolMapper; - //** 1、首字母匹配前导码, // 2、以匹配出的前导码是否在报文中条件进行前导码的匹配二次筛选 - public List matchLeadingCode(String protocolContent){ + public static List matchFrameLeadingCode(String protocolContent){ List initialConfigs = initialMatch(protocolContent); List preCodeConfigs = initialConfigs.stream() .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) @@ -26,13 +19,16 @@ } //初始化匹配前导码内容 - private List initialMatch(String protocolContent) { - String protocolStr = protocolContent.charAt(0) + ""; - QueryWrapper queryWrapper = new QueryWrapper() - .likeRight("pre_fix", protocolStr); - List protocolConfigList = protocolMapper.selectList(queryWrapper); - return protocolConfigList; + private static List initialMatch(String protocolContent) { + String firstFrameChar = protocolContent.charAt(0) + ""; + ProtocolConfigProvider protocolConfigProvider=new ProtocolConfigProvider(firstFrameChar); + return protocolConfigProvider.getMatchList(); } + + + + + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index cf2113d..e915877 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -1,32 +1,35 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(0) -@Service +@Component public class FrameLengthMatcher implements FrameStructMatcher { - @Autowired - private FieldParser fieldParser; - //超过长度 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { String dataGramContent = ByteBufUtil.hexDump(byteBuf); - if (StringUtils.isEmpty(protocolConfig.getUnpackId()) && StringUtils.isEmpty(protocolConfig.getTailStr())) { - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + //当不存在结尾标志和拆包标志,可以直接使用长度进行匹配 + if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { if (dataGramContent.length() >= totalLength) {//等于长度返回true,超出长度,切断 - ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, protocolConfig, totalLength); + ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, totalLength); return wholeDatagramByte; } else { //读的标志位前移舍弃 @@ -38,7 +41,7 @@ return null; } - private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, Integer totalLength) { byteBuf.readBytes(totalLength); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, totalLength - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 2bfc213..d527ad0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; @@ -13,7 +13,7 @@ import lombok.AllArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.nio.charset.Charset; import java.util.Map; @@ -22,32 +22,30 @@ * 后续标志验证 */ @Order(1) -@Service +@Component @AllArgsConstructor -public class FrameMarkMatcher implements FrameStructMatcher { - - private final FieldConfigDao fieldConfigDao; - private final FieldParser fieldParser; - private final FieldResolver fieldResolverManger; +public class FrameMarkMatcher implements FrameStructMatcher, FixedPropertyEnum { //帧后续标志=>结束,进行帧的重组=>有后续,1、帧移位判别 2、继续接收帧 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig UnpackConfig = StringUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getUnpackId()); - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); - Integer upback = 0; + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); ByteBuf mergeWholeFrameByte = null; - if (!ObjectUtil.isEmpty(UnpackConfig)) { - while (hasNextFullFrame(byteBuf, protocolConfig)) { - upback = (Integer) fieldResolverManger.filedParserManger(byteBuf, UnpackConfig, null); + if (!ObjectUtil.isEmpty(unpackFlag)) { + while (hasNextFullFrame(byteBuf, protocolConfig, protocolFieldConfigProvider)) { //是否存在后续位 - if (upback == 1) {//使用esayRule + if (unpackFlag == 1) {//使用esayRule //表示可以截取 - mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolConfig, totalLength); + mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolFieldConfigProvider, protocolConfig); return mergeWholeFrameByte; } else { - byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig)); + byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig, protocolFieldConfigProvider)); } } } @@ -56,7 +54,8 @@ //选取第一个帧,将业务内容和后面部分分开 //计算数据报文-业务内容 - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolFieldConfigProvider protocolFieldConfigProvider, ProtocolConfig protocolConfig) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); //截取完整报文 byteBuf.readBytes(totalLength); ByteBuf byteBufContent = byteBuf.slice(0, byteBuf.readerIndex()); @@ -68,15 +67,15 @@ String tail = ""; System.out.println(ByteBufUtil.hexDump(byteBufContent)); //会存在多个帧拼接在一起的的情况,进行合并处理 - while (hasNextFullFrame(byteBufContent, protocolConfig)) { - Integer currentFrameLength = fieldParser.getTotalLength(protocolConfig, byteBufContent); + while (hasNextFullFrame(byteBufContent, protocolConfig, protocolFieldConfigProvider)) { + Integer currentFrameLength = protocolFieldConfigProvider.getTotalLength(byteBufContent, protocolConfig); byteBufContent.readBytes(currentFrameLength); ByteBuf currentbyteBuf = byteBufContent.slice(0, byteBufContent.readerIndex()); byteBufContent.markReaderIndex();//读的标志位前移 System.out.println(ByteBufUtil.hexDump(byteBufContent)); String hexDump = currentbyteBuf.toString(Charset.forName("ISO-8859-1")); //获取当前固定帧结构的关系map - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, currentbyteBuf); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(currentbyteBuf, protocolConfig); if (StringUtils.isEmpty(mergeFrameStr)) { //首次获取业务数据报文 mergeFrameStr += hexDump.substring(0, currentFrameFixedProperty.get("tailPosition")); @@ -95,22 +94,22 @@ /** * 获取平移到下一帧起始位置 */ - public int getNextFrameOffset(ByteBuf buffer, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, buffer); - return currentFrameFixedProperty.get("totalLength"); + public int getNextFrameOffset(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + return currentFrameFixedProperty.get(TOTAL_LENGTH); } /** * 判断是否出错进行整个帧的 */ - public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, byteBuf); + public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); //保证读取位置不在固定位置,是可变的业务内容 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("fixedPosition")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(FIXED_POSITION)) { return false; } //判断读取是否操作帧长度 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("totalLength")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(TOTAL_LENGTH)) { return false; } return true; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 76a3784..c3a1bab 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -1,50 +1,50 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.parser.instance.GeneralProcessor; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; +import io.netty.buffer.ByteBufUtil;; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(2) -@Service +@Component public class FrameTailMatcher implements FrameStructMatcher { - @Resource - private FieldConfigDao fieldConfigDao; - @Autowired - private GeneralProcessor generalProcessor; - //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig tailFieldConfig = StringUtils.isEmpty(protocolConfig.getTailStr()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getTailStr()); - if (!ObjectUtil.isEmpty(tailFieldConfig)) { - String tailStr = tailFieldConfig.getFieldName(); + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfig protocolFieldConfig = ObjectUtils.isEmpty(protocolConfig.getTailStr()) ? null : + fieldConfigProvider.getFieldConfigById(protocolConfig.getTailStr()); + if (!ObjectUtil.isEmpty(protocolFieldConfig)) { + String tailStr = protocolFieldConfig.getFieldName(); String dataGramContent = ByteBufUtil.hexDump(byteBuf); Boolean tailFlag = ByteBufUtil.hexDump(byteBuf).contains(tailStr); if (!tailFlag) { //使用esayRule return null; } else if (dataGramContent.indexOf(tailStr) < dataGramContent.length() - tailStr.length()) { Integer length = dataGramContent.indexOf(tailStr) + tailStr.length(); - ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, protocolConfig, length); + ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, length); return wholeDatagramByte; //存在粘包 } } return null; } - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer length) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, Integer length) { byteBuf.readBytes(length); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, length - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java new file mode 100644 index 0000000..5f1c177 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java @@ -0,0 +1,73 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.combined.GenericCombinedFieldResolver; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.CombinedFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class CombinedFieldConfigProvider { + + + /** + * 作为临时配置列表缓存使用 + */ + private final List combinedFieldConfigList; + private Map storeObjectMap = new HashMap<>(); + + public CombinedFieldConfigProvider(Long ruleId) { + CombinedFieldConfigRegistry combinedFieldConfigRegistry = SpringContextUtil.getBean(CombinedFieldConfigRegistry.class); + combinedFieldConfigList = combinedFieldConfigRegistry.getCombinedFieldConfigList(ruleId); + } + + public void parseDataField(RuleConfig ruleConfig, String clearZeroPlain,Map fieldConfigsMap ) { + if (showSkip()) { + return; + } + //匹配对应的数据,然后进行相关的字段解析 + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver(); + combinedFieldResolver.parseDataField(combinedFieldConfigList, byteBuf, storeObjectMap,fieldConfigsMap); + } + + + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getCombinedFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return combinedFieldConfigList.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public List getCombinedFieldConfigList() { + return combinedFieldConfigList; + } + + /* 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(combinedFieldConfigList) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java new file mode 100644 index 0000000..f3cfedc --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java @@ -0,0 +1,11 @@ +package com.casic.missiles.parser.provider; + +/** + * @author cz + * @date 2023-6-12 + */ +public class CommandEventProvider{ + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java index 608af3a..32cc8a4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java @@ -2,48 +2,47 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.delivery.decorator.ByteDecorator; +import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @AllArgsConstructor public class FieldDecoratorManger { - private final RuleDictDao ruleDictDao; + private final RuleConfigRegistry ruleDictDao; // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 // (1)静态的业务字段是字典里面可以配置的 // (2)动态的业务字段是通过规则生成的 public String contentMerge(String ruleJson, String sceneConent, String dynamicContent) { - List ruleDictList = ruleDictDao.getRuleDictConfig(); - Map ruleDictMap = ruleDictList.stream().collect( - Collectors.toMap(RuleDict::getId, e -> e)); - List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); - for (Map ruleMap : ruleMapList) { - String ruleType = String.valueOf(ruleMap.get("ruleType")); - ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); - NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); - byteDecorator.nodeDecoratorRule(nodeDecoratorParm); - } +// List ruleDictList = ruleDictDao.getRuleDictConfig(); +// Map ruleDictMap = ruleDictList.stream().collect( +// Collectors.toMap(RuleDict::getId, e -> e)); +// List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); +// for (Map ruleMap : ruleMapList) { +// String ruleType = String.valueOf(ruleMap.get("ruleType")); +// ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); +// NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); +// byteDecorator.nodeDecoratorRule(nodeDecoratorParm); +// } return null; } - - private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { - NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() - .contents(sceneConent) - .dynamicContent(dynamicContent) - .ruletypeId(ruletypeId) - .ruleDictMap(ruleDictMap) - .build(); - return nodeDecoratorParm; - } +// +// private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { +// NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() +// .contents(sceneConent) +// .dynamicContent(dynamicContent) +// .ruletypeId(ruletypeId) +// .ruleDictMap(ruleDictMap) +// .build(); +// return nodeDecoratorParm; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java index 652970c..b204ac3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java @@ -1,56 +1,56 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@AllArgsConstructor -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", - JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Component; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Component("logicalDecorator") +//@AllArgsConstructor +//@Slf4j +//public class LogicalShiftDecorator implements ByteDecorator { +// +//// private final FieldRuleEngineMapper fieldRuleEngineMapper; +//// +//// //字节位移 +//// @Override +//// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +//// String logicalValue = ""; +//// RuleEvaluator fieldRuleEngine = new RuleEvaluator(); +//// try { +//// Map env2 = new HashMap(); +//// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +//// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +//// for (String contentId : contentIdList) { +//// RuleDict ruleDict = ruleDictMap.get(contentId); +//// if (ruleDict.getCode().contains("#")) { +//// //使用动态的值 +//// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +//// } +//// env2.put(ruleDict.getName(), ruleDict.getCode()); +//// } +//// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +//// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +//// return null; +//// } +//// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +//// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +//// return values; +//// } catch (Exception ex) { +//// log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", +//// JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +//// return null; +//// } +//// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java index 346468f..822fead 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@AllArgsConstructor -@Slf4j -public class OperationDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("optionDecorator") +//@AllArgsConstructor +//@Slf4j +//public class OperationDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //混合运算,有常量或者乘除的缩放 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java index 50fb0a7..7a8bccb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@AllArgsConstructor -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +////精度计算 +//@AllArgsConstructor +//@Registry("precisionDecorator") +//@Slf4j +//public class PrecisionDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java index da39235..27f9cc7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java @@ -1,54 +1,53 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@AllArgsConstructor -@Slf4j -public class RuleDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("ruleDecorator") +//@AllArgsConstructor +//@Slf4j +//public class RuleDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //吃我一套正则表达式 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (Exception ex) { +// log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java index 7f5cbf3..c043f97 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java @@ -2,6 +2,6 @@ import java.util.Map; -public interface ComandeEventService { +public interface ComandeEventService{ Map loadComandeEventConfig(String protocolId,String scene); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java index 476ad84..aaf1837 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java @@ -2,46 +2,46 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.dao.CommandEventDao; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @Slf4j @AllArgsConstructor -public class ComandeEventServiceImpl implements ComandeEventService { +public class ComandeEventServiceImpl implements ComandeEventRegistry { - private final CommandEventDao commandEventDao; + // private final CommandEventDao commandEventDao; // 加密bean 固定字段出现变化的字段解析,业务字段的有序内容 @Override - public Map loadComandeEventConfig(String protocolId,String sceneName) { - CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); - if (ObjectUtil.isEmpty(commandEventConfig)) { - log.error("协议{},没有配置成功接收回复配置,清排查原因"); - return null; - } - String replyJson = commandEventConfig.getReplyContentJson(); - List> replyMapList = JSONArray.parseObject(replyJson, List.class); - List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); - Map fixMap = fixList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); - List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) - .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) - .collect(Collectors.toList()); - Map commandConfigMap = new HashMap<>(); - commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); - commandConfigMap.put("fixContent", fixMap); - commandConfigMap.put("bizContent", contentList); - return commandConfigMap; + public Map loadComandeEventConfig(String protocolId, String sceneName) { +// CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); +// if (ObjectUtil.isEmpty(commandEventConfig)) { +// log.error("协议{},没有配置成功接收回复配置,清排查原因"); +// return null; +// } +// String replyJson = commandEventConfig.getReplyContentJson(); +// List> replyMapList = JSONArray.parseObject(replyJson, List.class); +// List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); +// Map fixMap = fixList.stream() +// .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); +// List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) +// .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) +// .collect(Collectors.toList()); +// Map commandConfigMap = new HashMap<>(); +// commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); +// commandConfigMap.put("fixContent", fixMap); +// commandConfigMap.put("bizContent", contentList); +// return commandConfigMap; + return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 128b09d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java deleted file mode 100644 index 4016b0b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface DatagramEventMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java deleted file mode 100644 index 597c306..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.apache.ibatis.annotations.Mapper; - -public interface FieldConfigMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java deleted file mode 100644 index a31680a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.PreRuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface PreRuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java deleted file mode 100644 index 9060a69..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface ProtocolConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java deleted file mode 100644 index 6fa6936..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java deleted file mode 100644 index 582a705..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleDict; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleDictMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java deleted file mode 100644 index 6e302c8..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.CommandEventMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Optional; - -@Component -public class CommandEventDao { - - @Resource - private CommandEventMapper commandEventMapper; - - public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId) - .eq("scene", sceneName) - .eq("enabled", 1); - List commandEventConfig = commandEventMapper.selectList(queryWrapper); - Optional optionalEventConfig = commandEventConfig.stream().findFirst(); - return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java deleted file mode 100644 index 9137e4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.FieldConfigMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class FieldConfigDao { - - @Resource - private FieldConfigMapper fieldConfigMapper; - - public FieldConfig getFieldConfigById(String fieldId) { - FieldConfig fieldConfig = fieldConfigMapper.selectById(fieldId); - return fieldConfig; - } - - public List getFieldConfigs(String protocolId,Integer isFixed) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",isFixed); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - - public List getStorageFieldConfig(String protocolId) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",1) - .eq("is_storage",1); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java deleted file mode 100644 index 67bff6b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.mapper.PreRuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class PreRuleConfigDao { - - @Resource - private PreRuleConfigMapper preRuleConfigMapper; - - public List getPreRuleList(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return preRuleConfigMapper.selectList(queryWrapper); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java deleted file mode 100644 index d69ea85..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.RuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleConfigDao { - - @Resource - private RuleConfigMapper ruleConfigMapper; - - public RuleConfig getNextRuleConfig(String ruleFields) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("parse_rule_json", ruleFields); - return ruleConfigMapper.selectOne(queryWrapper); - } - - - public List getRuleConfigById(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return ruleConfigMapper.selectList(queryWrapper); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java deleted file mode 100644 index 932c185..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.RuleDictMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleDictDao { - - @Resource - private RuleDictMapper ruleDictMapper; - - public List getRuleDictConfig() { - List ruleDictList = ruleDictMapper.selectList(null); - return ruleDictList; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java index 9f9e279..43bc4d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java @@ -10,20 +10,15 @@ import io.netty.channel.socket.nio.NioServerSocketChannel; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import javax.annotation.PreDestroy; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static cn.hutool.core.util.ClassUtil.getClasses; /** * SensorhubServer netty服务端 */ @Slf4j -@Service +@Component public class SensorhubServer { /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java index 2c79ff5..9a28c36 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java @@ -11,13 +11,13 @@ import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioSocketChannel; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClient 客户端 */ @Slf4j -@Service +@Registry public final class SensorhubClient { public static void main(String[] args) throws Exception { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java index 9774be0..477c3f7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java @@ -6,12 +6,12 @@ import io.netty.channel.socket.SocketChannel; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientChannelInitialHandler */ -@Service +@Registry public class SensorhubClientChannelInitialHandler extends ChannelInitializer { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java index 346f4b3..73560e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java @@ -5,13 +5,13 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientHandler */ @Slf4j -@Service +@Registry public class SensorhubClientHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java index 5c1c6f2..d990af5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java @@ -4,12 +4,12 @@ import com.casic.missiles.pojo.Msg; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** * SensorhubServerHandler */ -@Service +@Component public class SensorhubServerHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 67283ae..af3172c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,41 +1,37 @@ package com.casic.missiles.parser; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultProtocolConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.*; +import com.casic.missiles.registry.FieldConfigRegistry; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; -import java.nio.charset.Charset; import java.util.HashMap; import java.util.List; import java.util.Map; -@Service("genericProtocolParser") +/** + * @author + */ +@Component("genericProtocolParser") @Slf4j -@AllArgsConstructor +@RequiredArgsConstructor public class GenericProtocolParser implements ProtocolParser { - private final LeadingCodeMatcher leadingCodeMatcher; private final List frameStructDispenserList; - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorInstanceSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; // 匹配首字母前导码=> 帧结构匹配前导码=> // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 @@ -44,18 +40,19 @@ public Boolean doParseProtocol(ByteBuf byteBuf) { String protocolContent = ByteBufUtil.hexDump(byteBuf); //匹配前导码 - List preCodeConfigs = leadingCodeMatcher.matchLeadingCode(protocolContent); + List preCodeConfigs = LeadingCodeMatcher.matchFrameLeadingCode(protocolContent); //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 if (preCodeConfigs.size() == 0) { - return rematch(byteBuf,protocolContent); + return rematch(byteBuf, protocolContent); } - //暂时先取第一个 + //暂时先取第一个,提升速度,使用享元模式, 减少类的创建销毁与构建 ProtocolConfig protocolConfig = preCodeConfigs.get(0); + AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); ByteBuf wholeDatagramByte = null; //通过匹配帧结构获取完整的数据包 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, preCodeConfigs.get(0))) != null) { + if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, protocolFactory)) != null) { break; } } @@ -68,76 +65,78 @@ * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 */ - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId, wholeDatagramByte); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap, protocolId); - //选取规则对应的流程实例 - DatagramEventConfig datagramEventConfig = processorInstanceSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); + //进行规则字段解析,进行匹配规则 + RuleConfig ruleConfig = getRuleConfig(protocolFactory, wholeDatagramByte); + if (ruleConfig == null) { + return false; + } //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, wholeDatagramByte); + ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte); + //以下进行业务的规则解析,同时选定流程实例 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); + DatagramEventProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain, + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText, protocolId); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain); //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); + datagramEventProvider.storeData(bizDataMap); return true; } - private Boolean rematch(ByteBuf byteBuf,String protocolContent) { + /** + * 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 + */ + private Boolean rematch(ByteBuf byteBuf, String protocolContent) { //重置位判断 byteBuf.resetReaderIndex(); //判断重置是否前移,如果没有前移,则直接判为匹配失败 if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { return false; } else { + //递归执行 return doParseProtocol(byteBuf); } } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; + //获取匹配规则->匹配规则 + private RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + //取出其中参与逻辑provider并判空 + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); + String rulePrepareFields = protocolConfig.getRulePrepareFields(); + //固定字段 + if (StringUtils.isNotEmpty(rulePrepareFields)) { + //获取统一固定字段解析 + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + //获取该协议的字段配置,用于协议规则匹配 + List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); + //获取规则 + RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, + rulePrepareFields, protocolFieldConfigs); + return ruleConfig; + } + return null; } - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + //数据构建,获取固定字段的store和业务字段store + private Map buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + Map bizDataMap = new HashMap<>(); + Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); + Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); + bizDataMap.putAll(ruleStoreObjectMap); + bizDataMap.putAll(protocolStoreObjectMap); return bizDataMap; } - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java index 8a46e32..16ce2e5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java @@ -3,6 +3,7 @@ import io.netty.buffer.ByteBuf; public interface ProtocolParser { + Boolean doParseProtocol(ByteBuf byteBuf); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java new file mode 100644 index 0000000..f7814af --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java @@ -0,0 +1,35 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.ProtocolConfigProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.ProtocolConfig; + +/** + * 存放基本协议的的加载信息 + */ +public class AbstractProtocolConfigFactory { + private final ProtocolConfigProvider protocolConfigProvider; + private final ProtocolFieldConfigProvider protocolFieldConfigProvider; + private final RuleConfigProvider ruleConfigProvider; + + public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { + this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); + this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); + this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); + } + + public ProtocolConfigProvider getProtocolConfigProvider() { + return protocolConfigProvider; + } + + public ProtocolFieldConfigProvider getProtocolFieldConfigProvider() { + return protocolFieldConfigProvider; + } + + public RuleConfigProvider getRuleConfigProvider() { + return ruleConfigProvider; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java new file mode 100644 index 0000000..6e36147 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java @@ -0,0 +1,57 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.CombinedFieldConfigProvider; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.FieldConfigProvider; +import com.casic.missiles.parser.provider.FieldRuleConfigProvider; + +/** + * 存放规则相关的的的加载信息 + */ +public class AbstractRuleConfigFactory { + + /** + * 处理字节 + */ + private final FieldConfigProvider fieldConfigProvider; + /** + * 处理组合字节解析的解码器 + */ + private final CombinedFieldConfigProvider combinedFieldConfigProvider; + /** + * 处理负责字节解析的规则配置 + */ + private final FieldRuleConfigProvider fieldRuleConfigProvider; + /** + * 处理实例流程 + */ + private final DatagramEventProvider datagramEventProvider; + + + public AbstractRuleConfigFactory(Long ruleId) { + this.fieldConfigProvider = new FieldConfigProvider(ruleId); + this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); + this.fieldRuleConfigProvider = new FieldRuleConfigProvider(ruleId); + this.datagramEventProvider = new DatagramEventProvider(ruleId); + } + + public FieldConfigProvider getFieldConfigProvider() { + return fieldConfigProvider; + } + + public CombinedFieldConfigProvider getCombinedFieldConfigProvider() { + return combinedFieldConfigProvider; + } + + public FieldRuleConfigProvider getFieldRuleConfigProvider() { + return fieldRuleConfigProvider; + } + + public DatagramEventProvider getDatagramEventProvider() { + return datagramEventProvider; + } + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java deleted file mode 100644 index 6e1719a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.factory; - - -import com.casic.missiles.pojo.ProtocolConfig; - -import java.util.List; - -/** - * 数据库访问优化(暂时未做) - *

- * 1、初始化协议解析配置,并存放到处存放缓存,对协议基本配置进行管理 - * 2、其中流程中所有的配置都经过此类进行管理,进行调用获取,增强解析速度 - */ -public interface DatagramFactory { - - /** - * 初始化 - */ - List datagramInit(); - - /** - * 根据前导码配置匹配,模糊匹配获取所有的报文项 - */ - List match(); - - /** - * 根据前导码匹配,返回报文项 - */ - List filer(); - - /** - * 保证数据的唯一性选择器 - */ - List selectOne(); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java new file mode 100644 index 0000000..87444a0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java @@ -0,0 +1,18 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +import java.util.List; + +/** + * 直接用,还是边用边创建 + */ +public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { + + + public DefaultProtocolConfigFactory(ProtocolConfig protocolConfig) { + super(protocolConfig); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java new file mode 100644 index 0000000..cce0c7c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java @@ -0,0 +1,12 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; + +public class DefaultRuleFactory extends AbstractRuleConfigFactory { + + public DefaultRuleFactory(Long ruleId) { + super(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java deleted file mode 100644 index 9ee97e0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.casic.missiles.parser.instance; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service -@Slf4j -@AllArgsConstructor -public class GeneralProcessor { - - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; - - /** - * 统一固定字段解析=>进行规则的查询的判断 - * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 - * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 - */ - @Deprecated - public boolean parseWholeDatagram(ByteBuf buffer, ProtocolConfig protocolConfig) { - try { - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap,protocolId); - //选取规则对应的流程= - DatagramEventConfig datagramEventConfig = processorSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); - //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); - //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); - //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); - //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); - //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); - return true; - } catch (Exception ex) { - log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", - ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); - return false; - } - } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; - } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); - } - - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); - return bizDataMap; - } - - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java index 25e7ad8..6a5777e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java @@ -1,23 +1,31 @@ package com.casic.missiles.parser.instance.impl; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.mapper.DatagramEventMapper; import com.casic.missiles.pojo.DatagramEventConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.SpringContextUtil; -@Service -@AllArgsConstructor +import java.util.List; +import java.util.Optional; + +/** + * @author cz + * + */ public class DefaultProcessorInstanceSelector implements ProcessorInstanceSelector { - private final DatagramEventMapper datagramEventMapper; + private static List datagramEventConfigs; + + static { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + datagramEventConfigs = datagramEventRegistry.getDatagramEventList(); + } @Override public DatagramEventConfig getProcessorInstance(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("rule_id", protocolId); - return datagramEventMapper.selectOne(queryWrapper); + Optional optionalSelectInstance = datagramEventConfigs.stream() + .filter(e -> e.getId().equals(protocolId)).limit(1).findFirst(); + return optionalSelectInstance.isPresent() ? optionalSelectInstance.get() : null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a778671..7b56a43 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,16 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import io.netty.buffer.ByteBuf; /** - * 分析匹配情况 - * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 - * 2、匹配不成功,有后续帧,可以进行下次匹配。 - * 3、匹配不成功,无后续帧,可以进行丢弃。 + * 分析匹配情况 + * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 + * 2、匹配不成功,有后续帧,可以进行下次匹配。 + * 3、匹配不成功,无后续帧,可以进行丢弃。 */ -public interface FrameStructMatcher{ +public interface FrameStructMatcher { - ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig); + ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 05320ab..8ebea78 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,23 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.ProtocolConfigMapper; +import com.casic.missiles.parser.provider.ProtocolConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Component; import java.util.List; import java.util.stream.Collectors; -@Component -@AllArgsConstructor public class LeadingCodeMatcher { - private final ProtocolConfigMapper protocolMapper; - //** 1、首字母匹配前导码, // 2、以匹配出的前导码是否在报文中条件进行前导码的匹配二次筛选 - public List matchLeadingCode(String protocolContent){ + public static List matchFrameLeadingCode(String protocolContent){ List initialConfigs = initialMatch(protocolContent); List preCodeConfigs = initialConfigs.stream() .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) @@ -26,13 +19,16 @@ } //初始化匹配前导码内容 - private List initialMatch(String protocolContent) { - String protocolStr = protocolContent.charAt(0) + ""; - QueryWrapper queryWrapper = new QueryWrapper() - .likeRight("pre_fix", protocolStr); - List protocolConfigList = protocolMapper.selectList(queryWrapper); - return protocolConfigList; + private static List initialMatch(String protocolContent) { + String firstFrameChar = protocolContent.charAt(0) + ""; + ProtocolConfigProvider protocolConfigProvider=new ProtocolConfigProvider(firstFrameChar); + return protocolConfigProvider.getMatchList(); } + + + + + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index cf2113d..e915877 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -1,32 +1,35 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(0) -@Service +@Component public class FrameLengthMatcher implements FrameStructMatcher { - @Autowired - private FieldParser fieldParser; - //超过长度 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { String dataGramContent = ByteBufUtil.hexDump(byteBuf); - if (StringUtils.isEmpty(protocolConfig.getUnpackId()) && StringUtils.isEmpty(protocolConfig.getTailStr())) { - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + //当不存在结尾标志和拆包标志,可以直接使用长度进行匹配 + if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { if (dataGramContent.length() >= totalLength) {//等于长度返回true,超出长度,切断 - ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, protocolConfig, totalLength); + ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, totalLength); return wholeDatagramByte; } else { //读的标志位前移舍弃 @@ -38,7 +41,7 @@ return null; } - private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, Integer totalLength) { byteBuf.readBytes(totalLength); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, totalLength - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 2bfc213..d527ad0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; @@ -13,7 +13,7 @@ import lombok.AllArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.nio.charset.Charset; import java.util.Map; @@ -22,32 +22,30 @@ * 后续标志验证 */ @Order(1) -@Service +@Component @AllArgsConstructor -public class FrameMarkMatcher implements FrameStructMatcher { - - private final FieldConfigDao fieldConfigDao; - private final FieldParser fieldParser; - private final FieldResolver fieldResolverManger; +public class FrameMarkMatcher implements FrameStructMatcher, FixedPropertyEnum { //帧后续标志=>结束,进行帧的重组=>有后续,1、帧移位判别 2、继续接收帧 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig UnpackConfig = StringUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getUnpackId()); - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); - Integer upback = 0; + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); ByteBuf mergeWholeFrameByte = null; - if (!ObjectUtil.isEmpty(UnpackConfig)) { - while (hasNextFullFrame(byteBuf, protocolConfig)) { - upback = (Integer) fieldResolverManger.filedParserManger(byteBuf, UnpackConfig, null); + if (!ObjectUtil.isEmpty(unpackFlag)) { + while (hasNextFullFrame(byteBuf, protocolConfig, protocolFieldConfigProvider)) { //是否存在后续位 - if (upback == 1) {//使用esayRule + if (unpackFlag == 1) {//使用esayRule //表示可以截取 - mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolConfig, totalLength); + mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolFieldConfigProvider, protocolConfig); return mergeWholeFrameByte; } else { - byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig)); + byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig, protocolFieldConfigProvider)); } } } @@ -56,7 +54,8 @@ //选取第一个帧,将业务内容和后面部分分开 //计算数据报文-业务内容 - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolFieldConfigProvider protocolFieldConfigProvider, ProtocolConfig protocolConfig) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); //截取完整报文 byteBuf.readBytes(totalLength); ByteBuf byteBufContent = byteBuf.slice(0, byteBuf.readerIndex()); @@ -68,15 +67,15 @@ String tail = ""; System.out.println(ByteBufUtil.hexDump(byteBufContent)); //会存在多个帧拼接在一起的的情况,进行合并处理 - while (hasNextFullFrame(byteBufContent, protocolConfig)) { - Integer currentFrameLength = fieldParser.getTotalLength(protocolConfig, byteBufContent); + while (hasNextFullFrame(byteBufContent, protocolConfig, protocolFieldConfigProvider)) { + Integer currentFrameLength = protocolFieldConfigProvider.getTotalLength(byteBufContent, protocolConfig); byteBufContent.readBytes(currentFrameLength); ByteBuf currentbyteBuf = byteBufContent.slice(0, byteBufContent.readerIndex()); byteBufContent.markReaderIndex();//读的标志位前移 System.out.println(ByteBufUtil.hexDump(byteBufContent)); String hexDump = currentbyteBuf.toString(Charset.forName("ISO-8859-1")); //获取当前固定帧结构的关系map - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, currentbyteBuf); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(currentbyteBuf, protocolConfig); if (StringUtils.isEmpty(mergeFrameStr)) { //首次获取业务数据报文 mergeFrameStr += hexDump.substring(0, currentFrameFixedProperty.get("tailPosition")); @@ -95,22 +94,22 @@ /** * 获取平移到下一帧起始位置 */ - public int getNextFrameOffset(ByteBuf buffer, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, buffer); - return currentFrameFixedProperty.get("totalLength"); + public int getNextFrameOffset(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + return currentFrameFixedProperty.get(TOTAL_LENGTH); } /** * 判断是否出错进行整个帧的 */ - public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, byteBuf); + public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); //保证读取位置不在固定位置,是可变的业务内容 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("fixedPosition")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(FIXED_POSITION)) { return false; } //判断读取是否操作帧长度 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("totalLength")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(TOTAL_LENGTH)) { return false; } return true; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 76a3784..c3a1bab 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -1,50 +1,50 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.parser.instance.GeneralProcessor; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; +import io.netty.buffer.ByteBufUtil;; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(2) -@Service +@Component public class FrameTailMatcher implements FrameStructMatcher { - @Resource - private FieldConfigDao fieldConfigDao; - @Autowired - private GeneralProcessor generalProcessor; - //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig tailFieldConfig = StringUtils.isEmpty(protocolConfig.getTailStr()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getTailStr()); - if (!ObjectUtil.isEmpty(tailFieldConfig)) { - String tailStr = tailFieldConfig.getFieldName(); + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfig protocolFieldConfig = ObjectUtils.isEmpty(protocolConfig.getTailStr()) ? null : + fieldConfigProvider.getFieldConfigById(protocolConfig.getTailStr()); + if (!ObjectUtil.isEmpty(protocolFieldConfig)) { + String tailStr = protocolFieldConfig.getFieldName(); String dataGramContent = ByteBufUtil.hexDump(byteBuf); Boolean tailFlag = ByteBufUtil.hexDump(byteBuf).contains(tailStr); if (!tailFlag) { //使用esayRule return null; } else if (dataGramContent.indexOf(tailStr) < dataGramContent.length() - tailStr.length()) { Integer length = dataGramContent.indexOf(tailStr) + tailStr.length(); - ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, protocolConfig, length); + ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, length); return wholeDatagramByte; //存在粘包 } } return null; } - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer length) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, Integer length) { byteBuf.readBytes(length); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, length - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java new file mode 100644 index 0000000..5f1c177 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java @@ -0,0 +1,73 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.combined.GenericCombinedFieldResolver; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.CombinedFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class CombinedFieldConfigProvider { + + + /** + * 作为临时配置列表缓存使用 + */ + private final List combinedFieldConfigList; + private Map storeObjectMap = new HashMap<>(); + + public CombinedFieldConfigProvider(Long ruleId) { + CombinedFieldConfigRegistry combinedFieldConfigRegistry = SpringContextUtil.getBean(CombinedFieldConfigRegistry.class); + combinedFieldConfigList = combinedFieldConfigRegistry.getCombinedFieldConfigList(ruleId); + } + + public void parseDataField(RuleConfig ruleConfig, String clearZeroPlain,Map fieldConfigsMap ) { + if (showSkip()) { + return; + } + //匹配对应的数据,然后进行相关的字段解析 + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver(); + combinedFieldResolver.parseDataField(combinedFieldConfigList, byteBuf, storeObjectMap,fieldConfigsMap); + } + + + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getCombinedFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return combinedFieldConfigList.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public List getCombinedFieldConfigList() { + return combinedFieldConfigList; + } + + /* 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(combinedFieldConfigList) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java new file mode 100644 index 0000000..f3cfedc --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java @@ -0,0 +1,11 @@ +package com.casic.missiles.parser.provider; + +/** + * @author cz + * @date 2023-6-12 + */ +public class CommandEventProvider{ + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java new file mode 100644 index 0000000..70eec5e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java @@ -0,0 +1,77 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.safe.SafeStrategy; +import com.casic.missiles.parser.sender.DataSubscribeProvider; +import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class DatagramEventProvider { + + private final DatagramEventConfig processorInstance; + + public DatagramEventProvider(Long ruleId) { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + List datagramEventConfigList = + datagramEventRegistry.getDatagramEventList(ruleId); + processorInstance = this.getProcessorInstance(datagramEventConfigList); + } + + public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { + if (showSkip()) { + return null; + } + return datagramEventConfigList.get(0); + } + + // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 + public String getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap) { + String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? + processorInstance.getSafeBean() : + fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); + if (!StringUtils.isEmpty(safeName)) { + //需要加密 + SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); + String plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); + return clearComplementZero(plain); + } + return ByteBufUtil.hexDump(bizDataContent); + } + + //解密清零操作 + private String clearComplementZero(String plain) { + plain = plain.substring(0, plain.lastIndexOf("00")); + return plain; + } + + //数据发送,数据发送者暂未构建 + public void storeData(Map bizDataMap) { + DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); +// dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return ObjectUtils.isNotEmpty(processorInstance) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java index 608af3a..32cc8a4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java @@ -2,48 +2,47 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.delivery.decorator.ByteDecorator; +import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @AllArgsConstructor public class FieldDecoratorManger { - private final RuleDictDao ruleDictDao; + private final RuleConfigRegistry ruleDictDao; // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 // (1)静态的业务字段是字典里面可以配置的 // (2)动态的业务字段是通过规则生成的 public String contentMerge(String ruleJson, String sceneConent, String dynamicContent) { - List ruleDictList = ruleDictDao.getRuleDictConfig(); - Map ruleDictMap = ruleDictList.stream().collect( - Collectors.toMap(RuleDict::getId, e -> e)); - List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); - for (Map ruleMap : ruleMapList) { - String ruleType = String.valueOf(ruleMap.get("ruleType")); - ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); - NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); - byteDecorator.nodeDecoratorRule(nodeDecoratorParm); - } +// List ruleDictList = ruleDictDao.getRuleDictConfig(); +// Map ruleDictMap = ruleDictList.stream().collect( +// Collectors.toMap(RuleDict::getId, e -> e)); +// List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); +// for (Map ruleMap : ruleMapList) { +// String ruleType = String.valueOf(ruleMap.get("ruleType")); +// ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); +// NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); +// byteDecorator.nodeDecoratorRule(nodeDecoratorParm); +// } return null; } - - private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { - NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() - .contents(sceneConent) - .dynamicContent(dynamicContent) - .ruletypeId(ruletypeId) - .ruleDictMap(ruleDictMap) - .build(); - return nodeDecoratorParm; - } +// +// private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { +// NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() +// .contents(sceneConent) +// .dynamicContent(dynamicContent) +// .ruletypeId(ruletypeId) +// .ruleDictMap(ruleDictMap) +// .build(); +// return nodeDecoratorParm; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java index 652970c..b204ac3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java @@ -1,56 +1,56 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@AllArgsConstructor -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", - JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Component; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Component("logicalDecorator") +//@AllArgsConstructor +//@Slf4j +//public class LogicalShiftDecorator implements ByteDecorator { +// +//// private final FieldRuleEngineMapper fieldRuleEngineMapper; +//// +//// //字节位移 +//// @Override +//// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +//// String logicalValue = ""; +//// RuleEvaluator fieldRuleEngine = new RuleEvaluator(); +//// try { +//// Map env2 = new HashMap(); +//// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +//// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +//// for (String contentId : contentIdList) { +//// RuleDict ruleDict = ruleDictMap.get(contentId); +//// if (ruleDict.getCode().contains("#")) { +//// //使用动态的值 +//// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +//// } +//// env2.put(ruleDict.getName(), ruleDict.getCode()); +//// } +//// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +//// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +//// return null; +//// } +//// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +//// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +//// return values; +//// } catch (Exception ex) { +//// log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", +//// JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +//// return null; +//// } +//// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java index 346468f..822fead 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@AllArgsConstructor -@Slf4j -public class OperationDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("optionDecorator") +//@AllArgsConstructor +//@Slf4j +//public class OperationDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //混合运算,有常量或者乘除的缩放 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java index 50fb0a7..7a8bccb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@AllArgsConstructor -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +////精度计算 +//@AllArgsConstructor +//@Registry("precisionDecorator") +//@Slf4j +//public class PrecisionDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java index da39235..27f9cc7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java @@ -1,54 +1,53 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@AllArgsConstructor -@Slf4j -public class RuleDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("ruleDecorator") +//@AllArgsConstructor +//@Slf4j +//public class RuleDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //吃我一套正则表达式 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (Exception ex) { +// log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java index 7f5cbf3..c043f97 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java @@ -2,6 +2,6 @@ import java.util.Map; -public interface ComandeEventService { +public interface ComandeEventService{ Map loadComandeEventConfig(String protocolId,String scene); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java index 476ad84..aaf1837 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java @@ -2,46 +2,46 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.dao.CommandEventDao; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @Slf4j @AllArgsConstructor -public class ComandeEventServiceImpl implements ComandeEventService { +public class ComandeEventServiceImpl implements ComandeEventRegistry { - private final CommandEventDao commandEventDao; + // private final CommandEventDao commandEventDao; // 加密bean 固定字段出现变化的字段解析,业务字段的有序内容 @Override - public Map loadComandeEventConfig(String protocolId,String sceneName) { - CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); - if (ObjectUtil.isEmpty(commandEventConfig)) { - log.error("协议{},没有配置成功接收回复配置,清排查原因"); - return null; - } - String replyJson = commandEventConfig.getReplyContentJson(); - List> replyMapList = JSONArray.parseObject(replyJson, List.class); - List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); - Map fixMap = fixList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); - List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) - .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) - .collect(Collectors.toList()); - Map commandConfigMap = new HashMap<>(); - commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); - commandConfigMap.put("fixContent", fixMap); - commandConfigMap.put("bizContent", contentList); - return commandConfigMap; + public Map loadComandeEventConfig(String protocolId, String sceneName) { +// CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); +// if (ObjectUtil.isEmpty(commandEventConfig)) { +// log.error("协议{},没有配置成功接收回复配置,清排查原因"); +// return null; +// } +// String replyJson = commandEventConfig.getReplyContentJson(); +// List> replyMapList = JSONArray.parseObject(replyJson, List.class); +// List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); +// Map fixMap = fixList.stream() +// .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); +// List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) +// .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) +// .collect(Collectors.toList()); +// Map commandConfigMap = new HashMap<>(); +// commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); +// commandConfigMap.put("fixContent", fixMap); +// commandConfigMap.put("bizContent", contentList); +// return commandConfigMap; + return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 128b09d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java deleted file mode 100644 index 4016b0b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface DatagramEventMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java deleted file mode 100644 index 597c306..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.apache.ibatis.annotations.Mapper; - -public interface FieldConfigMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java deleted file mode 100644 index a31680a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.PreRuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface PreRuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java deleted file mode 100644 index 9060a69..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface ProtocolConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java deleted file mode 100644 index 6fa6936..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java deleted file mode 100644 index 582a705..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleDict; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleDictMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java deleted file mode 100644 index 6e302c8..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.CommandEventMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Optional; - -@Component -public class CommandEventDao { - - @Resource - private CommandEventMapper commandEventMapper; - - public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId) - .eq("scene", sceneName) - .eq("enabled", 1); - List commandEventConfig = commandEventMapper.selectList(queryWrapper); - Optional optionalEventConfig = commandEventConfig.stream().findFirst(); - return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java deleted file mode 100644 index 9137e4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.FieldConfigMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class FieldConfigDao { - - @Resource - private FieldConfigMapper fieldConfigMapper; - - public FieldConfig getFieldConfigById(String fieldId) { - FieldConfig fieldConfig = fieldConfigMapper.selectById(fieldId); - return fieldConfig; - } - - public List getFieldConfigs(String protocolId,Integer isFixed) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",isFixed); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - - public List getStorageFieldConfig(String protocolId) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",1) - .eq("is_storage",1); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java deleted file mode 100644 index 67bff6b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.mapper.PreRuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class PreRuleConfigDao { - - @Resource - private PreRuleConfigMapper preRuleConfigMapper; - - public List getPreRuleList(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return preRuleConfigMapper.selectList(queryWrapper); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java deleted file mode 100644 index d69ea85..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.RuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleConfigDao { - - @Resource - private RuleConfigMapper ruleConfigMapper; - - public RuleConfig getNextRuleConfig(String ruleFields) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("parse_rule_json", ruleFields); - return ruleConfigMapper.selectOne(queryWrapper); - } - - - public List getRuleConfigById(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return ruleConfigMapper.selectList(queryWrapper); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java deleted file mode 100644 index 932c185..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.RuleDictMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleDictDao { - - @Resource - private RuleDictMapper ruleDictMapper; - - public List getRuleDictConfig() { - List ruleDictList = ruleDictMapper.selectList(null); - return ruleDictList; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java index 9f9e279..43bc4d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java @@ -10,20 +10,15 @@ import io.netty.channel.socket.nio.NioServerSocketChannel; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import javax.annotation.PreDestroy; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static cn.hutool.core.util.ClassUtil.getClasses; /** * SensorhubServer netty服务端 */ @Slf4j -@Service +@Component public class SensorhubServer { /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java index 2c79ff5..9a28c36 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java @@ -11,13 +11,13 @@ import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioSocketChannel; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClient 客户端 */ @Slf4j -@Service +@Registry public final class SensorhubClient { public static void main(String[] args) throws Exception { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java index 9774be0..477c3f7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java @@ -6,12 +6,12 @@ import io.netty.channel.socket.SocketChannel; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientChannelInitialHandler */ -@Service +@Registry public class SensorhubClientChannelInitialHandler extends ChannelInitializer { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java index 346f4b3..73560e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java @@ -5,13 +5,13 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientHandler */ @Slf4j -@Service +@Registry public class SensorhubClientHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java index 5c1c6f2..d990af5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java @@ -4,12 +4,12 @@ import com.casic.missiles.pojo.Msg; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** * SensorhubServerHandler */ -@Service +@Component public class SensorhubServerHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 67283ae..af3172c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,41 +1,37 @@ package com.casic.missiles.parser; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultProtocolConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.*; +import com.casic.missiles.registry.FieldConfigRegistry; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; -import java.nio.charset.Charset; import java.util.HashMap; import java.util.List; import java.util.Map; -@Service("genericProtocolParser") +/** + * @author + */ +@Component("genericProtocolParser") @Slf4j -@AllArgsConstructor +@RequiredArgsConstructor public class GenericProtocolParser implements ProtocolParser { - private final LeadingCodeMatcher leadingCodeMatcher; private final List frameStructDispenserList; - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorInstanceSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; // 匹配首字母前导码=> 帧结构匹配前导码=> // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 @@ -44,18 +40,19 @@ public Boolean doParseProtocol(ByteBuf byteBuf) { String protocolContent = ByteBufUtil.hexDump(byteBuf); //匹配前导码 - List preCodeConfigs = leadingCodeMatcher.matchLeadingCode(protocolContent); + List preCodeConfigs = LeadingCodeMatcher.matchFrameLeadingCode(protocolContent); //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 if (preCodeConfigs.size() == 0) { - return rematch(byteBuf,protocolContent); + return rematch(byteBuf, protocolContent); } - //暂时先取第一个 + //暂时先取第一个,提升速度,使用享元模式, 减少类的创建销毁与构建 ProtocolConfig protocolConfig = preCodeConfigs.get(0); + AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); ByteBuf wholeDatagramByte = null; //通过匹配帧结构获取完整的数据包 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, preCodeConfigs.get(0))) != null) { + if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, protocolFactory)) != null) { break; } } @@ -68,76 +65,78 @@ * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 */ - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId, wholeDatagramByte); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap, protocolId); - //选取规则对应的流程实例 - DatagramEventConfig datagramEventConfig = processorInstanceSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); + //进行规则字段解析,进行匹配规则 + RuleConfig ruleConfig = getRuleConfig(protocolFactory, wholeDatagramByte); + if (ruleConfig == null) { + return false; + } //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, wholeDatagramByte); + ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte); + //以下进行业务的规则解析,同时选定流程实例 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); + DatagramEventProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain, + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText, protocolId); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain); //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); + datagramEventProvider.storeData(bizDataMap); return true; } - private Boolean rematch(ByteBuf byteBuf,String protocolContent) { + /** + * 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 + */ + private Boolean rematch(ByteBuf byteBuf, String protocolContent) { //重置位判断 byteBuf.resetReaderIndex(); //判断重置是否前移,如果没有前移,则直接判为匹配失败 if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { return false; } else { + //递归执行 return doParseProtocol(byteBuf); } } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; + //获取匹配规则->匹配规则 + private RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + //取出其中参与逻辑provider并判空 + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); + String rulePrepareFields = protocolConfig.getRulePrepareFields(); + //固定字段 + if (StringUtils.isNotEmpty(rulePrepareFields)) { + //获取统一固定字段解析 + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + //获取该协议的字段配置,用于协议规则匹配 + List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); + //获取规则 + RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, + rulePrepareFields, protocolFieldConfigs); + return ruleConfig; + } + return null; } - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + //数据构建,获取固定字段的store和业务字段store + private Map buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + Map bizDataMap = new HashMap<>(); + Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); + Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); + bizDataMap.putAll(ruleStoreObjectMap); + bizDataMap.putAll(protocolStoreObjectMap); return bizDataMap; } - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java index 8a46e32..16ce2e5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java @@ -3,6 +3,7 @@ import io.netty.buffer.ByteBuf; public interface ProtocolParser { + Boolean doParseProtocol(ByteBuf byteBuf); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java new file mode 100644 index 0000000..f7814af --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java @@ -0,0 +1,35 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.ProtocolConfigProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.ProtocolConfig; + +/** + * 存放基本协议的的加载信息 + */ +public class AbstractProtocolConfigFactory { + private final ProtocolConfigProvider protocolConfigProvider; + private final ProtocolFieldConfigProvider protocolFieldConfigProvider; + private final RuleConfigProvider ruleConfigProvider; + + public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { + this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); + this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); + this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); + } + + public ProtocolConfigProvider getProtocolConfigProvider() { + return protocolConfigProvider; + } + + public ProtocolFieldConfigProvider getProtocolFieldConfigProvider() { + return protocolFieldConfigProvider; + } + + public RuleConfigProvider getRuleConfigProvider() { + return ruleConfigProvider; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java new file mode 100644 index 0000000..6e36147 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java @@ -0,0 +1,57 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.CombinedFieldConfigProvider; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.FieldConfigProvider; +import com.casic.missiles.parser.provider.FieldRuleConfigProvider; + +/** + * 存放规则相关的的的加载信息 + */ +public class AbstractRuleConfigFactory { + + /** + * 处理字节 + */ + private final FieldConfigProvider fieldConfigProvider; + /** + * 处理组合字节解析的解码器 + */ + private final CombinedFieldConfigProvider combinedFieldConfigProvider; + /** + * 处理负责字节解析的规则配置 + */ + private final FieldRuleConfigProvider fieldRuleConfigProvider; + /** + * 处理实例流程 + */ + private final DatagramEventProvider datagramEventProvider; + + + public AbstractRuleConfigFactory(Long ruleId) { + this.fieldConfigProvider = new FieldConfigProvider(ruleId); + this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); + this.fieldRuleConfigProvider = new FieldRuleConfigProvider(ruleId); + this.datagramEventProvider = new DatagramEventProvider(ruleId); + } + + public FieldConfigProvider getFieldConfigProvider() { + return fieldConfigProvider; + } + + public CombinedFieldConfigProvider getCombinedFieldConfigProvider() { + return combinedFieldConfigProvider; + } + + public FieldRuleConfigProvider getFieldRuleConfigProvider() { + return fieldRuleConfigProvider; + } + + public DatagramEventProvider getDatagramEventProvider() { + return datagramEventProvider; + } + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java deleted file mode 100644 index 6e1719a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.factory; - - -import com.casic.missiles.pojo.ProtocolConfig; - -import java.util.List; - -/** - * 数据库访问优化(暂时未做) - *

- * 1、初始化协议解析配置,并存放到处存放缓存,对协议基本配置进行管理 - * 2、其中流程中所有的配置都经过此类进行管理,进行调用获取,增强解析速度 - */ -public interface DatagramFactory { - - /** - * 初始化 - */ - List datagramInit(); - - /** - * 根据前导码配置匹配,模糊匹配获取所有的报文项 - */ - List match(); - - /** - * 根据前导码匹配,返回报文项 - */ - List filer(); - - /** - * 保证数据的唯一性选择器 - */ - List selectOne(); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java new file mode 100644 index 0000000..87444a0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java @@ -0,0 +1,18 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +import java.util.List; + +/** + * 直接用,还是边用边创建 + */ +public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { + + + public DefaultProtocolConfigFactory(ProtocolConfig protocolConfig) { + super(protocolConfig); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java new file mode 100644 index 0000000..cce0c7c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java @@ -0,0 +1,12 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; + +public class DefaultRuleFactory extends AbstractRuleConfigFactory { + + public DefaultRuleFactory(Long ruleId) { + super(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java deleted file mode 100644 index 9ee97e0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.casic.missiles.parser.instance; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service -@Slf4j -@AllArgsConstructor -public class GeneralProcessor { - - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; - - /** - * 统一固定字段解析=>进行规则的查询的判断 - * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 - * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 - */ - @Deprecated - public boolean parseWholeDatagram(ByteBuf buffer, ProtocolConfig protocolConfig) { - try { - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap,protocolId); - //选取规则对应的流程= - DatagramEventConfig datagramEventConfig = processorSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); - //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); - //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); - //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); - //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); - //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); - return true; - } catch (Exception ex) { - log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", - ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); - return false; - } - } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; - } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); - } - - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); - return bizDataMap; - } - - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java index 25e7ad8..6a5777e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java @@ -1,23 +1,31 @@ package com.casic.missiles.parser.instance.impl; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.mapper.DatagramEventMapper; import com.casic.missiles.pojo.DatagramEventConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.SpringContextUtil; -@Service -@AllArgsConstructor +import java.util.List; +import java.util.Optional; + +/** + * @author cz + * + */ public class DefaultProcessorInstanceSelector implements ProcessorInstanceSelector { - private final DatagramEventMapper datagramEventMapper; + private static List datagramEventConfigs; + + static { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + datagramEventConfigs = datagramEventRegistry.getDatagramEventList(); + } @Override public DatagramEventConfig getProcessorInstance(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("rule_id", protocolId); - return datagramEventMapper.selectOne(queryWrapper); + Optional optionalSelectInstance = datagramEventConfigs.stream() + .filter(e -> e.getId().equals(protocolId)).limit(1).findFirst(); + return optionalSelectInstance.isPresent() ? optionalSelectInstance.get() : null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a778671..7b56a43 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,16 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import io.netty.buffer.ByteBuf; /** - * 分析匹配情况 - * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 - * 2、匹配不成功,有后续帧,可以进行下次匹配。 - * 3、匹配不成功,无后续帧,可以进行丢弃。 + * 分析匹配情况 + * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 + * 2、匹配不成功,有后续帧,可以进行下次匹配。 + * 3、匹配不成功,无后续帧,可以进行丢弃。 */ -public interface FrameStructMatcher{ +public interface FrameStructMatcher { - ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig); + ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 05320ab..8ebea78 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,23 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.ProtocolConfigMapper; +import com.casic.missiles.parser.provider.ProtocolConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Component; import java.util.List; import java.util.stream.Collectors; -@Component -@AllArgsConstructor public class LeadingCodeMatcher { - private final ProtocolConfigMapper protocolMapper; - //** 1、首字母匹配前导码, // 2、以匹配出的前导码是否在报文中条件进行前导码的匹配二次筛选 - public List matchLeadingCode(String protocolContent){ + public static List matchFrameLeadingCode(String protocolContent){ List initialConfigs = initialMatch(protocolContent); List preCodeConfigs = initialConfigs.stream() .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) @@ -26,13 +19,16 @@ } //初始化匹配前导码内容 - private List initialMatch(String protocolContent) { - String protocolStr = protocolContent.charAt(0) + ""; - QueryWrapper queryWrapper = new QueryWrapper() - .likeRight("pre_fix", protocolStr); - List protocolConfigList = protocolMapper.selectList(queryWrapper); - return protocolConfigList; + private static List initialMatch(String protocolContent) { + String firstFrameChar = protocolContent.charAt(0) + ""; + ProtocolConfigProvider protocolConfigProvider=new ProtocolConfigProvider(firstFrameChar); + return protocolConfigProvider.getMatchList(); } + + + + + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index cf2113d..e915877 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -1,32 +1,35 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(0) -@Service +@Component public class FrameLengthMatcher implements FrameStructMatcher { - @Autowired - private FieldParser fieldParser; - //超过长度 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { String dataGramContent = ByteBufUtil.hexDump(byteBuf); - if (StringUtils.isEmpty(protocolConfig.getUnpackId()) && StringUtils.isEmpty(protocolConfig.getTailStr())) { - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + //当不存在结尾标志和拆包标志,可以直接使用长度进行匹配 + if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { if (dataGramContent.length() >= totalLength) {//等于长度返回true,超出长度,切断 - ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, protocolConfig, totalLength); + ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, totalLength); return wholeDatagramByte; } else { //读的标志位前移舍弃 @@ -38,7 +41,7 @@ return null; } - private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, Integer totalLength) { byteBuf.readBytes(totalLength); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, totalLength - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 2bfc213..d527ad0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; @@ -13,7 +13,7 @@ import lombok.AllArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.nio.charset.Charset; import java.util.Map; @@ -22,32 +22,30 @@ * 后续标志验证 */ @Order(1) -@Service +@Component @AllArgsConstructor -public class FrameMarkMatcher implements FrameStructMatcher { - - private final FieldConfigDao fieldConfigDao; - private final FieldParser fieldParser; - private final FieldResolver fieldResolverManger; +public class FrameMarkMatcher implements FrameStructMatcher, FixedPropertyEnum { //帧后续标志=>结束,进行帧的重组=>有后续,1、帧移位判别 2、继续接收帧 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig UnpackConfig = StringUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getUnpackId()); - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); - Integer upback = 0; + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); ByteBuf mergeWholeFrameByte = null; - if (!ObjectUtil.isEmpty(UnpackConfig)) { - while (hasNextFullFrame(byteBuf, protocolConfig)) { - upback = (Integer) fieldResolverManger.filedParserManger(byteBuf, UnpackConfig, null); + if (!ObjectUtil.isEmpty(unpackFlag)) { + while (hasNextFullFrame(byteBuf, protocolConfig, protocolFieldConfigProvider)) { //是否存在后续位 - if (upback == 1) {//使用esayRule + if (unpackFlag == 1) {//使用esayRule //表示可以截取 - mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolConfig, totalLength); + mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolFieldConfigProvider, protocolConfig); return mergeWholeFrameByte; } else { - byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig)); + byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig, protocolFieldConfigProvider)); } } } @@ -56,7 +54,8 @@ //选取第一个帧,将业务内容和后面部分分开 //计算数据报文-业务内容 - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolFieldConfigProvider protocolFieldConfigProvider, ProtocolConfig protocolConfig) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); //截取完整报文 byteBuf.readBytes(totalLength); ByteBuf byteBufContent = byteBuf.slice(0, byteBuf.readerIndex()); @@ -68,15 +67,15 @@ String tail = ""; System.out.println(ByteBufUtil.hexDump(byteBufContent)); //会存在多个帧拼接在一起的的情况,进行合并处理 - while (hasNextFullFrame(byteBufContent, protocolConfig)) { - Integer currentFrameLength = fieldParser.getTotalLength(protocolConfig, byteBufContent); + while (hasNextFullFrame(byteBufContent, protocolConfig, protocolFieldConfigProvider)) { + Integer currentFrameLength = protocolFieldConfigProvider.getTotalLength(byteBufContent, protocolConfig); byteBufContent.readBytes(currentFrameLength); ByteBuf currentbyteBuf = byteBufContent.slice(0, byteBufContent.readerIndex()); byteBufContent.markReaderIndex();//读的标志位前移 System.out.println(ByteBufUtil.hexDump(byteBufContent)); String hexDump = currentbyteBuf.toString(Charset.forName("ISO-8859-1")); //获取当前固定帧结构的关系map - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, currentbyteBuf); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(currentbyteBuf, protocolConfig); if (StringUtils.isEmpty(mergeFrameStr)) { //首次获取业务数据报文 mergeFrameStr += hexDump.substring(0, currentFrameFixedProperty.get("tailPosition")); @@ -95,22 +94,22 @@ /** * 获取平移到下一帧起始位置 */ - public int getNextFrameOffset(ByteBuf buffer, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, buffer); - return currentFrameFixedProperty.get("totalLength"); + public int getNextFrameOffset(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + return currentFrameFixedProperty.get(TOTAL_LENGTH); } /** * 判断是否出错进行整个帧的 */ - public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, byteBuf); + public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); //保证读取位置不在固定位置,是可变的业务内容 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("fixedPosition")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(FIXED_POSITION)) { return false; } //判断读取是否操作帧长度 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("totalLength")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(TOTAL_LENGTH)) { return false; } return true; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 76a3784..c3a1bab 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -1,50 +1,50 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.parser.instance.GeneralProcessor; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; +import io.netty.buffer.ByteBufUtil;; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(2) -@Service +@Component public class FrameTailMatcher implements FrameStructMatcher { - @Resource - private FieldConfigDao fieldConfigDao; - @Autowired - private GeneralProcessor generalProcessor; - //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig tailFieldConfig = StringUtils.isEmpty(protocolConfig.getTailStr()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getTailStr()); - if (!ObjectUtil.isEmpty(tailFieldConfig)) { - String tailStr = tailFieldConfig.getFieldName(); + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfig protocolFieldConfig = ObjectUtils.isEmpty(protocolConfig.getTailStr()) ? null : + fieldConfigProvider.getFieldConfigById(protocolConfig.getTailStr()); + if (!ObjectUtil.isEmpty(protocolFieldConfig)) { + String tailStr = protocolFieldConfig.getFieldName(); String dataGramContent = ByteBufUtil.hexDump(byteBuf); Boolean tailFlag = ByteBufUtil.hexDump(byteBuf).contains(tailStr); if (!tailFlag) { //使用esayRule return null; } else if (dataGramContent.indexOf(tailStr) < dataGramContent.length() - tailStr.length()) { Integer length = dataGramContent.indexOf(tailStr) + tailStr.length(); - ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, protocolConfig, length); + ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, length); return wholeDatagramByte; //存在粘包 } } return null; } - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer length) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, Integer length) { byteBuf.readBytes(length); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, length - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java new file mode 100644 index 0000000..5f1c177 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java @@ -0,0 +1,73 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.combined.GenericCombinedFieldResolver; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.CombinedFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class CombinedFieldConfigProvider { + + + /** + * 作为临时配置列表缓存使用 + */ + private final List combinedFieldConfigList; + private Map storeObjectMap = new HashMap<>(); + + public CombinedFieldConfigProvider(Long ruleId) { + CombinedFieldConfigRegistry combinedFieldConfigRegistry = SpringContextUtil.getBean(CombinedFieldConfigRegistry.class); + combinedFieldConfigList = combinedFieldConfigRegistry.getCombinedFieldConfigList(ruleId); + } + + public void parseDataField(RuleConfig ruleConfig, String clearZeroPlain,Map fieldConfigsMap ) { + if (showSkip()) { + return; + } + //匹配对应的数据,然后进行相关的字段解析 + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver(); + combinedFieldResolver.parseDataField(combinedFieldConfigList, byteBuf, storeObjectMap,fieldConfigsMap); + } + + + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getCombinedFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return combinedFieldConfigList.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public List getCombinedFieldConfigList() { + return combinedFieldConfigList; + } + + /* 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(combinedFieldConfigList) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java new file mode 100644 index 0000000..f3cfedc --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java @@ -0,0 +1,11 @@ +package com.casic.missiles.parser.provider; + +/** + * @author cz + * @date 2023-6-12 + */ +public class CommandEventProvider{ + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java new file mode 100644 index 0000000..70eec5e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java @@ -0,0 +1,77 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.safe.SafeStrategy; +import com.casic.missiles.parser.sender.DataSubscribeProvider; +import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class DatagramEventProvider { + + private final DatagramEventConfig processorInstance; + + public DatagramEventProvider(Long ruleId) { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + List datagramEventConfigList = + datagramEventRegistry.getDatagramEventList(ruleId); + processorInstance = this.getProcessorInstance(datagramEventConfigList); + } + + public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { + if (showSkip()) { + return null; + } + return datagramEventConfigList.get(0); + } + + // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 + public String getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap) { + String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? + processorInstance.getSafeBean() : + fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); + if (!StringUtils.isEmpty(safeName)) { + //需要加密 + SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); + String plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); + return clearComplementZero(plain); + } + return ByteBufUtil.hexDump(bizDataContent); + } + + //解密清零操作 + private String clearComplementZero(String plain) { + plain = plain.substring(0, plain.lastIndexOf("00")); + return plain; + } + + //数据发送,数据发送者暂未构建 + public void storeData(Map bizDataMap) { + DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); +// dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return ObjectUtils.isNotEmpty(processorInstance) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java new file mode 100644 index 0000000..7e1fe0a --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java @@ -0,0 +1,97 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.FieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class FieldConfigProvider { + + + private final List fieldConfigs; + private Map storeObjectMap = new HashMap<>(); +// private Map singleObjects = new ConcurrentHashMap<>(); + + public FieldConfigProvider(Long ruleId) { + FieldConfigRegistry fieldConfigRegistry = SpringContextUtil.getBean(FieldConfigRegistry.class); + fieldConfigs = fieldConfigRegistry.getFieldConfigList(ruleId); + } + + public List getFieldConfigs() { + return fieldConfigs; + } + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public Map parseDataField(RuleConfig ruleConfig, String clearZeroPlain) { + if (showSkip()) { + return null; + } + List prepareFieldConfig = prepareParseField(ruleConfig); + if (CollectionUtils.isNotEmpty(prepareFieldConfig)) { + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(fieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + return fixDataMap; + } + } + return null; + } + + /** + * 得到需要处理的业务内容 + * + * @return + */ + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return fieldConfigs.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public Map getFieldConfigsMap() { + return fieldConfigs.stream().collect( + Collectors.toMap(FieldConfig::getId, e -> e) + ); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(fieldConfigs) ? false : true; + } + + +} + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java index 608af3a..32cc8a4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java @@ -2,48 +2,47 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.delivery.decorator.ByteDecorator; +import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @AllArgsConstructor public class FieldDecoratorManger { - private final RuleDictDao ruleDictDao; + private final RuleConfigRegistry ruleDictDao; // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 // (1)静态的业务字段是字典里面可以配置的 // (2)动态的业务字段是通过规则生成的 public String contentMerge(String ruleJson, String sceneConent, String dynamicContent) { - List ruleDictList = ruleDictDao.getRuleDictConfig(); - Map ruleDictMap = ruleDictList.stream().collect( - Collectors.toMap(RuleDict::getId, e -> e)); - List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); - for (Map ruleMap : ruleMapList) { - String ruleType = String.valueOf(ruleMap.get("ruleType")); - ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); - NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); - byteDecorator.nodeDecoratorRule(nodeDecoratorParm); - } +// List ruleDictList = ruleDictDao.getRuleDictConfig(); +// Map ruleDictMap = ruleDictList.stream().collect( +// Collectors.toMap(RuleDict::getId, e -> e)); +// List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); +// for (Map ruleMap : ruleMapList) { +// String ruleType = String.valueOf(ruleMap.get("ruleType")); +// ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); +// NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); +// byteDecorator.nodeDecoratorRule(nodeDecoratorParm); +// } return null; } - - private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { - NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() - .contents(sceneConent) - .dynamicContent(dynamicContent) - .ruletypeId(ruletypeId) - .ruleDictMap(ruleDictMap) - .build(); - return nodeDecoratorParm; - } +// +// private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { +// NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() +// .contents(sceneConent) +// .dynamicContent(dynamicContent) +// .ruletypeId(ruletypeId) +// .ruleDictMap(ruleDictMap) +// .build(); +// return nodeDecoratorParm; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java index 652970c..b204ac3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java @@ -1,56 +1,56 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@AllArgsConstructor -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", - JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Component; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Component("logicalDecorator") +//@AllArgsConstructor +//@Slf4j +//public class LogicalShiftDecorator implements ByteDecorator { +// +//// private final FieldRuleEngineMapper fieldRuleEngineMapper; +//// +//// //字节位移 +//// @Override +//// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +//// String logicalValue = ""; +//// RuleEvaluator fieldRuleEngine = new RuleEvaluator(); +//// try { +//// Map env2 = new HashMap(); +//// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +//// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +//// for (String contentId : contentIdList) { +//// RuleDict ruleDict = ruleDictMap.get(contentId); +//// if (ruleDict.getCode().contains("#")) { +//// //使用动态的值 +//// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +//// } +//// env2.put(ruleDict.getName(), ruleDict.getCode()); +//// } +//// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +//// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +//// return null; +//// } +//// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +//// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +//// return values; +//// } catch (Exception ex) { +//// log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", +//// JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +//// return null; +//// } +//// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java index 346468f..822fead 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@AllArgsConstructor -@Slf4j -public class OperationDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("optionDecorator") +//@AllArgsConstructor +//@Slf4j +//public class OperationDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //混合运算,有常量或者乘除的缩放 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java index 50fb0a7..7a8bccb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@AllArgsConstructor -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +////精度计算 +//@AllArgsConstructor +//@Registry("precisionDecorator") +//@Slf4j +//public class PrecisionDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java index da39235..27f9cc7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java @@ -1,54 +1,53 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@AllArgsConstructor -@Slf4j -public class RuleDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("ruleDecorator") +//@AllArgsConstructor +//@Slf4j +//public class RuleDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //吃我一套正则表达式 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (Exception ex) { +// log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java index 7f5cbf3..c043f97 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java @@ -2,6 +2,6 @@ import java.util.Map; -public interface ComandeEventService { +public interface ComandeEventService{ Map loadComandeEventConfig(String protocolId,String scene); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java index 476ad84..aaf1837 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java @@ -2,46 +2,46 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.dao.CommandEventDao; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @Slf4j @AllArgsConstructor -public class ComandeEventServiceImpl implements ComandeEventService { +public class ComandeEventServiceImpl implements ComandeEventRegistry { - private final CommandEventDao commandEventDao; + // private final CommandEventDao commandEventDao; // 加密bean 固定字段出现变化的字段解析,业务字段的有序内容 @Override - public Map loadComandeEventConfig(String protocolId,String sceneName) { - CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); - if (ObjectUtil.isEmpty(commandEventConfig)) { - log.error("协议{},没有配置成功接收回复配置,清排查原因"); - return null; - } - String replyJson = commandEventConfig.getReplyContentJson(); - List> replyMapList = JSONArray.parseObject(replyJson, List.class); - List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); - Map fixMap = fixList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); - List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) - .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) - .collect(Collectors.toList()); - Map commandConfigMap = new HashMap<>(); - commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); - commandConfigMap.put("fixContent", fixMap); - commandConfigMap.put("bizContent", contentList); - return commandConfigMap; + public Map loadComandeEventConfig(String protocolId, String sceneName) { +// CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); +// if (ObjectUtil.isEmpty(commandEventConfig)) { +// log.error("协议{},没有配置成功接收回复配置,清排查原因"); +// return null; +// } +// String replyJson = commandEventConfig.getReplyContentJson(); +// List> replyMapList = JSONArray.parseObject(replyJson, List.class); +// List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); +// Map fixMap = fixList.stream() +// .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); +// List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) +// .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) +// .collect(Collectors.toList()); +// Map commandConfigMap = new HashMap<>(); +// commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); +// commandConfigMap.put("fixContent", fixMap); +// commandConfigMap.put("bizContent", contentList); +// return commandConfigMap; + return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 128b09d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java deleted file mode 100644 index 4016b0b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface DatagramEventMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java deleted file mode 100644 index 597c306..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.apache.ibatis.annotations.Mapper; - -public interface FieldConfigMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java deleted file mode 100644 index a31680a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.PreRuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface PreRuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java deleted file mode 100644 index 9060a69..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface ProtocolConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java deleted file mode 100644 index 6fa6936..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java deleted file mode 100644 index 582a705..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleDict; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleDictMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java deleted file mode 100644 index 6e302c8..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.CommandEventMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Optional; - -@Component -public class CommandEventDao { - - @Resource - private CommandEventMapper commandEventMapper; - - public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId) - .eq("scene", sceneName) - .eq("enabled", 1); - List commandEventConfig = commandEventMapper.selectList(queryWrapper); - Optional optionalEventConfig = commandEventConfig.stream().findFirst(); - return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java deleted file mode 100644 index 9137e4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.FieldConfigMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class FieldConfigDao { - - @Resource - private FieldConfigMapper fieldConfigMapper; - - public FieldConfig getFieldConfigById(String fieldId) { - FieldConfig fieldConfig = fieldConfigMapper.selectById(fieldId); - return fieldConfig; - } - - public List getFieldConfigs(String protocolId,Integer isFixed) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",isFixed); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - - public List getStorageFieldConfig(String protocolId) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",1) - .eq("is_storage",1); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java deleted file mode 100644 index 67bff6b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.mapper.PreRuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class PreRuleConfigDao { - - @Resource - private PreRuleConfigMapper preRuleConfigMapper; - - public List getPreRuleList(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return preRuleConfigMapper.selectList(queryWrapper); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java deleted file mode 100644 index d69ea85..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.RuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleConfigDao { - - @Resource - private RuleConfigMapper ruleConfigMapper; - - public RuleConfig getNextRuleConfig(String ruleFields) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("parse_rule_json", ruleFields); - return ruleConfigMapper.selectOne(queryWrapper); - } - - - public List getRuleConfigById(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return ruleConfigMapper.selectList(queryWrapper); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java deleted file mode 100644 index 932c185..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.RuleDictMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleDictDao { - - @Resource - private RuleDictMapper ruleDictMapper; - - public List getRuleDictConfig() { - List ruleDictList = ruleDictMapper.selectList(null); - return ruleDictList; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java index 9f9e279..43bc4d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java @@ -10,20 +10,15 @@ import io.netty.channel.socket.nio.NioServerSocketChannel; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import javax.annotation.PreDestroy; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static cn.hutool.core.util.ClassUtil.getClasses; /** * SensorhubServer netty服务端 */ @Slf4j -@Service +@Component public class SensorhubServer { /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java index 2c79ff5..9a28c36 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java @@ -11,13 +11,13 @@ import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioSocketChannel; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClient 客户端 */ @Slf4j -@Service +@Registry public final class SensorhubClient { public static void main(String[] args) throws Exception { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java index 9774be0..477c3f7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java @@ -6,12 +6,12 @@ import io.netty.channel.socket.SocketChannel; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientChannelInitialHandler */ -@Service +@Registry public class SensorhubClientChannelInitialHandler extends ChannelInitializer { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java index 346f4b3..73560e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java @@ -5,13 +5,13 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientHandler */ @Slf4j -@Service +@Registry public class SensorhubClientHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java index 5c1c6f2..d990af5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java @@ -4,12 +4,12 @@ import com.casic.missiles.pojo.Msg; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** * SensorhubServerHandler */ -@Service +@Component public class SensorhubServerHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 67283ae..af3172c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,41 +1,37 @@ package com.casic.missiles.parser; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultProtocolConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.*; +import com.casic.missiles.registry.FieldConfigRegistry; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; -import java.nio.charset.Charset; import java.util.HashMap; import java.util.List; import java.util.Map; -@Service("genericProtocolParser") +/** + * @author + */ +@Component("genericProtocolParser") @Slf4j -@AllArgsConstructor +@RequiredArgsConstructor public class GenericProtocolParser implements ProtocolParser { - private final LeadingCodeMatcher leadingCodeMatcher; private final List frameStructDispenserList; - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorInstanceSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; // 匹配首字母前导码=> 帧结构匹配前导码=> // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 @@ -44,18 +40,19 @@ public Boolean doParseProtocol(ByteBuf byteBuf) { String protocolContent = ByteBufUtil.hexDump(byteBuf); //匹配前导码 - List preCodeConfigs = leadingCodeMatcher.matchLeadingCode(protocolContent); + List preCodeConfigs = LeadingCodeMatcher.matchFrameLeadingCode(protocolContent); //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 if (preCodeConfigs.size() == 0) { - return rematch(byteBuf,protocolContent); + return rematch(byteBuf, protocolContent); } - //暂时先取第一个 + //暂时先取第一个,提升速度,使用享元模式, 减少类的创建销毁与构建 ProtocolConfig protocolConfig = preCodeConfigs.get(0); + AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); ByteBuf wholeDatagramByte = null; //通过匹配帧结构获取完整的数据包 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, preCodeConfigs.get(0))) != null) { + if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, protocolFactory)) != null) { break; } } @@ -68,76 +65,78 @@ * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 */ - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId, wholeDatagramByte); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap, protocolId); - //选取规则对应的流程实例 - DatagramEventConfig datagramEventConfig = processorInstanceSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); + //进行规则字段解析,进行匹配规则 + RuleConfig ruleConfig = getRuleConfig(protocolFactory, wholeDatagramByte); + if (ruleConfig == null) { + return false; + } //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, wholeDatagramByte); + ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte); + //以下进行业务的规则解析,同时选定流程实例 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); + DatagramEventProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain, + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText, protocolId); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain); //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); + datagramEventProvider.storeData(bizDataMap); return true; } - private Boolean rematch(ByteBuf byteBuf,String protocolContent) { + /** + * 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 + */ + private Boolean rematch(ByteBuf byteBuf, String protocolContent) { //重置位判断 byteBuf.resetReaderIndex(); //判断重置是否前移,如果没有前移,则直接判为匹配失败 if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { return false; } else { + //递归执行 return doParseProtocol(byteBuf); } } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; + //获取匹配规则->匹配规则 + private RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + //取出其中参与逻辑provider并判空 + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); + String rulePrepareFields = protocolConfig.getRulePrepareFields(); + //固定字段 + if (StringUtils.isNotEmpty(rulePrepareFields)) { + //获取统一固定字段解析 + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + //获取该协议的字段配置,用于协议规则匹配 + List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); + //获取规则 + RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, + rulePrepareFields, protocolFieldConfigs); + return ruleConfig; + } + return null; } - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + //数据构建,获取固定字段的store和业务字段store + private Map buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + Map bizDataMap = new HashMap<>(); + Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); + Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); + bizDataMap.putAll(ruleStoreObjectMap); + bizDataMap.putAll(protocolStoreObjectMap); return bizDataMap; } - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java index 8a46e32..16ce2e5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java @@ -3,6 +3,7 @@ import io.netty.buffer.ByteBuf; public interface ProtocolParser { + Boolean doParseProtocol(ByteBuf byteBuf); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java new file mode 100644 index 0000000..f7814af --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java @@ -0,0 +1,35 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.ProtocolConfigProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.ProtocolConfig; + +/** + * 存放基本协议的的加载信息 + */ +public class AbstractProtocolConfigFactory { + private final ProtocolConfigProvider protocolConfigProvider; + private final ProtocolFieldConfigProvider protocolFieldConfigProvider; + private final RuleConfigProvider ruleConfigProvider; + + public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { + this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); + this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); + this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); + } + + public ProtocolConfigProvider getProtocolConfigProvider() { + return protocolConfigProvider; + } + + public ProtocolFieldConfigProvider getProtocolFieldConfigProvider() { + return protocolFieldConfigProvider; + } + + public RuleConfigProvider getRuleConfigProvider() { + return ruleConfigProvider; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java new file mode 100644 index 0000000..6e36147 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java @@ -0,0 +1,57 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.CombinedFieldConfigProvider; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.FieldConfigProvider; +import com.casic.missiles.parser.provider.FieldRuleConfigProvider; + +/** + * 存放规则相关的的的加载信息 + */ +public class AbstractRuleConfigFactory { + + /** + * 处理字节 + */ + private final FieldConfigProvider fieldConfigProvider; + /** + * 处理组合字节解析的解码器 + */ + private final CombinedFieldConfigProvider combinedFieldConfigProvider; + /** + * 处理负责字节解析的规则配置 + */ + private final FieldRuleConfigProvider fieldRuleConfigProvider; + /** + * 处理实例流程 + */ + private final DatagramEventProvider datagramEventProvider; + + + public AbstractRuleConfigFactory(Long ruleId) { + this.fieldConfigProvider = new FieldConfigProvider(ruleId); + this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); + this.fieldRuleConfigProvider = new FieldRuleConfigProvider(ruleId); + this.datagramEventProvider = new DatagramEventProvider(ruleId); + } + + public FieldConfigProvider getFieldConfigProvider() { + return fieldConfigProvider; + } + + public CombinedFieldConfigProvider getCombinedFieldConfigProvider() { + return combinedFieldConfigProvider; + } + + public FieldRuleConfigProvider getFieldRuleConfigProvider() { + return fieldRuleConfigProvider; + } + + public DatagramEventProvider getDatagramEventProvider() { + return datagramEventProvider; + } + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java deleted file mode 100644 index 6e1719a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.factory; - - -import com.casic.missiles.pojo.ProtocolConfig; - -import java.util.List; - -/** - * 数据库访问优化(暂时未做) - *

- * 1、初始化协议解析配置,并存放到处存放缓存,对协议基本配置进行管理 - * 2、其中流程中所有的配置都经过此类进行管理,进行调用获取,增强解析速度 - */ -public interface DatagramFactory { - - /** - * 初始化 - */ - List datagramInit(); - - /** - * 根据前导码配置匹配,模糊匹配获取所有的报文项 - */ - List match(); - - /** - * 根据前导码匹配,返回报文项 - */ - List filer(); - - /** - * 保证数据的唯一性选择器 - */ - List selectOne(); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java new file mode 100644 index 0000000..87444a0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java @@ -0,0 +1,18 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +import java.util.List; + +/** + * 直接用,还是边用边创建 + */ +public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { + + + public DefaultProtocolConfigFactory(ProtocolConfig protocolConfig) { + super(protocolConfig); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java new file mode 100644 index 0000000..cce0c7c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java @@ -0,0 +1,12 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; + +public class DefaultRuleFactory extends AbstractRuleConfigFactory { + + public DefaultRuleFactory(Long ruleId) { + super(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java deleted file mode 100644 index 9ee97e0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.casic.missiles.parser.instance; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service -@Slf4j -@AllArgsConstructor -public class GeneralProcessor { - - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; - - /** - * 统一固定字段解析=>进行规则的查询的判断 - * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 - * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 - */ - @Deprecated - public boolean parseWholeDatagram(ByteBuf buffer, ProtocolConfig protocolConfig) { - try { - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap,protocolId); - //选取规则对应的流程= - DatagramEventConfig datagramEventConfig = processorSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); - //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); - //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); - //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); - //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); - //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); - return true; - } catch (Exception ex) { - log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", - ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); - return false; - } - } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; - } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); - } - - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); - return bizDataMap; - } - - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java index 25e7ad8..6a5777e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java @@ -1,23 +1,31 @@ package com.casic.missiles.parser.instance.impl; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.mapper.DatagramEventMapper; import com.casic.missiles.pojo.DatagramEventConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.SpringContextUtil; -@Service -@AllArgsConstructor +import java.util.List; +import java.util.Optional; + +/** + * @author cz + * + */ public class DefaultProcessorInstanceSelector implements ProcessorInstanceSelector { - private final DatagramEventMapper datagramEventMapper; + private static List datagramEventConfigs; + + static { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + datagramEventConfigs = datagramEventRegistry.getDatagramEventList(); + } @Override public DatagramEventConfig getProcessorInstance(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("rule_id", protocolId); - return datagramEventMapper.selectOne(queryWrapper); + Optional optionalSelectInstance = datagramEventConfigs.stream() + .filter(e -> e.getId().equals(protocolId)).limit(1).findFirst(); + return optionalSelectInstance.isPresent() ? optionalSelectInstance.get() : null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a778671..7b56a43 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,16 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import io.netty.buffer.ByteBuf; /** - * 分析匹配情况 - * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 - * 2、匹配不成功,有后续帧,可以进行下次匹配。 - * 3、匹配不成功,无后续帧,可以进行丢弃。 + * 分析匹配情况 + * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 + * 2、匹配不成功,有后续帧,可以进行下次匹配。 + * 3、匹配不成功,无后续帧,可以进行丢弃。 */ -public interface FrameStructMatcher{ +public interface FrameStructMatcher { - ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig); + ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 05320ab..8ebea78 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,23 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.ProtocolConfigMapper; +import com.casic.missiles.parser.provider.ProtocolConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Component; import java.util.List; import java.util.stream.Collectors; -@Component -@AllArgsConstructor public class LeadingCodeMatcher { - private final ProtocolConfigMapper protocolMapper; - //** 1、首字母匹配前导码, // 2、以匹配出的前导码是否在报文中条件进行前导码的匹配二次筛选 - public List matchLeadingCode(String protocolContent){ + public static List matchFrameLeadingCode(String protocolContent){ List initialConfigs = initialMatch(protocolContent); List preCodeConfigs = initialConfigs.stream() .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) @@ -26,13 +19,16 @@ } //初始化匹配前导码内容 - private List initialMatch(String protocolContent) { - String protocolStr = protocolContent.charAt(0) + ""; - QueryWrapper queryWrapper = new QueryWrapper() - .likeRight("pre_fix", protocolStr); - List protocolConfigList = protocolMapper.selectList(queryWrapper); - return protocolConfigList; + private static List initialMatch(String protocolContent) { + String firstFrameChar = protocolContent.charAt(0) + ""; + ProtocolConfigProvider protocolConfigProvider=new ProtocolConfigProvider(firstFrameChar); + return protocolConfigProvider.getMatchList(); } + + + + + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index cf2113d..e915877 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -1,32 +1,35 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(0) -@Service +@Component public class FrameLengthMatcher implements FrameStructMatcher { - @Autowired - private FieldParser fieldParser; - //超过长度 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { String dataGramContent = ByteBufUtil.hexDump(byteBuf); - if (StringUtils.isEmpty(protocolConfig.getUnpackId()) && StringUtils.isEmpty(protocolConfig.getTailStr())) { - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + //当不存在结尾标志和拆包标志,可以直接使用长度进行匹配 + if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { if (dataGramContent.length() >= totalLength) {//等于长度返回true,超出长度,切断 - ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, protocolConfig, totalLength); + ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, totalLength); return wholeDatagramByte; } else { //读的标志位前移舍弃 @@ -38,7 +41,7 @@ return null; } - private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, Integer totalLength) { byteBuf.readBytes(totalLength); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, totalLength - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 2bfc213..d527ad0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; @@ -13,7 +13,7 @@ import lombok.AllArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.nio.charset.Charset; import java.util.Map; @@ -22,32 +22,30 @@ * 后续标志验证 */ @Order(1) -@Service +@Component @AllArgsConstructor -public class FrameMarkMatcher implements FrameStructMatcher { - - private final FieldConfigDao fieldConfigDao; - private final FieldParser fieldParser; - private final FieldResolver fieldResolverManger; +public class FrameMarkMatcher implements FrameStructMatcher, FixedPropertyEnum { //帧后续标志=>结束,进行帧的重组=>有后续,1、帧移位判别 2、继续接收帧 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig UnpackConfig = StringUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getUnpackId()); - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); - Integer upback = 0; + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); ByteBuf mergeWholeFrameByte = null; - if (!ObjectUtil.isEmpty(UnpackConfig)) { - while (hasNextFullFrame(byteBuf, protocolConfig)) { - upback = (Integer) fieldResolverManger.filedParserManger(byteBuf, UnpackConfig, null); + if (!ObjectUtil.isEmpty(unpackFlag)) { + while (hasNextFullFrame(byteBuf, protocolConfig, protocolFieldConfigProvider)) { //是否存在后续位 - if (upback == 1) {//使用esayRule + if (unpackFlag == 1) {//使用esayRule //表示可以截取 - mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolConfig, totalLength); + mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolFieldConfigProvider, protocolConfig); return mergeWholeFrameByte; } else { - byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig)); + byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig, protocolFieldConfigProvider)); } } } @@ -56,7 +54,8 @@ //选取第一个帧,将业务内容和后面部分分开 //计算数据报文-业务内容 - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolFieldConfigProvider protocolFieldConfigProvider, ProtocolConfig protocolConfig) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); //截取完整报文 byteBuf.readBytes(totalLength); ByteBuf byteBufContent = byteBuf.slice(0, byteBuf.readerIndex()); @@ -68,15 +67,15 @@ String tail = ""; System.out.println(ByteBufUtil.hexDump(byteBufContent)); //会存在多个帧拼接在一起的的情况,进行合并处理 - while (hasNextFullFrame(byteBufContent, protocolConfig)) { - Integer currentFrameLength = fieldParser.getTotalLength(protocolConfig, byteBufContent); + while (hasNextFullFrame(byteBufContent, protocolConfig, protocolFieldConfigProvider)) { + Integer currentFrameLength = protocolFieldConfigProvider.getTotalLength(byteBufContent, protocolConfig); byteBufContent.readBytes(currentFrameLength); ByteBuf currentbyteBuf = byteBufContent.slice(0, byteBufContent.readerIndex()); byteBufContent.markReaderIndex();//读的标志位前移 System.out.println(ByteBufUtil.hexDump(byteBufContent)); String hexDump = currentbyteBuf.toString(Charset.forName("ISO-8859-1")); //获取当前固定帧结构的关系map - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, currentbyteBuf); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(currentbyteBuf, protocolConfig); if (StringUtils.isEmpty(mergeFrameStr)) { //首次获取业务数据报文 mergeFrameStr += hexDump.substring(0, currentFrameFixedProperty.get("tailPosition")); @@ -95,22 +94,22 @@ /** * 获取平移到下一帧起始位置 */ - public int getNextFrameOffset(ByteBuf buffer, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, buffer); - return currentFrameFixedProperty.get("totalLength"); + public int getNextFrameOffset(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + return currentFrameFixedProperty.get(TOTAL_LENGTH); } /** * 判断是否出错进行整个帧的 */ - public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, byteBuf); + public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); //保证读取位置不在固定位置,是可变的业务内容 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("fixedPosition")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(FIXED_POSITION)) { return false; } //判断读取是否操作帧长度 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("totalLength")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(TOTAL_LENGTH)) { return false; } return true; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 76a3784..c3a1bab 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -1,50 +1,50 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.parser.instance.GeneralProcessor; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; +import io.netty.buffer.ByteBufUtil;; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(2) -@Service +@Component public class FrameTailMatcher implements FrameStructMatcher { - @Resource - private FieldConfigDao fieldConfigDao; - @Autowired - private GeneralProcessor generalProcessor; - //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig tailFieldConfig = StringUtils.isEmpty(protocolConfig.getTailStr()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getTailStr()); - if (!ObjectUtil.isEmpty(tailFieldConfig)) { - String tailStr = tailFieldConfig.getFieldName(); + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfig protocolFieldConfig = ObjectUtils.isEmpty(protocolConfig.getTailStr()) ? null : + fieldConfigProvider.getFieldConfigById(protocolConfig.getTailStr()); + if (!ObjectUtil.isEmpty(protocolFieldConfig)) { + String tailStr = protocolFieldConfig.getFieldName(); String dataGramContent = ByteBufUtil.hexDump(byteBuf); Boolean tailFlag = ByteBufUtil.hexDump(byteBuf).contains(tailStr); if (!tailFlag) { //使用esayRule return null; } else if (dataGramContent.indexOf(tailStr) < dataGramContent.length() - tailStr.length()) { Integer length = dataGramContent.indexOf(tailStr) + tailStr.length(); - ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, protocolConfig, length); + ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, length); return wholeDatagramByte; //存在粘包 } } return null; } - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer length) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, Integer length) { byteBuf.readBytes(length); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, length - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java new file mode 100644 index 0000000..5f1c177 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java @@ -0,0 +1,73 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.combined.GenericCombinedFieldResolver; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.CombinedFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class CombinedFieldConfigProvider { + + + /** + * 作为临时配置列表缓存使用 + */ + private final List combinedFieldConfigList; + private Map storeObjectMap = new HashMap<>(); + + public CombinedFieldConfigProvider(Long ruleId) { + CombinedFieldConfigRegistry combinedFieldConfigRegistry = SpringContextUtil.getBean(CombinedFieldConfigRegistry.class); + combinedFieldConfigList = combinedFieldConfigRegistry.getCombinedFieldConfigList(ruleId); + } + + public void parseDataField(RuleConfig ruleConfig, String clearZeroPlain,Map fieldConfigsMap ) { + if (showSkip()) { + return; + } + //匹配对应的数据,然后进行相关的字段解析 + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver(); + combinedFieldResolver.parseDataField(combinedFieldConfigList, byteBuf, storeObjectMap,fieldConfigsMap); + } + + + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getCombinedFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return combinedFieldConfigList.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public List getCombinedFieldConfigList() { + return combinedFieldConfigList; + } + + /* 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(combinedFieldConfigList) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java new file mode 100644 index 0000000..f3cfedc --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java @@ -0,0 +1,11 @@ +package com.casic.missiles.parser.provider; + +/** + * @author cz + * @date 2023-6-12 + */ +public class CommandEventProvider{ + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java new file mode 100644 index 0000000..70eec5e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java @@ -0,0 +1,77 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.safe.SafeStrategy; +import com.casic.missiles.parser.sender.DataSubscribeProvider; +import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class DatagramEventProvider { + + private final DatagramEventConfig processorInstance; + + public DatagramEventProvider(Long ruleId) { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + List datagramEventConfigList = + datagramEventRegistry.getDatagramEventList(ruleId); + processorInstance = this.getProcessorInstance(datagramEventConfigList); + } + + public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { + if (showSkip()) { + return null; + } + return datagramEventConfigList.get(0); + } + + // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 + public String getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap) { + String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? + processorInstance.getSafeBean() : + fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); + if (!StringUtils.isEmpty(safeName)) { + //需要加密 + SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); + String plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); + return clearComplementZero(plain); + } + return ByteBufUtil.hexDump(bizDataContent); + } + + //解密清零操作 + private String clearComplementZero(String plain) { + plain = plain.substring(0, plain.lastIndexOf("00")); + return plain; + } + + //数据发送,数据发送者暂未构建 + public void storeData(Map bizDataMap) { + DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); +// dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return ObjectUtils.isNotEmpty(processorInstance) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java new file mode 100644 index 0000000..7e1fe0a --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java @@ -0,0 +1,97 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.FieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class FieldConfigProvider { + + + private final List fieldConfigs; + private Map storeObjectMap = new HashMap<>(); +// private Map singleObjects = new ConcurrentHashMap<>(); + + public FieldConfigProvider(Long ruleId) { + FieldConfigRegistry fieldConfigRegistry = SpringContextUtil.getBean(FieldConfigRegistry.class); + fieldConfigs = fieldConfigRegistry.getFieldConfigList(ruleId); + } + + public List getFieldConfigs() { + return fieldConfigs; + } + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public Map parseDataField(RuleConfig ruleConfig, String clearZeroPlain) { + if (showSkip()) { + return null; + } + List prepareFieldConfig = prepareParseField(ruleConfig); + if (CollectionUtils.isNotEmpty(prepareFieldConfig)) { + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(fieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + return fixDataMap; + } + } + return null; + } + + /** + * 得到需要处理的业务内容 + * + * @return + */ + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return fieldConfigs.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public Map getFieldConfigsMap() { + return fieldConfigs.stream().collect( + Collectors.toMap(FieldConfig::getId, e -> e) + ); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(fieldConfigs) ? false : true; + } + + +} + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java new file mode 100644 index 0000000..817bfaf --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java @@ -0,0 +1,19 @@ +package com.casic.missiles.parser.provider; + +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.registry.FieldRuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; + +public class FieldRuleConfigProvider { + + private final List fieldRuleConfigList; + + public FieldRuleConfigProvider(Long ruleId) { + FieldRuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(FieldRuleConfigRegistry.class); + fieldRuleConfigList = ruleConfigRegistry.getFieldRuleConfigList(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java index 608af3a..32cc8a4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java @@ -2,48 +2,47 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.delivery.decorator.ByteDecorator; +import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @AllArgsConstructor public class FieldDecoratorManger { - private final RuleDictDao ruleDictDao; + private final RuleConfigRegistry ruleDictDao; // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 // (1)静态的业务字段是字典里面可以配置的 // (2)动态的业务字段是通过规则生成的 public String contentMerge(String ruleJson, String sceneConent, String dynamicContent) { - List ruleDictList = ruleDictDao.getRuleDictConfig(); - Map ruleDictMap = ruleDictList.stream().collect( - Collectors.toMap(RuleDict::getId, e -> e)); - List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); - for (Map ruleMap : ruleMapList) { - String ruleType = String.valueOf(ruleMap.get("ruleType")); - ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); - NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); - byteDecorator.nodeDecoratorRule(nodeDecoratorParm); - } +// List ruleDictList = ruleDictDao.getRuleDictConfig(); +// Map ruleDictMap = ruleDictList.stream().collect( +// Collectors.toMap(RuleDict::getId, e -> e)); +// List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); +// for (Map ruleMap : ruleMapList) { +// String ruleType = String.valueOf(ruleMap.get("ruleType")); +// ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); +// NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); +// byteDecorator.nodeDecoratorRule(nodeDecoratorParm); +// } return null; } - - private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { - NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() - .contents(sceneConent) - .dynamicContent(dynamicContent) - .ruletypeId(ruletypeId) - .ruleDictMap(ruleDictMap) - .build(); - return nodeDecoratorParm; - } +// +// private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { +// NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() +// .contents(sceneConent) +// .dynamicContent(dynamicContent) +// .ruletypeId(ruletypeId) +// .ruleDictMap(ruleDictMap) +// .build(); +// return nodeDecoratorParm; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java index 652970c..b204ac3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java @@ -1,56 +1,56 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@AllArgsConstructor -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", - JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Component; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Component("logicalDecorator") +//@AllArgsConstructor +//@Slf4j +//public class LogicalShiftDecorator implements ByteDecorator { +// +//// private final FieldRuleEngineMapper fieldRuleEngineMapper; +//// +//// //字节位移 +//// @Override +//// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +//// String logicalValue = ""; +//// RuleEvaluator fieldRuleEngine = new RuleEvaluator(); +//// try { +//// Map env2 = new HashMap(); +//// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +//// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +//// for (String contentId : contentIdList) { +//// RuleDict ruleDict = ruleDictMap.get(contentId); +//// if (ruleDict.getCode().contains("#")) { +//// //使用动态的值 +//// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +//// } +//// env2.put(ruleDict.getName(), ruleDict.getCode()); +//// } +//// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +//// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +//// return null; +//// } +//// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +//// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +//// return values; +//// } catch (Exception ex) { +//// log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", +//// JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +//// return null; +//// } +//// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java index 346468f..822fead 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@AllArgsConstructor -@Slf4j -public class OperationDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("optionDecorator") +//@AllArgsConstructor +//@Slf4j +//public class OperationDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //混合运算,有常量或者乘除的缩放 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java index 50fb0a7..7a8bccb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@AllArgsConstructor -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +////精度计算 +//@AllArgsConstructor +//@Registry("precisionDecorator") +//@Slf4j +//public class PrecisionDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java index da39235..27f9cc7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java @@ -1,54 +1,53 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@AllArgsConstructor -@Slf4j -public class RuleDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("ruleDecorator") +//@AllArgsConstructor +//@Slf4j +//public class RuleDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //吃我一套正则表达式 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (Exception ex) { +// log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java index 7f5cbf3..c043f97 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java @@ -2,6 +2,6 @@ import java.util.Map; -public interface ComandeEventService { +public interface ComandeEventService{ Map loadComandeEventConfig(String protocolId,String scene); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java index 476ad84..aaf1837 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java @@ -2,46 +2,46 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.dao.CommandEventDao; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @Slf4j @AllArgsConstructor -public class ComandeEventServiceImpl implements ComandeEventService { +public class ComandeEventServiceImpl implements ComandeEventRegistry { - private final CommandEventDao commandEventDao; + // private final CommandEventDao commandEventDao; // 加密bean 固定字段出现变化的字段解析,业务字段的有序内容 @Override - public Map loadComandeEventConfig(String protocolId,String sceneName) { - CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); - if (ObjectUtil.isEmpty(commandEventConfig)) { - log.error("协议{},没有配置成功接收回复配置,清排查原因"); - return null; - } - String replyJson = commandEventConfig.getReplyContentJson(); - List> replyMapList = JSONArray.parseObject(replyJson, List.class); - List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); - Map fixMap = fixList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); - List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) - .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) - .collect(Collectors.toList()); - Map commandConfigMap = new HashMap<>(); - commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); - commandConfigMap.put("fixContent", fixMap); - commandConfigMap.put("bizContent", contentList); - return commandConfigMap; + public Map loadComandeEventConfig(String protocolId, String sceneName) { +// CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); +// if (ObjectUtil.isEmpty(commandEventConfig)) { +// log.error("协议{},没有配置成功接收回复配置,清排查原因"); +// return null; +// } +// String replyJson = commandEventConfig.getReplyContentJson(); +// List> replyMapList = JSONArray.parseObject(replyJson, List.class); +// List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); +// Map fixMap = fixList.stream() +// .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); +// List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) +// .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) +// .collect(Collectors.toList()); +// Map commandConfigMap = new HashMap<>(); +// commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); +// commandConfigMap.put("fixContent", fixMap); +// commandConfigMap.put("bizContent", contentList); +// return commandConfigMap; + return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 128b09d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java deleted file mode 100644 index 4016b0b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface DatagramEventMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java deleted file mode 100644 index 597c306..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.apache.ibatis.annotations.Mapper; - -public interface FieldConfigMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java deleted file mode 100644 index a31680a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.PreRuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface PreRuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java deleted file mode 100644 index 9060a69..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface ProtocolConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java deleted file mode 100644 index 6fa6936..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java deleted file mode 100644 index 582a705..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleDict; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleDictMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java deleted file mode 100644 index 6e302c8..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.CommandEventMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Optional; - -@Component -public class CommandEventDao { - - @Resource - private CommandEventMapper commandEventMapper; - - public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId) - .eq("scene", sceneName) - .eq("enabled", 1); - List commandEventConfig = commandEventMapper.selectList(queryWrapper); - Optional optionalEventConfig = commandEventConfig.stream().findFirst(); - return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java deleted file mode 100644 index 9137e4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.FieldConfigMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class FieldConfigDao { - - @Resource - private FieldConfigMapper fieldConfigMapper; - - public FieldConfig getFieldConfigById(String fieldId) { - FieldConfig fieldConfig = fieldConfigMapper.selectById(fieldId); - return fieldConfig; - } - - public List getFieldConfigs(String protocolId,Integer isFixed) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",isFixed); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - - public List getStorageFieldConfig(String protocolId) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",1) - .eq("is_storage",1); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java deleted file mode 100644 index 67bff6b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.mapper.PreRuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class PreRuleConfigDao { - - @Resource - private PreRuleConfigMapper preRuleConfigMapper; - - public List getPreRuleList(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return preRuleConfigMapper.selectList(queryWrapper); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java deleted file mode 100644 index d69ea85..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.RuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleConfigDao { - - @Resource - private RuleConfigMapper ruleConfigMapper; - - public RuleConfig getNextRuleConfig(String ruleFields) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("parse_rule_json", ruleFields); - return ruleConfigMapper.selectOne(queryWrapper); - } - - - public List getRuleConfigById(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return ruleConfigMapper.selectList(queryWrapper); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java deleted file mode 100644 index 932c185..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.RuleDictMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleDictDao { - - @Resource - private RuleDictMapper ruleDictMapper; - - public List getRuleDictConfig() { - List ruleDictList = ruleDictMapper.selectList(null); - return ruleDictList; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java index 9f9e279..43bc4d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java @@ -10,20 +10,15 @@ import io.netty.channel.socket.nio.NioServerSocketChannel; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import javax.annotation.PreDestroy; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static cn.hutool.core.util.ClassUtil.getClasses; /** * SensorhubServer netty服务端 */ @Slf4j -@Service +@Component public class SensorhubServer { /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java index 2c79ff5..9a28c36 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java @@ -11,13 +11,13 @@ import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioSocketChannel; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClient 客户端 */ @Slf4j -@Service +@Registry public final class SensorhubClient { public static void main(String[] args) throws Exception { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java index 9774be0..477c3f7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java @@ -6,12 +6,12 @@ import io.netty.channel.socket.SocketChannel; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientChannelInitialHandler */ -@Service +@Registry public class SensorhubClientChannelInitialHandler extends ChannelInitializer { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java index 346f4b3..73560e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java @@ -5,13 +5,13 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientHandler */ @Slf4j -@Service +@Registry public class SensorhubClientHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java index 5c1c6f2..d990af5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java @@ -4,12 +4,12 @@ import com.casic.missiles.pojo.Msg; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** * SensorhubServerHandler */ -@Service +@Component public class SensorhubServerHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 67283ae..af3172c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,41 +1,37 @@ package com.casic.missiles.parser; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultProtocolConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.*; +import com.casic.missiles.registry.FieldConfigRegistry; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; -import java.nio.charset.Charset; import java.util.HashMap; import java.util.List; import java.util.Map; -@Service("genericProtocolParser") +/** + * @author + */ +@Component("genericProtocolParser") @Slf4j -@AllArgsConstructor +@RequiredArgsConstructor public class GenericProtocolParser implements ProtocolParser { - private final LeadingCodeMatcher leadingCodeMatcher; private final List frameStructDispenserList; - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorInstanceSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; // 匹配首字母前导码=> 帧结构匹配前导码=> // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 @@ -44,18 +40,19 @@ public Boolean doParseProtocol(ByteBuf byteBuf) { String protocolContent = ByteBufUtil.hexDump(byteBuf); //匹配前导码 - List preCodeConfigs = leadingCodeMatcher.matchLeadingCode(protocolContent); + List preCodeConfigs = LeadingCodeMatcher.matchFrameLeadingCode(protocolContent); //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 if (preCodeConfigs.size() == 0) { - return rematch(byteBuf,protocolContent); + return rematch(byteBuf, protocolContent); } - //暂时先取第一个 + //暂时先取第一个,提升速度,使用享元模式, 减少类的创建销毁与构建 ProtocolConfig protocolConfig = preCodeConfigs.get(0); + AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); ByteBuf wholeDatagramByte = null; //通过匹配帧结构获取完整的数据包 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, preCodeConfigs.get(0))) != null) { + if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, protocolFactory)) != null) { break; } } @@ -68,76 +65,78 @@ * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 */ - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId, wholeDatagramByte); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap, protocolId); - //选取规则对应的流程实例 - DatagramEventConfig datagramEventConfig = processorInstanceSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); + //进行规则字段解析,进行匹配规则 + RuleConfig ruleConfig = getRuleConfig(protocolFactory, wholeDatagramByte); + if (ruleConfig == null) { + return false; + } //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, wholeDatagramByte); + ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte); + //以下进行业务的规则解析,同时选定流程实例 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); + DatagramEventProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain, + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText, protocolId); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain); //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); + datagramEventProvider.storeData(bizDataMap); return true; } - private Boolean rematch(ByteBuf byteBuf,String protocolContent) { + /** + * 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 + */ + private Boolean rematch(ByteBuf byteBuf, String protocolContent) { //重置位判断 byteBuf.resetReaderIndex(); //判断重置是否前移,如果没有前移,则直接判为匹配失败 if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { return false; } else { + //递归执行 return doParseProtocol(byteBuf); } } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; + //获取匹配规则->匹配规则 + private RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + //取出其中参与逻辑provider并判空 + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); + String rulePrepareFields = protocolConfig.getRulePrepareFields(); + //固定字段 + if (StringUtils.isNotEmpty(rulePrepareFields)) { + //获取统一固定字段解析 + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + //获取该协议的字段配置,用于协议规则匹配 + List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); + //获取规则 + RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, + rulePrepareFields, protocolFieldConfigs); + return ruleConfig; + } + return null; } - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + //数据构建,获取固定字段的store和业务字段store + private Map buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + Map bizDataMap = new HashMap<>(); + Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); + Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); + bizDataMap.putAll(ruleStoreObjectMap); + bizDataMap.putAll(protocolStoreObjectMap); return bizDataMap; } - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java index 8a46e32..16ce2e5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java @@ -3,6 +3,7 @@ import io.netty.buffer.ByteBuf; public interface ProtocolParser { + Boolean doParseProtocol(ByteBuf byteBuf); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java new file mode 100644 index 0000000..f7814af --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java @@ -0,0 +1,35 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.ProtocolConfigProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.ProtocolConfig; + +/** + * 存放基本协议的的加载信息 + */ +public class AbstractProtocolConfigFactory { + private final ProtocolConfigProvider protocolConfigProvider; + private final ProtocolFieldConfigProvider protocolFieldConfigProvider; + private final RuleConfigProvider ruleConfigProvider; + + public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { + this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); + this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); + this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); + } + + public ProtocolConfigProvider getProtocolConfigProvider() { + return protocolConfigProvider; + } + + public ProtocolFieldConfigProvider getProtocolFieldConfigProvider() { + return protocolFieldConfigProvider; + } + + public RuleConfigProvider getRuleConfigProvider() { + return ruleConfigProvider; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java new file mode 100644 index 0000000..6e36147 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java @@ -0,0 +1,57 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.CombinedFieldConfigProvider; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.FieldConfigProvider; +import com.casic.missiles.parser.provider.FieldRuleConfigProvider; + +/** + * 存放规则相关的的的加载信息 + */ +public class AbstractRuleConfigFactory { + + /** + * 处理字节 + */ + private final FieldConfigProvider fieldConfigProvider; + /** + * 处理组合字节解析的解码器 + */ + private final CombinedFieldConfigProvider combinedFieldConfigProvider; + /** + * 处理负责字节解析的规则配置 + */ + private final FieldRuleConfigProvider fieldRuleConfigProvider; + /** + * 处理实例流程 + */ + private final DatagramEventProvider datagramEventProvider; + + + public AbstractRuleConfigFactory(Long ruleId) { + this.fieldConfigProvider = new FieldConfigProvider(ruleId); + this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); + this.fieldRuleConfigProvider = new FieldRuleConfigProvider(ruleId); + this.datagramEventProvider = new DatagramEventProvider(ruleId); + } + + public FieldConfigProvider getFieldConfigProvider() { + return fieldConfigProvider; + } + + public CombinedFieldConfigProvider getCombinedFieldConfigProvider() { + return combinedFieldConfigProvider; + } + + public FieldRuleConfigProvider getFieldRuleConfigProvider() { + return fieldRuleConfigProvider; + } + + public DatagramEventProvider getDatagramEventProvider() { + return datagramEventProvider; + } + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java deleted file mode 100644 index 6e1719a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.factory; - - -import com.casic.missiles.pojo.ProtocolConfig; - -import java.util.List; - -/** - * 数据库访问优化(暂时未做) - *

- * 1、初始化协议解析配置,并存放到处存放缓存,对协议基本配置进行管理 - * 2、其中流程中所有的配置都经过此类进行管理,进行调用获取,增强解析速度 - */ -public interface DatagramFactory { - - /** - * 初始化 - */ - List datagramInit(); - - /** - * 根据前导码配置匹配,模糊匹配获取所有的报文项 - */ - List match(); - - /** - * 根据前导码匹配,返回报文项 - */ - List filer(); - - /** - * 保证数据的唯一性选择器 - */ - List selectOne(); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java new file mode 100644 index 0000000..87444a0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java @@ -0,0 +1,18 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +import java.util.List; + +/** + * 直接用,还是边用边创建 + */ +public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { + + + public DefaultProtocolConfigFactory(ProtocolConfig protocolConfig) { + super(protocolConfig); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java new file mode 100644 index 0000000..cce0c7c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java @@ -0,0 +1,12 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; + +public class DefaultRuleFactory extends AbstractRuleConfigFactory { + + public DefaultRuleFactory(Long ruleId) { + super(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java deleted file mode 100644 index 9ee97e0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.casic.missiles.parser.instance; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service -@Slf4j -@AllArgsConstructor -public class GeneralProcessor { - - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; - - /** - * 统一固定字段解析=>进行规则的查询的判断 - * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 - * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 - */ - @Deprecated - public boolean parseWholeDatagram(ByteBuf buffer, ProtocolConfig protocolConfig) { - try { - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap,protocolId); - //选取规则对应的流程= - DatagramEventConfig datagramEventConfig = processorSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); - //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); - //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); - //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); - //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); - //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); - return true; - } catch (Exception ex) { - log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", - ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); - return false; - } - } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; - } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); - } - - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); - return bizDataMap; - } - - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java index 25e7ad8..6a5777e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java @@ -1,23 +1,31 @@ package com.casic.missiles.parser.instance.impl; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.mapper.DatagramEventMapper; import com.casic.missiles.pojo.DatagramEventConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.SpringContextUtil; -@Service -@AllArgsConstructor +import java.util.List; +import java.util.Optional; + +/** + * @author cz + * + */ public class DefaultProcessorInstanceSelector implements ProcessorInstanceSelector { - private final DatagramEventMapper datagramEventMapper; + private static List datagramEventConfigs; + + static { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + datagramEventConfigs = datagramEventRegistry.getDatagramEventList(); + } @Override public DatagramEventConfig getProcessorInstance(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("rule_id", protocolId); - return datagramEventMapper.selectOne(queryWrapper); + Optional optionalSelectInstance = datagramEventConfigs.stream() + .filter(e -> e.getId().equals(protocolId)).limit(1).findFirst(); + return optionalSelectInstance.isPresent() ? optionalSelectInstance.get() : null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a778671..7b56a43 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,16 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import io.netty.buffer.ByteBuf; /** - * 分析匹配情况 - * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 - * 2、匹配不成功,有后续帧,可以进行下次匹配。 - * 3、匹配不成功,无后续帧,可以进行丢弃。 + * 分析匹配情况 + * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 + * 2、匹配不成功,有后续帧,可以进行下次匹配。 + * 3、匹配不成功,无后续帧,可以进行丢弃。 */ -public interface FrameStructMatcher{ +public interface FrameStructMatcher { - ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig); + ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 05320ab..8ebea78 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,23 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.ProtocolConfigMapper; +import com.casic.missiles.parser.provider.ProtocolConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Component; import java.util.List; import java.util.stream.Collectors; -@Component -@AllArgsConstructor public class LeadingCodeMatcher { - private final ProtocolConfigMapper protocolMapper; - //** 1、首字母匹配前导码, // 2、以匹配出的前导码是否在报文中条件进行前导码的匹配二次筛选 - public List matchLeadingCode(String protocolContent){ + public static List matchFrameLeadingCode(String protocolContent){ List initialConfigs = initialMatch(protocolContent); List preCodeConfigs = initialConfigs.stream() .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) @@ -26,13 +19,16 @@ } //初始化匹配前导码内容 - private List initialMatch(String protocolContent) { - String protocolStr = protocolContent.charAt(0) + ""; - QueryWrapper queryWrapper = new QueryWrapper() - .likeRight("pre_fix", protocolStr); - List protocolConfigList = protocolMapper.selectList(queryWrapper); - return protocolConfigList; + private static List initialMatch(String protocolContent) { + String firstFrameChar = protocolContent.charAt(0) + ""; + ProtocolConfigProvider protocolConfigProvider=new ProtocolConfigProvider(firstFrameChar); + return protocolConfigProvider.getMatchList(); } + + + + + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index cf2113d..e915877 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -1,32 +1,35 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(0) -@Service +@Component public class FrameLengthMatcher implements FrameStructMatcher { - @Autowired - private FieldParser fieldParser; - //超过长度 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { String dataGramContent = ByteBufUtil.hexDump(byteBuf); - if (StringUtils.isEmpty(protocolConfig.getUnpackId()) && StringUtils.isEmpty(protocolConfig.getTailStr())) { - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + //当不存在结尾标志和拆包标志,可以直接使用长度进行匹配 + if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { if (dataGramContent.length() >= totalLength) {//等于长度返回true,超出长度,切断 - ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, protocolConfig, totalLength); + ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, totalLength); return wholeDatagramByte; } else { //读的标志位前移舍弃 @@ -38,7 +41,7 @@ return null; } - private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, Integer totalLength) { byteBuf.readBytes(totalLength); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, totalLength - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 2bfc213..d527ad0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; @@ -13,7 +13,7 @@ import lombok.AllArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.nio.charset.Charset; import java.util.Map; @@ -22,32 +22,30 @@ * 后续标志验证 */ @Order(1) -@Service +@Component @AllArgsConstructor -public class FrameMarkMatcher implements FrameStructMatcher { - - private final FieldConfigDao fieldConfigDao; - private final FieldParser fieldParser; - private final FieldResolver fieldResolverManger; +public class FrameMarkMatcher implements FrameStructMatcher, FixedPropertyEnum { //帧后续标志=>结束,进行帧的重组=>有后续,1、帧移位判别 2、继续接收帧 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig UnpackConfig = StringUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getUnpackId()); - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); - Integer upback = 0; + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); ByteBuf mergeWholeFrameByte = null; - if (!ObjectUtil.isEmpty(UnpackConfig)) { - while (hasNextFullFrame(byteBuf, protocolConfig)) { - upback = (Integer) fieldResolverManger.filedParserManger(byteBuf, UnpackConfig, null); + if (!ObjectUtil.isEmpty(unpackFlag)) { + while (hasNextFullFrame(byteBuf, protocolConfig, protocolFieldConfigProvider)) { //是否存在后续位 - if (upback == 1) {//使用esayRule + if (unpackFlag == 1) {//使用esayRule //表示可以截取 - mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolConfig, totalLength); + mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolFieldConfigProvider, protocolConfig); return mergeWholeFrameByte; } else { - byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig)); + byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig, protocolFieldConfigProvider)); } } } @@ -56,7 +54,8 @@ //选取第一个帧,将业务内容和后面部分分开 //计算数据报文-业务内容 - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolFieldConfigProvider protocolFieldConfigProvider, ProtocolConfig protocolConfig) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); //截取完整报文 byteBuf.readBytes(totalLength); ByteBuf byteBufContent = byteBuf.slice(0, byteBuf.readerIndex()); @@ -68,15 +67,15 @@ String tail = ""; System.out.println(ByteBufUtil.hexDump(byteBufContent)); //会存在多个帧拼接在一起的的情况,进行合并处理 - while (hasNextFullFrame(byteBufContent, protocolConfig)) { - Integer currentFrameLength = fieldParser.getTotalLength(protocolConfig, byteBufContent); + while (hasNextFullFrame(byteBufContent, protocolConfig, protocolFieldConfigProvider)) { + Integer currentFrameLength = protocolFieldConfigProvider.getTotalLength(byteBufContent, protocolConfig); byteBufContent.readBytes(currentFrameLength); ByteBuf currentbyteBuf = byteBufContent.slice(0, byteBufContent.readerIndex()); byteBufContent.markReaderIndex();//读的标志位前移 System.out.println(ByteBufUtil.hexDump(byteBufContent)); String hexDump = currentbyteBuf.toString(Charset.forName("ISO-8859-1")); //获取当前固定帧结构的关系map - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, currentbyteBuf); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(currentbyteBuf, protocolConfig); if (StringUtils.isEmpty(mergeFrameStr)) { //首次获取业务数据报文 mergeFrameStr += hexDump.substring(0, currentFrameFixedProperty.get("tailPosition")); @@ -95,22 +94,22 @@ /** * 获取平移到下一帧起始位置 */ - public int getNextFrameOffset(ByteBuf buffer, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, buffer); - return currentFrameFixedProperty.get("totalLength"); + public int getNextFrameOffset(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + return currentFrameFixedProperty.get(TOTAL_LENGTH); } /** * 判断是否出错进行整个帧的 */ - public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, byteBuf); + public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); //保证读取位置不在固定位置,是可变的业务内容 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("fixedPosition")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(FIXED_POSITION)) { return false; } //判断读取是否操作帧长度 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("totalLength")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(TOTAL_LENGTH)) { return false; } return true; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 76a3784..c3a1bab 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -1,50 +1,50 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.parser.instance.GeneralProcessor; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; +import io.netty.buffer.ByteBufUtil;; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(2) -@Service +@Component public class FrameTailMatcher implements FrameStructMatcher { - @Resource - private FieldConfigDao fieldConfigDao; - @Autowired - private GeneralProcessor generalProcessor; - //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig tailFieldConfig = StringUtils.isEmpty(protocolConfig.getTailStr()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getTailStr()); - if (!ObjectUtil.isEmpty(tailFieldConfig)) { - String tailStr = tailFieldConfig.getFieldName(); + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfig protocolFieldConfig = ObjectUtils.isEmpty(protocolConfig.getTailStr()) ? null : + fieldConfigProvider.getFieldConfigById(protocolConfig.getTailStr()); + if (!ObjectUtil.isEmpty(protocolFieldConfig)) { + String tailStr = protocolFieldConfig.getFieldName(); String dataGramContent = ByteBufUtil.hexDump(byteBuf); Boolean tailFlag = ByteBufUtil.hexDump(byteBuf).contains(tailStr); if (!tailFlag) { //使用esayRule return null; } else if (dataGramContent.indexOf(tailStr) < dataGramContent.length() - tailStr.length()) { Integer length = dataGramContent.indexOf(tailStr) + tailStr.length(); - ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, protocolConfig, length); + ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, length); return wholeDatagramByte; //存在粘包 } } return null; } - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer length) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, Integer length) { byteBuf.readBytes(length); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, length - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java new file mode 100644 index 0000000..5f1c177 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java @@ -0,0 +1,73 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.combined.GenericCombinedFieldResolver; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.CombinedFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class CombinedFieldConfigProvider { + + + /** + * 作为临时配置列表缓存使用 + */ + private final List combinedFieldConfigList; + private Map storeObjectMap = new HashMap<>(); + + public CombinedFieldConfigProvider(Long ruleId) { + CombinedFieldConfigRegistry combinedFieldConfigRegistry = SpringContextUtil.getBean(CombinedFieldConfigRegistry.class); + combinedFieldConfigList = combinedFieldConfigRegistry.getCombinedFieldConfigList(ruleId); + } + + public void parseDataField(RuleConfig ruleConfig, String clearZeroPlain,Map fieldConfigsMap ) { + if (showSkip()) { + return; + } + //匹配对应的数据,然后进行相关的字段解析 + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver(); + combinedFieldResolver.parseDataField(combinedFieldConfigList, byteBuf, storeObjectMap,fieldConfigsMap); + } + + + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getCombinedFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return combinedFieldConfigList.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public List getCombinedFieldConfigList() { + return combinedFieldConfigList; + } + + /* 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(combinedFieldConfigList) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java new file mode 100644 index 0000000..f3cfedc --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java @@ -0,0 +1,11 @@ +package com.casic.missiles.parser.provider; + +/** + * @author cz + * @date 2023-6-12 + */ +public class CommandEventProvider{ + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java new file mode 100644 index 0000000..70eec5e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java @@ -0,0 +1,77 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.safe.SafeStrategy; +import com.casic.missiles.parser.sender.DataSubscribeProvider; +import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class DatagramEventProvider { + + private final DatagramEventConfig processorInstance; + + public DatagramEventProvider(Long ruleId) { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + List datagramEventConfigList = + datagramEventRegistry.getDatagramEventList(ruleId); + processorInstance = this.getProcessorInstance(datagramEventConfigList); + } + + public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { + if (showSkip()) { + return null; + } + return datagramEventConfigList.get(0); + } + + // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 + public String getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap) { + String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? + processorInstance.getSafeBean() : + fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); + if (!StringUtils.isEmpty(safeName)) { + //需要加密 + SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); + String plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); + return clearComplementZero(plain); + } + return ByteBufUtil.hexDump(bizDataContent); + } + + //解密清零操作 + private String clearComplementZero(String plain) { + plain = plain.substring(0, plain.lastIndexOf("00")); + return plain; + } + + //数据发送,数据发送者暂未构建 + public void storeData(Map bizDataMap) { + DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); +// dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return ObjectUtils.isNotEmpty(processorInstance) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java new file mode 100644 index 0000000..7e1fe0a --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java @@ -0,0 +1,97 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.FieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class FieldConfigProvider { + + + private final List fieldConfigs; + private Map storeObjectMap = new HashMap<>(); +// private Map singleObjects = new ConcurrentHashMap<>(); + + public FieldConfigProvider(Long ruleId) { + FieldConfigRegistry fieldConfigRegistry = SpringContextUtil.getBean(FieldConfigRegistry.class); + fieldConfigs = fieldConfigRegistry.getFieldConfigList(ruleId); + } + + public List getFieldConfigs() { + return fieldConfigs; + } + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public Map parseDataField(RuleConfig ruleConfig, String clearZeroPlain) { + if (showSkip()) { + return null; + } + List prepareFieldConfig = prepareParseField(ruleConfig); + if (CollectionUtils.isNotEmpty(prepareFieldConfig)) { + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(fieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + return fixDataMap; + } + } + return null; + } + + /** + * 得到需要处理的业务内容 + * + * @return + */ + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return fieldConfigs.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public Map getFieldConfigsMap() { + return fieldConfigs.stream().collect( + Collectors.toMap(FieldConfig::getId, e -> e) + ); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(fieldConfigs) ? false : true; + } + + +} + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java new file mode 100644 index 0000000..817bfaf --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java @@ -0,0 +1,19 @@ +package com.casic.missiles.parser.provider; + +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.registry.FieldRuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; + +public class FieldRuleConfigProvider { + + private final List fieldRuleConfigList; + + public FieldRuleConfigProvider(Long ruleId) { + FieldRuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(FieldRuleConfigRegistry.class); + fieldRuleConfigList = ruleConfigRegistry.getFieldRuleConfigList(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java new file mode 100644 index 0000000..99a1b06 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java @@ -0,0 +1,53 @@ +package com.casic.missiles.parser.provider; + + +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.registry.ProtocolConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolConfigProvider { + + private final List protocolConfigList; + + public ProtocolConfigProvider(String firstChar) { + ProtocolConfigRegistry registry = SpringContextUtil.getBean(ProtocolConfigRegistry.class); + protocolConfigList = registry.getProtocolConfigList(firstChar); + } + + public List getMatchList() { + return protocolConfigList; + } + + /** + * 设置当前协议 + * + * @param protocolConfig + */ + public ProtocolConfigProvider(ProtocolConfig protocolConfig) { + List protocolConfigs = new ArrayList<>(); + protocolConfigs.add(protocolConfig); + protocolConfigList = protocolConfigs; + } + + /** + * 获取当前协议 + * + * @return + */ + public ProtocolConfig getCurrentProtocolConfig() { + if (this.protocolConfigList == null) { + return null; + } else { + return protocolConfigList.get(0); + } + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java index 608af3a..32cc8a4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java @@ -2,48 +2,47 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.delivery.decorator.ByteDecorator; +import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @AllArgsConstructor public class FieldDecoratorManger { - private final RuleDictDao ruleDictDao; + private final RuleConfigRegistry ruleDictDao; // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 // (1)静态的业务字段是字典里面可以配置的 // (2)动态的业务字段是通过规则生成的 public String contentMerge(String ruleJson, String sceneConent, String dynamicContent) { - List ruleDictList = ruleDictDao.getRuleDictConfig(); - Map ruleDictMap = ruleDictList.stream().collect( - Collectors.toMap(RuleDict::getId, e -> e)); - List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); - for (Map ruleMap : ruleMapList) { - String ruleType = String.valueOf(ruleMap.get("ruleType")); - ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); - NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); - byteDecorator.nodeDecoratorRule(nodeDecoratorParm); - } +// List ruleDictList = ruleDictDao.getRuleDictConfig(); +// Map ruleDictMap = ruleDictList.stream().collect( +// Collectors.toMap(RuleDict::getId, e -> e)); +// List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); +// for (Map ruleMap : ruleMapList) { +// String ruleType = String.valueOf(ruleMap.get("ruleType")); +// ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); +// NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); +// byteDecorator.nodeDecoratorRule(nodeDecoratorParm); +// } return null; } - - private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { - NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() - .contents(sceneConent) - .dynamicContent(dynamicContent) - .ruletypeId(ruletypeId) - .ruleDictMap(ruleDictMap) - .build(); - return nodeDecoratorParm; - } +// +// private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { +// NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() +// .contents(sceneConent) +// .dynamicContent(dynamicContent) +// .ruletypeId(ruletypeId) +// .ruleDictMap(ruleDictMap) +// .build(); +// return nodeDecoratorParm; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java index 652970c..b204ac3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java @@ -1,56 +1,56 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@AllArgsConstructor -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", - JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Component; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Component("logicalDecorator") +//@AllArgsConstructor +//@Slf4j +//public class LogicalShiftDecorator implements ByteDecorator { +// +//// private final FieldRuleEngineMapper fieldRuleEngineMapper; +//// +//// //字节位移 +//// @Override +//// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +//// String logicalValue = ""; +//// RuleEvaluator fieldRuleEngine = new RuleEvaluator(); +//// try { +//// Map env2 = new HashMap(); +//// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +//// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +//// for (String contentId : contentIdList) { +//// RuleDict ruleDict = ruleDictMap.get(contentId); +//// if (ruleDict.getCode().contains("#")) { +//// //使用动态的值 +//// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +//// } +//// env2.put(ruleDict.getName(), ruleDict.getCode()); +//// } +//// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +//// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +//// return null; +//// } +//// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +//// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +//// return values; +//// } catch (Exception ex) { +//// log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", +//// JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +//// return null; +//// } +//// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java index 346468f..822fead 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@AllArgsConstructor -@Slf4j -public class OperationDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("optionDecorator") +//@AllArgsConstructor +//@Slf4j +//public class OperationDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //混合运算,有常量或者乘除的缩放 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java index 50fb0a7..7a8bccb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@AllArgsConstructor -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +////精度计算 +//@AllArgsConstructor +//@Registry("precisionDecorator") +//@Slf4j +//public class PrecisionDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java index da39235..27f9cc7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java @@ -1,54 +1,53 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@AllArgsConstructor -@Slf4j -public class RuleDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("ruleDecorator") +//@AllArgsConstructor +//@Slf4j +//public class RuleDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //吃我一套正则表达式 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (Exception ex) { +// log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java index 7f5cbf3..c043f97 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java @@ -2,6 +2,6 @@ import java.util.Map; -public interface ComandeEventService { +public interface ComandeEventService{ Map loadComandeEventConfig(String protocolId,String scene); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java index 476ad84..aaf1837 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java @@ -2,46 +2,46 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.dao.CommandEventDao; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @Slf4j @AllArgsConstructor -public class ComandeEventServiceImpl implements ComandeEventService { +public class ComandeEventServiceImpl implements ComandeEventRegistry { - private final CommandEventDao commandEventDao; + // private final CommandEventDao commandEventDao; // 加密bean 固定字段出现变化的字段解析,业务字段的有序内容 @Override - public Map loadComandeEventConfig(String protocolId,String sceneName) { - CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); - if (ObjectUtil.isEmpty(commandEventConfig)) { - log.error("协议{},没有配置成功接收回复配置,清排查原因"); - return null; - } - String replyJson = commandEventConfig.getReplyContentJson(); - List> replyMapList = JSONArray.parseObject(replyJson, List.class); - List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); - Map fixMap = fixList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); - List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) - .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) - .collect(Collectors.toList()); - Map commandConfigMap = new HashMap<>(); - commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); - commandConfigMap.put("fixContent", fixMap); - commandConfigMap.put("bizContent", contentList); - return commandConfigMap; + public Map loadComandeEventConfig(String protocolId, String sceneName) { +// CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); +// if (ObjectUtil.isEmpty(commandEventConfig)) { +// log.error("协议{},没有配置成功接收回复配置,清排查原因"); +// return null; +// } +// String replyJson = commandEventConfig.getReplyContentJson(); +// List> replyMapList = JSONArray.parseObject(replyJson, List.class); +// List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); +// Map fixMap = fixList.stream() +// .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); +// List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) +// .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) +// .collect(Collectors.toList()); +// Map commandConfigMap = new HashMap<>(); +// commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); +// commandConfigMap.put("fixContent", fixMap); +// commandConfigMap.put("bizContent", contentList); +// return commandConfigMap; + return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 128b09d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java deleted file mode 100644 index 4016b0b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface DatagramEventMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java deleted file mode 100644 index 597c306..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.apache.ibatis.annotations.Mapper; - -public interface FieldConfigMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java deleted file mode 100644 index a31680a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.PreRuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface PreRuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java deleted file mode 100644 index 9060a69..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface ProtocolConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java deleted file mode 100644 index 6fa6936..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java deleted file mode 100644 index 582a705..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleDict; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleDictMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java deleted file mode 100644 index 6e302c8..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.CommandEventMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Optional; - -@Component -public class CommandEventDao { - - @Resource - private CommandEventMapper commandEventMapper; - - public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId) - .eq("scene", sceneName) - .eq("enabled", 1); - List commandEventConfig = commandEventMapper.selectList(queryWrapper); - Optional optionalEventConfig = commandEventConfig.stream().findFirst(); - return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java deleted file mode 100644 index 9137e4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.FieldConfigMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class FieldConfigDao { - - @Resource - private FieldConfigMapper fieldConfigMapper; - - public FieldConfig getFieldConfigById(String fieldId) { - FieldConfig fieldConfig = fieldConfigMapper.selectById(fieldId); - return fieldConfig; - } - - public List getFieldConfigs(String protocolId,Integer isFixed) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",isFixed); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - - public List getStorageFieldConfig(String protocolId) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",1) - .eq("is_storage",1); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java deleted file mode 100644 index 67bff6b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.mapper.PreRuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class PreRuleConfigDao { - - @Resource - private PreRuleConfigMapper preRuleConfigMapper; - - public List getPreRuleList(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return preRuleConfigMapper.selectList(queryWrapper); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java deleted file mode 100644 index d69ea85..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.RuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleConfigDao { - - @Resource - private RuleConfigMapper ruleConfigMapper; - - public RuleConfig getNextRuleConfig(String ruleFields) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("parse_rule_json", ruleFields); - return ruleConfigMapper.selectOne(queryWrapper); - } - - - public List getRuleConfigById(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return ruleConfigMapper.selectList(queryWrapper); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java deleted file mode 100644 index 932c185..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.RuleDictMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleDictDao { - - @Resource - private RuleDictMapper ruleDictMapper; - - public List getRuleDictConfig() { - List ruleDictList = ruleDictMapper.selectList(null); - return ruleDictList; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java index 9f9e279..43bc4d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java @@ -10,20 +10,15 @@ import io.netty.channel.socket.nio.NioServerSocketChannel; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import javax.annotation.PreDestroy; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static cn.hutool.core.util.ClassUtil.getClasses; /** * SensorhubServer netty服务端 */ @Slf4j -@Service +@Component public class SensorhubServer { /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java index 2c79ff5..9a28c36 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java @@ -11,13 +11,13 @@ import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioSocketChannel; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClient 客户端 */ @Slf4j -@Service +@Registry public final class SensorhubClient { public static void main(String[] args) throws Exception { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java index 9774be0..477c3f7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java @@ -6,12 +6,12 @@ import io.netty.channel.socket.SocketChannel; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientChannelInitialHandler */ -@Service +@Registry public class SensorhubClientChannelInitialHandler extends ChannelInitializer { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java index 346f4b3..73560e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java @@ -5,13 +5,13 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientHandler */ @Slf4j -@Service +@Registry public class SensorhubClientHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java index 5c1c6f2..d990af5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java @@ -4,12 +4,12 @@ import com.casic.missiles.pojo.Msg; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** * SensorhubServerHandler */ -@Service +@Component public class SensorhubServerHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 67283ae..af3172c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,41 +1,37 @@ package com.casic.missiles.parser; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultProtocolConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.*; +import com.casic.missiles.registry.FieldConfigRegistry; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; -import java.nio.charset.Charset; import java.util.HashMap; import java.util.List; import java.util.Map; -@Service("genericProtocolParser") +/** + * @author + */ +@Component("genericProtocolParser") @Slf4j -@AllArgsConstructor +@RequiredArgsConstructor public class GenericProtocolParser implements ProtocolParser { - private final LeadingCodeMatcher leadingCodeMatcher; private final List frameStructDispenserList; - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorInstanceSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; // 匹配首字母前导码=> 帧结构匹配前导码=> // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 @@ -44,18 +40,19 @@ public Boolean doParseProtocol(ByteBuf byteBuf) { String protocolContent = ByteBufUtil.hexDump(byteBuf); //匹配前导码 - List preCodeConfigs = leadingCodeMatcher.matchLeadingCode(protocolContent); + List preCodeConfigs = LeadingCodeMatcher.matchFrameLeadingCode(protocolContent); //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 if (preCodeConfigs.size() == 0) { - return rematch(byteBuf,protocolContent); + return rematch(byteBuf, protocolContent); } - //暂时先取第一个 + //暂时先取第一个,提升速度,使用享元模式, 减少类的创建销毁与构建 ProtocolConfig protocolConfig = preCodeConfigs.get(0); + AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); ByteBuf wholeDatagramByte = null; //通过匹配帧结构获取完整的数据包 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, preCodeConfigs.get(0))) != null) { + if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, protocolFactory)) != null) { break; } } @@ -68,76 +65,78 @@ * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 */ - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId, wholeDatagramByte); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap, protocolId); - //选取规则对应的流程实例 - DatagramEventConfig datagramEventConfig = processorInstanceSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); + //进行规则字段解析,进行匹配规则 + RuleConfig ruleConfig = getRuleConfig(protocolFactory, wholeDatagramByte); + if (ruleConfig == null) { + return false; + } //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, wholeDatagramByte); + ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte); + //以下进行业务的规则解析,同时选定流程实例 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); + DatagramEventProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain, + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText, protocolId); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain); //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); + datagramEventProvider.storeData(bizDataMap); return true; } - private Boolean rematch(ByteBuf byteBuf,String protocolContent) { + /** + * 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 + */ + private Boolean rematch(ByteBuf byteBuf, String protocolContent) { //重置位判断 byteBuf.resetReaderIndex(); //判断重置是否前移,如果没有前移,则直接判为匹配失败 if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { return false; } else { + //递归执行 return doParseProtocol(byteBuf); } } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; + //获取匹配规则->匹配规则 + private RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + //取出其中参与逻辑provider并判空 + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); + String rulePrepareFields = protocolConfig.getRulePrepareFields(); + //固定字段 + if (StringUtils.isNotEmpty(rulePrepareFields)) { + //获取统一固定字段解析 + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + //获取该协议的字段配置,用于协议规则匹配 + List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); + //获取规则 + RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, + rulePrepareFields, protocolFieldConfigs); + return ruleConfig; + } + return null; } - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + //数据构建,获取固定字段的store和业务字段store + private Map buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + Map bizDataMap = new HashMap<>(); + Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); + Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); + bizDataMap.putAll(ruleStoreObjectMap); + bizDataMap.putAll(protocolStoreObjectMap); return bizDataMap; } - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java index 8a46e32..16ce2e5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java @@ -3,6 +3,7 @@ import io.netty.buffer.ByteBuf; public interface ProtocolParser { + Boolean doParseProtocol(ByteBuf byteBuf); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java new file mode 100644 index 0000000..f7814af --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java @@ -0,0 +1,35 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.ProtocolConfigProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.ProtocolConfig; + +/** + * 存放基本协议的的加载信息 + */ +public class AbstractProtocolConfigFactory { + private final ProtocolConfigProvider protocolConfigProvider; + private final ProtocolFieldConfigProvider protocolFieldConfigProvider; + private final RuleConfigProvider ruleConfigProvider; + + public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { + this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); + this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); + this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); + } + + public ProtocolConfigProvider getProtocolConfigProvider() { + return protocolConfigProvider; + } + + public ProtocolFieldConfigProvider getProtocolFieldConfigProvider() { + return protocolFieldConfigProvider; + } + + public RuleConfigProvider getRuleConfigProvider() { + return ruleConfigProvider; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java new file mode 100644 index 0000000..6e36147 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java @@ -0,0 +1,57 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.CombinedFieldConfigProvider; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.FieldConfigProvider; +import com.casic.missiles.parser.provider.FieldRuleConfigProvider; + +/** + * 存放规则相关的的的加载信息 + */ +public class AbstractRuleConfigFactory { + + /** + * 处理字节 + */ + private final FieldConfigProvider fieldConfigProvider; + /** + * 处理组合字节解析的解码器 + */ + private final CombinedFieldConfigProvider combinedFieldConfigProvider; + /** + * 处理负责字节解析的规则配置 + */ + private final FieldRuleConfigProvider fieldRuleConfigProvider; + /** + * 处理实例流程 + */ + private final DatagramEventProvider datagramEventProvider; + + + public AbstractRuleConfigFactory(Long ruleId) { + this.fieldConfigProvider = new FieldConfigProvider(ruleId); + this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); + this.fieldRuleConfigProvider = new FieldRuleConfigProvider(ruleId); + this.datagramEventProvider = new DatagramEventProvider(ruleId); + } + + public FieldConfigProvider getFieldConfigProvider() { + return fieldConfigProvider; + } + + public CombinedFieldConfigProvider getCombinedFieldConfigProvider() { + return combinedFieldConfigProvider; + } + + public FieldRuleConfigProvider getFieldRuleConfigProvider() { + return fieldRuleConfigProvider; + } + + public DatagramEventProvider getDatagramEventProvider() { + return datagramEventProvider; + } + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java deleted file mode 100644 index 6e1719a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.factory; - - -import com.casic.missiles.pojo.ProtocolConfig; - -import java.util.List; - -/** - * 数据库访问优化(暂时未做) - *

- * 1、初始化协议解析配置,并存放到处存放缓存,对协议基本配置进行管理 - * 2、其中流程中所有的配置都经过此类进行管理,进行调用获取,增强解析速度 - */ -public interface DatagramFactory { - - /** - * 初始化 - */ - List datagramInit(); - - /** - * 根据前导码配置匹配,模糊匹配获取所有的报文项 - */ - List match(); - - /** - * 根据前导码匹配,返回报文项 - */ - List filer(); - - /** - * 保证数据的唯一性选择器 - */ - List selectOne(); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java new file mode 100644 index 0000000..87444a0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java @@ -0,0 +1,18 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +import java.util.List; + +/** + * 直接用,还是边用边创建 + */ +public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { + + + public DefaultProtocolConfigFactory(ProtocolConfig protocolConfig) { + super(protocolConfig); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java new file mode 100644 index 0000000..cce0c7c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java @@ -0,0 +1,12 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; + +public class DefaultRuleFactory extends AbstractRuleConfigFactory { + + public DefaultRuleFactory(Long ruleId) { + super(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java deleted file mode 100644 index 9ee97e0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.casic.missiles.parser.instance; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service -@Slf4j -@AllArgsConstructor -public class GeneralProcessor { - - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; - - /** - * 统一固定字段解析=>进行规则的查询的判断 - * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 - * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 - */ - @Deprecated - public boolean parseWholeDatagram(ByteBuf buffer, ProtocolConfig protocolConfig) { - try { - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap,protocolId); - //选取规则对应的流程= - DatagramEventConfig datagramEventConfig = processorSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); - //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); - //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); - //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); - //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); - //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); - return true; - } catch (Exception ex) { - log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", - ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); - return false; - } - } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; - } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); - } - - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); - return bizDataMap; - } - - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java index 25e7ad8..6a5777e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java @@ -1,23 +1,31 @@ package com.casic.missiles.parser.instance.impl; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.mapper.DatagramEventMapper; import com.casic.missiles.pojo.DatagramEventConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.SpringContextUtil; -@Service -@AllArgsConstructor +import java.util.List; +import java.util.Optional; + +/** + * @author cz + * + */ public class DefaultProcessorInstanceSelector implements ProcessorInstanceSelector { - private final DatagramEventMapper datagramEventMapper; + private static List datagramEventConfigs; + + static { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + datagramEventConfigs = datagramEventRegistry.getDatagramEventList(); + } @Override public DatagramEventConfig getProcessorInstance(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("rule_id", protocolId); - return datagramEventMapper.selectOne(queryWrapper); + Optional optionalSelectInstance = datagramEventConfigs.stream() + .filter(e -> e.getId().equals(protocolId)).limit(1).findFirst(); + return optionalSelectInstance.isPresent() ? optionalSelectInstance.get() : null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a778671..7b56a43 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,16 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import io.netty.buffer.ByteBuf; /** - * 分析匹配情况 - * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 - * 2、匹配不成功,有后续帧,可以进行下次匹配。 - * 3、匹配不成功,无后续帧,可以进行丢弃。 + * 分析匹配情况 + * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 + * 2、匹配不成功,有后续帧,可以进行下次匹配。 + * 3、匹配不成功,无后续帧,可以进行丢弃。 */ -public interface FrameStructMatcher{ +public interface FrameStructMatcher { - ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig); + ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 05320ab..8ebea78 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,23 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.ProtocolConfigMapper; +import com.casic.missiles.parser.provider.ProtocolConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Component; import java.util.List; import java.util.stream.Collectors; -@Component -@AllArgsConstructor public class LeadingCodeMatcher { - private final ProtocolConfigMapper protocolMapper; - //** 1、首字母匹配前导码, // 2、以匹配出的前导码是否在报文中条件进行前导码的匹配二次筛选 - public List matchLeadingCode(String protocolContent){ + public static List matchFrameLeadingCode(String protocolContent){ List initialConfigs = initialMatch(protocolContent); List preCodeConfigs = initialConfigs.stream() .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) @@ -26,13 +19,16 @@ } //初始化匹配前导码内容 - private List initialMatch(String protocolContent) { - String protocolStr = protocolContent.charAt(0) + ""; - QueryWrapper queryWrapper = new QueryWrapper() - .likeRight("pre_fix", protocolStr); - List protocolConfigList = protocolMapper.selectList(queryWrapper); - return protocolConfigList; + private static List initialMatch(String protocolContent) { + String firstFrameChar = protocolContent.charAt(0) + ""; + ProtocolConfigProvider protocolConfigProvider=new ProtocolConfigProvider(firstFrameChar); + return protocolConfigProvider.getMatchList(); } + + + + + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index cf2113d..e915877 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -1,32 +1,35 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(0) -@Service +@Component public class FrameLengthMatcher implements FrameStructMatcher { - @Autowired - private FieldParser fieldParser; - //超过长度 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { String dataGramContent = ByteBufUtil.hexDump(byteBuf); - if (StringUtils.isEmpty(protocolConfig.getUnpackId()) && StringUtils.isEmpty(protocolConfig.getTailStr())) { - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + //当不存在结尾标志和拆包标志,可以直接使用长度进行匹配 + if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { if (dataGramContent.length() >= totalLength) {//等于长度返回true,超出长度,切断 - ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, protocolConfig, totalLength); + ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, totalLength); return wholeDatagramByte; } else { //读的标志位前移舍弃 @@ -38,7 +41,7 @@ return null; } - private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, Integer totalLength) { byteBuf.readBytes(totalLength); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, totalLength - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 2bfc213..d527ad0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; @@ -13,7 +13,7 @@ import lombok.AllArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.nio.charset.Charset; import java.util.Map; @@ -22,32 +22,30 @@ * 后续标志验证 */ @Order(1) -@Service +@Component @AllArgsConstructor -public class FrameMarkMatcher implements FrameStructMatcher { - - private final FieldConfigDao fieldConfigDao; - private final FieldParser fieldParser; - private final FieldResolver fieldResolverManger; +public class FrameMarkMatcher implements FrameStructMatcher, FixedPropertyEnum { //帧后续标志=>结束,进行帧的重组=>有后续,1、帧移位判别 2、继续接收帧 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig UnpackConfig = StringUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getUnpackId()); - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); - Integer upback = 0; + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); ByteBuf mergeWholeFrameByte = null; - if (!ObjectUtil.isEmpty(UnpackConfig)) { - while (hasNextFullFrame(byteBuf, protocolConfig)) { - upback = (Integer) fieldResolverManger.filedParserManger(byteBuf, UnpackConfig, null); + if (!ObjectUtil.isEmpty(unpackFlag)) { + while (hasNextFullFrame(byteBuf, protocolConfig, protocolFieldConfigProvider)) { //是否存在后续位 - if (upback == 1) {//使用esayRule + if (unpackFlag == 1) {//使用esayRule //表示可以截取 - mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolConfig, totalLength); + mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolFieldConfigProvider, protocolConfig); return mergeWholeFrameByte; } else { - byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig)); + byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig, protocolFieldConfigProvider)); } } } @@ -56,7 +54,8 @@ //选取第一个帧,将业务内容和后面部分分开 //计算数据报文-业务内容 - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolFieldConfigProvider protocolFieldConfigProvider, ProtocolConfig protocolConfig) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); //截取完整报文 byteBuf.readBytes(totalLength); ByteBuf byteBufContent = byteBuf.slice(0, byteBuf.readerIndex()); @@ -68,15 +67,15 @@ String tail = ""; System.out.println(ByteBufUtil.hexDump(byteBufContent)); //会存在多个帧拼接在一起的的情况,进行合并处理 - while (hasNextFullFrame(byteBufContent, protocolConfig)) { - Integer currentFrameLength = fieldParser.getTotalLength(protocolConfig, byteBufContent); + while (hasNextFullFrame(byteBufContent, protocolConfig, protocolFieldConfigProvider)) { + Integer currentFrameLength = protocolFieldConfigProvider.getTotalLength(byteBufContent, protocolConfig); byteBufContent.readBytes(currentFrameLength); ByteBuf currentbyteBuf = byteBufContent.slice(0, byteBufContent.readerIndex()); byteBufContent.markReaderIndex();//读的标志位前移 System.out.println(ByteBufUtil.hexDump(byteBufContent)); String hexDump = currentbyteBuf.toString(Charset.forName("ISO-8859-1")); //获取当前固定帧结构的关系map - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, currentbyteBuf); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(currentbyteBuf, protocolConfig); if (StringUtils.isEmpty(mergeFrameStr)) { //首次获取业务数据报文 mergeFrameStr += hexDump.substring(0, currentFrameFixedProperty.get("tailPosition")); @@ -95,22 +94,22 @@ /** * 获取平移到下一帧起始位置 */ - public int getNextFrameOffset(ByteBuf buffer, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, buffer); - return currentFrameFixedProperty.get("totalLength"); + public int getNextFrameOffset(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + return currentFrameFixedProperty.get(TOTAL_LENGTH); } /** * 判断是否出错进行整个帧的 */ - public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, byteBuf); + public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); //保证读取位置不在固定位置,是可变的业务内容 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("fixedPosition")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(FIXED_POSITION)) { return false; } //判断读取是否操作帧长度 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("totalLength")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(TOTAL_LENGTH)) { return false; } return true; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 76a3784..c3a1bab 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -1,50 +1,50 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.parser.instance.GeneralProcessor; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; +import io.netty.buffer.ByteBufUtil;; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(2) -@Service +@Component public class FrameTailMatcher implements FrameStructMatcher { - @Resource - private FieldConfigDao fieldConfigDao; - @Autowired - private GeneralProcessor generalProcessor; - //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig tailFieldConfig = StringUtils.isEmpty(protocolConfig.getTailStr()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getTailStr()); - if (!ObjectUtil.isEmpty(tailFieldConfig)) { - String tailStr = tailFieldConfig.getFieldName(); + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfig protocolFieldConfig = ObjectUtils.isEmpty(protocolConfig.getTailStr()) ? null : + fieldConfigProvider.getFieldConfigById(protocolConfig.getTailStr()); + if (!ObjectUtil.isEmpty(protocolFieldConfig)) { + String tailStr = protocolFieldConfig.getFieldName(); String dataGramContent = ByteBufUtil.hexDump(byteBuf); Boolean tailFlag = ByteBufUtil.hexDump(byteBuf).contains(tailStr); if (!tailFlag) { //使用esayRule return null; } else if (dataGramContent.indexOf(tailStr) < dataGramContent.length() - tailStr.length()) { Integer length = dataGramContent.indexOf(tailStr) + tailStr.length(); - ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, protocolConfig, length); + ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, length); return wholeDatagramByte; //存在粘包 } } return null; } - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer length) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, Integer length) { byteBuf.readBytes(length); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, length - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java new file mode 100644 index 0000000..5f1c177 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java @@ -0,0 +1,73 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.combined.GenericCombinedFieldResolver; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.CombinedFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class CombinedFieldConfigProvider { + + + /** + * 作为临时配置列表缓存使用 + */ + private final List combinedFieldConfigList; + private Map storeObjectMap = new HashMap<>(); + + public CombinedFieldConfigProvider(Long ruleId) { + CombinedFieldConfigRegistry combinedFieldConfigRegistry = SpringContextUtil.getBean(CombinedFieldConfigRegistry.class); + combinedFieldConfigList = combinedFieldConfigRegistry.getCombinedFieldConfigList(ruleId); + } + + public void parseDataField(RuleConfig ruleConfig, String clearZeroPlain,Map fieldConfigsMap ) { + if (showSkip()) { + return; + } + //匹配对应的数据,然后进行相关的字段解析 + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver(); + combinedFieldResolver.parseDataField(combinedFieldConfigList, byteBuf, storeObjectMap,fieldConfigsMap); + } + + + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getCombinedFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return combinedFieldConfigList.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public List getCombinedFieldConfigList() { + return combinedFieldConfigList; + } + + /* 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(combinedFieldConfigList) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java new file mode 100644 index 0000000..f3cfedc --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java @@ -0,0 +1,11 @@ +package com.casic.missiles.parser.provider; + +/** + * @author cz + * @date 2023-6-12 + */ +public class CommandEventProvider{ + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java new file mode 100644 index 0000000..70eec5e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java @@ -0,0 +1,77 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.safe.SafeStrategy; +import com.casic.missiles.parser.sender.DataSubscribeProvider; +import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class DatagramEventProvider { + + private final DatagramEventConfig processorInstance; + + public DatagramEventProvider(Long ruleId) { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + List datagramEventConfigList = + datagramEventRegistry.getDatagramEventList(ruleId); + processorInstance = this.getProcessorInstance(datagramEventConfigList); + } + + public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { + if (showSkip()) { + return null; + } + return datagramEventConfigList.get(0); + } + + // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 + public String getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap) { + String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? + processorInstance.getSafeBean() : + fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); + if (!StringUtils.isEmpty(safeName)) { + //需要加密 + SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); + String plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); + return clearComplementZero(plain); + } + return ByteBufUtil.hexDump(bizDataContent); + } + + //解密清零操作 + private String clearComplementZero(String plain) { + plain = plain.substring(0, plain.lastIndexOf("00")); + return plain; + } + + //数据发送,数据发送者暂未构建 + public void storeData(Map bizDataMap) { + DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); +// dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return ObjectUtils.isNotEmpty(processorInstance) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java new file mode 100644 index 0000000..7e1fe0a --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java @@ -0,0 +1,97 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.FieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class FieldConfigProvider { + + + private final List fieldConfigs; + private Map storeObjectMap = new HashMap<>(); +// private Map singleObjects = new ConcurrentHashMap<>(); + + public FieldConfigProvider(Long ruleId) { + FieldConfigRegistry fieldConfigRegistry = SpringContextUtil.getBean(FieldConfigRegistry.class); + fieldConfigs = fieldConfigRegistry.getFieldConfigList(ruleId); + } + + public List getFieldConfigs() { + return fieldConfigs; + } + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public Map parseDataField(RuleConfig ruleConfig, String clearZeroPlain) { + if (showSkip()) { + return null; + } + List prepareFieldConfig = prepareParseField(ruleConfig); + if (CollectionUtils.isNotEmpty(prepareFieldConfig)) { + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(fieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + return fixDataMap; + } + } + return null; + } + + /** + * 得到需要处理的业务内容 + * + * @return + */ + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return fieldConfigs.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public Map getFieldConfigsMap() { + return fieldConfigs.stream().collect( + Collectors.toMap(FieldConfig::getId, e -> e) + ); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(fieldConfigs) ? false : true; + } + + +} + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java new file mode 100644 index 0000000..817bfaf --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java @@ -0,0 +1,19 @@ +package com.casic.missiles.parser.provider; + +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.registry.FieldRuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; + +public class FieldRuleConfigProvider { + + private final List fieldRuleConfigList; + + public FieldRuleConfigProvider(Long ruleId) { + FieldRuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(FieldRuleConfigRegistry.class); + fieldRuleConfigList = ruleConfigRegistry.getFieldRuleConfigList(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java new file mode 100644 index 0000000..99a1b06 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java @@ -0,0 +1,53 @@ +package com.casic.missiles.parser.provider; + + +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.registry.ProtocolConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolConfigProvider { + + private final List protocolConfigList; + + public ProtocolConfigProvider(String firstChar) { + ProtocolConfigRegistry registry = SpringContextUtil.getBean(ProtocolConfigRegistry.class); + protocolConfigList = registry.getProtocolConfigList(firstChar); + } + + public List getMatchList() { + return protocolConfigList; + } + + /** + * 设置当前协议 + * + * @param protocolConfig + */ + public ProtocolConfigProvider(ProtocolConfig protocolConfig) { + List protocolConfigs = new ArrayList<>(); + protocolConfigs.add(protocolConfig); + protocolConfigList = protocolConfigs; + } + + /** + * 获取当前协议 + * + * @return + */ + public ProtocolConfig getCurrentProtocolConfig() { + if (this.protocolConfigList == null) { + return null; + } else { + return protocolConfigList.get(0); + } + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java new file mode 100644 index 0000000..043927d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java @@ -0,0 +1,213 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.registry.ProtocolFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolFieldConfigProvider { + + private static final String FIXED_FIELD_DS = "fixedFieldDs"; + private static final String CONTENT_FIELD_DS = "contentFieldDs"; + private static final String PROTOCOL_LENGTH = "protocolLength"; + private static final String PROTOCOL_FIELD_ID = "protocolFieldId"; + private static final String PROTOCOL_POSITION = "protocolPosition"; + + private final List protocolFieldConfigs; + private Map singleObjects = new ConcurrentHashMap<>(); + private Map storeObjectMap = new HashMap<>(); + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public ProtocolFieldConfigProvider(Long protocolId) { + ProtocolFieldConfigRegistry protocolFieldConfigRegistry = SpringContextUtil.getBean(ProtocolFieldConfigRegistry.class); + protocolFieldConfigs = protocolFieldConfigRegistry.getProtocolFieldConfigList(protocolId); + } + + public List getProtocolFieldConfigs() { + return protocolFieldConfigs; + } + + public ProtocolFieldConfig getFieldConfigById(Long fieldId) { + Optional optionalConfig = protocolFieldConfigs.stream().filter( + e -> e.getId().equals(fieldId) + ).findFirst(); + return optionalConfig.isPresent() ? optionalConfig.get() : null; + } + + public Integer getProtocolFieldValue(Long protocolFieldId, ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_FIELD_ID + protocolFieldId + ByteBufUtil.hexDump(byteBuf); + //获取缓存 + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + //加载固定长度数据集合 + Map fixDataMap = this.getProtocolDataMap(byteBuf); + ProtocolFieldConfig protocolFieldConfig = selectFieldConfig(protocolFieldId); + Integer protocolFieldValue = 0; + //获取约定字段的总长度 + if (fixDataMap.containsKey(protocolFieldConfig.getFieldName())) { + Object appointUnpackObject = fixDataMap.get(protocolFieldConfig.getFieldName()); + if (ObjectUtils.isNotEmpty(appointUnpackObject)) { + protocolFieldValue = (Integer) appointUnpackObject; + } + } + if (protocolFieldValue != null) { + //加入缓存 + if (ObjectUtils.isNotEmpty(protocolFieldValue)) { + this.singleObjects.put(catchKey, protocolFieldValue); + return protocolFieldValue; + } + } + return null; + } + + /** + * 获取帧固定位置信息 + * + * @param byteBuf + * @param protocolConfig + * @return + */ + public Map getFixedProperty(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_POSITION + protocolConfig.getId(); + if (this.singleObjects.containsKey(catchKey)) { + return (Map) singleObjects.get(catchKey); + } + Map fixedPropertyMap = new HashMap<>(); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + fixedPropertyMap = fieldParser.doGetFixedProperty(protocolFieldConfigs, this.getTotalLength(byteBuf,protocolConfig)); + if (CollectionUtils.isNotEmpty(fixedPropertyMap)) { + this.singleObjects.put(catchKey, fixedPropertyMap); + return fixedPropertyMap; + } + return fixedPropertyMap; + } + + /** + * 获取帧结构应有的总长度 + */ + public Integer getTotalLength(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_LENGTH + ByteBufUtil.hexDump(byteBuf); + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + Integer appointFrameLength = getProtocolFieldValue(protocolConfig.getTotalLengthId(), byteBuf); + if (appointFrameLength != null) { + //获取过滤的字段集合总长度 + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Integer totalFilterLength = fieldParser.getTotalFilterLength(protocolConfig, byteBuf, getFixFieldConfigMap()); + //计算总长度 + Integer totalLength = appointFrameLength + totalFilterLength; + //加入缓存 + if (ObjectUtils.isNotEmpty(totalLength)) { + this.singleObjects.put(catchKey, totalLength); + return totalLength; + } + } + return null; + } + + /** + * 获取协议有关字段解析内容 + * storeObjectMap存储代转存的数据 + * + * @return + */ + public Map getProtocolDataMap(ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(FIXED_FIELD_DS)) { + return (Map) singleObjects.get(FIXED_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(protocolFieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + this.singleObjects.put(FIXED_FIELD_DS, fixDataMap); + return fixDataMap; + } + return null; + } + + /** + * 获取业务报文内容的content字节 + * + * @param wholeDatagramByte + * @return + */ + public ByteBuf getDataContentBuf(ByteBuf wholeDatagramByte) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(CONTENT_FIELD_DS)) { + return (ByteBuf) singleObjects.get(CONTENT_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + ByteBuf bizDataByteBuf = fieldParser.getDataContentBuf(protocolFieldConfigs, wholeDatagramByte); + if (bizDataByteBuf != null) { + this.singleObjects.put(CONTENT_FIELD_DS, bizDataByteBuf); + return bizDataByteBuf; + } + return null; + } + + + private ProtocolFieldConfig selectFieldConfig(Long id) { + Optional optionalProtocolFieldConfig = this.protocolFieldConfigs.stream().filter( + e -> e.getId().equals(id) + ).findFirst(); + return optionalProtocolFieldConfig.isPresent() ? optionalProtocolFieldConfig.get() : null; + } + + + private Map getFixFieldConfigMap() { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, e -> e) + ); + return fixDataFieldMap; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(protocolFieldConfigs) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java index 608af3a..32cc8a4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java @@ -2,48 +2,47 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.delivery.decorator.ByteDecorator; +import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @AllArgsConstructor public class FieldDecoratorManger { - private final RuleDictDao ruleDictDao; + private final RuleConfigRegistry ruleDictDao; // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 // (1)静态的业务字段是字典里面可以配置的 // (2)动态的业务字段是通过规则生成的 public String contentMerge(String ruleJson, String sceneConent, String dynamicContent) { - List ruleDictList = ruleDictDao.getRuleDictConfig(); - Map ruleDictMap = ruleDictList.stream().collect( - Collectors.toMap(RuleDict::getId, e -> e)); - List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); - for (Map ruleMap : ruleMapList) { - String ruleType = String.valueOf(ruleMap.get("ruleType")); - ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); - NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); - byteDecorator.nodeDecoratorRule(nodeDecoratorParm); - } +// List ruleDictList = ruleDictDao.getRuleDictConfig(); +// Map ruleDictMap = ruleDictList.stream().collect( +// Collectors.toMap(RuleDict::getId, e -> e)); +// List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); +// for (Map ruleMap : ruleMapList) { +// String ruleType = String.valueOf(ruleMap.get("ruleType")); +// ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); +// NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); +// byteDecorator.nodeDecoratorRule(nodeDecoratorParm); +// } return null; } - - private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { - NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() - .contents(sceneConent) - .dynamicContent(dynamicContent) - .ruletypeId(ruletypeId) - .ruleDictMap(ruleDictMap) - .build(); - return nodeDecoratorParm; - } +// +// private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { +// NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() +// .contents(sceneConent) +// .dynamicContent(dynamicContent) +// .ruletypeId(ruletypeId) +// .ruleDictMap(ruleDictMap) +// .build(); +// return nodeDecoratorParm; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java index 652970c..b204ac3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java @@ -1,56 +1,56 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@AllArgsConstructor -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", - JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Component; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Component("logicalDecorator") +//@AllArgsConstructor +//@Slf4j +//public class LogicalShiftDecorator implements ByteDecorator { +// +//// private final FieldRuleEngineMapper fieldRuleEngineMapper; +//// +//// //字节位移 +//// @Override +//// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +//// String logicalValue = ""; +//// RuleEvaluator fieldRuleEngine = new RuleEvaluator(); +//// try { +//// Map env2 = new HashMap(); +//// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +//// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +//// for (String contentId : contentIdList) { +//// RuleDict ruleDict = ruleDictMap.get(contentId); +//// if (ruleDict.getCode().contains("#")) { +//// //使用动态的值 +//// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +//// } +//// env2.put(ruleDict.getName(), ruleDict.getCode()); +//// } +//// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +//// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +//// return null; +//// } +//// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +//// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +//// return values; +//// } catch (Exception ex) { +//// log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", +//// JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +//// return null; +//// } +//// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java index 346468f..822fead 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@AllArgsConstructor -@Slf4j -public class OperationDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("optionDecorator") +//@AllArgsConstructor +//@Slf4j +//public class OperationDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //混合运算,有常量或者乘除的缩放 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java index 50fb0a7..7a8bccb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@AllArgsConstructor -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +////精度计算 +//@AllArgsConstructor +//@Registry("precisionDecorator") +//@Slf4j +//public class PrecisionDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java index da39235..27f9cc7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java @@ -1,54 +1,53 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@AllArgsConstructor -@Slf4j -public class RuleDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("ruleDecorator") +//@AllArgsConstructor +//@Slf4j +//public class RuleDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //吃我一套正则表达式 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (Exception ex) { +// log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java index 7f5cbf3..c043f97 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java @@ -2,6 +2,6 @@ import java.util.Map; -public interface ComandeEventService { +public interface ComandeEventService{ Map loadComandeEventConfig(String protocolId,String scene); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java index 476ad84..aaf1837 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java @@ -2,46 +2,46 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.dao.CommandEventDao; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @Slf4j @AllArgsConstructor -public class ComandeEventServiceImpl implements ComandeEventService { +public class ComandeEventServiceImpl implements ComandeEventRegistry { - private final CommandEventDao commandEventDao; + // private final CommandEventDao commandEventDao; // 加密bean 固定字段出现变化的字段解析,业务字段的有序内容 @Override - public Map loadComandeEventConfig(String protocolId,String sceneName) { - CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); - if (ObjectUtil.isEmpty(commandEventConfig)) { - log.error("协议{},没有配置成功接收回复配置,清排查原因"); - return null; - } - String replyJson = commandEventConfig.getReplyContentJson(); - List> replyMapList = JSONArray.parseObject(replyJson, List.class); - List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); - Map fixMap = fixList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); - List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) - .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) - .collect(Collectors.toList()); - Map commandConfigMap = new HashMap<>(); - commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); - commandConfigMap.put("fixContent", fixMap); - commandConfigMap.put("bizContent", contentList); - return commandConfigMap; + public Map loadComandeEventConfig(String protocolId, String sceneName) { +// CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); +// if (ObjectUtil.isEmpty(commandEventConfig)) { +// log.error("协议{},没有配置成功接收回复配置,清排查原因"); +// return null; +// } +// String replyJson = commandEventConfig.getReplyContentJson(); +// List> replyMapList = JSONArray.parseObject(replyJson, List.class); +// List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); +// Map fixMap = fixList.stream() +// .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); +// List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) +// .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) +// .collect(Collectors.toList()); +// Map commandConfigMap = new HashMap<>(); +// commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); +// commandConfigMap.put("fixContent", fixMap); +// commandConfigMap.put("bizContent", contentList); +// return commandConfigMap; + return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 128b09d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java deleted file mode 100644 index 4016b0b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface DatagramEventMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java deleted file mode 100644 index 597c306..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.apache.ibatis.annotations.Mapper; - -public interface FieldConfigMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java deleted file mode 100644 index a31680a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.PreRuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface PreRuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java deleted file mode 100644 index 9060a69..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface ProtocolConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java deleted file mode 100644 index 6fa6936..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java deleted file mode 100644 index 582a705..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleDict; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleDictMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java deleted file mode 100644 index 6e302c8..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.CommandEventMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Optional; - -@Component -public class CommandEventDao { - - @Resource - private CommandEventMapper commandEventMapper; - - public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId) - .eq("scene", sceneName) - .eq("enabled", 1); - List commandEventConfig = commandEventMapper.selectList(queryWrapper); - Optional optionalEventConfig = commandEventConfig.stream().findFirst(); - return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java deleted file mode 100644 index 9137e4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.FieldConfigMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class FieldConfigDao { - - @Resource - private FieldConfigMapper fieldConfigMapper; - - public FieldConfig getFieldConfigById(String fieldId) { - FieldConfig fieldConfig = fieldConfigMapper.selectById(fieldId); - return fieldConfig; - } - - public List getFieldConfigs(String protocolId,Integer isFixed) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",isFixed); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - - public List getStorageFieldConfig(String protocolId) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",1) - .eq("is_storage",1); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java deleted file mode 100644 index 67bff6b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.mapper.PreRuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class PreRuleConfigDao { - - @Resource - private PreRuleConfigMapper preRuleConfigMapper; - - public List getPreRuleList(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return preRuleConfigMapper.selectList(queryWrapper); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java deleted file mode 100644 index d69ea85..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.RuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleConfigDao { - - @Resource - private RuleConfigMapper ruleConfigMapper; - - public RuleConfig getNextRuleConfig(String ruleFields) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("parse_rule_json", ruleFields); - return ruleConfigMapper.selectOne(queryWrapper); - } - - - public List getRuleConfigById(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return ruleConfigMapper.selectList(queryWrapper); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java deleted file mode 100644 index 932c185..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.RuleDictMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleDictDao { - - @Resource - private RuleDictMapper ruleDictMapper; - - public List getRuleDictConfig() { - List ruleDictList = ruleDictMapper.selectList(null); - return ruleDictList; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java index 9f9e279..43bc4d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java @@ -10,20 +10,15 @@ import io.netty.channel.socket.nio.NioServerSocketChannel; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import javax.annotation.PreDestroy; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static cn.hutool.core.util.ClassUtil.getClasses; /** * SensorhubServer netty服务端 */ @Slf4j -@Service +@Component public class SensorhubServer { /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java index 2c79ff5..9a28c36 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java @@ -11,13 +11,13 @@ import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioSocketChannel; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClient 客户端 */ @Slf4j -@Service +@Registry public final class SensorhubClient { public static void main(String[] args) throws Exception { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java index 9774be0..477c3f7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java @@ -6,12 +6,12 @@ import io.netty.channel.socket.SocketChannel; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientChannelInitialHandler */ -@Service +@Registry public class SensorhubClientChannelInitialHandler extends ChannelInitializer { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java index 346f4b3..73560e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java @@ -5,13 +5,13 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientHandler */ @Slf4j -@Service +@Registry public class SensorhubClientHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java index 5c1c6f2..d990af5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java @@ -4,12 +4,12 @@ import com.casic.missiles.pojo.Msg; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** * SensorhubServerHandler */ -@Service +@Component public class SensorhubServerHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 67283ae..af3172c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,41 +1,37 @@ package com.casic.missiles.parser; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultProtocolConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.*; +import com.casic.missiles.registry.FieldConfigRegistry; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; -import java.nio.charset.Charset; import java.util.HashMap; import java.util.List; import java.util.Map; -@Service("genericProtocolParser") +/** + * @author + */ +@Component("genericProtocolParser") @Slf4j -@AllArgsConstructor +@RequiredArgsConstructor public class GenericProtocolParser implements ProtocolParser { - private final LeadingCodeMatcher leadingCodeMatcher; private final List frameStructDispenserList; - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorInstanceSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; // 匹配首字母前导码=> 帧结构匹配前导码=> // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 @@ -44,18 +40,19 @@ public Boolean doParseProtocol(ByteBuf byteBuf) { String protocolContent = ByteBufUtil.hexDump(byteBuf); //匹配前导码 - List preCodeConfigs = leadingCodeMatcher.matchLeadingCode(protocolContent); + List preCodeConfigs = LeadingCodeMatcher.matchFrameLeadingCode(protocolContent); //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 if (preCodeConfigs.size() == 0) { - return rematch(byteBuf,protocolContent); + return rematch(byteBuf, protocolContent); } - //暂时先取第一个 + //暂时先取第一个,提升速度,使用享元模式, 减少类的创建销毁与构建 ProtocolConfig protocolConfig = preCodeConfigs.get(0); + AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); ByteBuf wholeDatagramByte = null; //通过匹配帧结构获取完整的数据包 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, preCodeConfigs.get(0))) != null) { + if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, protocolFactory)) != null) { break; } } @@ -68,76 +65,78 @@ * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 */ - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId, wholeDatagramByte); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap, protocolId); - //选取规则对应的流程实例 - DatagramEventConfig datagramEventConfig = processorInstanceSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); + //进行规则字段解析,进行匹配规则 + RuleConfig ruleConfig = getRuleConfig(protocolFactory, wholeDatagramByte); + if (ruleConfig == null) { + return false; + } //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, wholeDatagramByte); + ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte); + //以下进行业务的规则解析,同时选定流程实例 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); + DatagramEventProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain, + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText, protocolId); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain); //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); + datagramEventProvider.storeData(bizDataMap); return true; } - private Boolean rematch(ByteBuf byteBuf,String protocolContent) { + /** + * 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 + */ + private Boolean rematch(ByteBuf byteBuf, String protocolContent) { //重置位判断 byteBuf.resetReaderIndex(); //判断重置是否前移,如果没有前移,则直接判为匹配失败 if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { return false; } else { + //递归执行 return doParseProtocol(byteBuf); } } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; + //获取匹配规则->匹配规则 + private RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + //取出其中参与逻辑provider并判空 + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); + String rulePrepareFields = protocolConfig.getRulePrepareFields(); + //固定字段 + if (StringUtils.isNotEmpty(rulePrepareFields)) { + //获取统一固定字段解析 + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + //获取该协议的字段配置,用于协议规则匹配 + List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); + //获取规则 + RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, + rulePrepareFields, protocolFieldConfigs); + return ruleConfig; + } + return null; } - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + //数据构建,获取固定字段的store和业务字段store + private Map buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + Map bizDataMap = new HashMap<>(); + Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); + Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); + bizDataMap.putAll(ruleStoreObjectMap); + bizDataMap.putAll(protocolStoreObjectMap); return bizDataMap; } - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java index 8a46e32..16ce2e5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java @@ -3,6 +3,7 @@ import io.netty.buffer.ByteBuf; public interface ProtocolParser { + Boolean doParseProtocol(ByteBuf byteBuf); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java new file mode 100644 index 0000000..f7814af --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java @@ -0,0 +1,35 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.ProtocolConfigProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.ProtocolConfig; + +/** + * 存放基本协议的的加载信息 + */ +public class AbstractProtocolConfigFactory { + private final ProtocolConfigProvider protocolConfigProvider; + private final ProtocolFieldConfigProvider protocolFieldConfigProvider; + private final RuleConfigProvider ruleConfigProvider; + + public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { + this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); + this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); + this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); + } + + public ProtocolConfigProvider getProtocolConfigProvider() { + return protocolConfigProvider; + } + + public ProtocolFieldConfigProvider getProtocolFieldConfigProvider() { + return protocolFieldConfigProvider; + } + + public RuleConfigProvider getRuleConfigProvider() { + return ruleConfigProvider; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java new file mode 100644 index 0000000..6e36147 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java @@ -0,0 +1,57 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.CombinedFieldConfigProvider; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.FieldConfigProvider; +import com.casic.missiles.parser.provider.FieldRuleConfigProvider; + +/** + * 存放规则相关的的的加载信息 + */ +public class AbstractRuleConfigFactory { + + /** + * 处理字节 + */ + private final FieldConfigProvider fieldConfigProvider; + /** + * 处理组合字节解析的解码器 + */ + private final CombinedFieldConfigProvider combinedFieldConfigProvider; + /** + * 处理负责字节解析的规则配置 + */ + private final FieldRuleConfigProvider fieldRuleConfigProvider; + /** + * 处理实例流程 + */ + private final DatagramEventProvider datagramEventProvider; + + + public AbstractRuleConfigFactory(Long ruleId) { + this.fieldConfigProvider = new FieldConfigProvider(ruleId); + this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); + this.fieldRuleConfigProvider = new FieldRuleConfigProvider(ruleId); + this.datagramEventProvider = new DatagramEventProvider(ruleId); + } + + public FieldConfigProvider getFieldConfigProvider() { + return fieldConfigProvider; + } + + public CombinedFieldConfigProvider getCombinedFieldConfigProvider() { + return combinedFieldConfigProvider; + } + + public FieldRuleConfigProvider getFieldRuleConfigProvider() { + return fieldRuleConfigProvider; + } + + public DatagramEventProvider getDatagramEventProvider() { + return datagramEventProvider; + } + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java deleted file mode 100644 index 6e1719a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.factory; - - -import com.casic.missiles.pojo.ProtocolConfig; - -import java.util.List; - -/** - * 数据库访问优化(暂时未做) - *

- * 1、初始化协议解析配置,并存放到处存放缓存,对协议基本配置进行管理 - * 2、其中流程中所有的配置都经过此类进行管理,进行调用获取,增强解析速度 - */ -public interface DatagramFactory { - - /** - * 初始化 - */ - List datagramInit(); - - /** - * 根据前导码配置匹配,模糊匹配获取所有的报文项 - */ - List match(); - - /** - * 根据前导码匹配,返回报文项 - */ - List filer(); - - /** - * 保证数据的唯一性选择器 - */ - List selectOne(); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java new file mode 100644 index 0000000..87444a0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java @@ -0,0 +1,18 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +import java.util.List; + +/** + * 直接用,还是边用边创建 + */ +public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { + + + public DefaultProtocolConfigFactory(ProtocolConfig protocolConfig) { + super(protocolConfig); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java new file mode 100644 index 0000000..cce0c7c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java @@ -0,0 +1,12 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; + +public class DefaultRuleFactory extends AbstractRuleConfigFactory { + + public DefaultRuleFactory(Long ruleId) { + super(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java deleted file mode 100644 index 9ee97e0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.casic.missiles.parser.instance; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service -@Slf4j -@AllArgsConstructor -public class GeneralProcessor { - - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; - - /** - * 统一固定字段解析=>进行规则的查询的判断 - * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 - * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 - */ - @Deprecated - public boolean parseWholeDatagram(ByteBuf buffer, ProtocolConfig protocolConfig) { - try { - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap,protocolId); - //选取规则对应的流程= - DatagramEventConfig datagramEventConfig = processorSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); - //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); - //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); - //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); - //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); - //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); - return true; - } catch (Exception ex) { - log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", - ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); - return false; - } - } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; - } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); - } - - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); - return bizDataMap; - } - - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java index 25e7ad8..6a5777e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java @@ -1,23 +1,31 @@ package com.casic.missiles.parser.instance.impl; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.mapper.DatagramEventMapper; import com.casic.missiles.pojo.DatagramEventConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.SpringContextUtil; -@Service -@AllArgsConstructor +import java.util.List; +import java.util.Optional; + +/** + * @author cz + * + */ public class DefaultProcessorInstanceSelector implements ProcessorInstanceSelector { - private final DatagramEventMapper datagramEventMapper; + private static List datagramEventConfigs; + + static { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + datagramEventConfigs = datagramEventRegistry.getDatagramEventList(); + } @Override public DatagramEventConfig getProcessorInstance(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("rule_id", protocolId); - return datagramEventMapper.selectOne(queryWrapper); + Optional optionalSelectInstance = datagramEventConfigs.stream() + .filter(e -> e.getId().equals(protocolId)).limit(1).findFirst(); + return optionalSelectInstance.isPresent() ? optionalSelectInstance.get() : null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a778671..7b56a43 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,16 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import io.netty.buffer.ByteBuf; /** - * 分析匹配情况 - * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 - * 2、匹配不成功,有后续帧,可以进行下次匹配。 - * 3、匹配不成功,无后续帧,可以进行丢弃。 + * 分析匹配情况 + * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 + * 2、匹配不成功,有后续帧,可以进行下次匹配。 + * 3、匹配不成功,无后续帧,可以进行丢弃。 */ -public interface FrameStructMatcher{ +public interface FrameStructMatcher { - ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig); + ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 05320ab..8ebea78 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,23 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.ProtocolConfigMapper; +import com.casic.missiles.parser.provider.ProtocolConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Component; import java.util.List; import java.util.stream.Collectors; -@Component -@AllArgsConstructor public class LeadingCodeMatcher { - private final ProtocolConfigMapper protocolMapper; - //** 1、首字母匹配前导码, // 2、以匹配出的前导码是否在报文中条件进行前导码的匹配二次筛选 - public List matchLeadingCode(String protocolContent){ + public static List matchFrameLeadingCode(String protocolContent){ List initialConfigs = initialMatch(protocolContent); List preCodeConfigs = initialConfigs.stream() .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) @@ -26,13 +19,16 @@ } //初始化匹配前导码内容 - private List initialMatch(String protocolContent) { - String protocolStr = protocolContent.charAt(0) + ""; - QueryWrapper queryWrapper = new QueryWrapper() - .likeRight("pre_fix", protocolStr); - List protocolConfigList = protocolMapper.selectList(queryWrapper); - return protocolConfigList; + private static List initialMatch(String protocolContent) { + String firstFrameChar = protocolContent.charAt(0) + ""; + ProtocolConfigProvider protocolConfigProvider=new ProtocolConfigProvider(firstFrameChar); + return protocolConfigProvider.getMatchList(); } + + + + + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index cf2113d..e915877 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -1,32 +1,35 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(0) -@Service +@Component public class FrameLengthMatcher implements FrameStructMatcher { - @Autowired - private FieldParser fieldParser; - //超过长度 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { String dataGramContent = ByteBufUtil.hexDump(byteBuf); - if (StringUtils.isEmpty(protocolConfig.getUnpackId()) && StringUtils.isEmpty(protocolConfig.getTailStr())) { - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + //当不存在结尾标志和拆包标志,可以直接使用长度进行匹配 + if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { if (dataGramContent.length() >= totalLength) {//等于长度返回true,超出长度,切断 - ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, protocolConfig, totalLength); + ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, totalLength); return wholeDatagramByte; } else { //读的标志位前移舍弃 @@ -38,7 +41,7 @@ return null; } - private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, Integer totalLength) { byteBuf.readBytes(totalLength); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, totalLength - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 2bfc213..d527ad0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; @@ -13,7 +13,7 @@ import lombok.AllArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.nio.charset.Charset; import java.util.Map; @@ -22,32 +22,30 @@ * 后续标志验证 */ @Order(1) -@Service +@Component @AllArgsConstructor -public class FrameMarkMatcher implements FrameStructMatcher { - - private final FieldConfigDao fieldConfigDao; - private final FieldParser fieldParser; - private final FieldResolver fieldResolverManger; +public class FrameMarkMatcher implements FrameStructMatcher, FixedPropertyEnum { //帧后续标志=>结束,进行帧的重组=>有后续,1、帧移位判别 2、继续接收帧 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig UnpackConfig = StringUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getUnpackId()); - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); - Integer upback = 0; + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); ByteBuf mergeWholeFrameByte = null; - if (!ObjectUtil.isEmpty(UnpackConfig)) { - while (hasNextFullFrame(byteBuf, protocolConfig)) { - upback = (Integer) fieldResolverManger.filedParserManger(byteBuf, UnpackConfig, null); + if (!ObjectUtil.isEmpty(unpackFlag)) { + while (hasNextFullFrame(byteBuf, protocolConfig, protocolFieldConfigProvider)) { //是否存在后续位 - if (upback == 1) {//使用esayRule + if (unpackFlag == 1) {//使用esayRule //表示可以截取 - mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolConfig, totalLength); + mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolFieldConfigProvider, protocolConfig); return mergeWholeFrameByte; } else { - byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig)); + byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig, protocolFieldConfigProvider)); } } } @@ -56,7 +54,8 @@ //选取第一个帧,将业务内容和后面部分分开 //计算数据报文-业务内容 - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolFieldConfigProvider protocolFieldConfigProvider, ProtocolConfig protocolConfig) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); //截取完整报文 byteBuf.readBytes(totalLength); ByteBuf byteBufContent = byteBuf.slice(0, byteBuf.readerIndex()); @@ -68,15 +67,15 @@ String tail = ""; System.out.println(ByteBufUtil.hexDump(byteBufContent)); //会存在多个帧拼接在一起的的情况,进行合并处理 - while (hasNextFullFrame(byteBufContent, protocolConfig)) { - Integer currentFrameLength = fieldParser.getTotalLength(protocolConfig, byteBufContent); + while (hasNextFullFrame(byteBufContent, protocolConfig, protocolFieldConfigProvider)) { + Integer currentFrameLength = protocolFieldConfigProvider.getTotalLength(byteBufContent, protocolConfig); byteBufContent.readBytes(currentFrameLength); ByteBuf currentbyteBuf = byteBufContent.slice(0, byteBufContent.readerIndex()); byteBufContent.markReaderIndex();//读的标志位前移 System.out.println(ByteBufUtil.hexDump(byteBufContent)); String hexDump = currentbyteBuf.toString(Charset.forName("ISO-8859-1")); //获取当前固定帧结构的关系map - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, currentbyteBuf); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(currentbyteBuf, protocolConfig); if (StringUtils.isEmpty(mergeFrameStr)) { //首次获取业务数据报文 mergeFrameStr += hexDump.substring(0, currentFrameFixedProperty.get("tailPosition")); @@ -95,22 +94,22 @@ /** * 获取平移到下一帧起始位置 */ - public int getNextFrameOffset(ByteBuf buffer, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, buffer); - return currentFrameFixedProperty.get("totalLength"); + public int getNextFrameOffset(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + return currentFrameFixedProperty.get(TOTAL_LENGTH); } /** * 判断是否出错进行整个帧的 */ - public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, byteBuf); + public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); //保证读取位置不在固定位置,是可变的业务内容 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("fixedPosition")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(FIXED_POSITION)) { return false; } //判断读取是否操作帧长度 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("totalLength")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(TOTAL_LENGTH)) { return false; } return true; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 76a3784..c3a1bab 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -1,50 +1,50 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.parser.instance.GeneralProcessor; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; +import io.netty.buffer.ByteBufUtil;; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(2) -@Service +@Component public class FrameTailMatcher implements FrameStructMatcher { - @Resource - private FieldConfigDao fieldConfigDao; - @Autowired - private GeneralProcessor generalProcessor; - //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig tailFieldConfig = StringUtils.isEmpty(protocolConfig.getTailStr()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getTailStr()); - if (!ObjectUtil.isEmpty(tailFieldConfig)) { - String tailStr = tailFieldConfig.getFieldName(); + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfig protocolFieldConfig = ObjectUtils.isEmpty(protocolConfig.getTailStr()) ? null : + fieldConfigProvider.getFieldConfigById(protocolConfig.getTailStr()); + if (!ObjectUtil.isEmpty(protocolFieldConfig)) { + String tailStr = protocolFieldConfig.getFieldName(); String dataGramContent = ByteBufUtil.hexDump(byteBuf); Boolean tailFlag = ByteBufUtil.hexDump(byteBuf).contains(tailStr); if (!tailFlag) { //使用esayRule return null; } else if (dataGramContent.indexOf(tailStr) < dataGramContent.length() - tailStr.length()) { Integer length = dataGramContent.indexOf(tailStr) + tailStr.length(); - ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, protocolConfig, length); + ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, length); return wholeDatagramByte; //存在粘包 } } return null; } - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer length) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, Integer length) { byteBuf.readBytes(length); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, length - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java new file mode 100644 index 0000000..5f1c177 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java @@ -0,0 +1,73 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.combined.GenericCombinedFieldResolver; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.CombinedFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class CombinedFieldConfigProvider { + + + /** + * 作为临时配置列表缓存使用 + */ + private final List combinedFieldConfigList; + private Map storeObjectMap = new HashMap<>(); + + public CombinedFieldConfigProvider(Long ruleId) { + CombinedFieldConfigRegistry combinedFieldConfigRegistry = SpringContextUtil.getBean(CombinedFieldConfigRegistry.class); + combinedFieldConfigList = combinedFieldConfigRegistry.getCombinedFieldConfigList(ruleId); + } + + public void parseDataField(RuleConfig ruleConfig, String clearZeroPlain,Map fieldConfigsMap ) { + if (showSkip()) { + return; + } + //匹配对应的数据,然后进行相关的字段解析 + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver(); + combinedFieldResolver.parseDataField(combinedFieldConfigList, byteBuf, storeObjectMap,fieldConfigsMap); + } + + + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getCombinedFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return combinedFieldConfigList.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public List getCombinedFieldConfigList() { + return combinedFieldConfigList; + } + + /* 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(combinedFieldConfigList) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java new file mode 100644 index 0000000..f3cfedc --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java @@ -0,0 +1,11 @@ +package com.casic.missiles.parser.provider; + +/** + * @author cz + * @date 2023-6-12 + */ +public class CommandEventProvider{ + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java new file mode 100644 index 0000000..70eec5e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java @@ -0,0 +1,77 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.safe.SafeStrategy; +import com.casic.missiles.parser.sender.DataSubscribeProvider; +import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class DatagramEventProvider { + + private final DatagramEventConfig processorInstance; + + public DatagramEventProvider(Long ruleId) { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + List datagramEventConfigList = + datagramEventRegistry.getDatagramEventList(ruleId); + processorInstance = this.getProcessorInstance(datagramEventConfigList); + } + + public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { + if (showSkip()) { + return null; + } + return datagramEventConfigList.get(0); + } + + // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 + public String getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap) { + String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? + processorInstance.getSafeBean() : + fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); + if (!StringUtils.isEmpty(safeName)) { + //需要加密 + SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); + String plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); + return clearComplementZero(plain); + } + return ByteBufUtil.hexDump(bizDataContent); + } + + //解密清零操作 + private String clearComplementZero(String plain) { + plain = plain.substring(0, plain.lastIndexOf("00")); + return plain; + } + + //数据发送,数据发送者暂未构建 + public void storeData(Map bizDataMap) { + DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); +// dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return ObjectUtils.isNotEmpty(processorInstance) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java new file mode 100644 index 0000000..7e1fe0a --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java @@ -0,0 +1,97 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.FieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class FieldConfigProvider { + + + private final List fieldConfigs; + private Map storeObjectMap = new HashMap<>(); +// private Map singleObjects = new ConcurrentHashMap<>(); + + public FieldConfigProvider(Long ruleId) { + FieldConfigRegistry fieldConfigRegistry = SpringContextUtil.getBean(FieldConfigRegistry.class); + fieldConfigs = fieldConfigRegistry.getFieldConfigList(ruleId); + } + + public List getFieldConfigs() { + return fieldConfigs; + } + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public Map parseDataField(RuleConfig ruleConfig, String clearZeroPlain) { + if (showSkip()) { + return null; + } + List prepareFieldConfig = prepareParseField(ruleConfig); + if (CollectionUtils.isNotEmpty(prepareFieldConfig)) { + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(fieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + return fixDataMap; + } + } + return null; + } + + /** + * 得到需要处理的业务内容 + * + * @return + */ + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return fieldConfigs.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public Map getFieldConfigsMap() { + return fieldConfigs.stream().collect( + Collectors.toMap(FieldConfig::getId, e -> e) + ); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(fieldConfigs) ? false : true; + } + + +} + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java new file mode 100644 index 0000000..817bfaf --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java @@ -0,0 +1,19 @@ +package com.casic.missiles.parser.provider; + +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.registry.FieldRuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; + +public class FieldRuleConfigProvider { + + private final List fieldRuleConfigList; + + public FieldRuleConfigProvider(Long ruleId) { + FieldRuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(FieldRuleConfigRegistry.class); + fieldRuleConfigList = ruleConfigRegistry.getFieldRuleConfigList(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java new file mode 100644 index 0000000..99a1b06 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java @@ -0,0 +1,53 @@ +package com.casic.missiles.parser.provider; + + +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.registry.ProtocolConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolConfigProvider { + + private final List protocolConfigList; + + public ProtocolConfigProvider(String firstChar) { + ProtocolConfigRegistry registry = SpringContextUtil.getBean(ProtocolConfigRegistry.class); + protocolConfigList = registry.getProtocolConfigList(firstChar); + } + + public List getMatchList() { + return protocolConfigList; + } + + /** + * 设置当前协议 + * + * @param protocolConfig + */ + public ProtocolConfigProvider(ProtocolConfig protocolConfig) { + List protocolConfigs = new ArrayList<>(); + protocolConfigs.add(protocolConfig); + protocolConfigList = protocolConfigs; + } + + /** + * 获取当前协议 + * + * @return + */ + public ProtocolConfig getCurrentProtocolConfig() { + if (this.protocolConfigList == null) { + return null; + } else { + return protocolConfigList.get(0); + } + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java new file mode 100644 index 0000000..043927d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java @@ -0,0 +1,213 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.registry.ProtocolFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolFieldConfigProvider { + + private static final String FIXED_FIELD_DS = "fixedFieldDs"; + private static final String CONTENT_FIELD_DS = "contentFieldDs"; + private static final String PROTOCOL_LENGTH = "protocolLength"; + private static final String PROTOCOL_FIELD_ID = "protocolFieldId"; + private static final String PROTOCOL_POSITION = "protocolPosition"; + + private final List protocolFieldConfigs; + private Map singleObjects = new ConcurrentHashMap<>(); + private Map storeObjectMap = new HashMap<>(); + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public ProtocolFieldConfigProvider(Long protocolId) { + ProtocolFieldConfigRegistry protocolFieldConfigRegistry = SpringContextUtil.getBean(ProtocolFieldConfigRegistry.class); + protocolFieldConfigs = protocolFieldConfigRegistry.getProtocolFieldConfigList(protocolId); + } + + public List getProtocolFieldConfigs() { + return protocolFieldConfigs; + } + + public ProtocolFieldConfig getFieldConfigById(Long fieldId) { + Optional optionalConfig = protocolFieldConfigs.stream().filter( + e -> e.getId().equals(fieldId) + ).findFirst(); + return optionalConfig.isPresent() ? optionalConfig.get() : null; + } + + public Integer getProtocolFieldValue(Long protocolFieldId, ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_FIELD_ID + protocolFieldId + ByteBufUtil.hexDump(byteBuf); + //获取缓存 + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + //加载固定长度数据集合 + Map fixDataMap = this.getProtocolDataMap(byteBuf); + ProtocolFieldConfig protocolFieldConfig = selectFieldConfig(protocolFieldId); + Integer protocolFieldValue = 0; + //获取约定字段的总长度 + if (fixDataMap.containsKey(protocolFieldConfig.getFieldName())) { + Object appointUnpackObject = fixDataMap.get(protocolFieldConfig.getFieldName()); + if (ObjectUtils.isNotEmpty(appointUnpackObject)) { + protocolFieldValue = (Integer) appointUnpackObject; + } + } + if (protocolFieldValue != null) { + //加入缓存 + if (ObjectUtils.isNotEmpty(protocolFieldValue)) { + this.singleObjects.put(catchKey, protocolFieldValue); + return protocolFieldValue; + } + } + return null; + } + + /** + * 获取帧固定位置信息 + * + * @param byteBuf + * @param protocolConfig + * @return + */ + public Map getFixedProperty(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_POSITION + protocolConfig.getId(); + if (this.singleObjects.containsKey(catchKey)) { + return (Map) singleObjects.get(catchKey); + } + Map fixedPropertyMap = new HashMap<>(); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + fixedPropertyMap = fieldParser.doGetFixedProperty(protocolFieldConfigs, this.getTotalLength(byteBuf,protocolConfig)); + if (CollectionUtils.isNotEmpty(fixedPropertyMap)) { + this.singleObjects.put(catchKey, fixedPropertyMap); + return fixedPropertyMap; + } + return fixedPropertyMap; + } + + /** + * 获取帧结构应有的总长度 + */ + public Integer getTotalLength(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_LENGTH + ByteBufUtil.hexDump(byteBuf); + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + Integer appointFrameLength = getProtocolFieldValue(protocolConfig.getTotalLengthId(), byteBuf); + if (appointFrameLength != null) { + //获取过滤的字段集合总长度 + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Integer totalFilterLength = fieldParser.getTotalFilterLength(protocolConfig, byteBuf, getFixFieldConfigMap()); + //计算总长度 + Integer totalLength = appointFrameLength + totalFilterLength; + //加入缓存 + if (ObjectUtils.isNotEmpty(totalLength)) { + this.singleObjects.put(catchKey, totalLength); + return totalLength; + } + } + return null; + } + + /** + * 获取协议有关字段解析内容 + * storeObjectMap存储代转存的数据 + * + * @return + */ + public Map getProtocolDataMap(ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(FIXED_FIELD_DS)) { + return (Map) singleObjects.get(FIXED_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(protocolFieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + this.singleObjects.put(FIXED_FIELD_DS, fixDataMap); + return fixDataMap; + } + return null; + } + + /** + * 获取业务报文内容的content字节 + * + * @param wholeDatagramByte + * @return + */ + public ByteBuf getDataContentBuf(ByteBuf wholeDatagramByte) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(CONTENT_FIELD_DS)) { + return (ByteBuf) singleObjects.get(CONTENT_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + ByteBuf bizDataByteBuf = fieldParser.getDataContentBuf(protocolFieldConfigs, wholeDatagramByte); + if (bizDataByteBuf != null) { + this.singleObjects.put(CONTENT_FIELD_DS, bizDataByteBuf); + return bizDataByteBuf; + } + return null; + } + + + private ProtocolFieldConfig selectFieldConfig(Long id) { + Optional optionalProtocolFieldConfig = this.protocolFieldConfigs.stream().filter( + e -> e.getId().equals(id) + ).findFirst(); + return optionalProtocolFieldConfig.isPresent() ? optionalProtocolFieldConfig.get() : null; + } + + + private Map getFixFieldConfigMap() { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, e -> e) + ); + return fixDataFieldMap; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(protocolFieldConfigs) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java new file mode 100644 index 0000000..dafba1c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java @@ -0,0 +1,56 @@ +package com.casic.missiles.parser.provider; + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.rule.GenericRuleResolver; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.RuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleConfigProvider { + + private final List ruleConfigs; + + public List getRuleConfigs() { + return ruleConfigs; + } + + public RuleConfigProvider(Long protocolId) { + RuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(RuleConfigRegistry.class); + ruleConfigs = ruleConfigRegistry.getRuleConfigById(protocolId); + } + + /** + * 获取规则匹配结果 + * + * @param parseFixedDataMap + * @param protocolFieldConfigs + * @return + */ + public RuleConfig doGetRule(Map parseFixedDataMap, + String ids, + List protocolFieldConfigs) { + if (showSkip()) { + return null; + } + RuleConfig ruleConfig = GenericRuleResolver.machRule(parseFixedDataMap, ids, protocolFieldConfigs, ruleConfigs); + return ruleConfig; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(ruleConfigs) ? false : true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java index 608af3a..32cc8a4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java @@ -2,48 +2,47 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.delivery.decorator.ByteDecorator; +import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @AllArgsConstructor public class FieldDecoratorManger { - private final RuleDictDao ruleDictDao; + private final RuleConfigRegistry ruleDictDao; // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 // (1)静态的业务字段是字典里面可以配置的 // (2)动态的业务字段是通过规则生成的 public String contentMerge(String ruleJson, String sceneConent, String dynamicContent) { - List ruleDictList = ruleDictDao.getRuleDictConfig(); - Map ruleDictMap = ruleDictList.stream().collect( - Collectors.toMap(RuleDict::getId, e -> e)); - List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); - for (Map ruleMap : ruleMapList) { - String ruleType = String.valueOf(ruleMap.get("ruleType")); - ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); - NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); - byteDecorator.nodeDecoratorRule(nodeDecoratorParm); - } +// List ruleDictList = ruleDictDao.getRuleDictConfig(); +// Map ruleDictMap = ruleDictList.stream().collect( +// Collectors.toMap(RuleDict::getId, e -> e)); +// List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); +// for (Map ruleMap : ruleMapList) { +// String ruleType = String.valueOf(ruleMap.get("ruleType")); +// ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); +// NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); +// byteDecorator.nodeDecoratorRule(nodeDecoratorParm); +// } return null; } - - private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { - NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() - .contents(sceneConent) - .dynamicContent(dynamicContent) - .ruletypeId(ruletypeId) - .ruleDictMap(ruleDictMap) - .build(); - return nodeDecoratorParm; - } +// +// private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { +// NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() +// .contents(sceneConent) +// .dynamicContent(dynamicContent) +// .ruletypeId(ruletypeId) +// .ruleDictMap(ruleDictMap) +// .build(); +// return nodeDecoratorParm; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java index 652970c..b204ac3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java @@ -1,56 +1,56 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@AllArgsConstructor -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", - JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Component; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Component("logicalDecorator") +//@AllArgsConstructor +//@Slf4j +//public class LogicalShiftDecorator implements ByteDecorator { +// +//// private final FieldRuleEngineMapper fieldRuleEngineMapper; +//// +//// //字节位移 +//// @Override +//// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +//// String logicalValue = ""; +//// RuleEvaluator fieldRuleEngine = new RuleEvaluator(); +//// try { +//// Map env2 = new HashMap(); +//// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +//// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +//// for (String contentId : contentIdList) { +//// RuleDict ruleDict = ruleDictMap.get(contentId); +//// if (ruleDict.getCode().contains("#")) { +//// //使用动态的值 +//// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +//// } +//// env2.put(ruleDict.getName(), ruleDict.getCode()); +//// } +//// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +//// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +//// return null; +//// } +//// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +//// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +//// return values; +//// } catch (Exception ex) { +//// log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", +//// JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +//// return null; +//// } +//// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java index 346468f..822fead 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@AllArgsConstructor -@Slf4j -public class OperationDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("optionDecorator") +//@AllArgsConstructor +//@Slf4j +//public class OperationDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //混合运算,有常量或者乘除的缩放 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java index 50fb0a7..7a8bccb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@AllArgsConstructor -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +////精度计算 +//@AllArgsConstructor +//@Registry("precisionDecorator") +//@Slf4j +//public class PrecisionDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java index da39235..27f9cc7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java @@ -1,54 +1,53 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@AllArgsConstructor -@Slf4j -public class RuleDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("ruleDecorator") +//@AllArgsConstructor +//@Slf4j +//public class RuleDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //吃我一套正则表达式 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (Exception ex) { +// log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java index 7f5cbf3..c043f97 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java @@ -2,6 +2,6 @@ import java.util.Map; -public interface ComandeEventService { +public interface ComandeEventService{ Map loadComandeEventConfig(String protocolId,String scene); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java index 476ad84..aaf1837 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java @@ -2,46 +2,46 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.dao.CommandEventDao; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @Slf4j @AllArgsConstructor -public class ComandeEventServiceImpl implements ComandeEventService { +public class ComandeEventServiceImpl implements ComandeEventRegistry { - private final CommandEventDao commandEventDao; + // private final CommandEventDao commandEventDao; // 加密bean 固定字段出现变化的字段解析,业务字段的有序内容 @Override - public Map loadComandeEventConfig(String protocolId,String sceneName) { - CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); - if (ObjectUtil.isEmpty(commandEventConfig)) { - log.error("协议{},没有配置成功接收回复配置,清排查原因"); - return null; - } - String replyJson = commandEventConfig.getReplyContentJson(); - List> replyMapList = JSONArray.parseObject(replyJson, List.class); - List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); - Map fixMap = fixList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); - List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) - .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) - .collect(Collectors.toList()); - Map commandConfigMap = new HashMap<>(); - commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); - commandConfigMap.put("fixContent", fixMap); - commandConfigMap.put("bizContent", contentList); - return commandConfigMap; + public Map loadComandeEventConfig(String protocolId, String sceneName) { +// CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); +// if (ObjectUtil.isEmpty(commandEventConfig)) { +// log.error("协议{},没有配置成功接收回复配置,清排查原因"); +// return null; +// } +// String replyJson = commandEventConfig.getReplyContentJson(); +// List> replyMapList = JSONArray.parseObject(replyJson, List.class); +// List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); +// Map fixMap = fixList.stream() +// .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); +// List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) +// .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) +// .collect(Collectors.toList()); +// Map commandConfigMap = new HashMap<>(); +// commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); +// commandConfigMap.put("fixContent", fixMap); +// commandConfigMap.put("bizContent", contentList); +// return commandConfigMap; + return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 128b09d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java deleted file mode 100644 index 4016b0b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface DatagramEventMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java deleted file mode 100644 index 597c306..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.apache.ibatis.annotations.Mapper; - -public interface FieldConfigMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java deleted file mode 100644 index a31680a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.PreRuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface PreRuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java deleted file mode 100644 index 9060a69..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface ProtocolConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java deleted file mode 100644 index 6fa6936..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java deleted file mode 100644 index 582a705..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleDict; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleDictMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java deleted file mode 100644 index 6e302c8..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.CommandEventMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Optional; - -@Component -public class CommandEventDao { - - @Resource - private CommandEventMapper commandEventMapper; - - public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId) - .eq("scene", sceneName) - .eq("enabled", 1); - List commandEventConfig = commandEventMapper.selectList(queryWrapper); - Optional optionalEventConfig = commandEventConfig.stream().findFirst(); - return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java deleted file mode 100644 index 9137e4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.FieldConfigMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class FieldConfigDao { - - @Resource - private FieldConfigMapper fieldConfigMapper; - - public FieldConfig getFieldConfigById(String fieldId) { - FieldConfig fieldConfig = fieldConfigMapper.selectById(fieldId); - return fieldConfig; - } - - public List getFieldConfigs(String protocolId,Integer isFixed) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",isFixed); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - - public List getStorageFieldConfig(String protocolId) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",1) - .eq("is_storage",1); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java deleted file mode 100644 index 67bff6b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.mapper.PreRuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class PreRuleConfigDao { - - @Resource - private PreRuleConfigMapper preRuleConfigMapper; - - public List getPreRuleList(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return preRuleConfigMapper.selectList(queryWrapper); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java deleted file mode 100644 index d69ea85..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.RuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleConfigDao { - - @Resource - private RuleConfigMapper ruleConfigMapper; - - public RuleConfig getNextRuleConfig(String ruleFields) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("parse_rule_json", ruleFields); - return ruleConfigMapper.selectOne(queryWrapper); - } - - - public List getRuleConfigById(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return ruleConfigMapper.selectList(queryWrapper); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java deleted file mode 100644 index 932c185..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.RuleDictMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleDictDao { - - @Resource - private RuleDictMapper ruleDictMapper; - - public List getRuleDictConfig() { - List ruleDictList = ruleDictMapper.selectList(null); - return ruleDictList; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java index 9f9e279..43bc4d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java @@ -10,20 +10,15 @@ import io.netty.channel.socket.nio.NioServerSocketChannel; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import javax.annotation.PreDestroy; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static cn.hutool.core.util.ClassUtil.getClasses; /** * SensorhubServer netty服务端 */ @Slf4j -@Service +@Component public class SensorhubServer { /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java index 2c79ff5..9a28c36 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java @@ -11,13 +11,13 @@ import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioSocketChannel; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClient 客户端 */ @Slf4j -@Service +@Registry public final class SensorhubClient { public static void main(String[] args) throws Exception { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java index 9774be0..477c3f7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java @@ -6,12 +6,12 @@ import io.netty.channel.socket.SocketChannel; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientChannelInitialHandler */ -@Service +@Registry public class SensorhubClientChannelInitialHandler extends ChannelInitializer { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java index 346f4b3..73560e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java @@ -5,13 +5,13 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientHandler */ @Slf4j -@Service +@Registry public class SensorhubClientHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java index 5c1c6f2..d990af5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java @@ -4,12 +4,12 @@ import com.casic.missiles.pojo.Msg; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** * SensorhubServerHandler */ -@Service +@Component public class SensorhubServerHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 67283ae..af3172c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,41 +1,37 @@ package com.casic.missiles.parser; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultProtocolConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.*; +import com.casic.missiles.registry.FieldConfigRegistry; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; -import java.nio.charset.Charset; import java.util.HashMap; import java.util.List; import java.util.Map; -@Service("genericProtocolParser") +/** + * @author + */ +@Component("genericProtocolParser") @Slf4j -@AllArgsConstructor +@RequiredArgsConstructor public class GenericProtocolParser implements ProtocolParser { - private final LeadingCodeMatcher leadingCodeMatcher; private final List frameStructDispenserList; - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorInstanceSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; // 匹配首字母前导码=> 帧结构匹配前导码=> // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 @@ -44,18 +40,19 @@ public Boolean doParseProtocol(ByteBuf byteBuf) { String protocolContent = ByteBufUtil.hexDump(byteBuf); //匹配前导码 - List preCodeConfigs = leadingCodeMatcher.matchLeadingCode(protocolContent); + List preCodeConfigs = LeadingCodeMatcher.matchFrameLeadingCode(protocolContent); //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 if (preCodeConfigs.size() == 0) { - return rematch(byteBuf,protocolContent); + return rematch(byteBuf, protocolContent); } - //暂时先取第一个 + //暂时先取第一个,提升速度,使用享元模式, 减少类的创建销毁与构建 ProtocolConfig protocolConfig = preCodeConfigs.get(0); + AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); ByteBuf wholeDatagramByte = null; //通过匹配帧结构获取完整的数据包 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, preCodeConfigs.get(0))) != null) { + if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, protocolFactory)) != null) { break; } } @@ -68,76 +65,78 @@ * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 */ - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId, wholeDatagramByte); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap, protocolId); - //选取规则对应的流程实例 - DatagramEventConfig datagramEventConfig = processorInstanceSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); + //进行规则字段解析,进行匹配规则 + RuleConfig ruleConfig = getRuleConfig(protocolFactory, wholeDatagramByte); + if (ruleConfig == null) { + return false; + } //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, wholeDatagramByte); + ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte); + //以下进行业务的规则解析,同时选定流程实例 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); + DatagramEventProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain, + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText, protocolId); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain); //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); + datagramEventProvider.storeData(bizDataMap); return true; } - private Boolean rematch(ByteBuf byteBuf,String protocolContent) { + /** + * 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 + */ + private Boolean rematch(ByteBuf byteBuf, String protocolContent) { //重置位判断 byteBuf.resetReaderIndex(); //判断重置是否前移,如果没有前移,则直接判为匹配失败 if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { return false; } else { + //递归执行 return doParseProtocol(byteBuf); } } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; + //获取匹配规则->匹配规则 + private RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + //取出其中参与逻辑provider并判空 + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); + String rulePrepareFields = protocolConfig.getRulePrepareFields(); + //固定字段 + if (StringUtils.isNotEmpty(rulePrepareFields)) { + //获取统一固定字段解析 + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + //获取该协议的字段配置,用于协议规则匹配 + List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); + //获取规则 + RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, + rulePrepareFields, protocolFieldConfigs); + return ruleConfig; + } + return null; } - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + //数据构建,获取固定字段的store和业务字段store + private Map buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + Map bizDataMap = new HashMap<>(); + Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); + Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); + bizDataMap.putAll(ruleStoreObjectMap); + bizDataMap.putAll(protocolStoreObjectMap); return bizDataMap; } - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java index 8a46e32..16ce2e5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java @@ -3,6 +3,7 @@ import io.netty.buffer.ByteBuf; public interface ProtocolParser { + Boolean doParseProtocol(ByteBuf byteBuf); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java new file mode 100644 index 0000000..f7814af --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java @@ -0,0 +1,35 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.ProtocolConfigProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.ProtocolConfig; + +/** + * 存放基本协议的的加载信息 + */ +public class AbstractProtocolConfigFactory { + private final ProtocolConfigProvider protocolConfigProvider; + private final ProtocolFieldConfigProvider protocolFieldConfigProvider; + private final RuleConfigProvider ruleConfigProvider; + + public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { + this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); + this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); + this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); + } + + public ProtocolConfigProvider getProtocolConfigProvider() { + return protocolConfigProvider; + } + + public ProtocolFieldConfigProvider getProtocolFieldConfigProvider() { + return protocolFieldConfigProvider; + } + + public RuleConfigProvider getRuleConfigProvider() { + return ruleConfigProvider; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java new file mode 100644 index 0000000..6e36147 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java @@ -0,0 +1,57 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.CombinedFieldConfigProvider; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.FieldConfigProvider; +import com.casic.missiles.parser.provider.FieldRuleConfigProvider; + +/** + * 存放规则相关的的的加载信息 + */ +public class AbstractRuleConfigFactory { + + /** + * 处理字节 + */ + private final FieldConfigProvider fieldConfigProvider; + /** + * 处理组合字节解析的解码器 + */ + private final CombinedFieldConfigProvider combinedFieldConfigProvider; + /** + * 处理负责字节解析的规则配置 + */ + private final FieldRuleConfigProvider fieldRuleConfigProvider; + /** + * 处理实例流程 + */ + private final DatagramEventProvider datagramEventProvider; + + + public AbstractRuleConfigFactory(Long ruleId) { + this.fieldConfigProvider = new FieldConfigProvider(ruleId); + this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); + this.fieldRuleConfigProvider = new FieldRuleConfigProvider(ruleId); + this.datagramEventProvider = new DatagramEventProvider(ruleId); + } + + public FieldConfigProvider getFieldConfigProvider() { + return fieldConfigProvider; + } + + public CombinedFieldConfigProvider getCombinedFieldConfigProvider() { + return combinedFieldConfigProvider; + } + + public FieldRuleConfigProvider getFieldRuleConfigProvider() { + return fieldRuleConfigProvider; + } + + public DatagramEventProvider getDatagramEventProvider() { + return datagramEventProvider; + } + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java deleted file mode 100644 index 6e1719a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.factory; - - -import com.casic.missiles.pojo.ProtocolConfig; - -import java.util.List; - -/** - * 数据库访问优化(暂时未做) - *

- * 1、初始化协议解析配置,并存放到处存放缓存,对协议基本配置进行管理 - * 2、其中流程中所有的配置都经过此类进行管理,进行调用获取,增强解析速度 - */ -public interface DatagramFactory { - - /** - * 初始化 - */ - List datagramInit(); - - /** - * 根据前导码配置匹配,模糊匹配获取所有的报文项 - */ - List match(); - - /** - * 根据前导码匹配,返回报文项 - */ - List filer(); - - /** - * 保证数据的唯一性选择器 - */ - List selectOne(); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java new file mode 100644 index 0000000..87444a0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java @@ -0,0 +1,18 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +import java.util.List; + +/** + * 直接用,还是边用边创建 + */ +public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { + + + public DefaultProtocolConfigFactory(ProtocolConfig protocolConfig) { + super(protocolConfig); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java new file mode 100644 index 0000000..cce0c7c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java @@ -0,0 +1,12 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; + +public class DefaultRuleFactory extends AbstractRuleConfigFactory { + + public DefaultRuleFactory(Long ruleId) { + super(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java deleted file mode 100644 index 9ee97e0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.casic.missiles.parser.instance; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service -@Slf4j -@AllArgsConstructor -public class GeneralProcessor { - - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; - - /** - * 统一固定字段解析=>进行规则的查询的判断 - * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 - * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 - */ - @Deprecated - public boolean parseWholeDatagram(ByteBuf buffer, ProtocolConfig protocolConfig) { - try { - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap,protocolId); - //选取规则对应的流程= - DatagramEventConfig datagramEventConfig = processorSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); - //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); - //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); - //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); - //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); - //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); - return true; - } catch (Exception ex) { - log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", - ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); - return false; - } - } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; - } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); - } - - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); - return bizDataMap; - } - - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java index 25e7ad8..6a5777e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java @@ -1,23 +1,31 @@ package com.casic.missiles.parser.instance.impl; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.mapper.DatagramEventMapper; import com.casic.missiles.pojo.DatagramEventConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.SpringContextUtil; -@Service -@AllArgsConstructor +import java.util.List; +import java.util.Optional; + +/** + * @author cz + * + */ public class DefaultProcessorInstanceSelector implements ProcessorInstanceSelector { - private final DatagramEventMapper datagramEventMapper; + private static List datagramEventConfigs; + + static { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + datagramEventConfigs = datagramEventRegistry.getDatagramEventList(); + } @Override public DatagramEventConfig getProcessorInstance(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("rule_id", protocolId); - return datagramEventMapper.selectOne(queryWrapper); + Optional optionalSelectInstance = datagramEventConfigs.stream() + .filter(e -> e.getId().equals(protocolId)).limit(1).findFirst(); + return optionalSelectInstance.isPresent() ? optionalSelectInstance.get() : null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a778671..7b56a43 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,16 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import io.netty.buffer.ByteBuf; /** - * 分析匹配情况 - * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 - * 2、匹配不成功,有后续帧,可以进行下次匹配。 - * 3、匹配不成功,无后续帧,可以进行丢弃。 + * 分析匹配情况 + * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 + * 2、匹配不成功,有后续帧,可以进行下次匹配。 + * 3、匹配不成功,无后续帧,可以进行丢弃。 */ -public interface FrameStructMatcher{ +public interface FrameStructMatcher { - ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig); + ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 05320ab..8ebea78 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,23 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.ProtocolConfigMapper; +import com.casic.missiles.parser.provider.ProtocolConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Component; import java.util.List; import java.util.stream.Collectors; -@Component -@AllArgsConstructor public class LeadingCodeMatcher { - private final ProtocolConfigMapper protocolMapper; - //** 1、首字母匹配前导码, // 2、以匹配出的前导码是否在报文中条件进行前导码的匹配二次筛选 - public List matchLeadingCode(String protocolContent){ + public static List matchFrameLeadingCode(String protocolContent){ List initialConfigs = initialMatch(protocolContent); List preCodeConfigs = initialConfigs.stream() .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) @@ -26,13 +19,16 @@ } //初始化匹配前导码内容 - private List initialMatch(String protocolContent) { - String protocolStr = protocolContent.charAt(0) + ""; - QueryWrapper queryWrapper = new QueryWrapper() - .likeRight("pre_fix", protocolStr); - List protocolConfigList = protocolMapper.selectList(queryWrapper); - return protocolConfigList; + private static List initialMatch(String protocolContent) { + String firstFrameChar = protocolContent.charAt(0) + ""; + ProtocolConfigProvider protocolConfigProvider=new ProtocolConfigProvider(firstFrameChar); + return protocolConfigProvider.getMatchList(); } + + + + + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index cf2113d..e915877 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -1,32 +1,35 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(0) -@Service +@Component public class FrameLengthMatcher implements FrameStructMatcher { - @Autowired - private FieldParser fieldParser; - //超过长度 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { String dataGramContent = ByteBufUtil.hexDump(byteBuf); - if (StringUtils.isEmpty(protocolConfig.getUnpackId()) && StringUtils.isEmpty(protocolConfig.getTailStr())) { - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + //当不存在结尾标志和拆包标志,可以直接使用长度进行匹配 + if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { if (dataGramContent.length() >= totalLength) {//等于长度返回true,超出长度,切断 - ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, protocolConfig, totalLength); + ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, totalLength); return wholeDatagramByte; } else { //读的标志位前移舍弃 @@ -38,7 +41,7 @@ return null; } - private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, Integer totalLength) { byteBuf.readBytes(totalLength); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, totalLength - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 2bfc213..d527ad0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; @@ -13,7 +13,7 @@ import lombok.AllArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.nio.charset.Charset; import java.util.Map; @@ -22,32 +22,30 @@ * 后续标志验证 */ @Order(1) -@Service +@Component @AllArgsConstructor -public class FrameMarkMatcher implements FrameStructMatcher { - - private final FieldConfigDao fieldConfigDao; - private final FieldParser fieldParser; - private final FieldResolver fieldResolverManger; +public class FrameMarkMatcher implements FrameStructMatcher, FixedPropertyEnum { //帧后续标志=>结束,进行帧的重组=>有后续,1、帧移位判别 2、继续接收帧 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig UnpackConfig = StringUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getUnpackId()); - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); - Integer upback = 0; + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); ByteBuf mergeWholeFrameByte = null; - if (!ObjectUtil.isEmpty(UnpackConfig)) { - while (hasNextFullFrame(byteBuf, protocolConfig)) { - upback = (Integer) fieldResolverManger.filedParserManger(byteBuf, UnpackConfig, null); + if (!ObjectUtil.isEmpty(unpackFlag)) { + while (hasNextFullFrame(byteBuf, protocolConfig, protocolFieldConfigProvider)) { //是否存在后续位 - if (upback == 1) {//使用esayRule + if (unpackFlag == 1) {//使用esayRule //表示可以截取 - mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolConfig, totalLength); + mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolFieldConfigProvider, protocolConfig); return mergeWholeFrameByte; } else { - byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig)); + byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig, protocolFieldConfigProvider)); } } } @@ -56,7 +54,8 @@ //选取第一个帧,将业务内容和后面部分分开 //计算数据报文-业务内容 - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolFieldConfigProvider protocolFieldConfigProvider, ProtocolConfig protocolConfig) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); //截取完整报文 byteBuf.readBytes(totalLength); ByteBuf byteBufContent = byteBuf.slice(0, byteBuf.readerIndex()); @@ -68,15 +67,15 @@ String tail = ""; System.out.println(ByteBufUtil.hexDump(byteBufContent)); //会存在多个帧拼接在一起的的情况,进行合并处理 - while (hasNextFullFrame(byteBufContent, protocolConfig)) { - Integer currentFrameLength = fieldParser.getTotalLength(protocolConfig, byteBufContent); + while (hasNextFullFrame(byteBufContent, protocolConfig, protocolFieldConfigProvider)) { + Integer currentFrameLength = protocolFieldConfigProvider.getTotalLength(byteBufContent, protocolConfig); byteBufContent.readBytes(currentFrameLength); ByteBuf currentbyteBuf = byteBufContent.slice(0, byteBufContent.readerIndex()); byteBufContent.markReaderIndex();//读的标志位前移 System.out.println(ByteBufUtil.hexDump(byteBufContent)); String hexDump = currentbyteBuf.toString(Charset.forName("ISO-8859-1")); //获取当前固定帧结构的关系map - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, currentbyteBuf); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(currentbyteBuf, protocolConfig); if (StringUtils.isEmpty(mergeFrameStr)) { //首次获取业务数据报文 mergeFrameStr += hexDump.substring(0, currentFrameFixedProperty.get("tailPosition")); @@ -95,22 +94,22 @@ /** * 获取平移到下一帧起始位置 */ - public int getNextFrameOffset(ByteBuf buffer, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, buffer); - return currentFrameFixedProperty.get("totalLength"); + public int getNextFrameOffset(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + return currentFrameFixedProperty.get(TOTAL_LENGTH); } /** * 判断是否出错进行整个帧的 */ - public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, byteBuf); + public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); //保证读取位置不在固定位置,是可变的业务内容 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("fixedPosition")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(FIXED_POSITION)) { return false; } //判断读取是否操作帧长度 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("totalLength")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(TOTAL_LENGTH)) { return false; } return true; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 76a3784..c3a1bab 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -1,50 +1,50 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.parser.instance.GeneralProcessor; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; +import io.netty.buffer.ByteBufUtil;; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(2) -@Service +@Component public class FrameTailMatcher implements FrameStructMatcher { - @Resource - private FieldConfigDao fieldConfigDao; - @Autowired - private GeneralProcessor generalProcessor; - //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig tailFieldConfig = StringUtils.isEmpty(protocolConfig.getTailStr()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getTailStr()); - if (!ObjectUtil.isEmpty(tailFieldConfig)) { - String tailStr = tailFieldConfig.getFieldName(); + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfig protocolFieldConfig = ObjectUtils.isEmpty(protocolConfig.getTailStr()) ? null : + fieldConfigProvider.getFieldConfigById(protocolConfig.getTailStr()); + if (!ObjectUtil.isEmpty(protocolFieldConfig)) { + String tailStr = protocolFieldConfig.getFieldName(); String dataGramContent = ByteBufUtil.hexDump(byteBuf); Boolean tailFlag = ByteBufUtil.hexDump(byteBuf).contains(tailStr); if (!tailFlag) { //使用esayRule return null; } else if (dataGramContent.indexOf(tailStr) < dataGramContent.length() - tailStr.length()) { Integer length = dataGramContent.indexOf(tailStr) + tailStr.length(); - ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, protocolConfig, length); + ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, length); return wholeDatagramByte; //存在粘包 } } return null; } - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer length) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, Integer length) { byteBuf.readBytes(length); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, length - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java new file mode 100644 index 0000000..5f1c177 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java @@ -0,0 +1,73 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.combined.GenericCombinedFieldResolver; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.CombinedFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class CombinedFieldConfigProvider { + + + /** + * 作为临时配置列表缓存使用 + */ + private final List combinedFieldConfigList; + private Map storeObjectMap = new HashMap<>(); + + public CombinedFieldConfigProvider(Long ruleId) { + CombinedFieldConfigRegistry combinedFieldConfigRegistry = SpringContextUtil.getBean(CombinedFieldConfigRegistry.class); + combinedFieldConfigList = combinedFieldConfigRegistry.getCombinedFieldConfigList(ruleId); + } + + public void parseDataField(RuleConfig ruleConfig, String clearZeroPlain,Map fieldConfigsMap ) { + if (showSkip()) { + return; + } + //匹配对应的数据,然后进行相关的字段解析 + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver(); + combinedFieldResolver.parseDataField(combinedFieldConfigList, byteBuf, storeObjectMap,fieldConfigsMap); + } + + + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getCombinedFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return combinedFieldConfigList.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public List getCombinedFieldConfigList() { + return combinedFieldConfigList; + } + + /* 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(combinedFieldConfigList) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java new file mode 100644 index 0000000..f3cfedc --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java @@ -0,0 +1,11 @@ +package com.casic.missiles.parser.provider; + +/** + * @author cz + * @date 2023-6-12 + */ +public class CommandEventProvider{ + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java new file mode 100644 index 0000000..70eec5e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java @@ -0,0 +1,77 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.safe.SafeStrategy; +import com.casic.missiles.parser.sender.DataSubscribeProvider; +import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class DatagramEventProvider { + + private final DatagramEventConfig processorInstance; + + public DatagramEventProvider(Long ruleId) { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + List datagramEventConfigList = + datagramEventRegistry.getDatagramEventList(ruleId); + processorInstance = this.getProcessorInstance(datagramEventConfigList); + } + + public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { + if (showSkip()) { + return null; + } + return datagramEventConfigList.get(0); + } + + // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 + public String getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap) { + String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? + processorInstance.getSafeBean() : + fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); + if (!StringUtils.isEmpty(safeName)) { + //需要加密 + SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); + String plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); + return clearComplementZero(plain); + } + return ByteBufUtil.hexDump(bizDataContent); + } + + //解密清零操作 + private String clearComplementZero(String plain) { + plain = plain.substring(0, plain.lastIndexOf("00")); + return plain; + } + + //数据发送,数据发送者暂未构建 + public void storeData(Map bizDataMap) { + DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); +// dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return ObjectUtils.isNotEmpty(processorInstance) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java new file mode 100644 index 0000000..7e1fe0a --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java @@ -0,0 +1,97 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.FieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class FieldConfigProvider { + + + private final List fieldConfigs; + private Map storeObjectMap = new HashMap<>(); +// private Map singleObjects = new ConcurrentHashMap<>(); + + public FieldConfigProvider(Long ruleId) { + FieldConfigRegistry fieldConfigRegistry = SpringContextUtil.getBean(FieldConfigRegistry.class); + fieldConfigs = fieldConfigRegistry.getFieldConfigList(ruleId); + } + + public List getFieldConfigs() { + return fieldConfigs; + } + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public Map parseDataField(RuleConfig ruleConfig, String clearZeroPlain) { + if (showSkip()) { + return null; + } + List prepareFieldConfig = prepareParseField(ruleConfig); + if (CollectionUtils.isNotEmpty(prepareFieldConfig)) { + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(fieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + return fixDataMap; + } + } + return null; + } + + /** + * 得到需要处理的业务内容 + * + * @return + */ + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return fieldConfigs.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public Map getFieldConfigsMap() { + return fieldConfigs.stream().collect( + Collectors.toMap(FieldConfig::getId, e -> e) + ); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(fieldConfigs) ? false : true; + } + + +} + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java new file mode 100644 index 0000000..817bfaf --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java @@ -0,0 +1,19 @@ +package com.casic.missiles.parser.provider; + +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.registry.FieldRuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; + +public class FieldRuleConfigProvider { + + private final List fieldRuleConfigList; + + public FieldRuleConfigProvider(Long ruleId) { + FieldRuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(FieldRuleConfigRegistry.class); + fieldRuleConfigList = ruleConfigRegistry.getFieldRuleConfigList(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java new file mode 100644 index 0000000..99a1b06 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java @@ -0,0 +1,53 @@ +package com.casic.missiles.parser.provider; + + +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.registry.ProtocolConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolConfigProvider { + + private final List protocolConfigList; + + public ProtocolConfigProvider(String firstChar) { + ProtocolConfigRegistry registry = SpringContextUtil.getBean(ProtocolConfigRegistry.class); + protocolConfigList = registry.getProtocolConfigList(firstChar); + } + + public List getMatchList() { + return protocolConfigList; + } + + /** + * 设置当前协议 + * + * @param protocolConfig + */ + public ProtocolConfigProvider(ProtocolConfig protocolConfig) { + List protocolConfigs = new ArrayList<>(); + protocolConfigs.add(protocolConfig); + protocolConfigList = protocolConfigs; + } + + /** + * 获取当前协议 + * + * @return + */ + public ProtocolConfig getCurrentProtocolConfig() { + if (this.protocolConfigList == null) { + return null; + } else { + return protocolConfigList.get(0); + } + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java new file mode 100644 index 0000000..043927d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java @@ -0,0 +1,213 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.registry.ProtocolFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolFieldConfigProvider { + + private static final String FIXED_FIELD_DS = "fixedFieldDs"; + private static final String CONTENT_FIELD_DS = "contentFieldDs"; + private static final String PROTOCOL_LENGTH = "protocolLength"; + private static final String PROTOCOL_FIELD_ID = "protocolFieldId"; + private static final String PROTOCOL_POSITION = "protocolPosition"; + + private final List protocolFieldConfigs; + private Map singleObjects = new ConcurrentHashMap<>(); + private Map storeObjectMap = new HashMap<>(); + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public ProtocolFieldConfigProvider(Long protocolId) { + ProtocolFieldConfigRegistry protocolFieldConfigRegistry = SpringContextUtil.getBean(ProtocolFieldConfigRegistry.class); + protocolFieldConfigs = protocolFieldConfigRegistry.getProtocolFieldConfigList(protocolId); + } + + public List getProtocolFieldConfigs() { + return protocolFieldConfigs; + } + + public ProtocolFieldConfig getFieldConfigById(Long fieldId) { + Optional optionalConfig = protocolFieldConfigs.stream().filter( + e -> e.getId().equals(fieldId) + ).findFirst(); + return optionalConfig.isPresent() ? optionalConfig.get() : null; + } + + public Integer getProtocolFieldValue(Long protocolFieldId, ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_FIELD_ID + protocolFieldId + ByteBufUtil.hexDump(byteBuf); + //获取缓存 + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + //加载固定长度数据集合 + Map fixDataMap = this.getProtocolDataMap(byteBuf); + ProtocolFieldConfig protocolFieldConfig = selectFieldConfig(protocolFieldId); + Integer protocolFieldValue = 0; + //获取约定字段的总长度 + if (fixDataMap.containsKey(protocolFieldConfig.getFieldName())) { + Object appointUnpackObject = fixDataMap.get(protocolFieldConfig.getFieldName()); + if (ObjectUtils.isNotEmpty(appointUnpackObject)) { + protocolFieldValue = (Integer) appointUnpackObject; + } + } + if (protocolFieldValue != null) { + //加入缓存 + if (ObjectUtils.isNotEmpty(protocolFieldValue)) { + this.singleObjects.put(catchKey, protocolFieldValue); + return protocolFieldValue; + } + } + return null; + } + + /** + * 获取帧固定位置信息 + * + * @param byteBuf + * @param protocolConfig + * @return + */ + public Map getFixedProperty(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_POSITION + protocolConfig.getId(); + if (this.singleObjects.containsKey(catchKey)) { + return (Map) singleObjects.get(catchKey); + } + Map fixedPropertyMap = new HashMap<>(); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + fixedPropertyMap = fieldParser.doGetFixedProperty(protocolFieldConfigs, this.getTotalLength(byteBuf,protocolConfig)); + if (CollectionUtils.isNotEmpty(fixedPropertyMap)) { + this.singleObjects.put(catchKey, fixedPropertyMap); + return fixedPropertyMap; + } + return fixedPropertyMap; + } + + /** + * 获取帧结构应有的总长度 + */ + public Integer getTotalLength(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_LENGTH + ByteBufUtil.hexDump(byteBuf); + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + Integer appointFrameLength = getProtocolFieldValue(protocolConfig.getTotalLengthId(), byteBuf); + if (appointFrameLength != null) { + //获取过滤的字段集合总长度 + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Integer totalFilterLength = fieldParser.getTotalFilterLength(protocolConfig, byteBuf, getFixFieldConfigMap()); + //计算总长度 + Integer totalLength = appointFrameLength + totalFilterLength; + //加入缓存 + if (ObjectUtils.isNotEmpty(totalLength)) { + this.singleObjects.put(catchKey, totalLength); + return totalLength; + } + } + return null; + } + + /** + * 获取协议有关字段解析内容 + * storeObjectMap存储代转存的数据 + * + * @return + */ + public Map getProtocolDataMap(ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(FIXED_FIELD_DS)) { + return (Map) singleObjects.get(FIXED_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(protocolFieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + this.singleObjects.put(FIXED_FIELD_DS, fixDataMap); + return fixDataMap; + } + return null; + } + + /** + * 获取业务报文内容的content字节 + * + * @param wholeDatagramByte + * @return + */ + public ByteBuf getDataContentBuf(ByteBuf wholeDatagramByte) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(CONTENT_FIELD_DS)) { + return (ByteBuf) singleObjects.get(CONTENT_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + ByteBuf bizDataByteBuf = fieldParser.getDataContentBuf(protocolFieldConfigs, wholeDatagramByte); + if (bizDataByteBuf != null) { + this.singleObjects.put(CONTENT_FIELD_DS, bizDataByteBuf); + return bizDataByteBuf; + } + return null; + } + + + private ProtocolFieldConfig selectFieldConfig(Long id) { + Optional optionalProtocolFieldConfig = this.protocolFieldConfigs.stream().filter( + e -> e.getId().equals(id) + ).findFirst(); + return optionalProtocolFieldConfig.isPresent() ? optionalProtocolFieldConfig.get() : null; + } + + + private Map getFixFieldConfigMap() { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, e -> e) + ); + return fixDataFieldMap; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(protocolFieldConfigs) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java new file mode 100644 index 0000000..dafba1c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java @@ -0,0 +1,56 @@ +package com.casic.missiles.parser.provider; + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.rule.GenericRuleResolver; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.RuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleConfigProvider { + + private final List ruleConfigs; + + public List getRuleConfigs() { + return ruleConfigs; + } + + public RuleConfigProvider(Long protocolId) { + RuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(RuleConfigRegistry.class); + ruleConfigs = ruleConfigRegistry.getRuleConfigById(protocolId); + } + + /** + * 获取规则匹配结果 + * + * @param parseFixedDataMap + * @param protocolFieldConfigs + * @return + */ + public RuleConfig doGetRule(Map parseFixedDataMap, + String ids, + List protocolFieldConfigs) { + if (showSkip()) { + return null; + } + RuleConfig ruleConfig = GenericRuleResolver.machRule(parseFixedDataMap, ids, protocolFieldConfigs, ruleConfigs); + return ruleConfig; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(ruleConfigs) ? false : true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java index 3c05891..856b399 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java @@ -1,18 +1,11 @@ package com.casic.missiles.parser.resolver; -import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.springframework.web.bind.annotation.RequestBody; -import javax.annotation.Resource; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -20,19 +13,17 @@ @Slf4j public class ByteMergeProvider { - @Resource - private FieldRuleEngineMapper fieldRuleEngineMapper; - //拿到所有的值合并到一个值 - public String resolveByteMerge(List valueList, String ruletypeId, String vaildRange) { + public static String resolveByteMerge(List valueList, String ruleTypeId, String vaildRange) { String values = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Map vaildMap = getValidRangeMap(vaildRange); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(ruletypeId); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } + //暂时不处理 +// fieldRuleEngine = fieldRuleConfigMapper.selectById(ruleTypeId); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } Map env2 = new HashMap(); for (int i = 0; i < valueList.size(); i++) { if (vaildMap.containsKey(i)) { @@ -47,7 +38,7 @@ } } - private Map getValidRangeMap(String vaildRange) { + private static Map getValidRangeMap(String vaildRange) { String[] range = vaildRange.split(","); Map vaildMap = new HashMap(); for (int i = 0; i < range.length; i++) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java index 608af3a..32cc8a4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java @@ -2,48 +2,47 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.delivery.decorator.ByteDecorator; +import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @AllArgsConstructor public class FieldDecoratorManger { - private final RuleDictDao ruleDictDao; + private final RuleConfigRegistry ruleDictDao; // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 // (1)静态的业务字段是字典里面可以配置的 // (2)动态的业务字段是通过规则生成的 public String contentMerge(String ruleJson, String sceneConent, String dynamicContent) { - List ruleDictList = ruleDictDao.getRuleDictConfig(); - Map ruleDictMap = ruleDictList.stream().collect( - Collectors.toMap(RuleDict::getId, e -> e)); - List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); - for (Map ruleMap : ruleMapList) { - String ruleType = String.valueOf(ruleMap.get("ruleType")); - ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); - NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); - byteDecorator.nodeDecoratorRule(nodeDecoratorParm); - } +// List ruleDictList = ruleDictDao.getRuleDictConfig(); +// Map ruleDictMap = ruleDictList.stream().collect( +// Collectors.toMap(RuleDict::getId, e -> e)); +// List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); +// for (Map ruleMap : ruleMapList) { +// String ruleType = String.valueOf(ruleMap.get("ruleType")); +// ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); +// NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); +// byteDecorator.nodeDecoratorRule(nodeDecoratorParm); +// } return null; } - - private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { - NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() - .contents(sceneConent) - .dynamicContent(dynamicContent) - .ruletypeId(ruletypeId) - .ruleDictMap(ruleDictMap) - .build(); - return nodeDecoratorParm; - } +// +// private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { +// NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() +// .contents(sceneConent) +// .dynamicContent(dynamicContent) +// .ruletypeId(ruletypeId) +// .ruleDictMap(ruleDictMap) +// .build(); +// return nodeDecoratorParm; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java index 652970c..b204ac3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java @@ -1,56 +1,56 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@AllArgsConstructor -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", - JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Component; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Component("logicalDecorator") +//@AllArgsConstructor +//@Slf4j +//public class LogicalShiftDecorator implements ByteDecorator { +// +//// private final FieldRuleEngineMapper fieldRuleEngineMapper; +//// +//// //字节位移 +//// @Override +//// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +//// String logicalValue = ""; +//// RuleEvaluator fieldRuleEngine = new RuleEvaluator(); +//// try { +//// Map env2 = new HashMap(); +//// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +//// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +//// for (String contentId : contentIdList) { +//// RuleDict ruleDict = ruleDictMap.get(contentId); +//// if (ruleDict.getCode().contains("#")) { +//// //使用动态的值 +//// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +//// } +//// env2.put(ruleDict.getName(), ruleDict.getCode()); +//// } +//// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +//// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +//// return null; +//// } +//// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +//// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +//// return values; +//// } catch (Exception ex) { +//// log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", +//// JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +//// return null; +//// } +//// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java index 346468f..822fead 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@AllArgsConstructor -@Slf4j -public class OperationDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("optionDecorator") +//@AllArgsConstructor +//@Slf4j +//public class OperationDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //混合运算,有常量或者乘除的缩放 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java index 50fb0a7..7a8bccb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@AllArgsConstructor -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +////精度计算 +//@AllArgsConstructor +//@Registry("precisionDecorator") +//@Slf4j +//public class PrecisionDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java index da39235..27f9cc7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java @@ -1,54 +1,53 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@AllArgsConstructor -@Slf4j -public class RuleDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("ruleDecorator") +//@AllArgsConstructor +//@Slf4j +//public class RuleDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //吃我一套正则表达式 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (Exception ex) { +// log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java index 7f5cbf3..c043f97 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java @@ -2,6 +2,6 @@ import java.util.Map; -public interface ComandeEventService { +public interface ComandeEventService{ Map loadComandeEventConfig(String protocolId,String scene); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java index 476ad84..aaf1837 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java @@ -2,46 +2,46 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.dao.CommandEventDao; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @Slf4j @AllArgsConstructor -public class ComandeEventServiceImpl implements ComandeEventService { +public class ComandeEventServiceImpl implements ComandeEventRegistry { - private final CommandEventDao commandEventDao; + // private final CommandEventDao commandEventDao; // 加密bean 固定字段出现变化的字段解析,业务字段的有序内容 @Override - public Map loadComandeEventConfig(String protocolId,String sceneName) { - CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); - if (ObjectUtil.isEmpty(commandEventConfig)) { - log.error("协议{},没有配置成功接收回复配置,清排查原因"); - return null; - } - String replyJson = commandEventConfig.getReplyContentJson(); - List> replyMapList = JSONArray.parseObject(replyJson, List.class); - List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); - Map fixMap = fixList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); - List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) - .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) - .collect(Collectors.toList()); - Map commandConfigMap = new HashMap<>(); - commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); - commandConfigMap.put("fixContent", fixMap); - commandConfigMap.put("bizContent", contentList); - return commandConfigMap; + public Map loadComandeEventConfig(String protocolId, String sceneName) { +// CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); +// if (ObjectUtil.isEmpty(commandEventConfig)) { +// log.error("协议{},没有配置成功接收回复配置,清排查原因"); +// return null; +// } +// String replyJson = commandEventConfig.getReplyContentJson(); +// List> replyMapList = JSONArray.parseObject(replyJson, List.class); +// List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); +// Map fixMap = fixList.stream() +// .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); +// List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) +// .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) +// .collect(Collectors.toList()); +// Map commandConfigMap = new HashMap<>(); +// commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); +// commandConfigMap.put("fixContent", fixMap); +// commandConfigMap.put("bizContent", contentList); +// return commandConfigMap; + return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 128b09d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java deleted file mode 100644 index 4016b0b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface DatagramEventMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java deleted file mode 100644 index 597c306..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.apache.ibatis.annotations.Mapper; - -public interface FieldConfigMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java deleted file mode 100644 index a31680a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.PreRuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface PreRuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java deleted file mode 100644 index 9060a69..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface ProtocolConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java deleted file mode 100644 index 6fa6936..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java deleted file mode 100644 index 582a705..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleDict; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleDictMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java deleted file mode 100644 index 6e302c8..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.CommandEventMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Optional; - -@Component -public class CommandEventDao { - - @Resource - private CommandEventMapper commandEventMapper; - - public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId) - .eq("scene", sceneName) - .eq("enabled", 1); - List commandEventConfig = commandEventMapper.selectList(queryWrapper); - Optional optionalEventConfig = commandEventConfig.stream().findFirst(); - return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java deleted file mode 100644 index 9137e4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.FieldConfigMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class FieldConfigDao { - - @Resource - private FieldConfigMapper fieldConfigMapper; - - public FieldConfig getFieldConfigById(String fieldId) { - FieldConfig fieldConfig = fieldConfigMapper.selectById(fieldId); - return fieldConfig; - } - - public List getFieldConfigs(String protocolId,Integer isFixed) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",isFixed); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - - public List getStorageFieldConfig(String protocolId) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",1) - .eq("is_storage",1); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java deleted file mode 100644 index 67bff6b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.mapper.PreRuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class PreRuleConfigDao { - - @Resource - private PreRuleConfigMapper preRuleConfigMapper; - - public List getPreRuleList(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return preRuleConfigMapper.selectList(queryWrapper); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java deleted file mode 100644 index d69ea85..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.RuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleConfigDao { - - @Resource - private RuleConfigMapper ruleConfigMapper; - - public RuleConfig getNextRuleConfig(String ruleFields) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("parse_rule_json", ruleFields); - return ruleConfigMapper.selectOne(queryWrapper); - } - - - public List getRuleConfigById(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return ruleConfigMapper.selectList(queryWrapper); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java deleted file mode 100644 index 932c185..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.RuleDictMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleDictDao { - - @Resource - private RuleDictMapper ruleDictMapper; - - public List getRuleDictConfig() { - List ruleDictList = ruleDictMapper.selectList(null); - return ruleDictList; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java index 9f9e279..43bc4d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java @@ -10,20 +10,15 @@ import io.netty.channel.socket.nio.NioServerSocketChannel; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import javax.annotation.PreDestroy; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static cn.hutool.core.util.ClassUtil.getClasses; /** * SensorhubServer netty服务端 */ @Slf4j -@Service +@Component public class SensorhubServer { /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java index 2c79ff5..9a28c36 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java @@ -11,13 +11,13 @@ import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioSocketChannel; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClient 客户端 */ @Slf4j -@Service +@Registry public final class SensorhubClient { public static void main(String[] args) throws Exception { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java index 9774be0..477c3f7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java @@ -6,12 +6,12 @@ import io.netty.channel.socket.SocketChannel; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientChannelInitialHandler */ -@Service +@Registry public class SensorhubClientChannelInitialHandler extends ChannelInitializer { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java index 346f4b3..73560e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java @@ -5,13 +5,13 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientHandler */ @Slf4j -@Service +@Registry public class SensorhubClientHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java index 5c1c6f2..d990af5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java @@ -4,12 +4,12 @@ import com.casic.missiles.pojo.Msg; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** * SensorhubServerHandler */ -@Service +@Component public class SensorhubServerHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 67283ae..af3172c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,41 +1,37 @@ package com.casic.missiles.parser; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultProtocolConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.*; +import com.casic.missiles.registry.FieldConfigRegistry; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; -import java.nio.charset.Charset; import java.util.HashMap; import java.util.List; import java.util.Map; -@Service("genericProtocolParser") +/** + * @author + */ +@Component("genericProtocolParser") @Slf4j -@AllArgsConstructor +@RequiredArgsConstructor public class GenericProtocolParser implements ProtocolParser { - private final LeadingCodeMatcher leadingCodeMatcher; private final List frameStructDispenserList; - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorInstanceSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; // 匹配首字母前导码=> 帧结构匹配前导码=> // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 @@ -44,18 +40,19 @@ public Boolean doParseProtocol(ByteBuf byteBuf) { String protocolContent = ByteBufUtil.hexDump(byteBuf); //匹配前导码 - List preCodeConfigs = leadingCodeMatcher.matchLeadingCode(protocolContent); + List preCodeConfigs = LeadingCodeMatcher.matchFrameLeadingCode(protocolContent); //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 if (preCodeConfigs.size() == 0) { - return rematch(byteBuf,protocolContent); + return rematch(byteBuf, protocolContent); } - //暂时先取第一个 + //暂时先取第一个,提升速度,使用享元模式, 减少类的创建销毁与构建 ProtocolConfig protocolConfig = preCodeConfigs.get(0); + AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); ByteBuf wholeDatagramByte = null; //通过匹配帧结构获取完整的数据包 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, preCodeConfigs.get(0))) != null) { + if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, protocolFactory)) != null) { break; } } @@ -68,76 +65,78 @@ * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 */ - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId, wholeDatagramByte); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap, protocolId); - //选取规则对应的流程实例 - DatagramEventConfig datagramEventConfig = processorInstanceSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); + //进行规则字段解析,进行匹配规则 + RuleConfig ruleConfig = getRuleConfig(protocolFactory, wholeDatagramByte); + if (ruleConfig == null) { + return false; + } //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, wholeDatagramByte); + ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte); + //以下进行业务的规则解析,同时选定流程实例 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); + DatagramEventProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain, + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText, protocolId); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain); //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); + datagramEventProvider.storeData(bizDataMap); return true; } - private Boolean rematch(ByteBuf byteBuf,String protocolContent) { + /** + * 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 + */ + private Boolean rematch(ByteBuf byteBuf, String protocolContent) { //重置位判断 byteBuf.resetReaderIndex(); //判断重置是否前移,如果没有前移,则直接判为匹配失败 if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { return false; } else { + //递归执行 return doParseProtocol(byteBuf); } } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; + //获取匹配规则->匹配规则 + private RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + //取出其中参与逻辑provider并判空 + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); + String rulePrepareFields = protocolConfig.getRulePrepareFields(); + //固定字段 + if (StringUtils.isNotEmpty(rulePrepareFields)) { + //获取统一固定字段解析 + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + //获取该协议的字段配置,用于协议规则匹配 + List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); + //获取规则 + RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, + rulePrepareFields, protocolFieldConfigs); + return ruleConfig; + } + return null; } - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + //数据构建,获取固定字段的store和业务字段store + private Map buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + Map bizDataMap = new HashMap<>(); + Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); + Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); + bizDataMap.putAll(ruleStoreObjectMap); + bizDataMap.putAll(protocolStoreObjectMap); return bizDataMap; } - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java index 8a46e32..16ce2e5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java @@ -3,6 +3,7 @@ import io.netty.buffer.ByteBuf; public interface ProtocolParser { + Boolean doParseProtocol(ByteBuf byteBuf); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java new file mode 100644 index 0000000..f7814af --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java @@ -0,0 +1,35 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.ProtocolConfigProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.ProtocolConfig; + +/** + * 存放基本协议的的加载信息 + */ +public class AbstractProtocolConfigFactory { + private final ProtocolConfigProvider protocolConfigProvider; + private final ProtocolFieldConfigProvider protocolFieldConfigProvider; + private final RuleConfigProvider ruleConfigProvider; + + public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { + this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); + this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); + this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); + } + + public ProtocolConfigProvider getProtocolConfigProvider() { + return protocolConfigProvider; + } + + public ProtocolFieldConfigProvider getProtocolFieldConfigProvider() { + return protocolFieldConfigProvider; + } + + public RuleConfigProvider getRuleConfigProvider() { + return ruleConfigProvider; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java new file mode 100644 index 0000000..6e36147 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java @@ -0,0 +1,57 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.CombinedFieldConfigProvider; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.FieldConfigProvider; +import com.casic.missiles.parser.provider.FieldRuleConfigProvider; + +/** + * 存放规则相关的的的加载信息 + */ +public class AbstractRuleConfigFactory { + + /** + * 处理字节 + */ + private final FieldConfigProvider fieldConfigProvider; + /** + * 处理组合字节解析的解码器 + */ + private final CombinedFieldConfigProvider combinedFieldConfigProvider; + /** + * 处理负责字节解析的规则配置 + */ + private final FieldRuleConfigProvider fieldRuleConfigProvider; + /** + * 处理实例流程 + */ + private final DatagramEventProvider datagramEventProvider; + + + public AbstractRuleConfigFactory(Long ruleId) { + this.fieldConfigProvider = new FieldConfigProvider(ruleId); + this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); + this.fieldRuleConfigProvider = new FieldRuleConfigProvider(ruleId); + this.datagramEventProvider = new DatagramEventProvider(ruleId); + } + + public FieldConfigProvider getFieldConfigProvider() { + return fieldConfigProvider; + } + + public CombinedFieldConfigProvider getCombinedFieldConfigProvider() { + return combinedFieldConfigProvider; + } + + public FieldRuleConfigProvider getFieldRuleConfigProvider() { + return fieldRuleConfigProvider; + } + + public DatagramEventProvider getDatagramEventProvider() { + return datagramEventProvider; + } + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java deleted file mode 100644 index 6e1719a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.factory; - - -import com.casic.missiles.pojo.ProtocolConfig; - -import java.util.List; - -/** - * 数据库访问优化(暂时未做) - *

- * 1、初始化协议解析配置,并存放到处存放缓存,对协议基本配置进行管理 - * 2、其中流程中所有的配置都经过此类进行管理,进行调用获取,增强解析速度 - */ -public interface DatagramFactory { - - /** - * 初始化 - */ - List datagramInit(); - - /** - * 根据前导码配置匹配,模糊匹配获取所有的报文项 - */ - List match(); - - /** - * 根据前导码匹配,返回报文项 - */ - List filer(); - - /** - * 保证数据的唯一性选择器 - */ - List selectOne(); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java new file mode 100644 index 0000000..87444a0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java @@ -0,0 +1,18 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +import java.util.List; + +/** + * 直接用,还是边用边创建 + */ +public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { + + + public DefaultProtocolConfigFactory(ProtocolConfig protocolConfig) { + super(protocolConfig); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java new file mode 100644 index 0000000..cce0c7c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java @@ -0,0 +1,12 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; + +public class DefaultRuleFactory extends AbstractRuleConfigFactory { + + public DefaultRuleFactory(Long ruleId) { + super(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java deleted file mode 100644 index 9ee97e0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.casic.missiles.parser.instance; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service -@Slf4j -@AllArgsConstructor -public class GeneralProcessor { - - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; - - /** - * 统一固定字段解析=>进行规则的查询的判断 - * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 - * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 - */ - @Deprecated - public boolean parseWholeDatagram(ByteBuf buffer, ProtocolConfig protocolConfig) { - try { - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap,protocolId); - //选取规则对应的流程= - DatagramEventConfig datagramEventConfig = processorSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); - //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); - //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); - //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); - //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); - //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); - return true; - } catch (Exception ex) { - log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", - ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); - return false; - } - } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; - } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); - } - - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); - return bizDataMap; - } - - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java index 25e7ad8..6a5777e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java @@ -1,23 +1,31 @@ package com.casic.missiles.parser.instance.impl; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.mapper.DatagramEventMapper; import com.casic.missiles.pojo.DatagramEventConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.SpringContextUtil; -@Service -@AllArgsConstructor +import java.util.List; +import java.util.Optional; + +/** + * @author cz + * + */ public class DefaultProcessorInstanceSelector implements ProcessorInstanceSelector { - private final DatagramEventMapper datagramEventMapper; + private static List datagramEventConfigs; + + static { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + datagramEventConfigs = datagramEventRegistry.getDatagramEventList(); + } @Override public DatagramEventConfig getProcessorInstance(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("rule_id", protocolId); - return datagramEventMapper.selectOne(queryWrapper); + Optional optionalSelectInstance = datagramEventConfigs.stream() + .filter(e -> e.getId().equals(protocolId)).limit(1).findFirst(); + return optionalSelectInstance.isPresent() ? optionalSelectInstance.get() : null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a778671..7b56a43 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,16 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import io.netty.buffer.ByteBuf; /** - * 分析匹配情况 - * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 - * 2、匹配不成功,有后续帧,可以进行下次匹配。 - * 3、匹配不成功,无后续帧,可以进行丢弃。 + * 分析匹配情况 + * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 + * 2、匹配不成功,有后续帧,可以进行下次匹配。 + * 3、匹配不成功,无后续帧,可以进行丢弃。 */ -public interface FrameStructMatcher{ +public interface FrameStructMatcher { - ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig); + ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 05320ab..8ebea78 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,23 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.ProtocolConfigMapper; +import com.casic.missiles.parser.provider.ProtocolConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Component; import java.util.List; import java.util.stream.Collectors; -@Component -@AllArgsConstructor public class LeadingCodeMatcher { - private final ProtocolConfigMapper protocolMapper; - //** 1、首字母匹配前导码, // 2、以匹配出的前导码是否在报文中条件进行前导码的匹配二次筛选 - public List matchLeadingCode(String protocolContent){ + public static List matchFrameLeadingCode(String protocolContent){ List initialConfigs = initialMatch(protocolContent); List preCodeConfigs = initialConfigs.stream() .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) @@ -26,13 +19,16 @@ } //初始化匹配前导码内容 - private List initialMatch(String protocolContent) { - String protocolStr = protocolContent.charAt(0) + ""; - QueryWrapper queryWrapper = new QueryWrapper() - .likeRight("pre_fix", protocolStr); - List protocolConfigList = protocolMapper.selectList(queryWrapper); - return protocolConfigList; + private static List initialMatch(String protocolContent) { + String firstFrameChar = protocolContent.charAt(0) + ""; + ProtocolConfigProvider protocolConfigProvider=new ProtocolConfigProvider(firstFrameChar); + return protocolConfigProvider.getMatchList(); } + + + + + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index cf2113d..e915877 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -1,32 +1,35 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(0) -@Service +@Component public class FrameLengthMatcher implements FrameStructMatcher { - @Autowired - private FieldParser fieldParser; - //超过长度 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { String dataGramContent = ByteBufUtil.hexDump(byteBuf); - if (StringUtils.isEmpty(protocolConfig.getUnpackId()) && StringUtils.isEmpty(protocolConfig.getTailStr())) { - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + //当不存在结尾标志和拆包标志,可以直接使用长度进行匹配 + if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { if (dataGramContent.length() >= totalLength) {//等于长度返回true,超出长度,切断 - ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, protocolConfig, totalLength); + ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, totalLength); return wholeDatagramByte; } else { //读的标志位前移舍弃 @@ -38,7 +41,7 @@ return null; } - private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, Integer totalLength) { byteBuf.readBytes(totalLength); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, totalLength - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 2bfc213..d527ad0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; @@ -13,7 +13,7 @@ import lombok.AllArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.nio.charset.Charset; import java.util.Map; @@ -22,32 +22,30 @@ * 后续标志验证 */ @Order(1) -@Service +@Component @AllArgsConstructor -public class FrameMarkMatcher implements FrameStructMatcher { - - private final FieldConfigDao fieldConfigDao; - private final FieldParser fieldParser; - private final FieldResolver fieldResolverManger; +public class FrameMarkMatcher implements FrameStructMatcher, FixedPropertyEnum { //帧后续标志=>结束,进行帧的重组=>有后续,1、帧移位判别 2、继续接收帧 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig UnpackConfig = StringUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getUnpackId()); - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); - Integer upback = 0; + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); ByteBuf mergeWholeFrameByte = null; - if (!ObjectUtil.isEmpty(UnpackConfig)) { - while (hasNextFullFrame(byteBuf, protocolConfig)) { - upback = (Integer) fieldResolverManger.filedParserManger(byteBuf, UnpackConfig, null); + if (!ObjectUtil.isEmpty(unpackFlag)) { + while (hasNextFullFrame(byteBuf, protocolConfig, protocolFieldConfigProvider)) { //是否存在后续位 - if (upback == 1) {//使用esayRule + if (unpackFlag == 1) {//使用esayRule //表示可以截取 - mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolConfig, totalLength); + mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolFieldConfigProvider, protocolConfig); return mergeWholeFrameByte; } else { - byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig)); + byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig, protocolFieldConfigProvider)); } } } @@ -56,7 +54,8 @@ //选取第一个帧,将业务内容和后面部分分开 //计算数据报文-业务内容 - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolFieldConfigProvider protocolFieldConfigProvider, ProtocolConfig protocolConfig) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); //截取完整报文 byteBuf.readBytes(totalLength); ByteBuf byteBufContent = byteBuf.slice(0, byteBuf.readerIndex()); @@ -68,15 +67,15 @@ String tail = ""; System.out.println(ByteBufUtil.hexDump(byteBufContent)); //会存在多个帧拼接在一起的的情况,进行合并处理 - while (hasNextFullFrame(byteBufContent, protocolConfig)) { - Integer currentFrameLength = fieldParser.getTotalLength(protocolConfig, byteBufContent); + while (hasNextFullFrame(byteBufContent, protocolConfig, protocolFieldConfigProvider)) { + Integer currentFrameLength = protocolFieldConfigProvider.getTotalLength(byteBufContent, protocolConfig); byteBufContent.readBytes(currentFrameLength); ByteBuf currentbyteBuf = byteBufContent.slice(0, byteBufContent.readerIndex()); byteBufContent.markReaderIndex();//读的标志位前移 System.out.println(ByteBufUtil.hexDump(byteBufContent)); String hexDump = currentbyteBuf.toString(Charset.forName("ISO-8859-1")); //获取当前固定帧结构的关系map - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, currentbyteBuf); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(currentbyteBuf, protocolConfig); if (StringUtils.isEmpty(mergeFrameStr)) { //首次获取业务数据报文 mergeFrameStr += hexDump.substring(0, currentFrameFixedProperty.get("tailPosition")); @@ -95,22 +94,22 @@ /** * 获取平移到下一帧起始位置 */ - public int getNextFrameOffset(ByteBuf buffer, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, buffer); - return currentFrameFixedProperty.get("totalLength"); + public int getNextFrameOffset(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + return currentFrameFixedProperty.get(TOTAL_LENGTH); } /** * 判断是否出错进行整个帧的 */ - public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, byteBuf); + public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); //保证读取位置不在固定位置,是可变的业务内容 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("fixedPosition")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(FIXED_POSITION)) { return false; } //判断读取是否操作帧长度 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("totalLength")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(TOTAL_LENGTH)) { return false; } return true; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 76a3784..c3a1bab 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -1,50 +1,50 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.parser.instance.GeneralProcessor; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; +import io.netty.buffer.ByteBufUtil;; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(2) -@Service +@Component public class FrameTailMatcher implements FrameStructMatcher { - @Resource - private FieldConfigDao fieldConfigDao; - @Autowired - private GeneralProcessor generalProcessor; - //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig tailFieldConfig = StringUtils.isEmpty(protocolConfig.getTailStr()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getTailStr()); - if (!ObjectUtil.isEmpty(tailFieldConfig)) { - String tailStr = tailFieldConfig.getFieldName(); + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfig protocolFieldConfig = ObjectUtils.isEmpty(protocolConfig.getTailStr()) ? null : + fieldConfigProvider.getFieldConfigById(protocolConfig.getTailStr()); + if (!ObjectUtil.isEmpty(protocolFieldConfig)) { + String tailStr = protocolFieldConfig.getFieldName(); String dataGramContent = ByteBufUtil.hexDump(byteBuf); Boolean tailFlag = ByteBufUtil.hexDump(byteBuf).contains(tailStr); if (!tailFlag) { //使用esayRule return null; } else if (dataGramContent.indexOf(tailStr) < dataGramContent.length() - tailStr.length()) { Integer length = dataGramContent.indexOf(tailStr) + tailStr.length(); - ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, protocolConfig, length); + ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, length); return wholeDatagramByte; //存在粘包 } } return null; } - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer length) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, Integer length) { byteBuf.readBytes(length); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, length - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java new file mode 100644 index 0000000..5f1c177 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java @@ -0,0 +1,73 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.combined.GenericCombinedFieldResolver; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.CombinedFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class CombinedFieldConfigProvider { + + + /** + * 作为临时配置列表缓存使用 + */ + private final List combinedFieldConfigList; + private Map storeObjectMap = new HashMap<>(); + + public CombinedFieldConfigProvider(Long ruleId) { + CombinedFieldConfigRegistry combinedFieldConfigRegistry = SpringContextUtil.getBean(CombinedFieldConfigRegistry.class); + combinedFieldConfigList = combinedFieldConfigRegistry.getCombinedFieldConfigList(ruleId); + } + + public void parseDataField(RuleConfig ruleConfig, String clearZeroPlain,Map fieldConfigsMap ) { + if (showSkip()) { + return; + } + //匹配对应的数据,然后进行相关的字段解析 + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver(); + combinedFieldResolver.parseDataField(combinedFieldConfigList, byteBuf, storeObjectMap,fieldConfigsMap); + } + + + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getCombinedFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return combinedFieldConfigList.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public List getCombinedFieldConfigList() { + return combinedFieldConfigList; + } + + /* 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(combinedFieldConfigList) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java new file mode 100644 index 0000000..f3cfedc --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java @@ -0,0 +1,11 @@ +package com.casic.missiles.parser.provider; + +/** + * @author cz + * @date 2023-6-12 + */ +public class CommandEventProvider{ + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java new file mode 100644 index 0000000..70eec5e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java @@ -0,0 +1,77 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.safe.SafeStrategy; +import com.casic.missiles.parser.sender.DataSubscribeProvider; +import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class DatagramEventProvider { + + private final DatagramEventConfig processorInstance; + + public DatagramEventProvider(Long ruleId) { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + List datagramEventConfigList = + datagramEventRegistry.getDatagramEventList(ruleId); + processorInstance = this.getProcessorInstance(datagramEventConfigList); + } + + public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { + if (showSkip()) { + return null; + } + return datagramEventConfigList.get(0); + } + + // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 + public String getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap) { + String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? + processorInstance.getSafeBean() : + fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); + if (!StringUtils.isEmpty(safeName)) { + //需要加密 + SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); + String plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); + return clearComplementZero(plain); + } + return ByteBufUtil.hexDump(bizDataContent); + } + + //解密清零操作 + private String clearComplementZero(String plain) { + plain = plain.substring(0, plain.lastIndexOf("00")); + return plain; + } + + //数据发送,数据发送者暂未构建 + public void storeData(Map bizDataMap) { + DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); +// dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return ObjectUtils.isNotEmpty(processorInstance) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java new file mode 100644 index 0000000..7e1fe0a --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java @@ -0,0 +1,97 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.FieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class FieldConfigProvider { + + + private final List fieldConfigs; + private Map storeObjectMap = new HashMap<>(); +// private Map singleObjects = new ConcurrentHashMap<>(); + + public FieldConfigProvider(Long ruleId) { + FieldConfigRegistry fieldConfigRegistry = SpringContextUtil.getBean(FieldConfigRegistry.class); + fieldConfigs = fieldConfigRegistry.getFieldConfigList(ruleId); + } + + public List getFieldConfigs() { + return fieldConfigs; + } + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public Map parseDataField(RuleConfig ruleConfig, String clearZeroPlain) { + if (showSkip()) { + return null; + } + List prepareFieldConfig = prepareParseField(ruleConfig); + if (CollectionUtils.isNotEmpty(prepareFieldConfig)) { + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(fieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + return fixDataMap; + } + } + return null; + } + + /** + * 得到需要处理的业务内容 + * + * @return + */ + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return fieldConfigs.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public Map getFieldConfigsMap() { + return fieldConfigs.stream().collect( + Collectors.toMap(FieldConfig::getId, e -> e) + ); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(fieldConfigs) ? false : true; + } + + +} + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java new file mode 100644 index 0000000..817bfaf --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java @@ -0,0 +1,19 @@ +package com.casic.missiles.parser.provider; + +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.registry.FieldRuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; + +public class FieldRuleConfigProvider { + + private final List fieldRuleConfigList; + + public FieldRuleConfigProvider(Long ruleId) { + FieldRuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(FieldRuleConfigRegistry.class); + fieldRuleConfigList = ruleConfigRegistry.getFieldRuleConfigList(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java new file mode 100644 index 0000000..99a1b06 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java @@ -0,0 +1,53 @@ +package com.casic.missiles.parser.provider; + + +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.registry.ProtocolConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolConfigProvider { + + private final List protocolConfigList; + + public ProtocolConfigProvider(String firstChar) { + ProtocolConfigRegistry registry = SpringContextUtil.getBean(ProtocolConfigRegistry.class); + protocolConfigList = registry.getProtocolConfigList(firstChar); + } + + public List getMatchList() { + return protocolConfigList; + } + + /** + * 设置当前协议 + * + * @param protocolConfig + */ + public ProtocolConfigProvider(ProtocolConfig protocolConfig) { + List protocolConfigs = new ArrayList<>(); + protocolConfigs.add(protocolConfig); + protocolConfigList = protocolConfigs; + } + + /** + * 获取当前协议 + * + * @return + */ + public ProtocolConfig getCurrentProtocolConfig() { + if (this.protocolConfigList == null) { + return null; + } else { + return protocolConfigList.get(0); + } + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java new file mode 100644 index 0000000..043927d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java @@ -0,0 +1,213 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.registry.ProtocolFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolFieldConfigProvider { + + private static final String FIXED_FIELD_DS = "fixedFieldDs"; + private static final String CONTENT_FIELD_DS = "contentFieldDs"; + private static final String PROTOCOL_LENGTH = "protocolLength"; + private static final String PROTOCOL_FIELD_ID = "protocolFieldId"; + private static final String PROTOCOL_POSITION = "protocolPosition"; + + private final List protocolFieldConfigs; + private Map singleObjects = new ConcurrentHashMap<>(); + private Map storeObjectMap = new HashMap<>(); + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public ProtocolFieldConfigProvider(Long protocolId) { + ProtocolFieldConfigRegistry protocolFieldConfigRegistry = SpringContextUtil.getBean(ProtocolFieldConfigRegistry.class); + protocolFieldConfigs = protocolFieldConfigRegistry.getProtocolFieldConfigList(protocolId); + } + + public List getProtocolFieldConfigs() { + return protocolFieldConfigs; + } + + public ProtocolFieldConfig getFieldConfigById(Long fieldId) { + Optional optionalConfig = protocolFieldConfigs.stream().filter( + e -> e.getId().equals(fieldId) + ).findFirst(); + return optionalConfig.isPresent() ? optionalConfig.get() : null; + } + + public Integer getProtocolFieldValue(Long protocolFieldId, ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_FIELD_ID + protocolFieldId + ByteBufUtil.hexDump(byteBuf); + //获取缓存 + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + //加载固定长度数据集合 + Map fixDataMap = this.getProtocolDataMap(byteBuf); + ProtocolFieldConfig protocolFieldConfig = selectFieldConfig(protocolFieldId); + Integer protocolFieldValue = 0; + //获取约定字段的总长度 + if (fixDataMap.containsKey(protocolFieldConfig.getFieldName())) { + Object appointUnpackObject = fixDataMap.get(protocolFieldConfig.getFieldName()); + if (ObjectUtils.isNotEmpty(appointUnpackObject)) { + protocolFieldValue = (Integer) appointUnpackObject; + } + } + if (protocolFieldValue != null) { + //加入缓存 + if (ObjectUtils.isNotEmpty(protocolFieldValue)) { + this.singleObjects.put(catchKey, protocolFieldValue); + return protocolFieldValue; + } + } + return null; + } + + /** + * 获取帧固定位置信息 + * + * @param byteBuf + * @param protocolConfig + * @return + */ + public Map getFixedProperty(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_POSITION + protocolConfig.getId(); + if (this.singleObjects.containsKey(catchKey)) { + return (Map) singleObjects.get(catchKey); + } + Map fixedPropertyMap = new HashMap<>(); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + fixedPropertyMap = fieldParser.doGetFixedProperty(protocolFieldConfigs, this.getTotalLength(byteBuf,protocolConfig)); + if (CollectionUtils.isNotEmpty(fixedPropertyMap)) { + this.singleObjects.put(catchKey, fixedPropertyMap); + return fixedPropertyMap; + } + return fixedPropertyMap; + } + + /** + * 获取帧结构应有的总长度 + */ + public Integer getTotalLength(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_LENGTH + ByteBufUtil.hexDump(byteBuf); + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + Integer appointFrameLength = getProtocolFieldValue(protocolConfig.getTotalLengthId(), byteBuf); + if (appointFrameLength != null) { + //获取过滤的字段集合总长度 + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Integer totalFilterLength = fieldParser.getTotalFilterLength(protocolConfig, byteBuf, getFixFieldConfigMap()); + //计算总长度 + Integer totalLength = appointFrameLength + totalFilterLength; + //加入缓存 + if (ObjectUtils.isNotEmpty(totalLength)) { + this.singleObjects.put(catchKey, totalLength); + return totalLength; + } + } + return null; + } + + /** + * 获取协议有关字段解析内容 + * storeObjectMap存储代转存的数据 + * + * @return + */ + public Map getProtocolDataMap(ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(FIXED_FIELD_DS)) { + return (Map) singleObjects.get(FIXED_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(protocolFieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + this.singleObjects.put(FIXED_FIELD_DS, fixDataMap); + return fixDataMap; + } + return null; + } + + /** + * 获取业务报文内容的content字节 + * + * @param wholeDatagramByte + * @return + */ + public ByteBuf getDataContentBuf(ByteBuf wholeDatagramByte) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(CONTENT_FIELD_DS)) { + return (ByteBuf) singleObjects.get(CONTENT_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + ByteBuf bizDataByteBuf = fieldParser.getDataContentBuf(protocolFieldConfigs, wholeDatagramByte); + if (bizDataByteBuf != null) { + this.singleObjects.put(CONTENT_FIELD_DS, bizDataByteBuf); + return bizDataByteBuf; + } + return null; + } + + + private ProtocolFieldConfig selectFieldConfig(Long id) { + Optional optionalProtocolFieldConfig = this.protocolFieldConfigs.stream().filter( + e -> e.getId().equals(id) + ).findFirst(); + return optionalProtocolFieldConfig.isPresent() ? optionalProtocolFieldConfig.get() : null; + } + + + private Map getFixFieldConfigMap() { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, e -> e) + ); + return fixDataFieldMap; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(protocolFieldConfigs) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java new file mode 100644 index 0000000..dafba1c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java @@ -0,0 +1,56 @@ +package com.casic.missiles.parser.provider; + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.rule.GenericRuleResolver; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.RuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleConfigProvider { + + private final List ruleConfigs; + + public List getRuleConfigs() { + return ruleConfigs; + } + + public RuleConfigProvider(Long protocolId) { + RuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(RuleConfigRegistry.class); + ruleConfigs = ruleConfigRegistry.getRuleConfigById(protocolId); + } + + /** + * 获取规则匹配结果 + * + * @param parseFixedDataMap + * @param protocolFieldConfigs + * @return + */ + public RuleConfig doGetRule(Map parseFixedDataMap, + String ids, + List protocolFieldConfigs) { + if (showSkip()) { + return null; + } + RuleConfig ruleConfig = GenericRuleResolver.machRule(parseFixedDataMap, ids, protocolFieldConfigs, ruleConfigs); + return ruleConfig; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(ruleConfigs) ? false : true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java index 3c05891..856b399 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java @@ -1,18 +1,11 @@ package com.casic.missiles.parser.resolver; -import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.springframework.web.bind.annotation.RequestBody; -import javax.annotation.Resource; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -20,19 +13,17 @@ @Slf4j public class ByteMergeProvider { - @Resource - private FieldRuleEngineMapper fieldRuleEngineMapper; - //拿到所有的值合并到一个值 - public String resolveByteMerge(List valueList, String ruletypeId, String vaildRange) { + public static String resolveByteMerge(List valueList, String ruleTypeId, String vaildRange) { String values = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Map vaildMap = getValidRangeMap(vaildRange); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(ruletypeId); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } + //暂时不处理 +// fieldRuleEngine = fieldRuleConfigMapper.selectById(ruleTypeId); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } Map env2 = new HashMap(); for (int i = 0; i < valueList.size(); i++) { if (vaildMap.containsKey(i)) { @@ -47,7 +38,7 @@ } } - private Map getValidRangeMap(String vaildRange) { + private static Map getValidRangeMap(String vaildRange) { String[] range = vaildRange.split(","); Map vaildMap = new HashMap(); for (int i = 0; i < range.length; i++) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 8d821cd..85d6bbf 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -1,9 +1,12 @@ package com.casic.missiles.parser.resolver; +import com.casic.missiles.pojo.AbstractFieldConfig; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; import io.netty.buffer.ByteBuf; +import java.util.List; import java.util.Map; /** @@ -11,18 +14,14 @@ */ public interface FieldParser { -// Map fieldProcess(String protocolContent,); - Map dataParser(RuleConfig ruleConfig, String lightText,String protocolId); + Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength); - Map fixDataParser(String protocolId, ByteBuf buffer); + Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap); - Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf); + ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer); - ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer); - - ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer); - - Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer); + Integer getTotalFilterLength(ProtocolConfig protocolConfig, ByteBuf byteBuf, Map protocolFieldConfigMap); } + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java index 608af3a..32cc8a4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java @@ -2,48 +2,47 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.delivery.decorator.ByteDecorator; +import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @AllArgsConstructor public class FieldDecoratorManger { - private final RuleDictDao ruleDictDao; + private final RuleConfigRegistry ruleDictDao; // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 // (1)静态的业务字段是字典里面可以配置的 // (2)动态的业务字段是通过规则生成的 public String contentMerge(String ruleJson, String sceneConent, String dynamicContent) { - List ruleDictList = ruleDictDao.getRuleDictConfig(); - Map ruleDictMap = ruleDictList.stream().collect( - Collectors.toMap(RuleDict::getId, e -> e)); - List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); - for (Map ruleMap : ruleMapList) { - String ruleType = String.valueOf(ruleMap.get("ruleType")); - ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); - NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); - byteDecorator.nodeDecoratorRule(nodeDecoratorParm); - } +// List ruleDictList = ruleDictDao.getRuleDictConfig(); +// Map ruleDictMap = ruleDictList.stream().collect( +// Collectors.toMap(RuleDict::getId, e -> e)); +// List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); +// for (Map ruleMap : ruleMapList) { +// String ruleType = String.valueOf(ruleMap.get("ruleType")); +// ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); +// NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); +// byteDecorator.nodeDecoratorRule(nodeDecoratorParm); +// } return null; } - - private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { - NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() - .contents(sceneConent) - .dynamicContent(dynamicContent) - .ruletypeId(ruletypeId) - .ruleDictMap(ruleDictMap) - .build(); - return nodeDecoratorParm; - } +// +// private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { +// NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() +// .contents(sceneConent) +// .dynamicContent(dynamicContent) +// .ruletypeId(ruletypeId) +// .ruleDictMap(ruleDictMap) +// .build(); +// return nodeDecoratorParm; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java index 652970c..b204ac3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java @@ -1,56 +1,56 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@AllArgsConstructor -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", - JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Component; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Component("logicalDecorator") +//@AllArgsConstructor +//@Slf4j +//public class LogicalShiftDecorator implements ByteDecorator { +// +//// private final FieldRuleEngineMapper fieldRuleEngineMapper; +//// +//// //字节位移 +//// @Override +//// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +//// String logicalValue = ""; +//// RuleEvaluator fieldRuleEngine = new RuleEvaluator(); +//// try { +//// Map env2 = new HashMap(); +//// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +//// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +//// for (String contentId : contentIdList) { +//// RuleDict ruleDict = ruleDictMap.get(contentId); +//// if (ruleDict.getCode().contains("#")) { +//// //使用动态的值 +//// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +//// } +//// env2.put(ruleDict.getName(), ruleDict.getCode()); +//// } +//// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +//// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +//// return null; +//// } +//// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +//// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +//// return values; +//// } catch (Exception ex) { +//// log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", +//// JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +//// return null; +//// } +//// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java index 346468f..822fead 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@AllArgsConstructor -@Slf4j -public class OperationDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("optionDecorator") +//@AllArgsConstructor +//@Slf4j +//public class OperationDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //混合运算,有常量或者乘除的缩放 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java index 50fb0a7..7a8bccb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@AllArgsConstructor -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +////精度计算 +//@AllArgsConstructor +//@Registry("precisionDecorator") +//@Slf4j +//public class PrecisionDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java index da39235..27f9cc7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java @@ -1,54 +1,53 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@AllArgsConstructor -@Slf4j -public class RuleDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("ruleDecorator") +//@AllArgsConstructor +//@Slf4j +//public class RuleDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //吃我一套正则表达式 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (Exception ex) { +// log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java index 7f5cbf3..c043f97 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java @@ -2,6 +2,6 @@ import java.util.Map; -public interface ComandeEventService { +public interface ComandeEventService{ Map loadComandeEventConfig(String protocolId,String scene); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java index 476ad84..aaf1837 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java @@ -2,46 +2,46 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.dao.CommandEventDao; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @Slf4j @AllArgsConstructor -public class ComandeEventServiceImpl implements ComandeEventService { +public class ComandeEventServiceImpl implements ComandeEventRegistry { - private final CommandEventDao commandEventDao; + // private final CommandEventDao commandEventDao; // 加密bean 固定字段出现变化的字段解析,业务字段的有序内容 @Override - public Map loadComandeEventConfig(String protocolId,String sceneName) { - CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); - if (ObjectUtil.isEmpty(commandEventConfig)) { - log.error("协议{},没有配置成功接收回复配置,清排查原因"); - return null; - } - String replyJson = commandEventConfig.getReplyContentJson(); - List> replyMapList = JSONArray.parseObject(replyJson, List.class); - List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); - Map fixMap = fixList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); - List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) - .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) - .collect(Collectors.toList()); - Map commandConfigMap = new HashMap<>(); - commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); - commandConfigMap.put("fixContent", fixMap); - commandConfigMap.put("bizContent", contentList); - return commandConfigMap; + public Map loadComandeEventConfig(String protocolId, String sceneName) { +// CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); +// if (ObjectUtil.isEmpty(commandEventConfig)) { +// log.error("协议{},没有配置成功接收回复配置,清排查原因"); +// return null; +// } +// String replyJson = commandEventConfig.getReplyContentJson(); +// List> replyMapList = JSONArray.parseObject(replyJson, List.class); +// List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); +// Map fixMap = fixList.stream() +// .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); +// List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) +// .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) +// .collect(Collectors.toList()); +// Map commandConfigMap = new HashMap<>(); +// commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); +// commandConfigMap.put("fixContent", fixMap); +// commandConfigMap.put("bizContent", contentList); +// return commandConfigMap; + return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 128b09d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java deleted file mode 100644 index 4016b0b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface DatagramEventMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java deleted file mode 100644 index 597c306..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.apache.ibatis.annotations.Mapper; - -public interface FieldConfigMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java deleted file mode 100644 index a31680a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.PreRuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface PreRuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java deleted file mode 100644 index 9060a69..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface ProtocolConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java deleted file mode 100644 index 6fa6936..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java deleted file mode 100644 index 582a705..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleDict; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleDictMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java deleted file mode 100644 index 6e302c8..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.CommandEventMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Optional; - -@Component -public class CommandEventDao { - - @Resource - private CommandEventMapper commandEventMapper; - - public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId) - .eq("scene", sceneName) - .eq("enabled", 1); - List commandEventConfig = commandEventMapper.selectList(queryWrapper); - Optional optionalEventConfig = commandEventConfig.stream().findFirst(); - return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java deleted file mode 100644 index 9137e4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.FieldConfigMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class FieldConfigDao { - - @Resource - private FieldConfigMapper fieldConfigMapper; - - public FieldConfig getFieldConfigById(String fieldId) { - FieldConfig fieldConfig = fieldConfigMapper.selectById(fieldId); - return fieldConfig; - } - - public List getFieldConfigs(String protocolId,Integer isFixed) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",isFixed); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - - public List getStorageFieldConfig(String protocolId) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",1) - .eq("is_storage",1); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java deleted file mode 100644 index 67bff6b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.mapper.PreRuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class PreRuleConfigDao { - - @Resource - private PreRuleConfigMapper preRuleConfigMapper; - - public List getPreRuleList(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return preRuleConfigMapper.selectList(queryWrapper); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java deleted file mode 100644 index d69ea85..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.RuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleConfigDao { - - @Resource - private RuleConfigMapper ruleConfigMapper; - - public RuleConfig getNextRuleConfig(String ruleFields) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("parse_rule_json", ruleFields); - return ruleConfigMapper.selectOne(queryWrapper); - } - - - public List getRuleConfigById(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return ruleConfigMapper.selectList(queryWrapper); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java deleted file mode 100644 index 932c185..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.RuleDictMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleDictDao { - - @Resource - private RuleDictMapper ruleDictMapper; - - public List getRuleDictConfig() { - List ruleDictList = ruleDictMapper.selectList(null); - return ruleDictList; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java index 9f9e279..43bc4d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java @@ -10,20 +10,15 @@ import io.netty.channel.socket.nio.NioServerSocketChannel; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import javax.annotation.PreDestroy; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static cn.hutool.core.util.ClassUtil.getClasses; /** * SensorhubServer netty服务端 */ @Slf4j -@Service +@Component public class SensorhubServer { /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java index 2c79ff5..9a28c36 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java @@ -11,13 +11,13 @@ import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioSocketChannel; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClient 客户端 */ @Slf4j -@Service +@Registry public final class SensorhubClient { public static void main(String[] args) throws Exception { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java index 9774be0..477c3f7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java @@ -6,12 +6,12 @@ import io.netty.channel.socket.SocketChannel; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientChannelInitialHandler */ -@Service +@Registry public class SensorhubClientChannelInitialHandler extends ChannelInitializer { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java index 346f4b3..73560e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java @@ -5,13 +5,13 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientHandler */ @Slf4j -@Service +@Registry public class SensorhubClientHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java index 5c1c6f2..d990af5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java @@ -4,12 +4,12 @@ import com.casic.missiles.pojo.Msg; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** * SensorhubServerHandler */ -@Service +@Component public class SensorhubServerHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 67283ae..af3172c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,41 +1,37 @@ package com.casic.missiles.parser; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultProtocolConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.*; +import com.casic.missiles.registry.FieldConfigRegistry; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; -import java.nio.charset.Charset; import java.util.HashMap; import java.util.List; import java.util.Map; -@Service("genericProtocolParser") +/** + * @author + */ +@Component("genericProtocolParser") @Slf4j -@AllArgsConstructor +@RequiredArgsConstructor public class GenericProtocolParser implements ProtocolParser { - private final LeadingCodeMatcher leadingCodeMatcher; private final List frameStructDispenserList; - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorInstanceSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; // 匹配首字母前导码=> 帧结构匹配前导码=> // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 @@ -44,18 +40,19 @@ public Boolean doParseProtocol(ByteBuf byteBuf) { String protocolContent = ByteBufUtil.hexDump(byteBuf); //匹配前导码 - List preCodeConfigs = leadingCodeMatcher.matchLeadingCode(protocolContent); + List preCodeConfigs = LeadingCodeMatcher.matchFrameLeadingCode(protocolContent); //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 if (preCodeConfigs.size() == 0) { - return rematch(byteBuf,protocolContent); + return rematch(byteBuf, protocolContent); } - //暂时先取第一个 + //暂时先取第一个,提升速度,使用享元模式, 减少类的创建销毁与构建 ProtocolConfig protocolConfig = preCodeConfigs.get(0); + AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); ByteBuf wholeDatagramByte = null; //通过匹配帧结构获取完整的数据包 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, preCodeConfigs.get(0))) != null) { + if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, protocolFactory)) != null) { break; } } @@ -68,76 +65,78 @@ * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 */ - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId, wholeDatagramByte); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap, protocolId); - //选取规则对应的流程实例 - DatagramEventConfig datagramEventConfig = processorInstanceSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); + //进行规则字段解析,进行匹配规则 + RuleConfig ruleConfig = getRuleConfig(protocolFactory, wholeDatagramByte); + if (ruleConfig == null) { + return false; + } //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, wholeDatagramByte); + ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte); + //以下进行业务的规则解析,同时选定流程实例 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); + DatagramEventProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain, + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText, protocolId); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain); //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); + datagramEventProvider.storeData(bizDataMap); return true; } - private Boolean rematch(ByteBuf byteBuf,String protocolContent) { + /** + * 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 + */ + private Boolean rematch(ByteBuf byteBuf, String protocolContent) { //重置位判断 byteBuf.resetReaderIndex(); //判断重置是否前移,如果没有前移,则直接判为匹配失败 if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { return false; } else { + //递归执行 return doParseProtocol(byteBuf); } } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; + //获取匹配规则->匹配规则 + private RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + //取出其中参与逻辑provider并判空 + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); + String rulePrepareFields = protocolConfig.getRulePrepareFields(); + //固定字段 + if (StringUtils.isNotEmpty(rulePrepareFields)) { + //获取统一固定字段解析 + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + //获取该协议的字段配置,用于协议规则匹配 + List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); + //获取规则 + RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, + rulePrepareFields, protocolFieldConfigs); + return ruleConfig; + } + return null; } - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + //数据构建,获取固定字段的store和业务字段store + private Map buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + Map bizDataMap = new HashMap<>(); + Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); + Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); + bizDataMap.putAll(ruleStoreObjectMap); + bizDataMap.putAll(protocolStoreObjectMap); return bizDataMap; } - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java index 8a46e32..16ce2e5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java @@ -3,6 +3,7 @@ import io.netty.buffer.ByteBuf; public interface ProtocolParser { + Boolean doParseProtocol(ByteBuf byteBuf); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java new file mode 100644 index 0000000..f7814af --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java @@ -0,0 +1,35 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.ProtocolConfigProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.ProtocolConfig; + +/** + * 存放基本协议的的加载信息 + */ +public class AbstractProtocolConfigFactory { + private final ProtocolConfigProvider protocolConfigProvider; + private final ProtocolFieldConfigProvider protocolFieldConfigProvider; + private final RuleConfigProvider ruleConfigProvider; + + public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { + this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); + this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); + this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); + } + + public ProtocolConfigProvider getProtocolConfigProvider() { + return protocolConfigProvider; + } + + public ProtocolFieldConfigProvider getProtocolFieldConfigProvider() { + return protocolFieldConfigProvider; + } + + public RuleConfigProvider getRuleConfigProvider() { + return ruleConfigProvider; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java new file mode 100644 index 0000000..6e36147 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java @@ -0,0 +1,57 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.CombinedFieldConfigProvider; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.FieldConfigProvider; +import com.casic.missiles.parser.provider.FieldRuleConfigProvider; + +/** + * 存放规则相关的的的加载信息 + */ +public class AbstractRuleConfigFactory { + + /** + * 处理字节 + */ + private final FieldConfigProvider fieldConfigProvider; + /** + * 处理组合字节解析的解码器 + */ + private final CombinedFieldConfigProvider combinedFieldConfigProvider; + /** + * 处理负责字节解析的规则配置 + */ + private final FieldRuleConfigProvider fieldRuleConfigProvider; + /** + * 处理实例流程 + */ + private final DatagramEventProvider datagramEventProvider; + + + public AbstractRuleConfigFactory(Long ruleId) { + this.fieldConfigProvider = new FieldConfigProvider(ruleId); + this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); + this.fieldRuleConfigProvider = new FieldRuleConfigProvider(ruleId); + this.datagramEventProvider = new DatagramEventProvider(ruleId); + } + + public FieldConfigProvider getFieldConfigProvider() { + return fieldConfigProvider; + } + + public CombinedFieldConfigProvider getCombinedFieldConfigProvider() { + return combinedFieldConfigProvider; + } + + public FieldRuleConfigProvider getFieldRuleConfigProvider() { + return fieldRuleConfigProvider; + } + + public DatagramEventProvider getDatagramEventProvider() { + return datagramEventProvider; + } + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java deleted file mode 100644 index 6e1719a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.factory; - - -import com.casic.missiles.pojo.ProtocolConfig; - -import java.util.List; - -/** - * 数据库访问优化(暂时未做) - *

- * 1、初始化协议解析配置,并存放到处存放缓存,对协议基本配置进行管理 - * 2、其中流程中所有的配置都经过此类进行管理,进行调用获取,增强解析速度 - */ -public interface DatagramFactory { - - /** - * 初始化 - */ - List datagramInit(); - - /** - * 根据前导码配置匹配,模糊匹配获取所有的报文项 - */ - List match(); - - /** - * 根据前导码匹配,返回报文项 - */ - List filer(); - - /** - * 保证数据的唯一性选择器 - */ - List selectOne(); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java new file mode 100644 index 0000000..87444a0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java @@ -0,0 +1,18 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +import java.util.List; + +/** + * 直接用,还是边用边创建 + */ +public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { + + + public DefaultProtocolConfigFactory(ProtocolConfig protocolConfig) { + super(protocolConfig); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java new file mode 100644 index 0000000..cce0c7c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java @@ -0,0 +1,12 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; + +public class DefaultRuleFactory extends AbstractRuleConfigFactory { + + public DefaultRuleFactory(Long ruleId) { + super(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java deleted file mode 100644 index 9ee97e0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.casic.missiles.parser.instance; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service -@Slf4j -@AllArgsConstructor -public class GeneralProcessor { - - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; - - /** - * 统一固定字段解析=>进行规则的查询的判断 - * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 - * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 - */ - @Deprecated - public boolean parseWholeDatagram(ByteBuf buffer, ProtocolConfig protocolConfig) { - try { - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap,protocolId); - //选取规则对应的流程= - DatagramEventConfig datagramEventConfig = processorSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); - //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); - //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); - //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); - //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); - //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); - return true; - } catch (Exception ex) { - log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", - ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); - return false; - } - } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; - } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); - } - - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); - return bizDataMap; - } - - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java index 25e7ad8..6a5777e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java @@ -1,23 +1,31 @@ package com.casic.missiles.parser.instance.impl; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.mapper.DatagramEventMapper; import com.casic.missiles.pojo.DatagramEventConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.SpringContextUtil; -@Service -@AllArgsConstructor +import java.util.List; +import java.util.Optional; + +/** + * @author cz + * + */ public class DefaultProcessorInstanceSelector implements ProcessorInstanceSelector { - private final DatagramEventMapper datagramEventMapper; + private static List datagramEventConfigs; + + static { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + datagramEventConfigs = datagramEventRegistry.getDatagramEventList(); + } @Override public DatagramEventConfig getProcessorInstance(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("rule_id", protocolId); - return datagramEventMapper.selectOne(queryWrapper); + Optional optionalSelectInstance = datagramEventConfigs.stream() + .filter(e -> e.getId().equals(protocolId)).limit(1).findFirst(); + return optionalSelectInstance.isPresent() ? optionalSelectInstance.get() : null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a778671..7b56a43 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,16 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import io.netty.buffer.ByteBuf; /** - * 分析匹配情况 - * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 - * 2、匹配不成功,有后续帧,可以进行下次匹配。 - * 3、匹配不成功,无后续帧,可以进行丢弃。 + * 分析匹配情况 + * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 + * 2、匹配不成功,有后续帧,可以进行下次匹配。 + * 3、匹配不成功,无后续帧,可以进行丢弃。 */ -public interface FrameStructMatcher{ +public interface FrameStructMatcher { - ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig); + ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 05320ab..8ebea78 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,23 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.ProtocolConfigMapper; +import com.casic.missiles.parser.provider.ProtocolConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Component; import java.util.List; import java.util.stream.Collectors; -@Component -@AllArgsConstructor public class LeadingCodeMatcher { - private final ProtocolConfigMapper protocolMapper; - //** 1、首字母匹配前导码, // 2、以匹配出的前导码是否在报文中条件进行前导码的匹配二次筛选 - public List matchLeadingCode(String protocolContent){ + public static List matchFrameLeadingCode(String protocolContent){ List initialConfigs = initialMatch(protocolContent); List preCodeConfigs = initialConfigs.stream() .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) @@ -26,13 +19,16 @@ } //初始化匹配前导码内容 - private List initialMatch(String protocolContent) { - String protocolStr = protocolContent.charAt(0) + ""; - QueryWrapper queryWrapper = new QueryWrapper() - .likeRight("pre_fix", protocolStr); - List protocolConfigList = protocolMapper.selectList(queryWrapper); - return protocolConfigList; + private static List initialMatch(String protocolContent) { + String firstFrameChar = protocolContent.charAt(0) + ""; + ProtocolConfigProvider protocolConfigProvider=new ProtocolConfigProvider(firstFrameChar); + return protocolConfigProvider.getMatchList(); } + + + + + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index cf2113d..e915877 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -1,32 +1,35 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(0) -@Service +@Component public class FrameLengthMatcher implements FrameStructMatcher { - @Autowired - private FieldParser fieldParser; - //超过长度 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { String dataGramContent = ByteBufUtil.hexDump(byteBuf); - if (StringUtils.isEmpty(protocolConfig.getUnpackId()) && StringUtils.isEmpty(protocolConfig.getTailStr())) { - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + //当不存在结尾标志和拆包标志,可以直接使用长度进行匹配 + if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { if (dataGramContent.length() >= totalLength) {//等于长度返回true,超出长度,切断 - ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, protocolConfig, totalLength); + ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, totalLength); return wholeDatagramByte; } else { //读的标志位前移舍弃 @@ -38,7 +41,7 @@ return null; } - private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, Integer totalLength) { byteBuf.readBytes(totalLength); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, totalLength - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 2bfc213..d527ad0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; @@ -13,7 +13,7 @@ import lombok.AllArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.nio.charset.Charset; import java.util.Map; @@ -22,32 +22,30 @@ * 后续标志验证 */ @Order(1) -@Service +@Component @AllArgsConstructor -public class FrameMarkMatcher implements FrameStructMatcher { - - private final FieldConfigDao fieldConfigDao; - private final FieldParser fieldParser; - private final FieldResolver fieldResolverManger; +public class FrameMarkMatcher implements FrameStructMatcher, FixedPropertyEnum { //帧后续标志=>结束,进行帧的重组=>有后续,1、帧移位判别 2、继续接收帧 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig UnpackConfig = StringUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getUnpackId()); - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); - Integer upback = 0; + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); ByteBuf mergeWholeFrameByte = null; - if (!ObjectUtil.isEmpty(UnpackConfig)) { - while (hasNextFullFrame(byteBuf, protocolConfig)) { - upback = (Integer) fieldResolverManger.filedParserManger(byteBuf, UnpackConfig, null); + if (!ObjectUtil.isEmpty(unpackFlag)) { + while (hasNextFullFrame(byteBuf, protocolConfig, protocolFieldConfigProvider)) { //是否存在后续位 - if (upback == 1) {//使用esayRule + if (unpackFlag == 1) {//使用esayRule //表示可以截取 - mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolConfig, totalLength); + mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolFieldConfigProvider, protocolConfig); return mergeWholeFrameByte; } else { - byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig)); + byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig, protocolFieldConfigProvider)); } } } @@ -56,7 +54,8 @@ //选取第一个帧,将业务内容和后面部分分开 //计算数据报文-业务内容 - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolFieldConfigProvider protocolFieldConfigProvider, ProtocolConfig protocolConfig) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); //截取完整报文 byteBuf.readBytes(totalLength); ByteBuf byteBufContent = byteBuf.slice(0, byteBuf.readerIndex()); @@ -68,15 +67,15 @@ String tail = ""; System.out.println(ByteBufUtil.hexDump(byteBufContent)); //会存在多个帧拼接在一起的的情况,进行合并处理 - while (hasNextFullFrame(byteBufContent, protocolConfig)) { - Integer currentFrameLength = fieldParser.getTotalLength(protocolConfig, byteBufContent); + while (hasNextFullFrame(byteBufContent, protocolConfig, protocolFieldConfigProvider)) { + Integer currentFrameLength = protocolFieldConfigProvider.getTotalLength(byteBufContent, protocolConfig); byteBufContent.readBytes(currentFrameLength); ByteBuf currentbyteBuf = byteBufContent.slice(0, byteBufContent.readerIndex()); byteBufContent.markReaderIndex();//读的标志位前移 System.out.println(ByteBufUtil.hexDump(byteBufContent)); String hexDump = currentbyteBuf.toString(Charset.forName("ISO-8859-1")); //获取当前固定帧结构的关系map - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, currentbyteBuf); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(currentbyteBuf, protocolConfig); if (StringUtils.isEmpty(mergeFrameStr)) { //首次获取业务数据报文 mergeFrameStr += hexDump.substring(0, currentFrameFixedProperty.get("tailPosition")); @@ -95,22 +94,22 @@ /** * 获取平移到下一帧起始位置 */ - public int getNextFrameOffset(ByteBuf buffer, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, buffer); - return currentFrameFixedProperty.get("totalLength"); + public int getNextFrameOffset(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + return currentFrameFixedProperty.get(TOTAL_LENGTH); } /** * 判断是否出错进行整个帧的 */ - public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, byteBuf); + public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); //保证读取位置不在固定位置,是可变的业务内容 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("fixedPosition")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(FIXED_POSITION)) { return false; } //判断读取是否操作帧长度 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("totalLength")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(TOTAL_LENGTH)) { return false; } return true; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 76a3784..c3a1bab 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -1,50 +1,50 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.parser.instance.GeneralProcessor; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; +import io.netty.buffer.ByteBufUtil;; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(2) -@Service +@Component public class FrameTailMatcher implements FrameStructMatcher { - @Resource - private FieldConfigDao fieldConfigDao; - @Autowired - private GeneralProcessor generalProcessor; - //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig tailFieldConfig = StringUtils.isEmpty(protocolConfig.getTailStr()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getTailStr()); - if (!ObjectUtil.isEmpty(tailFieldConfig)) { - String tailStr = tailFieldConfig.getFieldName(); + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfig protocolFieldConfig = ObjectUtils.isEmpty(protocolConfig.getTailStr()) ? null : + fieldConfigProvider.getFieldConfigById(protocolConfig.getTailStr()); + if (!ObjectUtil.isEmpty(protocolFieldConfig)) { + String tailStr = protocolFieldConfig.getFieldName(); String dataGramContent = ByteBufUtil.hexDump(byteBuf); Boolean tailFlag = ByteBufUtil.hexDump(byteBuf).contains(tailStr); if (!tailFlag) { //使用esayRule return null; } else if (dataGramContent.indexOf(tailStr) < dataGramContent.length() - tailStr.length()) { Integer length = dataGramContent.indexOf(tailStr) + tailStr.length(); - ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, protocolConfig, length); + ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, length); return wholeDatagramByte; //存在粘包 } } return null; } - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer length) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, Integer length) { byteBuf.readBytes(length); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, length - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java new file mode 100644 index 0000000..5f1c177 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java @@ -0,0 +1,73 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.combined.GenericCombinedFieldResolver; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.CombinedFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class CombinedFieldConfigProvider { + + + /** + * 作为临时配置列表缓存使用 + */ + private final List combinedFieldConfigList; + private Map storeObjectMap = new HashMap<>(); + + public CombinedFieldConfigProvider(Long ruleId) { + CombinedFieldConfigRegistry combinedFieldConfigRegistry = SpringContextUtil.getBean(CombinedFieldConfigRegistry.class); + combinedFieldConfigList = combinedFieldConfigRegistry.getCombinedFieldConfigList(ruleId); + } + + public void parseDataField(RuleConfig ruleConfig, String clearZeroPlain,Map fieldConfigsMap ) { + if (showSkip()) { + return; + } + //匹配对应的数据,然后进行相关的字段解析 + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver(); + combinedFieldResolver.parseDataField(combinedFieldConfigList, byteBuf, storeObjectMap,fieldConfigsMap); + } + + + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getCombinedFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return combinedFieldConfigList.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public List getCombinedFieldConfigList() { + return combinedFieldConfigList; + } + + /* 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(combinedFieldConfigList) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java new file mode 100644 index 0000000..f3cfedc --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java @@ -0,0 +1,11 @@ +package com.casic.missiles.parser.provider; + +/** + * @author cz + * @date 2023-6-12 + */ +public class CommandEventProvider{ + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java new file mode 100644 index 0000000..70eec5e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java @@ -0,0 +1,77 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.safe.SafeStrategy; +import com.casic.missiles.parser.sender.DataSubscribeProvider; +import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class DatagramEventProvider { + + private final DatagramEventConfig processorInstance; + + public DatagramEventProvider(Long ruleId) { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + List datagramEventConfigList = + datagramEventRegistry.getDatagramEventList(ruleId); + processorInstance = this.getProcessorInstance(datagramEventConfigList); + } + + public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { + if (showSkip()) { + return null; + } + return datagramEventConfigList.get(0); + } + + // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 + public String getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap) { + String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? + processorInstance.getSafeBean() : + fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); + if (!StringUtils.isEmpty(safeName)) { + //需要加密 + SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); + String plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); + return clearComplementZero(plain); + } + return ByteBufUtil.hexDump(bizDataContent); + } + + //解密清零操作 + private String clearComplementZero(String plain) { + plain = plain.substring(0, plain.lastIndexOf("00")); + return plain; + } + + //数据发送,数据发送者暂未构建 + public void storeData(Map bizDataMap) { + DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); +// dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return ObjectUtils.isNotEmpty(processorInstance) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java new file mode 100644 index 0000000..7e1fe0a --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java @@ -0,0 +1,97 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.FieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class FieldConfigProvider { + + + private final List fieldConfigs; + private Map storeObjectMap = new HashMap<>(); +// private Map singleObjects = new ConcurrentHashMap<>(); + + public FieldConfigProvider(Long ruleId) { + FieldConfigRegistry fieldConfigRegistry = SpringContextUtil.getBean(FieldConfigRegistry.class); + fieldConfigs = fieldConfigRegistry.getFieldConfigList(ruleId); + } + + public List getFieldConfigs() { + return fieldConfigs; + } + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public Map parseDataField(RuleConfig ruleConfig, String clearZeroPlain) { + if (showSkip()) { + return null; + } + List prepareFieldConfig = prepareParseField(ruleConfig); + if (CollectionUtils.isNotEmpty(prepareFieldConfig)) { + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(fieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + return fixDataMap; + } + } + return null; + } + + /** + * 得到需要处理的业务内容 + * + * @return + */ + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return fieldConfigs.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public Map getFieldConfigsMap() { + return fieldConfigs.stream().collect( + Collectors.toMap(FieldConfig::getId, e -> e) + ); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(fieldConfigs) ? false : true; + } + + +} + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java new file mode 100644 index 0000000..817bfaf --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java @@ -0,0 +1,19 @@ +package com.casic.missiles.parser.provider; + +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.registry.FieldRuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; + +public class FieldRuleConfigProvider { + + private final List fieldRuleConfigList; + + public FieldRuleConfigProvider(Long ruleId) { + FieldRuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(FieldRuleConfigRegistry.class); + fieldRuleConfigList = ruleConfigRegistry.getFieldRuleConfigList(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java new file mode 100644 index 0000000..99a1b06 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java @@ -0,0 +1,53 @@ +package com.casic.missiles.parser.provider; + + +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.registry.ProtocolConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolConfigProvider { + + private final List protocolConfigList; + + public ProtocolConfigProvider(String firstChar) { + ProtocolConfigRegistry registry = SpringContextUtil.getBean(ProtocolConfigRegistry.class); + protocolConfigList = registry.getProtocolConfigList(firstChar); + } + + public List getMatchList() { + return protocolConfigList; + } + + /** + * 设置当前协议 + * + * @param protocolConfig + */ + public ProtocolConfigProvider(ProtocolConfig protocolConfig) { + List protocolConfigs = new ArrayList<>(); + protocolConfigs.add(protocolConfig); + protocolConfigList = protocolConfigs; + } + + /** + * 获取当前协议 + * + * @return + */ + public ProtocolConfig getCurrentProtocolConfig() { + if (this.protocolConfigList == null) { + return null; + } else { + return protocolConfigList.get(0); + } + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java new file mode 100644 index 0000000..043927d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java @@ -0,0 +1,213 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.registry.ProtocolFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolFieldConfigProvider { + + private static final String FIXED_FIELD_DS = "fixedFieldDs"; + private static final String CONTENT_FIELD_DS = "contentFieldDs"; + private static final String PROTOCOL_LENGTH = "protocolLength"; + private static final String PROTOCOL_FIELD_ID = "protocolFieldId"; + private static final String PROTOCOL_POSITION = "protocolPosition"; + + private final List protocolFieldConfigs; + private Map singleObjects = new ConcurrentHashMap<>(); + private Map storeObjectMap = new HashMap<>(); + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public ProtocolFieldConfigProvider(Long protocolId) { + ProtocolFieldConfigRegistry protocolFieldConfigRegistry = SpringContextUtil.getBean(ProtocolFieldConfigRegistry.class); + protocolFieldConfigs = protocolFieldConfigRegistry.getProtocolFieldConfigList(protocolId); + } + + public List getProtocolFieldConfigs() { + return protocolFieldConfigs; + } + + public ProtocolFieldConfig getFieldConfigById(Long fieldId) { + Optional optionalConfig = protocolFieldConfigs.stream().filter( + e -> e.getId().equals(fieldId) + ).findFirst(); + return optionalConfig.isPresent() ? optionalConfig.get() : null; + } + + public Integer getProtocolFieldValue(Long protocolFieldId, ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_FIELD_ID + protocolFieldId + ByteBufUtil.hexDump(byteBuf); + //获取缓存 + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + //加载固定长度数据集合 + Map fixDataMap = this.getProtocolDataMap(byteBuf); + ProtocolFieldConfig protocolFieldConfig = selectFieldConfig(protocolFieldId); + Integer protocolFieldValue = 0; + //获取约定字段的总长度 + if (fixDataMap.containsKey(protocolFieldConfig.getFieldName())) { + Object appointUnpackObject = fixDataMap.get(protocolFieldConfig.getFieldName()); + if (ObjectUtils.isNotEmpty(appointUnpackObject)) { + protocolFieldValue = (Integer) appointUnpackObject; + } + } + if (protocolFieldValue != null) { + //加入缓存 + if (ObjectUtils.isNotEmpty(protocolFieldValue)) { + this.singleObjects.put(catchKey, protocolFieldValue); + return protocolFieldValue; + } + } + return null; + } + + /** + * 获取帧固定位置信息 + * + * @param byteBuf + * @param protocolConfig + * @return + */ + public Map getFixedProperty(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_POSITION + protocolConfig.getId(); + if (this.singleObjects.containsKey(catchKey)) { + return (Map) singleObjects.get(catchKey); + } + Map fixedPropertyMap = new HashMap<>(); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + fixedPropertyMap = fieldParser.doGetFixedProperty(protocolFieldConfigs, this.getTotalLength(byteBuf,protocolConfig)); + if (CollectionUtils.isNotEmpty(fixedPropertyMap)) { + this.singleObjects.put(catchKey, fixedPropertyMap); + return fixedPropertyMap; + } + return fixedPropertyMap; + } + + /** + * 获取帧结构应有的总长度 + */ + public Integer getTotalLength(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_LENGTH + ByteBufUtil.hexDump(byteBuf); + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + Integer appointFrameLength = getProtocolFieldValue(protocolConfig.getTotalLengthId(), byteBuf); + if (appointFrameLength != null) { + //获取过滤的字段集合总长度 + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Integer totalFilterLength = fieldParser.getTotalFilterLength(protocolConfig, byteBuf, getFixFieldConfigMap()); + //计算总长度 + Integer totalLength = appointFrameLength + totalFilterLength; + //加入缓存 + if (ObjectUtils.isNotEmpty(totalLength)) { + this.singleObjects.put(catchKey, totalLength); + return totalLength; + } + } + return null; + } + + /** + * 获取协议有关字段解析内容 + * storeObjectMap存储代转存的数据 + * + * @return + */ + public Map getProtocolDataMap(ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(FIXED_FIELD_DS)) { + return (Map) singleObjects.get(FIXED_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(protocolFieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + this.singleObjects.put(FIXED_FIELD_DS, fixDataMap); + return fixDataMap; + } + return null; + } + + /** + * 获取业务报文内容的content字节 + * + * @param wholeDatagramByte + * @return + */ + public ByteBuf getDataContentBuf(ByteBuf wholeDatagramByte) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(CONTENT_FIELD_DS)) { + return (ByteBuf) singleObjects.get(CONTENT_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + ByteBuf bizDataByteBuf = fieldParser.getDataContentBuf(protocolFieldConfigs, wholeDatagramByte); + if (bizDataByteBuf != null) { + this.singleObjects.put(CONTENT_FIELD_DS, bizDataByteBuf); + return bizDataByteBuf; + } + return null; + } + + + private ProtocolFieldConfig selectFieldConfig(Long id) { + Optional optionalProtocolFieldConfig = this.protocolFieldConfigs.stream().filter( + e -> e.getId().equals(id) + ).findFirst(); + return optionalProtocolFieldConfig.isPresent() ? optionalProtocolFieldConfig.get() : null; + } + + + private Map getFixFieldConfigMap() { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, e -> e) + ); + return fixDataFieldMap; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(protocolFieldConfigs) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java new file mode 100644 index 0000000..dafba1c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java @@ -0,0 +1,56 @@ +package com.casic.missiles.parser.provider; + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.rule.GenericRuleResolver; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.RuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleConfigProvider { + + private final List ruleConfigs; + + public List getRuleConfigs() { + return ruleConfigs; + } + + public RuleConfigProvider(Long protocolId) { + RuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(RuleConfigRegistry.class); + ruleConfigs = ruleConfigRegistry.getRuleConfigById(protocolId); + } + + /** + * 获取规则匹配结果 + * + * @param parseFixedDataMap + * @param protocolFieldConfigs + * @return + */ + public RuleConfig doGetRule(Map parseFixedDataMap, + String ids, + List protocolFieldConfigs) { + if (showSkip()) { + return null; + } + RuleConfig ruleConfig = GenericRuleResolver.machRule(parseFixedDataMap, ids, protocolFieldConfigs, ruleConfigs); + return ruleConfig; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(ruleConfigs) ? false : true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java index 3c05891..856b399 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java @@ -1,18 +1,11 @@ package com.casic.missiles.parser.resolver; -import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.springframework.web.bind.annotation.RequestBody; -import javax.annotation.Resource; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -20,19 +13,17 @@ @Slf4j public class ByteMergeProvider { - @Resource - private FieldRuleEngineMapper fieldRuleEngineMapper; - //拿到所有的值合并到一个值 - public String resolveByteMerge(List valueList, String ruletypeId, String vaildRange) { + public static String resolveByteMerge(List valueList, String ruleTypeId, String vaildRange) { String values = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Map vaildMap = getValidRangeMap(vaildRange); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(ruletypeId); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } + //暂时不处理 +// fieldRuleEngine = fieldRuleConfigMapper.selectById(ruleTypeId); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } Map env2 = new HashMap(); for (int i = 0; i < valueList.size(); i++) { if (vaildMap.containsKey(i)) { @@ -47,7 +38,7 @@ } } - private Map getValidRangeMap(String vaildRange) { + private static Map getValidRangeMap(String vaildRange) { String[] range = vaildRange.split(","); Map vaildMap = new HashMap(); for (int i = 0; i < range.length; i++) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 8d821cd..85d6bbf 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -1,9 +1,12 @@ package com.casic.missiles.parser.resolver; +import com.casic.missiles.pojo.AbstractFieldConfig; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; import io.netty.buffer.ByteBuf; +import java.util.List; import java.util.Map; /** @@ -11,18 +14,14 @@ */ public interface FieldParser { -// Map fieldProcess(String protocolContent,); - Map dataParser(RuleConfig ruleConfig, String lightText,String protocolId); + Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength); - Map fixDataParser(String protocolId, ByteBuf buffer); + Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap); - Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf); + ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer); - ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer); - - ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer); - - Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer); + Integer getTotalFilterLength(ProtocolConfig protocolConfig, ByteBuf byteBuf, Map protocolFieldConfigMap); } + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java new file mode 100644 index 0000000..9e0c00e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java @@ -0,0 +1,52 @@ +package com.casic.missiles.parser.resolver; + +import com.casic.missiles.pojo.AbstractFieldConfig; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.util.List; + +public class FieldParserSupport { + + //分别计算bit和byte长度=> 合并长度 + protected Integer calculateLength(List fieldConfigList) { + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + Integer fixedLength = bytefixedLength + bitfixedLength / 8; + return fixedLength; + } + + //找到最大值=> 根据最大值计算业务数据下标 + protected Integer calculatePosition(List fieldConfigList) { + String rex = "[0-9]+"; + Integer max = -1; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) + && Integer.valueOf(fieldConfig.getOriginPositionByte()) > max) { + max = Integer.valueOf(fieldConfig.getOriginPositionByte()); + } + } + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) && fieldConfig.getOriginPositionByte().equals(max)) { + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + } + } + Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; + return maxFixedPosition; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java index 608af3a..32cc8a4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java @@ -2,48 +2,47 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.delivery.decorator.ByteDecorator; +import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @AllArgsConstructor public class FieldDecoratorManger { - private final RuleDictDao ruleDictDao; + private final RuleConfigRegistry ruleDictDao; // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 // (1)静态的业务字段是字典里面可以配置的 // (2)动态的业务字段是通过规则生成的 public String contentMerge(String ruleJson, String sceneConent, String dynamicContent) { - List ruleDictList = ruleDictDao.getRuleDictConfig(); - Map ruleDictMap = ruleDictList.stream().collect( - Collectors.toMap(RuleDict::getId, e -> e)); - List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); - for (Map ruleMap : ruleMapList) { - String ruleType = String.valueOf(ruleMap.get("ruleType")); - ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); - NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); - byteDecorator.nodeDecoratorRule(nodeDecoratorParm); - } +// List ruleDictList = ruleDictDao.getRuleDictConfig(); +// Map ruleDictMap = ruleDictList.stream().collect( +// Collectors.toMap(RuleDict::getId, e -> e)); +// List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); +// for (Map ruleMap : ruleMapList) { +// String ruleType = String.valueOf(ruleMap.get("ruleType")); +// ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); +// NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); +// byteDecorator.nodeDecoratorRule(nodeDecoratorParm); +// } return null; } - - private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { - NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() - .contents(sceneConent) - .dynamicContent(dynamicContent) - .ruletypeId(ruletypeId) - .ruleDictMap(ruleDictMap) - .build(); - return nodeDecoratorParm; - } +// +// private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { +// NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() +// .contents(sceneConent) +// .dynamicContent(dynamicContent) +// .ruletypeId(ruletypeId) +// .ruleDictMap(ruleDictMap) +// .build(); +// return nodeDecoratorParm; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java index 652970c..b204ac3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java @@ -1,56 +1,56 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@AllArgsConstructor -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", - JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Component; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Component("logicalDecorator") +//@AllArgsConstructor +//@Slf4j +//public class LogicalShiftDecorator implements ByteDecorator { +// +//// private final FieldRuleEngineMapper fieldRuleEngineMapper; +//// +//// //字节位移 +//// @Override +//// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +//// String logicalValue = ""; +//// RuleEvaluator fieldRuleEngine = new RuleEvaluator(); +//// try { +//// Map env2 = new HashMap(); +//// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +//// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +//// for (String contentId : contentIdList) { +//// RuleDict ruleDict = ruleDictMap.get(contentId); +//// if (ruleDict.getCode().contains("#")) { +//// //使用动态的值 +//// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +//// } +//// env2.put(ruleDict.getName(), ruleDict.getCode()); +//// } +//// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +//// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +//// return null; +//// } +//// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +//// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +//// return values; +//// } catch (Exception ex) { +//// log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", +//// JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +//// return null; +//// } +//// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java index 346468f..822fead 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@AllArgsConstructor -@Slf4j -public class OperationDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("optionDecorator") +//@AllArgsConstructor +//@Slf4j +//public class OperationDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //混合运算,有常量或者乘除的缩放 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java index 50fb0a7..7a8bccb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@AllArgsConstructor -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +////精度计算 +//@AllArgsConstructor +//@Registry("precisionDecorator") +//@Slf4j +//public class PrecisionDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java index da39235..27f9cc7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java @@ -1,54 +1,53 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@AllArgsConstructor -@Slf4j -public class RuleDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("ruleDecorator") +//@AllArgsConstructor +//@Slf4j +//public class RuleDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //吃我一套正则表达式 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (Exception ex) { +// log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java index 7f5cbf3..c043f97 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java @@ -2,6 +2,6 @@ import java.util.Map; -public interface ComandeEventService { +public interface ComandeEventService{ Map loadComandeEventConfig(String protocolId,String scene); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java index 476ad84..aaf1837 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java @@ -2,46 +2,46 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.dao.CommandEventDao; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @Slf4j @AllArgsConstructor -public class ComandeEventServiceImpl implements ComandeEventService { +public class ComandeEventServiceImpl implements ComandeEventRegistry { - private final CommandEventDao commandEventDao; + // private final CommandEventDao commandEventDao; // 加密bean 固定字段出现变化的字段解析,业务字段的有序内容 @Override - public Map loadComandeEventConfig(String protocolId,String sceneName) { - CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); - if (ObjectUtil.isEmpty(commandEventConfig)) { - log.error("协议{},没有配置成功接收回复配置,清排查原因"); - return null; - } - String replyJson = commandEventConfig.getReplyContentJson(); - List> replyMapList = JSONArray.parseObject(replyJson, List.class); - List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); - Map fixMap = fixList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); - List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) - .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) - .collect(Collectors.toList()); - Map commandConfigMap = new HashMap<>(); - commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); - commandConfigMap.put("fixContent", fixMap); - commandConfigMap.put("bizContent", contentList); - return commandConfigMap; + public Map loadComandeEventConfig(String protocolId, String sceneName) { +// CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); +// if (ObjectUtil.isEmpty(commandEventConfig)) { +// log.error("协议{},没有配置成功接收回复配置,清排查原因"); +// return null; +// } +// String replyJson = commandEventConfig.getReplyContentJson(); +// List> replyMapList = JSONArray.parseObject(replyJson, List.class); +// List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); +// Map fixMap = fixList.stream() +// .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); +// List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) +// .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) +// .collect(Collectors.toList()); +// Map commandConfigMap = new HashMap<>(); +// commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); +// commandConfigMap.put("fixContent", fixMap); +// commandConfigMap.put("bizContent", contentList); +// return commandConfigMap; + return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 128b09d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java deleted file mode 100644 index 4016b0b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface DatagramEventMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java deleted file mode 100644 index 597c306..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.apache.ibatis.annotations.Mapper; - -public interface FieldConfigMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java deleted file mode 100644 index a31680a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.PreRuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface PreRuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java deleted file mode 100644 index 9060a69..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface ProtocolConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java deleted file mode 100644 index 6fa6936..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java deleted file mode 100644 index 582a705..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleDict; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleDictMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java deleted file mode 100644 index 6e302c8..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.CommandEventMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Optional; - -@Component -public class CommandEventDao { - - @Resource - private CommandEventMapper commandEventMapper; - - public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId) - .eq("scene", sceneName) - .eq("enabled", 1); - List commandEventConfig = commandEventMapper.selectList(queryWrapper); - Optional optionalEventConfig = commandEventConfig.stream().findFirst(); - return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java deleted file mode 100644 index 9137e4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.FieldConfigMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class FieldConfigDao { - - @Resource - private FieldConfigMapper fieldConfigMapper; - - public FieldConfig getFieldConfigById(String fieldId) { - FieldConfig fieldConfig = fieldConfigMapper.selectById(fieldId); - return fieldConfig; - } - - public List getFieldConfigs(String protocolId,Integer isFixed) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",isFixed); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - - public List getStorageFieldConfig(String protocolId) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",1) - .eq("is_storage",1); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java deleted file mode 100644 index 67bff6b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.mapper.PreRuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class PreRuleConfigDao { - - @Resource - private PreRuleConfigMapper preRuleConfigMapper; - - public List getPreRuleList(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return preRuleConfigMapper.selectList(queryWrapper); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java deleted file mode 100644 index d69ea85..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.RuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleConfigDao { - - @Resource - private RuleConfigMapper ruleConfigMapper; - - public RuleConfig getNextRuleConfig(String ruleFields) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("parse_rule_json", ruleFields); - return ruleConfigMapper.selectOne(queryWrapper); - } - - - public List getRuleConfigById(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return ruleConfigMapper.selectList(queryWrapper); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java deleted file mode 100644 index 932c185..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.RuleDictMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleDictDao { - - @Resource - private RuleDictMapper ruleDictMapper; - - public List getRuleDictConfig() { - List ruleDictList = ruleDictMapper.selectList(null); - return ruleDictList; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java index 9f9e279..43bc4d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java @@ -10,20 +10,15 @@ import io.netty.channel.socket.nio.NioServerSocketChannel; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import javax.annotation.PreDestroy; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static cn.hutool.core.util.ClassUtil.getClasses; /** * SensorhubServer netty服务端 */ @Slf4j -@Service +@Component public class SensorhubServer { /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java index 2c79ff5..9a28c36 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java @@ -11,13 +11,13 @@ import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioSocketChannel; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClient 客户端 */ @Slf4j -@Service +@Registry public final class SensorhubClient { public static void main(String[] args) throws Exception { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java index 9774be0..477c3f7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java @@ -6,12 +6,12 @@ import io.netty.channel.socket.SocketChannel; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientChannelInitialHandler */ -@Service +@Registry public class SensorhubClientChannelInitialHandler extends ChannelInitializer { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java index 346f4b3..73560e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java @@ -5,13 +5,13 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientHandler */ @Slf4j -@Service +@Registry public class SensorhubClientHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java index 5c1c6f2..d990af5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java @@ -4,12 +4,12 @@ import com.casic.missiles.pojo.Msg; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** * SensorhubServerHandler */ -@Service +@Component public class SensorhubServerHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 67283ae..af3172c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,41 +1,37 @@ package com.casic.missiles.parser; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultProtocolConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.*; +import com.casic.missiles.registry.FieldConfigRegistry; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; -import java.nio.charset.Charset; import java.util.HashMap; import java.util.List; import java.util.Map; -@Service("genericProtocolParser") +/** + * @author + */ +@Component("genericProtocolParser") @Slf4j -@AllArgsConstructor +@RequiredArgsConstructor public class GenericProtocolParser implements ProtocolParser { - private final LeadingCodeMatcher leadingCodeMatcher; private final List frameStructDispenserList; - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorInstanceSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; // 匹配首字母前导码=> 帧结构匹配前导码=> // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 @@ -44,18 +40,19 @@ public Boolean doParseProtocol(ByteBuf byteBuf) { String protocolContent = ByteBufUtil.hexDump(byteBuf); //匹配前导码 - List preCodeConfigs = leadingCodeMatcher.matchLeadingCode(protocolContent); + List preCodeConfigs = LeadingCodeMatcher.matchFrameLeadingCode(protocolContent); //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 if (preCodeConfigs.size() == 0) { - return rematch(byteBuf,protocolContent); + return rematch(byteBuf, protocolContent); } - //暂时先取第一个 + //暂时先取第一个,提升速度,使用享元模式, 减少类的创建销毁与构建 ProtocolConfig protocolConfig = preCodeConfigs.get(0); + AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); ByteBuf wholeDatagramByte = null; //通过匹配帧结构获取完整的数据包 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, preCodeConfigs.get(0))) != null) { + if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, protocolFactory)) != null) { break; } } @@ -68,76 +65,78 @@ * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 */ - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId, wholeDatagramByte); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap, protocolId); - //选取规则对应的流程实例 - DatagramEventConfig datagramEventConfig = processorInstanceSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); + //进行规则字段解析,进行匹配规则 + RuleConfig ruleConfig = getRuleConfig(protocolFactory, wholeDatagramByte); + if (ruleConfig == null) { + return false; + } //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, wholeDatagramByte); + ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte); + //以下进行业务的规则解析,同时选定流程实例 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); + DatagramEventProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain, + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText, protocolId); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain); //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); + datagramEventProvider.storeData(bizDataMap); return true; } - private Boolean rematch(ByteBuf byteBuf,String protocolContent) { + /** + * 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 + */ + private Boolean rematch(ByteBuf byteBuf, String protocolContent) { //重置位判断 byteBuf.resetReaderIndex(); //判断重置是否前移,如果没有前移,则直接判为匹配失败 if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { return false; } else { + //递归执行 return doParseProtocol(byteBuf); } } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; + //获取匹配规则->匹配规则 + private RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + //取出其中参与逻辑provider并判空 + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); + String rulePrepareFields = protocolConfig.getRulePrepareFields(); + //固定字段 + if (StringUtils.isNotEmpty(rulePrepareFields)) { + //获取统一固定字段解析 + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + //获取该协议的字段配置,用于协议规则匹配 + List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); + //获取规则 + RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, + rulePrepareFields, protocolFieldConfigs); + return ruleConfig; + } + return null; } - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + //数据构建,获取固定字段的store和业务字段store + private Map buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + Map bizDataMap = new HashMap<>(); + Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); + Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); + bizDataMap.putAll(ruleStoreObjectMap); + bizDataMap.putAll(protocolStoreObjectMap); return bizDataMap; } - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java index 8a46e32..16ce2e5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java @@ -3,6 +3,7 @@ import io.netty.buffer.ByteBuf; public interface ProtocolParser { + Boolean doParseProtocol(ByteBuf byteBuf); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java new file mode 100644 index 0000000..f7814af --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java @@ -0,0 +1,35 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.ProtocolConfigProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.ProtocolConfig; + +/** + * 存放基本协议的的加载信息 + */ +public class AbstractProtocolConfigFactory { + private final ProtocolConfigProvider protocolConfigProvider; + private final ProtocolFieldConfigProvider protocolFieldConfigProvider; + private final RuleConfigProvider ruleConfigProvider; + + public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { + this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); + this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); + this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); + } + + public ProtocolConfigProvider getProtocolConfigProvider() { + return protocolConfigProvider; + } + + public ProtocolFieldConfigProvider getProtocolFieldConfigProvider() { + return protocolFieldConfigProvider; + } + + public RuleConfigProvider getRuleConfigProvider() { + return ruleConfigProvider; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java new file mode 100644 index 0000000..6e36147 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java @@ -0,0 +1,57 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.CombinedFieldConfigProvider; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.FieldConfigProvider; +import com.casic.missiles.parser.provider.FieldRuleConfigProvider; + +/** + * 存放规则相关的的的加载信息 + */ +public class AbstractRuleConfigFactory { + + /** + * 处理字节 + */ + private final FieldConfigProvider fieldConfigProvider; + /** + * 处理组合字节解析的解码器 + */ + private final CombinedFieldConfigProvider combinedFieldConfigProvider; + /** + * 处理负责字节解析的规则配置 + */ + private final FieldRuleConfigProvider fieldRuleConfigProvider; + /** + * 处理实例流程 + */ + private final DatagramEventProvider datagramEventProvider; + + + public AbstractRuleConfigFactory(Long ruleId) { + this.fieldConfigProvider = new FieldConfigProvider(ruleId); + this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); + this.fieldRuleConfigProvider = new FieldRuleConfigProvider(ruleId); + this.datagramEventProvider = new DatagramEventProvider(ruleId); + } + + public FieldConfigProvider getFieldConfigProvider() { + return fieldConfigProvider; + } + + public CombinedFieldConfigProvider getCombinedFieldConfigProvider() { + return combinedFieldConfigProvider; + } + + public FieldRuleConfigProvider getFieldRuleConfigProvider() { + return fieldRuleConfigProvider; + } + + public DatagramEventProvider getDatagramEventProvider() { + return datagramEventProvider; + } + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java deleted file mode 100644 index 6e1719a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.factory; - - -import com.casic.missiles.pojo.ProtocolConfig; - -import java.util.List; - -/** - * 数据库访问优化(暂时未做) - *

- * 1、初始化协议解析配置,并存放到处存放缓存,对协议基本配置进行管理 - * 2、其中流程中所有的配置都经过此类进行管理,进行调用获取,增强解析速度 - */ -public interface DatagramFactory { - - /** - * 初始化 - */ - List datagramInit(); - - /** - * 根据前导码配置匹配,模糊匹配获取所有的报文项 - */ - List match(); - - /** - * 根据前导码匹配,返回报文项 - */ - List filer(); - - /** - * 保证数据的唯一性选择器 - */ - List selectOne(); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java new file mode 100644 index 0000000..87444a0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java @@ -0,0 +1,18 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +import java.util.List; + +/** + * 直接用,还是边用边创建 + */ +public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { + + + public DefaultProtocolConfigFactory(ProtocolConfig protocolConfig) { + super(protocolConfig); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java new file mode 100644 index 0000000..cce0c7c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java @@ -0,0 +1,12 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; + +public class DefaultRuleFactory extends AbstractRuleConfigFactory { + + public DefaultRuleFactory(Long ruleId) { + super(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java deleted file mode 100644 index 9ee97e0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.casic.missiles.parser.instance; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service -@Slf4j -@AllArgsConstructor -public class GeneralProcessor { - - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; - - /** - * 统一固定字段解析=>进行规则的查询的判断 - * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 - * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 - */ - @Deprecated - public boolean parseWholeDatagram(ByteBuf buffer, ProtocolConfig protocolConfig) { - try { - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap,protocolId); - //选取规则对应的流程= - DatagramEventConfig datagramEventConfig = processorSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); - //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); - //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); - //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); - //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); - //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); - return true; - } catch (Exception ex) { - log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", - ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); - return false; - } - } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; - } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); - } - - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); - return bizDataMap; - } - - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java index 25e7ad8..6a5777e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java @@ -1,23 +1,31 @@ package com.casic.missiles.parser.instance.impl; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.mapper.DatagramEventMapper; import com.casic.missiles.pojo.DatagramEventConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.SpringContextUtil; -@Service -@AllArgsConstructor +import java.util.List; +import java.util.Optional; + +/** + * @author cz + * + */ public class DefaultProcessorInstanceSelector implements ProcessorInstanceSelector { - private final DatagramEventMapper datagramEventMapper; + private static List datagramEventConfigs; + + static { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + datagramEventConfigs = datagramEventRegistry.getDatagramEventList(); + } @Override public DatagramEventConfig getProcessorInstance(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("rule_id", protocolId); - return datagramEventMapper.selectOne(queryWrapper); + Optional optionalSelectInstance = datagramEventConfigs.stream() + .filter(e -> e.getId().equals(protocolId)).limit(1).findFirst(); + return optionalSelectInstance.isPresent() ? optionalSelectInstance.get() : null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a778671..7b56a43 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,16 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import io.netty.buffer.ByteBuf; /** - * 分析匹配情况 - * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 - * 2、匹配不成功,有后续帧,可以进行下次匹配。 - * 3、匹配不成功,无后续帧,可以进行丢弃。 + * 分析匹配情况 + * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 + * 2、匹配不成功,有后续帧,可以进行下次匹配。 + * 3、匹配不成功,无后续帧,可以进行丢弃。 */ -public interface FrameStructMatcher{ +public interface FrameStructMatcher { - ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig); + ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 05320ab..8ebea78 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,23 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.ProtocolConfigMapper; +import com.casic.missiles.parser.provider.ProtocolConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Component; import java.util.List; import java.util.stream.Collectors; -@Component -@AllArgsConstructor public class LeadingCodeMatcher { - private final ProtocolConfigMapper protocolMapper; - //** 1、首字母匹配前导码, // 2、以匹配出的前导码是否在报文中条件进行前导码的匹配二次筛选 - public List matchLeadingCode(String protocolContent){ + public static List matchFrameLeadingCode(String protocolContent){ List initialConfigs = initialMatch(protocolContent); List preCodeConfigs = initialConfigs.stream() .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) @@ -26,13 +19,16 @@ } //初始化匹配前导码内容 - private List initialMatch(String protocolContent) { - String protocolStr = protocolContent.charAt(0) + ""; - QueryWrapper queryWrapper = new QueryWrapper() - .likeRight("pre_fix", protocolStr); - List protocolConfigList = protocolMapper.selectList(queryWrapper); - return protocolConfigList; + private static List initialMatch(String protocolContent) { + String firstFrameChar = protocolContent.charAt(0) + ""; + ProtocolConfigProvider protocolConfigProvider=new ProtocolConfigProvider(firstFrameChar); + return protocolConfigProvider.getMatchList(); } + + + + + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index cf2113d..e915877 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -1,32 +1,35 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(0) -@Service +@Component public class FrameLengthMatcher implements FrameStructMatcher { - @Autowired - private FieldParser fieldParser; - //超过长度 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { String dataGramContent = ByteBufUtil.hexDump(byteBuf); - if (StringUtils.isEmpty(protocolConfig.getUnpackId()) && StringUtils.isEmpty(protocolConfig.getTailStr())) { - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + //当不存在结尾标志和拆包标志,可以直接使用长度进行匹配 + if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { if (dataGramContent.length() >= totalLength) {//等于长度返回true,超出长度,切断 - ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, protocolConfig, totalLength); + ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, totalLength); return wholeDatagramByte; } else { //读的标志位前移舍弃 @@ -38,7 +41,7 @@ return null; } - private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, Integer totalLength) { byteBuf.readBytes(totalLength); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, totalLength - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 2bfc213..d527ad0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; @@ -13,7 +13,7 @@ import lombok.AllArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.nio.charset.Charset; import java.util.Map; @@ -22,32 +22,30 @@ * 后续标志验证 */ @Order(1) -@Service +@Component @AllArgsConstructor -public class FrameMarkMatcher implements FrameStructMatcher { - - private final FieldConfigDao fieldConfigDao; - private final FieldParser fieldParser; - private final FieldResolver fieldResolverManger; +public class FrameMarkMatcher implements FrameStructMatcher, FixedPropertyEnum { //帧后续标志=>结束,进行帧的重组=>有后续,1、帧移位判别 2、继续接收帧 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig UnpackConfig = StringUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getUnpackId()); - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); - Integer upback = 0; + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); ByteBuf mergeWholeFrameByte = null; - if (!ObjectUtil.isEmpty(UnpackConfig)) { - while (hasNextFullFrame(byteBuf, protocolConfig)) { - upback = (Integer) fieldResolverManger.filedParserManger(byteBuf, UnpackConfig, null); + if (!ObjectUtil.isEmpty(unpackFlag)) { + while (hasNextFullFrame(byteBuf, protocolConfig, protocolFieldConfigProvider)) { //是否存在后续位 - if (upback == 1) {//使用esayRule + if (unpackFlag == 1) {//使用esayRule //表示可以截取 - mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolConfig, totalLength); + mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolFieldConfigProvider, protocolConfig); return mergeWholeFrameByte; } else { - byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig)); + byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig, protocolFieldConfigProvider)); } } } @@ -56,7 +54,8 @@ //选取第一个帧,将业务内容和后面部分分开 //计算数据报文-业务内容 - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolFieldConfigProvider protocolFieldConfigProvider, ProtocolConfig protocolConfig) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); //截取完整报文 byteBuf.readBytes(totalLength); ByteBuf byteBufContent = byteBuf.slice(0, byteBuf.readerIndex()); @@ -68,15 +67,15 @@ String tail = ""; System.out.println(ByteBufUtil.hexDump(byteBufContent)); //会存在多个帧拼接在一起的的情况,进行合并处理 - while (hasNextFullFrame(byteBufContent, protocolConfig)) { - Integer currentFrameLength = fieldParser.getTotalLength(protocolConfig, byteBufContent); + while (hasNextFullFrame(byteBufContent, protocolConfig, protocolFieldConfigProvider)) { + Integer currentFrameLength = protocolFieldConfigProvider.getTotalLength(byteBufContent, protocolConfig); byteBufContent.readBytes(currentFrameLength); ByteBuf currentbyteBuf = byteBufContent.slice(0, byteBufContent.readerIndex()); byteBufContent.markReaderIndex();//读的标志位前移 System.out.println(ByteBufUtil.hexDump(byteBufContent)); String hexDump = currentbyteBuf.toString(Charset.forName("ISO-8859-1")); //获取当前固定帧结构的关系map - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, currentbyteBuf); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(currentbyteBuf, protocolConfig); if (StringUtils.isEmpty(mergeFrameStr)) { //首次获取业务数据报文 mergeFrameStr += hexDump.substring(0, currentFrameFixedProperty.get("tailPosition")); @@ -95,22 +94,22 @@ /** * 获取平移到下一帧起始位置 */ - public int getNextFrameOffset(ByteBuf buffer, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, buffer); - return currentFrameFixedProperty.get("totalLength"); + public int getNextFrameOffset(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + return currentFrameFixedProperty.get(TOTAL_LENGTH); } /** * 判断是否出错进行整个帧的 */ - public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, byteBuf); + public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); //保证读取位置不在固定位置,是可变的业务内容 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("fixedPosition")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(FIXED_POSITION)) { return false; } //判断读取是否操作帧长度 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("totalLength")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(TOTAL_LENGTH)) { return false; } return true; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 76a3784..c3a1bab 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -1,50 +1,50 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.parser.instance.GeneralProcessor; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; +import io.netty.buffer.ByteBufUtil;; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(2) -@Service +@Component public class FrameTailMatcher implements FrameStructMatcher { - @Resource - private FieldConfigDao fieldConfigDao; - @Autowired - private GeneralProcessor generalProcessor; - //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig tailFieldConfig = StringUtils.isEmpty(protocolConfig.getTailStr()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getTailStr()); - if (!ObjectUtil.isEmpty(tailFieldConfig)) { - String tailStr = tailFieldConfig.getFieldName(); + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfig protocolFieldConfig = ObjectUtils.isEmpty(protocolConfig.getTailStr()) ? null : + fieldConfigProvider.getFieldConfigById(protocolConfig.getTailStr()); + if (!ObjectUtil.isEmpty(protocolFieldConfig)) { + String tailStr = protocolFieldConfig.getFieldName(); String dataGramContent = ByteBufUtil.hexDump(byteBuf); Boolean tailFlag = ByteBufUtil.hexDump(byteBuf).contains(tailStr); if (!tailFlag) { //使用esayRule return null; } else if (dataGramContent.indexOf(tailStr) < dataGramContent.length() - tailStr.length()) { Integer length = dataGramContent.indexOf(tailStr) + tailStr.length(); - ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, protocolConfig, length); + ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, length); return wholeDatagramByte; //存在粘包 } } return null; } - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer length) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, Integer length) { byteBuf.readBytes(length); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, length - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java new file mode 100644 index 0000000..5f1c177 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java @@ -0,0 +1,73 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.combined.GenericCombinedFieldResolver; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.CombinedFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class CombinedFieldConfigProvider { + + + /** + * 作为临时配置列表缓存使用 + */ + private final List combinedFieldConfigList; + private Map storeObjectMap = new HashMap<>(); + + public CombinedFieldConfigProvider(Long ruleId) { + CombinedFieldConfigRegistry combinedFieldConfigRegistry = SpringContextUtil.getBean(CombinedFieldConfigRegistry.class); + combinedFieldConfigList = combinedFieldConfigRegistry.getCombinedFieldConfigList(ruleId); + } + + public void parseDataField(RuleConfig ruleConfig, String clearZeroPlain,Map fieldConfigsMap ) { + if (showSkip()) { + return; + } + //匹配对应的数据,然后进行相关的字段解析 + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver(); + combinedFieldResolver.parseDataField(combinedFieldConfigList, byteBuf, storeObjectMap,fieldConfigsMap); + } + + + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getCombinedFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return combinedFieldConfigList.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public List getCombinedFieldConfigList() { + return combinedFieldConfigList; + } + + /* 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(combinedFieldConfigList) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java new file mode 100644 index 0000000..f3cfedc --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java @@ -0,0 +1,11 @@ +package com.casic.missiles.parser.provider; + +/** + * @author cz + * @date 2023-6-12 + */ +public class CommandEventProvider{ + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java new file mode 100644 index 0000000..70eec5e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java @@ -0,0 +1,77 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.safe.SafeStrategy; +import com.casic.missiles.parser.sender.DataSubscribeProvider; +import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class DatagramEventProvider { + + private final DatagramEventConfig processorInstance; + + public DatagramEventProvider(Long ruleId) { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + List datagramEventConfigList = + datagramEventRegistry.getDatagramEventList(ruleId); + processorInstance = this.getProcessorInstance(datagramEventConfigList); + } + + public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { + if (showSkip()) { + return null; + } + return datagramEventConfigList.get(0); + } + + // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 + public String getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap) { + String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? + processorInstance.getSafeBean() : + fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); + if (!StringUtils.isEmpty(safeName)) { + //需要加密 + SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); + String plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); + return clearComplementZero(plain); + } + return ByteBufUtil.hexDump(bizDataContent); + } + + //解密清零操作 + private String clearComplementZero(String plain) { + plain = plain.substring(0, plain.lastIndexOf("00")); + return plain; + } + + //数据发送,数据发送者暂未构建 + public void storeData(Map bizDataMap) { + DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); +// dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return ObjectUtils.isNotEmpty(processorInstance) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java new file mode 100644 index 0000000..7e1fe0a --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java @@ -0,0 +1,97 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.FieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class FieldConfigProvider { + + + private final List fieldConfigs; + private Map storeObjectMap = new HashMap<>(); +// private Map singleObjects = new ConcurrentHashMap<>(); + + public FieldConfigProvider(Long ruleId) { + FieldConfigRegistry fieldConfigRegistry = SpringContextUtil.getBean(FieldConfigRegistry.class); + fieldConfigs = fieldConfigRegistry.getFieldConfigList(ruleId); + } + + public List getFieldConfigs() { + return fieldConfigs; + } + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public Map parseDataField(RuleConfig ruleConfig, String clearZeroPlain) { + if (showSkip()) { + return null; + } + List prepareFieldConfig = prepareParseField(ruleConfig); + if (CollectionUtils.isNotEmpty(prepareFieldConfig)) { + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(fieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + return fixDataMap; + } + } + return null; + } + + /** + * 得到需要处理的业务内容 + * + * @return + */ + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return fieldConfigs.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public Map getFieldConfigsMap() { + return fieldConfigs.stream().collect( + Collectors.toMap(FieldConfig::getId, e -> e) + ); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(fieldConfigs) ? false : true; + } + + +} + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java new file mode 100644 index 0000000..817bfaf --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java @@ -0,0 +1,19 @@ +package com.casic.missiles.parser.provider; + +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.registry.FieldRuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; + +public class FieldRuleConfigProvider { + + private final List fieldRuleConfigList; + + public FieldRuleConfigProvider(Long ruleId) { + FieldRuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(FieldRuleConfigRegistry.class); + fieldRuleConfigList = ruleConfigRegistry.getFieldRuleConfigList(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java new file mode 100644 index 0000000..99a1b06 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java @@ -0,0 +1,53 @@ +package com.casic.missiles.parser.provider; + + +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.registry.ProtocolConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolConfigProvider { + + private final List protocolConfigList; + + public ProtocolConfigProvider(String firstChar) { + ProtocolConfigRegistry registry = SpringContextUtil.getBean(ProtocolConfigRegistry.class); + protocolConfigList = registry.getProtocolConfigList(firstChar); + } + + public List getMatchList() { + return protocolConfigList; + } + + /** + * 设置当前协议 + * + * @param protocolConfig + */ + public ProtocolConfigProvider(ProtocolConfig protocolConfig) { + List protocolConfigs = new ArrayList<>(); + protocolConfigs.add(protocolConfig); + protocolConfigList = protocolConfigs; + } + + /** + * 获取当前协议 + * + * @return + */ + public ProtocolConfig getCurrentProtocolConfig() { + if (this.protocolConfigList == null) { + return null; + } else { + return protocolConfigList.get(0); + } + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java new file mode 100644 index 0000000..043927d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java @@ -0,0 +1,213 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.registry.ProtocolFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolFieldConfigProvider { + + private static final String FIXED_FIELD_DS = "fixedFieldDs"; + private static final String CONTENT_FIELD_DS = "contentFieldDs"; + private static final String PROTOCOL_LENGTH = "protocolLength"; + private static final String PROTOCOL_FIELD_ID = "protocolFieldId"; + private static final String PROTOCOL_POSITION = "protocolPosition"; + + private final List protocolFieldConfigs; + private Map singleObjects = new ConcurrentHashMap<>(); + private Map storeObjectMap = new HashMap<>(); + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public ProtocolFieldConfigProvider(Long protocolId) { + ProtocolFieldConfigRegistry protocolFieldConfigRegistry = SpringContextUtil.getBean(ProtocolFieldConfigRegistry.class); + protocolFieldConfigs = protocolFieldConfigRegistry.getProtocolFieldConfigList(protocolId); + } + + public List getProtocolFieldConfigs() { + return protocolFieldConfigs; + } + + public ProtocolFieldConfig getFieldConfigById(Long fieldId) { + Optional optionalConfig = protocolFieldConfigs.stream().filter( + e -> e.getId().equals(fieldId) + ).findFirst(); + return optionalConfig.isPresent() ? optionalConfig.get() : null; + } + + public Integer getProtocolFieldValue(Long protocolFieldId, ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_FIELD_ID + protocolFieldId + ByteBufUtil.hexDump(byteBuf); + //获取缓存 + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + //加载固定长度数据集合 + Map fixDataMap = this.getProtocolDataMap(byteBuf); + ProtocolFieldConfig protocolFieldConfig = selectFieldConfig(protocolFieldId); + Integer protocolFieldValue = 0; + //获取约定字段的总长度 + if (fixDataMap.containsKey(protocolFieldConfig.getFieldName())) { + Object appointUnpackObject = fixDataMap.get(protocolFieldConfig.getFieldName()); + if (ObjectUtils.isNotEmpty(appointUnpackObject)) { + protocolFieldValue = (Integer) appointUnpackObject; + } + } + if (protocolFieldValue != null) { + //加入缓存 + if (ObjectUtils.isNotEmpty(protocolFieldValue)) { + this.singleObjects.put(catchKey, protocolFieldValue); + return protocolFieldValue; + } + } + return null; + } + + /** + * 获取帧固定位置信息 + * + * @param byteBuf + * @param protocolConfig + * @return + */ + public Map getFixedProperty(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_POSITION + protocolConfig.getId(); + if (this.singleObjects.containsKey(catchKey)) { + return (Map) singleObjects.get(catchKey); + } + Map fixedPropertyMap = new HashMap<>(); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + fixedPropertyMap = fieldParser.doGetFixedProperty(protocolFieldConfigs, this.getTotalLength(byteBuf,protocolConfig)); + if (CollectionUtils.isNotEmpty(fixedPropertyMap)) { + this.singleObjects.put(catchKey, fixedPropertyMap); + return fixedPropertyMap; + } + return fixedPropertyMap; + } + + /** + * 获取帧结构应有的总长度 + */ + public Integer getTotalLength(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_LENGTH + ByteBufUtil.hexDump(byteBuf); + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + Integer appointFrameLength = getProtocolFieldValue(protocolConfig.getTotalLengthId(), byteBuf); + if (appointFrameLength != null) { + //获取过滤的字段集合总长度 + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Integer totalFilterLength = fieldParser.getTotalFilterLength(protocolConfig, byteBuf, getFixFieldConfigMap()); + //计算总长度 + Integer totalLength = appointFrameLength + totalFilterLength; + //加入缓存 + if (ObjectUtils.isNotEmpty(totalLength)) { + this.singleObjects.put(catchKey, totalLength); + return totalLength; + } + } + return null; + } + + /** + * 获取协议有关字段解析内容 + * storeObjectMap存储代转存的数据 + * + * @return + */ + public Map getProtocolDataMap(ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(FIXED_FIELD_DS)) { + return (Map) singleObjects.get(FIXED_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(protocolFieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + this.singleObjects.put(FIXED_FIELD_DS, fixDataMap); + return fixDataMap; + } + return null; + } + + /** + * 获取业务报文内容的content字节 + * + * @param wholeDatagramByte + * @return + */ + public ByteBuf getDataContentBuf(ByteBuf wholeDatagramByte) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(CONTENT_FIELD_DS)) { + return (ByteBuf) singleObjects.get(CONTENT_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + ByteBuf bizDataByteBuf = fieldParser.getDataContentBuf(protocolFieldConfigs, wholeDatagramByte); + if (bizDataByteBuf != null) { + this.singleObjects.put(CONTENT_FIELD_DS, bizDataByteBuf); + return bizDataByteBuf; + } + return null; + } + + + private ProtocolFieldConfig selectFieldConfig(Long id) { + Optional optionalProtocolFieldConfig = this.protocolFieldConfigs.stream().filter( + e -> e.getId().equals(id) + ).findFirst(); + return optionalProtocolFieldConfig.isPresent() ? optionalProtocolFieldConfig.get() : null; + } + + + private Map getFixFieldConfigMap() { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, e -> e) + ); + return fixDataFieldMap; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(protocolFieldConfigs) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java new file mode 100644 index 0000000..dafba1c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java @@ -0,0 +1,56 @@ +package com.casic.missiles.parser.provider; + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.rule.GenericRuleResolver; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.RuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleConfigProvider { + + private final List ruleConfigs; + + public List getRuleConfigs() { + return ruleConfigs; + } + + public RuleConfigProvider(Long protocolId) { + RuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(RuleConfigRegistry.class); + ruleConfigs = ruleConfigRegistry.getRuleConfigById(protocolId); + } + + /** + * 获取规则匹配结果 + * + * @param parseFixedDataMap + * @param protocolFieldConfigs + * @return + */ + public RuleConfig doGetRule(Map parseFixedDataMap, + String ids, + List protocolFieldConfigs) { + if (showSkip()) { + return null; + } + RuleConfig ruleConfig = GenericRuleResolver.machRule(parseFixedDataMap, ids, protocolFieldConfigs, ruleConfigs); + return ruleConfig; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(ruleConfigs) ? false : true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java index 3c05891..856b399 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java @@ -1,18 +1,11 @@ package com.casic.missiles.parser.resolver; -import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.springframework.web.bind.annotation.RequestBody; -import javax.annotation.Resource; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -20,19 +13,17 @@ @Slf4j public class ByteMergeProvider { - @Resource - private FieldRuleEngineMapper fieldRuleEngineMapper; - //拿到所有的值合并到一个值 - public String resolveByteMerge(List valueList, String ruletypeId, String vaildRange) { + public static String resolveByteMerge(List valueList, String ruleTypeId, String vaildRange) { String values = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Map vaildMap = getValidRangeMap(vaildRange); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(ruletypeId); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } + //暂时不处理 +// fieldRuleEngine = fieldRuleConfigMapper.selectById(ruleTypeId); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } Map env2 = new HashMap(); for (int i = 0; i < valueList.size(); i++) { if (vaildMap.containsKey(i)) { @@ -47,7 +38,7 @@ } } - private Map getValidRangeMap(String vaildRange) { + private static Map getValidRangeMap(String vaildRange) { String[] range = vaildRange.split(","); Map vaildMap = new HashMap(); for (int i = 0; i < range.length; i++) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 8d821cd..85d6bbf 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -1,9 +1,12 @@ package com.casic.missiles.parser.resolver; +import com.casic.missiles.pojo.AbstractFieldConfig; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; import io.netty.buffer.ByteBuf; +import java.util.List; import java.util.Map; /** @@ -11,18 +14,14 @@ */ public interface FieldParser { -// Map fieldProcess(String protocolContent,); - Map dataParser(RuleConfig ruleConfig, String lightText,String protocolId); + Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength); - Map fixDataParser(String protocolId, ByteBuf buffer); + Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap); - Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf); + ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer); - ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer); - - ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer); - - Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer); + Integer getTotalFilterLength(ProtocolConfig protocolConfig, ByteBuf byteBuf, Map protocolFieldConfigMap); } + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java new file mode 100644 index 0000000..9e0c00e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java @@ -0,0 +1,52 @@ +package com.casic.missiles.parser.resolver; + +import com.casic.missiles.pojo.AbstractFieldConfig; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.util.List; + +public class FieldParserSupport { + + //分别计算bit和byte长度=> 合并长度 + protected Integer calculateLength(List fieldConfigList) { + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + Integer fixedLength = bytefixedLength + bitfixedLength / 8; + return fixedLength; + } + + //找到最大值=> 根据最大值计算业务数据下标 + protected Integer calculatePosition(List fieldConfigList) { + String rex = "[0-9]+"; + Integer max = -1; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) + && Integer.valueOf(fieldConfig.getOriginPositionByte()) > max) { + max = Integer.valueOf(fieldConfig.getOriginPositionByte()); + } + } + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) && fieldConfig.getOriginPositionByte().equals(max)) { + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + } + } + Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; + return maxFixedPosition; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java deleted file mode 100644 index dd3a6cd..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java +++ /dev/null @@ -1,170 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.ByteResolverParam; -import io.netty.buffer.ByteBuf; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -/** - * 字段解析管理总类 - */ -@Service -@Slf4j -@AllArgsConstructor -public class FieldResolver extends ByteMergeProvider { - - //1、字段截取 => 2、简单的字节解析和复杂的字节解析 - public Object filedParserManger(ByteBuf byteBuf, FieldConfig fieldConfig, Integer maxFixedPosition) { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - //最大固定位置不为空, - if (!ObjectUtil.isEmpty(maxFixedPosition)) { - orignPosition -= maxFixedPosition; - } - Object fieldValue = 0; - //待优化 - if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { - fieldValue = bitToResolver(byteBuf, fieldConfig); - } else { - ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); - fieldValue = parsingFields(fieldBytes, fieldConfig.getRuleJson()); - } - return fieldValue; - } - - //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, - //目前默认配置的规则设置暂不支持配置化,由实现完成 - private Object parsingFields(ByteBuf byteBuf, String ruleJson) { - Object fieldsResolveValue = null; - List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); - if (ObjectUtil.isEmpty(ruleMapList)) { - fieldsResolveValue = defaultResolveBuilder(byteBuf); - } else { - fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); - } - return fieldsResolveValue; - } - - private Object defaultResolveBuilder(ByteBuf byteBuf) { - Integer defaultResolveValue = 0; - for (int i = 0; i < byteBuf.writerIndex(); i++) { - defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; - } - return defaultResolveValue; - } - - //字段解析构建器(针对字节单位的) - //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 - // 字节归并结束或者规则结束=>继续根据规则进行判断 - private Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { - Object customizeResolveValue = null; - try { - List bytStrList = new ArrayList<>(); - //存放到数组里面 - for (int i = 0; i < byteBuf.writerIndex(); i++) { - bytStrList.add(byteBuf.readByte()); - } - int i = 0; - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - customizeResolveValue = this.resolveByteMerge(bytStrList, ruletypeId,vaildRange); - break; - } else { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - List tempBytStr = new ArrayList<>(); - for (int k = 0; i < bytStrList.size(); i++) { - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(k) - .value(bytStrList.get(k)) - .ruletypeId(ruletypeId).build(); - tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); - } - bytStrList = tempBytStr; - } - i++; - } - //字节归并到一起=>继续根据规则进行判断 - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(customizeResolveValue) - .ruletypeId(ruletypeId).build(); - customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(customizeResolveValue)); - return customizeResolveValue; - } catch (RuntimeException ex) { - log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); - return null; - } - } - - /** - * 1、单个字节情况表示字段 - * 2、多字节情况表示字段(暂未处理) - */ - private Object bitToResolver(ByteBuf byteBuf, FieldConfig fieldConfig) { - Object fieldValue = new Object(); - try { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - byte fields = 0x00; - if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); - } else { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); - } - - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { - if (!StringUtils.isEmpty(fieldConfig.getExactOrignPosition())) { - fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getExactOrignPosition())).byteValue() - >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); - } else { - fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); - } - } else { - fieldValue = Integer.valueOf(fields & 0xff); - } - if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { - return fieldValue; - } - List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); - int i = 0; - //字节归并到一起=>继续根据规则进行判断 - while (i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(fieldValue) - .ruletypeId(ruletypeId).build(); - fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(fieldValue)); - return fieldValue; - } catch (RuntimeException ex) { - log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); - return null; - } - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java index 608af3a..32cc8a4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java @@ -2,48 +2,47 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.delivery.decorator.ByteDecorator; +import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @AllArgsConstructor public class FieldDecoratorManger { - private final RuleDictDao ruleDictDao; + private final RuleConfigRegistry ruleDictDao; // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 // (1)静态的业务字段是字典里面可以配置的 // (2)动态的业务字段是通过规则生成的 public String contentMerge(String ruleJson, String sceneConent, String dynamicContent) { - List ruleDictList = ruleDictDao.getRuleDictConfig(); - Map ruleDictMap = ruleDictList.stream().collect( - Collectors.toMap(RuleDict::getId, e -> e)); - List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); - for (Map ruleMap : ruleMapList) { - String ruleType = String.valueOf(ruleMap.get("ruleType")); - ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); - NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); - byteDecorator.nodeDecoratorRule(nodeDecoratorParm); - } +// List ruleDictList = ruleDictDao.getRuleDictConfig(); +// Map ruleDictMap = ruleDictList.stream().collect( +// Collectors.toMap(RuleDict::getId, e -> e)); +// List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); +// for (Map ruleMap : ruleMapList) { +// String ruleType = String.valueOf(ruleMap.get("ruleType")); +// ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); +// NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); +// byteDecorator.nodeDecoratorRule(nodeDecoratorParm); +// } return null; } - - private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { - NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() - .contents(sceneConent) - .dynamicContent(dynamicContent) - .ruletypeId(ruletypeId) - .ruleDictMap(ruleDictMap) - .build(); - return nodeDecoratorParm; - } +// +// private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { +// NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() +// .contents(sceneConent) +// .dynamicContent(dynamicContent) +// .ruletypeId(ruletypeId) +// .ruleDictMap(ruleDictMap) +// .build(); +// return nodeDecoratorParm; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java index 652970c..b204ac3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java @@ -1,56 +1,56 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@AllArgsConstructor -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", - JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Component; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Component("logicalDecorator") +//@AllArgsConstructor +//@Slf4j +//public class LogicalShiftDecorator implements ByteDecorator { +// +//// private final FieldRuleEngineMapper fieldRuleEngineMapper; +//// +//// //字节位移 +//// @Override +//// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +//// String logicalValue = ""; +//// RuleEvaluator fieldRuleEngine = new RuleEvaluator(); +//// try { +//// Map env2 = new HashMap(); +//// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +//// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +//// for (String contentId : contentIdList) { +//// RuleDict ruleDict = ruleDictMap.get(contentId); +//// if (ruleDict.getCode().contains("#")) { +//// //使用动态的值 +//// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +//// } +//// env2.put(ruleDict.getName(), ruleDict.getCode()); +//// } +//// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +//// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +//// return null; +//// } +//// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +//// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +//// return values; +//// } catch (Exception ex) { +//// log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", +//// JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +//// return null; +//// } +//// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java index 346468f..822fead 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@AllArgsConstructor -@Slf4j -public class OperationDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("optionDecorator") +//@AllArgsConstructor +//@Slf4j +//public class OperationDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //混合运算,有常量或者乘除的缩放 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java index 50fb0a7..7a8bccb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@AllArgsConstructor -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +////精度计算 +//@AllArgsConstructor +//@Registry("precisionDecorator") +//@Slf4j +//public class PrecisionDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java index da39235..27f9cc7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java @@ -1,54 +1,53 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@AllArgsConstructor -@Slf4j -public class RuleDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("ruleDecorator") +//@AllArgsConstructor +//@Slf4j +//public class RuleDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //吃我一套正则表达式 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (Exception ex) { +// log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java index 7f5cbf3..c043f97 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java @@ -2,6 +2,6 @@ import java.util.Map; -public interface ComandeEventService { +public interface ComandeEventService{ Map loadComandeEventConfig(String protocolId,String scene); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java index 476ad84..aaf1837 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java @@ -2,46 +2,46 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.dao.CommandEventDao; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @Slf4j @AllArgsConstructor -public class ComandeEventServiceImpl implements ComandeEventService { +public class ComandeEventServiceImpl implements ComandeEventRegistry { - private final CommandEventDao commandEventDao; + // private final CommandEventDao commandEventDao; // 加密bean 固定字段出现变化的字段解析,业务字段的有序内容 @Override - public Map loadComandeEventConfig(String protocolId,String sceneName) { - CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); - if (ObjectUtil.isEmpty(commandEventConfig)) { - log.error("协议{},没有配置成功接收回复配置,清排查原因"); - return null; - } - String replyJson = commandEventConfig.getReplyContentJson(); - List> replyMapList = JSONArray.parseObject(replyJson, List.class); - List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); - Map fixMap = fixList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); - List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) - .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) - .collect(Collectors.toList()); - Map commandConfigMap = new HashMap<>(); - commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); - commandConfigMap.put("fixContent", fixMap); - commandConfigMap.put("bizContent", contentList); - return commandConfigMap; + public Map loadComandeEventConfig(String protocolId, String sceneName) { +// CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); +// if (ObjectUtil.isEmpty(commandEventConfig)) { +// log.error("协议{},没有配置成功接收回复配置,清排查原因"); +// return null; +// } +// String replyJson = commandEventConfig.getReplyContentJson(); +// List> replyMapList = JSONArray.parseObject(replyJson, List.class); +// List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); +// Map fixMap = fixList.stream() +// .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); +// List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) +// .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) +// .collect(Collectors.toList()); +// Map commandConfigMap = new HashMap<>(); +// commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); +// commandConfigMap.put("fixContent", fixMap); +// commandConfigMap.put("bizContent", contentList); +// return commandConfigMap; + return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 128b09d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java deleted file mode 100644 index 4016b0b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface DatagramEventMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java deleted file mode 100644 index 597c306..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.apache.ibatis.annotations.Mapper; - -public interface FieldConfigMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java deleted file mode 100644 index a31680a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.PreRuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface PreRuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java deleted file mode 100644 index 9060a69..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface ProtocolConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java deleted file mode 100644 index 6fa6936..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java deleted file mode 100644 index 582a705..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleDict; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleDictMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java deleted file mode 100644 index 6e302c8..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.CommandEventMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Optional; - -@Component -public class CommandEventDao { - - @Resource - private CommandEventMapper commandEventMapper; - - public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId) - .eq("scene", sceneName) - .eq("enabled", 1); - List commandEventConfig = commandEventMapper.selectList(queryWrapper); - Optional optionalEventConfig = commandEventConfig.stream().findFirst(); - return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java deleted file mode 100644 index 9137e4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.FieldConfigMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class FieldConfigDao { - - @Resource - private FieldConfigMapper fieldConfigMapper; - - public FieldConfig getFieldConfigById(String fieldId) { - FieldConfig fieldConfig = fieldConfigMapper.selectById(fieldId); - return fieldConfig; - } - - public List getFieldConfigs(String protocolId,Integer isFixed) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",isFixed); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - - public List getStorageFieldConfig(String protocolId) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",1) - .eq("is_storage",1); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java deleted file mode 100644 index 67bff6b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.mapper.PreRuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class PreRuleConfigDao { - - @Resource - private PreRuleConfigMapper preRuleConfigMapper; - - public List getPreRuleList(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return preRuleConfigMapper.selectList(queryWrapper); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java deleted file mode 100644 index d69ea85..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.RuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleConfigDao { - - @Resource - private RuleConfigMapper ruleConfigMapper; - - public RuleConfig getNextRuleConfig(String ruleFields) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("parse_rule_json", ruleFields); - return ruleConfigMapper.selectOne(queryWrapper); - } - - - public List getRuleConfigById(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return ruleConfigMapper.selectList(queryWrapper); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java deleted file mode 100644 index 932c185..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.RuleDictMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleDictDao { - - @Resource - private RuleDictMapper ruleDictMapper; - - public List getRuleDictConfig() { - List ruleDictList = ruleDictMapper.selectList(null); - return ruleDictList; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java index 9f9e279..43bc4d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java @@ -10,20 +10,15 @@ import io.netty.channel.socket.nio.NioServerSocketChannel; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import javax.annotation.PreDestroy; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static cn.hutool.core.util.ClassUtil.getClasses; /** * SensorhubServer netty服务端 */ @Slf4j -@Service +@Component public class SensorhubServer { /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java index 2c79ff5..9a28c36 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java @@ -11,13 +11,13 @@ import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioSocketChannel; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClient 客户端 */ @Slf4j -@Service +@Registry public final class SensorhubClient { public static void main(String[] args) throws Exception { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java index 9774be0..477c3f7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java @@ -6,12 +6,12 @@ import io.netty.channel.socket.SocketChannel; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientChannelInitialHandler */ -@Service +@Registry public class SensorhubClientChannelInitialHandler extends ChannelInitializer { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java index 346f4b3..73560e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java @@ -5,13 +5,13 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientHandler */ @Slf4j -@Service +@Registry public class SensorhubClientHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java index 5c1c6f2..d990af5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java @@ -4,12 +4,12 @@ import com.casic.missiles.pojo.Msg; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** * SensorhubServerHandler */ -@Service +@Component public class SensorhubServerHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 67283ae..af3172c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,41 +1,37 @@ package com.casic.missiles.parser; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultProtocolConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.*; +import com.casic.missiles.registry.FieldConfigRegistry; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; -import java.nio.charset.Charset; import java.util.HashMap; import java.util.List; import java.util.Map; -@Service("genericProtocolParser") +/** + * @author + */ +@Component("genericProtocolParser") @Slf4j -@AllArgsConstructor +@RequiredArgsConstructor public class GenericProtocolParser implements ProtocolParser { - private final LeadingCodeMatcher leadingCodeMatcher; private final List frameStructDispenserList; - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorInstanceSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; // 匹配首字母前导码=> 帧结构匹配前导码=> // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 @@ -44,18 +40,19 @@ public Boolean doParseProtocol(ByteBuf byteBuf) { String protocolContent = ByteBufUtil.hexDump(byteBuf); //匹配前导码 - List preCodeConfigs = leadingCodeMatcher.matchLeadingCode(protocolContent); + List preCodeConfigs = LeadingCodeMatcher.matchFrameLeadingCode(protocolContent); //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 if (preCodeConfigs.size() == 0) { - return rematch(byteBuf,protocolContent); + return rematch(byteBuf, protocolContent); } - //暂时先取第一个 + //暂时先取第一个,提升速度,使用享元模式, 减少类的创建销毁与构建 ProtocolConfig protocolConfig = preCodeConfigs.get(0); + AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); ByteBuf wholeDatagramByte = null; //通过匹配帧结构获取完整的数据包 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, preCodeConfigs.get(0))) != null) { + if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, protocolFactory)) != null) { break; } } @@ -68,76 +65,78 @@ * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 */ - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId, wholeDatagramByte); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap, protocolId); - //选取规则对应的流程实例 - DatagramEventConfig datagramEventConfig = processorInstanceSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); + //进行规则字段解析,进行匹配规则 + RuleConfig ruleConfig = getRuleConfig(protocolFactory, wholeDatagramByte); + if (ruleConfig == null) { + return false; + } //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, wholeDatagramByte); + ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte); + //以下进行业务的规则解析,同时选定流程实例 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); + DatagramEventProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain, + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText, protocolId); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain); //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); + datagramEventProvider.storeData(bizDataMap); return true; } - private Boolean rematch(ByteBuf byteBuf,String protocolContent) { + /** + * 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 + */ + private Boolean rematch(ByteBuf byteBuf, String protocolContent) { //重置位判断 byteBuf.resetReaderIndex(); //判断重置是否前移,如果没有前移,则直接判为匹配失败 if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { return false; } else { + //递归执行 return doParseProtocol(byteBuf); } } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; + //获取匹配规则->匹配规则 + private RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + //取出其中参与逻辑provider并判空 + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); + String rulePrepareFields = protocolConfig.getRulePrepareFields(); + //固定字段 + if (StringUtils.isNotEmpty(rulePrepareFields)) { + //获取统一固定字段解析 + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + //获取该协议的字段配置,用于协议规则匹配 + List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); + //获取规则 + RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, + rulePrepareFields, protocolFieldConfigs); + return ruleConfig; + } + return null; } - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + //数据构建,获取固定字段的store和业务字段store + private Map buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + Map bizDataMap = new HashMap<>(); + Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); + Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); + bizDataMap.putAll(ruleStoreObjectMap); + bizDataMap.putAll(protocolStoreObjectMap); return bizDataMap; } - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java index 8a46e32..16ce2e5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java @@ -3,6 +3,7 @@ import io.netty.buffer.ByteBuf; public interface ProtocolParser { + Boolean doParseProtocol(ByteBuf byteBuf); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java new file mode 100644 index 0000000..f7814af --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java @@ -0,0 +1,35 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.ProtocolConfigProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.ProtocolConfig; + +/** + * 存放基本协议的的加载信息 + */ +public class AbstractProtocolConfigFactory { + private final ProtocolConfigProvider protocolConfigProvider; + private final ProtocolFieldConfigProvider protocolFieldConfigProvider; + private final RuleConfigProvider ruleConfigProvider; + + public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { + this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); + this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); + this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); + } + + public ProtocolConfigProvider getProtocolConfigProvider() { + return protocolConfigProvider; + } + + public ProtocolFieldConfigProvider getProtocolFieldConfigProvider() { + return protocolFieldConfigProvider; + } + + public RuleConfigProvider getRuleConfigProvider() { + return ruleConfigProvider; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java new file mode 100644 index 0000000..6e36147 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java @@ -0,0 +1,57 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.CombinedFieldConfigProvider; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.FieldConfigProvider; +import com.casic.missiles.parser.provider.FieldRuleConfigProvider; + +/** + * 存放规则相关的的的加载信息 + */ +public class AbstractRuleConfigFactory { + + /** + * 处理字节 + */ + private final FieldConfigProvider fieldConfigProvider; + /** + * 处理组合字节解析的解码器 + */ + private final CombinedFieldConfigProvider combinedFieldConfigProvider; + /** + * 处理负责字节解析的规则配置 + */ + private final FieldRuleConfigProvider fieldRuleConfigProvider; + /** + * 处理实例流程 + */ + private final DatagramEventProvider datagramEventProvider; + + + public AbstractRuleConfigFactory(Long ruleId) { + this.fieldConfigProvider = new FieldConfigProvider(ruleId); + this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); + this.fieldRuleConfigProvider = new FieldRuleConfigProvider(ruleId); + this.datagramEventProvider = new DatagramEventProvider(ruleId); + } + + public FieldConfigProvider getFieldConfigProvider() { + return fieldConfigProvider; + } + + public CombinedFieldConfigProvider getCombinedFieldConfigProvider() { + return combinedFieldConfigProvider; + } + + public FieldRuleConfigProvider getFieldRuleConfigProvider() { + return fieldRuleConfigProvider; + } + + public DatagramEventProvider getDatagramEventProvider() { + return datagramEventProvider; + } + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java deleted file mode 100644 index 6e1719a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.factory; - - -import com.casic.missiles.pojo.ProtocolConfig; - -import java.util.List; - -/** - * 数据库访问优化(暂时未做) - *

- * 1、初始化协议解析配置,并存放到处存放缓存,对协议基本配置进行管理 - * 2、其中流程中所有的配置都经过此类进行管理,进行调用获取,增强解析速度 - */ -public interface DatagramFactory { - - /** - * 初始化 - */ - List datagramInit(); - - /** - * 根据前导码配置匹配,模糊匹配获取所有的报文项 - */ - List match(); - - /** - * 根据前导码匹配,返回报文项 - */ - List filer(); - - /** - * 保证数据的唯一性选择器 - */ - List selectOne(); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java new file mode 100644 index 0000000..87444a0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java @@ -0,0 +1,18 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +import java.util.List; + +/** + * 直接用,还是边用边创建 + */ +public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { + + + public DefaultProtocolConfigFactory(ProtocolConfig protocolConfig) { + super(protocolConfig); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java new file mode 100644 index 0000000..cce0c7c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java @@ -0,0 +1,12 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; + +public class DefaultRuleFactory extends AbstractRuleConfigFactory { + + public DefaultRuleFactory(Long ruleId) { + super(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java deleted file mode 100644 index 9ee97e0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.casic.missiles.parser.instance; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service -@Slf4j -@AllArgsConstructor -public class GeneralProcessor { - - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; - - /** - * 统一固定字段解析=>进行规则的查询的判断 - * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 - * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 - */ - @Deprecated - public boolean parseWholeDatagram(ByteBuf buffer, ProtocolConfig protocolConfig) { - try { - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap,protocolId); - //选取规则对应的流程= - DatagramEventConfig datagramEventConfig = processorSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); - //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); - //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); - //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); - //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); - //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); - return true; - } catch (Exception ex) { - log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", - ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); - return false; - } - } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; - } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); - } - - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); - return bizDataMap; - } - - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java index 25e7ad8..6a5777e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java @@ -1,23 +1,31 @@ package com.casic.missiles.parser.instance.impl; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.mapper.DatagramEventMapper; import com.casic.missiles.pojo.DatagramEventConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.SpringContextUtil; -@Service -@AllArgsConstructor +import java.util.List; +import java.util.Optional; + +/** + * @author cz + * + */ public class DefaultProcessorInstanceSelector implements ProcessorInstanceSelector { - private final DatagramEventMapper datagramEventMapper; + private static List datagramEventConfigs; + + static { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + datagramEventConfigs = datagramEventRegistry.getDatagramEventList(); + } @Override public DatagramEventConfig getProcessorInstance(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("rule_id", protocolId); - return datagramEventMapper.selectOne(queryWrapper); + Optional optionalSelectInstance = datagramEventConfigs.stream() + .filter(e -> e.getId().equals(protocolId)).limit(1).findFirst(); + return optionalSelectInstance.isPresent() ? optionalSelectInstance.get() : null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a778671..7b56a43 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,16 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import io.netty.buffer.ByteBuf; /** - * 分析匹配情况 - * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 - * 2、匹配不成功,有后续帧,可以进行下次匹配。 - * 3、匹配不成功,无后续帧,可以进行丢弃。 + * 分析匹配情况 + * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 + * 2、匹配不成功,有后续帧,可以进行下次匹配。 + * 3、匹配不成功,无后续帧,可以进行丢弃。 */ -public interface FrameStructMatcher{ +public interface FrameStructMatcher { - ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig); + ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 05320ab..8ebea78 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,23 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.ProtocolConfigMapper; +import com.casic.missiles.parser.provider.ProtocolConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Component; import java.util.List; import java.util.stream.Collectors; -@Component -@AllArgsConstructor public class LeadingCodeMatcher { - private final ProtocolConfigMapper protocolMapper; - //** 1、首字母匹配前导码, // 2、以匹配出的前导码是否在报文中条件进行前导码的匹配二次筛选 - public List matchLeadingCode(String protocolContent){ + public static List matchFrameLeadingCode(String protocolContent){ List initialConfigs = initialMatch(protocolContent); List preCodeConfigs = initialConfigs.stream() .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) @@ -26,13 +19,16 @@ } //初始化匹配前导码内容 - private List initialMatch(String protocolContent) { - String protocolStr = protocolContent.charAt(0) + ""; - QueryWrapper queryWrapper = new QueryWrapper() - .likeRight("pre_fix", protocolStr); - List protocolConfigList = protocolMapper.selectList(queryWrapper); - return protocolConfigList; + private static List initialMatch(String protocolContent) { + String firstFrameChar = protocolContent.charAt(0) + ""; + ProtocolConfigProvider protocolConfigProvider=new ProtocolConfigProvider(firstFrameChar); + return protocolConfigProvider.getMatchList(); } + + + + + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index cf2113d..e915877 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -1,32 +1,35 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(0) -@Service +@Component public class FrameLengthMatcher implements FrameStructMatcher { - @Autowired - private FieldParser fieldParser; - //超过长度 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { String dataGramContent = ByteBufUtil.hexDump(byteBuf); - if (StringUtils.isEmpty(protocolConfig.getUnpackId()) && StringUtils.isEmpty(protocolConfig.getTailStr())) { - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + //当不存在结尾标志和拆包标志,可以直接使用长度进行匹配 + if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { if (dataGramContent.length() >= totalLength) {//等于长度返回true,超出长度,切断 - ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, protocolConfig, totalLength); + ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, totalLength); return wholeDatagramByte; } else { //读的标志位前移舍弃 @@ -38,7 +41,7 @@ return null; } - private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, Integer totalLength) { byteBuf.readBytes(totalLength); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, totalLength - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 2bfc213..d527ad0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; @@ -13,7 +13,7 @@ import lombok.AllArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.nio.charset.Charset; import java.util.Map; @@ -22,32 +22,30 @@ * 后续标志验证 */ @Order(1) -@Service +@Component @AllArgsConstructor -public class FrameMarkMatcher implements FrameStructMatcher { - - private final FieldConfigDao fieldConfigDao; - private final FieldParser fieldParser; - private final FieldResolver fieldResolverManger; +public class FrameMarkMatcher implements FrameStructMatcher, FixedPropertyEnum { //帧后续标志=>结束,进行帧的重组=>有后续,1、帧移位判别 2、继续接收帧 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig UnpackConfig = StringUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getUnpackId()); - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); - Integer upback = 0; + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); ByteBuf mergeWholeFrameByte = null; - if (!ObjectUtil.isEmpty(UnpackConfig)) { - while (hasNextFullFrame(byteBuf, protocolConfig)) { - upback = (Integer) fieldResolverManger.filedParserManger(byteBuf, UnpackConfig, null); + if (!ObjectUtil.isEmpty(unpackFlag)) { + while (hasNextFullFrame(byteBuf, protocolConfig, protocolFieldConfigProvider)) { //是否存在后续位 - if (upback == 1) {//使用esayRule + if (unpackFlag == 1) {//使用esayRule //表示可以截取 - mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolConfig, totalLength); + mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolFieldConfigProvider, protocolConfig); return mergeWholeFrameByte; } else { - byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig)); + byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig, protocolFieldConfigProvider)); } } } @@ -56,7 +54,8 @@ //选取第一个帧,将业务内容和后面部分分开 //计算数据报文-业务内容 - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolFieldConfigProvider protocolFieldConfigProvider, ProtocolConfig protocolConfig) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); //截取完整报文 byteBuf.readBytes(totalLength); ByteBuf byteBufContent = byteBuf.slice(0, byteBuf.readerIndex()); @@ -68,15 +67,15 @@ String tail = ""; System.out.println(ByteBufUtil.hexDump(byteBufContent)); //会存在多个帧拼接在一起的的情况,进行合并处理 - while (hasNextFullFrame(byteBufContent, protocolConfig)) { - Integer currentFrameLength = fieldParser.getTotalLength(protocolConfig, byteBufContent); + while (hasNextFullFrame(byteBufContent, protocolConfig, protocolFieldConfigProvider)) { + Integer currentFrameLength = protocolFieldConfigProvider.getTotalLength(byteBufContent, protocolConfig); byteBufContent.readBytes(currentFrameLength); ByteBuf currentbyteBuf = byteBufContent.slice(0, byteBufContent.readerIndex()); byteBufContent.markReaderIndex();//读的标志位前移 System.out.println(ByteBufUtil.hexDump(byteBufContent)); String hexDump = currentbyteBuf.toString(Charset.forName("ISO-8859-1")); //获取当前固定帧结构的关系map - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, currentbyteBuf); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(currentbyteBuf, protocolConfig); if (StringUtils.isEmpty(mergeFrameStr)) { //首次获取业务数据报文 mergeFrameStr += hexDump.substring(0, currentFrameFixedProperty.get("tailPosition")); @@ -95,22 +94,22 @@ /** * 获取平移到下一帧起始位置 */ - public int getNextFrameOffset(ByteBuf buffer, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, buffer); - return currentFrameFixedProperty.get("totalLength"); + public int getNextFrameOffset(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + return currentFrameFixedProperty.get(TOTAL_LENGTH); } /** * 判断是否出错进行整个帧的 */ - public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, byteBuf); + public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); //保证读取位置不在固定位置,是可变的业务内容 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("fixedPosition")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(FIXED_POSITION)) { return false; } //判断读取是否操作帧长度 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("totalLength")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(TOTAL_LENGTH)) { return false; } return true; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 76a3784..c3a1bab 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -1,50 +1,50 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.parser.instance.GeneralProcessor; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; +import io.netty.buffer.ByteBufUtil;; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(2) -@Service +@Component public class FrameTailMatcher implements FrameStructMatcher { - @Resource - private FieldConfigDao fieldConfigDao; - @Autowired - private GeneralProcessor generalProcessor; - //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig tailFieldConfig = StringUtils.isEmpty(protocolConfig.getTailStr()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getTailStr()); - if (!ObjectUtil.isEmpty(tailFieldConfig)) { - String tailStr = tailFieldConfig.getFieldName(); + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfig protocolFieldConfig = ObjectUtils.isEmpty(protocolConfig.getTailStr()) ? null : + fieldConfigProvider.getFieldConfigById(protocolConfig.getTailStr()); + if (!ObjectUtil.isEmpty(protocolFieldConfig)) { + String tailStr = protocolFieldConfig.getFieldName(); String dataGramContent = ByteBufUtil.hexDump(byteBuf); Boolean tailFlag = ByteBufUtil.hexDump(byteBuf).contains(tailStr); if (!tailFlag) { //使用esayRule return null; } else if (dataGramContent.indexOf(tailStr) < dataGramContent.length() - tailStr.length()) { Integer length = dataGramContent.indexOf(tailStr) + tailStr.length(); - ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, protocolConfig, length); + ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, length); return wholeDatagramByte; //存在粘包 } } return null; } - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer length) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, Integer length) { byteBuf.readBytes(length); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, length - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java new file mode 100644 index 0000000..5f1c177 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java @@ -0,0 +1,73 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.combined.GenericCombinedFieldResolver; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.CombinedFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class CombinedFieldConfigProvider { + + + /** + * 作为临时配置列表缓存使用 + */ + private final List combinedFieldConfigList; + private Map storeObjectMap = new HashMap<>(); + + public CombinedFieldConfigProvider(Long ruleId) { + CombinedFieldConfigRegistry combinedFieldConfigRegistry = SpringContextUtil.getBean(CombinedFieldConfigRegistry.class); + combinedFieldConfigList = combinedFieldConfigRegistry.getCombinedFieldConfigList(ruleId); + } + + public void parseDataField(RuleConfig ruleConfig, String clearZeroPlain,Map fieldConfigsMap ) { + if (showSkip()) { + return; + } + //匹配对应的数据,然后进行相关的字段解析 + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver(); + combinedFieldResolver.parseDataField(combinedFieldConfigList, byteBuf, storeObjectMap,fieldConfigsMap); + } + + + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getCombinedFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return combinedFieldConfigList.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public List getCombinedFieldConfigList() { + return combinedFieldConfigList; + } + + /* 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(combinedFieldConfigList) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java new file mode 100644 index 0000000..f3cfedc --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java @@ -0,0 +1,11 @@ +package com.casic.missiles.parser.provider; + +/** + * @author cz + * @date 2023-6-12 + */ +public class CommandEventProvider{ + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java new file mode 100644 index 0000000..70eec5e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java @@ -0,0 +1,77 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.safe.SafeStrategy; +import com.casic.missiles.parser.sender.DataSubscribeProvider; +import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class DatagramEventProvider { + + private final DatagramEventConfig processorInstance; + + public DatagramEventProvider(Long ruleId) { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + List datagramEventConfigList = + datagramEventRegistry.getDatagramEventList(ruleId); + processorInstance = this.getProcessorInstance(datagramEventConfigList); + } + + public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { + if (showSkip()) { + return null; + } + return datagramEventConfigList.get(0); + } + + // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 + public String getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap) { + String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? + processorInstance.getSafeBean() : + fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); + if (!StringUtils.isEmpty(safeName)) { + //需要加密 + SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); + String plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); + return clearComplementZero(plain); + } + return ByteBufUtil.hexDump(bizDataContent); + } + + //解密清零操作 + private String clearComplementZero(String plain) { + plain = plain.substring(0, plain.lastIndexOf("00")); + return plain; + } + + //数据发送,数据发送者暂未构建 + public void storeData(Map bizDataMap) { + DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); +// dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return ObjectUtils.isNotEmpty(processorInstance) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java new file mode 100644 index 0000000..7e1fe0a --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java @@ -0,0 +1,97 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.FieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class FieldConfigProvider { + + + private final List fieldConfigs; + private Map storeObjectMap = new HashMap<>(); +// private Map singleObjects = new ConcurrentHashMap<>(); + + public FieldConfigProvider(Long ruleId) { + FieldConfigRegistry fieldConfigRegistry = SpringContextUtil.getBean(FieldConfigRegistry.class); + fieldConfigs = fieldConfigRegistry.getFieldConfigList(ruleId); + } + + public List getFieldConfigs() { + return fieldConfigs; + } + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public Map parseDataField(RuleConfig ruleConfig, String clearZeroPlain) { + if (showSkip()) { + return null; + } + List prepareFieldConfig = prepareParseField(ruleConfig); + if (CollectionUtils.isNotEmpty(prepareFieldConfig)) { + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(fieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + return fixDataMap; + } + } + return null; + } + + /** + * 得到需要处理的业务内容 + * + * @return + */ + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return fieldConfigs.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public Map getFieldConfigsMap() { + return fieldConfigs.stream().collect( + Collectors.toMap(FieldConfig::getId, e -> e) + ); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(fieldConfigs) ? false : true; + } + + +} + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java new file mode 100644 index 0000000..817bfaf --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java @@ -0,0 +1,19 @@ +package com.casic.missiles.parser.provider; + +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.registry.FieldRuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; + +public class FieldRuleConfigProvider { + + private final List fieldRuleConfigList; + + public FieldRuleConfigProvider(Long ruleId) { + FieldRuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(FieldRuleConfigRegistry.class); + fieldRuleConfigList = ruleConfigRegistry.getFieldRuleConfigList(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java new file mode 100644 index 0000000..99a1b06 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java @@ -0,0 +1,53 @@ +package com.casic.missiles.parser.provider; + + +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.registry.ProtocolConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolConfigProvider { + + private final List protocolConfigList; + + public ProtocolConfigProvider(String firstChar) { + ProtocolConfigRegistry registry = SpringContextUtil.getBean(ProtocolConfigRegistry.class); + protocolConfigList = registry.getProtocolConfigList(firstChar); + } + + public List getMatchList() { + return protocolConfigList; + } + + /** + * 设置当前协议 + * + * @param protocolConfig + */ + public ProtocolConfigProvider(ProtocolConfig protocolConfig) { + List protocolConfigs = new ArrayList<>(); + protocolConfigs.add(protocolConfig); + protocolConfigList = protocolConfigs; + } + + /** + * 获取当前协议 + * + * @return + */ + public ProtocolConfig getCurrentProtocolConfig() { + if (this.protocolConfigList == null) { + return null; + } else { + return protocolConfigList.get(0); + } + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java new file mode 100644 index 0000000..043927d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java @@ -0,0 +1,213 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.registry.ProtocolFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolFieldConfigProvider { + + private static final String FIXED_FIELD_DS = "fixedFieldDs"; + private static final String CONTENT_FIELD_DS = "contentFieldDs"; + private static final String PROTOCOL_LENGTH = "protocolLength"; + private static final String PROTOCOL_FIELD_ID = "protocolFieldId"; + private static final String PROTOCOL_POSITION = "protocolPosition"; + + private final List protocolFieldConfigs; + private Map singleObjects = new ConcurrentHashMap<>(); + private Map storeObjectMap = new HashMap<>(); + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public ProtocolFieldConfigProvider(Long protocolId) { + ProtocolFieldConfigRegistry protocolFieldConfigRegistry = SpringContextUtil.getBean(ProtocolFieldConfigRegistry.class); + protocolFieldConfigs = protocolFieldConfigRegistry.getProtocolFieldConfigList(protocolId); + } + + public List getProtocolFieldConfigs() { + return protocolFieldConfigs; + } + + public ProtocolFieldConfig getFieldConfigById(Long fieldId) { + Optional optionalConfig = protocolFieldConfigs.stream().filter( + e -> e.getId().equals(fieldId) + ).findFirst(); + return optionalConfig.isPresent() ? optionalConfig.get() : null; + } + + public Integer getProtocolFieldValue(Long protocolFieldId, ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_FIELD_ID + protocolFieldId + ByteBufUtil.hexDump(byteBuf); + //获取缓存 + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + //加载固定长度数据集合 + Map fixDataMap = this.getProtocolDataMap(byteBuf); + ProtocolFieldConfig protocolFieldConfig = selectFieldConfig(protocolFieldId); + Integer protocolFieldValue = 0; + //获取约定字段的总长度 + if (fixDataMap.containsKey(protocolFieldConfig.getFieldName())) { + Object appointUnpackObject = fixDataMap.get(protocolFieldConfig.getFieldName()); + if (ObjectUtils.isNotEmpty(appointUnpackObject)) { + protocolFieldValue = (Integer) appointUnpackObject; + } + } + if (protocolFieldValue != null) { + //加入缓存 + if (ObjectUtils.isNotEmpty(protocolFieldValue)) { + this.singleObjects.put(catchKey, protocolFieldValue); + return protocolFieldValue; + } + } + return null; + } + + /** + * 获取帧固定位置信息 + * + * @param byteBuf + * @param protocolConfig + * @return + */ + public Map getFixedProperty(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_POSITION + protocolConfig.getId(); + if (this.singleObjects.containsKey(catchKey)) { + return (Map) singleObjects.get(catchKey); + } + Map fixedPropertyMap = new HashMap<>(); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + fixedPropertyMap = fieldParser.doGetFixedProperty(protocolFieldConfigs, this.getTotalLength(byteBuf,protocolConfig)); + if (CollectionUtils.isNotEmpty(fixedPropertyMap)) { + this.singleObjects.put(catchKey, fixedPropertyMap); + return fixedPropertyMap; + } + return fixedPropertyMap; + } + + /** + * 获取帧结构应有的总长度 + */ + public Integer getTotalLength(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_LENGTH + ByteBufUtil.hexDump(byteBuf); + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + Integer appointFrameLength = getProtocolFieldValue(protocolConfig.getTotalLengthId(), byteBuf); + if (appointFrameLength != null) { + //获取过滤的字段集合总长度 + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Integer totalFilterLength = fieldParser.getTotalFilterLength(protocolConfig, byteBuf, getFixFieldConfigMap()); + //计算总长度 + Integer totalLength = appointFrameLength + totalFilterLength; + //加入缓存 + if (ObjectUtils.isNotEmpty(totalLength)) { + this.singleObjects.put(catchKey, totalLength); + return totalLength; + } + } + return null; + } + + /** + * 获取协议有关字段解析内容 + * storeObjectMap存储代转存的数据 + * + * @return + */ + public Map getProtocolDataMap(ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(FIXED_FIELD_DS)) { + return (Map) singleObjects.get(FIXED_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(protocolFieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + this.singleObjects.put(FIXED_FIELD_DS, fixDataMap); + return fixDataMap; + } + return null; + } + + /** + * 获取业务报文内容的content字节 + * + * @param wholeDatagramByte + * @return + */ + public ByteBuf getDataContentBuf(ByteBuf wholeDatagramByte) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(CONTENT_FIELD_DS)) { + return (ByteBuf) singleObjects.get(CONTENT_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + ByteBuf bizDataByteBuf = fieldParser.getDataContentBuf(protocolFieldConfigs, wholeDatagramByte); + if (bizDataByteBuf != null) { + this.singleObjects.put(CONTENT_FIELD_DS, bizDataByteBuf); + return bizDataByteBuf; + } + return null; + } + + + private ProtocolFieldConfig selectFieldConfig(Long id) { + Optional optionalProtocolFieldConfig = this.protocolFieldConfigs.stream().filter( + e -> e.getId().equals(id) + ).findFirst(); + return optionalProtocolFieldConfig.isPresent() ? optionalProtocolFieldConfig.get() : null; + } + + + private Map getFixFieldConfigMap() { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, e -> e) + ); + return fixDataFieldMap; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(protocolFieldConfigs) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java new file mode 100644 index 0000000..dafba1c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java @@ -0,0 +1,56 @@ +package com.casic.missiles.parser.provider; + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.rule.GenericRuleResolver; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.RuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleConfigProvider { + + private final List ruleConfigs; + + public List getRuleConfigs() { + return ruleConfigs; + } + + public RuleConfigProvider(Long protocolId) { + RuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(RuleConfigRegistry.class); + ruleConfigs = ruleConfigRegistry.getRuleConfigById(protocolId); + } + + /** + * 获取规则匹配结果 + * + * @param parseFixedDataMap + * @param protocolFieldConfigs + * @return + */ + public RuleConfig doGetRule(Map parseFixedDataMap, + String ids, + List protocolFieldConfigs) { + if (showSkip()) { + return null; + } + RuleConfig ruleConfig = GenericRuleResolver.machRule(parseFixedDataMap, ids, protocolFieldConfigs, ruleConfigs); + return ruleConfig; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(ruleConfigs) ? false : true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java index 3c05891..856b399 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java @@ -1,18 +1,11 @@ package com.casic.missiles.parser.resolver; -import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.springframework.web.bind.annotation.RequestBody; -import javax.annotation.Resource; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -20,19 +13,17 @@ @Slf4j public class ByteMergeProvider { - @Resource - private FieldRuleEngineMapper fieldRuleEngineMapper; - //拿到所有的值合并到一个值 - public String resolveByteMerge(List valueList, String ruletypeId, String vaildRange) { + public static String resolveByteMerge(List valueList, String ruleTypeId, String vaildRange) { String values = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Map vaildMap = getValidRangeMap(vaildRange); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(ruletypeId); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } + //暂时不处理 +// fieldRuleEngine = fieldRuleConfigMapper.selectById(ruleTypeId); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } Map env2 = new HashMap(); for (int i = 0; i < valueList.size(); i++) { if (vaildMap.containsKey(i)) { @@ -47,7 +38,7 @@ } } - private Map getValidRangeMap(String vaildRange) { + private static Map getValidRangeMap(String vaildRange) { String[] range = vaildRange.split(","); Map vaildMap = new HashMap(); for (int i = 0; i < range.length; i++) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 8d821cd..85d6bbf 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -1,9 +1,12 @@ package com.casic.missiles.parser.resolver; +import com.casic.missiles.pojo.AbstractFieldConfig; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; import io.netty.buffer.ByteBuf; +import java.util.List; import java.util.Map; /** @@ -11,18 +14,14 @@ */ public interface FieldParser { -// Map fieldProcess(String protocolContent,); - Map dataParser(RuleConfig ruleConfig, String lightText,String protocolId); + Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength); - Map fixDataParser(String protocolId, ByteBuf buffer); + Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap); - Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf); + ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer); - ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer); - - ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer); - - Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer); + Integer getTotalFilterLength(ProtocolConfig protocolConfig, ByteBuf byteBuf, Map protocolFieldConfigMap); } + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java new file mode 100644 index 0000000..9e0c00e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java @@ -0,0 +1,52 @@ +package com.casic.missiles.parser.resolver; + +import com.casic.missiles.pojo.AbstractFieldConfig; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.util.List; + +public class FieldParserSupport { + + //分别计算bit和byte长度=> 合并长度 + protected Integer calculateLength(List fieldConfigList) { + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + Integer fixedLength = bytefixedLength + bitfixedLength / 8; + return fixedLength; + } + + //找到最大值=> 根据最大值计算业务数据下标 + protected Integer calculatePosition(List fieldConfigList) { + String rex = "[0-9]+"; + Integer max = -1; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) + && Integer.valueOf(fieldConfig.getOriginPositionByte()) > max) { + max = Integer.valueOf(fieldConfig.getOriginPositionByte()); + } + } + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) && fieldConfig.getOriginPositionByte().equals(max)) { + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + } + } + Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; + return maxFixedPosition; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java deleted file mode 100644 index dd3a6cd..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java +++ /dev/null @@ -1,170 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.ByteResolverParam; -import io.netty.buffer.ByteBuf; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -/** - * 字段解析管理总类 - */ -@Service -@Slf4j -@AllArgsConstructor -public class FieldResolver extends ByteMergeProvider { - - //1、字段截取 => 2、简单的字节解析和复杂的字节解析 - public Object filedParserManger(ByteBuf byteBuf, FieldConfig fieldConfig, Integer maxFixedPosition) { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - //最大固定位置不为空, - if (!ObjectUtil.isEmpty(maxFixedPosition)) { - orignPosition -= maxFixedPosition; - } - Object fieldValue = 0; - //待优化 - if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { - fieldValue = bitToResolver(byteBuf, fieldConfig); - } else { - ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); - fieldValue = parsingFields(fieldBytes, fieldConfig.getRuleJson()); - } - return fieldValue; - } - - //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, - //目前默认配置的规则设置暂不支持配置化,由实现完成 - private Object parsingFields(ByteBuf byteBuf, String ruleJson) { - Object fieldsResolveValue = null; - List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); - if (ObjectUtil.isEmpty(ruleMapList)) { - fieldsResolveValue = defaultResolveBuilder(byteBuf); - } else { - fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); - } - return fieldsResolveValue; - } - - private Object defaultResolveBuilder(ByteBuf byteBuf) { - Integer defaultResolveValue = 0; - for (int i = 0; i < byteBuf.writerIndex(); i++) { - defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; - } - return defaultResolveValue; - } - - //字段解析构建器(针对字节单位的) - //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 - // 字节归并结束或者规则结束=>继续根据规则进行判断 - private Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { - Object customizeResolveValue = null; - try { - List bytStrList = new ArrayList<>(); - //存放到数组里面 - for (int i = 0; i < byteBuf.writerIndex(); i++) { - bytStrList.add(byteBuf.readByte()); - } - int i = 0; - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - customizeResolveValue = this.resolveByteMerge(bytStrList, ruletypeId,vaildRange); - break; - } else { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - List tempBytStr = new ArrayList<>(); - for (int k = 0; i < bytStrList.size(); i++) { - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(k) - .value(bytStrList.get(k)) - .ruletypeId(ruletypeId).build(); - tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); - } - bytStrList = tempBytStr; - } - i++; - } - //字节归并到一起=>继续根据规则进行判断 - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(customizeResolveValue) - .ruletypeId(ruletypeId).build(); - customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(customizeResolveValue)); - return customizeResolveValue; - } catch (RuntimeException ex) { - log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); - return null; - } - } - - /** - * 1、单个字节情况表示字段 - * 2、多字节情况表示字段(暂未处理) - */ - private Object bitToResolver(ByteBuf byteBuf, FieldConfig fieldConfig) { - Object fieldValue = new Object(); - try { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - byte fields = 0x00; - if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); - } else { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); - } - - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { - if (!StringUtils.isEmpty(fieldConfig.getExactOrignPosition())) { - fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getExactOrignPosition())).byteValue() - >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); - } else { - fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); - } - } else { - fieldValue = Integer.valueOf(fields & 0xff); - } - if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { - return fieldValue; - } - List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); - int i = 0; - //字节归并到一起=>继续根据规则进行判断 - while (i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(fieldValue) - .ruletypeId(ruletypeId).build(); - fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(fieldValue)); - return fieldValue; - } catch (RuntimeException ex) { - log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); - return null; - } - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java new file mode 100644 index 0000000..1d2aeab --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java @@ -0,0 +1,36 @@ +package com.casic.missiles.parser.resolver.bytes; + +import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.mapper.FieldRuleConfigMapper; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.pojo.ByteResolverParam; +import com.googlecode.aviator.AviatorEvaluator; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; +//转换规则 +@Component("convert") +@AllArgsConstructor +@Slf4j +public class ByteRuleResolver implements ByteResolver { + + private final FieldRuleConfigMapper fieldRuleConfigMapper; + + @Override + public Object resolveOperationRule(ByteResolverParam byteResolverParam){ + FieldRuleConfig fieldRuleEngine=fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); + if(ObjectUtil.isEmpty(fieldRuleEngine)){ + return byteResolverParam.getValue(); + } + String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); + Map env2 = new HashMap(); + env2.put("value", (byte) byteResolverParam.getValue()); + String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); + return values; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java index 608af3a..32cc8a4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java @@ -2,48 +2,47 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.delivery.decorator.ByteDecorator; +import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @AllArgsConstructor public class FieldDecoratorManger { - private final RuleDictDao ruleDictDao; + private final RuleConfigRegistry ruleDictDao; // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 // (1)静态的业务字段是字典里面可以配置的 // (2)动态的业务字段是通过规则生成的 public String contentMerge(String ruleJson, String sceneConent, String dynamicContent) { - List ruleDictList = ruleDictDao.getRuleDictConfig(); - Map ruleDictMap = ruleDictList.stream().collect( - Collectors.toMap(RuleDict::getId, e -> e)); - List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); - for (Map ruleMap : ruleMapList) { - String ruleType = String.valueOf(ruleMap.get("ruleType")); - ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); - NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); - byteDecorator.nodeDecoratorRule(nodeDecoratorParm); - } +// List ruleDictList = ruleDictDao.getRuleDictConfig(); +// Map ruleDictMap = ruleDictList.stream().collect( +// Collectors.toMap(RuleDict::getId, e -> e)); +// List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); +// for (Map ruleMap : ruleMapList) { +// String ruleType = String.valueOf(ruleMap.get("ruleType")); +// ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); +// NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); +// byteDecorator.nodeDecoratorRule(nodeDecoratorParm); +// } return null; } - - private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { - NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() - .contents(sceneConent) - .dynamicContent(dynamicContent) - .ruletypeId(ruletypeId) - .ruleDictMap(ruleDictMap) - .build(); - return nodeDecoratorParm; - } +// +// private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { +// NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() +// .contents(sceneConent) +// .dynamicContent(dynamicContent) +// .ruletypeId(ruletypeId) +// .ruleDictMap(ruleDictMap) +// .build(); +// return nodeDecoratorParm; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java index 652970c..b204ac3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java @@ -1,56 +1,56 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@AllArgsConstructor -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", - JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Component; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Component("logicalDecorator") +//@AllArgsConstructor +//@Slf4j +//public class LogicalShiftDecorator implements ByteDecorator { +// +//// private final FieldRuleEngineMapper fieldRuleEngineMapper; +//// +//// //字节位移 +//// @Override +//// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +//// String logicalValue = ""; +//// RuleEvaluator fieldRuleEngine = new RuleEvaluator(); +//// try { +//// Map env2 = new HashMap(); +//// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +//// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +//// for (String contentId : contentIdList) { +//// RuleDict ruleDict = ruleDictMap.get(contentId); +//// if (ruleDict.getCode().contains("#")) { +//// //使用动态的值 +//// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +//// } +//// env2.put(ruleDict.getName(), ruleDict.getCode()); +//// } +//// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +//// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +//// return null; +//// } +//// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +//// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +//// return values; +//// } catch (Exception ex) { +//// log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", +//// JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +//// return null; +//// } +//// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java index 346468f..822fead 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@AllArgsConstructor -@Slf4j -public class OperationDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("optionDecorator") +//@AllArgsConstructor +//@Slf4j +//public class OperationDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //混合运算,有常量或者乘除的缩放 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java index 50fb0a7..7a8bccb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@AllArgsConstructor -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +////精度计算 +//@AllArgsConstructor +//@Registry("precisionDecorator") +//@Slf4j +//public class PrecisionDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java index da39235..27f9cc7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java @@ -1,54 +1,53 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@AllArgsConstructor -@Slf4j -public class RuleDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("ruleDecorator") +//@AllArgsConstructor +//@Slf4j +//public class RuleDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //吃我一套正则表达式 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (Exception ex) { +// log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java index 7f5cbf3..c043f97 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java @@ -2,6 +2,6 @@ import java.util.Map; -public interface ComandeEventService { +public interface ComandeEventService{ Map loadComandeEventConfig(String protocolId,String scene); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java index 476ad84..aaf1837 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java @@ -2,46 +2,46 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.dao.CommandEventDao; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @Slf4j @AllArgsConstructor -public class ComandeEventServiceImpl implements ComandeEventService { +public class ComandeEventServiceImpl implements ComandeEventRegistry { - private final CommandEventDao commandEventDao; + // private final CommandEventDao commandEventDao; // 加密bean 固定字段出现变化的字段解析,业务字段的有序内容 @Override - public Map loadComandeEventConfig(String protocolId,String sceneName) { - CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); - if (ObjectUtil.isEmpty(commandEventConfig)) { - log.error("协议{},没有配置成功接收回复配置,清排查原因"); - return null; - } - String replyJson = commandEventConfig.getReplyContentJson(); - List> replyMapList = JSONArray.parseObject(replyJson, List.class); - List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); - Map fixMap = fixList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); - List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) - .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) - .collect(Collectors.toList()); - Map commandConfigMap = new HashMap<>(); - commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); - commandConfigMap.put("fixContent", fixMap); - commandConfigMap.put("bizContent", contentList); - return commandConfigMap; + public Map loadComandeEventConfig(String protocolId, String sceneName) { +// CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); +// if (ObjectUtil.isEmpty(commandEventConfig)) { +// log.error("协议{},没有配置成功接收回复配置,清排查原因"); +// return null; +// } +// String replyJson = commandEventConfig.getReplyContentJson(); +// List> replyMapList = JSONArray.parseObject(replyJson, List.class); +// List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); +// Map fixMap = fixList.stream() +// .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); +// List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) +// .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) +// .collect(Collectors.toList()); +// Map commandConfigMap = new HashMap<>(); +// commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); +// commandConfigMap.put("fixContent", fixMap); +// commandConfigMap.put("bizContent", contentList); +// return commandConfigMap; + return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 128b09d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java deleted file mode 100644 index 4016b0b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface DatagramEventMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java deleted file mode 100644 index 597c306..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.apache.ibatis.annotations.Mapper; - -public interface FieldConfigMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java deleted file mode 100644 index a31680a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.PreRuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface PreRuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java deleted file mode 100644 index 9060a69..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface ProtocolConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java deleted file mode 100644 index 6fa6936..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java deleted file mode 100644 index 582a705..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleDict; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleDictMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java deleted file mode 100644 index 6e302c8..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.CommandEventMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Optional; - -@Component -public class CommandEventDao { - - @Resource - private CommandEventMapper commandEventMapper; - - public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId) - .eq("scene", sceneName) - .eq("enabled", 1); - List commandEventConfig = commandEventMapper.selectList(queryWrapper); - Optional optionalEventConfig = commandEventConfig.stream().findFirst(); - return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java deleted file mode 100644 index 9137e4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.FieldConfigMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class FieldConfigDao { - - @Resource - private FieldConfigMapper fieldConfigMapper; - - public FieldConfig getFieldConfigById(String fieldId) { - FieldConfig fieldConfig = fieldConfigMapper.selectById(fieldId); - return fieldConfig; - } - - public List getFieldConfigs(String protocolId,Integer isFixed) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",isFixed); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - - public List getStorageFieldConfig(String protocolId) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",1) - .eq("is_storage",1); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java deleted file mode 100644 index 67bff6b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.mapper.PreRuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class PreRuleConfigDao { - - @Resource - private PreRuleConfigMapper preRuleConfigMapper; - - public List getPreRuleList(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return preRuleConfigMapper.selectList(queryWrapper); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java deleted file mode 100644 index d69ea85..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.RuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleConfigDao { - - @Resource - private RuleConfigMapper ruleConfigMapper; - - public RuleConfig getNextRuleConfig(String ruleFields) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("parse_rule_json", ruleFields); - return ruleConfigMapper.selectOne(queryWrapper); - } - - - public List getRuleConfigById(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return ruleConfigMapper.selectList(queryWrapper); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java deleted file mode 100644 index 932c185..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.RuleDictMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleDictDao { - - @Resource - private RuleDictMapper ruleDictMapper; - - public List getRuleDictConfig() { - List ruleDictList = ruleDictMapper.selectList(null); - return ruleDictList; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java index 9f9e279..43bc4d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java @@ -10,20 +10,15 @@ import io.netty.channel.socket.nio.NioServerSocketChannel; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import javax.annotation.PreDestroy; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static cn.hutool.core.util.ClassUtil.getClasses; /** * SensorhubServer netty服务端 */ @Slf4j -@Service +@Component public class SensorhubServer { /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java index 2c79ff5..9a28c36 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java @@ -11,13 +11,13 @@ import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioSocketChannel; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClient 客户端 */ @Slf4j -@Service +@Registry public final class SensorhubClient { public static void main(String[] args) throws Exception { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java index 9774be0..477c3f7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java @@ -6,12 +6,12 @@ import io.netty.channel.socket.SocketChannel; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientChannelInitialHandler */ -@Service +@Registry public class SensorhubClientChannelInitialHandler extends ChannelInitializer { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java index 346f4b3..73560e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java @@ -5,13 +5,13 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientHandler */ @Slf4j -@Service +@Registry public class SensorhubClientHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java index 5c1c6f2..d990af5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java @@ -4,12 +4,12 @@ import com.casic.missiles.pojo.Msg; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** * SensorhubServerHandler */ -@Service +@Component public class SensorhubServerHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 67283ae..af3172c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,41 +1,37 @@ package com.casic.missiles.parser; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultProtocolConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.*; +import com.casic.missiles.registry.FieldConfigRegistry; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; -import java.nio.charset.Charset; import java.util.HashMap; import java.util.List; import java.util.Map; -@Service("genericProtocolParser") +/** + * @author + */ +@Component("genericProtocolParser") @Slf4j -@AllArgsConstructor +@RequiredArgsConstructor public class GenericProtocolParser implements ProtocolParser { - private final LeadingCodeMatcher leadingCodeMatcher; private final List frameStructDispenserList; - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorInstanceSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; // 匹配首字母前导码=> 帧结构匹配前导码=> // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 @@ -44,18 +40,19 @@ public Boolean doParseProtocol(ByteBuf byteBuf) { String protocolContent = ByteBufUtil.hexDump(byteBuf); //匹配前导码 - List preCodeConfigs = leadingCodeMatcher.matchLeadingCode(protocolContent); + List preCodeConfigs = LeadingCodeMatcher.matchFrameLeadingCode(protocolContent); //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 if (preCodeConfigs.size() == 0) { - return rematch(byteBuf,protocolContent); + return rematch(byteBuf, protocolContent); } - //暂时先取第一个 + //暂时先取第一个,提升速度,使用享元模式, 减少类的创建销毁与构建 ProtocolConfig protocolConfig = preCodeConfigs.get(0); + AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); ByteBuf wholeDatagramByte = null; //通过匹配帧结构获取完整的数据包 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, preCodeConfigs.get(0))) != null) { + if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, protocolFactory)) != null) { break; } } @@ -68,76 +65,78 @@ * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 */ - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId, wholeDatagramByte); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap, protocolId); - //选取规则对应的流程实例 - DatagramEventConfig datagramEventConfig = processorInstanceSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); + //进行规则字段解析,进行匹配规则 + RuleConfig ruleConfig = getRuleConfig(protocolFactory, wholeDatagramByte); + if (ruleConfig == null) { + return false; + } //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, wholeDatagramByte); + ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte); + //以下进行业务的规则解析,同时选定流程实例 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); + DatagramEventProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain, + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText, protocolId); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain); //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); + datagramEventProvider.storeData(bizDataMap); return true; } - private Boolean rematch(ByteBuf byteBuf,String protocolContent) { + /** + * 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 + */ + private Boolean rematch(ByteBuf byteBuf, String protocolContent) { //重置位判断 byteBuf.resetReaderIndex(); //判断重置是否前移,如果没有前移,则直接判为匹配失败 if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { return false; } else { + //递归执行 return doParseProtocol(byteBuf); } } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; + //获取匹配规则->匹配规则 + private RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + //取出其中参与逻辑provider并判空 + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); + String rulePrepareFields = protocolConfig.getRulePrepareFields(); + //固定字段 + if (StringUtils.isNotEmpty(rulePrepareFields)) { + //获取统一固定字段解析 + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + //获取该协议的字段配置,用于协议规则匹配 + List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); + //获取规则 + RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, + rulePrepareFields, protocolFieldConfigs); + return ruleConfig; + } + return null; } - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + //数据构建,获取固定字段的store和业务字段store + private Map buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + Map bizDataMap = new HashMap<>(); + Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); + Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); + bizDataMap.putAll(ruleStoreObjectMap); + bizDataMap.putAll(protocolStoreObjectMap); return bizDataMap; } - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java index 8a46e32..16ce2e5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java @@ -3,6 +3,7 @@ import io.netty.buffer.ByteBuf; public interface ProtocolParser { + Boolean doParseProtocol(ByteBuf byteBuf); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java new file mode 100644 index 0000000..f7814af --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java @@ -0,0 +1,35 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.ProtocolConfigProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.ProtocolConfig; + +/** + * 存放基本协议的的加载信息 + */ +public class AbstractProtocolConfigFactory { + private final ProtocolConfigProvider protocolConfigProvider; + private final ProtocolFieldConfigProvider protocolFieldConfigProvider; + private final RuleConfigProvider ruleConfigProvider; + + public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { + this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); + this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); + this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); + } + + public ProtocolConfigProvider getProtocolConfigProvider() { + return protocolConfigProvider; + } + + public ProtocolFieldConfigProvider getProtocolFieldConfigProvider() { + return protocolFieldConfigProvider; + } + + public RuleConfigProvider getRuleConfigProvider() { + return ruleConfigProvider; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java new file mode 100644 index 0000000..6e36147 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java @@ -0,0 +1,57 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.CombinedFieldConfigProvider; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.FieldConfigProvider; +import com.casic.missiles.parser.provider.FieldRuleConfigProvider; + +/** + * 存放规则相关的的的加载信息 + */ +public class AbstractRuleConfigFactory { + + /** + * 处理字节 + */ + private final FieldConfigProvider fieldConfigProvider; + /** + * 处理组合字节解析的解码器 + */ + private final CombinedFieldConfigProvider combinedFieldConfigProvider; + /** + * 处理负责字节解析的规则配置 + */ + private final FieldRuleConfigProvider fieldRuleConfigProvider; + /** + * 处理实例流程 + */ + private final DatagramEventProvider datagramEventProvider; + + + public AbstractRuleConfigFactory(Long ruleId) { + this.fieldConfigProvider = new FieldConfigProvider(ruleId); + this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); + this.fieldRuleConfigProvider = new FieldRuleConfigProvider(ruleId); + this.datagramEventProvider = new DatagramEventProvider(ruleId); + } + + public FieldConfigProvider getFieldConfigProvider() { + return fieldConfigProvider; + } + + public CombinedFieldConfigProvider getCombinedFieldConfigProvider() { + return combinedFieldConfigProvider; + } + + public FieldRuleConfigProvider getFieldRuleConfigProvider() { + return fieldRuleConfigProvider; + } + + public DatagramEventProvider getDatagramEventProvider() { + return datagramEventProvider; + } + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java deleted file mode 100644 index 6e1719a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.factory; - - -import com.casic.missiles.pojo.ProtocolConfig; - -import java.util.List; - -/** - * 数据库访问优化(暂时未做) - *

- * 1、初始化协议解析配置,并存放到处存放缓存,对协议基本配置进行管理 - * 2、其中流程中所有的配置都经过此类进行管理,进行调用获取,增强解析速度 - */ -public interface DatagramFactory { - - /** - * 初始化 - */ - List datagramInit(); - - /** - * 根据前导码配置匹配,模糊匹配获取所有的报文项 - */ - List match(); - - /** - * 根据前导码匹配,返回报文项 - */ - List filer(); - - /** - * 保证数据的唯一性选择器 - */ - List selectOne(); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java new file mode 100644 index 0000000..87444a0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java @@ -0,0 +1,18 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +import java.util.List; + +/** + * 直接用,还是边用边创建 + */ +public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { + + + public DefaultProtocolConfigFactory(ProtocolConfig protocolConfig) { + super(protocolConfig); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java new file mode 100644 index 0000000..cce0c7c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java @@ -0,0 +1,12 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; + +public class DefaultRuleFactory extends AbstractRuleConfigFactory { + + public DefaultRuleFactory(Long ruleId) { + super(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java deleted file mode 100644 index 9ee97e0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.casic.missiles.parser.instance; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service -@Slf4j -@AllArgsConstructor -public class GeneralProcessor { - - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; - - /** - * 统一固定字段解析=>进行规则的查询的判断 - * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 - * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 - */ - @Deprecated - public boolean parseWholeDatagram(ByteBuf buffer, ProtocolConfig protocolConfig) { - try { - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap,protocolId); - //选取规则对应的流程= - DatagramEventConfig datagramEventConfig = processorSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); - //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); - //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); - //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); - //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); - //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); - return true; - } catch (Exception ex) { - log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", - ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); - return false; - } - } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; - } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); - } - - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); - return bizDataMap; - } - - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java index 25e7ad8..6a5777e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java @@ -1,23 +1,31 @@ package com.casic.missiles.parser.instance.impl; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.mapper.DatagramEventMapper; import com.casic.missiles.pojo.DatagramEventConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.SpringContextUtil; -@Service -@AllArgsConstructor +import java.util.List; +import java.util.Optional; + +/** + * @author cz + * + */ public class DefaultProcessorInstanceSelector implements ProcessorInstanceSelector { - private final DatagramEventMapper datagramEventMapper; + private static List datagramEventConfigs; + + static { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + datagramEventConfigs = datagramEventRegistry.getDatagramEventList(); + } @Override public DatagramEventConfig getProcessorInstance(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("rule_id", protocolId); - return datagramEventMapper.selectOne(queryWrapper); + Optional optionalSelectInstance = datagramEventConfigs.stream() + .filter(e -> e.getId().equals(protocolId)).limit(1).findFirst(); + return optionalSelectInstance.isPresent() ? optionalSelectInstance.get() : null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a778671..7b56a43 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,16 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import io.netty.buffer.ByteBuf; /** - * 分析匹配情况 - * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 - * 2、匹配不成功,有后续帧,可以进行下次匹配。 - * 3、匹配不成功,无后续帧,可以进行丢弃。 + * 分析匹配情况 + * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 + * 2、匹配不成功,有后续帧,可以进行下次匹配。 + * 3、匹配不成功,无后续帧,可以进行丢弃。 */ -public interface FrameStructMatcher{ +public interface FrameStructMatcher { - ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig); + ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 05320ab..8ebea78 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,23 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.ProtocolConfigMapper; +import com.casic.missiles.parser.provider.ProtocolConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Component; import java.util.List; import java.util.stream.Collectors; -@Component -@AllArgsConstructor public class LeadingCodeMatcher { - private final ProtocolConfigMapper protocolMapper; - //** 1、首字母匹配前导码, // 2、以匹配出的前导码是否在报文中条件进行前导码的匹配二次筛选 - public List matchLeadingCode(String protocolContent){ + public static List matchFrameLeadingCode(String protocolContent){ List initialConfigs = initialMatch(protocolContent); List preCodeConfigs = initialConfigs.stream() .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) @@ -26,13 +19,16 @@ } //初始化匹配前导码内容 - private List initialMatch(String protocolContent) { - String protocolStr = protocolContent.charAt(0) + ""; - QueryWrapper queryWrapper = new QueryWrapper() - .likeRight("pre_fix", protocolStr); - List protocolConfigList = protocolMapper.selectList(queryWrapper); - return protocolConfigList; + private static List initialMatch(String protocolContent) { + String firstFrameChar = protocolContent.charAt(0) + ""; + ProtocolConfigProvider protocolConfigProvider=new ProtocolConfigProvider(firstFrameChar); + return protocolConfigProvider.getMatchList(); } + + + + + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index cf2113d..e915877 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -1,32 +1,35 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(0) -@Service +@Component public class FrameLengthMatcher implements FrameStructMatcher { - @Autowired - private FieldParser fieldParser; - //超过长度 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { String dataGramContent = ByteBufUtil.hexDump(byteBuf); - if (StringUtils.isEmpty(protocolConfig.getUnpackId()) && StringUtils.isEmpty(protocolConfig.getTailStr())) { - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + //当不存在结尾标志和拆包标志,可以直接使用长度进行匹配 + if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { if (dataGramContent.length() >= totalLength) {//等于长度返回true,超出长度,切断 - ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, protocolConfig, totalLength); + ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, totalLength); return wholeDatagramByte; } else { //读的标志位前移舍弃 @@ -38,7 +41,7 @@ return null; } - private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, Integer totalLength) { byteBuf.readBytes(totalLength); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, totalLength - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 2bfc213..d527ad0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; @@ -13,7 +13,7 @@ import lombok.AllArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.nio.charset.Charset; import java.util.Map; @@ -22,32 +22,30 @@ * 后续标志验证 */ @Order(1) -@Service +@Component @AllArgsConstructor -public class FrameMarkMatcher implements FrameStructMatcher { - - private final FieldConfigDao fieldConfigDao; - private final FieldParser fieldParser; - private final FieldResolver fieldResolverManger; +public class FrameMarkMatcher implements FrameStructMatcher, FixedPropertyEnum { //帧后续标志=>结束,进行帧的重组=>有后续,1、帧移位判别 2、继续接收帧 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig UnpackConfig = StringUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getUnpackId()); - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); - Integer upback = 0; + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); ByteBuf mergeWholeFrameByte = null; - if (!ObjectUtil.isEmpty(UnpackConfig)) { - while (hasNextFullFrame(byteBuf, protocolConfig)) { - upback = (Integer) fieldResolverManger.filedParserManger(byteBuf, UnpackConfig, null); + if (!ObjectUtil.isEmpty(unpackFlag)) { + while (hasNextFullFrame(byteBuf, protocolConfig, protocolFieldConfigProvider)) { //是否存在后续位 - if (upback == 1) {//使用esayRule + if (unpackFlag == 1) {//使用esayRule //表示可以截取 - mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolConfig, totalLength); + mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolFieldConfigProvider, protocolConfig); return mergeWholeFrameByte; } else { - byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig)); + byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig, protocolFieldConfigProvider)); } } } @@ -56,7 +54,8 @@ //选取第一个帧,将业务内容和后面部分分开 //计算数据报文-业务内容 - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolFieldConfigProvider protocolFieldConfigProvider, ProtocolConfig protocolConfig) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); //截取完整报文 byteBuf.readBytes(totalLength); ByteBuf byteBufContent = byteBuf.slice(0, byteBuf.readerIndex()); @@ -68,15 +67,15 @@ String tail = ""; System.out.println(ByteBufUtil.hexDump(byteBufContent)); //会存在多个帧拼接在一起的的情况,进行合并处理 - while (hasNextFullFrame(byteBufContent, protocolConfig)) { - Integer currentFrameLength = fieldParser.getTotalLength(protocolConfig, byteBufContent); + while (hasNextFullFrame(byteBufContent, protocolConfig, protocolFieldConfigProvider)) { + Integer currentFrameLength = protocolFieldConfigProvider.getTotalLength(byteBufContent, protocolConfig); byteBufContent.readBytes(currentFrameLength); ByteBuf currentbyteBuf = byteBufContent.slice(0, byteBufContent.readerIndex()); byteBufContent.markReaderIndex();//读的标志位前移 System.out.println(ByteBufUtil.hexDump(byteBufContent)); String hexDump = currentbyteBuf.toString(Charset.forName("ISO-8859-1")); //获取当前固定帧结构的关系map - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, currentbyteBuf); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(currentbyteBuf, protocolConfig); if (StringUtils.isEmpty(mergeFrameStr)) { //首次获取业务数据报文 mergeFrameStr += hexDump.substring(0, currentFrameFixedProperty.get("tailPosition")); @@ -95,22 +94,22 @@ /** * 获取平移到下一帧起始位置 */ - public int getNextFrameOffset(ByteBuf buffer, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, buffer); - return currentFrameFixedProperty.get("totalLength"); + public int getNextFrameOffset(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + return currentFrameFixedProperty.get(TOTAL_LENGTH); } /** * 判断是否出错进行整个帧的 */ - public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, byteBuf); + public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); //保证读取位置不在固定位置,是可变的业务内容 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("fixedPosition")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(FIXED_POSITION)) { return false; } //判断读取是否操作帧长度 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("totalLength")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(TOTAL_LENGTH)) { return false; } return true; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 76a3784..c3a1bab 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -1,50 +1,50 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.parser.instance.GeneralProcessor; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; +import io.netty.buffer.ByteBufUtil;; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(2) -@Service +@Component public class FrameTailMatcher implements FrameStructMatcher { - @Resource - private FieldConfigDao fieldConfigDao; - @Autowired - private GeneralProcessor generalProcessor; - //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig tailFieldConfig = StringUtils.isEmpty(protocolConfig.getTailStr()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getTailStr()); - if (!ObjectUtil.isEmpty(tailFieldConfig)) { - String tailStr = tailFieldConfig.getFieldName(); + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfig protocolFieldConfig = ObjectUtils.isEmpty(protocolConfig.getTailStr()) ? null : + fieldConfigProvider.getFieldConfigById(protocolConfig.getTailStr()); + if (!ObjectUtil.isEmpty(protocolFieldConfig)) { + String tailStr = protocolFieldConfig.getFieldName(); String dataGramContent = ByteBufUtil.hexDump(byteBuf); Boolean tailFlag = ByteBufUtil.hexDump(byteBuf).contains(tailStr); if (!tailFlag) { //使用esayRule return null; } else if (dataGramContent.indexOf(tailStr) < dataGramContent.length() - tailStr.length()) { Integer length = dataGramContent.indexOf(tailStr) + tailStr.length(); - ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, protocolConfig, length); + ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, length); return wholeDatagramByte; //存在粘包 } } return null; } - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer length) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, Integer length) { byteBuf.readBytes(length); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, length - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java new file mode 100644 index 0000000..5f1c177 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java @@ -0,0 +1,73 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.combined.GenericCombinedFieldResolver; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.CombinedFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class CombinedFieldConfigProvider { + + + /** + * 作为临时配置列表缓存使用 + */ + private final List combinedFieldConfigList; + private Map storeObjectMap = new HashMap<>(); + + public CombinedFieldConfigProvider(Long ruleId) { + CombinedFieldConfigRegistry combinedFieldConfigRegistry = SpringContextUtil.getBean(CombinedFieldConfigRegistry.class); + combinedFieldConfigList = combinedFieldConfigRegistry.getCombinedFieldConfigList(ruleId); + } + + public void parseDataField(RuleConfig ruleConfig, String clearZeroPlain,Map fieldConfigsMap ) { + if (showSkip()) { + return; + } + //匹配对应的数据,然后进行相关的字段解析 + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver(); + combinedFieldResolver.parseDataField(combinedFieldConfigList, byteBuf, storeObjectMap,fieldConfigsMap); + } + + + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getCombinedFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return combinedFieldConfigList.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public List getCombinedFieldConfigList() { + return combinedFieldConfigList; + } + + /* 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(combinedFieldConfigList) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java new file mode 100644 index 0000000..f3cfedc --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java @@ -0,0 +1,11 @@ +package com.casic.missiles.parser.provider; + +/** + * @author cz + * @date 2023-6-12 + */ +public class CommandEventProvider{ + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java new file mode 100644 index 0000000..70eec5e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java @@ -0,0 +1,77 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.safe.SafeStrategy; +import com.casic.missiles.parser.sender.DataSubscribeProvider; +import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class DatagramEventProvider { + + private final DatagramEventConfig processorInstance; + + public DatagramEventProvider(Long ruleId) { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + List datagramEventConfigList = + datagramEventRegistry.getDatagramEventList(ruleId); + processorInstance = this.getProcessorInstance(datagramEventConfigList); + } + + public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { + if (showSkip()) { + return null; + } + return datagramEventConfigList.get(0); + } + + // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 + public String getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap) { + String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? + processorInstance.getSafeBean() : + fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); + if (!StringUtils.isEmpty(safeName)) { + //需要加密 + SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); + String plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); + return clearComplementZero(plain); + } + return ByteBufUtil.hexDump(bizDataContent); + } + + //解密清零操作 + private String clearComplementZero(String plain) { + plain = plain.substring(0, plain.lastIndexOf("00")); + return plain; + } + + //数据发送,数据发送者暂未构建 + public void storeData(Map bizDataMap) { + DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); +// dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return ObjectUtils.isNotEmpty(processorInstance) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java new file mode 100644 index 0000000..7e1fe0a --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java @@ -0,0 +1,97 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.FieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class FieldConfigProvider { + + + private final List fieldConfigs; + private Map storeObjectMap = new HashMap<>(); +// private Map singleObjects = new ConcurrentHashMap<>(); + + public FieldConfigProvider(Long ruleId) { + FieldConfigRegistry fieldConfigRegistry = SpringContextUtil.getBean(FieldConfigRegistry.class); + fieldConfigs = fieldConfigRegistry.getFieldConfigList(ruleId); + } + + public List getFieldConfigs() { + return fieldConfigs; + } + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public Map parseDataField(RuleConfig ruleConfig, String clearZeroPlain) { + if (showSkip()) { + return null; + } + List prepareFieldConfig = prepareParseField(ruleConfig); + if (CollectionUtils.isNotEmpty(prepareFieldConfig)) { + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(fieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + return fixDataMap; + } + } + return null; + } + + /** + * 得到需要处理的业务内容 + * + * @return + */ + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return fieldConfigs.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public Map getFieldConfigsMap() { + return fieldConfigs.stream().collect( + Collectors.toMap(FieldConfig::getId, e -> e) + ); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(fieldConfigs) ? false : true; + } + + +} + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java new file mode 100644 index 0000000..817bfaf --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java @@ -0,0 +1,19 @@ +package com.casic.missiles.parser.provider; + +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.registry.FieldRuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; + +public class FieldRuleConfigProvider { + + private final List fieldRuleConfigList; + + public FieldRuleConfigProvider(Long ruleId) { + FieldRuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(FieldRuleConfigRegistry.class); + fieldRuleConfigList = ruleConfigRegistry.getFieldRuleConfigList(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java new file mode 100644 index 0000000..99a1b06 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java @@ -0,0 +1,53 @@ +package com.casic.missiles.parser.provider; + + +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.registry.ProtocolConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolConfigProvider { + + private final List protocolConfigList; + + public ProtocolConfigProvider(String firstChar) { + ProtocolConfigRegistry registry = SpringContextUtil.getBean(ProtocolConfigRegistry.class); + protocolConfigList = registry.getProtocolConfigList(firstChar); + } + + public List getMatchList() { + return protocolConfigList; + } + + /** + * 设置当前协议 + * + * @param protocolConfig + */ + public ProtocolConfigProvider(ProtocolConfig protocolConfig) { + List protocolConfigs = new ArrayList<>(); + protocolConfigs.add(protocolConfig); + protocolConfigList = protocolConfigs; + } + + /** + * 获取当前协议 + * + * @return + */ + public ProtocolConfig getCurrentProtocolConfig() { + if (this.protocolConfigList == null) { + return null; + } else { + return protocolConfigList.get(0); + } + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java new file mode 100644 index 0000000..043927d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java @@ -0,0 +1,213 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.registry.ProtocolFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolFieldConfigProvider { + + private static final String FIXED_FIELD_DS = "fixedFieldDs"; + private static final String CONTENT_FIELD_DS = "contentFieldDs"; + private static final String PROTOCOL_LENGTH = "protocolLength"; + private static final String PROTOCOL_FIELD_ID = "protocolFieldId"; + private static final String PROTOCOL_POSITION = "protocolPosition"; + + private final List protocolFieldConfigs; + private Map singleObjects = new ConcurrentHashMap<>(); + private Map storeObjectMap = new HashMap<>(); + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public ProtocolFieldConfigProvider(Long protocolId) { + ProtocolFieldConfigRegistry protocolFieldConfigRegistry = SpringContextUtil.getBean(ProtocolFieldConfigRegistry.class); + protocolFieldConfigs = protocolFieldConfigRegistry.getProtocolFieldConfigList(protocolId); + } + + public List getProtocolFieldConfigs() { + return protocolFieldConfigs; + } + + public ProtocolFieldConfig getFieldConfigById(Long fieldId) { + Optional optionalConfig = protocolFieldConfigs.stream().filter( + e -> e.getId().equals(fieldId) + ).findFirst(); + return optionalConfig.isPresent() ? optionalConfig.get() : null; + } + + public Integer getProtocolFieldValue(Long protocolFieldId, ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_FIELD_ID + protocolFieldId + ByteBufUtil.hexDump(byteBuf); + //获取缓存 + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + //加载固定长度数据集合 + Map fixDataMap = this.getProtocolDataMap(byteBuf); + ProtocolFieldConfig protocolFieldConfig = selectFieldConfig(protocolFieldId); + Integer protocolFieldValue = 0; + //获取约定字段的总长度 + if (fixDataMap.containsKey(protocolFieldConfig.getFieldName())) { + Object appointUnpackObject = fixDataMap.get(protocolFieldConfig.getFieldName()); + if (ObjectUtils.isNotEmpty(appointUnpackObject)) { + protocolFieldValue = (Integer) appointUnpackObject; + } + } + if (protocolFieldValue != null) { + //加入缓存 + if (ObjectUtils.isNotEmpty(protocolFieldValue)) { + this.singleObjects.put(catchKey, protocolFieldValue); + return protocolFieldValue; + } + } + return null; + } + + /** + * 获取帧固定位置信息 + * + * @param byteBuf + * @param protocolConfig + * @return + */ + public Map getFixedProperty(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_POSITION + protocolConfig.getId(); + if (this.singleObjects.containsKey(catchKey)) { + return (Map) singleObjects.get(catchKey); + } + Map fixedPropertyMap = new HashMap<>(); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + fixedPropertyMap = fieldParser.doGetFixedProperty(protocolFieldConfigs, this.getTotalLength(byteBuf,protocolConfig)); + if (CollectionUtils.isNotEmpty(fixedPropertyMap)) { + this.singleObjects.put(catchKey, fixedPropertyMap); + return fixedPropertyMap; + } + return fixedPropertyMap; + } + + /** + * 获取帧结构应有的总长度 + */ + public Integer getTotalLength(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_LENGTH + ByteBufUtil.hexDump(byteBuf); + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + Integer appointFrameLength = getProtocolFieldValue(protocolConfig.getTotalLengthId(), byteBuf); + if (appointFrameLength != null) { + //获取过滤的字段集合总长度 + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Integer totalFilterLength = fieldParser.getTotalFilterLength(protocolConfig, byteBuf, getFixFieldConfigMap()); + //计算总长度 + Integer totalLength = appointFrameLength + totalFilterLength; + //加入缓存 + if (ObjectUtils.isNotEmpty(totalLength)) { + this.singleObjects.put(catchKey, totalLength); + return totalLength; + } + } + return null; + } + + /** + * 获取协议有关字段解析内容 + * storeObjectMap存储代转存的数据 + * + * @return + */ + public Map getProtocolDataMap(ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(FIXED_FIELD_DS)) { + return (Map) singleObjects.get(FIXED_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(protocolFieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + this.singleObjects.put(FIXED_FIELD_DS, fixDataMap); + return fixDataMap; + } + return null; + } + + /** + * 获取业务报文内容的content字节 + * + * @param wholeDatagramByte + * @return + */ + public ByteBuf getDataContentBuf(ByteBuf wholeDatagramByte) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(CONTENT_FIELD_DS)) { + return (ByteBuf) singleObjects.get(CONTENT_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + ByteBuf bizDataByteBuf = fieldParser.getDataContentBuf(protocolFieldConfigs, wholeDatagramByte); + if (bizDataByteBuf != null) { + this.singleObjects.put(CONTENT_FIELD_DS, bizDataByteBuf); + return bizDataByteBuf; + } + return null; + } + + + private ProtocolFieldConfig selectFieldConfig(Long id) { + Optional optionalProtocolFieldConfig = this.protocolFieldConfigs.stream().filter( + e -> e.getId().equals(id) + ).findFirst(); + return optionalProtocolFieldConfig.isPresent() ? optionalProtocolFieldConfig.get() : null; + } + + + private Map getFixFieldConfigMap() { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, e -> e) + ); + return fixDataFieldMap; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(protocolFieldConfigs) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java new file mode 100644 index 0000000..dafba1c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java @@ -0,0 +1,56 @@ +package com.casic.missiles.parser.provider; + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.rule.GenericRuleResolver; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.RuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleConfigProvider { + + private final List ruleConfigs; + + public List getRuleConfigs() { + return ruleConfigs; + } + + public RuleConfigProvider(Long protocolId) { + RuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(RuleConfigRegistry.class); + ruleConfigs = ruleConfigRegistry.getRuleConfigById(protocolId); + } + + /** + * 获取规则匹配结果 + * + * @param parseFixedDataMap + * @param protocolFieldConfigs + * @return + */ + public RuleConfig doGetRule(Map parseFixedDataMap, + String ids, + List protocolFieldConfigs) { + if (showSkip()) { + return null; + } + RuleConfig ruleConfig = GenericRuleResolver.machRule(parseFixedDataMap, ids, protocolFieldConfigs, ruleConfigs); + return ruleConfig; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(ruleConfigs) ? false : true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java index 3c05891..856b399 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java @@ -1,18 +1,11 @@ package com.casic.missiles.parser.resolver; -import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.springframework.web.bind.annotation.RequestBody; -import javax.annotation.Resource; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -20,19 +13,17 @@ @Slf4j public class ByteMergeProvider { - @Resource - private FieldRuleEngineMapper fieldRuleEngineMapper; - //拿到所有的值合并到一个值 - public String resolveByteMerge(List valueList, String ruletypeId, String vaildRange) { + public static String resolveByteMerge(List valueList, String ruleTypeId, String vaildRange) { String values = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Map vaildMap = getValidRangeMap(vaildRange); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(ruletypeId); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } + //暂时不处理 +// fieldRuleEngine = fieldRuleConfigMapper.selectById(ruleTypeId); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } Map env2 = new HashMap(); for (int i = 0; i < valueList.size(); i++) { if (vaildMap.containsKey(i)) { @@ -47,7 +38,7 @@ } } - private Map getValidRangeMap(String vaildRange) { + private static Map getValidRangeMap(String vaildRange) { String[] range = vaildRange.split(","); Map vaildMap = new HashMap(); for (int i = 0; i < range.length; i++) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 8d821cd..85d6bbf 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -1,9 +1,12 @@ package com.casic.missiles.parser.resolver; +import com.casic.missiles.pojo.AbstractFieldConfig; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; import io.netty.buffer.ByteBuf; +import java.util.List; import java.util.Map; /** @@ -11,18 +14,14 @@ */ public interface FieldParser { -// Map fieldProcess(String protocolContent,); - Map dataParser(RuleConfig ruleConfig, String lightText,String protocolId); + Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength); - Map fixDataParser(String protocolId, ByteBuf buffer); + Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap); - Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf); + ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer); - ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer); - - ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer); - - Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer); + Integer getTotalFilterLength(ProtocolConfig protocolConfig, ByteBuf byteBuf, Map protocolFieldConfigMap); } + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java new file mode 100644 index 0000000..9e0c00e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java @@ -0,0 +1,52 @@ +package com.casic.missiles.parser.resolver; + +import com.casic.missiles.pojo.AbstractFieldConfig; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.util.List; + +public class FieldParserSupport { + + //分别计算bit和byte长度=> 合并长度 + protected Integer calculateLength(List fieldConfigList) { + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + Integer fixedLength = bytefixedLength + bitfixedLength / 8; + return fixedLength; + } + + //找到最大值=> 根据最大值计算业务数据下标 + protected Integer calculatePosition(List fieldConfigList) { + String rex = "[0-9]+"; + Integer max = -1; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) + && Integer.valueOf(fieldConfig.getOriginPositionByte()) > max) { + max = Integer.valueOf(fieldConfig.getOriginPositionByte()); + } + } + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) && fieldConfig.getOriginPositionByte().equals(max)) { + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + } + } + Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; + return maxFixedPosition; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java deleted file mode 100644 index dd3a6cd..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java +++ /dev/null @@ -1,170 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.ByteResolverParam; -import io.netty.buffer.ByteBuf; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -/** - * 字段解析管理总类 - */ -@Service -@Slf4j -@AllArgsConstructor -public class FieldResolver extends ByteMergeProvider { - - //1、字段截取 => 2、简单的字节解析和复杂的字节解析 - public Object filedParserManger(ByteBuf byteBuf, FieldConfig fieldConfig, Integer maxFixedPosition) { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - //最大固定位置不为空, - if (!ObjectUtil.isEmpty(maxFixedPosition)) { - orignPosition -= maxFixedPosition; - } - Object fieldValue = 0; - //待优化 - if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { - fieldValue = bitToResolver(byteBuf, fieldConfig); - } else { - ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); - fieldValue = parsingFields(fieldBytes, fieldConfig.getRuleJson()); - } - return fieldValue; - } - - //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, - //目前默认配置的规则设置暂不支持配置化,由实现完成 - private Object parsingFields(ByteBuf byteBuf, String ruleJson) { - Object fieldsResolveValue = null; - List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); - if (ObjectUtil.isEmpty(ruleMapList)) { - fieldsResolveValue = defaultResolveBuilder(byteBuf); - } else { - fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); - } - return fieldsResolveValue; - } - - private Object defaultResolveBuilder(ByteBuf byteBuf) { - Integer defaultResolveValue = 0; - for (int i = 0; i < byteBuf.writerIndex(); i++) { - defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; - } - return defaultResolveValue; - } - - //字段解析构建器(针对字节单位的) - //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 - // 字节归并结束或者规则结束=>继续根据规则进行判断 - private Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { - Object customizeResolveValue = null; - try { - List bytStrList = new ArrayList<>(); - //存放到数组里面 - for (int i = 0; i < byteBuf.writerIndex(); i++) { - bytStrList.add(byteBuf.readByte()); - } - int i = 0; - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - customizeResolveValue = this.resolveByteMerge(bytStrList, ruletypeId,vaildRange); - break; - } else { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - List tempBytStr = new ArrayList<>(); - for (int k = 0; i < bytStrList.size(); i++) { - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(k) - .value(bytStrList.get(k)) - .ruletypeId(ruletypeId).build(); - tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); - } - bytStrList = tempBytStr; - } - i++; - } - //字节归并到一起=>继续根据规则进行判断 - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(customizeResolveValue) - .ruletypeId(ruletypeId).build(); - customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(customizeResolveValue)); - return customizeResolveValue; - } catch (RuntimeException ex) { - log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); - return null; - } - } - - /** - * 1、单个字节情况表示字段 - * 2、多字节情况表示字段(暂未处理) - */ - private Object bitToResolver(ByteBuf byteBuf, FieldConfig fieldConfig) { - Object fieldValue = new Object(); - try { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - byte fields = 0x00; - if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); - } else { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); - } - - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { - if (!StringUtils.isEmpty(fieldConfig.getExactOrignPosition())) { - fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getExactOrignPosition())).byteValue() - >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); - } else { - fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); - } - } else { - fieldValue = Integer.valueOf(fields & 0xff); - } - if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { - return fieldValue; - } - List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); - int i = 0; - //字节归并到一起=>继续根据规则进行判断 - while (i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(fieldValue) - .ruletypeId(ruletypeId).build(); - fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(fieldValue)); - return fieldValue; - } catch (RuntimeException ex) { - log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); - return null; - } - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java new file mode 100644 index 0000000..1d2aeab --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java @@ -0,0 +1,36 @@ +package com.casic.missiles.parser.resolver.bytes; + +import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.mapper.FieldRuleConfigMapper; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.pojo.ByteResolverParam; +import com.googlecode.aviator.AviatorEvaluator; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; +//转换规则 +@Component("convert") +@AllArgsConstructor +@Slf4j +public class ByteRuleResolver implements ByteResolver { + + private final FieldRuleConfigMapper fieldRuleConfigMapper; + + @Override + public Object resolveOperationRule(ByteResolverParam byteResolverParam){ + FieldRuleConfig fieldRuleEngine=fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); + if(ObjectUtil.isEmpty(fieldRuleEngine)){ + return byteResolverParam.getValue(); + } + String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); + Map env2 = new HashMap(); + env2.put("value", (byte) byteResolverParam.getValue()); + String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); + return values; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java index 103821c..786b71c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java @@ -2,34 +2,34 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("logicalShift") +@Component("logicalShift") @AllArgsConstructor @Slf4j public class LogicalShiftResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //字节位移 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { Integer index = byteResolverParam.getIndex(); - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return byteResolverParam.getValue(); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java index 608af3a..32cc8a4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java @@ -2,48 +2,47 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.delivery.decorator.ByteDecorator; +import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @AllArgsConstructor public class FieldDecoratorManger { - private final RuleDictDao ruleDictDao; + private final RuleConfigRegistry ruleDictDao; // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 // (1)静态的业务字段是字典里面可以配置的 // (2)动态的业务字段是通过规则生成的 public String contentMerge(String ruleJson, String sceneConent, String dynamicContent) { - List ruleDictList = ruleDictDao.getRuleDictConfig(); - Map ruleDictMap = ruleDictList.stream().collect( - Collectors.toMap(RuleDict::getId, e -> e)); - List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); - for (Map ruleMap : ruleMapList) { - String ruleType = String.valueOf(ruleMap.get("ruleType")); - ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); - NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); - byteDecorator.nodeDecoratorRule(nodeDecoratorParm); - } +// List ruleDictList = ruleDictDao.getRuleDictConfig(); +// Map ruleDictMap = ruleDictList.stream().collect( +// Collectors.toMap(RuleDict::getId, e -> e)); +// List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); +// for (Map ruleMap : ruleMapList) { +// String ruleType = String.valueOf(ruleMap.get("ruleType")); +// ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); +// NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); +// byteDecorator.nodeDecoratorRule(nodeDecoratorParm); +// } return null; } - - private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { - NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() - .contents(sceneConent) - .dynamicContent(dynamicContent) - .ruletypeId(ruletypeId) - .ruleDictMap(ruleDictMap) - .build(); - return nodeDecoratorParm; - } +// +// private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { +// NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() +// .contents(sceneConent) +// .dynamicContent(dynamicContent) +// .ruletypeId(ruletypeId) +// .ruleDictMap(ruleDictMap) +// .build(); +// return nodeDecoratorParm; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java index 652970c..b204ac3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java @@ -1,56 +1,56 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@AllArgsConstructor -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", - JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Component; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Component("logicalDecorator") +//@AllArgsConstructor +//@Slf4j +//public class LogicalShiftDecorator implements ByteDecorator { +// +//// private final FieldRuleEngineMapper fieldRuleEngineMapper; +//// +//// //字节位移 +//// @Override +//// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +//// String logicalValue = ""; +//// RuleEvaluator fieldRuleEngine = new RuleEvaluator(); +//// try { +//// Map env2 = new HashMap(); +//// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +//// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +//// for (String contentId : contentIdList) { +//// RuleDict ruleDict = ruleDictMap.get(contentId); +//// if (ruleDict.getCode().contains("#")) { +//// //使用动态的值 +//// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +//// } +//// env2.put(ruleDict.getName(), ruleDict.getCode()); +//// } +//// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +//// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +//// return null; +//// } +//// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +//// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +//// return values; +//// } catch (Exception ex) { +//// log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", +//// JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +//// return null; +//// } +//// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java index 346468f..822fead 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@AllArgsConstructor -@Slf4j -public class OperationDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("optionDecorator") +//@AllArgsConstructor +//@Slf4j +//public class OperationDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //混合运算,有常量或者乘除的缩放 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java index 50fb0a7..7a8bccb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@AllArgsConstructor -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +////精度计算 +//@AllArgsConstructor +//@Registry("precisionDecorator") +//@Slf4j +//public class PrecisionDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java index da39235..27f9cc7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java @@ -1,54 +1,53 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@AllArgsConstructor -@Slf4j -public class RuleDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("ruleDecorator") +//@AllArgsConstructor +//@Slf4j +//public class RuleDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //吃我一套正则表达式 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (Exception ex) { +// log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java index 7f5cbf3..c043f97 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java @@ -2,6 +2,6 @@ import java.util.Map; -public interface ComandeEventService { +public interface ComandeEventService{ Map loadComandeEventConfig(String protocolId,String scene); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java index 476ad84..aaf1837 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java @@ -2,46 +2,46 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.dao.CommandEventDao; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @Slf4j @AllArgsConstructor -public class ComandeEventServiceImpl implements ComandeEventService { +public class ComandeEventServiceImpl implements ComandeEventRegistry { - private final CommandEventDao commandEventDao; + // private final CommandEventDao commandEventDao; // 加密bean 固定字段出现变化的字段解析,业务字段的有序内容 @Override - public Map loadComandeEventConfig(String protocolId,String sceneName) { - CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); - if (ObjectUtil.isEmpty(commandEventConfig)) { - log.error("协议{},没有配置成功接收回复配置,清排查原因"); - return null; - } - String replyJson = commandEventConfig.getReplyContentJson(); - List> replyMapList = JSONArray.parseObject(replyJson, List.class); - List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); - Map fixMap = fixList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); - List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) - .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) - .collect(Collectors.toList()); - Map commandConfigMap = new HashMap<>(); - commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); - commandConfigMap.put("fixContent", fixMap); - commandConfigMap.put("bizContent", contentList); - return commandConfigMap; + public Map loadComandeEventConfig(String protocolId, String sceneName) { +// CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); +// if (ObjectUtil.isEmpty(commandEventConfig)) { +// log.error("协议{},没有配置成功接收回复配置,清排查原因"); +// return null; +// } +// String replyJson = commandEventConfig.getReplyContentJson(); +// List> replyMapList = JSONArray.parseObject(replyJson, List.class); +// List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); +// Map fixMap = fixList.stream() +// .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); +// List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) +// .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) +// .collect(Collectors.toList()); +// Map commandConfigMap = new HashMap<>(); +// commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); +// commandConfigMap.put("fixContent", fixMap); +// commandConfigMap.put("bizContent", contentList); +// return commandConfigMap; + return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 128b09d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java deleted file mode 100644 index 4016b0b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface DatagramEventMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java deleted file mode 100644 index 597c306..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.apache.ibatis.annotations.Mapper; - -public interface FieldConfigMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java deleted file mode 100644 index a31680a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.PreRuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface PreRuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java deleted file mode 100644 index 9060a69..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface ProtocolConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java deleted file mode 100644 index 6fa6936..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java deleted file mode 100644 index 582a705..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleDict; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleDictMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java deleted file mode 100644 index 6e302c8..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.CommandEventMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Optional; - -@Component -public class CommandEventDao { - - @Resource - private CommandEventMapper commandEventMapper; - - public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId) - .eq("scene", sceneName) - .eq("enabled", 1); - List commandEventConfig = commandEventMapper.selectList(queryWrapper); - Optional optionalEventConfig = commandEventConfig.stream().findFirst(); - return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java deleted file mode 100644 index 9137e4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.FieldConfigMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class FieldConfigDao { - - @Resource - private FieldConfigMapper fieldConfigMapper; - - public FieldConfig getFieldConfigById(String fieldId) { - FieldConfig fieldConfig = fieldConfigMapper.selectById(fieldId); - return fieldConfig; - } - - public List getFieldConfigs(String protocolId,Integer isFixed) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",isFixed); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - - public List getStorageFieldConfig(String protocolId) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",1) - .eq("is_storage",1); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java deleted file mode 100644 index 67bff6b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.mapper.PreRuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class PreRuleConfigDao { - - @Resource - private PreRuleConfigMapper preRuleConfigMapper; - - public List getPreRuleList(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return preRuleConfigMapper.selectList(queryWrapper); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java deleted file mode 100644 index d69ea85..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.RuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleConfigDao { - - @Resource - private RuleConfigMapper ruleConfigMapper; - - public RuleConfig getNextRuleConfig(String ruleFields) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("parse_rule_json", ruleFields); - return ruleConfigMapper.selectOne(queryWrapper); - } - - - public List getRuleConfigById(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return ruleConfigMapper.selectList(queryWrapper); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java deleted file mode 100644 index 932c185..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.RuleDictMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleDictDao { - - @Resource - private RuleDictMapper ruleDictMapper; - - public List getRuleDictConfig() { - List ruleDictList = ruleDictMapper.selectList(null); - return ruleDictList; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java index 9f9e279..43bc4d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java @@ -10,20 +10,15 @@ import io.netty.channel.socket.nio.NioServerSocketChannel; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import javax.annotation.PreDestroy; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static cn.hutool.core.util.ClassUtil.getClasses; /** * SensorhubServer netty服务端 */ @Slf4j -@Service +@Component public class SensorhubServer { /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java index 2c79ff5..9a28c36 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java @@ -11,13 +11,13 @@ import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioSocketChannel; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClient 客户端 */ @Slf4j -@Service +@Registry public final class SensorhubClient { public static void main(String[] args) throws Exception { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java index 9774be0..477c3f7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java @@ -6,12 +6,12 @@ import io.netty.channel.socket.SocketChannel; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientChannelInitialHandler */ -@Service +@Registry public class SensorhubClientChannelInitialHandler extends ChannelInitializer { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java index 346f4b3..73560e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java @@ -5,13 +5,13 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientHandler */ @Slf4j -@Service +@Registry public class SensorhubClientHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java index 5c1c6f2..d990af5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java @@ -4,12 +4,12 @@ import com.casic.missiles.pojo.Msg; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** * SensorhubServerHandler */ -@Service +@Component public class SensorhubServerHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 67283ae..af3172c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,41 +1,37 @@ package com.casic.missiles.parser; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultProtocolConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.*; +import com.casic.missiles.registry.FieldConfigRegistry; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; -import java.nio.charset.Charset; import java.util.HashMap; import java.util.List; import java.util.Map; -@Service("genericProtocolParser") +/** + * @author + */ +@Component("genericProtocolParser") @Slf4j -@AllArgsConstructor +@RequiredArgsConstructor public class GenericProtocolParser implements ProtocolParser { - private final LeadingCodeMatcher leadingCodeMatcher; private final List frameStructDispenserList; - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorInstanceSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; // 匹配首字母前导码=> 帧结构匹配前导码=> // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 @@ -44,18 +40,19 @@ public Boolean doParseProtocol(ByteBuf byteBuf) { String protocolContent = ByteBufUtil.hexDump(byteBuf); //匹配前导码 - List preCodeConfigs = leadingCodeMatcher.matchLeadingCode(protocolContent); + List preCodeConfigs = LeadingCodeMatcher.matchFrameLeadingCode(protocolContent); //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 if (preCodeConfigs.size() == 0) { - return rematch(byteBuf,protocolContent); + return rematch(byteBuf, protocolContent); } - //暂时先取第一个 + //暂时先取第一个,提升速度,使用享元模式, 减少类的创建销毁与构建 ProtocolConfig protocolConfig = preCodeConfigs.get(0); + AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); ByteBuf wholeDatagramByte = null; //通过匹配帧结构获取完整的数据包 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, preCodeConfigs.get(0))) != null) { + if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, protocolFactory)) != null) { break; } } @@ -68,76 +65,78 @@ * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 */ - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId, wholeDatagramByte); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap, protocolId); - //选取规则对应的流程实例 - DatagramEventConfig datagramEventConfig = processorInstanceSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); + //进行规则字段解析,进行匹配规则 + RuleConfig ruleConfig = getRuleConfig(protocolFactory, wholeDatagramByte); + if (ruleConfig == null) { + return false; + } //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, wholeDatagramByte); + ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte); + //以下进行业务的规则解析,同时选定流程实例 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); + DatagramEventProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain, + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText, protocolId); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain); //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); + datagramEventProvider.storeData(bizDataMap); return true; } - private Boolean rematch(ByteBuf byteBuf,String protocolContent) { + /** + * 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 + */ + private Boolean rematch(ByteBuf byteBuf, String protocolContent) { //重置位判断 byteBuf.resetReaderIndex(); //判断重置是否前移,如果没有前移,则直接判为匹配失败 if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { return false; } else { + //递归执行 return doParseProtocol(byteBuf); } } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; + //获取匹配规则->匹配规则 + private RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + //取出其中参与逻辑provider并判空 + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); + String rulePrepareFields = protocolConfig.getRulePrepareFields(); + //固定字段 + if (StringUtils.isNotEmpty(rulePrepareFields)) { + //获取统一固定字段解析 + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + //获取该协议的字段配置,用于协议规则匹配 + List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); + //获取规则 + RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, + rulePrepareFields, protocolFieldConfigs); + return ruleConfig; + } + return null; } - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + //数据构建,获取固定字段的store和业务字段store + private Map buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + Map bizDataMap = new HashMap<>(); + Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); + Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); + bizDataMap.putAll(ruleStoreObjectMap); + bizDataMap.putAll(protocolStoreObjectMap); return bizDataMap; } - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java index 8a46e32..16ce2e5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java @@ -3,6 +3,7 @@ import io.netty.buffer.ByteBuf; public interface ProtocolParser { + Boolean doParseProtocol(ByteBuf byteBuf); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java new file mode 100644 index 0000000..f7814af --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java @@ -0,0 +1,35 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.ProtocolConfigProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.ProtocolConfig; + +/** + * 存放基本协议的的加载信息 + */ +public class AbstractProtocolConfigFactory { + private final ProtocolConfigProvider protocolConfigProvider; + private final ProtocolFieldConfigProvider protocolFieldConfigProvider; + private final RuleConfigProvider ruleConfigProvider; + + public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { + this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); + this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); + this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); + } + + public ProtocolConfigProvider getProtocolConfigProvider() { + return protocolConfigProvider; + } + + public ProtocolFieldConfigProvider getProtocolFieldConfigProvider() { + return protocolFieldConfigProvider; + } + + public RuleConfigProvider getRuleConfigProvider() { + return ruleConfigProvider; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java new file mode 100644 index 0000000..6e36147 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java @@ -0,0 +1,57 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.CombinedFieldConfigProvider; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.FieldConfigProvider; +import com.casic.missiles.parser.provider.FieldRuleConfigProvider; + +/** + * 存放规则相关的的的加载信息 + */ +public class AbstractRuleConfigFactory { + + /** + * 处理字节 + */ + private final FieldConfigProvider fieldConfigProvider; + /** + * 处理组合字节解析的解码器 + */ + private final CombinedFieldConfigProvider combinedFieldConfigProvider; + /** + * 处理负责字节解析的规则配置 + */ + private final FieldRuleConfigProvider fieldRuleConfigProvider; + /** + * 处理实例流程 + */ + private final DatagramEventProvider datagramEventProvider; + + + public AbstractRuleConfigFactory(Long ruleId) { + this.fieldConfigProvider = new FieldConfigProvider(ruleId); + this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); + this.fieldRuleConfigProvider = new FieldRuleConfigProvider(ruleId); + this.datagramEventProvider = new DatagramEventProvider(ruleId); + } + + public FieldConfigProvider getFieldConfigProvider() { + return fieldConfigProvider; + } + + public CombinedFieldConfigProvider getCombinedFieldConfigProvider() { + return combinedFieldConfigProvider; + } + + public FieldRuleConfigProvider getFieldRuleConfigProvider() { + return fieldRuleConfigProvider; + } + + public DatagramEventProvider getDatagramEventProvider() { + return datagramEventProvider; + } + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java deleted file mode 100644 index 6e1719a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.factory; - - -import com.casic.missiles.pojo.ProtocolConfig; - -import java.util.List; - -/** - * 数据库访问优化(暂时未做) - *

- * 1、初始化协议解析配置,并存放到处存放缓存,对协议基本配置进行管理 - * 2、其中流程中所有的配置都经过此类进行管理,进行调用获取,增强解析速度 - */ -public interface DatagramFactory { - - /** - * 初始化 - */ - List datagramInit(); - - /** - * 根据前导码配置匹配,模糊匹配获取所有的报文项 - */ - List match(); - - /** - * 根据前导码匹配,返回报文项 - */ - List filer(); - - /** - * 保证数据的唯一性选择器 - */ - List selectOne(); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java new file mode 100644 index 0000000..87444a0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java @@ -0,0 +1,18 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +import java.util.List; + +/** + * 直接用,还是边用边创建 + */ +public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { + + + public DefaultProtocolConfigFactory(ProtocolConfig protocolConfig) { + super(protocolConfig); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java new file mode 100644 index 0000000..cce0c7c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java @@ -0,0 +1,12 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; + +public class DefaultRuleFactory extends AbstractRuleConfigFactory { + + public DefaultRuleFactory(Long ruleId) { + super(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java deleted file mode 100644 index 9ee97e0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.casic.missiles.parser.instance; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service -@Slf4j -@AllArgsConstructor -public class GeneralProcessor { - - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; - - /** - * 统一固定字段解析=>进行规则的查询的判断 - * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 - * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 - */ - @Deprecated - public boolean parseWholeDatagram(ByteBuf buffer, ProtocolConfig protocolConfig) { - try { - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap,protocolId); - //选取规则对应的流程= - DatagramEventConfig datagramEventConfig = processorSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); - //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); - //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); - //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); - //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); - //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); - return true; - } catch (Exception ex) { - log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", - ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); - return false; - } - } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; - } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); - } - - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); - return bizDataMap; - } - - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java index 25e7ad8..6a5777e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java @@ -1,23 +1,31 @@ package com.casic.missiles.parser.instance.impl; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.mapper.DatagramEventMapper; import com.casic.missiles.pojo.DatagramEventConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.SpringContextUtil; -@Service -@AllArgsConstructor +import java.util.List; +import java.util.Optional; + +/** + * @author cz + * + */ public class DefaultProcessorInstanceSelector implements ProcessorInstanceSelector { - private final DatagramEventMapper datagramEventMapper; + private static List datagramEventConfigs; + + static { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + datagramEventConfigs = datagramEventRegistry.getDatagramEventList(); + } @Override public DatagramEventConfig getProcessorInstance(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("rule_id", protocolId); - return datagramEventMapper.selectOne(queryWrapper); + Optional optionalSelectInstance = datagramEventConfigs.stream() + .filter(e -> e.getId().equals(protocolId)).limit(1).findFirst(); + return optionalSelectInstance.isPresent() ? optionalSelectInstance.get() : null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a778671..7b56a43 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,16 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import io.netty.buffer.ByteBuf; /** - * 分析匹配情况 - * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 - * 2、匹配不成功,有后续帧,可以进行下次匹配。 - * 3、匹配不成功,无后续帧,可以进行丢弃。 + * 分析匹配情况 + * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 + * 2、匹配不成功,有后续帧,可以进行下次匹配。 + * 3、匹配不成功,无后续帧,可以进行丢弃。 */ -public interface FrameStructMatcher{ +public interface FrameStructMatcher { - ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig); + ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 05320ab..8ebea78 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,23 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.ProtocolConfigMapper; +import com.casic.missiles.parser.provider.ProtocolConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Component; import java.util.List; import java.util.stream.Collectors; -@Component -@AllArgsConstructor public class LeadingCodeMatcher { - private final ProtocolConfigMapper protocolMapper; - //** 1、首字母匹配前导码, // 2、以匹配出的前导码是否在报文中条件进行前导码的匹配二次筛选 - public List matchLeadingCode(String protocolContent){ + public static List matchFrameLeadingCode(String protocolContent){ List initialConfigs = initialMatch(protocolContent); List preCodeConfigs = initialConfigs.stream() .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) @@ -26,13 +19,16 @@ } //初始化匹配前导码内容 - private List initialMatch(String protocolContent) { - String protocolStr = protocolContent.charAt(0) + ""; - QueryWrapper queryWrapper = new QueryWrapper() - .likeRight("pre_fix", protocolStr); - List protocolConfigList = protocolMapper.selectList(queryWrapper); - return protocolConfigList; + private static List initialMatch(String protocolContent) { + String firstFrameChar = protocolContent.charAt(0) + ""; + ProtocolConfigProvider protocolConfigProvider=new ProtocolConfigProvider(firstFrameChar); + return protocolConfigProvider.getMatchList(); } + + + + + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index cf2113d..e915877 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -1,32 +1,35 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(0) -@Service +@Component public class FrameLengthMatcher implements FrameStructMatcher { - @Autowired - private FieldParser fieldParser; - //超过长度 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { String dataGramContent = ByteBufUtil.hexDump(byteBuf); - if (StringUtils.isEmpty(protocolConfig.getUnpackId()) && StringUtils.isEmpty(protocolConfig.getTailStr())) { - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + //当不存在结尾标志和拆包标志,可以直接使用长度进行匹配 + if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { if (dataGramContent.length() >= totalLength) {//等于长度返回true,超出长度,切断 - ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, protocolConfig, totalLength); + ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, totalLength); return wholeDatagramByte; } else { //读的标志位前移舍弃 @@ -38,7 +41,7 @@ return null; } - private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, Integer totalLength) { byteBuf.readBytes(totalLength); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, totalLength - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 2bfc213..d527ad0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; @@ -13,7 +13,7 @@ import lombok.AllArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.nio.charset.Charset; import java.util.Map; @@ -22,32 +22,30 @@ * 后续标志验证 */ @Order(1) -@Service +@Component @AllArgsConstructor -public class FrameMarkMatcher implements FrameStructMatcher { - - private final FieldConfigDao fieldConfigDao; - private final FieldParser fieldParser; - private final FieldResolver fieldResolverManger; +public class FrameMarkMatcher implements FrameStructMatcher, FixedPropertyEnum { //帧后续标志=>结束,进行帧的重组=>有后续,1、帧移位判别 2、继续接收帧 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig UnpackConfig = StringUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getUnpackId()); - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); - Integer upback = 0; + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); ByteBuf mergeWholeFrameByte = null; - if (!ObjectUtil.isEmpty(UnpackConfig)) { - while (hasNextFullFrame(byteBuf, protocolConfig)) { - upback = (Integer) fieldResolverManger.filedParserManger(byteBuf, UnpackConfig, null); + if (!ObjectUtil.isEmpty(unpackFlag)) { + while (hasNextFullFrame(byteBuf, protocolConfig, protocolFieldConfigProvider)) { //是否存在后续位 - if (upback == 1) {//使用esayRule + if (unpackFlag == 1) {//使用esayRule //表示可以截取 - mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolConfig, totalLength); + mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolFieldConfigProvider, protocolConfig); return mergeWholeFrameByte; } else { - byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig)); + byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig, protocolFieldConfigProvider)); } } } @@ -56,7 +54,8 @@ //选取第一个帧,将业务内容和后面部分分开 //计算数据报文-业务内容 - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolFieldConfigProvider protocolFieldConfigProvider, ProtocolConfig protocolConfig) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); //截取完整报文 byteBuf.readBytes(totalLength); ByteBuf byteBufContent = byteBuf.slice(0, byteBuf.readerIndex()); @@ -68,15 +67,15 @@ String tail = ""; System.out.println(ByteBufUtil.hexDump(byteBufContent)); //会存在多个帧拼接在一起的的情况,进行合并处理 - while (hasNextFullFrame(byteBufContent, protocolConfig)) { - Integer currentFrameLength = fieldParser.getTotalLength(protocolConfig, byteBufContent); + while (hasNextFullFrame(byteBufContent, protocolConfig, protocolFieldConfigProvider)) { + Integer currentFrameLength = protocolFieldConfigProvider.getTotalLength(byteBufContent, protocolConfig); byteBufContent.readBytes(currentFrameLength); ByteBuf currentbyteBuf = byteBufContent.slice(0, byteBufContent.readerIndex()); byteBufContent.markReaderIndex();//读的标志位前移 System.out.println(ByteBufUtil.hexDump(byteBufContent)); String hexDump = currentbyteBuf.toString(Charset.forName("ISO-8859-1")); //获取当前固定帧结构的关系map - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, currentbyteBuf); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(currentbyteBuf, protocolConfig); if (StringUtils.isEmpty(mergeFrameStr)) { //首次获取业务数据报文 mergeFrameStr += hexDump.substring(0, currentFrameFixedProperty.get("tailPosition")); @@ -95,22 +94,22 @@ /** * 获取平移到下一帧起始位置 */ - public int getNextFrameOffset(ByteBuf buffer, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, buffer); - return currentFrameFixedProperty.get("totalLength"); + public int getNextFrameOffset(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + return currentFrameFixedProperty.get(TOTAL_LENGTH); } /** * 判断是否出错进行整个帧的 */ - public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, byteBuf); + public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); //保证读取位置不在固定位置,是可变的业务内容 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("fixedPosition")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(FIXED_POSITION)) { return false; } //判断读取是否操作帧长度 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("totalLength")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(TOTAL_LENGTH)) { return false; } return true; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 76a3784..c3a1bab 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -1,50 +1,50 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.parser.instance.GeneralProcessor; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; +import io.netty.buffer.ByteBufUtil;; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(2) -@Service +@Component public class FrameTailMatcher implements FrameStructMatcher { - @Resource - private FieldConfigDao fieldConfigDao; - @Autowired - private GeneralProcessor generalProcessor; - //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig tailFieldConfig = StringUtils.isEmpty(protocolConfig.getTailStr()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getTailStr()); - if (!ObjectUtil.isEmpty(tailFieldConfig)) { - String tailStr = tailFieldConfig.getFieldName(); + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfig protocolFieldConfig = ObjectUtils.isEmpty(protocolConfig.getTailStr()) ? null : + fieldConfigProvider.getFieldConfigById(protocolConfig.getTailStr()); + if (!ObjectUtil.isEmpty(protocolFieldConfig)) { + String tailStr = protocolFieldConfig.getFieldName(); String dataGramContent = ByteBufUtil.hexDump(byteBuf); Boolean tailFlag = ByteBufUtil.hexDump(byteBuf).contains(tailStr); if (!tailFlag) { //使用esayRule return null; } else if (dataGramContent.indexOf(tailStr) < dataGramContent.length() - tailStr.length()) { Integer length = dataGramContent.indexOf(tailStr) + tailStr.length(); - ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, protocolConfig, length); + ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, length); return wholeDatagramByte; //存在粘包 } } return null; } - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer length) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, Integer length) { byteBuf.readBytes(length); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, length - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java new file mode 100644 index 0000000..5f1c177 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java @@ -0,0 +1,73 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.combined.GenericCombinedFieldResolver; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.CombinedFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class CombinedFieldConfigProvider { + + + /** + * 作为临时配置列表缓存使用 + */ + private final List combinedFieldConfigList; + private Map storeObjectMap = new HashMap<>(); + + public CombinedFieldConfigProvider(Long ruleId) { + CombinedFieldConfigRegistry combinedFieldConfigRegistry = SpringContextUtil.getBean(CombinedFieldConfigRegistry.class); + combinedFieldConfigList = combinedFieldConfigRegistry.getCombinedFieldConfigList(ruleId); + } + + public void parseDataField(RuleConfig ruleConfig, String clearZeroPlain,Map fieldConfigsMap ) { + if (showSkip()) { + return; + } + //匹配对应的数据,然后进行相关的字段解析 + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver(); + combinedFieldResolver.parseDataField(combinedFieldConfigList, byteBuf, storeObjectMap,fieldConfigsMap); + } + + + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getCombinedFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return combinedFieldConfigList.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public List getCombinedFieldConfigList() { + return combinedFieldConfigList; + } + + /* 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(combinedFieldConfigList) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java new file mode 100644 index 0000000..f3cfedc --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java @@ -0,0 +1,11 @@ +package com.casic.missiles.parser.provider; + +/** + * @author cz + * @date 2023-6-12 + */ +public class CommandEventProvider{ + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java new file mode 100644 index 0000000..70eec5e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java @@ -0,0 +1,77 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.safe.SafeStrategy; +import com.casic.missiles.parser.sender.DataSubscribeProvider; +import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class DatagramEventProvider { + + private final DatagramEventConfig processorInstance; + + public DatagramEventProvider(Long ruleId) { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + List datagramEventConfigList = + datagramEventRegistry.getDatagramEventList(ruleId); + processorInstance = this.getProcessorInstance(datagramEventConfigList); + } + + public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { + if (showSkip()) { + return null; + } + return datagramEventConfigList.get(0); + } + + // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 + public String getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap) { + String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? + processorInstance.getSafeBean() : + fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); + if (!StringUtils.isEmpty(safeName)) { + //需要加密 + SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); + String plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); + return clearComplementZero(plain); + } + return ByteBufUtil.hexDump(bizDataContent); + } + + //解密清零操作 + private String clearComplementZero(String plain) { + plain = plain.substring(0, plain.lastIndexOf("00")); + return plain; + } + + //数据发送,数据发送者暂未构建 + public void storeData(Map bizDataMap) { + DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); +// dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return ObjectUtils.isNotEmpty(processorInstance) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java new file mode 100644 index 0000000..7e1fe0a --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java @@ -0,0 +1,97 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.FieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class FieldConfigProvider { + + + private final List fieldConfigs; + private Map storeObjectMap = new HashMap<>(); +// private Map singleObjects = new ConcurrentHashMap<>(); + + public FieldConfigProvider(Long ruleId) { + FieldConfigRegistry fieldConfigRegistry = SpringContextUtil.getBean(FieldConfigRegistry.class); + fieldConfigs = fieldConfigRegistry.getFieldConfigList(ruleId); + } + + public List getFieldConfigs() { + return fieldConfigs; + } + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public Map parseDataField(RuleConfig ruleConfig, String clearZeroPlain) { + if (showSkip()) { + return null; + } + List prepareFieldConfig = prepareParseField(ruleConfig); + if (CollectionUtils.isNotEmpty(prepareFieldConfig)) { + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(fieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + return fixDataMap; + } + } + return null; + } + + /** + * 得到需要处理的业务内容 + * + * @return + */ + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return fieldConfigs.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public Map getFieldConfigsMap() { + return fieldConfigs.stream().collect( + Collectors.toMap(FieldConfig::getId, e -> e) + ); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(fieldConfigs) ? false : true; + } + + +} + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java new file mode 100644 index 0000000..817bfaf --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java @@ -0,0 +1,19 @@ +package com.casic.missiles.parser.provider; + +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.registry.FieldRuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; + +public class FieldRuleConfigProvider { + + private final List fieldRuleConfigList; + + public FieldRuleConfigProvider(Long ruleId) { + FieldRuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(FieldRuleConfigRegistry.class); + fieldRuleConfigList = ruleConfigRegistry.getFieldRuleConfigList(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java new file mode 100644 index 0000000..99a1b06 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java @@ -0,0 +1,53 @@ +package com.casic.missiles.parser.provider; + + +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.registry.ProtocolConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolConfigProvider { + + private final List protocolConfigList; + + public ProtocolConfigProvider(String firstChar) { + ProtocolConfigRegistry registry = SpringContextUtil.getBean(ProtocolConfigRegistry.class); + protocolConfigList = registry.getProtocolConfigList(firstChar); + } + + public List getMatchList() { + return protocolConfigList; + } + + /** + * 设置当前协议 + * + * @param protocolConfig + */ + public ProtocolConfigProvider(ProtocolConfig protocolConfig) { + List protocolConfigs = new ArrayList<>(); + protocolConfigs.add(protocolConfig); + protocolConfigList = protocolConfigs; + } + + /** + * 获取当前协议 + * + * @return + */ + public ProtocolConfig getCurrentProtocolConfig() { + if (this.protocolConfigList == null) { + return null; + } else { + return protocolConfigList.get(0); + } + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java new file mode 100644 index 0000000..043927d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java @@ -0,0 +1,213 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.registry.ProtocolFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolFieldConfigProvider { + + private static final String FIXED_FIELD_DS = "fixedFieldDs"; + private static final String CONTENT_FIELD_DS = "contentFieldDs"; + private static final String PROTOCOL_LENGTH = "protocolLength"; + private static final String PROTOCOL_FIELD_ID = "protocolFieldId"; + private static final String PROTOCOL_POSITION = "protocolPosition"; + + private final List protocolFieldConfigs; + private Map singleObjects = new ConcurrentHashMap<>(); + private Map storeObjectMap = new HashMap<>(); + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public ProtocolFieldConfigProvider(Long protocolId) { + ProtocolFieldConfigRegistry protocolFieldConfigRegistry = SpringContextUtil.getBean(ProtocolFieldConfigRegistry.class); + protocolFieldConfigs = protocolFieldConfigRegistry.getProtocolFieldConfigList(protocolId); + } + + public List getProtocolFieldConfigs() { + return protocolFieldConfigs; + } + + public ProtocolFieldConfig getFieldConfigById(Long fieldId) { + Optional optionalConfig = protocolFieldConfigs.stream().filter( + e -> e.getId().equals(fieldId) + ).findFirst(); + return optionalConfig.isPresent() ? optionalConfig.get() : null; + } + + public Integer getProtocolFieldValue(Long protocolFieldId, ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_FIELD_ID + protocolFieldId + ByteBufUtil.hexDump(byteBuf); + //获取缓存 + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + //加载固定长度数据集合 + Map fixDataMap = this.getProtocolDataMap(byteBuf); + ProtocolFieldConfig protocolFieldConfig = selectFieldConfig(protocolFieldId); + Integer protocolFieldValue = 0; + //获取约定字段的总长度 + if (fixDataMap.containsKey(protocolFieldConfig.getFieldName())) { + Object appointUnpackObject = fixDataMap.get(protocolFieldConfig.getFieldName()); + if (ObjectUtils.isNotEmpty(appointUnpackObject)) { + protocolFieldValue = (Integer) appointUnpackObject; + } + } + if (protocolFieldValue != null) { + //加入缓存 + if (ObjectUtils.isNotEmpty(protocolFieldValue)) { + this.singleObjects.put(catchKey, protocolFieldValue); + return protocolFieldValue; + } + } + return null; + } + + /** + * 获取帧固定位置信息 + * + * @param byteBuf + * @param protocolConfig + * @return + */ + public Map getFixedProperty(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_POSITION + protocolConfig.getId(); + if (this.singleObjects.containsKey(catchKey)) { + return (Map) singleObjects.get(catchKey); + } + Map fixedPropertyMap = new HashMap<>(); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + fixedPropertyMap = fieldParser.doGetFixedProperty(protocolFieldConfigs, this.getTotalLength(byteBuf,protocolConfig)); + if (CollectionUtils.isNotEmpty(fixedPropertyMap)) { + this.singleObjects.put(catchKey, fixedPropertyMap); + return fixedPropertyMap; + } + return fixedPropertyMap; + } + + /** + * 获取帧结构应有的总长度 + */ + public Integer getTotalLength(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_LENGTH + ByteBufUtil.hexDump(byteBuf); + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + Integer appointFrameLength = getProtocolFieldValue(protocolConfig.getTotalLengthId(), byteBuf); + if (appointFrameLength != null) { + //获取过滤的字段集合总长度 + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Integer totalFilterLength = fieldParser.getTotalFilterLength(protocolConfig, byteBuf, getFixFieldConfigMap()); + //计算总长度 + Integer totalLength = appointFrameLength + totalFilterLength; + //加入缓存 + if (ObjectUtils.isNotEmpty(totalLength)) { + this.singleObjects.put(catchKey, totalLength); + return totalLength; + } + } + return null; + } + + /** + * 获取协议有关字段解析内容 + * storeObjectMap存储代转存的数据 + * + * @return + */ + public Map getProtocolDataMap(ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(FIXED_FIELD_DS)) { + return (Map) singleObjects.get(FIXED_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(protocolFieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + this.singleObjects.put(FIXED_FIELD_DS, fixDataMap); + return fixDataMap; + } + return null; + } + + /** + * 获取业务报文内容的content字节 + * + * @param wholeDatagramByte + * @return + */ + public ByteBuf getDataContentBuf(ByteBuf wholeDatagramByte) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(CONTENT_FIELD_DS)) { + return (ByteBuf) singleObjects.get(CONTENT_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + ByteBuf bizDataByteBuf = fieldParser.getDataContentBuf(protocolFieldConfigs, wholeDatagramByte); + if (bizDataByteBuf != null) { + this.singleObjects.put(CONTENT_FIELD_DS, bizDataByteBuf); + return bizDataByteBuf; + } + return null; + } + + + private ProtocolFieldConfig selectFieldConfig(Long id) { + Optional optionalProtocolFieldConfig = this.protocolFieldConfigs.stream().filter( + e -> e.getId().equals(id) + ).findFirst(); + return optionalProtocolFieldConfig.isPresent() ? optionalProtocolFieldConfig.get() : null; + } + + + private Map getFixFieldConfigMap() { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, e -> e) + ); + return fixDataFieldMap; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(protocolFieldConfigs) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java new file mode 100644 index 0000000..dafba1c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java @@ -0,0 +1,56 @@ +package com.casic.missiles.parser.provider; + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.rule.GenericRuleResolver; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.RuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleConfigProvider { + + private final List ruleConfigs; + + public List getRuleConfigs() { + return ruleConfigs; + } + + public RuleConfigProvider(Long protocolId) { + RuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(RuleConfigRegistry.class); + ruleConfigs = ruleConfigRegistry.getRuleConfigById(protocolId); + } + + /** + * 获取规则匹配结果 + * + * @param parseFixedDataMap + * @param protocolFieldConfigs + * @return + */ + public RuleConfig doGetRule(Map parseFixedDataMap, + String ids, + List protocolFieldConfigs) { + if (showSkip()) { + return null; + } + RuleConfig ruleConfig = GenericRuleResolver.machRule(parseFixedDataMap, ids, protocolFieldConfigs, ruleConfigs); + return ruleConfig; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(ruleConfigs) ? false : true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java index 3c05891..856b399 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java @@ -1,18 +1,11 @@ package com.casic.missiles.parser.resolver; -import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.springframework.web.bind.annotation.RequestBody; -import javax.annotation.Resource; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -20,19 +13,17 @@ @Slf4j public class ByteMergeProvider { - @Resource - private FieldRuleEngineMapper fieldRuleEngineMapper; - //拿到所有的值合并到一个值 - public String resolveByteMerge(List valueList, String ruletypeId, String vaildRange) { + public static String resolveByteMerge(List valueList, String ruleTypeId, String vaildRange) { String values = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Map vaildMap = getValidRangeMap(vaildRange); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(ruletypeId); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } + //暂时不处理 +// fieldRuleEngine = fieldRuleConfigMapper.selectById(ruleTypeId); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } Map env2 = new HashMap(); for (int i = 0; i < valueList.size(); i++) { if (vaildMap.containsKey(i)) { @@ -47,7 +38,7 @@ } } - private Map getValidRangeMap(String vaildRange) { + private static Map getValidRangeMap(String vaildRange) { String[] range = vaildRange.split(","); Map vaildMap = new HashMap(); for (int i = 0; i < range.length; i++) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 8d821cd..85d6bbf 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -1,9 +1,12 @@ package com.casic.missiles.parser.resolver; +import com.casic.missiles.pojo.AbstractFieldConfig; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; import io.netty.buffer.ByteBuf; +import java.util.List; import java.util.Map; /** @@ -11,18 +14,14 @@ */ public interface FieldParser { -// Map fieldProcess(String protocolContent,); - Map dataParser(RuleConfig ruleConfig, String lightText,String protocolId); + Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength); - Map fixDataParser(String protocolId, ByteBuf buffer); + Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap); - Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf); + ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer); - ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer); - - ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer); - - Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer); + Integer getTotalFilterLength(ProtocolConfig protocolConfig, ByteBuf byteBuf, Map protocolFieldConfigMap); } + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java new file mode 100644 index 0000000..9e0c00e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java @@ -0,0 +1,52 @@ +package com.casic.missiles.parser.resolver; + +import com.casic.missiles.pojo.AbstractFieldConfig; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.util.List; + +public class FieldParserSupport { + + //分别计算bit和byte长度=> 合并长度 + protected Integer calculateLength(List fieldConfigList) { + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + Integer fixedLength = bytefixedLength + bitfixedLength / 8; + return fixedLength; + } + + //找到最大值=> 根据最大值计算业务数据下标 + protected Integer calculatePosition(List fieldConfigList) { + String rex = "[0-9]+"; + Integer max = -1; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) + && Integer.valueOf(fieldConfig.getOriginPositionByte()) > max) { + max = Integer.valueOf(fieldConfig.getOriginPositionByte()); + } + } + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) && fieldConfig.getOriginPositionByte().equals(max)) { + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + } + } + Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; + return maxFixedPosition; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java deleted file mode 100644 index dd3a6cd..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java +++ /dev/null @@ -1,170 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.ByteResolverParam; -import io.netty.buffer.ByteBuf; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -/** - * 字段解析管理总类 - */ -@Service -@Slf4j -@AllArgsConstructor -public class FieldResolver extends ByteMergeProvider { - - //1、字段截取 => 2、简单的字节解析和复杂的字节解析 - public Object filedParserManger(ByteBuf byteBuf, FieldConfig fieldConfig, Integer maxFixedPosition) { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - //最大固定位置不为空, - if (!ObjectUtil.isEmpty(maxFixedPosition)) { - orignPosition -= maxFixedPosition; - } - Object fieldValue = 0; - //待优化 - if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { - fieldValue = bitToResolver(byteBuf, fieldConfig); - } else { - ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); - fieldValue = parsingFields(fieldBytes, fieldConfig.getRuleJson()); - } - return fieldValue; - } - - //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, - //目前默认配置的规则设置暂不支持配置化,由实现完成 - private Object parsingFields(ByteBuf byteBuf, String ruleJson) { - Object fieldsResolveValue = null; - List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); - if (ObjectUtil.isEmpty(ruleMapList)) { - fieldsResolveValue = defaultResolveBuilder(byteBuf); - } else { - fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); - } - return fieldsResolveValue; - } - - private Object defaultResolveBuilder(ByteBuf byteBuf) { - Integer defaultResolveValue = 0; - for (int i = 0; i < byteBuf.writerIndex(); i++) { - defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; - } - return defaultResolveValue; - } - - //字段解析构建器(针对字节单位的) - //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 - // 字节归并结束或者规则结束=>继续根据规则进行判断 - private Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { - Object customizeResolveValue = null; - try { - List bytStrList = new ArrayList<>(); - //存放到数组里面 - for (int i = 0; i < byteBuf.writerIndex(); i++) { - bytStrList.add(byteBuf.readByte()); - } - int i = 0; - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - customizeResolveValue = this.resolveByteMerge(bytStrList, ruletypeId,vaildRange); - break; - } else { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - List tempBytStr = new ArrayList<>(); - for (int k = 0; i < bytStrList.size(); i++) { - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(k) - .value(bytStrList.get(k)) - .ruletypeId(ruletypeId).build(); - tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); - } - bytStrList = tempBytStr; - } - i++; - } - //字节归并到一起=>继续根据规则进行判断 - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(customizeResolveValue) - .ruletypeId(ruletypeId).build(); - customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(customizeResolveValue)); - return customizeResolveValue; - } catch (RuntimeException ex) { - log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); - return null; - } - } - - /** - * 1、单个字节情况表示字段 - * 2、多字节情况表示字段(暂未处理) - */ - private Object bitToResolver(ByteBuf byteBuf, FieldConfig fieldConfig) { - Object fieldValue = new Object(); - try { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - byte fields = 0x00; - if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); - } else { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); - } - - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { - if (!StringUtils.isEmpty(fieldConfig.getExactOrignPosition())) { - fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getExactOrignPosition())).byteValue() - >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); - } else { - fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); - } - } else { - fieldValue = Integer.valueOf(fields & 0xff); - } - if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { - return fieldValue; - } - List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); - int i = 0; - //字节归并到一起=>继续根据规则进行判断 - while (i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(fieldValue) - .ruletypeId(ruletypeId).build(); - fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(fieldValue)); - return fieldValue; - } catch (RuntimeException ex) { - log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); - return null; - } - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java new file mode 100644 index 0000000..1d2aeab --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java @@ -0,0 +1,36 @@ +package com.casic.missiles.parser.resolver.bytes; + +import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.mapper.FieldRuleConfigMapper; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.pojo.ByteResolverParam; +import com.googlecode.aviator.AviatorEvaluator; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; +//转换规则 +@Component("convert") +@AllArgsConstructor +@Slf4j +public class ByteRuleResolver implements ByteResolver { + + private final FieldRuleConfigMapper fieldRuleConfigMapper; + + @Override + public Object resolveOperationRule(ByteResolverParam byteResolverParam){ + FieldRuleConfig fieldRuleEngine=fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); + if(ObjectUtil.isEmpty(fieldRuleEngine)){ + return byteResolverParam.getValue(); + } + String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); + Map env2 = new HashMap(); + env2.put("value", (byte) byteResolverParam.getValue()); + String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); + return values; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java index 103821c..786b71c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java @@ -2,34 +2,34 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("logicalShift") +@Component("logicalShift") @AllArgsConstructor @Slf4j public class LogicalShiftResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //字节位移 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { Integer index = byteResolverParam.getIndex(); - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return byteResolverParam.getValue(); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java index 476747d..01149bd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("operation") +@Component("operation") @AllArgsConstructor @Slf4j public class OperationResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //混合运算,有常量或者乘除的缩放 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java index 608af3a..32cc8a4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java @@ -2,48 +2,47 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.delivery.decorator.ByteDecorator; +import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @AllArgsConstructor public class FieldDecoratorManger { - private final RuleDictDao ruleDictDao; + private final RuleConfigRegistry ruleDictDao; // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 // (1)静态的业务字段是字典里面可以配置的 // (2)动态的业务字段是通过规则生成的 public String contentMerge(String ruleJson, String sceneConent, String dynamicContent) { - List ruleDictList = ruleDictDao.getRuleDictConfig(); - Map ruleDictMap = ruleDictList.stream().collect( - Collectors.toMap(RuleDict::getId, e -> e)); - List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); - for (Map ruleMap : ruleMapList) { - String ruleType = String.valueOf(ruleMap.get("ruleType")); - ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); - NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); - byteDecorator.nodeDecoratorRule(nodeDecoratorParm); - } +// List ruleDictList = ruleDictDao.getRuleDictConfig(); +// Map ruleDictMap = ruleDictList.stream().collect( +// Collectors.toMap(RuleDict::getId, e -> e)); +// List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); +// for (Map ruleMap : ruleMapList) { +// String ruleType = String.valueOf(ruleMap.get("ruleType")); +// ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); +// NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); +// byteDecorator.nodeDecoratorRule(nodeDecoratorParm); +// } return null; } - - private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { - NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() - .contents(sceneConent) - .dynamicContent(dynamicContent) - .ruletypeId(ruletypeId) - .ruleDictMap(ruleDictMap) - .build(); - return nodeDecoratorParm; - } +// +// private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { +// NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() +// .contents(sceneConent) +// .dynamicContent(dynamicContent) +// .ruletypeId(ruletypeId) +// .ruleDictMap(ruleDictMap) +// .build(); +// return nodeDecoratorParm; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java index 652970c..b204ac3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java @@ -1,56 +1,56 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@AllArgsConstructor -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", - JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Component; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Component("logicalDecorator") +//@AllArgsConstructor +//@Slf4j +//public class LogicalShiftDecorator implements ByteDecorator { +// +//// private final FieldRuleEngineMapper fieldRuleEngineMapper; +//// +//// //字节位移 +//// @Override +//// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +//// String logicalValue = ""; +//// RuleEvaluator fieldRuleEngine = new RuleEvaluator(); +//// try { +//// Map env2 = new HashMap(); +//// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +//// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +//// for (String contentId : contentIdList) { +//// RuleDict ruleDict = ruleDictMap.get(contentId); +//// if (ruleDict.getCode().contains("#")) { +//// //使用动态的值 +//// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +//// } +//// env2.put(ruleDict.getName(), ruleDict.getCode()); +//// } +//// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +//// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +//// return null; +//// } +//// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +//// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +//// return values; +//// } catch (Exception ex) { +//// log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", +//// JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +//// return null; +//// } +//// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java index 346468f..822fead 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@AllArgsConstructor -@Slf4j -public class OperationDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("optionDecorator") +//@AllArgsConstructor +//@Slf4j +//public class OperationDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //混合运算,有常量或者乘除的缩放 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java index 50fb0a7..7a8bccb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@AllArgsConstructor -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +////精度计算 +//@AllArgsConstructor +//@Registry("precisionDecorator") +//@Slf4j +//public class PrecisionDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java index da39235..27f9cc7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java @@ -1,54 +1,53 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@AllArgsConstructor -@Slf4j -public class RuleDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("ruleDecorator") +//@AllArgsConstructor +//@Slf4j +//public class RuleDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //吃我一套正则表达式 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (Exception ex) { +// log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java index 7f5cbf3..c043f97 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java @@ -2,6 +2,6 @@ import java.util.Map; -public interface ComandeEventService { +public interface ComandeEventService{ Map loadComandeEventConfig(String protocolId,String scene); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java index 476ad84..aaf1837 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java @@ -2,46 +2,46 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.dao.CommandEventDao; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @Slf4j @AllArgsConstructor -public class ComandeEventServiceImpl implements ComandeEventService { +public class ComandeEventServiceImpl implements ComandeEventRegistry { - private final CommandEventDao commandEventDao; + // private final CommandEventDao commandEventDao; // 加密bean 固定字段出现变化的字段解析,业务字段的有序内容 @Override - public Map loadComandeEventConfig(String protocolId,String sceneName) { - CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); - if (ObjectUtil.isEmpty(commandEventConfig)) { - log.error("协议{},没有配置成功接收回复配置,清排查原因"); - return null; - } - String replyJson = commandEventConfig.getReplyContentJson(); - List> replyMapList = JSONArray.parseObject(replyJson, List.class); - List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); - Map fixMap = fixList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); - List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) - .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) - .collect(Collectors.toList()); - Map commandConfigMap = new HashMap<>(); - commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); - commandConfigMap.put("fixContent", fixMap); - commandConfigMap.put("bizContent", contentList); - return commandConfigMap; + public Map loadComandeEventConfig(String protocolId, String sceneName) { +// CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); +// if (ObjectUtil.isEmpty(commandEventConfig)) { +// log.error("协议{},没有配置成功接收回复配置,清排查原因"); +// return null; +// } +// String replyJson = commandEventConfig.getReplyContentJson(); +// List> replyMapList = JSONArray.parseObject(replyJson, List.class); +// List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); +// Map fixMap = fixList.stream() +// .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); +// List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) +// .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) +// .collect(Collectors.toList()); +// Map commandConfigMap = new HashMap<>(); +// commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); +// commandConfigMap.put("fixContent", fixMap); +// commandConfigMap.put("bizContent", contentList); +// return commandConfigMap; + return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 128b09d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java deleted file mode 100644 index 4016b0b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface DatagramEventMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java deleted file mode 100644 index 597c306..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.apache.ibatis.annotations.Mapper; - -public interface FieldConfigMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java deleted file mode 100644 index a31680a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.PreRuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface PreRuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java deleted file mode 100644 index 9060a69..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface ProtocolConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java deleted file mode 100644 index 6fa6936..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java deleted file mode 100644 index 582a705..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleDict; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleDictMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java deleted file mode 100644 index 6e302c8..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.CommandEventMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Optional; - -@Component -public class CommandEventDao { - - @Resource - private CommandEventMapper commandEventMapper; - - public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId) - .eq("scene", sceneName) - .eq("enabled", 1); - List commandEventConfig = commandEventMapper.selectList(queryWrapper); - Optional optionalEventConfig = commandEventConfig.stream().findFirst(); - return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java deleted file mode 100644 index 9137e4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.FieldConfigMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class FieldConfigDao { - - @Resource - private FieldConfigMapper fieldConfigMapper; - - public FieldConfig getFieldConfigById(String fieldId) { - FieldConfig fieldConfig = fieldConfigMapper.selectById(fieldId); - return fieldConfig; - } - - public List getFieldConfigs(String protocolId,Integer isFixed) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",isFixed); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - - public List getStorageFieldConfig(String protocolId) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",1) - .eq("is_storage",1); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java deleted file mode 100644 index 67bff6b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.mapper.PreRuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class PreRuleConfigDao { - - @Resource - private PreRuleConfigMapper preRuleConfigMapper; - - public List getPreRuleList(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return preRuleConfigMapper.selectList(queryWrapper); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java deleted file mode 100644 index d69ea85..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.RuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleConfigDao { - - @Resource - private RuleConfigMapper ruleConfigMapper; - - public RuleConfig getNextRuleConfig(String ruleFields) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("parse_rule_json", ruleFields); - return ruleConfigMapper.selectOne(queryWrapper); - } - - - public List getRuleConfigById(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return ruleConfigMapper.selectList(queryWrapper); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java deleted file mode 100644 index 932c185..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.RuleDictMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleDictDao { - - @Resource - private RuleDictMapper ruleDictMapper; - - public List getRuleDictConfig() { - List ruleDictList = ruleDictMapper.selectList(null); - return ruleDictList; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java index 9f9e279..43bc4d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java @@ -10,20 +10,15 @@ import io.netty.channel.socket.nio.NioServerSocketChannel; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import javax.annotation.PreDestroy; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static cn.hutool.core.util.ClassUtil.getClasses; /** * SensorhubServer netty服务端 */ @Slf4j -@Service +@Component public class SensorhubServer { /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java index 2c79ff5..9a28c36 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java @@ -11,13 +11,13 @@ import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioSocketChannel; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClient 客户端 */ @Slf4j -@Service +@Registry public final class SensorhubClient { public static void main(String[] args) throws Exception { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java index 9774be0..477c3f7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java @@ -6,12 +6,12 @@ import io.netty.channel.socket.SocketChannel; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientChannelInitialHandler */ -@Service +@Registry public class SensorhubClientChannelInitialHandler extends ChannelInitializer { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java index 346f4b3..73560e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java @@ -5,13 +5,13 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientHandler */ @Slf4j -@Service +@Registry public class SensorhubClientHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java index 5c1c6f2..d990af5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java @@ -4,12 +4,12 @@ import com.casic.missiles.pojo.Msg; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** * SensorhubServerHandler */ -@Service +@Component public class SensorhubServerHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 67283ae..af3172c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,41 +1,37 @@ package com.casic.missiles.parser; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultProtocolConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.*; +import com.casic.missiles.registry.FieldConfigRegistry; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; -import java.nio.charset.Charset; import java.util.HashMap; import java.util.List; import java.util.Map; -@Service("genericProtocolParser") +/** + * @author + */ +@Component("genericProtocolParser") @Slf4j -@AllArgsConstructor +@RequiredArgsConstructor public class GenericProtocolParser implements ProtocolParser { - private final LeadingCodeMatcher leadingCodeMatcher; private final List frameStructDispenserList; - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorInstanceSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; // 匹配首字母前导码=> 帧结构匹配前导码=> // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 @@ -44,18 +40,19 @@ public Boolean doParseProtocol(ByteBuf byteBuf) { String protocolContent = ByteBufUtil.hexDump(byteBuf); //匹配前导码 - List preCodeConfigs = leadingCodeMatcher.matchLeadingCode(protocolContent); + List preCodeConfigs = LeadingCodeMatcher.matchFrameLeadingCode(protocolContent); //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 if (preCodeConfigs.size() == 0) { - return rematch(byteBuf,protocolContent); + return rematch(byteBuf, protocolContent); } - //暂时先取第一个 + //暂时先取第一个,提升速度,使用享元模式, 减少类的创建销毁与构建 ProtocolConfig protocolConfig = preCodeConfigs.get(0); + AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); ByteBuf wholeDatagramByte = null; //通过匹配帧结构获取完整的数据包 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, preCodeConfigs.get(0))) != null) { + if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, protocolFactory)) != null) { break; } } @@ -68,76 +65,78 @@ * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 */ - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId, wholeDatagramByte); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap, protocolId); - //选取规则对应的流程实例 - DatagramEventConfig datagramEventConfig = processorInstanceSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); + //进行规则字段解析,进行匹配规则 + RuleConfig ruleConfig = getRuleConfig(protocolFactory, wholeDatagramByte); + if (ruleConfig == null) { + return false; + } //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, wholeDatagramByte); + ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte); + //以下进行业务的规则解析,同时选定流程实例 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); + DatagramEventProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain, + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText, protocolId); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain); //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); + datagramEventProvider.storeData(bizDataMap); return true; } - private Boolean rematch(ByteBuf byteBuf,String protocolContent) { + /** + * 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 + */ + private Boolean rematch(ByteBuf byteBuf, String protocolContent) { //重置位判断 byteBuf.resetReaderIndex(); //判断重置是否前移,如果没有前移,则直接判为匹配失败 if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { return false; } else { + //递归执行 return doParseProtocol(byteBuf); } } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; + //获取匹配规则->匹配规则 + private RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + //取出其中参与逻辑provider并判空 + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); + String rulePrepareFields = protocolConfig.getRulePrepareFields(); + //固定字段 + if (StringUtils.isNotEmpty(rulePrepareFields)) { + //获取统一固定字段解析 + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + //获取该协议的字段配置,用于协议规则匹配 + List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); + //获取规则 + RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, + rulePrepareFields, protocolFieldConfigs); + return ruleConfig; + } + return null; } - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + //数据构建,获取固定字段的store和业务字段store + private Map buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + Map bizDataMap = new HashMap<>(); + Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); + Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); + bizDataMap.putAll(ruleStoreObjectMap); + bizDataMap.putAll(protocolStoreObjectMap); return bizDataMap; } - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java index 8a46e32..16ce2e5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java @@ -3,6 +3,7 @@ import io.netty.buffer.ByteBuf; public interface ProtocolParser { + Boolean doParseProtocol(ByteBuf byteBuf); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java new file mode 100644 index 0000000..f7814af --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java @@ -0,0 +1,35 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.ProtocolConfigProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.ProtocolConfig; + +/** + * 存放基本协议的的加载信息 + */ +public class AbstractProtocolConfigFactory { + private final ProtocolConfigProvider protocolConfigProvider; + private final ProtocolFieldConfigProvider protocolFieldConfigProvider; + private final RuleConfigProvider ruleConfigProvider; + + public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { + this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); + this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); + this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); + } + + public ProtocolConfigProvider getProtocolConfigProvider() { + return protocolConfigProvider; + } + + public ProtocolFieldConfigProvider getProtocolFieldConfigProvider() { + return protocolFieldConfigProvider; + } + + public RuleConfigProvider getRuleConfigProvider() { + return ruleConfigProvider; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java new file mode 100644 index 0000000..6e36147 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java @@ -0,0 +1,57 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.CombinedFieldConfigProvider; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.FieldConfigProvider; +import com.casic.missiles.parser.provider.FieldRuleConfigProvider; + +/** + * 存放规则相关的的的加载信息 + */ +public class AbstractRuleConfigFactory { + + /** + * 处理字节 + */ + private final FieldConfigProvider fieldConfigProvider; + /** + * 处理组合字节解析的解码器 + */ + private final CombinedFieldConfigProvider combinedFieldConfigProvider; + /** + * 处理负责字节解析的规则配置 + */ + private final FieldRuleConfigProvider fieldRuleConfigProvider; + /** + * 处理实例流程 + */ + private final DatagramEventProvider datagramEventProvider; + + + public AbstractRuleConfigFactory(Long ruleId) { + this.fieldConfigProvider = new FieldConfigProvider(ruleId); + this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); + this.fieldRuleConfigProvider = new FieldRuleConfigProvider(ruleId); + this.datagramEventProvider = new DatagramEventProvider(ruleId); + } + + public FieldConfigProvider getFieldConfigProvider() { + return fieldConfigProvider; + } + + public CombinedFieldConfigProvider getCombinedFieldConfigProvider() { + return combinedFieldConfigProvider; + } + + public FieldRuleConfigProvider getFieldRuleConfigProvider() { + return fieldRuleConfigProvider; + } + + public DatagramEventProvider getDatagramEventProvider() { + return datagramEventProvider; + } + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java deleted file mode 100644 index 6e1719a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.factory; - - -import com.casic.missiles.pojo.ProtocolConfig; - -import java.util.List; - -/** - * 数据库访问优化(暂时未做) - *

- * 1、初始化协议解析配置,并存放到处存放缓存,对协议基本配置进行管理 - * 2、其中流程中所有的配置都经过此类进行管理,进行调用获取,增强解析速度 - */ -public interface DatagramFactory { - - /** - * 初始化 - */ - List datagramInit(); - - /** - * 根据前导码配置匹配,模糊匹配获取所有的报文项 - */ - List match(); - - /** - * 根据前导码匹配,返回报文项 - */ - List filer(); - - /** - * 保证数据的唯一性选择器 - */ - List selectOne(); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java new file mode 100644 index 0000000..87444a0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java @@ -0,0 +1,18 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +import java.util.List; + +/** + * 直接用,还是边用边创建 + */ +public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { + + + public DefaultProtocolConfigFactory(ProtocolConfig protocolConfig) { + super(protocolConfig); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java new file mode 100644 index 0000000..cce0c7c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java @@ -0,0 +1,12 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; + +public class DefaultRuleFactory extends AbstractRuleConfigFactory { + + public DefaultRuleFactory(Long ruleId) { + super(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java deleted file mode 100644 index 9ee97e0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.casic.missiles.parser.instance; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service -@Slf4j -@AllArgsConstructor -public class GeneralProcessor { - - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; - - /** - * 统一固定字段解析=>进行规则的查询的判断 - * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 - * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 - */ - @Deprecated - public boolean parseWholeDatagram(ByteBuf buffer, ProtocolConfig protocolConfig) { - try { - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap,protocolId); - //选取规则对应的流程= - DatagramEventConfig datagramEventConfig = processorSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); - //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); - //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); - //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); - //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); - //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); - return true; - } catch (Exception ex) { - log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", - ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); - return false; - } - } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; - } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); - } - - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); - return bizDataMap; - } - - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java index 25e7ad8..6a5777e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java @@ -1,23 +1,31 @@ package com.casic.missiles.parser.instance.impl; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.mapper.DatagramEventMapper; import com.casic.missiles.pojo.DatagramEventConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.SpringContextUtil; -@Service -@AllArgsConstructor +import java.util.List; +import java.util.Optional; + +/** + * @author cz + * + */ public class DefaultProcessorInstanceSelector implements ProcessorInstanceSelector { - private final DatagramEventMapper datagramEventMapper; + private static List datagramEventConfigs; + + static { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + datagramEventConfigs = datagramEventRegistry.getDatagramEventList(); + } @Override public DatagramEventConfig getProcessorInstance(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("rule_id", protocolId); - return datagramEventMapper.selectOne(queryWrapper); + Optional optionalSelectInstance = datagramEventConfigs.stream() + .filter(e -> e.getId().equals(protocolId)).limit(1).findFirst(); + return optionalSelectInstance.isPresent() ? optionalSelectInstance.get() : null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a778671..7b56a43 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,16 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import io.netty.buffer.ByteBuf; /** - * 分析匹配情况 - * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 - * 2、匹配不成功,有后续帧,可以进行下次匹配。 - * 3、匹配不成功,无后续帧,可以进行丢弃。 + * 分析匹配情况 + * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 + * 2、匹配不成功,有后续帧,可以进行下次匹配。 + * 3、匹配不成功,无后续帧,可以进行丢弃。 */ -public interface FrameStructMatcher{ +public interface FrameStructMatcher { - ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig); + ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 05320ab..8ebea78 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,23 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.ProtocolConfigMapper; +import com.casic.missiles.parser.provider.ProtocolConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Component; import java.util.List; import java.util.stream.Collectors; -@Component -@AllArgsConstructor public class LeadingCodeMatcher { - private final ProtocolConfigMapper protocolMapper; - //** 1、首字母匹配前导码, // 2、以匹配出的前导码是否在报文中条件进行前导码的匹配二次筛选 - public List matchLeadingCode(String protocolContent){ + public static List matchFrameLeadingCode(String protocolContent){ List initialConfigs = initialMatch(protocolContent); List preCodeConfigs = initialConfigs.stream() .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) @@ -26,13 +19,16 @@ } //初始化匹配前导码内容 - private List initialMatch(String protocolContent) { - String protocolStr = protocolContent.charAt(0) + ""; - QueryWrapper queryWrapper = new QueryWrapper() - .likeRight("pre_fix", protocolStr); - List protocolConfigList = protocolMapper.selectList(queryWrapper); - return protocolConfigList; + private static List initialMatch(String protocolContent) { + String firstFrameChar = protocolContent.charAt(0) + ""; + ProtocolConfigProvider protocolConfigProvider=new ProtocolConfigProvider(firstFrameChar); + return protocolConfigProvider.getMatchList(); } + + + + + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index cf2113d..e915877 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -1,32 +1,35 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(0) -@Service +@Component public class FrameLengthMatcher implements FrameStructMatcher { - @Autowired - private FieldParser fieldParser; - //超过长度 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { String dataGramContent = ByteBufUtil.hexDump(byteBuf); - if (StringUtils.isEmpty(protocolConfig.getUnpackId()) && StringUtils.isEmpty(protocolConfig.getTailStr())) { - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + //当不存在结尾标志和拆包标志,可以直接使用长度进行匹配 + if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { if (dataGramContent.length() >= totalLength) {//等于长度返回true,超出长度,切断 - ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, protocolConfig, totalLength); + ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, totalLength); return wholeDatagramByte; } else { //读的标志位前移舍弃 @@ -38,7 +41,7 @@ return null; } - private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, Integer totalLength) { byteBuf.readBytes(totalLength); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, totalLength - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 2bfc213..d527ad0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; @@ -13,7 +13,7 @@ import lombok.AllArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.nio.charset.Charset; import java.util.Map; @@ -22,32 +22,30 @@ * 后续标志验证 */ @Order(1) -@Service +@Component @AllArgsConstructor -public class FrameMarkMatcher implements FrameStructMatcher { - - private final FieldConfigDao fieldConfigDao; - private final FieldParser fieldParser; - private final FieldResolver fieldResolverManger; +public class FrameMarkMatcher implements FrameStructMatcher, FixedPropertyEnum { //帧后续标志=>结束,进行帧的重组=>有后续,1、帧移位判别 2、继续接收帧 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig UnpackConfig = StringUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getUnpackId()); - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); - Integer upback = 0; + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); ByteBuf mergeWholeFrameByte = null; - if (!ObjectUtil.isEmpty(UnpackConfig)) { - while (hasNextFullFrame(byteBuf, protocolConfig)) { - upback = (Integer) fieldResolverManger.filedParserManger(byteBuf, UnpackConfig, null); + if (!ObjectUtil.isEmpty(unpackFlag)) { + while (hasNextFullFrame(byteBuf, protocolConfig, protocolFieldConfigProvider)) { //是否存在后续位 - if (upback == 1) {//使用esayRule + if (unpackFlag == 1) {//使用esayRule //表示可以截取 - mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolConfig, totalLength); + mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolFieldConfigProvider, protocolConfig); return mergeWholeFrameByte; } else { - byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig)); + byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig, protocolFieldConfigProvider)); } } } @@ -56,7 +54,8 @@ //选取第一个帧,将业务内容和后面部分分开 //计算数据报文-业务内容 - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolFieldConfigProvider protocolFieldConfigProvider, ProtocolConfig protocolConfig) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); //截取完整报文 byteBuf.readBytes(totalLength); ByteBuf byteBufContent = byteBuf.slice(0, byteBuf.readerIndex()); @@ -68,15 +67,15 @@ String tail = ""; System.out.println(ByteBufUtil.hexDump(byteBufContent)); //会存在多个帧拼接在一起的的情况,进行合并处理 - while (hasNextFullFrame(byteBufContent, protocolConfig)) { - Integer currentFrameLength = fieldParser.getTotalLength(protocolConfig, byteBufContent); + while (hasNextFullFrame(byteBufContent, protocolConfig, protocolFieldConfigProvider)) { + Integer currentFrameLength = protocolFieldConfigProvider.getTotalLength(byteBufContent, protocolConfig); byteBufContent.readBytes(currentFrameLength); ByteBuf currentbyteBuf = byteBufContent.slice(0, byteBufContent.readerIndex()); byteBufContent.markReaderIndex();//读的标志位前移 System.out.println(ByteBufUtil.hexDump(byteBufContent)); String hexDump = currentbyteBuf.toString(Charset.forName("ISO-8859-1")); //获取当前固定帧结构的关系map - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, currentbyteBuf); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(currentbyteBuf, protocolConfig); if (StringUtils.isEmpty(mergeFrameStr)) { //首次获取业务数据报文 mergeFrameStr += hexDump.substring(0, currentFrameFixedProperty.get("tailPosition")); @@ -95,22 +94,22 @@ /** * 获取平移到下一帧起始位置 */ - public int getNextFrameOffset(ByteBuf buffer, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, buffer); - return currentFrameFixedProperty.get("totalLength"); + public int getNextFrameOffset(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + return currentFrameFixedProperty.get(TOTAL_LENGTH); } /** * 判断是否出错进行整个帧的 */ - public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, byteBuf); + public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); //保证读取位置不在固定位置,是可变的业务内容 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("fixedPosition")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(FIXED_POSITION)) { return false; } //判断读取是否操作帧长度 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("totalLength")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(TOTAL_LENGTH)) { return false; } return true; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 76a3784..c3a1bab 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -1,50 +1,50 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.parser.instance.GeneralProcessor; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; +import io.netty.buffer.ByteBufUtil;; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(2) -@Service +@Component public class FrameTailMatcher implements FrameStructMatcher { - @Resource - private FieldConfigDao fieldConfigDao; - @Autowired - private GeneralProcessor generalProcessor; - //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig tailFieldConfig = StringUtils.isEmpty(protocolConfig.getTailStr()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getTailStr()); - if (!ObjectUtil.isEmpty(tailFieldConfig)) { - String tailStr = tailFieldConfig.getFieldName(); + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfig protocolFieldConfig = ObjectUtils.isEmpty(protocolConfig.getTailStr()) ? null : + fieldConfigProvider.getFieldConfigById(protocolConfig.getTailStr()); + if (!ObjectUtil.isEmpty(protocolFieldConfig)) { + String tailStr = protocolFieldConfig.getFieldName(); String dataGramContent = ByteBufUtil.hexDump(byteBuf); Boolean tailFlag = ByteBufUtil.hexDump(byteBuf).contains(tailStr); if (!tailFlag) { //使用esayRule return null; } else if (dataGramContent.indexOf(tailStr) < dataGramContent.length() - tailStr.length()) { Integer length = dataGramContent.indexOf(tailStr) + tailStr.length(); - ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, protocolConfig, length); + ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, length); return wholeDatagramByte; //存在粘包 } } return null; } - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer length) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, Integer length) { byteBuf.readBytes(length); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, length - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java new file mode 100644 index 0000000..5f1c177 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java @@ -0,0 +1,73 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.combined.GenericCombinedFieldResolver; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.CombinedFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class CombinedFieldConfigProvider { + + + /** + * 作为临时配置列表缓存使用 + */ + private final List combinedFieldConfigList; + private Map storeObjectMap = new HashMap<>(); + + public CombinedFieldConfigProvider(Long ruleId) { + CombinedFieldConfigRegistry combinedFieldConfigRegistry = SpringContextUtil.getBean(CombinedFieldConfigRegistry.class); + combinedFieldConfigList = combinedFieldConfigRegistry.getCombinedFieldConfigList(ruleId); + } + + public void parseDataField(RuleConfig ruleConfig, String clearZeroPlain,Map fieldConfigsMap ) { + if (showSkip()) { + return; + } + //匹配对应的数据,然后进行相关的字段解析 + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver(); + combinedFieldResolver.parseDataField(combinedFieldConfigList, byteBuf, storeObjectMap,fieldConfigsMap); + } + + + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getCombinedFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return combinedFieldConfigList.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public List getCombinedFieldConfigList() { + return combinedFieldConfigList; + } + + /* 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(combinedFieldConfigList) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java new file mode 100644 index 0000000..f3cfedc --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java @@ -0,0 +1,11 @@ +package com.casic.missiles.parser.provider; + +/** + * @author cz + * @date 2023-6-12 + */ +public class CommandEventProvider{ + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java new file mode 100644 index 0000000..70eec5e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java @@ -0,0 +1,77 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.safe.SafeStrategy; +import com.casic.missiles.parser.sender.DataSubscribeProvider; +import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class DatagramEventProvider { + + private final DatagramEventConfig processorInstance; + + public DatagramEventProvider(Long ruleId) { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + List datagramEventConfigList = + datagramEventRegistry.getDatagramEventList(ruleId); + processorInstance = this.getProcessorInstance(datagramEventConfigList); + } + + public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { + if (showSkip()) { + return null; + } + return datagramEventConfigList.get(0); + } + + // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 + public String getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap) { + String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? + processorInstance.getSafeBean() : + fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); + if (!StringUtils.isEmpty(safeName)) { + //需要加密 + SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); + String plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); + return clearComplementZero(plain); + } + return ByteBufUtil.hexDump(bizDataContent); + } + + //解密清零操作 + private String clearComplementZero(String plain) { + plain = plain.substring(0, plain.lastIndexOf("00")); + return plain; + } + + //数据发送,数据发送者暂未构建 + public void storeData(Map bizDataMap) { + DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); +// dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return ObjectUtils.isNotEmpty(processorInstance) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java new file mode 100644 index 0000000..7e1fe0a --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java @@ -0,0 +1,97 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.FieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class FieldConfigProvider { + + + private final List fieldConfigs; + private Map storeObjectMap = new HashMap<>(); +// private Map singleObjects = new ConcurrentHashMap<>(); + + public FieldConfigProvider(Long ruleId) { + FieldConfigRegistry fieldConfigRegistry = SpringContextUtil.getBean(FieldConfigRegistry.class); + fieldConfigs = fieldConfigRegistry.getFieldConfigList(ruleId); + } + + public List getFieldConfigs() { + return fieldConfigs; + } + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public Map parseDataField(RuleConfig ruleConfig, String clearZeroPlain) { + if (showSkip()) { + return null; + } + List prepareFieldConfig = prepareParseField(ruleConfig); + if (CollectionUtils.isNotEmpty(prepareFieldConfig)) { + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(fieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + return fixDataMap; + } + } + return null; + } + + /** + * 得到需要处理的业务内容 + * + * @return + */ + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return fieldConfigs.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public Map getFieldConfigsMap() { + return fieldConfigs.stream().collect( + Collectors.toMap(FieldConfig::getId, e -> e) + ); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(fieldConfigs) ? false : true; + } + + +} + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java new file mode 100644 index 0000000..817bfaf --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java @@ -0,0 +1,19 @@ +package com.casic.missiles.parser.provider; + +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.registry.FieldRuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; + +public class FieldRuleConfigProvider { + + private final List fieldRuleConfigList; + + public FieldRuleConfigProvider(Long ruleId) { + FieldRuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(FieldRuleConfigRegistry.class); + fieldRuleConfigList = ruleConfigRegistry.getFieldRuleConfigList(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java new file mode 100644 index 0000000..99a1b06 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java @@ -0,0 +1,53 @@ +package com.casic.missiles.parser.provider; + + +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.registry.ProtocolConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolConfigProvider { + + private final List protocolConfigList; + + public ProtocolConfigProvider(String firstChar) { + ProtocolConfigRegistry registry = SpringContextUtil.getBean(ProtocolConfigRegistry.class); + protocolConfigList = registry.getProtocolConfigList(firstChar); + } + + public List getMatchList() { + return protocolConfigList; + } + + /** + * 设置当前协议 + * + * @param protocolConfig + */ + public ProtocolConfigProvider(ProtocolConfig protocolConfig) { + List protocolConfigs = new ArrayList<>(); + protocolConfigs.add(protocolConfig); + protocolConfigList = protocolConfigs; + } + + /** + * 获取当前协议 + * + * @return + */ + public ProtocolConfig getCurrentProtocolConfig() { + if (this.protocolConfigList == null) { + return null; + } else { + return protocolConfigList.get(0); + } + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java new file mode 100644 index 0000000..043927d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java @@ -0,0 +1,213 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.registry.ProtocolFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolFieldConfigProvider { + + private static final String FIXED_FIELD_DS = "fixedFieldDs"; + private static final String CONTENT_FIELD_DS = "contentFieldDs"; + private static final String PROTOCOL_LENGTH = "protocolLength"; + private static final String PROTOCOL_FIELD_ID = "protocolFieldId"; + private static final String PROTOCOL_POSITION = "protocolPosition"; + + private final List protocolFieldConfigs; + private Map singleObjects = new ConcurrentHashMap<>(); + private Map storeObjectMap = new HashMap<>(); + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public ProtocolFieldConfigProvider(Long protocolId) { + ProtocolFieldConfigRegistry protocolFieldConfigRegistry = SpringContextUtil.getBean(ProtocolFieldConfigRegistry.class); + protocolFieldConfigs = protocolFieldConfigRegistry.getProtocolFieldConfigList(protocolId); + } + + public List getProtocolFieldConfigs() { + return protocolFieldConfigs; + } + + public ProtocolFieldConfig getFieldConfigById(Long fieldId) { + Optional optionalConfig = protocolFieldConfigs.stream().filter( + e -> e.getId().equals(fieldId) + ).findFirst(); + return optionalConfig.isPresent() ? optionalConfig.get() : null; + } + + public Integer getProtocolFieldValue(Long protocolFieldId, ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_FIELD_ID + protocolFieldId + ByteBufUtil.hexDump(byteBuf); + //获取缓存 + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + //加载固定长度数据集合 + Map fixDataMap = this.getProtocolDataMap(byteBuf); + ProtocolFieldConfig protocolFieldConfig = selectFieldConfig(protocolFieldId); + Integer protocolFieldValue = 0; + //获取约定字段的总长度 + if (fixDataMap.containsKey(protocolFieldConfig.getFieldName())) { + Object appointUnpackObject = fixDataMap.get(protocolFieldConfig.getFieldName()); + if (ObjectUtils.isNotEmpty(appointUnpackObject)) { + protocolFieldValue = (Integer) appointUnpackObject; + } + } + if (protocolFieldValue != null) { + //加入缓存 + if (ObjectUtils.isNotEmpty(protocolFieldValue)) { + this.singleObjects.put(catchKey, protocolFieldValue); + return protocolFieldValue; + } + } + return null; + } + + /** + * 获取帧固定位置信息 + * + * @param byteBuf + * @param protocolConfig + * @return + */ + public Map getFixedProperty(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_POSITION + protocolConfig.getId(); + if (this.singleObjects.containsKey(catchKey)) { + return (Map) singleObjects.get(catchKey); + } + Map fixedPropertyMap = new HashMap<>(); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + fixedPropertyMap = fieldParser.doGetFixedProperty(protocolFieldConfigs, this.getTotalLength(byteBuf,protocolConfig)); + if (CollectionUtils.isNotEmpty(fixedPropertyMap)) { + this.singleObjects.put(catchKey, fixedPropertyMap); + return fixedPropertyMap; + } + return fixedPropertyMap; + } + + /** + * 获取帧结构应有的总长度 + */ + public Integer getTotalLength(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_LENGTH + ByteBufUtil.hexDump(byteBuf); + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + Integer appointFrameLength = getProtocolFieldValue(protocolConfig.getTotalLengthId(), byteBuf); + if (appointFrameLength != null) { + //获取过滤的字段集合总长度 + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Integer totalFilterLength = fieldParser.getTotalFilterLength(protocolConfig, byteBuf, getFixFieldConfigMap()); + //计算总长度 + Integer totalLength = appointFrameLength + totalFilterLength; + //加入缓存 + if (ObjectUtils.isNotEmpty(totalLength)) { + this.singleObjects.put(catchKey, totalLength); + return totalLength; + } + } + return null; + } + + /** + * 获取协议有关字段解析内容 + * storeObjectMap存储代转存的数据 + * + * @return + */ + public Map getProtocolDataMap(ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(FIXED_FIELD_DS)) { + return (Map) singleObjects.get(FIXED_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(protocolFieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + this.singleObjects.put(FIXED_FIELD_DS, fixDataMap); + return fixDataMap; + } + return null; + } + + /** + * 获取业务报文内容的content字节 + * + * @param wholeDatagramByte + * @return + */ + public ByteBuf getDataContentBuf(ByteBuf wholeDatagramByte) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(CONTENT_FIELD_DS)) { + return (ByteBuf) singleObjects.get(CONTENT_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + ByteBuf bizDataByteBuf = fieldParser.getDataContentBuf(protocolFieldConfigs, wholeDatagramByte); + if (bizDataByteBuf != null) { + this.singleObjects.put(CONTENT_FIELD_DS, bizDataByteBuf); + return bizDataByteBuf; + } + return null; + } + + + private ProtocolFieldConfig selectFieldConfig(Long id) { + Optional optionalProtocolFieldConfig = this.protocolFieldConfigs.stream().filter( + e -> e.getId().equals(id) + ).findFirst(); + return optionalProtocolFieldConfig.isPresent() ? optionalProtocolFieldConfig.get() : null; + } + + + private Map getFixFieldConfigMap() { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, e -> e) + ); + return fixDataFieldMap; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(protocolFieldConfigs) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java new file mode 100644 index 0000000..dafba1c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java @@ -0,0 +1,56 @@ +package com.casic.missiles.parser.provider; + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.rule.GenericRuleResolver; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.RuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleConfigProvider { + + private final List ruleConfigs; + + public List getRuleConfigs() { + return ruleConfigs; + } + + public RuleConfigProvider(Long protocolId) { + RuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(RuleConfigRegistry.class); + ruleConfigs = ruleConfigRegistry.getRuleConfigById(protocolId); + } + + /** + * 获取规则匹配结果 + * + * @param parseFixedDataMap + * @param protocolFieldConfigs + * @return + */ + public RuleConfig doGetRule(Map parseFixedDataMap, + String ids, + List protocolFieldConfigs) { + if (showSkip()) { + return null; + } + RuleConfig ruleConfig = GenericRuleResolver.machRule(parseFixedDataMap, ids, protocolFieldConfigs, ruleConfigs); + return ruleConfig; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(ruleConfigs) ? false : true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java index 3c05891..856b399 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java @@ -1,18 +1,11 @@ package com.casic.missiles.parser.resolver; -import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.springframework.web.bind.annotation.RequestBody; -import javax.annotation.Resource; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -20,19 +13,17 @@ @Slf4j public class ByteMergeProvider { - @Resource - private FieldRuleEngineMapper fieldRuleEngineMapper; - //拿到所有的值合并到一个值 - public String resolveByteMerge(List valueList, String ruletypeId, String vaildRange) { + public static String resolveByteMerge(List valueList, String ruleTypeId, String vaildRange) { String values = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Map vaildMap = getValidRangeMap(vaildRange); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(ruletypeId); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } + //暂时不处理 +// fieldRuleEngine = fieldRuleConfigMapper.selectById(ruleTypeId); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } Map env2 = new HashMap(); for (int i = 0; i < valueList.size(); i++) { if (vaildMap.containsKey(i)) { @@ -47,7 +38,7 @@ } } - private Map getValidRangeMap(String vaildRange) { + private static Map getValidRangeMap(String vaildRange) { String[] range = vaildRange.split(","); Map vaildMap = new HashMap(); for (int i = 0; i < range.length; i++) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 8d821cd..85d6bbf 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -1,9 +1,12 @@ package com.casic.missiles.parser.resolver; +import com.casic.missiles.pojo.AbstractFieldConfig; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; import io.netty.buffer.ByteBuf; +import java.util.List; import java.util.Map; /** @@ -11,18 +14,14 @@ */ public interface FieldParser { -// Map fieldProcess(String protocolContent,); - Map dataParser(RuleConfig ruleConfig, String lightText,String protocolId); + Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength); - Map fixDataParser(String protocolId, ByteBuf buffer); + Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap); - Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf); + ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer); - ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer); - - ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer); - - Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer); + Integer getTotalFilterLength(ProtocolConfig protocolConfig, ByteBuf byteBuf, Map protocolFieldConfigMap); } + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java new file mode 100644 index 0000000..9e0c00e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java @@ -0,0 +1,52 @@ +package com.casic.missiles.parser.resolver; + +import com.casic.missiles.pojo.AbstractFieldConfig; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.util.List; + +public class FieldParserSupport { + + //分别计算bit和byte长度=> 合并长度 + protected Integer calculateLength(List fieldConfigList) { + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + Integer fixedLength = bytefixedLength + bitfixedLength / 8; + return fixedLength; + } + + //找到最大值=> 根据最大值计算业务数据下标 + protected Integer calculatePosition(List fieldConfigList) { + String rex = "[0-9]+"; + Integer max = -1; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) + && Integer.valueOf(fieldConfig.getOriginPositionByte()) > max) { + max = Integer.valueOf(fieldConfig.getOriginPositionByte()); + } + } + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) && fieldConfig.getOriginPositionByte().equals(max)) { + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + } + } + Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; + return maxFixedPosition; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java deleted file mode 100644 index dd3a6cd..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java +++ /dev/null @@ -1,170 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.ByteResolverParam; -import io.netty.buffer.ByteBuf; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -/** - * 字段解析管理总类 - */ -@Service -@Slf4j -@AllArgsConstructor -public class FieldResolver extends ByteMergeProvider { - - //1、字段截取 => 2、简单的字节解析和复杂的字节解析 - public Object filedParserManger(ByteBuf byteBuf, FieldConfig fieldConfig, Integer maxFixedPosition) { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - //最大固定位置不为空, - if (!ObjectUtil.isEmpty(maxFixedPosition)) { - orignPosition -= maxFixedPosition; - } - Object fieldValue = 0; - //待优化 - if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { - fieldValue = bitToResolver(byteBuf, fieldConfig); - } else { - ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); - fieldValue = parsingFields(fieldBytes, fieldConfig.getRuleJson()); - } - return fieldValue; - } - - //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, - //目前默认配置的规则设置暂不支持配置化,由实现完成 - private Object parsingFields(ByteBuf byteBuf, String ruleJson) { - Object fieldsResolveValue = null; - List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); - if (ObjectUtil.isEmpty(ruleMapList)) { - fieldsResolveValue = defaultResolveBuilder(byteBuf); - } else { - fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); - } - return fieldsResolveValue; - } - - private Object defaultResolveBuilder(ByteBuf byteBuf) { - Integer defaultResolveValue = 0; - for (int i = 0; i < byteBuf.writerIndex(); i++) { - defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; - } - return defaultResolveValue; - } - - //字段解析构建器(针对字节单位的) - //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 - // 字节归并结束或者规则结束=>继续根据规则进行判断 - private Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { - Object customizeResolveValue = null; - try { - List bytStrList = new ArrayList<>(); - //存放到数组里面 - for (int i = 0; i < byteBuf.writerIndex(); i++) { - bytStrList.add(byteBuf.readByte()); - } - int i = 0; - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - customizeResolveValue = this.resolveByteMerge(bytStrList, ruletypeId,vaildRange); - break; - } else { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - List tempBytStr = new ArrayList<>(); - for (int k = 0; i < bytStrList.size(); i++) { - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(k) - .value(bytStrList.get(k)) - .ruletypeId(ruletypeId).build(); - tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); - } - bytStrList = tempBytStr; - } - i++; - } - //字节归并到一起=>继续根据规则进行判断 - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(customizeResolveValue) - .ruletypeId(ruletypeId).build(); - customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(customizeResolveValue)); - return customizeResolveValue; - } catch (RuntimeException ex) { - log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); - return null; - } - } - - /** - * 1、单个字节情况表示字段 - * 2、多字节情况表示字段(暂未处理) - */ - private Object bitToResolver(ByteBuf byteBuf, FieldConfig fieldConfig) { - Object fieldValue = new Object(); - try { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - byte fields = 0x00; - if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); - } else { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); - } - - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { - if (!StringUtils.isEmpty(fieldConfig.getExactOrignPosition())) { - fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getExactOrignPosition())).byteValue() - >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); - } else { - fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); - } - } else { - fieldValue = Integer.valueOf(fields & 0xff); - } - if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { - return fieldValue; - } - List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); - int i = 0; - //字节归并到一起=>继续根据规则进行判断 - while (i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(fieldValue) - .ruletypeId(ruletypeId).build(); - fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(fieldValue)); - return fieldValue; - } catch (RuntimeException ex) { - log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); - return null; - } - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java new file mode 100644 index 0000000..1d2aeab --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java @@ -0,0 +1,36 @@ +package com.casic.missiles.parser.resolver.bytes; + +import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.mapper.FieldRuleConfigMapper; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.pojo.ByteResolverParam; +import com.googlecode.aviator.AviatorEvaluator; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; +//转换规则 +@Component("convert") +@AllArgsConstructor +@Slf4j +public class ByteRuleResolver implements ByteResolver { + + private final FieldRuleConfigMapper fieldRuleConfigMapper; + + @Override + public Object resolveOperationRule(ByteResolverParam byteResolverParam){ + FieldRuleConfig fieldRuleEngine=fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); + if(ObjectUtil.isEmpty(fieldRuleEngine)){ + return byteResolverParam.getValue(); + } + String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); + Map env2 = new HashMap(); + env2.put("value", (byte) byteResolverParam.getValue()); + String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); + return values; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java index 103821c..786b71c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java @@ -2,34 +2,34 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("logicalShift") +@Component("logicalShift") @AllArgsConstructor @Slf4j public class LogicalShiftResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //字节位移 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { Integer index = byteResolverParam.getIndex(); - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return byteResolverParam.getValue(); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java index 476747d..01149bd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("operation") +@Component("operation") @AllArgsConstructor @Slf4j public class OperationResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //混合运算,有常量或者乘除的缩放 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java index 0b82cf4..79abcce 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.casic.missiles.pojo.ByteResolverParam; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; //精度计算 -@Service("precision") +@Component("precision") @AllArgsConstructor @Slf4j public class PrecisionResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java index 608af3a..32cc8a4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java @@ -2,48 +2,47 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.delivery.decorator.ByteDecorator; +import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @AllArgsConstructor public class FieldDecoratorManger { - private final RuleDictDao ruleDictDao; + private final RuleConfigRegistry ruleDictDao; // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 // (1)静态的业务字段是字典里面可以配置的 // (2)动态的业务字段是通过规则生成的 public String contentMerge(String ruleJson, String sceneConent, String dynamicContent) { - List ruleDictList = ruleDictDao.getRuleDictConfig(); - Map ruleDictMap = ruleDictList.stream().collect( - Collectors.toMap(RuleDict::getId, e -> e)); - List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); - for (Map ruleMap : ruleMapList) { - String ruleType = String.valueOf(ruleMap.get("ruleType")); - ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); - NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); - byteDecorator.nodeDecoratorRule(nodeDecoratorParm); - } +// List ruleDictList = ruleDictDao.getRuleDictConfig(); +// Map ruleDictMap = ruleDictList.stream().collect( +// Collectors.toMap(RuleDict::getId, e -> e)); +// List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); +// for (Map ruleMap : ruleMapList) { +// String ruleType = String.valueOf(ruleMap.get("ruleType")); +// ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); +// NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); +// byteDecorator.nodeDecoratorRule(nodeDecoratorParm); +// } return null; } - - private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { - NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() - .contents(sceneConent) - .dynamicContent(dynamicContent) - .ruletypeId(ruletypeId) - .ruleDictMap(ruleDictMap) - .build(); - return nodeDecoratorParm; - } +// +// private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { +// NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() +// .contents(sceneConent) +// .dynamicContent(dynamicContent) +// .ruletypeId(ruletypeId) +// .ruleDictMap(ruleDictMap) +// .build(); +// return nodeDecoratorParm; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java index 652970c..b204ac3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java @@ -1,56 +1,56 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@AllArgsConstructor -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", - JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Component; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Component("logicalDecorator") +//@AllArgsConstructor +//@Slf4j +//public class LogicalShiftDecorator implements ByteDecorator { +// +//// private final FieldRuleEngineMapper fieldRuleEngineMapper; +//// +//// //字节位移 +//// @Override +//// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +//// String logicalValue = ""; +//// RuleEvaluator fieldRuleEngine = new RuleEvaluator(); +//// try { +//// Map env2 = new HashMap(); +//// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +//// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +//// for (String contentId : contentIdList) { +//// RuleDict ruleDict = ruleDictMap.get(contentId); +//// if (ruleDict.getCode().contains("#")) { +//// //使用动态的值 +//// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +//// } +//// env2.put(ruleDict.getName(), ruleDict.getCode()); +//// } +//// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +//// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +//// return null; +//// } +//// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +//// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +//// return values; +//// } catch (Exception ex) { +//// log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", +//// JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +//// return null; +//// } +//// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java index 346468f..822fead 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@AllArgsConstructor -@Slf4j -public class OperationDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("optionDecorator") +//@AllArgsConstructor +//@Slf4j +//public class OperationDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //混合运算,有常量或者乘除的缩放 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java index 50fb0a7..7a8bccb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@AllArgsConstructor -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +////精度计算 +//@AllArgsConstructor +//@Registry("precisionDecorator") +//@Slf4j +//public class PrecisionDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java index da39235..27f9cc7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java @@ -1,54 +1,53 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@AllArgsConstructor -@Slf4j -public class RuleDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("ruleDecorator") +//@AllArgsConstructor +//@Slf4j +//public class RuleDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //吃我一套正则表达式 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (Exception ex) { +// log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java index 7f5cbf3..c043f97 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java @@ -2,6 +2,6 @@ import java.util.Map; -public interface ComandeEventService { +public interface ComandeEventService{ Map loadComandeEventConfig(String protocolId,String scene); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java index 476ad84..aaf1837 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java @@ -2,46 +2,46 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.dao.CommandEventDao; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @Slf4j @AllArgsConstructor -public class ComandeEventServiceImpl implements ComandeEventService { +public class ComandeEventServiceImpl implements ComandeEventRegistry { - private final CommandEventDao commandEventDao; + // private final CommandEventDao commandEventDao; // 加密bean 固定字段出现变化的字段解析,业务字段的有序内容 @Override - public Map loadComandeEventConfig(String protocolId,String sceneName) { - CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); - if (ObjectUtil.isEmpty(commandEventConfig)) { - log.error("协议{},没有配置成功接收回复配置,清排查原因"); - return null; - } - String replyJson = commandEventConfig.getReplyContentJson(); - List> replyMapList = JSONArray.parseObject(replyJson, List.class); - List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); - Map fixMap = fixList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); - List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) - .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) - .collect(Collectors.toList()); - Map commandConfigMap = new HashMap<>(); - commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); - commandConfigMap.put("fixContent", fixMap); - commandConfigMap.put("bizContent", contentList); - return commandConfigMap; + public Map loadComandeEventConfig(String protocolId, String sceneName) { +// CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); +// if (ObjectUtil.isEmpty(commandEventConfig)) { +// log.error("协议{},没有配置成功接收回复配置,清排查原因"); +// return null; +// } +// String replyJson = commandEventConfig.getReplyContentJson(); +// List> replyMapList = JSONArray.parseObject(replyJson, List.class); +// List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); +// Map fixMap = fixList.stream() +// .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); +// List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) +// .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) +// .collect(Collectors.toList()); +// Map commandConfigMap = new HashMap<>(); +// commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); +// commandConfigMap.put("fixContent", fixMap); +// commandConfigMap.put("bizContent", contentList); +// return commandConfigMap; + return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 128b09d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java deleted file mode 100644 index 4016b0b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface DatagramEventMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java deleted file mode 100644 index 597c306..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.apache.ibatis.annotations.Mapper; - -public interface FieldConfigMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java deleted file mode 100644 index a31680a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.PreRuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface PreRuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java deleted file mode 100644 index 9060a69..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface ProtocolConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java deleted file mode 100644 index 6fa6936..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java deleted file mode 100644 index 582a705..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleDict; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleDictMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java deleted file mode 100644 index 6e302c8..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.CommandEventMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Optional; - -@Component -public class CommandEventDao { - - @Resource - private CommandEventMapper commandEventMapper; - - public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId) - .eq("scene", sceneName) - .eq("enabled", 1); - List commandEventConfig = commandEventMapper.selectList(queryWrapper); - Optional optionalEventConfig = commandEventConfig.stream().findFirst(); - return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java deleted file mode 100644 index 9137e4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.FieldConfigMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class FieldConfigDao { - - @Resource - private FieldConfigMapper fieldConfigMapper; - - public FieldConfig getFieldConfigById(String fieldId) { - FieldConfig fieldConfig = fieldConfigMapper.selectById(fieldId); - return fieldConfig; - } - - public List getFieldConfigs(String protocolId,Integer isFixed) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",isFixed); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - - public List getStorageFieldConfig(String protocolId) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",1) - .eq("is_storage",1); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java deleted file mode 100644 index 67bff6b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.mapper.PreRuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class PreRuleConfigDao { - - @Resource - private PreRuleConfigMapper preRuleConfigMapper; - - public List getPreRuleList(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return preRuleConfigMapper.selectList(queryWrapper); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java deleted file mode 100644 index d69ea85..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.RuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleConfigDao { - - @Resource - private RuleConfigMapper ruleConfigMapper; - - public RuleConfig getNextRuleConfig(String ruleFields) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("parse_rule_json", ruleFields); - return ruleConfigMapper.selectOne(queryWrapper); - } - - - public List getRuleConfigById(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return ruleConfigMapper.selectList(queryWrapper); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java deleted file mode 100644 index 932c185..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.RuleDictMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleDictDao { - - @Resource - private RuleDictMapper ruleDictMapper; - - public List getRuleDictConfig() { - List ruleDictList = ruleDictMapper.selectList(null); - return ruleDictList; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java index 9f9e279..43bc4d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java @@ -10,20 +10,15 @@ import io.netty.channel.socket.nio.NioServerSocketChannel; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import javax.annotation.PreDestroy; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static cn.hutool.core.util.ClassUtil.getClasses; /** * SensorhubServer netty服务端 */ @Slf4j -@Service +@Component public class SensorhubServer { /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java index 2c79ff5..9a28c36 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java @@ -11,13 +11,13 @@ import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioSocketChannel; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClient 客户端 */ @Slf4j -@Service +@Registry public final class SensorhubClient { public static void main(String[] args) throws Exception { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java index 9774be0..477c3f7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java @@ -6,12 +6,12 @@ import io.netty.channel.socket.SocketChannel; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientChannelInitialHandler */ -@Service +@Registry public class SensorhubClientChannelInitialHandler extends ChannelInitializer { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java index 346f4b3..73560e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java @@ -5,13 +5,13 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientHandler */ @Slf4j -@Service +@Registry public class SensorhubClientHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java index 5c1c6f2..d990af5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java @@ -4,12 +4,12 @@ import com.casic.missiles.pojo.Msg; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** * SensorhubServerHandler */ -@Service +@Component public class SensorhubServerHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 67283ae..af3172c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,41 +1,37 @@ package com.casic.missiles.parser; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultProtocolConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.*; +import com.casic.missiles.registry.FieldConfigRegistry; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; -import java.nio.charset.Charset; import java.util.HashMap; import java.util.List; import java.util.Map; -@Service("genericProtocolParser") +/** + * @author + */ +@Component("genericProtocolParser") @Slf4j -@AllArgsConstructor +@RequiredArgsConstructor public class GenericProtocolParser implements ProtocolParser { - private final LeadingCodeMatcher leadingCodeMatcher; private final List frameStructDispenserList; - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorInstanceSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; // 匹配首字母前导码=> 帧结构匹配前导码=> // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 @@ -44,18 +40,19 @@ public Boolean doParseProtocol(ByteBuf byteBuf) { String protocolContent = ByteBufUtil.hexDump(byteBuf); //匹配前导码 - List preCodeConfigs = leadingCodeMatcher.matchLeadingCode(protocolContent); + List preCodeConfigs = LeadingCodeMatcher.matchFrameLeadingCode(protocolContent); //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 if (preCodeConfigs.size() == 0) { - return rematch(byteBuf,protocolContent); + return rematch(byteBuf, protocolContent); } - //暂时先取第一个 + //暂时先取第一个,提升速度,使用享元模式, 减少类的创建销毁与构建 ProtocolConfig protocolConfig = preCodeConfigs.get(0); + AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); ByteBuf wholeDatagramByte = null; //通过匹配帧结构获取完整的数据包 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, preCodeConfigs.get(0))) != null) { + if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, protocolFactory)) != null) { break; } } @@ -68,76 +65,78 @@ * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 */ - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId, wholeDatagramByte); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap, protocolId); - //选取规则对应的流程实例 - DatagramEventConfig datagramEventConfig = processorInstanceSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); + //进行规则字段解析,进行匹配规则 + RuleConfig ruleConfig = getRuleConfig(protocolFactory, wholeDatagramByte); + if (ruleConfig == null) { + return false; + } //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, wholeDatagramByte); + ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte); + //以下进行业务的规则解析,同时选定流程实例 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); + DatagramEventProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain, + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText, protocolId); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain); //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); + datagramEventProvider.storeData(bizDataMap); return true; } - private Boolean rematch(ByteBuf byteBuf,String protocolContent) { + /** + * 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 + */ + private Boolean rematch(ByteBuf byteBuf, String protocolContent) { //重置位判断 byteBuf.resetReaderIndex(); //判断重置是否前移,如果没有前移,则直接判为匹配失败 if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { return false; } else { + //递归执行 return doParseProtocol(byteBuf); } } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; + //获取匹配规则->匹配规则 + private RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + //取出其中参与逻辑provider并判空 + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); + String rulePrepareFields = protocolConfig.getRulePrepareFields(); + //固定字段 + if (StringUtils.isNotEmpty(rulePrepareFields)) { + //获取统一固定字段解析 + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + //获取该协议的字段配置,用于协议规则匹配 + List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); + //获取规则 + RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, + rulePrepareFields, protocolFieldConfigs); + return ruleConfig; + } + return null; } - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + //数据构建,获取固定字段的store和业务字段store + private Map buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + Map bizDataMap = new HashMap<>(); + Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); + Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); + bizDataMap.putAll(ruleStoreObjectMap); + bizDataMap.putAll(protocolStoreObjectMap); return bizDataMap; } - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java index 8a46e32..16ce2e5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java @@ -3,6 +3,7 @@ import io.netty.buffer.ByteBuf; public interface ProtocolParser { + Boolean doParseProtocol(ByteBuf byteBuf); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java new file mode 100644 index 0000000..f7814af --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java @@ -0,0 +1,35 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.ProtocolConfigProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.ProtocolConfig; + +/** + * 存放基本协议的的加载信息 + */ +public class AbstractProtocolConfigFactory { + private final ProtocolConfigProvider protocolConfigProvider; + private final ProtocolFieldConfigProvider protocolFieldConfigProvider; + private final RuleConfigProvider ruleConfigProvider; + + public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { + this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); + this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); + this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); + } + + public ProtocolConfigProvider getProtocolConfigProvider() { + return protocolConfigProvider; + } + + public ProtocolFieldConfigProvider getProtocolFieldConfigProvider() { + return protocolFieldConfigProvider; + } + + public RuleConfigProvider getRuleConfigProvider() { + return ruleConfigProvider; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java new file mode 100644 index 0000000..6e36147 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java @@ -0,0 +1,57 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.CombinedFieldConfigProvider; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.FieldConfigProvider; +import com.casic.missiles.parser.provider.FieldRuleConfigProvider; + +/** + * 存放规则相关的的的加载信息 + */ +public class AbstractRuleConfigFactory { + + /** + * 处理字节 + */ + private final FieldConfigProvider fieldConfigProvider; + /** + * 处理组合字节解析的解码器 + */ + private final CombinedFieldConfigProvider combinedFieldConfigProvider; + /** + * 处理负责字节解析的规则配置 + */ + private final FieldRuleConfigProvider fieldRuleConfigProvider; + /** + * 处理实例流程 + */ + private final DatagramEventProvider datagramEventProvider; + + + public AbstractRuleConfigFactory(Long ruleId) { + this.fieldConfigProvider = new FieldConfigProvider(ruleId); + this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); + this.fieldRuleConfigProvider = new FieldRuleConfigProvider(ruleId); + this.datagramEventProvider = new DatagramEventProvider(ruleId); + } + + public FieldConfigProvider getFieldConfigProvider() { + return fieldConfigProvider; + } + + public CombinedFieldConfigProvider getCombinedFieldConfigProvider() { + return combinedFieldConfigProvider; + } + + public FieldRuleConfigProvider getFieldRuleConfigProvider() { + return fieldRuleConfigProvider; + } + + public DatagramEventProvider getDatagramEventProvider() { + return datagramEventProvider; + } + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java deleted file mode 100644 index 6e1719a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.factory; - - -import com.casic.missiles.pojo.ProtocolConfig; - -import java.util.List; - -/** - * 数据库访问优化(暂时未做) - *

- * 1、初始化协议解析配置,并存放到处存放缓存,对协议基本配置进行管理 - * 2、其中流程中所有的配置都经过此类进行管理,进行调用获取,增强解析速度 - */ -public interface DatagramFactory { - - /** - * 初始化 - */ - List datagramInit(); - - /** - * 根据前导码配置匹配,模糊匹配获取所有的报文项 - */ - List match(); - - /** - * 根据前导码匹配,返回报文项 - */ - List filer(); - - /** - * 保证数据的唯一性选择器 - */ - List selectOne(); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java new file mode 100644 index 0000000..87444a0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java @@ -0,0 +1,18 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +import java.util.List; + +/** + * 直接用,还是边用边创建 + */ +public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { + + + public DefaultProtocolConfigFactory(ProtocolConfig protocolConfig) { + super(protocolConfig); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java new file mode 100644 index 0000000..cce0c7c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java @@ -0,0 +1,12 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; + +public class DefaultRuleFactory extends AbstractRuleConfigFactory { + + public DefaultRuleFactory(Long ruleId) { + super(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java deleted file mode 100644 index 9ee97e0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.casic.missiles.parser.instance; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service -@Slf4j -@AllArgsConstructor -public class GeneralProcessor { - - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; - - /** - * 统一固定字段解析=>进行规则的查询的判断 - * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 - * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 - */ - @Deprecated - public boolean parseWholeDatagram(ByteBuf buffer, ProtocolConfig protocolConfig) { - try { - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap,protocolId); - //选取规则对应的流程= - DatagramEventConfig datagramEventConfig = processorSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); - //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); - //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); - //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); - //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); - //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); - return true; - } catch (Exception ex) { - log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", - ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); - return false; - } - } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; - } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); - } - - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); - return bizDataMap; - } - - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java index 25e7ad8..6a5777e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java @@ -1,23 +1,31 @@ package com.casic.missiles.parser.instance.impl; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.mapper.DatagramEventMapper; import com.casic.missiles.pojo.DatagramEventConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.SpringContextUtil; -@Service -@AllArgsConstructor +import java.util.List; +import java.util.Optional; + +/** + * @author cz + * + */ public class DefaultProcessorInstanceSelector implements ProcessorInstanceSelector { - private final DatagramEventMapper datagramEventMapper; + private static List datagramEventConfigs; + + static { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + datagramEventConfigs = datagramEventRegistry.getDatagramEventList(); + } @Override public DatagramEventConfig getProcessorInstance(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("rule_id", protocolId); - return datagramEventMapper.selectOne(queryWrapper); + Optional optionalSelectInstance = datagramEventConfigs.stream() + .filter(e -> e.getId().equals(protocolId)).limit(1).findFirst(); + return optionalSelectInstance.isPresent() ? optionalSelectInstance.get() : null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a778671..7b56a43 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,16 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import io.netty.buffer.ByteBuf; /** - * 分析匹配情况 - * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 - * 2、匹配不成功,有后续帧,可以进行下次匹配。 - * 3、匹配不成功,无后续帧,可以进行丢弃。 + * 分析匹配情况 + * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 + * 2、匹配不成功,有后续帧,可以进行下次匹配。 + * 3、匹配不成功,无后续帧,可以进行丢弃。 */ -public interface FrameStructMatcher{ +public interface FrameStructMatcher { - ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig); + ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 05320ab..8ebea78 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,23 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.ProtocolConfigMapper; +import com.casic.missiles.parser.provider.ProtocolConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Component; import java.util.List; import java.util.stream.Collectors; -@Component -@AllArgsConstructor public class LeadingCodeMatcher { - private final ProtocolConfigMapper protocolMapper; - //** 1、首字母匹配前导码, // 2、以匹配出的前导码是否在报文中条件进行前导码的匹配二次筛选 - public List matchLeadingCode(String protocolContent){ + public static List matchFrameLeadingCode(String protocolContent){ List initialConfigs = initialMatch(protocolContent); List preCodeConfigs = initialConfigs.stream() .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) @@ -26,13 +19,16 @@ } //初始化匹配前导码内容 - private List initialMatch(String protocolContent) { - String protocolStr = protocolContent.charAt(0) + ""; - QueryWrapper queryWrapper = new QueryWrapper() - .likeRight("pre_fix", protocolStr); - List protocolConfigList = protocolMapper.selectList(queryWrapper); - return protocolConfigList; + private static List initialMatch(String protocolContent) { + String firstFrameChar = protocolContent.charAt(0) + ""; + ProtocolConfigProvider protocolConfigProvider=new ProtocolConfigProvider(firstFrameChar); + return protocolConfigProvider.getMatchList(); } + + + + + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index cf2113d..e915877 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -1,32 +1,35 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(0) -@Service +@Component public class FrameLengthMatcher implements FrameStructMatcher { - @Autowired - private FieldParser fieldParser; - //超过长度 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { String dataGramContent = ByteBufUtil.hexDump(byteBuf); - if (StringUtils.isEmpty(protocolConfig.getUnpackId()) && StringUtils.isEmpty(protocolConfig.getTailStr())) { - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + //当不存在结尾标志和拆包标志,可以直接使用长度进行匹配 + if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { if (dataGramContent.length() >= totalLength) {//等于长度返回true,超出长度,切断 - ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, protocolConfig, totalLength); + ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, totalLength); return wholeDatagramByte; } else { //读的标志位前移舍弃 @@ -38,7 +41,7 @@ return null; } - private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, Integer totalLength) { byteBuf.readBytes(totalLength); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, totalLength - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 2bfc213..d527ad0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; @@ -13,7 +13,7 @@ import lombok.AllArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.nio.charset.Charset; import java.util.Map; @@ -22,32 +22,30 @@ * 后续标志验证 */ @Order(1) -@Service +@Component @AllArgsConstructor -public class FrameMarkMatcher implements FrameStructMatcher { - - private final FieldConfigDao fieldConfigDao; - private final FieldParser fieldParser; - private final FieldResolver fieldResolverManger; +public class FrameMarkMatcher implements FrameStructMatcher, FixedPropertyEnum { //帧后续标志=>结束,进行帧的重组=>有后续,1、帧移位判别 2、继续接收帧 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig UnpackConfig = StringUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getUnpackId()); - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); - Integer upback = 0; + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); ByteBuf mergeWholeFrameByte = null; - if (!ObjectUtil.isEmpty(UnpackConfig)) { - while (hasNextFullFrame(byteBuf, protocolConfig)) { - upback = (Integer) fieldResolverManger.filedParserManger(byteBuf, UnpackConfig, null); + if (!ObjectUtil.isEmpty(unpackFlag)) { + while (hasNextFullFrame(byteBuf, protocolConfig, protocolFieldConfigProvider)) { //是否存在后续位 - if (upback == 1) {//使用esayRule + if (unpackFlag == 1) {//使用esayRule //表示可以截取 - mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolConfig, totalLength); + mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolFieldConfigProvider, protocolConfig); return mergeWholeFrameByte; } else { - byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig)); + byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig, protocolFieldConfigProvider)); } } } @@ -56,7 +54,8 @@ //选取第一个帧,将业务内容和后面部分分开 //计算数据报文-业务内容 - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolFieldConfigProvider protocolFieldConfigProvider, ProtocolConfig protocolConfig) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); //截取完整报文 byteBuf.readBytes(totalLength); ByteBuf byteBufContent = byteBuf.slice(0, byteBuf.readerIndex()); @@ -68,15 +67,15 @@ String tail = ""; System.out.println(ByteBufUtil.hexDump(byteBufContent)); //会存在多个帧拼接在一起的的情况,进行合并处理 - while (hasNextFullFrame(byteBufContent, protocolConfig)) { - Integer currentFrameLength = fieldParser.getTotalLength(protocolConfig, byteBufContent); + while (hasNextFullFrame(byteBufContent, protocolConfig, protocolFieldConfigProvider)) { + Integer currentFrameLength = protocolFieldConfigProvider.getTotalLength(byteBufContent, protocolConfig); byteBufContent.readBytes(currentFrameLength); ByteBuf currentbyteBuf = byteBufContent.slice(0, byteBufContent.readerIndex()); byteBufContent.markReaderIndex();//读的标志位前移 System.out.println(ByteBufUtil.hexDump(byteBufContent)); String hexDump = currentbyteBuf.toString(Charset.forName("ISO-8859-1")); //获取当前固定帧结构的关系map - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, currentbyteBuf); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(currentbyteBuf, protocolConfig); if (StringUtils.isEmpty(mergeFrameStr)) { //首次获取业务数据报文 mergeFrameStr += hexDump.substring(0, currentFrameFixedProperty.get("tailPosition")); @@ -95,22 +94,22 @@ /** * 获取平移到下一帧起始位置 */ - public int getNextFrameOffset(ByteBuf buffer, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, buffer); - return currentFrameFixedProperty.get("totalLength"); + public int getNextFrameOffset(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + return currentFrameFixedProperty.get(TOTAL_LENGTH); } /** * 判断是否出错进行整个帧的 */ - public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, byteBuf); + public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); //保证读取位置不在固定位置,是可变的业务内容 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("fixedPosition")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(FIXED_POSITION)) { return false; } //判断读取是否操作帧长度 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("totalLength")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(TOTAL_LENGTH)) { return false; } return true; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 76a3784..c3a1bab 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -1,50 +1,50 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.parser.instance.GeneralProcessor; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; +import io.netty.buffer.ByteBufUtil;; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(2) -@Service +@Component public class FrameTailMatcher implements FrameStructMatcher { - @Resource - private FieldConfigDao fieldConfigDao; - @Autowired - private GeneralProcessor generalProcessor; - //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig tailFieldConfig = StringUtils.isEmpty(protocolConfig.getTailStr()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getTailStr()); - if (!ObjectUtil.isEmpty(tailFieldConfig)) { - String tailStr = tailFieldConfig.getFieldName(); + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfig protocolFieldConfig = ObjectUtils.isEmpty(protocolConfig.getTailStr()) ? null : + fieldConfigProvider.getFieldConfigById(protocolConfig.getTailStr()); + if (!ObjectUtil.isEmpty(protocolFieldConfig)) { + String tailStr = protocolFieldConfig.getFieldName(); String dataGramContent = ByteBufUtil.hexDump(byteBuf); Boolean tailFlag = ByteBufUtil.hexDump(byteBuf).contains(tailStr); if (!tailFlag) { //使用esayRule return null; } else if (dataGramContent.indexOf(tailStr) < dataGramContent.length() - tailStr.length()) { Integer length = dataGramContent.indexOf(tailStr) + tailStr.length(); - ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, protocolConfig, length); + ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, length); return wholeDatagramByte; //存在粘包 } } return null; } - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer length) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, Integer length) { byteBuf.readBytes(length); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, length - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java new file mode 100644 index 0000000..5f1c177 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java @@ -0,0 +1,73 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.combined.GenericCombinedFieldResolver; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.CombinedFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class CombinedFieldConfigProvider { + + + /** + * 作为临时配置列表缓存使用 + */ + private final List combinedFieldConfigList; + private Map storeObjectMap = new HashMap<>(); + + public CombinedFieldConfigProvider(Long ruleId) { + CombinedFieldConfigRegistry combinedFieldConfigRegistry = SpringContextUtil.getBean(CombinedFieldConfigRegistry.class); + combinedFieldConfigList = combinedFieldConfigRegistry.getCombinedFieldConfigList(ruleId); + } + + public void parseDataField(RuleConfig ruleConfig, String clearZeroPlain,Map fieldConfigsMap ) { + if (showSkip()) { + return; + } + //匹配对应的数据,然后进行相关的字段解析 + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver(); + combinedFieldResolver.parseDataField(combinedFieldConfigList, byteBuf, storeObjectMap,fieldConfigsMap); + } + + + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getCombinedFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return combinedFieldConfigList.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public List getCombinedFieldConfigList() { + return combinedFieldConfigList; + } + + /* 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(combinedFieldConfigList) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java new file mode 100644 index 0000000..f3cfedc --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java @@ -0,0 +1,11 @@ +package com.casic.missiles.parser.provider; + +/** + * @author cz + * @date 2023-6-12 + */ +public class CommandEventProvider{ + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java new file mode 100644 index 0000000..70eec5e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java @@ -0,0 +1,77 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.safe.SafeStrategy; +import com.casic.missiles.parser.sender.DataSubscribeProvider; +import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class DatagramEventProvider { + + private final DatagramEventConfig processorInstance; + + public DatagramEventProvider(Long ruleId) { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + List datagramEventConfigList = + datagramEventRegistry.getDatagramEventList(ruleId); + processorInstance = this.getProcessorInstance(datagramEventConfigList); + } + + public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { + if (showSkip()) { + return null; + } + return datagramEventConfigList.get(0); + } + + // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 + public String getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap) { + String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? + processorInstance.getSafeBean() : + fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); + if (!StringUtils.isEmpty(safeName)) { + //需要加密 + SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); + String plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); + return clearComplementZero(plain); + } + return ByteBufUtil.hexDump(bizDataContent); + } + + //解密清零操作 + private String clearComplementZero(String plain) { + plain = plain.substring(0, plain.lastIndexOf("00")); + return plain; + } + + //数据发送,数据发送者暂未构建 + public void storeData(Map bizDataMap) { + DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); +// dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return ObjectUtils.isNotEmpty(processorInstance) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java new file mode 100644 index 0000000..7e1fe0a --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java @@ -0,0 +1,97 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.FieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class FieldConfigProvider { + + + private final List fieldConfigs; + private Map storeObjectMap = new HashMap<>(); +// private Map singleObjects = new ConcurrentHashMap<>(); + + public FieldConfigProvider(Long ruleId) { + FieldConfigRegistry fieldConfigRegistry = SpringContextUtil.getBean(FieldConfigRegistry.class); + fieldConfigs = fieldConfigRegistry.getFieldConfigList(ruleId); + } + + public List getFieldConfigs() { + return fieldConfigs; + } + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public Map parseDataField(RuleConfig ruleConfig, String clearZeroPlain) { + if (showSkip()) { + return null; + } + List prepareFieldConfig = prepareParseField(ruleConfig); + if (CollectionUtils.isNotEmpty(prepareFieldConfig)) { + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(fieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + return fixDataMap; + } + } + return null; + } + + /** + * 得到需要处理的业务内容 + * + * @return + */ + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return fieldConfigs.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public Map getFieldConfigsMap() { + return fieldConfigs.stream().collect( + Collectors.toMap(FieldConfig::getId, e -> e) + ); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(fieldConfigs) ? false : true; + } + + +} + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java new file mode 100644 index 0000000..817bfaf --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java @@ -0,0 +1,19 @@ +package com.casic.missiles.parser.provider; + +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.registry.FieldRuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; + +public class FieldRuleConfigProvider { + + private final List fieldRuleConfigList; + + public FieldRuleConfigProvider(Long ruleId) { + FieldRuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(FieldRuleConfigRegistry.class); + fieldRuleConfigList = ruleConfigRegistry.getFieldRuleConfigList(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java new file mode 100644 index 0000000..99a1b06 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java @@ -0,0 +1,53 @@ +package com.casic.missiles.parser.provider; + + +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.registry.ProtocolConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolConfigProvider { + + private final List protocolConfigList; + + public ProtocolConfigProvider(String firstChar) { + ProtocolConfigRegistry registry = SpringContextUtil.getBean(ProtocolConfigRegistry.class); + protocolConfigList = registry.getProtocolConfigList(firstChar); + } + + public List getMatchList() { + return protocolConfigList; + } + + /** + * 设置当前协议 + * + * @param protocolConfig + */ + public ProtocolConfigProvider(ProtocolConfig protocolConfig) { + List protocolConfigs = new ArrayList<>(); + protocolConfigs.add(protocolConfig); + protocolConfigList = protocolConfigs; + } + + /** + * 获取当前协议 + * + * @return + */ + public ProtocolConfig getCurrentProtocolConfig() { + if (this.protocolConfigList == null) { + return null; + } else { + return protocolConfigList.get(0); + } + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java new file mode 100644 index 0000000..043927d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java @@ -0,0 +1,213 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.registry.ProtocolFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolFieldConfigProvider { + + private static final String FIXED_FIELD_DS = "fixedFieldDs"; + private static final String CONTENT_FIELD_DS = "contentFieldDs"; + private static final String PROTOCOL_LENGTH = "protocolLength"; + private static final String PROTOCOL_FIELD_ID = "protocolFieldId"; + private static final String PROTOCOL_POSITION = "protocolPosition"; + + private final List protocolFieldConfigs; + private Map singleObjects = new ConcurrentHashMap<>(); + private Map storeObjectMap = new HashMap<>(); + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public ProtocolFieldConfigProvider(Long protocolId) { + ProtocolFieldConfigRegistry protocolFieldConfigRegistry = SpringContextUtil.getBean(ProtocolFieldConfigRegistry.class); + protocolFieldConfigs = protocolFieldConfigRegistry.getProtocolFieldConfigList(protocolId); + } + + public List getProtocolFieldConfigs() { + return protocolFieldConfigs; + } + + public ProtocolFieldConfig getFieldConfigById(Long fieldId) { + Optional optionalConfig = protocolFieldConfigs.stream().filter( + e -> e.getId().equals(fieldId) + ).findFirst(); + return optionalConfig.isPresent() ? optionalConfig.get() : null; + } + + public Integer getProtocolFieldValue(Long protocolFieldId, ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_FIELD_ID + protocolFieldId + ByteBufUtil.hexDump(byteBuf); + //获取缓存 + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + //加载固定长度数据集合 + Map fixDataMap = this.getProtocolDataMap(byteBuf); + ProtocolFieldConfig protocolFieldConfig = selectFieldConfig(protocolFieldId); + Integer protocolFieldValue = 0; + //获取约定字段的总长度 + if (fixDataMap.containsKey(protocolFieldConfig.getFieldName())) { + Object appointUnpackObject = fixDataMap.get(protocolFieldConfig.getFieldName()); + if (ObjectUtils.isNotEmpty(appointUnpackObject)) { + protocolFieldValue = (Integer) appointUnpackObject; + } + } + if (protocolFieldValue != null) { + //加入缓存 + if (ObjectUtils.isNotEmpty(protocolFieldValue)) { + this.singleObjects.put(catchKey, protocolFieldValue); + return protocolFieldValue; + } + } + return null; + } + + /** + * 获取帧固定位置信息 + * + * @param byteBuf + * @param protocolConfig + * @return + */ + public Map getFixedProperty(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_POSITION + protocolConfig.getId(); + if (this.singleObjects.containsKey(catchKey)) { + return (Map) singleObjects.get(catchKey); + } + Map fixedPropertyMap = new HashMap<>(); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + fixedPropertyMap = fieldParser.doGetFixedProperty(protocolFieldConfigs, this.getTotalLength(byteBuf,protocolConfig)); + if (CollectionUtils.isNotEmpty(fixedPropertyMap)) { + this.singleObjects.put(catchKey, fixedPropertyMap); + return fixedPropertyMap; + } + return fixedPropertyMap; + } + + /** + * 获取帧结构应有的总长度 + */ + public Integer getTotalLength(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_LENGTH + ByteBufUtil.hexDump(byteBuf); + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + Integer appointFrameLength = getProtocolFieldValue(protocolConfig.getTotalLengthId(), byteBuf); + if (appointFrameLength != null) { + //获取过滤的字段集合总长度 + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Integer totalFilterLength = fieldParser.getTotalFilterLength(protocolConfig, byteBuf, getFixFieldConfigMap()); + //计算总长度 + Integer totalLength = appointFrameLength + totalFilterLength; + //加入缓存 + if (ObjectUtils.isNotEmpty(totalLength)) { + this.singleObjects.put(catchKey, totalLength); + return totalLength; + } + } + return null; + } + + /** + * 获取协议有关字段解析内容 + * storeObjectMap存储代转存的数据 + * + * @return + */ + public Map getProtocolDataMap(ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(FIXED_FIELD_DS)) { + return (Map) singleObjects.get(FIXED_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(protocolFieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + this.singleObjects.put(FIXED_FIELD_DS, fixDataMap); + return fixDataMap; + } + return null; + } + + /** + * 获取业务报文内容的content字节 + * + * @param wholeDatagramByte + * @return + */ + public ByteBuf getDataContentBuf(ByteBuf wholeDatagramByte) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(CONTENT_FIELD_DS)) { + return (ByteBuf) singleObjects.get(CONTENT_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + ByteBuf bizDataByteBuf = fieldParser.getDataContentBuf(protocolFieldConfigs, wholeDatagramByte); + if (bizDataByteBuf != null) { + this.singleObjects.put(CONTENT_FIELD_DS, bizDataByteBuf); + return bizDataByteBuf; + } + return null; + } + + + private ProtocolFieldConfig selectFieldConfig(Long id) { + Optional optionalProtocolFieldConfig = this.protocolFieldConfigs.stream().filter( + e -> e.getId().equals(id) + ).findFirst(); + return optionalProtocolFieldConfig.isPresent() ? optionalProtocolFieldConfig.get() : null; + } + + + private Map getFixFieldConfigMap() { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, e -> e) + ); + return fixDataFieldMap; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(protocolFieldConfigs) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java new file mode 100644 index 0000000..dafba1c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java @@ -0,0 +1,56 @@ +package com.casic.missiles.parser.provider; + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.rule.GenericRuleResolver; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.RuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleConfigProvider { + + private final List ruleConfigs; + + public List getRuleConfigs() { + return ruleConfigs; + } + + public RuleConfigProvider(Long protocolId) { + RuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(RuleConfigRegistry.class); + ruleConfigs = ruleConfigRegistry.getRuleConfigById(protocolId); + } + + /** + * 获取规则匹配结果 + * + * @param parseFixedDataMap + * @param protocolFieldConfigs + * @return + */ + public RuleConfig doGetRule(Map parseFixedDataMap, + String ids, + List protocolFieldConfigs) { + if (showSkip()) { + return null; + } + RuleConfig ruleConfig = GenericRuleResolver.machRule(parseFixedDataMap, ids, protocolFieldConfigs, ruleConfigs); + return ruleConfig; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(ruleConfigs) ? false : true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java index 3c05891..856b399 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java @@ -1,18 +1,11 @@ package com.casic.missiles.parser.resolver; -import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.springframework.web.bind.annotation.RequestBody; -import javax.annotation.Resource; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -20,19 +13,17 @@ @Slf4j public class ByteMergeProvider { - @Resource - private FieldRuleEngineMapper fieldRuleEngineMapper; - //拿到所有的值合并到一个值 - public String resolveByteMerge(List valueList, String ruletypeId, String vaildRange) { + public static String resolveByteMerge(List valueList, String ruleTypeId, String vaildRange) { String values = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Map vaildMap = getValidRangeMap(vaildRange); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(ruletypeId); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } + //暂时不处理 +// fieldRuleEngine = fieldRuleConfigMapper.selectById(ruleTypeId); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } Map env2 = new HashMap(); for (int i = 0; i < valueList.size(); i++) { if (vaildMap.containsKey(i)) { @@ -47,7 +38,7 @@ } } - private Map getValidRangeMap(String vaildRange) { + private static Map getValidRangeMap(String vaildRange) { String[] range = vaildRange.split(","); Map vaildMap = new HashMap(); for (int i = 0; i < range.length; i++) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 8d821cd..85d6bbf 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -1,9 +1,12 @@ package com.casic.missiles.parser.resolver; +import com.casic.missiles.pojo.AbstractFieldConfig; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; import io.netty.buffer.ByteBuf; +import java.util.List; import java.util.Map; /** @@ -11,18 +14,14 @@ */ public interface FieldParser { -// Map fieldProcess(String protocolContent,); - Map dataParser(RuleConfig ruleConfig, String lightText,String protocolId); + Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength); - Map fixDataParser(String protocolId, ByteBuf buffer); + Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap); - Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf); + ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer); - ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer); - - ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer); - - Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer); + Integer getTotalFilterLength(ProtocolConfig protocolConfig, ByteBuf byteBuf, Map protocolFieldConfigMap); } + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java new file mode 100644 index 0000000..9e0c00e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java @@ -0,0 +1,52 @@ +package com.casic.missiles.parser.resolver; + +import com.casic.missiles.pojo.AbstractFieldConfig; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.util.List; + +public class FieldParserSupport { + + //分别计算bit和byte长度=> 合并长度 + protected Integer calculateLength(List fieldConfigList) { + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + Integer fixedLength = bytefixedLength + bitfixedLength / 8; + return fixedLength; + } + + //找到最大值=> 根据最大值计算业务数据下标 + protected Integer calculatePosition(List fieldConfigList) { + String rex = "[0-9]+"; + Integer max = -1; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) + && Integer.valueOf(fieldConfig.getOriginPositionByte()) > max) { + max = Integer.valueOf(fieldConfig.getOriginPositionByte()); + } + } + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) && fieldConfig.getOriginPositionByte().equals(max)) { + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + } + } + Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; + return maxFixedPosition; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java deleted file mode 100644 index dd3a6cd..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java +++ /dev/null @@ -1,170 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.ByteResolverParam; -import io.netty.buffer.ByteBuf; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -/** - * 字段解析管理总类 - */ -@Service -@Slf4j -@AllArgsConstructor -public class FieldResolver extends ByteMergeProvider { - - //1、字段截取 => 2、简单的字节解析和复杂的字节解析 - public Object filedParserManger(ByteBuf byteBuf, FieldConfig fieldConfig, Integer maxFixedPosition) { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - //最大固定位置不为空, - if (!ObjectUtil.isEmpty(maxFixedPosition)) { - orignPosition -= maxFixedPosition; - } - Object fieldValue = 0; - //待优化 - if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { - fieldValue = bitToResolver(byteBuf, fieldConfig); - } else { - ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); - fieldValue = parsingFields(fieldBytes, fieldConfig.getRuleJson()); - } - return fieldValue; - } - - //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, - //目前默认配置的规则设置暂不支持配置化,由实现完成 - private Object parsingFields(ByteBuf byteBuf, String ruleJson) { - Object fieldsResolveValue = null; - List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); - if (ObjectUtil.isEmpty(ruleMapList)) { - fieldsResolveValue = defaultResolveBuilder(byteBuf); - } else { - fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); - } - return fieldsResolveValue; - } - - private Object defaultResolveBuilder(ByteBuf byteBuf) { - Integer defaultResolveValue = 0; - for (int i = 0; i < byteBuf.writerIndex(); i++) { - defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; - } - return defaultResolveValue; - } - - //字段解析构建器(针对字节单位的) - //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 - // 字节归并结束或者规则结束=>继续根据规则进行判断 - private Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { - Object customizeResolveValue = null; - try { - List bytStrList = new ArrayList<>(); - //存放到数组里面 - for (int i = 0; i < byteBuf.writerIndex(); i++) { - bytStrList.add(byteBuf.readByte()); - } - int i = 0; - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - customizeResolveValue = this.resolveByteMerge(bytStrList, ruletypeId,vaildRange); - break; - } else { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - List tempBytStr = new ArrayList<>(); - for (int k = 0; i < bytStrList.size(); i++) { - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(k) - .value(bytStrList.get(k)) - .ruletypeId(ruletypeId).build(); - tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); - } - bytStrList = tempBytStr; - } - i++; - } - //字节归并到一起=>继续根据规则进行判断 - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(customizeResolveValue) - .ruletypeId(ruletypeId).build(); - customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(customizeResolveValue)); - return customizeResolveValue; - } catch (RuntimeException ex) { - log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); - return null; - } - } - - /** - * 1、单个字节情况表示字段 - * 2、多字节情况表示字段(暂未处理) - */ - private Object bitToResolver(ByteBuf byteBuf, FieldConfig fieldConfig) { - Object fieldValue = new Object(); - try { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - byte fields = 0x00; - if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); - } else { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); - } - - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { - if (!StringUtils.isEmpty(fieldConfig.getExactOrignPosition())) { - fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getExactOrignPosition())).byteValue() - >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); - } else { - fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); - } - } else { - fieldValue = Integer.valueOf(fields & 0xff); - } - if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { - return fieldValue; - } - List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); - int i = 0; - //字节归并到一起=>继续根据规则进行判断 - while (i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(fieldValue) - .ruletypeId(ruletypeId).build(); - fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(fieldValue)); - return fieldValue; - } catch (RuntimeException ex) { - log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); - return null; - } - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java new file mode 100644 index 0000000..1d2aeab --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java @@ -0,0 +1,36 @@ +package com.casic.missiles.parser.resolver.bytes; + +import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.mapper.FieldRuleConfigMapper; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.pojo.ByteResolverParam; +import com.googlecode.aviator.AviatorEvaluator; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; +//转换规则 +@Component("convert") +@AllArgsConstructor +@Slf4j +public class ByteRuleResolver implements ByteResolver { + + private final FieldRuleConfigMapper fieldRuleConfigMapper; + + @Override + public Object resolveOperationRule(ByteResolverParam byteResolverParam){ + FieldRuleConfig fieldRuleEngine=fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); + if(ObjectUtil.isEmpty(fieldRuleEngine)){ + return byteResolverParam.getValue(); + } + String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); + Map env2 = new HashMap(); + env2.put("value", (byte) byteResolverParam.getValue()); + String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); + return values; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java index 103821c..786b71c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java @@ -2,34 +2,34 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("logicalShift") +@Component("logicalShift") @AllArgsConstructor @Slf4j public class LogicalShiftResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //字节位移 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { Integer index = byteResolverParam.getIndex(); - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return byteResolverParam.getValue(); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java index 476747d..01149bd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("operation") +@Component("operation") @AllArgsConstructor @Slf4j public class OperationResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //混合运算,有常量或者乘除的缩放 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java index 0b82cf4..79abcce 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.casic.missiles.pojo.ByteResolverParam; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; //精度计算 -@Service("precision") +@Component("precision") @AllArgsConstructor @Slf4j public class PrecisionResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java deleted file mode 100644 index 5c3f332..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; -//转换规则 -@Service("convert") -@AllArgsConstructor -@Slf4j -public class RuleResolver implements ByteResolver { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam){ - RuleEvaluator fieldRuleEngine=fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); - if(ObjectUtil.isEmpty(fieldRuleEngine)){ - return byteResolverParam.getValue(); - } - String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); - Map env2 = new HashMap(); - env2.put("value", (byte) byteResolverParam.getValue()); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java index 608af3a..32cc8a4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java @@ -2,48 +2,47 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.delivery.decorator.ByteDecorator; +import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @AllArgsConstructor public class FieldDecoratorManger { - private final RuleDictDao ruleDictDao; + private final RuleConfigRegistry ruleDictDao; // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 // (1)静态的业务字段是字典里面可以配置的 // (2)动态的业务字段是通过规则生成的 public String contentMerge(String ruleJson, String sceneConent, String dynamicContent) { - List ruleDictList = ruleDictDao.getRuleDictConfig(); - Map ruleDictMap = ruleDictList.stream().collect( - Collectors.toMap(RuleDict::getId, e -> e)); - List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); - for (Map ruleMap : ruleMapList) { - String ruleType = String.valueOf(ruleMap.get("ruleType")); - ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); - NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); - byteDecorator.nodeDecoratorRule(nodeDecoratorParm); - } +// List ruleDictList = ruleDictDao.getRuleDictConfig(); +// Map ruleDictMap = ruleDictList.stream().collect( +// Collectors.toMap(RuleDict::getId, e -> e)); +// List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); +// for (Map ruleMap : ruleMapList) { +// String ruleType = String.valueOf(ruleMap.get("ruleType")); +// ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); +// NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); +// byteDecorator.nodeDecoratorRule(nodeDecoratorParm); +// } return null; } - - private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { - NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() - .contents(sceneConent) - .dynamicContent(dynamicContent) - .ruletypeId(ruletypeId) - .ruleDictMap(ruleDictMap) - .build(); - return nodeDecoratorParm; - } +// +// private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { +// NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() +// .contents(sceneConent) +// .dynamicContent(dynamicContent) +// .ruletypeId(ruletypeId) +// .ruleDictMap(ruleDictMap) +// .build(); +// return nodeDecoratorParm; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java index 652970c..b204ac3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java @@ -1,56 +1,56 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@AllArgsConstructor -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", - JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Component; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Component("logicalDecorator") +//@AllArgsConstructor +//@Slf4j +//public class LogicalShiftDecorator implements ByteDecorator { +// +//// private final FieldRuleEngineMapper fieldRuleEngineMapper; +//// +//// //字节位移 +//// @Override +//// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +//// String logicalValue = ""; +//// RuleEvaluator fieldRuleEngine = new RuleEvaluator(); +//// try { +//// Map env2 = new HashMap(); +//// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +//// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +//// for (String contentId : contentIdList) { +//// RuleDict ruleDict = ruleDictMap.get(contentId); +//// if (ruleDict.getCode().contains("#")) { +//// //使用动态的值 +//// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +//// } +//// env2.put(ruleDict.getName(), ruleDict.getCode()); +//// } +//// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +//// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +//// return null; +//// } +//// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +//// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +//// return values; +//// } catch (Exception ex) { +//// log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", +//// JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +//// return null; +//// } +//// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java index 346468f..822fead 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@AllArgsConstructor -@Slf4j -public class OperationDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("optionDecorator") +//@AllArgsConstructor +//@Slf4j +//public class OperationDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //混合运算,有常量或者乘除的缩放 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java index 50fb0a7..7a8bccb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@AllArgsConstructor -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +////精度计算 +//@AllArgsConstructor +//@Registry("precisionDecorator") +//@Slf4j +//public class PrecisionDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java index da39235..27f9cc7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java @@ -1,54 +1,53 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@AllArgsConstructor -@Slf4j -public class RuleDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("ruleDecorator") +//@AllArgsConstructor +//@Slf4j +//public class RuleDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //吃我一套正则表达式 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (Exception ex) { +// log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java index 7f5cbf3..c043f97 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java @@ -2,6 +2,6 @@ import java.util.Map; -public interface ComandeEventService { +public interface ComandeEventService{ Map loadComandeEventConfig(String protocolId,String scene); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java index 476ad84..aaf1837 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java @@ -2,46 +2,46 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.dao.CommandEventDao; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @Slf4j @AllArgsConstructor -public class ComandeEventServiceImpl implements ComandeEventService { +public class ComandeEventServiceImpl implements ComandeEventRegistry { - private final CommandEventDao commandEventDao; + // private final CommandEventDao commandEventDao; // 加密bean 固定字段出现变化的字段解析,业务字段的有序内容 @Override - public Map loadComandeEventConfig(String protocolId,String sceneName) { - CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); - if (ObjectUtil.isEmpty(commandEventConfig)) { - log.error("协议{},没有配置成功接收回复配置,清排查原因"); - return null; - } - String replyJson = commandEventConfig.getReplyContentJson(); - List> replyMapList = JSONArray.parseObject(replyJson, List.class); - List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); - Map fixMap = fixList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); - List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) - .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) - .collect(Collectors.toList()); - Map commandConfigMap = new HashMap<>(); - commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); - commandConfigMap.put("fixContent", fixMap); - commandConfigMap.put("bizContent", contentList); - return commandConfigMap; + public Map loadComandeEventConfig(String protocolId, String sceneName) { +// CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); +// if (ObjectUtil.isEmpty(commandEventConfig)) { +// log.error("协议{},没有配置成功接收回复配置,清排查原因"); +// return null; +// } +// String replyJson = commandEventConfig.getReplyContentJson(); +// List> replyMapList = JSONArray.parseObject(replyJson, List.class); +// List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); +// Map fixMap = fixList.stream() +// .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); +// List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) +// .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) +// .collect(Collectors.toList()); +// Map commandConfigMap = new HashMap<>(); +// commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); +// commandConfigMap.put("fixContent", fixMap); +// commandConfigMap.put("bizContent", contentList); +// return commandConfigMap; + return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 128b09d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java deleted file mode 100644 index 4016b0b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface DatagramEventMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java deleted file mode 100644 index 597c306..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.apache.ibatis.annotations.Mapper; - -public interface FieldConfigMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java deleted file mode 100644 index a31680a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.PreRuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface PreRuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java deleted file mode 100644 index 9060a69..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface ProtocolConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java deleted file mode 100644 index 6fa6936..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java deleted file mode 100644 index 582a705..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleDict; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleDictMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java deleted file mode 100644 index 6e302c8..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.CommandEventMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Optional; - -@Component -public class CommandEventDao { - - @Resource - private CommandEventMapper commandEventMapper; - - public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId) - .eq("scene", sceneName) - .eq("enabled", 1); - List commandEventConfig = commandEventMapper.selectList(queryWrapper); - Optional optionalEventConfig = commandEventConfig.stream().findFirst(); - return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java deleted file mode 100644 index 9137e4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.FieldConfigMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class FieldConfigDao { - - @Resource - private FieldConfigMapper fieldConfigMapper; - - public FieldConfig getFieldConfigById(String fieldId) { - FieldConfig fieldConfig = fieldConfigMapper.selectById(fieldId); - return fieldConfig; - } - - public List getFieldConfigs(String protocolId,Integer isFixed) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",isFixed); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - - public List getStorageFieldConfig(String protocolId) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",1) - .eq("is_storage",1); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java deleted file mode 100644 index 67bff6b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.mapper.PreRuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class PreRuleConfigDao { - - @Resource - private PreRuleConfigMapper preRuleConfigMapper; - - public List getPreRuleList(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return preRuleConfigMapper.selectList(queryWrapper); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java deleted file mode 100644 index d69ea85..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.RuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleConfigDao { - - @Resource - private RuleConfigMapper ruleConfigMapper; - - public RuleConfig getNextRuleConfig(String ruleFields) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("parse_rule_json", ruleFields); - return ruleConfigMapper.selectOne(queryWrapper); - } - - - public List getRuleConfigById(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return ruleConfigMapper.selectList(queryWrapper); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java deleted file mode 100644 index 932c185..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.RuleDictMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleDictDao { - - @Resource - private RuleDictMapper ruleDictMapper; - - public List getRuleDictConfig() { - List ruleDictList = ruleDictMapper.selectList(null); - return ruleDictList; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java index 9f9e279..43bc4d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java @@ -10,20 +10,15 @@ import io.netty.channel.socket.nio.NioServerSocketChannel; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import javax.annotation.PreDestroy; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static cn.hutool.core.util.ClassUtil.getClasses; /** * SensorhubServer netty服务端 */ @Slf4j -@Service +@Component public class SensorhubServer { /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java index 2c79ff5..9a28c36 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java @@ -11,13 +11,13 @@ import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioSocketChannel; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClient 客户端 */ @Slf4j -@Service +@Registry public final class SensorhubClient { public static void main(String[] args) throws Exception { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java index 9774be0..477c3f7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java @@ -6,12 +6,12 @@ import io.netty.channel.socket.SocketChannel; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientChannelInitialHandler */ -@Service +@Registry public class SensorhubClientChannelInitialHandler extends ChannelInitializer { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java index 346f4b3..73560e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java @@ -5,13 +5,13 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientHandler */ @Slf4j -@Service +@Registry public class SensorhubClientHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java index 5c1c6f2..d990af5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java @@ -4,12 +4,12 @@ import com.casic.missiles.pojo.Msg; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** * SensorhubServerHandler */ -@Service +@Component public class SensorhubServerHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 67283ae..af3172c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,41 +1,37 @@ package com.casic.missiles.parser; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultProtocolConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.*; +import com.casic.missiles.registry.FieldConfigRegistry; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; -import java.nio.charset.Charset; import java.util.HashMap; import java.util.List; import java.util.Map; -@Service("genericProtocolParser") +/** + * @author + */ +@Component("genericProtocolParser") @Slf4j -@AllArgsConstructor +@RequiredArgsConstructor public class GenericProtocolParser implements ProtocolParser { - private final LeadingCodeMatcher leadingCodeMatcher; private final List frameStructDispenserList; - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorInstanceSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; // 匹配首字母前导码=> 帧结构匹配前导码=> // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 @@ -44,18 +40,19 @@ public Boolean doParseProtocol(ByteBuf byteBuf) { String protocolContent = ByteBufUtil.hexDump(byteBuf); //匹配前导码 - List preCodeConfigs = leadingCodeMatcher.matchLeadingCode(protocolContent); + List preCodeConfigs = LeadingCodeMatcher.matchFrameLeadingCode(protocolContent); //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 if (preCodeConfigs.size() == 0) { - return rematch(byteBuf,protocolContent); + return rematch(byteBuf, protocolContent); } - //暂时先取第一个 + //暂时先取第一个,提升速度,使用享元模式, 减少类的创建销毁与构建 ProtocolConfig protocolConfig = preCodeConfigs.get(0); + AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); ByteBuf wholeDatagramByte = null; //通过匹配帧结构获取完整的数据包 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, preCodeConfigs.get(0))) != null) { + if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, protocolFactory)) != null) { break; } } @@ -68,76 +65,78 @@ * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 */ - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId, wholeDatagramByte); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap, protocolId); - //选取规则对应的流程实例 - DatagramEventConfig datagramEventConfig = processorInstanceSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); + //进行规则字段解析,进行匹配规则 + RuleConfig ruleConfig = getRuleConfig(protocolFactory, wholeDatagramByte); + if (ruleConfig == null) { + return false; + } //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, wholeDatagramByte); + ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte); + //以下进行业务的规则解析,同时选定流程实例 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); + DatagramEventProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain, + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText, protocolId); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain); //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); + datagramEventProvider.storeData(bizDataMap); return true; } - private Boolean rematch(ByteBuf byteBuf,String protocolContent) { + /** + * 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 + */ + private Boolean rematch(ByteBuf byteBuf, String protocolContent) { //重置位判断 byteBuf.resetReaderIndex(); //判断重置是否前移,如果没有前移,则直接判为匹配失败 if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { return false; } else { + //递归执行 return doParseProtocol(byteBuf); } } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; + //获取匹配规则->匹配规则 + private RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + //取出其中参与逻辑provider并判空 + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); + String rulePrepareFields = protocolConfig.getRulePrepareFields(); + //固定字段 + if (StringUtils.isNotEmpty(rulePrepareFields)) { + //获取统一固定字段解析 + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + //获取该协议的字段配置,用于协议规则匹配 + List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); + //获取规则 + RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, + rulePrepareFields, protocolFieldConfigs); + return ruleConfig; + } + return null; } - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + //数据构建,获取固定字段的store和业务字段store + private Map buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + Map bizDataMap = new HashMap<>(); + Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); + Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); + bizDataMap.putAll(ruleStoreObjectMap); + bizDataMap.putAll(protocolStoreObjectMap); return bizDataMap; } - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java index 8a46e32..16ce2e5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java @@ -3,6 +3,7 @@ import io.netty.buffer.ByteBuf; public interface ProtocolParser { + Boolean doParseProtocol(ByteBuf byteBuf); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java new file mode 100644 index 0000000..f7814af --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java @@ -0,0 +1,35 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.ProtocolConfigProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.ProtocolConfig; + +/** + * 存放基本协议的的加载信息 + */ +public class AbstractProtocolConfigFactory { + private final ProtocolConfigProvider protocolConfigProvider; + private final ProtocolFieldConfigProvider protocolFieldConfigProvider; + private final RuleConfigProvider ruleConfigProvider; + + public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { + this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); + this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); + this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); + } + + public ProtocolConfigProvider getProtocolConfigProvider() { + return protocolConfigProvider; + } + + public ProtocolFieldConfigProvider getProtocolFieldConfigProvider() { + return protocolFieldConfigProvider; + } + + public RuleConfigProvider getRuleConfigProvider() { + return ruleConfigProvider; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java new file mode 100644 index 0000000..6e36147 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java @@ -0,0 +1,57 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.CombinedFieldConfigProvider; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.FieldConfigProvider; +import com.casic.missiles.parser.provider.FieldRuleConfigProvider; + +/** + * 存放规则相关的的的加载信息 + */ +public class AbstractRuleConfigFactory { + + /** + * 处理字节 + */ + private final FieldConfigProvider fieldConfigProvider; + /** + * 处理组合字节解析的解码器 + */ + private final CombinedFieldConfigProvider combinedFieldConfigProvider; + /** + * 处理负责字节解析的规则配置 + */ + private final FieldRuleConfigProvider fieldRuleConfigProvider; + /** + * 处理实例流程 + */ + private final DatagramEventProvider datagramEventProvider; + + + public AbstractRuleConfigFactory(Long ruleId) { + this.fieldConfigProvider = new FieldConfigProvider(ruleId); + this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); + this.fieldRuleConfigProvider = new FieldRuleConfigProvider(ruleId); + this.datagramEventProvider = new DatagramEventProvider(ruleId); + } + + public FieldConfigProvider getFieldConfigProvider() { + return fieldConfigProvider; + } + + public CombinedFieldConfigProvider getCombinedFieldConfigProvider() { + return combinedFieldConfigProvider; + } + + public FieldRuleConfigProvider getFieldRuleConfigProvider() { + return fieldRuleConfigProvider; + } + + public DatagramEventProvider getDatagramEventProvider() { + return datagramEventProvider; + } + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java deleted file mode 100644 index 6e1719a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.factory; - - -import com.casic.missiles.pojo.ProtocolConfig; - -import java.util.List; - -/** - * 数据库访问优化(暂时未做) - *

- * 1、初始化协议解析配置,并存放到处存放缓存,对协议基本配置进行管理 - * 2、其中流程中所有的配置都经过此类进行管理,进行调用获取,增强解析速度 - */ -public interface DatagramFactory { - - /** - * 初始化 - */ - List datagramInit(); - - /** - * 根据前导码配置匹配,模糊匹配获取所有的报文项 - */ - List match(); - - /** - * 根据前导码匹配,返回报文项 - */ - List filer(); - - /** - * 保证数据的唯一性选择器 - */ - List selectOne(); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java new file mode 100644 index 0000000..87444a0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java @@ -0,0 +1,18 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +import java.util.List; + +/** + * 直接用,还是边用边创建 + */ +public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { + + + public DefaultProtocolConfigFactory(ProtocolConfig protocolConfig) { + super(protocolConfig); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java new file mode 100644 index 0000000..cce0c7c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java @@ -0,0 +1,12 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; + +public class DefaultRuleFactory extends AbstractRuleConfigFactory { + + public DefaultRuleFactory(Long ruleId) { + super(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java deleted file mode 100644 index 9ee97e0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.casic.missiles.parser.instance; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service -@Slf4j -@AllArgsConstructor -public class GeneralProcessor { - - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; - - /** - * 统一固定字段解析=>进行规则的查询的判断 - * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 - * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 - */ - @Deprecated - public boolean parseWholeDatagram(ByteBuf buffer, ProtocolConfig protocolConfig) { - try { - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap,protocolId); - //选取规则对应的流程= - DatagramEventConfig datagramEventConfig = processorSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); - //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); - //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); - //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); - //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); - //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); - return true; - } catch (Exception ex) { - log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", - ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); - return false; - } - } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; - } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); - } - - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); - return bizDataMap; - } - - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java index 25e7ad8..6a5777e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java @@ -1,23 +1,31 @@ package com.casic.missiles.parser.instance.impl; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.mapper.DatagramEventMapper; import com.casic.missiles.pojo.DatagramEventConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.SpringContextUtil; -@Service -@AllArgsConstructor +import java.util.List; +import java.util.Optional; + +/** + * @author cz + * + */ public class DefaultProcessorInstanceSelector implements ProcessorInstanceSelector { - private final DatagramEventMapper datagramEventMapper; + private static List datagramEventConfigs; + + static { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + datagramEventConfigs = datagramEventRegistry.getDatagramEventList(); + } @Override public DatagramEventConfig getProcessorInstance(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("rule_id", protocolId); - return datagramEventMapper.selectOne(queryWrapper); + Optional optionalSelectInstance = datagramEventConfigs.stream() + .filter(e -> e.getId().equals(protocolId)).limit(1).findFirst(); + return optionalSelectInstance.isPresent() ? optionalSelectInstance.get() : null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a778671..7b56a43 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,16 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import io.netty.buffer.ByteBuf; /** - * 分析匹配情况 - * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 - * 2、匹配不成功,有后续帧,可以进行下次匹配。 - * 3、匹配不成功,无后续帧,可以进行丢弃。 + * 分析匹配情况 + * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 + * 2、匹配不成功,有后续帧,可以进行下次匹配。 + * 3、匹配不成功,无后续帧,可以进行丢弃。 */ -public interface FrameStructMatcher{ +public interface FrameStructMatcher { - ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig); + ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 05320ab..8ebea78 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,23 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.ProtocolConfigMapper; +import com.casic.missiles.parser.provider.ProtocolConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Component; import java.util.List; import java.util.stream.Collectors; -@Component -@AllArgsConstructor public class LeadingCodeMatcher { - private final ProtocolConfigMapper protocolMapper; - //** 1、首字母匹配前导码, // 2、以匹配出的前导码是否在报文中条件进行前导码的匹配二次筛选 - public List matchLeadingCode(String protocolContent){ + public static List matchFrameLeadingCode(String protocolContent){ List initialConfigs = initialMatch(protocolContent); List preCodeConfigs = initialConfigs.stream() .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) @@ -26,13 +19,16 @@ } //初始化匹配前导码内容 - private List initialMatch(String protocolContent) { - String protocolStr = protocolContent.charAt(0) + ""; - QueryWrapper queryWrapper = new QueryWrapper() - .likeRight("pre_fix", protocolStr); - List protocolConfigList = protocolMapper.selectList(queryWrapper); - return protocolConfigList; + private static List initialMatch(String protocolContent) { + String firstFrameChar = protocolContent.charAt(0) + ""; + ProtocolConfigProvider protocolConfigProvider=new ProtocolConfigProvider(firstFrameChar); + return protocolConfigProvider.getMatchList(); } + + + + + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index cf2113d..e915877 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -1,32 +1,35 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(0) -@Service +@Component public class FrameLengthMatcher implements FrameStructMatcher { - @Autowired - private FieldParser fieldParser; - //超过长度 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { String dataGramContent = ByteBufUtil.hexDump(byteBuf); - if (StringUtils.isEmpty(protocolConfig.getUnpackId()) && StringUtils.isEmpty(protocolConfig.getTailStr())) { - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + //当不存在结尾标志和拆包标志,可以直接使用长度进行匹配 + if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { if (dataGramContent.length() >= totalLength) {//等于长度返回true,超出长度,切断 - ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, protocolConfig, totalLength); + ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, totalLength); return wholeDatagramByte; } else { //读的标志位前移舍弃 @@ -38,7 +41,7 @@ return null; } - private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, Integer totalLength) { byteBuf.readBytes(totalLength); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, totalLength - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 2bfc213..d527ad0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; @@ -13,7 +13,7 @@ import lombok.AllArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.nio.charset.Charset; import java.util.Map; @@ -22,32 +22,30 @@ * 后续标志验证 */ @Order(1) -@Service +@Component @AllArgsConstructor -public class FrameMarkMatcher implements FrameStructMatcher { - - private final FieldConfigDao fieldConfigDao; - private final FieldParser fieldParser; - private final FieldResolver fieldResolverManger; +public class FrameMarkMatcher implements FrameStructMatcher, FixedPropertyEnum { //帧后续标志=>结束,进行帧的重组=>有后续,1、帧移位判别 2、继续接收帧 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig UnpackConfig = StringUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getUnpackId()); - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); - Integer upback = 0; + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); ByteBuf mergeWholeFrameByte = null; - if (!ObjectUtil.isEmpty(UnpackConfig)) { - while (hasNextFullFrame(byteBuf, protocolConfig)) { - upback = (Integer) fieldResolverManger.filedParserManger(byteBuf, UnpackConfig, null); + if (!ObjectUtil.isEmpty(unpackFlag)) { + while (hasNextFullFrame(byteBuf, protocolConfig, protocolFieldConfigProvider)) { //是否存在后续位 - if (upback == 1) {//使用esayRule + if (unpackFlag == 1) {//使用esayRule //表示可以截取 - mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolConfig, totalLength); + mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolFieldConfigProvider, protocolConfig); return mergeWholeFrameByte; } else { - byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig)); + byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig, protocolFieldConfigProvider)); } } } @@ -56,7 +54,8 @@ //选取第一个帧,将业务内容和后面部分分开 //计算数据报文-业务内容 - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolFieldConfigProvider protocolFieldConfigProvider, ProtocolConfig protocolConfig) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); //截取完整报文 byteBuf.readBytes(totalLength); ByteBuf byteBufContent = byteBuf.slice(0, byteBuf.readerIndex()); @@ -68,15 +67,15 @@ String tail = ""; System.out.println(ByteBufUtil.hexDump(byteBufContent)); //会存在多个帧拼接在一起的的情况,进行合并处理 - while (hasNextFullFrame(byteBufContent, protocolConfig)) { - Integer currentFrameLength = fieldParser.getTotalLength(protocolConfig, byteBufContent); + while (hasNextFullFrame(byteBufContent, protocolConfig, protocolFieldConfigProvider)) { + Integer currentFrameLength = protocolFieldConfigProvider.getTotalLength(byteBufContent, protocolConfig); byteBufContent.readBytes(currentFrameLength); ByteBuf currentbyteBuf = byteBufContent.slice(0, byteBufContent.readerIndex()); byteBufContent.markReaderIndex();//读的标志位前移 System.out.println(ByteBufUtil.hexDump(byteBufContent)); String hexDump = currentbyteBuf.toString(Charset.forName("ISO-8859-1")); //获取当前固定帧结构的关系map - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, currentbyteBuf); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(currentbyteBuf, protocolConfig); if (StringUtils.isEmpty(mergeFrameStr)) { //首次获取业务数据报文 mergeFrameStr += hexDump.substring(0, currentFrameFixedProperty.get("tailPosition")); @@ -95,22 +94,22 @@ /** * 获取平移到下一帧起始位置 */ - public int getNextFrameOffset(ByteBuf buffer, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, buffer); - return currentFrameFixedProperty.get("totalLength"); + public int getNextFrameOffset(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + return currentFrameFixedProperty.get(TOTAL_LENGTH); } /** * 判断是否出错进行整个帧的 */ - public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, byteBuf); + public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); //保证读取位置不在固定位置,是可变的业务内容 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("fixedPosition")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(FIXED_POSITION)) { return false; } //判断读取是否操作帧长度 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("totalLength")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(TOTAL_LENGTH)) { return false; } return true; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 76a3784..c3a1bab 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -1,50 +1,50 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.parser.instance.GeneralProcessor; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; +import io.netty.buffer.ByteBufUtil;; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(2) -@Service +@Component public class FrameTailMatcher implements FrameStructMatcher { - @Resource - private FieldConfigDao fieldConfigDao; - @Autowired - private GeneralProcessor generalProcessor; - //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig tailFieldConfig = StringUtils.isEmpty(protocolConfig.getTailStr()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getTailStr()); - if (!ObjectUtil.isEmpty(tailFieldConfig)) { - String tailStr = tailFieldConfig.getFieldName(); + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfig protocolFieldConfig = ObjectUtils.isEmpty(protocolConfig.getTailStr()) ? null : + fieldConfigProvider.getFieldConfigById(protocolConfig.getTailStr()); + if (!ObjectUtil.isEmpty(protocolFieldConfig)) { + String tailStr = protocolFieldConfig.getFieldName(); String dataGramContent = ByteBufUtil.hexDump(byteBuf); Boolean tailFlag = ByteBufUtil.hexDump(byteBuf).contains(tailStr); if (!tailFlag) { //使用esayRule return null; } else if (dataGramContent.indexOf(tailStr) < dataGramContent.length() - tailStr.length()) { Integer length = dataGramContent.indexOf(tailStr) + tailStr.length(); - ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, protocolConfig, length); + ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, length); return wholeDatagramByte; //存在粘包 } } return null; } - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer length) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, Integer length) { byteBuf.readBytes(length); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, length - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java new file mode 100644 index 0000000..5f1c177 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java @@ -0,0 +1,73 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.combined.GenericCombinedFieldResolver; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.CombinedFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class CombinedFieldConfigProvider { + + + /** + * 作为临时配置列表缓存使用 + */ + private final List combinedFieldConfigList; + private Map storeObjectMap = new HashMap<>(); + + public CombinedFieldConfigProvider(Long ruleId) { + CombinedFieldConfigRegistry combinedFieldConfigRegistry = SpringContextUtil.getBean(CombinedFieldConfigRegistry.class); + combinedFieldConfigList = combinedFieldConfigRegistry.getCombinedFieldConfigList(ruleId); + } + + public void parseDataField(RuleConfig ruleConfig, String clearZeroPlain,Map fieldConfigsMap ) { + if (showSkip()) { + return; + } + //匹配对应的数据,然后进行相关的字段解析 + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver(); + combinedFieldResolver.parseDataField(combinedFieldConfigList, byteBuf, storeObjectMap,fieldConfigsMap); + } + + + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getCombinedFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return combinedFieldConfigList.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public List getCombinedFieldConfigList() { + return combinedFieldConfigList; + } + + /* 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(combinedFieldConfigList) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java new file mode 100644 index 0000000..f3cfedc --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java @@ -0,0 +1,11 @@ +package com.casic.missiles.parser.provider; + +/** + * @author cz + * @date 2023-6-12 + */ +public class CommandEventProvider{ + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java new file mode 100644 index 0000000..70eec5e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java @@ -0,0 +1,77 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.safe.SafeStrategy; +import com.casic.missiles.parser.sender.DataSubscribeProvider; +import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class DatagramEventProvider { + + private final DatagramEventConfig processorInstance; + + public DatagramEventProvider(Long ruleId) { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + List datagramEventConfigList = + datagramEventRegistry.getDatagramEventList(ruleId); + processorInstance = this.getProcessorInstance(datagramEventConfigList); + } + + public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { + if (showSkip()) { + return null; + } + return datagramEventConfigList.get(0); + } + + // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 + public String getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap) { + String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? + processorInstance.getSafeBean() : + fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); + if (!StringUtils.isEmpty(safeName)) { + //需要加密 + SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); + String plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); + return clearComplementZero(plain); + } + return ByteBufUtil.hexDump(bizDataContent); + } + + //解密清零操作 + private String clearComplementZero(String plain) { + plain = plain.substring(0, plain.lastIndexOf("00")); + return plain; + } + + //数据发送,数据发送者暂未构建 + public void storeData(Map bizDataMap) { + DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); +// dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return ObjectUtils.isNotEmpty(processorInstance) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java new file mode 100644 index 0000000..7e1fe0a --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java @@ -0,0 +1,97 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.FieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class FieldConfigProvider { + + + private final List fieldConfigs; + private Map storeObjectMap = new HashMap<>(); +// private Map singleObjects = new ConcurrentHashMap<>(); + + public FieldConfigProvider(Long ruleId) { + FieldConfigRegistry fieldConfigRegistry = SpringContextUtil.getBean(FieldConfigRegistry.class); + fieldConfigs = fieldConfigRegistry.getFieldConfigList(ruleId); + } + + public List getFieldConfigs() { + return fieldConfigs; + } + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public Map parseDataField(RuleConfig ruleConfig, String clearZeroPlain) { + if (showSkip()) { + return null; + } + List prepareFieldConfig = prepareParseField(ruleConfig); + if (CollectionUtils.isNotEmpty(prepareFieldConfig)) { + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(fieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + return fixDataMap; + } + } + return null; + } + + /** + * 得到需要处理的业务内容 + * + * @return + */ + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return fieldConfigs.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public Map getFieldConfigsMap() { + return fieldConfigs.stream().collect( + Collectors.toMap(FieldConfig::getId, e -> e) + ); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(fieldConfigs) ? false : true; + } + + +} + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java new file mode 100644 index 0000000..817bfaf --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java @@ -0,0 +1,19 @@ +package com.casic.missiles.parser.provider; + +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.registry.FieldRuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; + +public class FieldRuleConfigProvider { + + private final List fieldRuleConfigList; + + public FieldRuleConfigProvider(Long ruleId) { + FieldRuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(FieldRuleConfigRegistry.class); + fieldRuleConfigList = ruleConfigRegistry.getFieldRuleConfigList(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java new file mode 100644 index 0000000..99a1b06 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java @@ -0,0 +1,53 @@ +package com.casic.missiles.parser.provider; + + +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.registry.ProtocolConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolConfigProvider { + + private final List protocolConfigList; + + public ProtocolConfigProvider(String firstChar) { + ProtocolConfigRegistry registry = SpringContextUtil.getBean(ProtocolConfigRegistry.class); + protocolConfigList = registry.getProtocolConfigList(firstChar); + } + + public List getMatchList() { + return protocolConfigList; + } + + /** + * 设置当前协议 + * + * @param protocolConfig + */ + public ProtocolConfigProvider(ProtocolConfig protocolConfig) { + List protocolConfigs = new ArrayList<>(); + protocolConfigs.add(protocolConfig); + protocolConfigList = protocolConfigs; + } + + /** + * 获取当前协议 + * + * @return + */ + public ProtocolConfig getCurrentProtocolConfig() { + if (this.protocolConfigList == null) { + return null; + } else { + return protocolConfigList.get(0); + } + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java new file mode 100644 index 0000000..043927d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java @@ -0,0 +1,213 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.registry.ProtocolFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolFieldConfigProvider { + + private static final String FIXED_FIELD_DS = "fixedFieldDs"; + private static final String CONTENT_FIELD_DS = "contentFieldDs"; + private static final String PROTOCOL_LENGTH = "protocolLength"; + private static final String PROTOCOL_FIELD_ID = "protocolFieldId"; + private static final String PROTOCOL_POSITION = "protocolPosition"; + + private final List protocolFieldConfigs; + private Map singleObjects = new ConcurrentHashMap<>(); + private Map storeObjectMap = new HashMap<>(); + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public ProtocolFieldConfigProvider(Long protocolId) { + ProtocolFieldConfigRegistry protocolFieldConfigRegistry = SpringContextUtil.getBean(ProtocolFieldConfigRegistry.class); + protocolFieldConfigs = protocolFieldConfigRegistry.getProtocolFieldConfigList(protocolId); + } + + public List getProtocolFieldConfigs() { + return protocolFieldConfigs; + } + + public ProtocolFieldConfig getFieldConfigById(Long fieldId) { + Optional optionalConfig = protocolFieldConfigs.stream().filter( + e -> e.getId().equals(fieldId) + ).findFirst(); + return optionalConfig.isPresent() ? optionalConfig.get() : null; + } + + public Integer getProtocolFieldValue(Long protocolFieldId, ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_FIELD_ID + protocolFieldId + ByteBufUtil.hexDump(byteBuf); + //获取缓存 + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + //加载固定长度数据集合 + Map fixDataMap = this.getProtocolDataMap(byteBuf); + ProtocolFieldConfig protocolFieldConfig = selectFieldConfig(protocolFieldId); + Integer protocolFieldValue = 0; + //获取约定字段的总长度 + if (fixDataMap.containsKey(protocolFieldConfig.getFieldName())) { + Object appointUnpackObject = fixDataMap.get(protocolFieldConfig.getFieldName()); + if (ObjectUtils.isNotEmpty(appointUnpackObject)) { + protocolFieldValue = (Integer) appointUnpackObject; + } + } + if (protocolFieldValue != null) { + //加入缓存 + if (ObjectUtils.isNotEmpty(protocolFieldValue)) { + this.singleObjects.put(catchKey, protocolFieldValue); + return protocolFieldValue; + } + } + return null; + } + + /** + * 获取帧固定位置信息 + * + * @param byteBuf + * @param protocolConfig + * @return + */ + public Map getFixedProperty(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_POSITION + protocolConfig.getId(); + if (this.singleObjects.containsKey(catchKey)) { + return (Map) singleObjects.get(catchKey); + } + Map fixedPropertyMap = new HashMap<>(); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + fixedPropertyMap = fieldParser.doGetFixedProperty(protocolFieldConfigs, this.getTotalLength(byteBuf,protocolConfig)); + if (CollectionUtils.isNotEmpty(fixedPropertyMap)) { + this.singleObjects.put(catchKey, fixedPropertyMap); + return fixedPropertyMap; + } + return fixedPropertyMap; + } + + /** + * 获取帧结构应有的总长度 + */ + public Integer getTotalLength(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_LENGTH + ByteBufUtil.hexDump(byteBuf); + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + Integer appointFrameLength = getProtocolFieldValue(protocolConfig.getTotalLengthId(), byteBuf); + if (appointFrameLength != null) { + //获取过滤的字段集合总长度 + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Integer totalFilterLength = fieldParser.getTotalFilterLength(protocolConfig, byteBuf, getFixFieldConfigMap()); + //计算总长度 + Integer totalLength = appointFrameLength + totalFilterLength; + //加入缓存 + if (ObjectUtils.isNotEmpty(totalLength)) { + this.singleObjects.put(catchKey, totalLength); + return totalLength; + } + } + return null; + } + + /** + * 获取协议有关字段解析内容 + * storeObjectMap存储代转存的数据 + * + * @return + */ + public Map getProtocolDataMap(ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(FIXED_FIELD_DS)) { + return (Map) singleObjects.get(FIXED_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(protocolFieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + this.singleObjects.put(FIXED_FIELD_DS, fixDataMap); + return fixDataMap; + } + return null; + } + + /** + * 获取业务报文内容的content字节 + * + * @param wholeDatagramByte + * @return + */ + public ByteBuf getDataContentBuf(ByteBuf wholeDatagramByte) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(CONTENT_FIELD_DS)) { + return (ByteBuf) singleObjects.get(CONTENT_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + ByteBuf bizDataByteBuf = fieldParser.getDataContentBuf(protocolFieldConfigs, wholeDatagramByte); + if (bizDataByteBuf != null) { + this.singleObjects.put(CONTENT_FIELD_DS, bizDataByteBuf); + return bizDataByteBuf; + } + return null; + } + + + private ProtocolFieldConfig selectFieldConfig(Long id) { + Optional optionalProtocolFieldConfig = this.protocolFieldConfigs.stream().filter( + e -> e.getId().equals(id) + ).findFirst(); + return optionalProtocolFieldConfig.isPresent() ? optionalProtocolFieldConfig.get() : null; + } + + + private Map getFixFieldConfigMap() { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, e -> e) + ); + return fixDataFieldMap; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(protocolFieldConfigs) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java new file mode 100644 index 0000000..dafba1c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java @@ -0,0 +1,56 @@ +package com.casic.missiles.parser.provider; + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.rule.GenericRuleResolver; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.RuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleConfigProvider { + + private final List ruleConfigs; + + public List getRuleConfigs() { + return ruleConfigs; + } + + public RuleConfigProvider(Long protocolId) { + RuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(RuleConfigRegistry.class); + ruleConfigs = ruleConfigRegistry.getRuleConfigById(protocolId); + } + + /** + * 获取规则匹配结果 + * + * @param parseFixedDataMap + * @param protocolFieldConfigs + * @return + */ + public RuleConfig doGetRule(Map parseFixedDataMap, + String ids, + List protocolFieldConfigs) { + if (showSkip()) { + return null; + } + RuleConfig ruleConfig = GenericRuleResolver.machRule(parseFixedDataMap, ids, protocolFieldConfigs, ruleConfigs); + return ruleConfig; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(ruleConfigs) ? false : true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java index 3c05891..856b399 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java @@ -1,18 +1,11 @@ package com.casic.missiles.parser.resolver; -import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.springframework.web.bind.annotation.RequestBody; -import javax.annotation.Resource; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -20,19 +13,17 @@ @Slf4j public class ByteMergeProvider { - @Resource - private FieldRuleEngineMapper fieldRuleEngineMapper; - //拿到所有的值合并到一个值 - public String resolveByteMerge(List valueList, String ruletypeId, String vaildRange) { + public static String resolveByteMerge(List valueList, String ruleTypeId, String vaildRange) { String values = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Map vaildMap = getValidRangeMap(vaildRange); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(ruletypeId); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } + //暂时不处理 +// fieldRuleEngine = fieldRuleConfigMapper.selectById(ruleTypeId); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } Map env2 = new HashMap(); for (int i = 0; i < valueList.size(); i++) { if (vaildMap.containsKey(i)) { @@ -47,7 +38,7 @@ } } - private Map getValidRangeMap(String vaildRange) { + private static Map getValidRangeMap(String vaildRange) { String[] range = vaildRange.split(","); Map vaildMap = new HashMap(); for (int i = 0; i < range.length; i++) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 8d821cd..85d6bbf 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -1,9 +1,12 @@ package com.casic.missiles.parser.resolver; +import com.casic.missiles.pojo.AbstractFieldConfig; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; import io.netty.buffer.ByteBuf; +import java.util.List; import java.util.Map; /** @@ -11,18 +14,14 @@ */ public interface FieldParser { -// Map fieldProcess(String protocolContent,); - Map dataParser(RuleConfig ruleConfig, String lightText,String protocolId); + Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength); - Map fixDataParser(String protocolId, ByteBuf buffer); + Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap); - Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf); + ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer); - ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer); - - ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer); - - Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer); + Integer getTotalFilterLength(ProtocolConfig protocolConfig, ByteBuf byteBuf, Map protocolFieldConfigMap); } + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java new file mode 100644 index 0000000..9e0c00e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java @@ -0,0 +1,52 @@ +package com.casic.missiles.parser.resolver; + +import com.casic.missiles.pojo.AbstractFieldConfig; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.util.List; + +public class FieldParserSupport { + + //分别计算bit和byte长度=> 合并长度 + protected Integer calculateLength(List fieldConfigList) { + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + Integer fixedLength = bytefixedLength + bitfixedLength / 8; + return fixedLength; + } + + //找到最大值=> 根据最大值计算业务数据下标 + protected Integer calculatePosition(List fieldConfigList) { + String rex = "[0-9]+"; + Integer max = -1; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) + && Integer.valueOf(fieldConfig.getOriginPositionByte()) > max) { + max = Integer.valueOf(fieldConfig.getOriginPositionByte()); + } + } + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) && fieldConfig.getOriginPositionByte().equals(max)) { + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + } + } + Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; + return maxFixedPosition; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java deleted file mode 100644 index dd3a6cd..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java +++ /dev/null @@ -1,170 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.ByteResolverParam; -import io.netty.buffer.ByteBuf; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -/** - * 字段解析管理总类 - */ -@Service -@Slf4j -@AllArgsConstructor -public class FieldResolver extends ByteMergeProvider { - - //1、字段截取 => 2、简单的字节解析和复杂的字节解析 - public Object filedParserManger(ByteBuf byteBuf, FieldConfig fieldConfig, Integer maxFixedPosition) { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - //最大固定位置不为空, - if (!ObjectUtil.isEmpty(maxFixedPosition)) { - orignPosition -= maxFixedPosition; - } - Object fieldValue = 0; - //待优化 - if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { - fieldValue = bitToResolver(byteBuf, fieldConfig); - } else { - ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); - fieldValue = parsingFields(fieldBytes, fieldConfig.getRuleJson()); - } - return fieldValue; - } - - //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, - //目前默认配置的规则设置暂不支持配置化,由实现完成 - private Object parsingFields(ByteBuf byteBuf, String ruleJson) { - Object fieldsResolveValue = null; - List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); - if (ObjectUtil.isEmpty(ruleMapList)) { - fieldsResolveValue = defaultResolveBuilder(byteBuf); - } else { - fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); - } - return fieldsResolveValue; - } - - private Object defaultResolveBuilder(ByteBuf byteBuf) { - Integer defaultResolveValue = 0; - for (int i = 0; i < byteBuf.writerIndex(); i++) { - defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; - } - return defaultResolveValue; - } - - //字段解析构建器(针对字节单位的) - //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 - // 字节归并结束或者规则结束=>继续根据规则进行判断 - private Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { - Object customizeResolveValue = null; - try { - List bytStrList = new ArrayList<>(); - //存放到数组里面 - for (int i = 0; i < byteBuf.writerIndex(); i++) { - bytStrList.add(byteBuf.readByte()); - } - int i = 0; - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - customizeResolveValue = this.resolveByteMerge(bytStrList, ruletypeId,vaildRange); - break; - } else { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - List tempBytStr = new ArrayList<>(); - for (int k = 0; i < bytStrList.size(); i++) { - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(k) - .value(bytStrList.get(k)) - .ruletypeId(ruletypeId).build(); - tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); - } - bytStrList = tempBytStr; - } - i++; - } - //字节归并到一起=>继续根据规则进行判断 - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(customizeResolveValue) - .ruletypeId(ruletypeId).build(); - customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(customizeResolveValue)); - return customizeResolveValue; - } catch (RuntimeException ex) { - log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); - return null; - } - } - - /** - * 1、单个字节情况表示字段 - * 2、多字节情况表示字段(暂未处理) - */ - private Object bitToResolver(ByteBuf byteBuf, FieldConfig fieldConfig) { - Object fieldValue = new Object(); - try { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - byte fields = 0x00; - if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); - } else { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); - } - - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { - if (!StringUtils.isEmpty(fieldConfig.getExactOrignPosition())) { - fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getExactOrignPosition())).byteValue() - >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); - } else { - fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); - } - } else { - fieldValue = Integer.valueOf(fields & 0xff); - } - if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { - return fieldValue; - } - List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); - int i = 0; - //字节归并到一起=>继续根据规则进行判断 - while (i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(fieldValue) - .ruletypeId(ruletypeId).build(); - fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(fieldValue)); - return fieldValue; - } catch (RuntimeException ex) { - log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); - return null; - } - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java new file mode 100644 index 0000000..1d2aeab --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java @@ -0,0 +1,36 @@ +package com.casic.missiles.parser.resolver.bytes; + +import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.mapper.FieldRuleConfigMapper; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.pojo.ByteResolverParam; +import com.googlecode.aviator.AviatorEvaluator; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; +//转换规则 +@Component("convert") +@AllArgsConstructor +@Slf4j +public class ByteRuleResolver implements ByteResolver { + + private final FieldRuleConfigMapper fieldRuleConfigMapper; + + @Override + public Object resolveOperationRule(ByteResolverParam byteResolverParam){ + FieldRuleConfig fieldRuleEngine=fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); + if(ObjectUtil.isEmpty(fieldRuleEngine)){ + return byteResolverParam.getValue(); + } + String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); + Map env2 = new HashMap(); + env2.put("value", (byte) byteResolverParam.getValue()); + String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); + return values; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java index 103821c..786b71c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java @@ -2,34 +2,34 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("logicalShift") +@Component("logicalShift") @AllArgsConstructor @Slf4j public class LogicalShiftResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //字节位移 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { Integer index = byteResolverParam.getIndex(); - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return byteResolverParam.getValue(); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java index 476747d..01149bd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("operation") +@Component("operation") @AllArgsConstructor @Slf4j public class OperationResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //混合运算,有常量或者乘除的缩放 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java index 0b82cf4..79abcce 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.casic.missiles.pojo.ByteResolverParam; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; //精度计算 -@Service("precision") +@Component("precision") @AllArgsConstructor @Slf4j public class PrecisionResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java deleted file mode 100644 index 5c3f332..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; -//转换规则 -@Service("convert") -@AllArgsConstructor -@Slf4j -public class RuleResolver implements ByteResolver { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam){ - RuleEvaluator fieldRuleEngine=fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); - if(ObjectUtil.isEmpty(fieldRuleEngine)){ - return byteResolverParam.getValue(); - } - String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); - Map env2 = new HashMap(); - env2.put("value", (byte) byteResolverParam.getValue()); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java new file mode 100644 index 0000000..d3bbd91 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java @@ -0,0 +1,15 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; + +import java.util.List; +import java.util.Map; +// 前导码匹配->长度字段 +public interface AbstractCombinedFieldProcessor { + + Map invoke(Map map, ByteBuf byteBuf, List combinedFieldConfigList, + Map fieldConfigsMap, Map storeObjectMap); + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java index 608af3a..32cc8a4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java @@ -2,48 +2,47 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.delivery.decorator.ByteDecorator; +import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @AllArgsConstructor public class FieldDecoratorManger { - private final RuleDictDao ruleDictDao; + private final RuleConfigRegistry ruleDictDao; // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 // (1)静态的业务字段是字典里面可以配置的 // (2)动态的业务字段是通过规则生成的 public String contentMerge(String ruleJson, String sceneConent, String dynamicContent) { - List ruleDictList = ruleDictDao.getRuleDictConfig(); - Map ruleDictMap = ruleDictList.stream().collect( - Collectors.toMap(RuleDict::getId, e -> e)); - List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); - for (Map ruleMap : ruleMapList) { - String ruleType = String.valueOf(ruleMap.get("ruleType")); - ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); - NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); - byteDecorator.nodeDecoratorRule(nodeDecoratorParm); - } +// List ruleDictList = ruleDictDao.getRuleDictConfig(); +// Map ruleDictMap = ruleDictList.stream().collect( +// Collectors.toMap(RuleDict::getId, e -> e)); +// List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); +// for (Map ruleMap : ruleMapList) { +// String ruleType = String.valueOf(ruleMap.get("ruleType")); +// ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); +// NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); +// byteDecorator.nodeDecoratorRule(nodeDecoratorParm); +// } return null; } - - private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { - NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() - .contents(sceneConent) - .dynamicContent(dynamicContent) - .ruletypeId(ruletypeId) - .ruleDictMap(ruleDictMap) - .build(); - return nodeDecoratorParm; - } +// +// private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { +// NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() +// .contents(sceneConent) +// .dynamicContent(dynamicContent) +// .ruletypeId(ruletypeId) +// .ruleDictMap(ruleDictMap) +// .build(); +// return nodeDecoratorParm; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java index 652970c..b204ac3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java @@ -1,56 +1,56 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@AllArgsConstructor -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", - JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Component; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Component("logicalDecorator") +//@AllArgsConstructor +//@Slf4j +//public class LogicalShiftDecorator implements ByteDecorator { +// +//// private final FieldRuleEngineMapper fieldRuleEngineMapper; +//// +//// //字节位移 +//// @Override +//// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +//// String logicalValue = ""; +//// RuleEvaluator fieldRuleEngine = new RuleEvaluator(); +//// try { +//// Map env2 = new HashMap(); +//// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +//// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +//// for (String contentId : contentIdList) { +//// RuleDict ruleDict = ruleDictMap.get(contentId); +//// if (ruleDict.getCode().contains("#")) { +//// //使用动态的值 +//// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +//// } +//// env2.put(ruleDict.getName(), ruleDict.getCode()); +//// } +//// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +//// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +//// return null; +//// } +//// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +//// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +//// return values; +//// } catch (Exception ex) { +//// log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", +//// JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +//// return null; +//// } +//// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java index 346468f..822fead 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@AllArgsConstructor -@Slf4j -public class OperationDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("optionDecorator") +//@AllArgsConstructor +//@Slf4j +//public class OperationDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //混合运算,有常量或者乘除的缩放 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java index 50fb0a7..7a8bccb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@AllArgsConstructor -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +////精度计算 +//@AllArgsConstructor +//@Registry("precisionDecorator") +//@Slf4j +//public class PrecisionDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java index da39235..27f9cc7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java @@ -1,54 +1,53 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@AllArgsConstructor -@Slf4j -public class RuleDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("ruleDecorator") +//@AllArgsConstructor +//@Slf4j +//public class RuleDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //吃我一套正则表达式 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (Exception ex) { +// log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java index 7f5cbf3..c043f97 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java @@ -2,6 +2,6 @@ import java.util.Map; -public interface ComandeEventService { +public interface ComandeEventService{ Map loadComandeEventConfig(String protocolId,String scene); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java index 476ad84..aaf1837 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java @@ -2,46 +2,46 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.dao.CommandEventDao; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @Slf4j @AllArgsConstructor -public class ComandeEventServiceImpl implements ComandeEventService { +public class ComandeEventServiceImpl implements ComandeEventRegistry { - private final CommandEventDao commandEventDao; + // private final CommandEventDao commandEventDao; // 加密bean 固定字段出现变化的字段解析,业务字段的有序内容 @Override - public Map loadComandeEventConfig(String protocolId,String sceneName) { - CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); - if (ObjectUtil.isEmpty(commandEventConfig)) { - log.error("协议{},没有配置成功接收回复配置,清排查原因"); - return null; - } - String replyJson = commandEventConfig.getReplyContentJson(); - List> replyMapList = JSONArray.parseObject(replyJson, List.class); - List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); - Map fixMap = fixList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); - List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) - .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) - .collect(Collectors.toList()); - Map commandConfigMap = new HashMap<>(); - commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); - commandConfigMap.put("fixContent", fixMap); - commandConfigMap.put("bizContent", contentList); - return commandConfigMap; + public Map loadComandeEventConfig(String protocolId, String sceneName) { +// CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); +// if (ObjectUtil.isEmpty(commandEventConfig)) { +// log.error("协议{},没有配置成功接收回复配置,清排查原因"); +// return null; +// } +// String replyJson = commandEventConfig.getReplyContentJson(); +// List> replyMapList = JSONArray.parseObject(replyJson, List.class); +// List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); +// Map fixMap = fixList.stream() +// .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); +// List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) +// .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) +// .collect(Collectors.toList()); +// Map commandConfigMap = new HashMap<>(); +// commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); +// commandConfigMap.put("fixContent", fixMap); +// commandConfigMap.put("bizContent", contentList); +// return commandConfigMap; + return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 128b09d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java deleted file mode 100644 index 4016b0b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface DatagramEventMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java deleted file mode 100644 index 597c306..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.apache.ibatis.annotations.Mapper; - -public interface FieldConfigMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java deleted file mode 100644 index a31680a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.PreRuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface PreRuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java deleted file mode 100644 index 9060a69..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface ProtocolConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java deleted file mode 100644 index 6fa6936..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java deleted file mode 100644 index 582a705..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleDict; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleDictMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java deleted file mode 100644 index 6e302c8..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.CommandEventMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Optional; - -@Component -public class CommandEventDao { - - @Resource - private CommandEventMapper commandEventMapper; - - public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId) - .eq("scene", sceneName) - .eq("enabled", 1); - List commandEventConfig = commandEventMapper.selectList(queryWrapper); - Optional optionalEventConfig = commandEventConfig.stream().findFirst(); - return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java deleted file mode 100644 index 9137e4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.FieldConfigMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class FieldConfigDao { - - @Resource - private FieldConfigMapper fieldConfigMapper; - - public FieldConfig getFieldConfigById(String fieldId) { - FieldConfig fieldConfig = fieldConfigMapper.selectById(fieldId); - return fieldConfig; - } - - public List getFieldConfigs(String protocolId,Integer isFixed) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",isFixed); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - - public List getStorageFieldConfig(String protocolId) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",1) - .eq("is_storage",1); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java deleted file mode 100644 index 67bff6b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.mapper.PreRuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class PreRuleConfigDao { - - @Resource - private PreRuleConfigMapper preRuleConfigMapper; - - public List getPreRuleList(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return preRuleConfigMapper.selectList(queryWrapper); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java deleted file mode 100644 index d69ea85..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.RuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleConfigDao { - - @Resource - private RuleConfigMapper ruleConfigMapper; - - public RuleConfig getNextRuleConfig(String ruleFields) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("parse_rule_json", ruleFields); - return ruleConfigMapper.selectOne(queryWrapper); - } - - - public List getRuleConfigById(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return ruleConfigMapper.selectList(queryWrapper); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java deleted file mode 100644 index 932c185..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.RuleDictMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleDictDao { - - @Resource - private RuleDictMapper ruleDictMapper; - - public List getRuleDictConfig() { - List ruleDictList = ruleDictMapper.selectList(null); - return ruleDictList; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java index 9f9e279..43bc4d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java @@ -10,20 +10,15 @@ import io.netty.channel.socket.nio.NioServerSocketChannel; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import javax.annotation.PreDestroy; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static cn.hutool.core.util.ClassUtil.getClasses; /** * SensorhubServer netty服务端 */ @Slf4j -@Service +@Component public class SensorhubServer { /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java index 2c79ff5..9a28c36 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java @@ -11,13 +11,13 @@ import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioSocketChannel; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClient 客户端 */ @Slf4j -@Service +@Registry public final class SensorhubClient { public static void main(String[] args) throws Exception { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java index 9774be0..477c3f7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java @@ -6,12 +6,12 @@ import io.netty.channel.socket.SocketChannel; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientChannelInitialHandler */ -@Service +@Registry public class SensorhubClientChannelInitialHandler extends ChannelInitializer { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java index 346f4b3..73560e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java @@ -5,13 +5,13 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientHandler */ @Slf4j -@Service +@Registry public class SensorhubClientHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java index 5c1c6f2..d990af5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java @@ -4,12 +4,12 @@ import com.casic.missiles.pojo.Msg; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** * SensorhubServerHandler */ -@Service +@Component public class SensorhubServerHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 67283ae..af3172c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,41 +1,37 @@ package com.casic.missiles.parser; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultProtocolConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.*; +import com.casic.missiles.registry.FieldConfigRegistry; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; -import java.nio.charset.Charset; import java.util.HashMap; import java.util.List; import java.util.Map; -@Service("genericProtocolParser") +/** + * @author + */ +@Component("genericProtocolParser") @Slf4j -@AllArgsConstructor +@RequiredArgsConstructor public class GenericProtocolParser implements ProtocolParser { - private final LeadingCodeMatcher leadingCodeMatcher; private final List frameStructDispenserList; - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorInstanceSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; // 匹配首字母前导码=> 帧结构匹配前导码=> // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 @@ -44,18 +40,19 @@ public Boolean doParseProtocol(ByteBuf byteBuf) { String protocolContent = ByteBufUtil.hexDump(byteBuf); //匹配前导码 - List preCodeConfigs = leadingCodeMatcher.matchLeadingCode(protocolContent); + List preCodeConfigs = LeadingCodeMatcher.matchFrameLeadingCode(protocolContent); //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 if (preCodeConfigs.size() == 0) { - return rematch(byteBuf,protocolContent); + return rematch(byteBuf, protocolContent); } - //暂时先取第一个 + //暂时先取第一个,提升速度,使用享元模式, 减少类的创建销毁与构建 ProtocolConfig protocolConfig = preCodeConfigs.get(0); + AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); ByteBuf wholeDatagramByte = null; //通过匹配帧结构获取完整的数据包 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, preCodeConfigs.get(0))) != null) { + if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, protocolFactory)) != null) { break; } } @@ -68,76 +65,78 @@ * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 */ - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId, wholeDatagramByte); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap, protocolId); - //选取规则对应的流程实例 - DatagramEventConfig datagramEventConfig = processorInstanceSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); + //进行规则字段解析,进行匹配规则 + RuleConfig ruleConfig = getRuleConfig(protocolFactory, wholeDatagramByte); + if (ruleConfig == null) { + return false; + } //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, wholeDatagramByte); + ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte); + //以下进行业务的规则解析,同时选定流程实例 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); + DatagramEventProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain, + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText, protocolId); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain); //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); + datagramEventProvider.storeData(bizDataMap); return true; } - private Boolean rematch(ByteBuf byteBuf,String protocolContent) { + /** + * 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 + */ + private Boolean rematch(ByteBuf byteBuf, String protocolContent) { //重置位判断 byteBuf.resetReaderIndex(); //判断重置是否前移,如果没有前移,则直接判为匹配失败 if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { return false; } else { + //递归执行 return doParseProtocol(byteBuf); } } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; + //获取匹配规则->匹配规则 + private RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + //取出其中参与逻辑provider并判空 + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); + String rulePrepareFields = protocolConfig.getRulePrepareFields(); + //固定字段 + if (StringUtils.isNotEmpty(rulePrepareFields)) { + //获取统一固定字段解析 + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + //获取该协议的字段配置,用于协议规则匹配 + List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); + //获取规则 + RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, + rulePrepareFields, protocolFieldConfigs); + return ruleConfig; + } + return null; } - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + //数据构建,获取固定字段的store和业务字段store + private Map buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + Map bizDataMap = new HashMap<>(); + Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); + Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); + bizDataMap.putAll(ruleStoreObjectMap); + bizDataMap.putAll(protocolStoreObjectMap); return bizDataMap; } - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java index 8a46e32..16ce2e5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java @@ -3,6 +3,7 @@ import io.netty.buffer.ByteBuf; public interface ProtocolParser { + Boolean doParseProtocol(ByteBuf byteBuf); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java new file mode 100644 index 0000000..f7814af --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java @@ -0,0 +1,35 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.ProtocolConfigProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.ProtocolConfig; + +/** + * 存放基本协议的的加载信息 + */ +public class AbstractProtocolConfigFactory { + private final ProtocolConfigProvider protocolConfigProvider; + private final ProtocolFieldConfigProvider protocolFieldConfigProvider; + private final RuleConfigProvider ruleConfigProvider; + + public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { + this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); + this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); + this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); + } + + public ProtocolConfigProvider getProtocolConfigProvider() { + return protocolConfigProvider; + } + + public ProtocolFieldConfigProvider getProtocolFieldConfigProvider() { + return protocolFieldConfigProvider; + } + + public RuleConfigProvider getRuleConfigProvider() { + return ruleConfigProvider; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java new file mode 100644 index 0000000..6e36147 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java @@ -0,0 +1,57 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.CombinedFieldConfigProvider; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.FieldConfigProvider; +import com.casic.missiles.parser.provider.FieldRuleConfigProvider; + +/** + * 存放规则相关的的的加载信息 + */ +public class AbstractRuleConfigFactory { + + /** + * 处理字节 + */ + private final FieldConfigProvider fieldConfigProvider; + /** + * 处理组合字节解析的解码器 + */ + private final CombinedFieldConfigProvider combinedFieldConfigProvider; + /** + * 处理负责字节解析的规则配置 + */ + private final FieldRuleConfigProvider fieldRuleConfigProvider; + /** + * 处理实例流程 + */ + private final DatagramEventProvider datagramEventProvider; + + + public AbstractRuleConfigFactory(Long ruleId) { + this.fieldConfigProvider = new FieldConfigProvider(ruleId); + this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); + this.fieldRuleConfigProvider = new FieldRuleConfigProvider(ruleId); + this.datagramEventProvider = new DatagramEventProvider(ruleId); + } + + public FieldConfigProvider getFieldConfigProvider() { + return fieldConfigProvider; + } + + public CombinedFieldConfigProvider getCombinedFieldConfigProvider() { + return combinedFieldConfigProvider; + } + + public FieldRuleConfigProvider getFieldRuleConfigProvider() { + return fieldRuleConfigProvider; + } + + public DatagramEventProvider getDatagramEventProvider() { + return datagramEventProvider; + } + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java deleted file mode 100644 index 6e1719a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.factory; - - -import com.casic.missiles.pojo.ProtocolConfig; - -import java.util.List; - -/** - * 数据库访问优化(暂时未做) - *

- * 1、初始化协议解析配置,并存放到处存放缓存,对协议基本配置进行管理 - * 2、其中流程中所有的配置都经过此类进行管理,进行调用获取,增强解析速度 - */ -public interface DatagramFactory { - - /** - * 初始化 - */ - List datagramInit(); - - /** - * 根据前导码配置匹配,模糊匹配获取所有的报文项 - */ - List match(); - - /** - * 根据前导码匹配,返回报文项 - */ - List filer(); - - /** - * 保证数据的唯一性选择器 - */ - List selectOne(); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java new file mode 100644 index 0000000..87444a0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java @@ -0,0 +1,18 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +import java.util.List; + +/** + * 直接用,还是边用边创建 + */ +public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { + + + public DefaultProtocolConfigFactory(ProtocolConfig protocolConfig) { + super(protocolConfig); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java new file mode 100644 index 0000000..cce0c7c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java @@ -0,0 +1,12 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; + +public class DefaultRuleFactory extends AbstractRuleConfigFactory { + + public DefaultRuleFactory(Long ruleId) { + super(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java deleted file mode 100644 index 9ee97e0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.casic.missiles.parser.instance; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service -@Slf4j -@AllArgsConstructor -public class GeneralProcessor { - - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; - - /** - * 统一固定字段解析=>进行规则的查询的判断 - * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 - * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 - */ - @Deprecated - public boolean parseWholeDatagram(ByteBuf buffer, ProtocolConfig protocolConfig) { - try { - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap,protocolId); - //选取规则对应的流程= - DatagramEventConfig datagramEventConfig = processorSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); - //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); - //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); - //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); - //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); - //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); - return true; - } catch (Exception ex) { - log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", - ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); - return false; - } - } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; - } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); - } - - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); - return bizDataMap; - } - - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java index 25e7ad8..6a5777e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java @@ -1,23 +1,31 @@ package com.casic.missiles.parser.instance.impl; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.mapper.DatagramEventMapper; import com.casic.missiles.pojo.DatagramEventConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.SpringContextUtil; -@Service -@AllArgsConstructor +import java.util.List; +import java.util.Optional; + +/** + * @author cz + * + */ public class DefaultProcessorInstanceSelector implements ProcessorInstanceSelector { - private final DatagramEventMapper datagramEventMapper; + private static List datagramEventConfigs; + + static { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + datagramEventConfigs = datagramEventRegistry.getDatagramEventList(); + } @Override public DatagramEventConfig getProcessorInstance(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("rule_id", protocolId); - return datagramEventMapper.selectOne(queryWrapper); + Optional optionalSelectInstance = datagramEventConfigs.stream() + .filter(e -> e.getId().equals(protocolId)).limit(1).findFirst(); + return optionalSelectInstance.isPresent() ? optionalSelectInstance.get() : null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a778671..7b56a43 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,16 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import io.netty.buffer.ByteBuf; /** - * 分析匹配情况 - * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 - * 2、匹配不成功,有后续帧,可以进行下次匹配。 - * 3、匹配不成功,无后续帧,可以进行丢弃。 + * 分析匹配情况 + * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 + * 2、匹配不成功,有后续帧,可以进行下次匹配。 + * 3、匹配不成功,无后续帧,可以进行丢弃。 */ -public interface FrameStructMatcher{ +public interface FrameStructMatcher { - ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig); + ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 05320ab..8ebea78 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,23 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.ProtocolConfigMapper; +import com.casic.missiles.parser.provider.ProtocolConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Component; import java.util.List; import java.util.stream.Collectors; -@Component -@AllArgsConstructor public class LeadingCodeMatcher { - private final ProtocolConfigMapper protocolMapper; - //** 1、首字母匹配前导码, // 2、以匹配出的前导码是否在报文中条件进行前导码的匹配二次筛选 - public List matchLeadingCode(String protocolContent){ + public static List matchFrameLeadingCode(String protocolContent){ List initialConfigs = initialMatch(protocolContent); List preCodeConfigs = initialConfigs.stream() .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) @@ -26,13 +19,16 @@ } //初始化匹配前导码内容 - private List initialMatch(String protocolContent) { - String protocolStr = protocolContent.charAt(0) + ""; - QueryWrapper queryWrapper = new QueryWrapper() - .likeRight("pre_fix", protocolStr); - List protocolConfigList = protocolMapper.selectList(queryWrapper); - return protocolConfigList; + private static List initialMatch(String protocolContent) { + String firstFrameChar = protocolContent.charAt(0) + ""; + ProtocolConfigProvider protocolConfigProvider=new ProtocolConfigProvider(firstFrameChar); + return protocolConfigProvider.getMatchList(); } + + + + + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index cf2113d..e915877 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -1,32 +1,35 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(0) -@Service +@Component public class FrameLengthMatcher implements FrameStructMatcher { - @Autowired - private FieldParser fieldParser; - //超过长度 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { String dataGramContent = ByteBufUtil.hexDump(byteBuf); - if (StringUtils.isEmpty(protocolConfig.getUnpackId()) && StringUtils.isEmpty(protocolConfig.getTailStr())) { - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + //当不存在结尾标志和拆包标志,可以直接使用长度进行匹配 + if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { if (dataGramContent.length() >= totalLength) {//等于长度返回true,超出长度,切断 - ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, protocolConfig, totalLength); + ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, totalLength); return wholeDatagramByte; } else { //读的标志位前移舍弃 @@ -38,7 +41,7 @@ return null; } - private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, Integer totalLength) { byteBuf.readBytes(totalLength); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, totalLength - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 2bfc213..d527ad0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; @@ -13,7 +13,7 @@ import lombok.AllArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.nio.charset.Charset; import java.util.Map; @@ -22,32 +22,30 @@ * 后续标志验证 */ @Order(1) -@Service +@Component @AllArgsConstructor -public class FrameMarkMatcher implements FrameStructMatcher { - - private final FieldConfigDao fieldConfigDao; - private final FieldParser fieldParser; - private final FieldResolver fieldResolverManger; +public class FrameMarkMatcher implements FrameStructMatcher, FixedPropertyEnum { //帧后续标志=>结束,进行帧的重组=>有后续,1、帧移位判别 2、继续接收帧 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig UnpackConfig = StringUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getUnpackId()); - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); - Integer upback = 0; + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); ByteBuf mergeWholeFrameByte = null; - if (!ObjectUtil.isEmpty(UnpackConfig)) { - while (hasNextFullFrame(byteBuf, protocolConfig)) { - upback = (Integer) fieldResolverManger.filedParserManger(byteBuf, UnpackConfig, null); + if (!ObjectUtil.isEmpty(unpackFlag)) { + while (hasNextFullFrame(byteBuf, protocolConfig, protocolFieldConfigProvider)) { //是否存在后续位 - if (upback == 1) {//使用esayRule + if (unpackFlag == 1) {//使用esayRule //表示可以截取 - mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolConfig, totalLength); + mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolFieldConfigProvider, protocolConfig); return mergeWholeFrameByte; } else { - byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig)); + byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig, protocolFieldConfigProvider)); } } } @@ -56,7 +54,8 @@ //选取第一个帧,将业务内容和后面部分分开 //计算数据报文-业务内容 - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolFieldConfigProvider protocolFieldConfigProvider, ProtocolConfig protocolConfig) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); //截取完整报文 byteBuf.readBytes(totalLength); ByteBuf byteBufContent = byteBuf.slice(0, byteBuf.readerIndex()); @@ -68,15 +67,15 @@ String tail = ""; System.out.println(ByteBufUtil.hexDump(byteBufContent)); //会存在多个帧拼接在一起的的情况,进行合并处理 - while (hasNextFullFrame(byteBufContent, protocolConfig)) { - Integer currentFrameLength = fieldParser.getTotalLength(protocolConfig, byteBufContent); + while (hasNextFullFrame(byteBufContent, protocolConfig, protocolFieldConfigProvider)) { + Integer currentFrameLength = protocolFieldConfigProvider.getTotalLength(byteBufContent, protocolConfig); byteBufContent.readBytes(currentFrameLength); ByteBuf currentbyteBuf = byteBufContent.slice(0, byteBufContent.readerIndex()); byteBufContent.markReaderIndex();//读的标志位前移 System.out.println(ByteBufUtil.hexDump(byteBufContent)); String hexDump = currentbyteBuf.toString(Charset.forName("ISO-8859-1")); //获取当前固定帧结构的关系map - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, currentbyteBuf); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(currentbyteBuf, protocolConfig); if (StringUtils.isEmpty(mergeFrameStr)) { //首次获取业务数据报文 mergeFrameStr += hexDump.substring(0, currentFrameFixedProperty.get("tailPosition")); @@ -95,22 +94,22 @@ /** * 获取平移到下一帧起始位置 */ - public int getNextFrameOffset(ByteBuf buffer, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, buffer); - return currentFrameFixedProperty.get("totalLength"); + public int getNextFrameOffset(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + return currentFrameFixedProperty.get(TOTAL_LENGTH); } /** * 判断是否出错进行整个帧的 */ - public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, byteBuf); + public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); //保证读取位置不在固定位置,是可变的业务内容 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("fixedPosition")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(FIXED_POSITION)) { return false; } //判断读取是否操作帧长度 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("totalLength")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(TOTAL_LENGTH)) { return false; } return true; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 76a3784..c3a1bab 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -1,50 +1,50 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.parser.instance.GeneralProcessor; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; +import io.netty.buffer.ByteBufUtil;; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(2) -@Service +@Component public class FrameTailMatcher implements FrameStructMatcher { - @Resource - private FieldConfigDao fieldConfigDao; - @Autowired - private GeneralProcessor generalProcessor; - //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig tailFieldConfig = StringUtils.isEmpty(protocolConfig.getTailStr()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getTailStr()); - if (!ObjectUtil.isEmpty(tailFieldConfig)) { - String tailStr = tailFieldConfig.getFieldName(); + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfig protocolFieldConfig = ObjectUtils.isEmpty(protocolConfig.getTailStr()) ? null : + fieldConfigProvider.getFieldConfigById(protocolConfig.getTailStr()); + if (!ObjectUtil.isEmpty(protocolFieldConfig)) { + String tailStr = protocolFieldConfig.getFieldName(); String dataGramContent = ByteBufUtil.hexDump(byteBuf); Boolean tailFlag = ByteBufUtil.hexDump(byteBuf).contains(tailStr); if (!tailFlag) { //使用esayRule return null; } else if (dataGramContent.indexOf(tailStr) < dataGramContent.length() - tailStr.length()) { Integer length = dataGramContent.indexOf(tailStr) + tailStr.length(); - ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, protocolConfig, length); + ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, length); return wholeDatagramByte; //存在粘包 } } return null; } - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer length) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, Integer length) { byteBuf.readBytes(length); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, length - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java new file mode 100644 index 0000000..5f1c177 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java @@ -0,0 +1,73 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.combined.GenericCombinedFieldResolver; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.CombinedFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class CombinedFieldConfigProvider { + + + /** + * 作为临时配置列表缓存使用 + */ + private final List combinedFieldConfigList; + private Map storeObjectMap = new HashMap<>(); + + public CombinedFieldConfigProvider(Long ruleId) { + CombinedFieldConfigRegistry combinedFieldConfigRegistry = SpringContextUtil.getBean(CombinedFieldConfigRegistry.class); + combinedFieldConfigList = combinedFieldConfigRegistry.getCombinedFieldConfigList(ruleId); + } + + public void parseDataField(RuleConfig ruleConfig, String clearZeroPlain,Map fieldConfigsMap ) { + if (showSkip()) { + return; + } + //匹配对应的数据,然后进行相关的字段解析 + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver(); + combinedFieldResolver.parseDataField(combinedFieldConfigList, byteBuf, storeObjectMap,fieldConfigsMap); + } + + + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getCombinedFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return combinedFieldConfigList.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public List getCombinedFieldConfigList() { + return combinedFieldConfigList; + } + + /* 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(combinedFieldConfigList) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java new file mode 100644 index 0000000..f3cfedc --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java @@ -0,0 +1,11 @@ +package com.casic.missiles.parser.provider; + +/** + * @author cz + * @date 2023-6-12 + */ +public class CommandEventProvider{ + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java new file mode 100644 index 0000000..70eec5e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java @@ -0,0 +1,77 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.safe.SafeStrategy; +import com.casic.missiles.parser.sender.DataSubscribeProvider; +import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class DatagramEventProvider { + + private final DatagramEventConfig processorInstance; + + public DatagramEventProvider(Long ruleId) { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + List datagramEventConfigList = + datagramEventRegistry.getDatagramEventList(ruleId); + processorInstance = this.getProcessorInstance(datagramEventConfigList); + } + + public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { + if (showSkip()) { + return null; + } + return datagramEventConfigList.get(0); + } + + // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 + public String getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap) { + String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? + processorInstance.getSafeBean() : + fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); + if (!StringUtils.isEmpty(safeName)) { + //需要加密 + SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); + String plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); + return clearComplementZero(plain); + } + return ByteBufUtil.hexDump(bizDataContent); + } + + //解密清零操作 + private String clearComplementZero(String plain) { + plain = plain.substring(0, plain.lastIndexOf("00")); + return plain; + } + + //数据发送,数据发送者暂未构建 + public void storeData(Map bizDataMap) { + DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); +// dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return ObjectUtils.isNotEmpty(processorInstance) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java new file mode 100644 index 0000000..7e1fe0a --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java @@ -0,0 +1,97 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.FieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class FieldConfigProvider { + + + private final List fieldConfigs; + private Map storeObjectMap = new HashMap<>(); +// private Map singleObjects = new ConcurrentHashMap<>(); + + public FieldConfigProvider(Long ruleId) { + FieldConfigRegistry fieldConfigRegistry = SpringContextUtil.getBean(FieldConfigRegistry.class); + fieldConfigs = fieldConfigRegistry.getFieldConfigList(ruleId); + } + + public List getFieldConfigs() { + return fieldConfigs; + } + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public Map parseDataField(RuleConfig ruleConfig, String clearZeroPlain) { + if (showSkip()) { + return null; + } + List prepareFieldConfig = prepareParseField(ruleConfig); + if (CollectionUtils.isNotEmpty(prepareFieldConfig)) { + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(fieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + return fixDataMap; + } + } + return null; + } + + /** + * 得到需要处理的业务内容 + * + * @return + */ + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return fieldConfigs.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public Map getFieldConfigsMap() { + return fieldConfigs.stream().collect( + Collectors.toMap(FieldConfig::getId, e -> e) + ); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(fieldConfigs) ? false : true; + } + + +} + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java new file mode 100644 index 0000000..817bfaf --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java @@ -0,0 +1,19 @@ +package com.casic.missiles.parser.provider; + +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.registry.FieldRuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; + +public class FieldRuleConfigProvider { + + private final List fieldRuleConfigList; + + public FieldRuleConfigProvider(Long ruleId) { + FieldRuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(FieldRuleConfigRegistry.class); + fieldRuleConfigList = ruleConfigRegistry.getFieldRuleConfigList(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java new file mode 100644 index 0000000..99a1b06 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java @@ -0,0 +1,53 @@ +package com.casic.missiles.parser.provider; + + +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.registry.ProtocolConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolConfigProvider { + + private final List protocolConfigList; + + public ProtocolConfigProvider(String firstChar) { + ProtocolConfigRegistry registry = SpringContextUtil.getBean(ProtocolConfigRegistry.class); + protocolConfigList = registry.getProtocolConfigList(firstChar); + } + + public List getMatchList() { + return protocolConfigList; + } + + /** + * 设置当前协议 + * + * @param protocolConfig + */ + public ProtocolConfigProvider(ProtocolConfig protocolConfig) { + List protocolConfigs = new ArrayList<>(); + protocolConfigs.add(protocolConfig); + protocolConfigList = protocolConfigs; + } + + /** + * 获取当前协议 + * + * @return + */ + public ProtocolConfig getCurrentProtocolConfig() { + if (this.protocolConfigList == null) { + return null; + } else { + return protocolConfigList.get(0); + } + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java new file mode 100644 index 0000000..043927d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java @@ -0,0 +1,213 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.registry.ProtocolFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolFieldConfigProvider { + + private static final String FIXED_FIELD_DS = "fixedFieldDs"; + private static final String CONTENT_FIELD_DS = "contentFieldDs"; + private static final String PROTOCOL_LENGTH = "protocolLength"; + private static final String PROTOCOL_FIELD_ID = "protocolFieldId"; + private static final String PROTOCOL_POSITION = "protocolPosition"; + + private final List protocolFieldConfigs; + private Map singleObjects = new ConcurrentHashMap<>(); + private Map storeObjectMap = new HashMap<>(); + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public ProtocolFieldConfigProvider(Long protocolId) { + ProtocolFieldConfigRegistry protocolFieldConfigRegistry = SpringContextUtil.getBean(ProtocolFieldConfigRegistry.class); + protocolFieldConfigs = protocolFieldConfigRegistry.getProtocolFieldConfigList(protocolId); + } + + public List getProtocolFieldConfigs() { + return protocolFieldConfigs; + } + + public ProtocolFieldConfig getFieldConfigById(Long fieldId) { + Optional optionalConfig = protocolFieldConfigs.stream().filter( + e -> e.getId().equals(fieldId) + ).findFirst(); + return optionalConfig.isPresent() ? optionalConfig.get() : null; + } + + public Integer getProtocolFieldValue(Long protocolFieldId, ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_FIELD_ID + protocolFieldId + ByteBufUtil.hexDump(byteBuf); + //获取缓存 + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + //加载固定长度数据集合 + Map fixDataMap = this.getProtocolDataMap(byteBuf); + ProtocolFieldConfig protocolFieldConfig = selectFieldConfig(protocolFieldId); + Integer protocolFieldValue = 0; + //获取约定字段的总长度 + if (fixDataMap.containsKey(protocolFieldConfig.getFieldName())) { + Object appointUnpackObject = fixDataMap.get(protocolFieldConfig.getFieldName()); + if (ObjectUtils.isNotEmpty(appointUnpackObject)) { + protocolFieldValue = (Integer) appointUnpackObject; + } + } + if (protocolFieldValue != null) { + //加入缓存 + if (ObjectUtils.isNotEmpty(protocolFieldValue)) { + this.singleObjects.put(catchKey, protocolFieldValue); + return protocolFieldValue; + } + } + return null; + } + + /** + * 获取帧固定位置信息 + * + * @param byteBuf + * @param protocolConfig + * @return + */ + public Map getFixedProperty(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_POSITION + protocolConfig.getId(); + if (this.singleObjects.containsKey(catchKey)) { + return (Map) singleObjects.get(catchKey); + } + Map fixedPropertyMap = new HashMap<>(); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + fixedPropertyMap = fieldParser.doGetFixedProperty(protocolFieldConfigs, this.getTotalLength(byteBuf,protocolConfig)); + if (CollectionUtils.isNotEmpty(fixedPropertyMap)) { + this.singleObjects.put(catchKey, fixedPropertyMap); + return fixedPropertyMap; + } + return fixedPropertyMap; + } + + /** + * 获取帧结构应有的总长度 + */ + public Integer getTotalLength(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_LENGTH + ByteBufUtil.hexDump(byteBuf); + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + Integer appointFrameLength = getProtocolFieldValue(protocolConfig.getTotalLengthId(), byteBuf); + if (appointFrameLength != null) { + //获取过滤的字段集合总长度 + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Integer totalFilterLength = fieldParser.getTotalFilterLength(protocolConfig, byteBuf, getFixFieldConfigMap()); + //计算总长度 + Integer totalLength = appointFrameLength + totalFilterLength; + //加入缓存 + if (ObjectUtils.isNotEmpty(totalLength)) { + this.singleObjects.put(catchKey, totalLength); + return totalLength; + } + } + return null; + } + + /** + * 获取协议有关字段解析内容 + * storeObjectMap存储代转存的数据 + * + * @return + */ + public Map getProtocolDataMap(ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(FIXED_FIELD_DS)) { + return (Map) singleObjects.get(FIXED_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(protocolFieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + this.singleObjects.put(FIXED_FIELD_DS, fixDataMap); + return fixDataMap; + } + return null; + } + + /** + * 获取业务报文内容的content字节 + * + * @param wholeDatagramByte + * @return + */ + public ByteBuf getDataContentBuf(ByteBuf wholeDatagramByte) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(CONTENT_FIELD_DS)) { + return (ByteBuf) singleObjects.get(CONTENT_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + ByteBuf bizDataByteBuf = fieldParser.getDataContentBuf(protocolFieldConfigs, wholeDatagramByte); + if (bizDataByteBuf != null) { + this.singleObjects.put(CONTENT_FIELD_DS, bizDataByteBuf); + return bizDataByteBuf; + } + return null; + } + + + private ProtocolFieldConfig selectFieldConfig(Long id) { + Optional optionalProtocolFieldConfig = this.protocolFieldConfigs.stream().filter( + e -> e.getId().equals(id) + ).findFirst(); + return optionalProtocolFieldConfig.isPresent() ? optionalProtocolFieldConfig.get() : null; + } + + + private Map getFixFieldConfigMap() { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, e -> e) + ); + return fixDataFieldMap; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(protocolFieldConfigs) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java new file mode 100644 index 0000000..dafba1c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java @@ -0,0 +1,56 @@ +package com.casic.missiles.parser.provider; + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.rule.GenericRuleResolver; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.RuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleConfigProvider { + + private final List ruleConfigs; + + public List getRuleConfigs() { + return ruleConfigs; + } + + public RuleConfigProvider(Long protocolId) { + RuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(RuleConfigRegistry.class); + ruleConfigs = ruleConfigRegistry.getRuleConfigById(protocolId); + } + + /** + * 获取规则匹配结果 + * + * @param parseFixedDataMap + * @param protocolFieldConfigs + * @return + */ + public RuleConfig doGetRule(Map parseFixedDataMap, + String ids, + List protocolFieldConfigs) { + if (showSkip()) { + return null; + } + RuleConfig ruleConfig = GenericRuleResolver.machRule(parseFixedDataMap, ids, protocolFieldConfigs, ruleConfigs); + return ruleConfig; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(ruleConfigs) ? false : true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java index 3c05891..856b399 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java @@ -1,18 +1,11 @@ package com.casic.missiles.parser.resolver; -import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.springframework.web.bind.annotation.RequestBody; -import javax.annotation.Resource; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -20,19 +13,17 @@ @Slf4j public class ByteMergeProvider { - @Resource - private FieldRuleEngineMapper fieldRuleEngineMapper; - //拿到所有的值合并到一个值 - public String resolveByteMerge(List valueList, String ruletypeId, String vaildRange) { + public static String resolveByteMerge(List valueList, String ruleTypeId, String vaildRange) { String values = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Map vaildMap = getValidRangeMap(vaildRange); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(ruletypeId); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } + //暂时不处理 +// fieldRuleEngine = fieldRuleConfigMapper.selectById(ruleTypeId); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } Map env2 = new HashMap(); for (int i = 0; i < valueList.size(); i++) { if (vaildMap.containsKey(i)) { @@ -47,7 +38,7 @@ } } - private Map getValidRangeMap(String vaildRange) { + private static Map getValidRangeMap(String vaildRange) { String[] range = vaildRange.split(","); Map vaildMap = new HashMap(); for (int i = 0; i < range.length; i++) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 8d821cd..85d6bbf 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -1,9 +1,12 @@ package com.casic.missiles.parser.resolver; +import com.casic.missiles.pojo.AbstractFieldConfig; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; import io.netty.buffer.ByteBuf; +import java.util.List; import java.util.Map; /** @@ -11,18 +14,14 @@ */ public interface FieldParser { -// Map fieldProcess(String protocolContent,); - Map dataParser(RuleConfig ruleConfig, String lightText,String protocolId); + Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength); - Map fixDataParser(String protocolId, ByteBuf buffer); + Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap); - Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf); + ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer); - ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer); - - ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer); - - Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer); + Integer getTotalFilterLength(ProtocolConfig protocolConfig, ByteBuf byteBuf, Map protocolFieldConfigMap); } + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java new file mode 100644 index 0000000..9e0c00e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java @@ -0,0 +1,52 @@ +package com.casic.missiles.parser.resolver; + +import com.casic.missiles.pojo.AbstractFieldConfig; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.util.List; + +public class FieldParserSupport { + + //分别计算bit和byte长度=> 合并长度 + protected Integer calculateLength(List fieldConfigList) { + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + Integer fixedLength = bytefixedLength + bitfixedLength / 8; + return fixedLength; + } + + //找到最大值=> 根据最大值计算业务数据下标 + protected Integer calculatePosition(List fieldConfigList) { + String rex = "[0-9]+"; + Integer max = -1; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) + && Integer.valueOf(fieldConfig.getOriginPositionByte()) > max) { + max = Integer.valueOf(fieldConfig.getOriginPositionByte()); + } + } + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) && fieldConfig.getOriginPositionByte().equals(max)) { + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + } + } + Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; + return maxFixedPosition; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java deleted file mode 100644 index dd3a6cd..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java +++ /dev/null @@ -1,170 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.ByteResolverParam; -import io.netty.buffer.ByteBuf; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -/** - * 字段解析管理总类 - */ -@Service -@Slf4j -@AllArgsConstructor -public class FieldResolver extends ByteMergeProvider { - - //1、字段截取 => 2、简单的字节解析和复杂的字节解析 - public Object filedParserManger(ByteBuf byteBuf, FieldConfig fieldConfig, Integer maxFixedPosition) { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - //最大固定位置不为空, - if (!ObjectUtil.isEmpty(maxFixedPosition)) { - orignPosition -= maxFixedPosition; - } - Object fieldValue = 0; - //待优化 - if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { - fieldValue = bitToResolver(byteBuf, fieldConfig); - } else { - ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); - fieldValue = parsingFields(fieldBytes, fieldConfig.getRuleJson()); - } - return fieldValue; - } - - //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, - //目前默认配置的规则设置暂不支持配置化,由实现完成 - private Object parsingFields(ByteBuf byteBuf, String ruleJson) { - Object fieldsResolveValue = null; - List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); - if (ObjectUtil.isEmpty(ruleMapList)) { - fieldsResolveValue = defaultResolveBuilder(byteBuf); - } else { - fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); - } - return fieldsResolveValue; - } - - private Object defaultResolveBuilder(ByteBuf byteBuf) { - Integer defaultResolveValue = 0; - for (int i = 0; i < byteBuf.writerIndex(); i++) { - defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; - } - return defaultResolveValue; - } - - //字段解析构建器(针对字节单位的) - //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 - // 字节归并结束或者规则结束=>继续根据规则进行判断 - private Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { - Object customizeResolveValue = null; - try { - List bytStrList = new ArrayList<>(); - //存放到数组里面 - for (int i = 0; i < byteBuf.writerIndex(); i++) { - bytStrList.add(byteBuf.readByte()); - } - int i = 0; - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - customizeResolveValue = this.resolveByteMerge(bytStrList, ruletypeId,vaildRange); - break; - } else { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - List tempBytStr = new ArrayList<>(); - for (int k = 0; i < bytStrList.size(); i++) { - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(k) - .value(bytStrList.get(k)) - .ruletypeId(ruletypeId).build(); - tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); - } - bytStrList = tempBytStr; - } - i++; - } - //字节归并到一起=>继续根据规则进行判断 - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(customizeResolveValue) - .ruletypeId(ruletypeId).build(); - customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(customizeResolveValue)); - return customizeResolveValue; - } catch (RuntimeException ex) { - log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); - return null; - } - } - - /** - * 1、单个字节情况表示字段 - * 2、多字节情况表示字段(暂未处理) - */ - private Object bitToResolver(ByteBuf byteBuf, FieldConfig fieldConfig) { - Object fieldValue = new Object(); - try { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - byte fields = 0x00; - if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); - } else { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); - } - - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { - if (!StringUtils.isEmpty(fieldConfig.getExactOrignPosition())) { - fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getExactOrignPosition())).byteValue() - >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); - } else { - fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); - } - } else { - fieldValue = Integer.valueOf(fields & 0xff); - } - if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { - return fieldValue; - } - List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); - int i = 0; - //字节归并到一起=>继续根据规则进行判断 - while (i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(fieldValue) - .ruletypeId(ruletypeId).build(); - fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(fieldValue)); - return fieldValue; - } catch (RuntimeException ex) { - log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); - return null; - } - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java new file mode 100644 index 0000000..1d2aeab --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java @@ -0,0 +1,36 @@ +package com.casic.missiles.parser.resolver.bytes; + +import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.mapper.FieldRuleConfigMapper; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.pojo.ByteResolverParam; +import com.googlecode.aviator.AviatorEvaluator; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; +//转换规则 +@Component("convert") +@AllArgsConstructor +@Slf4j +public class ByteRuleResolver implements ByteResolver { + + private final FieldRuleConfigMapper fieldRuleConfigMapper; + + @Override + public Object resolveOperationRule(ByteResolverParam byteResolverParam){ + FieldRuleConfig fieldRuleEngine=fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); + if(ObjectUtil.isEmpty(fieldRuleEngine)){ + return byteResolverParam.getValue(); + } + String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); + Map env2 = new HashMap(); + env2.put("value", (byte) byteResolverParam.getValue()); + String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); + return values; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java index 103821c..786b71c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java @@ -2,34 +2,34 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("logicalShift") +@Component("logicalShift") @AllArgsConstructor @Slf4j public class LogicalShiftResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //字节位移 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { Integer index = byteResolverParam.getIndex(); - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return byteResolverParam.getValue(); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java index 476747d..01149bd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("operation") +@Component("operation") @AllArgsConstructor @Slf4j public class OperationResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //混合运算,有常量或者乘除的缩放 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java index 0b82cf4..79abcce 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.casic.missiles.pojo.ByteResolverParam; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; //精度计算 -@Service("precision") +@Component("precision") @AllArgsConstructor @Slf4j public class PrecisionResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java deleted file mode 100644 index 5c3f332..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; -//转换规则 -@Service("convert") -@AllArgsConstructor -@Slf4j -public class RuleResolver implements ByteResolver { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam){ - RuleEvaluator fieldRuleEngine=fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); - if(ObjectUtil.isEmpty(fieldRuleEngine)){ - return byteResolverParam.getValue(); - } - String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); - Map env2 = new HashMap(); - env2.put("value", (byte) byteResolverParam.getValue()); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java new file mode 100644 index 0000000..d3bbd91 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java @@ -0,0 +1,15 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; + +import java.util.List; +import java.util.Map; +// 前导码匹配->长度字段 +public interface AbstractCombinedFieldProcessor { + + Map invoke(Map map, ByteBuf byteBuf, List combinedFieldConfigList, + Map fieldConfigsMap, Map storeObjectMap); + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java new file mode 100644 index 0000000..03c8480 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java @@ -0,0 +1,59 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-13 + */ +//依次递增进行数据的解析, +public class GenericCombinedFieldResolver { + + + //通过查询,字段长度长度随机 + public void parseDataField(List combinedFieldConfigList, ByteBuf byteBuf, + Map storeObjectMap, Map fieldConfigsMap) { + Integer frameLength = Integer.valueOf(ByteBufUtil.hexDump(byteBuf)); + //添加前置处理器 + com.casic.missiles.util.ClassUtil classUtil = new com.casic.missiles.util.ClassUtil(); + List abstractCombinedProcessors = classUtil.getSubClassList(AbstractCombinedFieldProcessor.class); + + Map fieldFixedMap = combinedFieldLeadCodeMap(combinedFieldConfigList); + //frameLength + Map combinedProcessorFields = null; + while (byteBuf.readableBytes() < frameLength) { + //一直处理 + for (AbstractCombinedFieldProcessor abstractCombinedProcessor : abstractCombinedProcessors) { + combinedProcessorFields = abstractCombinedProcessor.invoke(combinedProcessorFields, byteBuf, + combinedFieldConfigList, + fieldConfigsMap, storeObjectMap); + if (combinedProcessorFields == null || byteBuf.readableBytes() < frameLength) { + return; + } + } + + } + } + + /** + * 取出前导码匹配集合 + */ + private Map combinedFieldLeadCodeMap(List combinedFieldConfigList) { + Map fieldFixedMap = combinedFieldConfigList + .stream() + .collect(Collectors.toMap(CombinedFieldConfig::getPrefixCode, e -> e)); + return fieldFixedMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java index 608af3a..32cc8a4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java @@ -2,48 +2,47 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.delivery.decorator.ByteDecorator; +import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @AllArgsConstructor public class FieldDecoratorManger { - private final RuleDictDao ruleDictDao; + private final RuleConfigRegistry ruleDictDao; // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 // (1)静态的业务字段是字典里面可以配置的 // (2)动态的业务字段是通过规则生成的 public String contentMerge(String ruleJson, String sceneConent, String dynamicContent) { - List ruleDictList = ruleDictDao.getRuleDictConfig(); - Map ruleDictMap = ruleDictList.stream().collect( - Collectors.toMap(RuleDict::getId, e -> e)); - List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); - for (Map ruleMap : ruleMapList) { - String ruleType = String.valueOf(ruleMap.get("ruleType")); - ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); - NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); - byteDecorator.nodeDecoratorRule(nodeDecoratorParm); - } +// List ruleDictList = ruleDictDao.getRuleDictConfig(); +// Map ruleDictMap = ruleDictList.stream().collect( +// Collectors.toMap(RuleDict::getId, e -> e)); +// List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); +// for (Map ruleMap : ruleMapList) { +// String ruleType = String.valueOf(ruleMap.get("ruleType")); +// ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); +// NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); +// byteDecorator.nodeDecoratorRule(nodeDecoratorParm); +// } return null; } - - private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { - NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() - .contents(sceneConent) - .dynamicContent(dynamicContent) - .ruletypeId(ruletypeId) - .ruleDictMap(ruleDictMap) - .build(); - return nodeDecoratorParm; - } +// +// private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { +// NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() +// .contents(sceneConent) +// .dynamicContent(dynamicContent) +// .ruletypeId(ruletypeId) +// .ruleDictMap(ruleDictMap) +// .build(); +// return nodeDecoratorParm; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java index 652970c..b204ac3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java @@ -1,56 +1,56 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@AllArgsConstructor -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", - JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Component; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Component("logicalDecorator") +//@AllArgsConstructor +//@Slf4j +//public class LogicalShiftDecorator implements ByteDecorator { +// +//// private final FieldRuleEngineMapper fieldRuleEngineMapper; +//// +//// //字节位移 +//// @Override +//// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +//// String logicalValue = ""; +//// RuleEvaluator fieldRuleEngine = new RuleEvaluator(); +//// try { +//// Map env2 = new HashMap(); +//// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +//// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +//// for (String contentId : contentIdList) { +//// RuleDict ruleDict = ruleDictMap.get(contentId); +//// if (ruleDict.getCode().contains("#")) { +//// //使用动态的值 +//// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +//// } +//// env2.put(ruleDict.getName(), ruleDict.getCode()); +//// } +//// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +//// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +//// return null; +//// } +//// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +//// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +//// return values; +//// } catch (Exception ex) { +//// log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", +//// JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +//// return null; +//// } +//// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java index 346468f..822fead 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@AllArgsConstructor -@Slf4j -public class OperationDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("optionDecorator") +//@AllArgsConstructor +//@Slf4j +//public class OperationDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //混合运算,有常量或者乘除的缩放 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java index 50fb0a7..7a8bccb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@AllArgsConstructor -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +////精度计算 +//@AllArgsConstructor +//@Registry("precisionDecorator") +//@Slf4j +//public class PrecisionDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java index da39235..27f9cc7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java @@ -1,54 +1,53 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@AllArgsConstructor -@Slf4j -public class RuleDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("ruleDecorator") +//@AllArgsConstructor +//@Slf4j +//public class RuleDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //吃我一套正则表达式 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (Exception ex) { +// log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java index 7f5cbf3..c043f97 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java @@ -2,6 +2,6 @@ import java.util.Map; -public interface ComandeEventService { +public interface ComandeEventService{ Map loadComandeEventConfig(String protocolId,String scene); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java index 476ad84..aaf1837 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java @@ -2,46 +2,46 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.dao.CommandEventDao; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @Slf4j @AllArgsConstructor -public class ComandeEventServiceImpl implements ComandeEventService { +public class ComandeEventServiceImpl implements ComandeEventRegistry { - private final CommandEventDao commandEventDao; + // private final CommandEventDao commandEventDao; // 加密bean 固定字段出现变化的字段解析,业务字段的有序内容 @Override - public Map loadComandeEventConfig(String protocolId,String sceneName) { - CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); - if (ObjectUtil.isEmpty(commandEventConfig)) { - log.error("协议{},没有配置成功接收回复配置,清排查原因"); - return null; - } - String replyJson = commandEventConfig.getReplyContentJson(); - List> replyMapList = JSONArray.parseObject(replyJson, List.class); - List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); - Map fixMap = fixList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); - List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) - .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) - .collect(Collectors.toList()); - Map commandConfigMap = new HashMap<>(); - commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); - commandConfigMap.put("fixContent", fixMap); - commandConfigMap.put("bizContent", contentList); - return commandConfigMap; + public Map loadComandeEventConfig(String protocolId, String sceneName) { +// CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); +// if (ObjectUtil.isEmpty(commandEventConfig)) { +// log.error("协议{},没有配置成功接收回复配置,清排查原因"); +// return null; +// } +// String replyJson = commandEventConfig.getReplyContentJson(); +// List> replyMapList = JSONArray.parseObject(replyJson, List.class); +// List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); +// Map fixMap = fixList.stream() +// .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); +// List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) +// .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) +// .collect(Collectors.toList()); +// Map commandConfigMap = new HashMap<>(); +// commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); +// commandConfigMap.put("fixContent", fixMap); +// commandConfigMap.put("bizContent", contentList); +// return commandConfigMap; + return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 128b09d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java deleted file mode 100644 index 4016b0b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface DatagramEventMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java deleted file mode 100644 index 597c306..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.apache.ibatis.annotations.Mapper; - -public interface FieldConfigMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java deleted file mode 100644 index a31680a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.PreRuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface PreRuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java deleted file mode 100644 index 9060a69..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface ProtocolConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java deleted file mode 100644 index 6fa6936..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java deleted file mode 100644 index 582a705..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleDict; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleDictMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java deleted file mode 100644 index 6e302c8..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.CommandEventMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Optional; - -@Component -public class CommandEventDao { - - @Resource - private CommandEventMapper commandEventMapper; - - public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId) - .eq("scene", sceneName) - .eq("enabled", 1); - List commandEventConfig = commandEventMapper.selectList(queryWrapper); - Optional optionalEventConfig = commandEventConfig.stream().findFirst(); - return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java deleted file mode 100644 index 9137e4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.FieldConfigMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class FieldConfigDao { - - @Resource - private FieldConfigMapper fieldConfigMapper; - - public FieldConfig getFieldConfigById(String fieldId) { - FieldConfig fieldConfig = fieldConfigMapper.selectById(fieldId); - return fieldConfig; - } - - public List getFieldConfigs(String protocolId,Integer isFixed) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",isFixed); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - - public List getStorageFieldConfig(String protocolId) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",1) - .eq("is_storage",1); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java deleted file mode 100644 index 67bff6b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.mapper.PreRuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class PreRuleConfigDao { - - @Resource - private PreRuleConfigMapper preRuleConfigMapper; - - public List getPreRuleList(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return preRuleConfigMapper.selectList(queryWrapper); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java deleted file mode 100644 index d69ea85..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.RuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleConfigDao { - - @Resource - private RuleConfigMapper ruleConfigMapper; - - public RuleConfig getNextRuleConfig(String ruleFields) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("parse_rule_json", ruleFields); - return ruleConfigMapper.selectOne(queryWrapper); - } - - - public List getRuleConfigById(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return ruleConfigMapper.selectList(queryWrapper); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java deleted file mode 100644 index 932c185..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.RuleDictMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleDictDao { - - @Resource - private RuleDictMapper ruleDictMapper; - - public List getRuleDictConfig() { - List ruleDictList = ruleDictMapper.selectList(null); - return ruleDictList; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java index 9f9e279..43bc4d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java @@ -10,20 +10,15 @@ import io.netty.channel.socket.nio.NioServerSocketChannel; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import javax.annotation.PreDestroy; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static cn.hutool.core.util.ClassUtil.getClasses; /** * SensorhubServer netty服务端 */ @Slf4j -@Service +@Component public class SensorhubServer { /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java index 2c79ff5..9a28c36 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java @@ -11,13 +11,13 @@ import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioSocketChannel; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClient 客户端 */ @Slf4j -@Service +@Registry public final class SensorhubClient { public static void main(String[] args) throws Exception { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java index 9774be0..477c3f7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java @@ -6,12 +6,12 @@ import io.netty.channel.socket.SocketChannel; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientChannelInitialHandler */ -@Service +@Registry public class SensorhubClientChannelInitialHandler extends ChannelInitializer { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java index 346f4b3..73560e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java @@ -5,13 +5,13 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientHandler */ @Slf4j -@Service +@Registry public class SensorhubClientHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java index 5c1c6f2..d990af5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java @@ -4,12 +4,12 @@ import com.casic.missiles.pojo.Msg; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** * SensorhubServerHandler */ -@Service +@Component public class SensorhubServerHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 67283ae..af3172c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,41 +1,37 @@ package com.casic.missiles.parser; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultProtocolConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.*; +import com.casic.missiles.registry.FieldConfigRegistry; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; -import java.nio.charset.Charset; import java.util.HashMap; import java.util.List; import java.util.Map; -@Service("genericProtocolParser") +/** + * @author + */ +@Component("genericProtocolParser") @Slf4j -@AllArgsConstructor +@RequiredArgsConstructor public class GenericProtocolParser implements ProtocolParser { - private final LeadingCodeMatcher leadingCodeMatcher; private final List frameStructDispenserList; - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorInstanceSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; // 匹配首字母前导码=> 帧结构匹配前导码=> // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 @@ -44,18 +40,19 @@ public Boolean doParseProtocol(ByteBuf byteBuf) { String protocolContent = ByteBufUtil.hexDump(byteBuf); //匹配前导码 - List preCodeConfigs = leadingCodeMatcher.matchLeadingCode(protocolContent); + List preCodeConfigs = LeadingCodeMatcher.matchFrameLeadingCode(protocolContent); //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 if (preCodeConfigs.size() == 0) { - return rematch(byteBuf,protocolContent); + return rematch(byteBuf, protocolContent); } - //暂时先取第一个 + //暂时先取第一个,提升速度,使用享元模式, 减少类的创建销毁与构建 ProtocolConfig protocolConfig = preCodeConfigs.get(0); + AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); ByteBuf wholeDatagramByte = null; //通过匹配帧结构获取完整的数据包 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, preCodeConfigs.get(0))) != null) { + if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, protocolFactory)) != null) { break; } } @@ -68,76 +65,78 @@ * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 */ - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId, wholeDatagramByte); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap, protocolId); - //选取规则对应的流程实例 - DatagramEventConfig datagramEventConfig = processorInstanceSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); + //进行规则字段解析,进行匹配规则 + RuleConfig ruleConfig = getRuleConfig(protocolFactory, wholeDatagramByte); + if (ruleConfig == null) { + return false; + } //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, wholeDatagramByte); + ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte); + //以下进行业务的规则解析,同时选定流程实例 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); + DatagramEventProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain, + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText, protocolId); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain); //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); + datagramEventProvider.storeData(bizDataMap); return true; } - private Boolean rematch(ByteBuf byteBuf,String protocolContent) { + /** + * 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 + */ + private Boolean rematch(ByteBuf byteBuf, String protocolContent) { //重置位判断 byteBuf.resetReaderIndex(); //判断重置是否前移,如果没有前移,则直接判为匹配失败 if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { return false; } else { + //递归执行 return doParseProtocol(byteBuf); } } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; + //获取匹配规则->匹配规则 + private RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + //取出其中参与逻辑provider并判空 + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); + String rulePrepareFields = protocolConfig.getRulePrepareFields(); + //固定字段 + if (StringUtils.isNotEmpty(rulePrepareFields)) { + //获取统一固定字段解析 + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + //获取该协议的字段配置,用于协议规则匹配 + List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); + //获取规则 + RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, + rulePrepareFields, protocolFieldConfigs); + return ruleConfig; + } + return null; } - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + //数据构建,获取固定字段的store和业务字段store + private Map buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + Map bizDataMap = new HashMap<>(); + Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); + Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); + bizDataMap.putAll(ruleStoreObjectMap); + bizDataMap.putAll(protocolStoreObjectMap); return bizDataMap; } - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java index 8a46e32..16ce2e5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java @@ -3,6 +3,7 @@ import io.netty.buffer.ByteBuf; public interface ProtocolParser { + Boolean doParseProtocol(ByteBuf byteBuf); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java new file mode 100644 index 0000000..f7814af --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java @@ -0,0 +1,35 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.ProtocolConfigProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.ProtocolConfig; + +/** + * 存放基本协议的的加载信息 + */ +public class AbstractProtocolConfigFactory { + private final ProtocolConfigProvider protocolConfigProvider; + private final ProtocolFieldConfigProvider protocolFieldConfigProvider; + private final RuleConfigProvider ruleConfigProvider; + + public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { + this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); + this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); + this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); + } + + public ProtocolConfigProvider getProtocolConfigProvider() { + return protocolConfigProvider; + } + + public ProtocolFieldConfigProvider getProtocolFieldConfigProvider() { + return protocolFieldConfigProvider; + } + + public RuleConfigProvider getRuleConfigProvider() { + return ruleConfigProvider; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java new file mode 100644 index 0000000..6e36147 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java @@ -0,0 +1,57 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.CombinedFieldConfigProvider; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.FieldConfigProvider; +import com.casic.missiles.parser.provider.FieldRuleConfigProvider; + +/** + * 存放规则相关的的的加载信息 + */ +public class AbstractRuleConfigFactory { + + /** + * 处理字节 + */ + private final FieldConfigProvider fieldConfigProvider; + /** + * 处理组合字节解析的解码器 + */ + private final CombinedFieldConfigProvider combinedFieldConfigProvider; + /** + * 处理负责字节解析的规则配置 + */ + private final FieldRuleConfigProvider fieldRuleConfigProvider; + /** + * 处理实例流程 + */ + private final DatagramEventProvider datagramEventProvider; + + + public AbstractRuleConfigFactory(Long ruleId) { + this.fieldConfigProvider = new FieldConfigProvider(ruleId); + this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); + this.fieldRuleConfigProvider = new FieldRuleConfigProvider(ruleId); + this.datagramEventProvider = new DatagramEventProvider(ruleId); + } + + public FieldConfigProvider getFieldConfigProvider() { + return fieldConfigProvider; + } + + public CombinedFieldConfigProvider getCombinedFieldConfigProvider() { + return combinedFieldConfigProvider; + } + + public FieldRuleConfigProvider getFieldRuleConfigProvider() { + return fieldRuleConfigProvider; + } + + public DatagramEventProvider getDatagramEventProvider() { + return datagramEventProvider; + } + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java deleted file mode 100644 index 6e1719a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.factory; - - -import com.casic.missiles.pojo.ProtocolConfig; - -import java.util.List; - -/** - * 数据库访问优化(暂时未做) - *

- * 1、初始化协议解析配置,并存放到处存放缓存,对协议基本配置进行管理 - * 2、其中流程中所有的配置都经过此类进行管理,进行调用获取,增强解析速度 - */ -public interface DatagramFactory { - - /** - * 初始化 - */ - List datagramInit(); - - /** - * 根据前导码配置匹配,模糊匹配获取所有的报文项 - */ - List match(); - - /** - * 根据前导码匹配,返回报文项 - */ - List filer(); - - /** - * 保证数据的唯一性选择器 - */ - List selectOne(); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java new file mode 100644 index 0000000..87444a0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java @@ -0,0 +1,18 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +import java.util.List; + +/** + * 直接用,还是边用边创建 + */ +public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { + + + public DefaultProtocolConfigFactory(ProtocolConfig protocolConfig) { + super(protocolConfig); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java new file mode 100644 index 0000000..cce0c7c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java @@ -0,0 +1,12 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; + +public class DefaultRuleFactory extends AbstractRuleConfigFactory { + + public DefaultRuleFactory(Long ruleId) { + super(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java deleted file mode 100644 index 9ee97e0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.casic.missiles.parser.instance; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service -@Slf4j -@AllArgsConstructor -public class GeneralProcessor { - - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; - - /** - * 统一固定字段解析=>进行规则的查询的判断 - * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 - * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 - */ - @Deprecated - public boolean parseWholeDatagram(ByteBuf buffer, ProtocolConfig protocolConfig) { - try { - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap,protocolId); - //选取规则对应的流程= - DatagramEventConfig datagramEventConfig = processorSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); - //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); - //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); - //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); - //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); - //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); - return true; - } catch (Exception ex) { - log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", - ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); - return false; - } - } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; - } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); - } - - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); - return bizDataMap; - } - - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java index 25e7ad8..6a5777e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java @@ -1,23 +1,31 @@ package com.casic.missiles.parser.instance.impl; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.mapper.DatagramEventMapper; import com.casic.missiles.pojo.DatagramEventConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.SpringContextUtil; -@Service -@AllArgsConstructor +import java.util.List; +import java.util.Optional; + +/** + * @author cz + * + */ public class DefaultProcessorInstanceSelector implements ProcessorInstanceSelector { - private final DatagramEventMapper datagramEventMapper; + private static List datagramEventConfigs; + + static { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + datagramEventConfigs = datagramEventRegistry.getDatagramEventList(); + } @Override public DatagramEventConfig getProcessorInstance(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("rule_id", protocolId); - return datagramEventMapper.selectOne(queryWrapper); + Optional optionalSelectInstance = datagramEventConfigs.stream() + .filter(e -> e.getId().equals(protocolId)).limit(1).findFirst(); + return optionalSelectInstance.isPresent() ? optionalSelectInstance.get() : null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a778671..7b56a43 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,16 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import io.netty.buffer.ByteBuf; /** - * 分析匹配情况 - * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 - * 2、匹配不成功,有后续帧,可以进行下次匹配。 - * 3、匹配不成功,无后续帧,可以进行丢弃。 + * 分析匹配情况 + * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 + * 2、匹配不成功,有后续帧,可以进行下次匹配。 + * 3、匹配不成功,无后续帧,可以进行丢弃。 */ -public interface FrameStructMatcher{ +public interface FrameStructMatcher { - ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig); + ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 05320ab..8ebea78 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,23 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.ProtocolConfigMapper; +import com.casic.missiles.parser.provider.ProtocolConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Component; import java.util.List; import java.util.stream.Collectors; -@Component -@AllArgsConstructor public class LeadingCodeMatcher { - private final ProtocolConfigMapper protocolMapper; - //** 1、首字母匹配前导码, // 2、以匹配出的前导码是否在报文中条件进行前导码的匹配二次筛选 - public List matchLeadingCode(String protocolContent){ + public static List matchFrameLeadingCode(String protocolContent){ List initialConfigs = initialMatch(protocolContent); List preCodeConfigs = initialConfigs.stream() .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) @@ -26,13 +19,16 @@ } //初始化匹配前导码内容 - private List initialMatch(String protocolContent) { - String protocolStr = protocolContent.charAt(0) + ""; - QueryWrapper queryWrapper = new QueryWrapper() - .likeRight("pre_fix", protocolStr); - List protocolConfigList = protocolMapper.selectList(queryWrapper); - return protocolConfigList; + private static List initialMatch(String protocolContent) { + String firstFrameChar = protocolContent.charAt(0) + ""; + ProtocolConfigProvider protocolConfigProvider=new ProtocolConfigProvider(firstFrameChar); + return protocolConfigProvider.getMatchList(); } + + + + + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index cf2113d..e915877 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -1,32 +1,35 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(0) -@Service +@Component public class FrameLengthMatcher implements FrameStructMatcher { - @Autowired - private FieldParser fieldParser; - //超过长度 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { String dataGramContent = ByteBufUtil.hexDump(byteBuf); - if (StringUtils.isEmpty(protocolConfig.getUnpackId()) && StringUtils.isEmpty(protocolConfig.getTailStr())) { - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + //当不存在结尾标志和拆包标志,可以直接使用长度进行匹配 + if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { if (dataGramContent.length() >= totalLength) {//等于长度返回true,超出长度,切断 - ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, protocolConfig, totalLength); + ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, totalLength); return wholeDatagramByte; } else { //读的标志位前移舍弃 @@ -38,7 +41,7 @@ return null; } - private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, Integer totalLength) { byteBuf.readBytes(totalLength); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, totalLength - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 2bfc213..d527ad0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; @@ -13,7 +13,7 @@ import lombok.AllArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.nio.charset.Charset; import java.util.Map; @@ -22,32 +22,30 @@ * 后续标志验证 */ @Order(1) -@Service +@Component @AllArgsConstructor -public class FrameMarkMatcher implements FrameStructMatcher { - - private final FieldConfigDao fieldConfigDao; - private final FieldParser fieldParser; - private final FieldResolver fieldResolverManger; +public class FrameMarkMatcher implements FrameStructMatcher, FixedPropertyEnum { //帧后续标志=>结束,进行帧的重组=>有后续,1、帧移位判别 2、继续接收帧 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig UnpackConfig = StringUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getUnpackId()); - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); - Integer upback = 0; + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); ByteBuf mergeWholeFrameByte = null; - if (!ObjectUtil.isEmpty(UnpackConfig)) { - while (hasNextFullFrame(byteBuf, protocolConfig)) { - upback = (Integer) fieldResolverManger.filedParserManger(byteBuf, UnpackConfig, null); + if (!ObjectUtil.isEmpty(unpackFlag)) { + while (hasNextFullFrame(byteBuf, protocolConfig, protocolFieldConfigProvider)) { //是否存在后续位 - if (upback == 1) {//使用esayRule + if (unpackFlag == 1) {//使用esayRule //表示可以截取 - mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolConfig, totalLength); + mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolFieldConfigProvider, protocolConfig); return mergeWholeFrameByte; } else { - byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig)); + byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig, protocolFieldConfigProvider)); } } } @@ -56,7 +54,8 @@ //选取第一个帧,将业务内容和后面部分分开 //计算数据报文-业务内容 - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolFieldConfigProvider protocolFieldConfigProvider, ProtocolConfig protocolConfig) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); //截取完整报文 byteBuf.readBytes(totalLength); ByteBuf byteBufContent = byteBuf.slice(0, byteBuf.readerIndex()); @@ -68,15 +67,15 @@ String tail = ""; System.out.println(ByteBufUtil.hexDump(byteBufContent)); //会存在多个帧拼接在一起的的情况,进行合并处理 - while (hasNextFullFrame(byteBufContent, protocolConfig)) { - Integer currentFrameLength = fieldParser.getTotalLength(protocolConfig, byteBufContent); + while (hasNextFullFrame(byteBufContent, protocolConfig, protocolFieldConfigProvider)) { + Integer currentFrameLength = protocolFieldConfigProvider.getTotalLength(byteBufContent, protocolConfig); byteBufContent.readBytes(currentFrameLength); ByteBuf currentbyteBuf = byteBufContent.slice(0, byteBufContent.readerIndex()); byteBufContent.markReaderIndex();//读的标志位前移 System.out.println(ByteBufUtil.hexDump(byteBufContent)); String hexDump = currentbyteBuf.toString(Charset.forName("ISO-8859-1")); //获取当前固定帧结构的关系map - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, currentbyteBuf); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(currentbyteBuf, protocolConfig); if (StringUtils.isEmpty(mergeFrameStr)) { //首次获取业务数据报文 mergeFrameStr += hexDump.substring(0, currentFrameFixedProperty.get("tailPosition")); @@ -95,22 +94,22 @@ /** * 获取平移到下一帧起始位置 */ - public int getNextFrameOffset(ByteBuf buffer, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, buffer); - return currentFrameFixedProperty.get("totalLength"); + public int getNextFrameOffset(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + return currentFrameFixedProperty.get(TOTAL_LENGTH); } /** * 判断是否出错进行整个帧的 */ - public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, byteBuf); + public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); //保证读取位置不在固定位置,是可变的业务内容 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("fixedPosition")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(FIXED_POSITION)) { return false; } //判断读取是否操作帧长度 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("totalLength")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(TOTAL_LENGTH)) { return false; } return true; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 76a3784..c3a1bab 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -1,50 +1,50 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.parser.instance.GeneralProcessor; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; +import io.netty.buffer.ByteBufUtil;; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(2) -@Service +@Component public class FrameTailMatcher implements FrameStructMatcher { - @Resource - private FieldConfigDao fieldConfigDao; - @Autowired - private GeneralProcessor generalProcessor; - //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig tailFieldConfig = StringUtils.isEmpty(protocolConfig.getTailStr()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getTailStr()); - if (!ObjectUtil.isEmpty(tailFieldConfig)) { - String tailStr = tailFieldConfig.getFieldName(); + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfig protocolFieldConfig = ObjectUtils.isEmpty(protocolConfig.getTailStr()) ? null : + fieldConfigProvider.getFieldConfigById(protocolConfig.getTailStr()); + if (!ObjectUtil.isEmpty(protocolFieldConfig)) { + String tailStr = protocolFieldConfig.getFieldName(); String dataGramContent = ByteBufUtil.hexDump(byteBuf); Boolean tailFlag = ByteBufUtil.hexDump(byteBuf).contains(tailStr); if (!tailFlag) { //使用esayRule return null; } else if (dataGramContent.indexOf(tailStr) < dataGramContent.length() - tailStr.length()) { Integer length = dataGramContent.indexOf(tailStr) + tailStr.length(); - ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, protocolConfig, length); + ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, length); return wholeDatagramByte; //存在粘包 } } return null; } - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer length) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, Integer length) { byteBuf.readBytes(length); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, length - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java new file mode 100644 index 0000000..5f1c177 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java @@ -0,0 +1,73 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.combined.GenericCombinedFieldResolver; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.CombinedFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class CombinedFieldConfigProvider { + + + /** + * 作为临时配置列表缓存使用 + */ + private final List combinedFieldConfigList; + private Map storeObjectMap = new HashMap<>(); + + public CombinedFieldConfigProvider(Long ruleId) { + CombinedFieldConfigRegistry combinedFieldConfigRegistry = SpringContextUtil.getBean(CombinedFieldConfigRegistry.class); + combinedFieldConfigList = combinedFieldConfigRegistry.getCombinedFieldConfigList(ruleId); + } + + public void parseDataField(RuleConfig ruleConfig, String clearZeroPlain,Map fieldConfigsMap ) { + if (showSkip()) { + return; + } + //匹配对应的数据,然后进行相关的字段解析 + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver(); + combinedFieldResolver.parseDataField(combinedFieldConfigList, byteBuf, storeObjectMap,fieldConfigsMap); + } + + + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getCombinedFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return combinedFieldConfigList.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public List getCombinedFieldConfigList() { + return combinedFieldConfigList; + } + + /* 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(combinedFieldConfigList) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java new file mode 100644 index 0000000..f3cfedc --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java @@ -0,0 +1,11 @@ +package com.casic.missiles.parser.provider; + +/** + * @author cz + * @date 2023-6-12 + */ +public class CommandEventProvider{ + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java new file mode 100644 index 0000000..70eec5e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java @@ -0,0 +1,77 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.safe.SafeStrategy; +import com.casic.missiles.parser.sender.DataSubscribeProvider; +import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class DatagramEventProvider { + + private final DatagramEventConfig processorInstance; + + public DatagramEventProvider(Long ruleId) { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + List datagramEventConfigList = + datagramEventRegistry.getDatagramEventList(ruleId); + processorInstance = this.getProcessorInstance(datagramEventConfigList); + } + + public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { + if (showSkip()) { + return null; + } + return datagramEventConfigList.get(0); + } + + // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 + public String getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap) { + String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? + processorInstance.getSafeBean() : + fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); + if (!StringUtils.isEmpty(safeName)) { + //需要加密 + SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); + String plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); + return clearComplementZero(plain); + } + return ByteBufUtil.hexDump(bizDataContent); + } + + //解密清零操作 + private String clearComplementZero(String plain) { + plain = plain.substring(0, plain.lastIndexOf("00")); + return plain; + } + + //数据发送,数据发送者暂未构建 + public void storeData(Map bizDataMap) { + DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); +// dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return ObjectUtils.isNotEmpty(processorInstance) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java new file mode 100644 index 0000000..7e1fe0a --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java @@ -0,0 +1,97 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.FieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class FieldConfigProvider { + + + private final List fieldConfigs; + private Map storeObjectMap = new HashMap<>(); +// private Map singleObjects = new ConcurrentHashMap<>(); + + public FieldConfigProvider(Long ruleId) { + FieldConfigRegistry fieldConfigRegistry = SpringContextUtil.getBean(FieldConfigRegistry.class); + fieldConfigs = fieldConfigRegistry.getFieldConfigList(ruleId); + } + + public List getFieldConfigs() { + return fieldConfigs; + } + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public Map parseDataField(RuleConfig ruleConfig, String clearZeroPlain) { + if (showSkip()) { + return null; + } + List prepareFieldConfig = prepareParseField(ruleConfig); + if (CollectionUtils.isNotEmpty(prepareFieldConfig)) { + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(fieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + return fixDataMap; + } + } + return null; + } + + /** + * 得到需要处理的业务内容 + * + * @return + */ + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return fieldConfigs.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public Map getFieldConfigsMap() { + return fieldConfigs.stream().collect( + Collectors.toMap(FieldConfig::getId, e -> e) + ); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(fieldConfigs) ? false : true; + } + + +} + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java new file mode 100644 index 0000000..817bfaf --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java @@ -0,0 +1,19 @@ +package com.casic.missiles.parser.provider; + +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.registry.FieldRuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; + +public class FieldRuleConfigProvider { + + private final List fieldRuleConfigList; + + public FieldRuleConfigProvider(Long ruleId) { + FieldRuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(FieldRuleConfigRegistry.class); + fieldRuleConfigList = ruleConfigRegistry.getFieldRuleConfigList(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java new file mode 100644 index 0000000..99a1b06 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java @@ -0,0 +1,53 @@ +package com.casic.missiles.parser.provider; + + +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.registry.ProtocolConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolConfigProvider { + + private final List protocolConfigList; + + public ProtocolConfigProvider(String firstChar) { + ProtocolConfigRegistry registry = SpringContextUtil.getBean(ProtocolConfigRegistry.class); + protocolConfigList = registry.getProtocolConfigList(firstChar); + } + + public List getMatchList() { + return protocolConfigList; + } + + /** + * 设置当前协议 + * + * @param protocolConfig + */ + public ProtocolConfigProvider(ProtocolConfig protocolConfig) { + List protocolConfigs = new ArrayList<>(); + protocolConfigs.add(protocolConfig); + protocolConfigList = protocolConfigs; + } + + /** + * 获取当前协议 + * + * @return + */ + public ProtocolConfig getCurrentProtocolConfig() { + if (this.protocolConfigList == null) { + return null; + } else { + return protocolConfigList.get(0); + } + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java new file mode 100644 index 0000000..043927d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java @@ -0,0 +1,213 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.registry.ProtocolFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolFieldConfigProvider { + + private static final String FIXED_FIELD_DS = "fixedFieldDs"; + private static final String CONTENT_FIELD_DS = "contentFieldDs"; + private static final String PROTOCOL_LENGTH = "protocolLength"; + private static final String PROTOCOL_FIELD_ID = "protocolFieldId"; + private static final String PROTOCOL_POSITION = "protocolPosition"; + + private final List protocolFieldConfigs; + private Map singleObjects = new ConcurrentHashMap<>(); + private Map storeObjectMap = new HashMap<>(); + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public ProtocolFieldConfigProvider(Long protocolId) { + ProtocolFieldConfigRegistry protocolFieldConfigRegistry = SpringContextUtil.getBean(ProtocolFieldConfigRegistry.class); + protocolFieldConfigs = protocolFieldConfigRegistry.getProtocolFieldConfigList(protocolId); + } + + public List getProtocolFieldConfigs() { + return protocolFieldConfigs; + } + + public ProtocolFieldConfig getFieldConfigById(Long fieldId) { + Optional optionalConfig = protocolFieldConfigs.stream().filter( + e -> e.getId().equals(fieldId) + ).findFirst(); + return optionalConfig.isPresent() ? optionalConfig.get() : null; + } + + public Integer getProtocolFieldValue(Long protocolFieldId, ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_FIELD_ID + protocolFieldId + ByteBufUtil.hexDump(byteBuf); + //获取缓存 + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + //加载固定长度数据集合 + Map fixDataMap = this.getProtocolDataMap(byteBuf); + ProtocolFieldConfig protocolFieldConfig = selectFieldConfig(protocolFieldId); + Integer protocolFieldValue = 0; + //获取约定字段的总长度 + if (fixDataMap.containsKey(protocolFieldConfig.getFieldName())) { + Object appointUnpackObject = fixDataMap.get(protocolFieldConfig.getFieldName()); + if (ObjectUtils.isNotEmpty(appointUnpackObject)) { + protocolFieldValue = (Integer) appointUnpackObject; + } + } + if (protocolFieldValue != null) { + //加入缓存 + if (ObjectUtils.isNotEmpty(protocolFieldValue)) { + this.singleObjects.put(catchKey, protocolFieldValue); + return protocolFieldValue; + } + } + return null; + } + + /** + * 获取帧固定位置信息 + * + * @param byteBuf + * @param protocolConfig + * @return + */ + public Map getFixedProperty(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_POSITION + protocolConfig.getId(); + if (this.singleObjects.containsKey(catchKey)) { + return (Map) singleObjects.get(catchKey); + } + Map fixedPropertyMap = new HashMap<>(); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + fixedPropertyMap = fieldParser.doGetFixedProperty(protocolFieldConfigs, this.getTotalLength(byteBuf,protocolConfig)); + if (CollectionUtils.isNotEmpty(fixedPropertyMap)) { + this.singleObjects.put(catchKey, fixedPropertyMap); + return fixedPropertyMap; + } + return fixedPropertyMap; + } + + /** + * 获取帧结构应有的总长度 + */ + public Integer getTotalLength(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_LENGTH + ByteBufUtil.hexDump(byteBuf); + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + Integer appointFrameLength = getProtocolFieldValue(protocolConfig.getTotalLengthId(), byteBuf); + if (appointFrameLength != null) { + //获取过滤的字段集合总长度 + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Integer totalFilterLength = fieldParser.getTotalFilterLength(protocolConfig, byteBuf, getFixFieldConfigMap()); + //计算总长度 + Integer totalLength = appointFrameLength + totalFilterLength; + //加入缓存 + if (ObjectUtils.isNotEmpty(totalLength)) { + this.singleObjects.put(catchKey, totalLength); + return totalLength; + } + } + return null; + } + + /** + * 获取协议有关字段解析内容 + * storeObjectMap存储代转存的数据 + * + * @return + */ + public Map getProtocolDataMap(ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(FIXED_FIELD_DS)) { + return (Map) singleObjects.get(FIXED_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(protocolFieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + this.singleObjects.put(FIXED_FIELD_DS, fixDataMap); + return fixDataMap; + } + return null; + } + + /** + * 获取业务报文内容的content字节 + * + * @param wholeDatagramByte + * @return + */ + public ByteBuf getDataContentBuf(ByteBuf wholeDatagramByte) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(CONTENT_FIELD_DS)) { + return (ByteBuf) singleObjects.get(CONTENT_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + ByteBuf bizDataByteBuf = fieldParser.getDataContentBuf(protocolFieldConfigs, wholeDatagramByte); + if (bizDataByteBuf != null) { + this.singleObjects.put(CONTENT_FIELD_DS, bizDataByteBuf); + return bizDataByteBuf; + } + return null; + } + + + private ProtocolFieldConfig selectFieldConfig(Long id) { + Optional optionalProtocolFieldConfig = this.protocolFieldConfigs.stream().filter( + e -> e.getId().equals(id) + ).findFirst(); + return optionalProtocolFieldConfig.isPresent() ? optionalProtocolFieldConfig.get() : null; + } + + + private Map getFixFieldConfigMap() { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, e -> e) + ); + return fixDataFieldMap; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(protocolFieldConfigs) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java new file mode 100644 index 0000000..dafba1c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java @@ -0,0 +1,56 @@ +package com.casic.missiles.parser.provider; + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.rule.GenericRuleResolver; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.RuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleConfigProvider { + + private final List ruleConfigs; + + public List getRuleConfigs() { + return ruleConfigs; + } + + public RuleConfigProvider(Long protocolId) { + RuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(RuleConfigRegistry.class); + ruleConfigs = ruleConfigRegistry.getRuleConfigById(protocolId); + } + + /** + * 获取规则匹配结果 + * + * @param parseFixedDataMap + * @param protocolFieldConfigs + * @return + */ + public RuleConfig doGetRule(Map parseFixedDataMap, + String ids, + List protocolFieldConfigs) { + if (showSkip()) { + return null; + } + RuleConfig ruleConfig = GenericRuleResolver.machRule(parseFixedDataMap, ids, protocolFieldConfigs, ruleConfigs); + return ruleConfig; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(ruleConfigs) ? false : true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java index 3c05891..856b399 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java @@ -1,18 +1,11 @@ package com.casic.missiles.parser.resolver; -import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.springframework.web.bind.annotation.RequestBody; -import javax.annotation.Resource; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -20,19 +13,17 @@ @Slf4j public class ByteMergeProvider { - @Resource - private FieldRuleEngineMapper fieldRuleEngineMapper; - //拿到所有的值合并到一个值 - public String resolveByteMerge(List valueList, String ruletypeId, String vaildRange) { + public static String resolveByteMerge(List valueList, String ruleTypeId, String vaildRange) { String values = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Map vaildMap = getValidRangeMap(vaildRange); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(ruletypeId); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } + //暂时不处理 +// fieldRuleEngine = fieldRuleConfigMapper.selectById(ruleTypeId); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } Map env2 = new HashMap(); for (int i = 0; i < valueList.size(); i++) { if (vaildMap.containsKey(i)) { @@ -47,7 +38,7 @@ } } - private Map getValidRangeMap(String vaildRange) { + private static Map getValidRangeMap(String vaildRange) { String[] range = vaildRange.split(","); Map vaildMap = new HashMap(); for (int i = 0; i < range.length; i++) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 8d821cd..85d6bbf 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -1,9 +1,12 @@ package com.casic.missiles.parser.resolver; +import com.casic.missiles.pojo.AbstractFieldConfig; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; import io.netty.buffer.ByteBuf; +import java.util.List; import java.util.Map; /** @@ -11,18 +14,14 @@ */ public interface FieldParser { -// Map fieldProcess(String protocolContent,); - Map dataParser(RuleConfig ruleConfig, String lightText,String protocolId); + Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength); - Map fixDataParser(String protocolId, ByteBuf buffer); + Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap); - Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf); + ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer); - ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer); - - ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer); - - Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer); + Integer getTotalFilterLength(ProtocolConfig protocolConfig, ByteBuf byteBuf, Map protocolFieldConfigMap); } + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java new file mode 100644 index 0000000..9e0c00e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java @@ -0,0 +1,52 @@ +package com.casic.missiles.parser.resolver; + +import com.casic.missiles.pojo.AbstractFieldConfig; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.util.List; + +public class FieldParserSupport { + + //分别计算bit和byte长度=> 合并长度 + protected Integer calculateLength(List fieldConfigList) { + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + Integer fixedLength = bytefixedLength + bitfixedLength / 8; + return fixedLength; + } + + //找到最大值=> 根据最大值计算业务数据下标 + protected Integer calculatePosition(List fieldConfigList) { + String rex = "[0-9]+"; + Integer max = -1; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) + && Integer.valueOf(fieldConfig.getOriginPositionByte()) > max) { + max = Integer.valueOf(fieldConfig.getOriginPositionByte()); + } + } + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) && fieldConfig.getOriginPositionByte().equals(max)) { + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + } + } + Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; + return maxFixedPosition; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java deleted file mode 100644 index dd3a6cd..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java +++ /dev/null @@ -1,170 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.ByteResolverParam; -import io.netty.buffer.ByteBuf; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -/** - * 字段解析管理总类 - */ -@Service -@Slf4j -@AllArgsConstructor -public class FieldResolver extends ByteMergeProvider { - - //1、字段截取 => 2、简单的字节解析和复杂的字节解析 - public Object filedParserManger(ByteBuf byteBuf, FieldConfig fieldConfig, Integer maxFixedPosition) { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - //最大固定位置不为空, - if (!ObjectUtil.isEmpty(maxFixedPosition)) { - orignPosition -= maxFixedPosition; - } - Object fieldValue = 0; - //待优化 - if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { - fieldValue = bitToResolver(byteBuf, fieldConfig); - } else { - ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); - fieldValue = parsingFields(fieldBytes, fieldConfig.getRuleJson()); - } - return fieldValue; - } - - //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, - //目前默认配置的规则设置暂不支持配置化,由实现完成 - private Object parsingFields(ByteBuf byteBuf, String ruleJson) { - Object fieldsResolveValue = null; - List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); - if (ObjectUtil.isEmpty(ruleMapList)) { - fieldsResolveValue = defaultResolveBuilder(byteBuf); - } else { - fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); - } - return fieldsResolveValue; - } - - private Object defaultResolveBuilder(ByteBuf byteBuf) { - Integer defaultResolveValue = 0; - for (int i = 0; i < byteBuf.writerIndex(); i++) { - defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; - } - return defaultResolveValue; - } - - //字段解析构建器(针对字节单位的) - //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 - // 字节归并结束或者规则结束=>继续根据规则进行判断 - private Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { - Object customizeResolveValue = null; - try { - List bytStrList = new ArrayList<>(); - //存放到数组里面 - for (int i = 0; i < byteBuf.writerIndex(); i++) { - bytStrList.add(byteBuf.readByte()); - } - int i = 0; - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - customizeResolveValue = this.resolveByteMerge(bytStrList, ruletypeId,vaildRange); - break; - } else { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - List tempBytStr = new ArrayList<>(); - for (int k = 0; i < bytStrList.size(); i++) { - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(k) - .value(bytStrList.get(k)) - .ruletypeId(ruletypeId).build(); - tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); - } - bytStrList = tempBytStr; - } - i++; - } - //字节归并到一起=>继续根据规则进行判断 - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(customizeResolveValue) - .ruletypeId(ruletypeId).build(); - customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(customizeResolveValue)); - return customizeResolveValue; - } catch (RuntimeException ex) { - log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); - return null; - } - } - - /** - * 1、单个字节情况表示字段 - * 2、多字节情况表示字段(暂未处理) - */ - private Object bitToResolver(ByteBuf byteBuf, FieldConfig fieldConfig) { - Object fieldValue = new Object(); - try { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - byte fields = 0x00; - if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); - } else { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); - } - - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { - if (!StringUtils.isEmpty(fieldConfig.getExactOrignPosition())) { - fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getExactOrignPosition())).byteValue() - >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); - } else { - fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); - } - } else { - fieldValue = Integer.valueOf(fields & 0xff); - } - if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { - return fieldValue; - } - List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); - int i = 0; - //字节归并到一起=>继续根据规则进行判断 - while (i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(fieldValue) - .ruletypeId(ruletypeId).build(); - fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(fieldValue)); - return fieldValue; - } catch (RuntimeException ex) { - log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); - return null; - } - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java new file mode 100644 index 0000000..1d2aeab --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java @@ -0,0 +1,36 @@ +package com.casic.missiles.parser.resolver.bytes; + +import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.mapper.FieldRuleConfigMapper; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.pojo.ByteResolverParam; +import com.googlecode.aviator.AviatorEvaluator; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; +//转换规则 +@Component("convert") +@AllArgsConstructor +@Slf4j +public class ByteRuleResolver implements ByteResolver { + + private final FieldRuleConfigMapper fieldRuleConfigMapper; + + @Override + public Object resolveOperationRule(ByteResolverParam byteResolverParam){ + FieldRuleConfig fieldRuleEngine=fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); + if(ObjectUtil.isEmpty(fieldRuleEngine)){ + return byteResolverParam.getValue(); + } + String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); + Map env2 = new HashMap(); + env2.put("value", (byte) byteResolverParam.getValue()); + String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); + return values; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java index 103821c..786b71c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java @@ -2,34 +2,34 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("logicalShift") +@Component("logicalShift") @AllArgsConstructor @Slf4j public class LogicalShiftResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //字节位移 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { Integer index = byteResolverParam.getIndex(); - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return byteResolverParam.getValue(); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java index 476747d..01149bd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("operation") +@Component("operation") @AllArgsConstructor @Slf4j public class OperationResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //混合运算,有常量或者乘除的缩放 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java index 0b82cf4..79abcce 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.casic.missiles.pojo.ByteResolverParam; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; //精度计算 -@Service("precision") +@Component("precision") @AllArgsConstructor @Slf4j public class PrecisionResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java deleted file mode 100644 index 5c3f332..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; -//转换规则 -@Service("convert") -@AllArgsConstructor -@Slf4j -public class RuleResolver implements ByteResolver { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam){ - RuleEvaluator fieldRuleEngine=fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); - if(ObjectUtil.isEmpty(fieldRuleEngine)){ - return byteResolverParam.getValue(); - } - String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); - Map env2 = new HashMap(); - env2.put("value", (byte) byteResolverParam.getValue()); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java new file mode 100644 index 0000000..d3bbd91 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java @@ -0,0 +1,15 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; + +import java.util.List; +import java.util.Map; +// 前导码匹配->长度字段 +public interface AbstractCombinedFieldProcessor { + + Map invoke(Map map, ByteBuf byteBuf, List combinedFieldConfigList, + Map fieldConfigsMap, Map storeObjectMap); + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java new file mode 100644 index 0000000..03c8480 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java @@ -0,0 +1,59 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-13 + */ +//依次递增进行数据的解析, +public class GenericCombinedFieldResolver { + + + //通过查询,字段长度长度随机 + public void parseDataField(List combinedFieldConfigList, ByteBuf byteBuf, + Map storeObjectMap, Map fieldConfigsMap) { + Integer frameLength = Integer.valueOf(ByteBufUtil.hexDump(byteBuf)); + //添加前置处理器 + com.casic.missiles.util.ClassUtil classUtil = new com.casic.missiles.util.ClassUtil(); + List abstractCombinedProcessors = classUtil.getSubClassList(AbstractCombinedFieldProcessor.class); + + Map fieldFixedMap = combinedFieldLeadCodeMap(combinedFieldConfigList); + //frameLength + Map combinedProcessorFields = null; + while (byteBuf.readableBytes() < frameLength) { + //一直处理 + for (AbstractCombinedFieldProcessor abstractCombinedProcessor : abstractCombinedProcessors) { + combinedProcessorFields = abstractCombinedProcessor.invoke(combinedProcessorFields, byteBuf, + combinedFieldConfigList, + fieldConfigsMap, storeObjectMap); + if (combinedProcessorFields == null || byteBuf.readableBytes() < frameLength) { + return; + } + } + + } + } + + /** + * 取出前导码匹配集合 + */ + private Map combinedFieldLeadCodeMap(List combinedFieldConfigList) { + Map fieldFixedMap = combinedFieldConfigList + .stream() + .collect(Collectors.toMap(CombinedFieldConfig::getPrefixCode, e -> e)); + return fieldFixedMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java new file mode 100644 index 0000000..643a934 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java @@ -0,0 +1,100 @@ +package com.casic.missiles.parser.resolver.fields; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.FieldParserSupport; +import com.casic.missiles.pojo.*; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 保存使用时最基本的信息,并且使用原型模式 + */ +@Slf4j +public class DefaultProtocolFieldParser extends FieldParserSupport implements FieldParser, FixedPropertyEnum { + + //通过传入的配置和报文进行字段解析 + @Override + public Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap) { + Map dataMap = new HashMap<>(); + for (AbstractFieldConfig protocolFieldConfig : protocolFieldConfigs) { + if (!ObjectUtils.isEmpty(protocolFieldConfig.getOriginPositionByte())) { + Object fieldValue = FieldResolver.parseField(buffer, protocolFieldConfig, null); + if (protocolFieldConfig.getIsStorage() == 1) { + storeObjectMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + dataMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + } + return dataMap; + } + + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength) { + Map fixedPropertyMap = new HashMap<>(); + Integer fixedLength = calculateLength(protocolFieldConfigs); + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + fixedPropertyMap.put(FIXED_POSITION, maxFixedPosition); + fixedPropertyMap.put(TOTAL_LENGTH, totalLength); + fixedPropertyMap.put(TAIL_POSITION, totalLength - fixedLength + maxFixedPosition); + return fixedPropertyMap; + } + + //** 获取业务内容的byteBuf + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer) { + //计算固定长度 + Integer fixedLength = calculateLength(protocolFieldConfigs); + //总长度获取 + String lightText = buffer.toString(Charset.forName("ISO-8859-1")); + Integer totalLength = lightText.length(); + //计算固定长度最大长度 + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + //计算数据报文内容 + ByteBuf bizDataFields = buffer.slice(maxFixedPosition - 1, (totalLength - fixedLength)); + return bizDataFields; + } + + /** + * 获取过滤字段的长度 + */ + @Override + public Integer getTotalFilterLength(ProtocolConfig protocolConfig, + ByteBuf byteBuf, + Map protocolFieldConfigMap) { + if (ByteBufUtil.hexDump(byteBuf).equals("")) { + return 0; + } + int totalFilterLength = 0; + String filterFields = protocolConfig.getTotalLengthFilterFields(); + try { + if (!StringUtils.isEmpty(filterFields)) { + String[] filterFieldList = filterFields.split(","); + for (String filterFieldId : filterFieldList) { + if (StringUtils.isNotEmpty(filterFieldId)) { + ProtocolFieldConfig fieldConfig = protocolFieldConfigMap.get(Long.valueOf(filterFieldId)); + //这里都是按字节计算,没有对位进行区分,可能会出现错误 + // 如果对位有需求,需要进一步跟进 + totalFilterLength += fieldConfig.getOffsetLength(); + } + } + } + return totalFilterLength; + } catch (Exception ex) { + log.error("报文确认分发阶段,获取报文总长度过滤长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); + } + return totalFilterLength; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java index 608af3a..32cc8a4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java @@ -2,48 +2,47 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.delivery.decorator.ByteDecorator; +import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @AllArgsConstructor public class FieldDecoratorManger { - private final RuleDictDao ruleDictDao; + private final RuleConfigRegistry ruleDictDao; // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 // (1)静态的业务字段是字典里面可以配置的 // (2)动态的业务字段是通过规则生成的 public String contentMerge(String ruleJson, String sceneConent, String dynamicContent) { - List ruleDictList = ruleDictDao.getRuleDictConfig(); - Map ruleDictMap = ruleDictList.stream().collect( - Collectors.toMap(RuleDict::getId, e -> e)); - List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); - for (Map ruleMap : ruleMapList) { - String ruleType = String.valueOf(ruleMap.get("ruleType")); - ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); - NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); - byteDecorator.nodeDecoratorRule(nodeDecoratorParm); - } +// List ruleDictList = ruleDictDao.getRuleDictConfig(); +// Map ruleDictMap = ruleDictList.stream().collect( +// Collectors.toMap(RuleDict::getId, e -> e)); +// List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); +// for (Map ruleMap : ruleMapList) { +// String ruleType = String.valueOf(ruleMap.get("ruleType")); +// ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); +// NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); +// byteDecorator.nodeDecoratorRule(nodeDecoratorParm); +// } return null; } - - private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { - NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() - .contents(sceneConent) - .dynamicContent(dynamicContent) - .ruletypeId(ruletypeId) - .ruleDictMap(ruleDictMap) - .build(); - return nodeDecoratorParm; - } +// +// private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { +// NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() +// .contents(sceneConent) +// .dynamicContent(dynamicContent) +// .ruletypeId(ruletypeId) +// .ruleDictMap(ruleDictMap) +// .build(); +// return nodeDecoratorParm; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java index 652970c..b204ac3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java @@ -1,56 +1,56 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@AllArgsConstructor -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", - JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Component; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Component("logicalDecorator") +//@AllArgsConstructor +//@Slf4j +//public class LogicalShiftDecorator implements ByteDecorator { +// +//// private final FieldRuleEngineMapper fieldRuleEngineMapper; +//// +//// //字节位移 +//// @Override +//// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +//// String logicalValue = ""; +//// RuleEvaluator fieldRuleEngine = new RuleEvaluator(); +//// try { +//// Map env2 = new HashMap(); +//// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +//// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +//// for (String contentId : contentIdList) { +//// RuleDict ruleDict = ruleDictMap.get(contentId); +//// if (ruleDict.getCode().contains("#")) { +//// //使用动态的值 +//// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +//// } +//// env2.put(ruleDict.getName(), ruleDict.getCode()); +//// } +//// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +//// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +//// return null; +//// } +//// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +//// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +//// return values; +//// } catch (Exception ex) { +//// log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", +//// JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +//// return null; +//// } +//// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java index 346468f..822fead 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@AllArgsConstructor -@Slf4j -public class OperationDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("optionDecorator") +//@AllArgsConstructor +//@Slf4j +//public class OperationDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //混合运算,有常量或者乘除的缩放 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java index 50fb0a7..7a8bccb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@AllArgsConstructor -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +////精度计算 +//@AllArgsConstructor +//@Registry("precisionDecorator") +//@Slf4j +//public class PrecisionDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java index da39235..27f9cc7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java @@ -1,54 +1,53 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@AllArgsConstructor -@Slf4j -public class RuleDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("ruleDecorator") +//@AllArgsConstructor +//@Slf4j +//public class RuleDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //吃我一套正则表达式 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (Exception ex) { +// log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java index 7f5cbf3..c043f97 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java @@ -2,6 +2,6 @@ import java.util.Map; -public interface ComandeEventService { +public interface ComandeEventService{ Map loadComandeEventConfig(String protocolId,String scene); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java index 476ad84..aaf1837 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java @@ -2,46 +2,46 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.dao.CommandEventDao; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @Slf4j @AllArgsConstructor -public class ComandeEventServiceImpl implements ComandeEventService { +public class ComandeEventServiceImpl implements ComandeEventRegistry { - private final CommandEventDao commandEventDao; + // private final CommandEventDao commandEventDao; // 加密bean 固定字段出现变化的字段解析,业务字段的有序内容 @Override - public Map loadComandeEventConfig(String protocolId,String sceneName) { - CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); - if (ObjectUtil.isEmpty(commandEventConfig)) { - log.error("协议{},没有配置成功接收回复配置,清排查原因"); - return null; - } - String replyJson = commandEventConfig.getReplyContentJson(); - List> replyMapList = JSONArray.parseObject(replyJson, List.class); - List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); - Map fixMap = fixList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); - List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) - .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) - .collect(Collectors.toList()); - Map commandConfigMap = new HashMap<>(); - commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); - commandConfigMap.put("fixContent", fixMap); - commandConfigMap.put("bizContent", contentList); - return commandConfigMap; + public Map loadComandeEventConfig(String protocolId, String sceneName) { +// CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); +// if (ObjectUtil.isEmpty(commandEventConfig)) { +// log.error("协议{},没有配置成功接收回复配置,清排查原因"); +// return null; +// } +// String replyJson = commandEventConfig.getReplyContentJson(); +// List> replyMapList = JSONArray.parseObject(replyJson, List.class); +// List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); +// Map fixMap = fixList.stream() +// .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); +// List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) +// .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) +// .collect(Collectors.toList()); +// Map commandConfigMap = new HashMap<>(); +// commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); +// commandConfigMap.put("fixContent", fixMap); +// commandConfigMap.put("bizContent", contentList); +// return commandConfigMap; + return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 128b09d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java deleted file mode 100644 index 4016b0b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface DatagramEventMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java deleted file mode 100644 index 597c306..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.apache.ibatis.annotations.Mapper; - -public interface FieldConfigMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java deleted file mode 100644 index a31680a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.PreRuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface PreRuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java deleted file mode 100644 index 9060a69..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface ProtocolConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java deleted file mode 100644 index 6fa6936..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java deleted file mode 100644 index 582a705..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleDict; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleDictMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java deleted file mode 100644 index 6e302c8..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.CommandEventMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Optional; - -@Component -public class CommandEventDao { - - @Resource - private CommandEventMapper commandEventMapper; - - public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId) - .eq("scene", sceneName) - .eq("enabled", 1); - List commandEventConfig = commandEventMapper.selectList(queryWrapper); - Optional optionalEventConfig = commandEventConfig.stream().findFirst(); - return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java deleted file mode 100644 index 9137e4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.FieldConfigMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class FieldConfigDao { - - @Resource - private FieldConfigMapper fieldConfigMapper; - - public FieldConfig getFieldConfigById(String fieldId) { - FieldConfig fieldConfig = fieldConfigMapper.selectById(fieldId); - return fieldConfig; - } - - public List getFieldConfigs(String protocolId,Integer isFixed) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",isFixed); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - - public List getStorageFieldConfig(String protocolId) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",1) - .eq("is_storage",1); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java deleted file mode 100644 index 67bff6b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.mapper.PreRuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class PreRuleConfigDao { - - @Resource - private PreRuleConfigMapper preRuleConfigMapper; - - public List getPreRuleList(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return preRuleConfigMapper.selectList(queryWrapper); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java deleted file mode 100644 index d69ea85..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.RuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleConfigDao { - - @Resource - private RuleConfigMapper ruleConfigMapper; - - public RuleConfig getNextRuleConfig(String ruleFields) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("parse_rule_json", ruleFields); - return ruleConfigMapper.selectOne(queryWrapper); - } - - - public List getRuleConfigById(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return ruleConfigMapper.selectList(queryWrapper); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java deleted file mode 100644 index 932c185..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.RuleDictMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleDictDao { - - @Resource - private RuleDictMapper ruleDictMapper; - - public List getRuleDictConfig() { - List ruleDictList = ruleDictMapper.selectList(null); - return ruleDictList; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java index 9f9e279..43bc4d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java @@ -10,20 +10,15 @@ import io.netty.channel.socket.nio.NioServerSocketChannel; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import javax.annotation.PreDestroy; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static cn.hutool.core.util.ClassUtil.getClasses; /** * SensorhubServer netty服务端 */ @Slf4j -@Service +@Component public class SensorhubServer { /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java index 2c79ff5..9a28c36 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java @@ -11,13 +11,13 @@ import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioSocketChannel; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClient 客户端 */ @Slf4j -@Service +@Registry public final class SensorhubClient { public static void main(String[] args) throws Exception { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java index 9774be0..477c3f7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java @@ -6,12 +6,12 @@ import io.netty.channel.socket.SocketChannel; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientChannelInitialHandler */ -@Service +@Registry public class SensorhubClientChannelInitialHandler extends ChannelInitializer { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java index 346f4b3..73560e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java @@ -5,13 +5,13 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientHandler */ @Slf4j -@Service +@Registry public class SensorhubClientHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java index 5c1c6f2..d990af5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java @@ -4,12 +4,12 @@ import com.casic.missiles.pojo.Msg; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** * SensorhubServerHandler */ -@Service +@Component public class SensorhubServerHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 67283ae..af3172c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,41 +1,37 @@ package com.casic.missiles.parser; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultProtocolConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.*; +import com.casic.missiles.registry.FieldConfigRegistry; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; -import java.nio.charset.Charset; import java.util.HashMap; import java.util.List; import java.util.Map; -@Service("genericProtocolParser") +/** + * @author + */ +@Component("genericProtocolParser") @Slf4j -@AllArgsConstructor +@RequiredArgsConstructor public class GenericProtocolParser implements ProtocolParser { - private final LeadingCodeMatcher leadingCodeMatcher; private final List frameStructDispenserList; - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorInstanceSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; // 匹配首字母前导码=> 帧结构匹配前导码=> // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 @@ -44,18 +40,19 @@ public Boolean doParseProtocol(ByteBuf byteBuf) { String protocolContent = ByteBufUtil.hexDump(byteBuf); //匹配前导码 - List preCodeConfigs = leadingCodeMatcher.matchLeadingCode(protocolContent); + List preCodeConfigs = LeadingCodeMatcher.matchFrameLeadingCode(protocolContent); //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 if (preCodeConfigs.size() == 0) { - return rematch(byteBuf,protocolContent); + return rematch(byteBuf, protocolContent); } - //暂时先取第一个 + //暂时先取第一个,提升速度,使用享元模式, 减少类的创建销毁与构建 ProtocolConfig protocolConfig = preCodeConfigs.get(0); + AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); ByteBuf wholeDatagramByte = null; //通过匹配帧结构获取完整的数据包 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, preCodeConfigs.get(0))) != null) { + if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, protocolFactory)) != null) { break; } } @@ -68,76 +65,78 @@ * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 */ - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId, wholeDatagramByte); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap, protocolId); - //选取规则对应的流程实例 - DatagramEventConfig datagramEventConfig = processorInstanceSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); + //进行规则字段解析,进行匹配规则 + RuleConfig ruleConfig = getRuleConfig(protocolFactory, wholeDatagramByte); + if (ruleConfig == null) { + return false; + } //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, wholeDatagramByte); + ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte); + //以下进行业务的规则解析,同时选定流程实例 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); + DatagramEventProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain, + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText, protocolId); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain); //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); + datagramEventProvider.storeData(bizDataMap); return true; } - private Boolean rematch(ByteBuf byteBuf,String protocolContent) { + /** + * 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 + */ + private Boolean rematch(ByteBuf byteBuf, String protocolContent) { //重置位判断 byteBuf.resetReaderIndex(); //判断重置是否前移,如果没有前移,则直接判为匹配失败 if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { return false; } else { + //递归执行 return doParseProtocol(byteBuf); } } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; + //获取匹配规则->匹配规则 + private RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + //取出其中参与逻辑provider并判空 + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); + String rulePrepareFields = protocolConfig.getRulePrepareFields(); + //固定字段 + if (StringUtils.isNotEmpty(rulePrepareFields)) { + //获取统一固定字段解析 + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + //获取该协议的字段配置,用于协议规则匹配 + List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); + //获取规则 + RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, + rulePrepareFields, protocolFieldConfigs); + return ruleConfig; + } + return null; } - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + //数据构建,获取固定字段的store和业务字段store + private Map buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + Map bizDataMap = new HashMap<>(); + Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); + Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); + bizDataMap.putAll(ruleStoreObjectMap); + bizDataMap.putAll(protocolStoreObjectMap); return bizDataMap; } - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java index 8a46e32..16ce2e5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java @@ -3,6 +3,7 @@ import io.netty.buffer.ByteBuf; public interface ProtocolParser { + Boolean doParseProtocol(ByteBuf byteBuf); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java new file mode 100644 index 0000000..f7814af --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java @@ -0,0 +1,35 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.ProtocolConfigProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.ProtocolConfig; + +/** + * 存放基本协议的的加载信息 + */ +public class AbstractProtocolConfigFactory { + private final ProtocolConfigProvider protocolConfigProvider; + private final ProtocolFieldConfigProvider protocolFieldConfigProvider; + private final RuleConfigProvider ruleConfigProvider; + + public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { + this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); + this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); + this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); + } + + public ProtocolConfigProvider getProtocolConfigProvider() { + return protocolConfigProvider; + } + + public ProtocolFieldConfigProvider getProtocolFieldConfigProvider() { + return protocolFieldConfigProvider; + } + + public RuleConfigProvider getRuleConfigProvider() { + return ruleConfigProvider; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java new file mode 100644 index 0000000..6e36147 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java @@ -0,0 +1,57 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.CombinedFieldConfigProvider; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.FieldConfigProvider; +import com.casic.missiles.parser.provider.FieldRuleConfigProvider; + +/** + * 存放规则相关的的的加载信息 + */ +public class AbstractRuleConfigFactory { + + /** + * 处理字节 + */ + private final FieldConfigProvider fieldConfigProvider; + /** + * 处理组合字节解析的解码器 + */ + private final CombinedFieldConfigProvider combinedFieldConfigProvider; + /** + * 处理负责字节解析的规则配置 + */ + private final FieldRuleConfigProvider fieldRuleConfigProvider; + /** + * 处理实例流程 + */ + private final DatagramEventProvider datagramEventProvider; + + + public AbstractRuleConfigFactory(Long ruleId) { + this.fieldConfigProvider = new FieldConfigProvider(ruleId); + this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); + this.fieldRuleConfigProvider = new FieldRuleConfigProvider(ruleId); + this.datagramEventProvider = new DatagramEventProvider(ruleId); + } + + public FieldConfigProvider getFieldConfigProvider() { + return fieldConfigProvider; + } + + public CombinedFieldConfigProvider getCombinedFieldConfigProvider() { + return combinedFieldConfigProvider; + } + + public FieldRuleConfigProvider getFieldRuleConfigProvider() { + return fieldRuleConfigProvider; + } + + public DatagramEventProvider getDatagramEventProvider() { + return datagramEventProvider; + } + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java deleted file mode 100644 index 6e1719a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.factory; - - -import com.casic.missiles.pojo.ProtocolConfig; - -import java.util.List; - -/** - * 数据库访问优化(暂时未做) - *

- * 1、初始化协议解析配置,并存放到处存放缓存,对协议基本配置进行管理 - * 2、其中流程中所有的配置都经过此类进行管理,进行调用获取,增强解析速度 - */ -public interface DatagramFactory { - - /** - * 初始化 - */ - List datagramInit(); - - /** - * 根据前导码配置匹配,模糊匹配获取所有的报文项 - */ - List match(); - - /** - * 根据前导码匹配,返回报文项 - */ - List filer(); - - /** - * 保证数据的唯一性选择器 - */ - List selectOne(); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java new file mode 100644 index 0000000..87444a0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java @@ -0,0 +1,18 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +import java.util.List; + +/** + * 直接用,还是边用边创建 + */ +public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { + + + public DefaultProtocolConfigFactory(ProtocolConfig protocolConfig) { + super(protocolConfig); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java new file mode 100644 index 0000000..cce0c7c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java @@ -0,0 +1,12 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; + +public class DefaultRuleFactory extends AbstractRuleConfigFactory { + + public DefaultRuleFactory(Long ruleId) { + super(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java deleted file mode 100644 index 9ee97e0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.casic.missiles.parser.instance; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service -@Slf4j -@AllArgsConstructor -public class GeneralProcessor { - - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; - - /** - * 统一固定字段解析=>进行规则的查询的判断 - * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 - * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 - */ - @Deprecated - public boolean parseWholeDatagram(ByteBuf buffer, ProtocolConfig protocolConfig) { - try { - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap,protocolId); - //选取规则对应的流程= - DatagramEventConfig datagramEventConfig = processorSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); - //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); - //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); - //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); - //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); - //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); - return true; - } catch (Exception ex) { - log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", - ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); - return false; - } - } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; - } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); - } - - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); - return bizDataMap; - } - - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java index 25e7ad8..6a5777e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java @@ -1,23 +1,31 @@ package com.casic.missiles.parser.instance.impl; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.mapper.DatagramEventMapper; import com.casic.missiles.pojo.DatagramEventConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.SpringContextUtil; -@Service -@AllArgsConstructor +import java.util.List; +import java.util.Optional; + +/** + * @author cz + * + */ public class DefaultProcessorInstanceSelector implements ProcessorInstanceSelector { - private final DatagramEventMapper datagramEventMapper; + private static List datagramEventConfigs; + + static { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + datagramEventConfigs = datagramEventRegistry.getDatagramEventList(); + } @Override public DatagramEventConfig getProcessorInstance(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("rule_id", protocolId); - return datagramEventMapper.selectOne(queryWrapper); + Optional optionalSelectInstance = datagramEventConfigs.stream() + .filter(e -> e.getId().equals(protocolId)).limit(1).findFirst(); + return optionalSelectInstance.isPresent() ? optionalSelectInstance.get() : null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a778671..7b56a43 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,16 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import io.netty.buffer.ByteBuf; /** - * 分析匹配情况 - * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 - * 2、匹配不成功,有后续帧,可以进行下次匹配。 - * 3、匹配不成功,无后续帧,可以进行丢弃。 + * 分析匹配情况 + * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 + * 2、匹配不成功,有后续帧,可以进行下次匹配。 + * 3、匹配不成功,无后续帧,可以进行丢弃。 */ -public interface FrameStructMatcher{ +public interface FrameStructMatcher { - ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig); + ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 05320ab..8ebea78 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,23 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.ProtocolConfigMapper; +import com.casic.missiles.parser.provider.ProtocolConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Component; import java.util.List; import java.util.stream.Collectors; -@Component -@AllArgsConstructor public class LeadingCodeMatcher { - private final ProtocolConfigMapper protocolMapper; - //** 1、首字母匹配前导码, // 2、以匹配出的前导码是否在报文中条件进行前导码的匹配二次筛选 - public List matchLeadingCode(String protocolContent){ + public static List matchFrameLeadingCode(String protocolContent){ List initialConfigs = initialMatch(protocolContent); List preCodeConfigs = initialConfigs.stream() .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) @@ -26,13 +19,16 @@ } //初始化匹配前导码内容 - private List initialMatch(String protocolContent) { - String protocolStr = protocolContent.charAt(0) + ""; - QueryWrapper queryWrapper = new QueryWrapper() - .likeRight("pre_fix", protocolStr); - List protocolConfigList = protocolMapper.selectList(queryWrapper); - return protocolConfigList; + private static List initialMatch(String protocolContent) { + String firstFrameChar = protocolContent.charAt(0) + ""; + ProtocolConfigProvider protocolConfigProvider=new ProtocolConfigProvider(firstFrameChar); + return protocolConfigProvider.getMatchList(); } + + + + + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index cf2113d..e915877 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -1,32 +1,35 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(0) -@Service +@Component public class FrameLengthMatcher implements FrameStructMatcher { - @Autowired - private FieldParser fieldParser; - //超过长度 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { String dataGramContent = ByteBufUtil.hexDump(byteBuf); - if (StringUtils.isEmpty(protocolConfig.getUnpackId()) && StringUtils.isEmpty(protocolConfig.getTailStr())) { - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + //当不存在结尾标志和拆包标志,可以直接使用长度进行匹配 + if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { if (dataGramContent.length() >= totalLength) {//等于长度返回true,超出长度,切断 - ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, protocolConfig, totalLength); + ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, totalLength); return wholeDatagramByte; } else { //读的标志位前移舍弃 @@ -38,7 +41,7 @@ return null; } - private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, Integer totalLength) { byteBuf.readBytes(totalLength); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, totalLength - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 2bfc213..d527ad0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; @@ -13,7 +13,7 @@ import lombok.AllArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.nio.charset.Charset; import java.util.Map; @@ -22,32 +22,30 @@ * 后续标志验证 */ @Order(1) -@Service +@Component @AllArgsConstructor -public class FrameMarkMatcher implements FrameStructMatcher { - - private final FieldConfigDao fieldConfigDao; - private final FieldParser fieldParser; - private final FieldResolver fieldResolverManger; +public class FrameMarkMatcher implements FrameStructMatcher, FixedPropertyEnum { //帧后续标志=>结束,进行帧的重组=>有后续,1、帧移位判别 2、继续接收帧 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig UnpackConfig = StringUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getUnpackId()); - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); - Integer upback = 0; + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); ByteBuf mergeWholeFrameByte = null; - if (!ObjectUtil.isEmpty(UnpackConfig)) { - while (hasNextFullFrame(byteBuf, protocolConfig)) { - upback = (Integer) fieldResolverManger.filedParserManger(byteBuf, UnpackConfig, null); + if (!ObjectUtil.isEmpty(unpackFlag)) { + while (hasNextFullFrame(byteBuf, protocolConfig, protocolFieldConfigProvider)) { //是否存在后续位 - if (upback == 1) {//使用esayRule + if (unpackFlag == 1) {//使用esayRule //表示可以截取 - mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolConfig, totalLength); + mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolFieldConfigProvider, protocolConfig); return mergeWholeFrameByte; } else { - byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig)); + byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig, protocolFieldConfigProvider)); } } } @@ -56,7 +54,8 @@ //选取第一个帧,将业务内容和后面部分分开 //计算数据报文-业务内容 - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolFieldConfigProvider protocolFieldConfigProvider, ProtocolConfig protocolConfig) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); //截取完整报文 byteBuf.readBytes(totalLength); ByteBuf byteBufContent = byteBuf.slice(0, byteBuf.readerIndex()); @@ -68,15 +67,15 @@ String tail = ""; System.out.println(ByteBufUtil.hexDump(byteBufContent)); //会存在多个帧拼接在一起的的情况,进行合并处理 - while (hasNextFullFrame(byteBufContent, protocolConfig)) { - Integer currentFrameLength = fieldParser.getTotalLength(protocolConfig, byteBufContent); + while (hasNextFullFrame(byteBufContent, protocolConfig, protocolFieldConfigProvider)) { + Integer currentFrameLength = protocolFieldConfigProvider.getTotalLength(byteBufContent, protocolConfig); byteBufContent.readBytes(currentFrameLength); ByteBuf currentbyteBuf = byteBufContent.slice(0, byteBufContent.readerIndex()); byteBufContent.markReaderIndex();//读的标志位前移 System.out.println(ByteBufUtil.hexDump(byteBufContent)); String hexDump = currentbyteBuf.toString(Charset.forName("ISO-8859-1")); //获取当前固定帧结构的关系map - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, currentbyteBuf); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(currentbyteBuf, protocolConfig); if (StringUtils.isEmpty(mergeFrameStr)) { //首次获取业务数据报文 mergeFrameStr += hexDump.substring(0, currentFrameFixedProperty.get("tailPosition")); @@ -95,22 +94,22 @@ /** * 获取平移到下一帧起始位置 */ - public int getNextFrameOffset(ByteBuf buffer, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, buffer); - return currentFrameFixedProperty.get("totalLength"); + public int getNextFrameOffset(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + return currentFrameFixedProperty.get(TOTAL_LENGTH); } /** * 判断是否出错进行整个帧的 */ - public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, byteBuf); + public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); //保证读取位置不在固定位置,是可变的业务内容 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("fixedPosition")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(FIXED_POSITION)) { return false; } //判断读取是否操作帧长度 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("totalLength")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(TOTAL_LENGTH)) { return false; } return true; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 76a3784..c3a1bab 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -1,50 +1,50 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.parser.instance.GeneralProcessor; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; +import io.netty.buffer.ByteBufUtil;; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(2) -@Service +@Component public class FrameTailMatcher implements FrameStructMatcher { - @Resource - private FieldConfigDao fieldConfigDao; - @Autowired - private GeneralProcessor generalProcessor; - //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig tailFieldConfig = StringUtils.isEmpty(protocolConfig.getTailStr()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getTailStr()); - if (!ObjectUtil.isEmpty(tailFieldConfig)) { - String tailStr = tailFieldConfig.getFieldName(); + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfig protocolFieldConfig = ObjectUtils.isEmpty(protocolConfig.getTailStr()) ? null : + fieldConfigProvider.getFieldConfigById(protocolConfig.getTailStr()); + if (!ObjectUtil.isEmpty(protocolFieldConfig)) { + String tailStr = protocolFieldConfig.getFieldName(); String dataGramContent = ByteBufUtil.hexDump(byteBuf); Boolean tailFlag = ByteBufUtil.hexDump(byteBuf).contains(tailStr); if (!tailFlag) { //使用esayRule return null; } else if (dataGramContent.indexOf(tailStr) < dataGramContent.length() - tailStr.length()) { Integer length = dataGramContent.indexOf(tailStr) + tailStr.length(); - ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, protocolConfig, length); + ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, length); return wholeDatagramByte; //存在粘包 } } return null; } - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer length) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, Integer length) { byteBuf.readBytes(length); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, length - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java new file mode 100644 index 0000000..5f1c177 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java @@ -0,0 +1,73 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.combined.GenericCombinedFieldResolver; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.CombinedFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class CombinedFieldConfigProvider { + + + /** + * 作为临时配置列表缓存使用 + */ + private final List combinedFieldConfigList; + private Map storeObjectMap = new HashMap<>(); + + public CombinedFieldConfigProvider(Long ruleId) { + CombinedFieldConfigRegistry combinedFieldConfigRegistry = SpringContextUtil.getBean(CombinedFieldConfigRegistry.class); + combinedFieldConfigList = combinedFieldConfigRegistry.getCombinedFieldConfigList(ruleId); + } + + public void parseDataField(RuleConfig ruleConfig, String clearZeroPlain,Map fieldConfigsMap ) { + if (showSkip()) { + return; + } + //匹配对应的数据,然后进行相关的字段解析 + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver(); + combinedFieldResolver.parseDataField(combinedFieldConfigList, byteBuf, storeObjectMap,fieldConfigsMap); + } + + + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getCombinedFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return combinedFieldConfigList.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public List getCombinedFieldConfigList() { + return combinedFieldConfigList; + } + + /* 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(combinedFieldConfigList) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java new file mode 100644 index 0000000..f3cfedc --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java @@ -0,0 +1,11 @@ +package com.casic.missiles.parser.provider; + +/** + * @author cz + * @date 2023-6-12 + */ +public class CommandEventProvider{ + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java new file mode 100644 index 0000000..70eec5e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java @@ -0,0 +1,77 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.safe.SafeStrategy; +import com.casic.missiles.parser.sender.DataSubscribeProvider; +import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class DatagramEventProvider { + + private final DatagramEventConfig processorInstance; + + public DatagramEventProvider(Long ruleId) { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + List datagramEventConfigList = + datagramEventRegistry.getDatagramEventList(ruleId); + processorInstance = this.getProcessorInstance(datagramEventConfigList); + } + + public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { + if (showSkip()) { + return null; + } + return datagramEventConfigList.get(0); + } + + // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 + public String getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap) { + String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? + processorInstance.getSafeBean() : + fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); + if (!StringUtils.isEmpty(safeName)) { + //需要加密 + SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); + String plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); + return clearComplementZero(plain); + } + return ByteBufUtil.hexDump(bizDataContent); + } + + //解密清零操作 + private String clearComplementZero(String plain) { + plain = plain.substring(0, plain.lastIndexOf("00")); + return plain; + } + + //数据发送,数据发送者暂未构建 + public void storeData(Map bizDataMap) { + DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); +// dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return ObjectUtils.isNotEmpty(processorInstance) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java new file mode 100644 index 0000000..7e1fe0a --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java @@ -0,0 +1,97 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.FieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class FieldConfigProvider { + + + private final List fieldConfigs; + private Map storeObjectMap = new HashMap<>(); +// private Map singleObjects = new ConcurrentHashMap<>(); + + public FieldConfigProvider(Long ruleId) { + FieldConfigRegistry fieldConfigRegistry = SpringContextUtil.getBean(FieldConfigRegistry.class); + fieldConfigs = fieldConfigRegistry.getFieldConfigList(ruleId); + } + + public List getFieldConfigs() { + return fieldConfigs; + } + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public Map parseDataField(RuleConfig ruleConfig, String clearZeroPlain) { + if (showSkip()) { + return null; + } + List prepareFieldConfig = prepareParseField(ruleConfig); + if (CollectionUtils.isNotEmpty(prepareFieldConfig)) { + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(fieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + return fixDataMap; + } + } + return null; + } + + /** + * 得到需要处理的业务内容 + * + * @return + */ + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return fieldConfigs.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public Map getFieldConfigsMap() { + return fieldConfigs.stream().collect( + Collectors.toMap(FieldConfig::getId, e -> e) + ); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(fieldConfigs) ? false : true; + } + + +} + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java new file mode 100644 index 0000000..817bfaf --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java @@ -0,0 +1,19 @@ +package com.casic.missiles.parser.provider; + +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.registry.FieldRuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; + +public class FieldRuleConfigProvider { + + private final List fieldRuleConfigList; + + public FieldRuleConfigProvider(Long ruleId) { + FieldRuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(FieldRuleConfigRegistry.class); + fieldRuleConfigList = ruleConfigRegistry.getFieldRuleConfigList(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java new file mode 100644 index 0000000..99a1b06 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java @@ -0,0 +1,53 @@ +package com.casic.missiles.parser.provider; + + +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.registry.ProtocolConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolConfigProvider { + + private final List protocolConfigList; + + public ProtocolConfigProvider(String firstChar) { + ProtocolConfigRegistry registry = SpringContextUtil.getBean(ProtocolConfigRegistry.class); + protocolConfigList = registry.getProtocolConfigList(firstChar); + } + + public List getMatchList() { + return protocolConfigList; + } + + /** + * 设置当前协议 + * + * @param protocolConfig + */ + public ProtocolConfigProvider(ProtocolConfig protocolConfig) { + List protocolConfigs = new ArrayList<>(); + protocolConfigs.add(protocolConfig); + protocolConfigList = protocolConfigs; + } + + /** + * 获取当前协议 + * + * @return + */ + public ProtocolConfig getCurrentProtocolConfig() { + if (this.protocolConfigList == null) { + return null; + } else { + return protocolConfigList.get(0); + } + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java new file mode 100644 index 0000000..043927d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java @@ -0,0 +1,213 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.registry.ProtocolFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolFieldConfigProvider { + + private static final String FIXED_FIELD_DS = "fixedFieldDs"; + private static final String CONTENT_FIELD_DS = "contentFieldDs"; + private static final String PROTOCOL_LENGTH = "protocolLength"; + private static final String PROTOCOL_FIELD_ID = "protocolFieldId"; + private static final String PROTOCOL_POSITION = "protocolPosition"; + + private final List protocolFieldConfigs; + private Map singleObjects = new ConcurrentHashMap<>(); + private Map storeObjectMap = new HashMap<>(); + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public ProtocolFieldConfigProvider(Long protocolId) { + ProtocolFieldConfigRegistry protocolFieldConfigRegistry = SpringContextUtil.getBean(ProtocolFieldConfigRegistry.class); + protocolFieldConfigs = protocolFieldConfigRegistry.getProtocolFieldConfigList(protocolId); + } + + public List getProtocolFieldConfigs() { + return protocolFieldConfigs; + } + + public ProtocolFieldConfig getFieldConfigById(Long fieldId) { + Optional optionalConfig = protocolFieldConfigs.stream().filter( + e -> e.getId().equals(fieldId) + ).findFirst(); + return optionalConfig.isPresent() ? optionalConfig.get() : null; + } + + public Integer getProtocolFieldValue(Long protocolFieldId, ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_FIELD_ID + protocolFieldId + ByteBufUtil.hexDump(byteBuf); + //获取缓存 + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + //加载固定长度数据集合 + Map fixDataMap = this.getProtocolDataMap(byteBuf); + ProtocolFieldConfig protocolFieldConfig = selectFieldConfig(protocolFieldId); + Integer protocolFieldValue = 0; + //获取约定字段的总长度 + if (fixDataMap.containsKey(protocolFieldConfig.getFieldName())) { + Object appointUnpackObject = fixDataMap.get(protocolFieldConfig.getFieldName()); + if (ObjectUtils.isNotEmpty(appointUnpackObject)) { + protocolFieldValue = (Integer) appointUnpackObject; + } + } + if (protocolFieldValue != null) { + //加入缓存 + if (ObjectUtils.isNotEmpty(protocolFieldValue)) { + this.singleObjects.put(catchKey, protocolFieldValue); + return protocolFieldValue; + } + } + return null; + } + + /** + * 获取帧固定位置信息 + * + * @param byteBuf + * @param protocolConfig + * @return + */ + public Map getFixedProperty(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_POSITION + protocolConfig.getId(); + if (this.singleObjects.containsKey(catchKey)) { + return (Map) singleObjects.get(catchKey); + } + Map fixedPropertyMap = new HashMap<>(); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + fixedPropertyMap = fieldParser.doGetFixedProperty(protocolFieldConfigs, this.getTotalLength(byteBuf,protocolConfig)); + if (CollectionUtils.isNotEmpty(fixedPropertyMap)) { + this.singleObjects.put(catchKey, fixedPropertyMap); + return fixedPropertyMap; + } + return fixedPropertyMap; + } + + /** + * 获取帧结构应有的总长度 + */ + public Integer getTotalLength(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_LENGTH + ByteBufUtil.hexDump(byteBuf); + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + Integer appointFrameLength = getProtocolFieldValue(protocolConfig.getTotalLengthId(), byteBuf); + if (appointFrameLength != null) { + //获取过滤的字段集合总长度 + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Integer totalFilterLength = fieldParser.getTotalFilterLength(protocolConfig, byteBuf, getFixFieldConfigMap()); + //计算总长度 + Integer totalLength = appointFrameLength + totalFilterLength; + //加入缓存 + if (ObjectUtils.isNotEmpty(totalLength)) { + this.singleObjects.put(catchKey, totalLength); + return totalLength; + } + } + return null; + } + + /** + * 获取协议有关字段解析内容 + * storeObjectMap存储代转存的数据 + * + * @return + */ + public Map getProtocolDataMap(ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(FIXED_FIELD_DS)) { + return (Map) singleObjects.get(FIXED_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(protocolFieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + this.singleObjects.put(FIXED_FIELD_DS, fixDataMap); + return fixDataMap; + } + return null; + } + + /** + * 获取业务报文内容的content字节 + * + * @param wholeDatagramByte + * @return + */ + public ByteBuf getDataContentBuf(ByteBuf wholeDatagramByte) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(CONTENT_FIELD_DS)) { + return (ByteBuf) singleObjects.get(CONTENT_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + ByteBuf bizDataByteBuf = fieldParser.getDataContentBuf(protocolFieldConfigs, wholeDatagramByte); + if (bizDataByteBuf != null) { + this.singleObjects.put(CONTENT_FIELD_DS, bizDataByteBuf); + return bizDataByteBuf; + } + return null; + } + + + private ProtocolFieldConfig selectFieldConfig(Long id) { + Optional optionalProtocolFieldConfig = this.protocolFieldConfigs.stream().filter( + e -> e.getId().equals(id) + ).findFirst(); + return optionalProtocolFieldConfig.isPresent() ? optionalProtocolFieldConfig.get() : null; + } + + + private Map getFixFieldConfigMap() { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, e -> e) + ); + return fixDataFieldMap; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(protocolFieldConfigs) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java new file mode 100644 index 0000000..dafba1c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java @@ -0,0 +1,56 @@ +package com.casic.missiles.parser.provider; + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.rule.GenericRuleResolver; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.RuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleConfigProvider { + + private final List ruleConfigs; + + public List getRuleConfigs() { + return ruleConfigs; + } + + public RuleConfigProvider(Long protocolId) { + RuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(RuleConfigRegistry.class); + ruleConfigs = ruleConfigRegistry.getRuleConfigById(protocolId); + } + + /** + * 获取规则匹配结果 + * + * @param parseFixedDataMap + * @param protocolFieldConfigs + * @return + */ + public RuleConfig doGetRule(Map parseFixedDataMap, + String ids, + List protocolFieldConfigs) { + if (showSkip()) { + return null; + } + RuleConfig ruleConfig = GenericRuleResolver.machRule(parseFixedDataMap, ids, protocolFieldConfigs, ruleConfigs); + return ruleConfig; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(ruleConfigs) ? false : true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java index 3c05891..856b399 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java @@ -1,18 +1,11 @@ package com.casic.missiles.parser.resolver; -import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.springframework.web.bind.annotation.RequestBody; -import javax.annotation.Resource; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -20,19 +13,17 @@ @Slf4j public class ByteMergeProvider { - @Resource - private FieldRuleEngineMapper fieldRuleEngineMapper; - //拿到所有的值合并到一个值 - public String resolveByteMerge(List valueList, String ruletypeId, String vaildRange) { + public static String resolveByteMerge(List valueList, String ruleTypeId, String vaildRange) { String values = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Map vaildMap = getValidRangeMap(vaildRange); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(ruletypeId); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } + //暂时不处理 +// fieldRuleEngine = fieldRuleConfigMapper.selectById(ruleTypeId); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } Map env2 = new HashMap(); for (int i = 0; i < valueList.size(); i++) { if (vaildMap.containsKey(i)) { @@ -47,7 +38,7 @@ } } - private Map getValidRangeMap(String vaildRange) { + private static Map getValidRangeMap(String vaildRange) { String[] range = vaildRange.split(","); Map vaildMap = new HashMap(); for (int i = 0; i < range.length; i++) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 8d821cd..85d6bbf 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -1,9 +1,12 @@ package com.casic.missiles.parser.resolver; +import com.casic.missiles.pojo.AbstractFieldConfig; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; import io.netty.buffer.ByteBuf; +import java.util.List; import java.util.Map; /** @@ -11,18 +14,14 @@ */ public interface FieldParser { -// Map fieldProcess(String protocolContent,); - Map dataParser(RuleConfig ruleConfig, String lightText,String protocolId); + Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength); - Map fixDataParser(String protocolId, ByteBuf buffer); + Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap); - Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf); + ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer); - ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer); - - ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer); - - Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer); + Integer getTotalFilterLength(ProtocolConfig protocolConfig, ByteBuf byteBuf, Map protocolFieldConfigMap); } + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java new file mode 100644 index 0000000..9e0c00e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java @@ -0,0 +1,52 @@ +package com.casic.missiles.parser.resolver; + +import com.casic.missiles.pojo.AbstractFieldConfig; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.util.List; + +public class FieldParserSupport { + + //分别计算bit和byte长度=> 合并长度 + protected Integer calculateLength(List fieldConfigList) { + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + Integer fixedLength = bytefixedLength + bitfixedLength / 8; + return fixedLength; + } + + //找到最大值=> 根据最大值计算业务数据下标 + protected Integer calculatePosition(List fieldConfigList) { + String rex = "[0-9]+"; + Integer max = -1; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) + && Integer.valueOf(fieldConfig.getOriginPositionByte()) > max) { + max = Integer.valueOf(fieldConfig.getOriginPositionByte()); + } + } + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) && fieldConfig.getOriginPositionByte().equals(max)) { + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + } + } + Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; + return maxFixedPosition; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java deleted file mode 100644 index dd3a6cd..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java +++ /dev/null @@ -1,170 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.ByteResolverParam; -import io.netty.buffer.ByteBuf; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -/** - * 字段解析管理总类 - */ -@Service -@Slf4j -@AllArgsConstructor -public class FieldResolver extends ByteMergeProvider { - - //1、字段截取 => 2、简单的字节解析和复杂的字节解析 - public Object filedParserManger(ByteBuf byteBuf, FieldConfig fieldConfig, Integer maxFixedPosition) { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - //最大固定位置不为空, - if (!ObjectUtil.isEmpty(maxFixedPosition)) { - orignPosition -= maxFixedPosition; - } - Object fieldValue = 0; - //待优化 - if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { - fieldValue = bitToResolver(byteBuf, fieldConfig); - } else { - ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); - fieldValue = parsingFields(fieldBytes, fieldConfig.getRuleJson()); - } - return fieldValue; - } - - //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, - //目前默认配置的规则设置暂不支持配置化,由实现完成 - private Object parsingFields(ByteBuf byteBuf, String ruleJson) { - Object fieldsResolveValue = null; - List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); - if (ObjectUtil.isEmpty(ruleMapList)) { - fieldsResolveValue = defaultResolveBuilder(byteBuf); - } else { - fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); - } - return fieldsResolveValue; - } - - private Object defaultResolveBuilder(ByteBuf byteBuf) { - Integer defaultResolveValue = 0; - for (int i = 0; i < byteBuf.writerIndex(); i++) { - defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; - } - return defaultResolveValue; - } - - //字段解析构建器(针对字节单位的) - //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 - // 字节归并结束或者规则结束=>继续根据规则进行判断 - private Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { - Object customizeResolveValue = null; - try { - List bytStrList = new ArrayList<>(); - //存放到数组里面 - for (int i = 0; i < byteBuf.writerIndex(); i++) { - bytStrList.add(byteBuf.readByte()); - } - int i = 0; - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - customizeResolveValue = this.resolveByteMerge(bytStrList, ruletypeId,vaildRange); - break; - } else { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - List tempBytStr = new ArrayList<>(); - for (int k = 0; i < bytStrList.size(); i++) { - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(k) - .value(bytStrList.get(k)) - .ruletypeId(ruletypeId).build(); - tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); - } - bytStrList = tempBytStr; - } - i++; - } - //字节归并到一起=>继续根据规则进行判断 - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(customizeResolveValue) - .ruletypeId(ruletypeId).build(); - customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(customizeResolveValue)); - return customizeResolveValue; - } catch (RuntimeException ex) { - log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); - return null; - } - } - - /** - * 1、单个字节情况表示字段 - * 2、多字节情况表示字段(暂未处理) - */ - private Object bitToResolver(ByteBuf byteBuf, FieldConfig fieldConfig) { - Object fieldValue = new Object(); - try { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - byte fields = 0x00; - if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); - } else { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); - } - - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { - if (!StringUtils.isEmpty(fieldConfig.getExactOrignPosition())) { - fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getExactOrignPosition())).byteValue() - >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); - } else { - fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); - } - } else { - fieldValue = Integer.valueOf(fields & 0xff); - } - if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { - return fieldValue; - } - List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); - int i = 0; - //字节归并到一起=>继续根据规则进行判断 - while (i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(fieldValue) - .ruletypeId(ruletypeId).build(); - fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(fieldValue)); - return fieldValue; - } catch (RuntimeException ex) { - log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); - return null; - } - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java new file mode 100644 index 0000000..1d2aeab --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java @@ -0,0 +1,36 @@ +package com.casic.missiles.parser.resolver.bytes; + +import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.mapper.FieldRuleConfigMapper; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.pojo.ByteResolverParam; +import com.googlecode.aviator.AviatorEvaluator; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; +//转换规则 +@Component("convert") +@AllArgsConstructor +@Slf4j +public class ByteRuleResolver implements ByteResolver { + + private final FieldRuleConfigMapper fieldRuleConfigMapper; + + @Override + public Object resolveOperationRule(ByteResolverParam byteResolverParam){ + FieldRuleConfig fieldRuleEngine=fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); + if(ObjectUtil.isEmpty(fieldRuleEngine)){ + return byteResolverParam.getValue(); + } + String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); + Map env2 = new HashMap(); + env2.put("value", (byte) byteResolverParam.getValue()); + String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); + return values; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java index 103821c..786b71c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java @@ -2,34 +2,34 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("logicalShift") +@Component("logicalShift") @AllArgsConstructor @Slf4j public class LogicalShiftResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //字节位移 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { Integer index = byteResolverParam.getIndex(); - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return byteResolverParam.getValue(); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java index 476747d..01149bd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("operation") +@Component("operation") @AllArgsConstructor @Slf4j public class OperationResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //混合运算,有常量或者乘除的缩放 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java index 0b82cf4..79abcce 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.casic.missiles.pojo.ByteResolverParam; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; //精度计算 -@Service("precision") +@Component("precision") @AllArgsConstructor @Slf4j public class PrecisionResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java deleted file mode 100644 index 5c3f332..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; -//转换规则 -@Service("convert") -@AllArgsConstructor -@Slf4j -public class RuleResolver implements ByteResolver { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam){ - RuleEvaluator fieldRuleEngine=fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); - if(ObjectUtil.isEmpty(fieldRuleEngine)){ - return byteResolverParam.getValue(); - } - String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); - Map env2 = new HashMap(); - env2.put("value", (byte) byteResolverParam.getValue()); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java new file mode 100644 index 0000000..d3bbd91 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java @@ -0,0 +1,15 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; + +import java.util.List; +import java.util.Map; +// 前导码匹配->长度字段 +public interface AbstractCombinedFieldProcessor { + + Map invoke(Map map, ByteBuf byteBuf, List combinedFieldConfigList, + Map fieldConfigsMap, Map storeObjectMap); + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java new file mode 100644 index 0000000..03c8480 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java @@ -0,0 +1,59 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-13 + */ +//依次递增进行数据的解析, +public class GenericCombinedFieldResolver { + + + //通过查询,字段长度长度随机 + public void parseDataField(List combinedFieldConfigList, ByteBuf byteBuf, + Map storeObjectMap, Map fieldConfigsMap) { + Integer frameLength = Integer.valueOf(ByteBufUtil.hexDump(byteBuf)); + //添加前置处理器 + com.casic.missiles.util.ClassUtil classUtil = new com.casic.missiles.util.ClassUtil(); + List abstractCombinedProcessors = classUtil.getSubClassList(AbstractCombinedFieldProcessor.class); + + Map fieldFixedMap = combinedFieldLeadCodeMap(combinedFieldConfigList); + //frameLength + Map combinedProcessorFields = null; + while (byteBuf.readableBytes() < frameLength) { + //一直处理 + for (AbstractCombinedFieldProcessor abstractCombinedProcessor : abstractCombinedProcessors) { + combinedProcessorFields = abstractCombinedProcessor.invoke(combinedProcessorFields, byteBuf, + combinedFieldConfigList, + fieldConfigsMap, storeObjectMap); + if (combinedProcessorFields == null || byteBuf.readableBytes() < frameLength) { + return; + } + } + + } + } + + /** + * 取出前导码匹配集合 + */ + private Map combinedFieldLeadCodeMap(List combinedFieldConfigList) { + Map fieldFixedMap = combinedFieldConfigList + .stream() + .collect(Collectors.toMap(CombinedFieldConfig::getPrefixCode, e -> e)); + return fieldFixedMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java new file mode 100644 index 0000000..643a934 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java @@ -0,0 +1,100 @@ +package com.casic.missiles.parser.resolver.fields; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.FieldParserSupport; +import com.casic.missiles.pojo.*; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 保存使用时最基本的信息,并且使用原型模式 + */ +@Slf4j +public class DefaultProtocolFieldParser extends FieldParserSupport implements FieldParser, FixedPropertyEnum { + + //通过传入的配置和报文进行字段解析 + @Override + public Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap) { + Map dataMap = new HashMap<>(); + for (AbstractFieldConfig protocolFieldConfig : protocolFieldConfigs) { + if (!ObjectUtils.isEmpty(protocolFieldConfig.getOriginPositionByte())) { + Object fieldValue = FieldResolver.parseField(buffer, protocolFieldConfig, null); + if (protocolFieldConfig.getIsStorage() == 1) { + storeObjectMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + dataMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + } + return dataMap; + } + + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength) { + Map fixedPropertyMap = new HashMap<>(); + Integer fixedLength = calculateLength(protocolFieldConfigs); + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + fixedPropertyMap.put(FIXED_POSITION, maxFixedPosition); + fixedPropertyMap.put(TOTAL_LENGTH, totalLength); + fixedPropertyMap.put(TAIL_POSITION, totalLength - fixedLength + maxFixedPosition); + return fixedPropertyMap; + } + + //** 获取业务内容的byteBuf + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer) { + //计算固定长度 + Integer fixedLength = calculateLength(protocolFieldConfigs); + //总长度获取 + String lightText = buffer.toString(Charset.forName("ISO-8859-1")); + Integer totalLength = lightText.length(); + //计算固定长度最大长度 + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + //计算数据报文内容 + ByteBuf bizDataFields = buffer.slice(maxFixedPosition - 1, (totalLength - fixedLength)); + return bizDataFields; + } + + /** + * 获取过滤字段的长度 + */ + @Override + public Integer getTotalFilterLength(ProtocolConfig protocolConfig, + ByteBuf byteBuf, + Map protocolFieldConfigMap) { + if (ByteBufUtil.hexDump(byteBuf).equals("")) { + return 0; + } + int totalFilterLength = 0; + String filterFields = protocolConfig.getTotalLengthFilterFields(); + try { + if (!StringUtils.isEmpty(filterFields)) { + String[] filterFieldList = filterFields.split(","); + for (String filterFieldId : filterFieldList) { + if (StringUtils.isNotEmpty(filterFieldId)) { + ProtocolFieldConfig fieldConfig = protocolFieldConfigMap.get(Long.valueOf(filterFieldId)); + //这里都是按字节计算,没有对位进行区分,可能会出现错误 + // 如果对位有需求,需要进一步跟进 + totalFilterLength += fieldConfig.getOffsetLength(); + } + } + } + return totalFilterLength; + } catch (Exception ex) { + log.error("报文确认分发阶段,获取报文总长度过滤长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); + } + return totalFilterLength; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java new file mode 100644 index 0000000..d51e887 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java @@ -0,0 +1,169 @@ +package com.casic.missiles.parser.resolver.fields; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.parser.resolver.ByteMergeProvider; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.AbstractFieldConfig; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.pojo.ByteResolverParam; +import io.netty.buffer.ByteBuf; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * 字段解析管理总类 + */ +@Slf4j +public class FieldResolver extends ByteMergeProvider { + + //1、字段截取 => 2、简单的字节解析和复杂的字节解析 + public static Object parseField(ByteBuf byteBuf,AbstractFieldConfig fieldConfig, Integer maxFixedPosition) { + Integer orignPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + //最大固定位置不为空, + if (!ObjectUtil.isEmpty(maxFixedPosition)) { + orignPosition -= maxFixedPosition; + } + Object fieldValue = 0; + //待优化 + if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { + fieldValue = doParseBitField(byteBuf, fieldConfig); + } else { + ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); + fieldValue = doParseByteField(fieldBytes, fieldConfig.getRuleJson()); + } + return fieldValue; + } + + //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, + //目前默认配置的规则设置暂不支持配置化,由实现完成 + private static Object doParseByteField(ByteBuf byteBuf, String ruleJson) { + Object fieldsResolveValue = null; + List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); + if (ObjectUtil.isEmpty(ruleMapList)) { + fieldsResolveValue = defaultResolveBuilder(byteBuf); + } else { + fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); + } + return fieldsResolveValue; + } + + private static Object defaultResolveBuilder(ByteBuf byteBuf) { + Integer defaultResolveValue = 0; + for (int i = 0; i < byteBuf.writerIndex(); i++) { + defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; + } + return defaultResolveValue; + } + + //字段解析构建器(针对字节单位的) + //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 + // 字节归并结束或者规则结束=>继续根据规则进行判断 + private static Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { + Object customizeResolveValue = null; + try { + List bytStrList = new ArrayList<>(); + //存放到数组里面 + for (int i = 0; i < byteBuf.writerIndex(); i++) { + bytStrList.add(byteBuf.readByte()); + } + int i = 0; + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { + if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + customizeResolveValue = resolveByteMerge(bytStrList, ruletypeId, vaildRange); + break; + } else { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + List tempBytStr = new ArrayList<>(); + for (int k = 0; i < bytStrList.size(); i++) { + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(k) + .value(bytStrList.get(k)) + .ruletypeId(ruletypeId).build(); + tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); + } + bytStrList = tempBytStr; + } + i++; + } + //字节归并到一起=>继续根据规则进行判断 + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(null) + .value(customizeResolveValue) + .ruletypeId(ruletypeId).build(); + customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); + i++; + } + System.out.println(JSON.toJSON(customizeResolveValue)); + return customizeResolveValue; + } catch (RuntimeException ex) { + log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); + return null; + } + } + + /** + * 1、单个字节情况表示字段 + * 2、多字节情况表示字段(暂未处理) + */ + private static Object doParseBitField(ByteBuf byteBuf,AbstractFieldConfig fieldConfig) { + Object fieldValue = new Object(); + try { + Integer orignPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + byte fields = 0x00; + if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { + fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); + } else { + fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); + } + + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { + if (!StringUtils.isEmpty(fieldConfig.getOriginPositionBit())) { + fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getOriginPositionBit())).byteValue() + >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); + } else { + fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); + } + } else { + fieldValue = Integer.valueOf(fields & 0xff); + } + if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { + return fieldValue; + } + List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); + int i = 0; + //字节归并到一起=>继续根据规则进行判断 + while (i < ruleMapList.size()) { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(null) + .value(fieldValue) + .ruletypeId(ruletypeId).build(); + fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); + i++; + } + System.out.println(JSON.toJSON(fieldValue)); + return fieldValue; + } catch (RuntimeException ex) { + log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); + return null; + } + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java index 608af3a..32cc8a4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java @@ -2,48 +2,47 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.delivery.decorator.ByteDecorator; +import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @AllArgsConstructor public class FieldDecoratorManger { - private final RuleDictDao ruleDictDao; + private final RuleConfigRegistry ruleDictDao; // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 // (1)静态的业务字段是字典里面可以配置的 // (2)动态的业务字段是通过规则生成的 public String contentMerge(String ruleJson, String sceneConent, String dynamicContent) { - List ruleDictList = ruleDictDao.getRuleDictConfig(); - Map ruleDictMap = ruleDictList.stream().collect( - Collectors.toMap(RuleDict::getId, e -> e)); - List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); - for (Map ruleMap : ruleMapList) { - String ruleType = String.valueOf(ruleMap.get("ruleType")); - ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); - NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); - byteDecorator.nodeDecoratorRule(nodeDecoratorParm); - } +// List ruleDictList = ruleDictDao.getRuleDictConfig(); +// Map ruleDictMap = ruleDictList.stream().collect( +// Collectors.toMap(RuleDict::getId, e -> e)); +// List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); +// for (Map ruleMap : ruleMapList) { +// String ruleType = String.valueOf(ruleMap.get("ruleType")); +// ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); +// NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); +// byteDecorator.nodeDecoratorRule(nodeDecoratorParm); +// } return null; } - - private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { - NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() - .contents(sceneConent) - .dynamicContent(dynamicContent) - .ruletypeId(ruletypeId) - .ruleDictMap(ruleDictMap) - .build(); - return nodeDecoratorParm; - } +// +// private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { +// NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() +// .contents(sceneConent) +// .dynamicContent(dynamicContent) +// .ruletypeId(ruletypeId) +// .ruleDictMap(ruleDictMap) +// .build(); +// return nodeDecoratorParm; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java index 652970c..b204ac3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java @@ -1,56 +1,56 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@AllArgsConstructor -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", - JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Component; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Component("logicalDecorator") +//@AllArgsConstructor +//@Slf4j +//public class LogicalShiftDecorator implements ByteDecorator { +// +//// private final FieldRuleEngineMapper fieldRuleEngineMapper; +//// +//// //字节位移 +//// @Override +//// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +//// String logicalValue = ""; +//// RuleEvaluator fieldRuleEngine = new RuleEvaluator(); +//// try { +//// Map env2 = new HashMap(); +//// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +//// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +//// for (String contentId : contentIdList) { +//// RuleDict ruleDict = ruleDictMap.get(contentId); +//// if (ruleDict.getCode().contains("#")) { +//// //使用动态的值 +//// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +//// } +//// env2.put(ruleDict.getName(), ruleDict.getCode()); +//// } +//// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +//// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +//// return null; +//// } +//// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +//// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +//// return values; +//// } catch (Exception ex) { +//// log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", +//// JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +//// return null; +//// } +//// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java index 346468f..822fead 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@AllArgsConstructor -@Slf4j -public class OperationDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("optionDecorator") +//@AllArgsConstructor +//@Slf4j +//public class OperationDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //混合运算,有常量或者乘除的缩放 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java index 50fb0a7..7a8bccb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@AllArgsConstructor -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +////精度计算 +//@AllArgsConstructor +//@Registry("precisionDecorator") +//@Slf4j +//public class PrecisionDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java index da39235..27f9cc7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java @@ -1,54 +1,53 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@AllArgsConstructor -@Slf4j -public class RuleDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("ruleDecorator") +//@AllArgsConstructor +//@Slf4j +//public class RuleDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //吃我一套正则表达式 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (Exception ex) { +// log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java index 7f5cbf3..c043f97 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java @@ -2,6 +2,6 @@ import java.util.Map; -public interface ComandeEventService { +public interface ComandeEventService{ Map loadComandeEventConfig(String protocolId,String scene); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java index 476ad84..aaf1837 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java @@ -2,46 +2,46 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.dao.CommandEventDao; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @Slf4j @AllArgsConstructor -public class ComandeEventServiceImpl implements ComandeEventService { +public class ComandeEventServiceImpl implements ComandeEventRegistry { - private final CommandEventDao commandEventDao; + // private final CommandEventDao commandEventDao; // 加密bean 固定字段出现变化的字段解析,业务字段的有序内容 @Override - public Map loadComandeEventConfig(String protocolId,String sceneName) { - CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); - if (ObjectUtil.isEmpty(commandEventConfig)) { - log.error("协议{},没有配置成功接收回复配置,清排查原因"); - return null; - } - String replyJson = commandEventConfig.getReplyContentJson(); - List> replyMapList = JSONArray.parseObject(replyJson, List.class); - List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); - Map fixMap = fixList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); - List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) - .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) - .collect(Collectors.toList()); - Map commandConfigMap = new HashMap<>(); - commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); - commandConfigMap.put("fixContent", fixMap); - commandConfigMap.put("bizContent", contentList); - return commandConfigMap; + public Map loadComandeEventConfig(String protocolId, String sceneName) { +// CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); +// if (ObjectUtil.isEmpty(commandEventConfig)) { +// log.error("协议{},没有配置成功接收回复配置,清排查原因"); +// return null; +// } +// String replyJson = commandEventConfig.getReplyContentJson(); +// List> replyMapList = JSONArray.parseObject(replyJson, List.class); +// List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); +// Map fixMap = fixList.stream() +// .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); +// List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) +// .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) +// .collect(Collectors.toList()); +// Map commandConfigMap = new HashMap<>(); +// commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); +// commandConfigMap.put("fixContent", fixMap); +// commandConfigMap.put("bizContent", contentList); +// return commandConfigMap; + return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 128b09d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java deleted file mode 100644 index 4016b0b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface DatagramEventMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java deleted file mode 100644 index 597c306..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.apache.ibatis.annotations.Mapper; - -public interface FieldConfigMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java deleted file mode 100644 index a31680a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.PreRuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface PreRuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java deleted file mode 100644 index 9060a69..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface ProtocolConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java deleted file mode 100644 index 6fa6936..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java deleted file mode 100644 index 582a705..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleDict; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleDictMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java deleted file mode 100644 index 6e302c8..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.CommandEventMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Optional; - -@Component -public class CommandEventDao { - - @Resource - private CommandEventMapper commandEventMapper; - - public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId) - .eq("scene", sceneName) - .eq("enabled", 1); - List commandEventConfig = commandEventMapper.selectList(queryWrapper); - Optional optionalEventConfig = commandEventConfig.stream().findFirst(); - return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java deleted file mode 100644 index 9137e4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.FieldConfigMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class FieldConfigDao { - - @Resource - private FieldConfigMapper fieldConfigMapper; - - public FieldConfig getFieldConfigById(String fieldId) { - FieldConfig fieldConfig = fieldConfigMapper.selectById(fieldId); - return fieldConfig; - } - - public List getFieldConfigs(String protocolId,Integer isFixed) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",isFixed); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - - public List getStorageFieldConfig(String protocolId) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",1) - .eq("is_storage",1); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java deleted file mode 100644 index 67bff6b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.mapper.PreRuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class PreRuleConfigDao { - - @Resource - private PreRuleConfigMapper preRuleConfigMapper; - - public List getPreRuleList(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return preRuleConfigMapper.selectList(queryWrapper); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java deleted file mode 100644 index d69ea85..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.RuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleConfigDao { - - @Resource - private RuleConfigMapper ruleConfigMapper; - - public RuleConfig getNextRuleConfig(String ruleFields) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("parse_rule_json", ruleFields); - return ruleConfigMapper.selectOne(queryWrapper); - } - - - public List getRuleConfigById(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return ruleConfigMapper.selectList(queryWrapper); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java deleted file mode 100644 index 932c185..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.RuleDictMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleDictDao { - - @Resource - private RuleDictMapper ruleDictMapper; - - public List getRuleDictConfig() { - List ruleDictList = ruleDictMapper.selectList(null); - return ruleDictList; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java index 9f9e279..43bc4d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java @@ -10,20 +10,15 @@ import io.netty.channel.socket.nio.NioServerSocketChannel; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import javax.annotation.PreDestroy; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static cn.hutool.core.util.ClassUtil.getClasses; /** * SensorhubServer netty服务端 */ @Slf4j -@Service +@Component public class SensorhubServer { /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java index 2c79ff5..9a28c36 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java @@ -11,13 +11,13 @@ import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioSocketChannel; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClient 客户端 */ @Slf4j -@Service +@Registry public final class SensorhubClient { public static void main(String[] args) throws Exception { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java index 9774be0..477c3f7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java @@ -6,12 +6,12 @@ import io.netty.channel.socket.SocketChannel; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientChannelInitialHandler */ -@Service +@Registry public class SensorhubClientChannelInitialHandler extends ChannelInitializer { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java index 346f4b3..73560e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java @@ -5,13 +5,13 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientHandler */ @Slf4j -@Service +@Registry public class SensorhubClientHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java index 5c1c6f2..d990af5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java @@ -4,12 +4,12 @@ import com.casic.missiles.pojo.Msg; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** * SensorhubServerHandler */ -@Service +@Component public class SensorhubServerHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 67283ae..af3172c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,41 +1,37 @@ package com.casic.missiles.parser; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultProtocolConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.*; +import com.casic.missiles.registry.FieldConfigRegistry; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; -import java.nio.charset.Charset; import java.util.HashMap; import java.util.List; import java.util.Map; -@Service("genericProtocolParser") +/** + * @author + */ +@Component("genericProtocolParser") @Slf4j -@AllArgsConstructor +@RequiredArgsConstructor public class GenericProtocolParser implements ProtocolParser { - private final LeadingCodeMatcher leadingCodeMatcher; private final List frameStructDispenserList; - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorInstanceSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; // 匹配首字母前导码=> 帧结构匹配前导码=> // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 @@ -44,18 +40,19 @@ public Boolean doParseProtocol(ByteBuf byteBuf) { String protocolContent = ByteBufUtil.hexDump(byteBuf); //匹配前导码 - List preCodeConfigs = leadingCodeMatcher.matchLeadingCode(protocolContent); + List preCodeConfigs = LeadingCodeMatcher.matchFrameLeadingCode(protocolContent); //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 if (preCodeConfigs.size() == 0) { - return rematch(byteBuf,protocolContent); + return rematch(byteBuf, protocolContent); } - //暂时先取第一个 + //暂时先取第一个,提升速度,使用享元模式, 减少类的创建销毁与构建 ProtocolConfig protocolConfig = preCodeConfigs.get(0); + AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); ByteBuf wholeDatagramByte = null; //通过匹配帧结构获取完整的数据包 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, preCodeConfigs.get(0))) != null) { + if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, protocolFactory)) != null) { break; } } @@ -68,76 +65,78 @@ * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 */ - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId, wholeDatagramByte); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap, protocolId); - //选取规则对应的流程实例 - DatagramEventConfig datagramEventConfig = processorInstanceSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); + //进行规则字段解析,进行匹配规则 + RuleConfig ruleConfig = getRuleConfig(protocolFactory, wholeDatagramByte); + if (ruleConfig == null) { + return false; + } //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, wholeDatagramByte); + ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte); + //以下进行业务的规则解析,同时选定流程实例 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); + DatagramEventProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain, + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText, protocolId); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain); //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); + datagramEventProvider.storeData(bizDataMap); return true; } - private Boolean rematch(ByteBuf byteBuf,String protocolContent) { + /** + * 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 + */ + private Boolean rematch(ByteBuf byteBuf, String protocolContent) { //重置位判断 byteBuf.resetReaderIndex(); //判断重置是否前移,如果没有前移,则直接判为匹配失败 if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { return false; } else { + //递归执行 return doParseProtocol(byteBuf); } } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; + //获取匹配规则->匹配规则 + private RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + //取出其中参与逻辑provider并判空 + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); + String rulePrepareFields = protocolConfig.getRulePrepareFields(); + //固定字段 + if (StringUtils.isNotEmpty(rulePrepareFields)) { + //获取统一固定字段解析 + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + //获取该协议的字段配置,用于协议规则匹配 + List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); + //获取规则 + RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, + rulePrepareFields, protocolFieldConfigs); + return ruleConfig; + } + return null; } - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + //数据构建,获取固定字段的store和业务字段store + private Map buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + Map bizDataMap = new HashMap<>(); + Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); + Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); + bizDataMap.putAll(ruleStoreObjectMap); + bizDataMap.putAll(protocolStoreObjectMap); return bizDataMap; } - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java index 8a46e32..16ce2e5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java @@ -3,6 +3,7 @@ import io.netty.buffer.ByteBuf; public interface ProtocolParser { + Boolean doParseProtocol(ByteBuf byteBuf); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java new file mode 100644 index 0000000..f7814af --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java @@ -0,0 +1,35 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.ProtocolConfigProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.ProtocolConfig; + +/** + * 存放基本协议的的加载信息 + */ +public class AbstractProtocolConfigFactory { + private final ProtocolConfigProvider protocolConfigProvider; + private final ProtocolFieldConfigProvider protocolFieldConfigProvider; + private final RuleConfigProvider ruleConfigProvider; + + public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { + this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); + this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); + this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); + } + + public ProtocolConfigProvider getProtocolConfigProvider() { + return protocolConfigProvider; + } + + public ProtocolFieldConfigProvider getProtocolFieldConfigProvider() { + return protocolFieldConfigProvider; + } + + public RuleConfigProvider getRuleConfigProvider() { + return ruleConfigProvider; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java new file mode 100644 index 0000000..6e36147 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java @@ -0,0 +1,57 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.CombinedFieldConfigProvider; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.FieldConfigProvider; +import com.casic.missiles.parser.provider.FieldRuleConfigProvider; + +/** + * 存放规则相关的的的加载信息 + */ +public class AbstractRuleConfigFactory { + + /** + * 处理字节 + */ + private final FieldConfigProvider fieldConfigProvider; + /** + * 处理组合字节解析的解码器 + */ + private final CombinedFieldConfigProvider combinedFieldConfigProvider; + /** + * 处理负责字节解析的规则配置 + */ + private final FieldRuleConfigProvider fieldRuleConfigProvider; + /** + * 处理实例流程 + */ + private final DatagramEventProvider datagramEventProvider; + + + public AbstractRuleConfigFactory(Long ruleId) { + this.fieldConfigProvider = new FieldConfigProvider(ruleId); + this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); + this.fieldRuleConfigProvider = new FieldRuleConfigProvider(ruleId); + this.datagramEventProvider = new DatagramEventProvider(ruleId); + } + + public FieldConfigProvider getFieldConfigProvider() { + return fieldConfigProvider; + } + + public CombinedFieldConfigProvider getCombinedFieldConfigProvider() { + return combinedFieldConfigProvider; + } + + public FieldRuleConfigProvider getFieldRuleConfigProvider() { + return fieldRuleConfigProvider; + } + + public DatagramEventProvider getDatagramEventProvider() { + return datagramEventProvider; + } + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java deleted file mode 100644 index 6e1719a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.factory; - - -import com.casic.missiles.pojo.ProtocolConfig; - -import java.util.List; - -/** - * 数据库访问优化(暂时未做) - *

- * 1、初始化协议解析配置,并存放到处存放缓存,对协议基本配置进行管理 - * 2、其中流程中所有的配置都经过此类进行管理,进行调用获取,增强解析速度 - */ -public interface DatagramFactory { - - /** - * 初始化 - */ - List datagramInit(); - - /** - * 根据前导码配置匹配,模糊匹配获取所有的报文项 - */ - List match(); - - /** - * 根据前导码匹配,返回报文项 - */ - List filer(); - - /** - * 保证数据的唯一性选择器 - */ - List selectOne(); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java new file mode 100644 index 0000000..87444a0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java @@ -0,0 +1,18 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +import java.util.List; + +/** + * 直接用,还是边用边创建 + */ +public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { + + + public DefaultProtocolConfigFactory(ProtocolConfig protocolConfig) { + super(protocolConfig); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java new file mode 100644 index 0000000..cce0c7c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java @@ -0,0 +1,12 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; + +public class DefaultRuleFactory extends AbstractRuleConfigFactory { + + public DefaultRuleFactory(Long ruleId) { + super(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java deleted file mode 100644 index 9ee97e0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.casic.missiles.parser.instance; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service -@Slf4j -@AllArgsConstructor -public class GeneralProcessor { - - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; - - /** - * 统一固定字段解析=>进行规则的查询的判断 - * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 - * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 - */ - @Deprecated - public boolean parseWholeDatagram(ByteBuf buffer, ProtocolConfig protocolConfig) { - try { - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap,protocolId); - //选取规则对应的流程= - DatagramEventConfig datagramEventConfig = processorSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); - //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); - //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); - //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); - //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); - //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); - return true; - } catch (Exception ex) { - log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", - ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); - return false; - } - } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; - } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); - } - - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); - return bizDataMap; - } - - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java index 25e7ad8..6a5777e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java @@ -1,23 +1,31 @@ package com.casic.missiles.parser.instance.impl; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.mapper.DatagramEventMapper; import com.casic.missiles.pojo.DatagramEventConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.SpringContextUtil; -@Service -@AllArgsConstructor +import java.util.List; +import java.util.Optional; + +/** + * @author cz + * + */ public class DefaultProcessorInstanceSelector implements ProcessorInstanceSelector { - private final DatagramEventMapper datagramEventMapper; + private static List datagramEventConfigs; + + static { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + datagramEventConfigs = datagramEventRegistry.getDatagramEventList(); + } @Override public DatagramEventConfig getProcessorInstance(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("rule_id", protocolId); - return datagramEventMapper.selectOne(queryWrapper); + Optional optionalSelectInstance = datagramEventConfigs.stream() + .filter(e -> e.getId().equals(protocolId)).limit(1).findFirst(); + return optionalSelectInstance.isPresent() ? optionalSelectInstance.get() : null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a778671..7b56a43 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,16 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import io.netty.buffer.ByteBuf; /** - * 分析匹配情况 - * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 - * 2、匹配不成功,有后续帧,可以进行下次匹配。 - * 3、匹配不成功,无后续帧,可以进行丢弃。 + * 分析匹配情况 + * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 + * 2、匹配不成功,有后续帧,可以进行下次匹配。 + * 3、匹配不成功,无后续帧,可以进行丢弃。 */ -public interface FrameStructMatcher{ +public interface FrameStructMatcher { - ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig); + ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 05320ab..8ebea78 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,23 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.ProtocolConfigMapper; +import com.casic.missiles.parser.provider.ProtocolConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Component; import java.util.List; import java.util.stream.Collectors; -@Component -@AllArgsConstructor public class LeadingCodeMatcher { - private final ProtocolConfigMapper protocolMapper; - //** 1、首字母匹配前导码, // 2、以匹配出的前导码是否在报文中条件进行前导码的匹配二次筛选 - public List matchLeadingCode(String protocolContent){ + public static List matchFrameLeadingCode(String protocolContent){ List initialConfigs = initialMatch(protocolContent); List preCodeConfigs = initialConfigs.stream() .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) @@ -26,13 +19,16 @@ } //初始化匹配前导码内容 - private List initialMatch(String protocolContent) { - String protocolStr = protocolContent.charAt(0) + ""; - QueryWrapper queryWrapper = new QueryWrapper() - .likeRight("pre_fix", protocolStr); - List protocolConfigList = protocolMapper.selectList(queryWrapper); - return protocolConfigList; + private static List initialMatch(String protocolContent) { + String firstFrameChar = protocolContent.charAt(0) + ""; + ProtocolConfigProvider protocolConfigProvider=new ProtocolConfigProvider(firstFrameChar); + return protocolConfigProvider.getMatchList(); } + + + + + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index cf2113d..e915877 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -1,32 +1,35 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(0) -@Service +@Component public class FrameLengthMatcher implements FrameStructMatcher { - @Autowired - private FieldParser fieldParser; - //超过长度 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { String dataGramContent = ByteBufUtil.hexDump(byteBuf); - if (StringUtils.isEmpty(protocolConfig.getUnpackId()) && StringUtils.isEmpty(protocolConfig.getTailStr())) { - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + //当不存在结尾标志和拆包标志,可以直接使用长度进行匹配 + if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { if (dataGramContent.length() >= totalLength) {//等于长度返回true,超出长度,切断 - ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, protocolConfig, totalLength); + ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, totalLength); return wholeDatagramByte; } else { //读的标志位前移舍弃 @@ -38,7 +41,7 @@ return null; } - private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, Integer totalLength) { byteBuf.readBytes(totalLength); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, totalLength - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 2bfc213..d527ad0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; @@ -13,7 +13,7 @@ import lombok.AllArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.nio.charset.Charset; import java.util.Map; @@ -22,32 +22,30 @@ * 后续标志验证 */ @Order(1) -@Service +@Component @AllArgsConstructor -public class FrameMarkMatcher implements FrameStructMatcher { - - private final FieldConfigDao fieldConfigDao; - private final FieldParser fieldParser; - private final FieldResolver fieldResolverManger; +public class FrameMarkMatcher implements FrameStructMatcher, FixedPropertyEnum { //帧后续标志=>结束,进行帧的重组=>有后续,1、帧移位判别 2、继续接收帧 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig UnpackConfig = StringUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getUnpackId()); - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); - Integer upback = 0; + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); ByteBuf mergeWholeFrameByte = null; - if (!ObjectUtil.isEmpty(UnpackConfig)) { - while (hasNextFullFrame(byteBuf, protocolConfig)) { - upback = (Integer) fieldResolverManger.filedParserManger(byteBuf, UnpackConfig, null); + if (!ObjectUtil.isEmpty(unpackFlag)) { + while (hasNextFullFrame(byteBuf, protocolConfig, protocolFieldConfigProvider)) { //是否存在后续位 - if (upback == 1) {//使用esayRule + if (unpackFlag == 1) {//使用esayRule //表示可以截取 - mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolConfig, totalLength); + mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolFieldConfigProvider, protocolConfig); return mergeWholeFrameByte; } else { - byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig)); + byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig, protocolFieldConfigProvider)); } } } @@ -56,7 +54,8 @@ //选取第一个帧,将业务内容和后面部分分开 //计算数据报文-业务内容 - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolFieldConfigProvider protocolFieldConfigProvider, ProtocolConfig protocolConfig) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); //截取完整报文 byteBuf.readBytes(totalLength); ByteBuf byteBufContent = byteBuf.slice(0, byteBuf.readerIndex()); @@ -68,15 +67,15 @@ String tail = ""; System.out.println(ByteBufUtil.hexDump(byteBufContent)); //会存在多个帧拼接在一起的的情况,进行合并处理 - while (hasNextFullFrame(byteBufContent, protocolConfig)) { - Integer currentFrameLength = fieldParser.getTotalLength(protocolConfig, byteBufContent); + while (hasNextFullFrame(byteBufContent, protocolConfig, protocolFieldConfigProvider)) { + Integer currentFrameLength = protocolFieldConfigProvider.getTotalLength(byteBufContent, protocolConfig); byteBufContent.readBytes(currentFrameLength); ByteBuf currentbyteBuf = byteBufContent.slice(0, byteBufContent.readerIndex()); byteBufContent.markReaderIndex();//读的标志位前移 System.out.println(ByteBufUtil.hexDump(byteBufContent)); String hexDump = currentbyteBuf.toString(Charset.forName("ISO-8859-1")); //获取当前固定帧结构的关系map - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, currentbyteBuf); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(currentbyteBuf, protocolConfig); if (StringUtils.isEmpty(mergeFrameStr)) { //首次获取业务数据报文 mergeFrameStr += hexDump.substring(0, currentFrameFixedProperty.get("tailPosition")); @@ -95,22 +94,22 @@ /** * 获取平移到下一帧起始位置 */ - public int getNextFrameOffset(ByteBuf buffer, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, buffer); - return currentFrameFixedProperty.get("totalLength"); + public int getNextFrameOffset(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + return currentFrameFixedProperty.get(TOTAL_LENGTH); } /** * 判断是否出错进行整个帧的 */ - public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, byteBuf); + public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); //保证读取位置不在固定位置,是可变的业务内容 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("fixedPosition")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(FIXED_POSITION)) { return false; } //判断读取是否操作帧长度 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("totalLength")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(TOTAL_LENGTH)) { return false; } return true; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 76a3784..c3a1bab 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -1,50 +1,50 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.parser.instance.GeneralProcessor; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; +import io.netty.buffer.ByteBufUtil;; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(2) -@Service +@Component public class FrameTailMatcher implements FrameStructMatcher { - @Resource - private FieldConfigDao fieldConfigDao; - @Autowired - private GeneralProcessor generalProcessor; - //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig tailFieldConfig = StringUtils.isEmpty(protocolConfig.getTailStr()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getTailStr()); - if (!ObjectUtil.isEmpty(tailFieldConfig)) { - String tailStr = tailFieldConfig.getFieldName(); + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfig protocolFieldConfig = ObjectUtils.isEmpty(protocolConfig.getTailStr()) ? null : + fieldConfigProvider.getFieldConfigById(protocolConfig.getTailStr()); + if (!ObjectUtil.isEmpty(protocolFieldConfig)) { + String tailStr = protocolFieldConfig.getFieldName(); String dataGramContent = ByteBufUtil.hexDump(byteBuf); Boolean tailFlag = ByteBufUtil.hexDump(byteBuf).contains(tailStr); if (!tailFlag) { //使用esayRule return null; } else if (dataGramContent.indexOf(tailStr) < dataGramContent.length() - tailStr.length()) { Integer length = dataGramContent.indexOf(tailStr) + tailStr.length(); - ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, protocolConfig, length); + ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, length); return wholeDatagramByte; //存在粘包 } } return null; } - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer length) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, Integer length) { byteBuf.readBytes(length); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, length - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java new file mode 100644 index 0000000..5f1c177 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java @@ -0,0 +1,73 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.combined.GenericCombinedFieldResolver; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.CombinedFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class CombinedFieldConfigProvider { + + + /** + * 作为临时配置列表缓存使用 + */ + private final List combinedFieldConfigList; + private Map storeObjectMap = new HashMap<>(); + + public CombinedFieldConfigProvider(Long ruleId) { + CombinedFieldConfigRegistry combinedFieldConfigRegistry = SpringContextUtil.getBean(CombinedFieldConfigRegistry.class); + combinedFieldConfigList = combinedFieldConfigRegistry.getCombinedFieldConfigList(ruleId); + } + + public void parseDataField(RuleConfig ruleConfig, String clearZeroPlain,Map fieldConfigsMap ) { + if (showSkip()) { + return; + } + //匹配对应的数据,然后进行相关的字段解析 + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver(); + combinedFieldResolver.parseDataField(combinedFieldConfigList, byteBuf, storeObjectMap,fieldConfigsMap); + } + + + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getCombinedFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return combinedFieldConfigList.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public List getCombinedFieldConfigList() { + return combinedFieldConfigList; + } + + /* 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(combinedFieldConfigList) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java new file mode 100644 index 0000000..f3cfedc --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java @@ -0,0 +1,11 @@ +package com.casic.missiles.parser.provider; + +/** + * @author cz + * @date 2023-6-12 + */ +public class CommandEventProvider{ + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java new file mode 100644 index 0000000..70eec5e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java @@ -0,0 +1,77 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.safe.SafeStrategy; +import com.casic.missiles.parser.sender.DataSubscribeProvider; +import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class DatagramEventProvider { + + private final DatagramEventConfig processorInstance; + + public DatagramEventProvider(Long ruleId) { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + List datagramEventConfigList = + datagramEventRegistry.getDatagramEventList(ruleId); + processorInstance = this.getProcessorInstance(datagramEventConfigList); + } + + public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { + if (showSkip()) { + return null; + } + return datagramEventConfigList.get(0); + } + + // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 + public String getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap) { + String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? + processorInstance.getSafeBean() : + fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); + if (!StringUtils.isEmpty(safeName)) { + //需要加密 + SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); + String plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); + return clearComplementZero(plain); + } + return ByteBufUtil.hexDump(bizDataContent); + } + + //解密清零操作 + private String clearComplementZero(String plain) { + plain = plain.substring(0, plain.lastIndexOf("00")); + return plain; + } + + //数据发送,数据发送者暂未构建 + public void storeData(Map bizDataMap) { + DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); +// dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return ObjectUtils.isNotEmpty(processorInstance) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java new file mode 100644 index 0000000..7e1fe0a --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java @@ -0,0 +1,97 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.FieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class FieldConfigProvider { + + + private final List fieldConfigs; + private Map storeObjectMap = new HashMap<>(); +// private Map singleObjects = new ConcurrentHashMap<>(); + + public FieldConfigProvider(Long ruleId) { + FieldConfigRegistry fieldConfigRegistry = SpringContextUtil.getBean(FieldConfigRegistry.class); + fieldConfigs = fieldConfigRegistry.getFieldConfigList(ruleId); + } + + public List getFieldConfigs() { + return fieldConfigs; + } + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public Map parseDataField(RuleConfig ruleConfig, String clearZeroPlain) { + if (showSkip()) { + return null; + } + List prepareFieldConfig = prepareParseField(ruleConfig); + if (CollectionUtils.isNotEmpty(prepareFieldConfig)) { + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(fieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + return fixDataMap; + } + } + return null; + } + + /** + * 得到需要处理的业务内容 + * + * @return + */ + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return fieldConfigs.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public Map getFieldConfigsMap() { + return fieldConfigs.stream().collect( + Collectors.toMap(FieldConfig::getId, e -> e) + ); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(fieldConfigs) ? false : true; + } + + +} + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java new file mode 100644 index 0000000..817bfaf --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java @@ -0,0 +1,19 @@ +package com.casic.missiles.parser.provider; + +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.registry.FieldRuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; + +public class FieldRuleConfigProvider { + + private final List fieldRuleConfigList; + + public FieldRuleConfigProvider(Long ruleId) { + FieldRuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(FieldRuleConfigRegistry.class); + fieldRuleConfigList = ruleConfigRegistry.getFieldRuleConfigList(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java new file mode 100644 index 0000000..99a1b06 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java @@ -0,0 +1,53 @@ +package com.casic.missiles.parser.provider; + + +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.registry.ProtocolConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolConfigProvider { + + private final List protocolConfigList; + + public ProtocolConfigProvider(String firstChar) { + ProtocolConfigRegistry registry = SpringContextUtil.getBean(ProtocolConfigRegistry.class); + protocolConfigList = registry.getProtocolConfigList(firstChar); + } + + public List getMatchList() { + return protocolConfigList; + } + + /** + * 设置当前协议 + * + * @param protocolConfig + */ + public ProtocolConfigProvider(ProtocolConfig protocolConfig) { + List protocolConfigs = new ArrayList<>(); + protocolConfigs.add(protocolConfig); + protocolConfigList = protocolConfigs; + } + + /** + * 获取当前协议 + * + * @return + */ + public ProtocolConfig getCurrentProtocolConfig() { + if (this.protocolConfigList == null) { + return null; + } else { + return protocolConfigList.get(0); + } + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java new file mode 100644 index 0000000..043927d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java @@ -0,0 +1,213 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.registry.ProtocolFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolFieldConfigProvider { + + private static final String FIXED_FIELD_DS = "fixedFieldDs"; + private static final String CONTENT_FIELD_DS = "contentFieldDs"; + private static final String PROTOCOL_LENGTH = "protocolLength"; + private static final String PROTOCOL_FIELD_ID = "protocolFieldId"; + private static final String PROTOCOL_POSITION = "protocolPosition"; + + private final List protocolFieldConfigs; + private Map singleObjects = new ConcurrentHashMap<>(); + private Map storeObjectMap = new HashMap<>(); + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public ProtocolFieldConfigProvider(Long protocolId) { + ProtocolFieldConfigRegistry protocolFieldConfigRegistry = SpringContextUtil.getBean(ProtocolFieldConfigRegistry.class); + protocolFieldConfigs = protocolFieldConfigRegistry.getProtocolFieldConfigList(protocolId); + } + + public List getProtocolFieldConfigs() { + return protocolFieldConfigs; + } + + public ProtocolFieldConfig getFieldConfigById(Long fieldId) { + Optional optionalConfig = protocolFieldConfigs.stream().filter( + e -> e.getId().equals(fieldId) + ).findFirst(); + return optionalConfig.isPresent() ? optionalConfig.get() : null; + } + + public Integer getProtocolFieldValue(Long protocolFieldId, ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_FIELD_ID + protocolFieldId + ByteBufUtil.hexDump(byteBuf); + //获取缓存 + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + //加载固定长度数据集合 + Map fixDataMap = this.getProtocolDataMap(byteBuf); + ProtocolFieldConfig protocolFieldConfig = selectFieldConfig(protocolFieldId); + Integer protocolFieldValue = 0; + //获取约定字段的总长度 + if (fixDataMap.containsKey(protocolFieldConfig.getFieldName())) { + Object appointUnpackObject = fixDataMap.get(protocolFieldConfig.getFieldName()); + if (ObjectUtils.isNotEmpty(appointUnpackObject)) { + protocolFieldValue = (Integer) appointUnpackObject; + } + } + if (protocolFieldValue != null) { + //加入缓存 + if (ObjectUtils.isNotEmpty(protocolFieldValue)) { + this.singleObjects.put(catchKey, protocolFieldValue); + return protocolFieldValue; + } + } + return null; + } + + /** + * 获取帧固定位置信息 + * + * @param byteBuf + * @param protocolConfig + * @return + */ + public Map getFixedProperty(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_POSITION + protocolConfig.getId(); + if (this.singleObjects.containsKey(catchKey)) { + return (Map) singleObjects.get(catchKey); + } + Map fixedPropertyMap = new HashMap<>(); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + fixedPropertyMap = fieldParser.doGetFixedProperty(protocolFieldConfigs, this.getTotalLength(byteBuf,protocolConfig)); + if (CollectionUtils.isNotEmpty(fixedPropertyMap)) { + this.singleObjects.put(catchKey, fixedPropertyMap); + return fixedPropertyMap; + } + return fixedPropertyMap; + } + + /** + * 获取帧结构应有的总长度 + */ + public Integer getTotalLength(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_LENGTH + ByteBufUtil.hexDump(byteBuf); + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + Integer appointFrameLength = getProtocolFieldValue(protocolConfig.getTotalLengthId(), byteBuf); + if (appointFrameLength != null) { + //获取过滤的字段集合总长度 + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Integer totalFilterLength = fieldParser.getTotalFilterLength(protocolConfig, byteBuf, getFixFieldConfigMap()); + //计算总长度 + Integer totalLength = appointFrameLength + totalFilterLength; + //加入缓存 + if (ObjectUtils.isNotEmpty(totalLength)) { + this.singleObjects.put(catchKey, totalLength); + return totalLength; + } + } + return null; + } + + /** + * 获取协议有关字段解析内容 + * storeObjectMap存储代转存的数据 + * + * @return + */ + public Map getProtocolDataMap(ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(FIXED_FIELD_DS)) { + return (Map) singleObjects.get(FIXED_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(protocolFieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + this.singleObjects.put(FIXED_FIELD_DS, fixDataMap); + return fixDataMap; + } + return null; + } + + /** + * 获取业务报文内容的content字节 + * + * @param wholeDatagramByte + * @return + */ + public ByteBuf getDataContentBuf(ByteBuf wholeDatagramByte) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(CONTENT_FIELD_DS)) { + return (ByteBuf) singleObjects.get(CONTENT_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + ByteBuf bizDataByteBuf = fieldParser.getDataContentBuf(protocolFieldConfigs, wholeDatagramByte); + if (bizDataByteBuf != null) { + this.singleObjects.put(CONTENT_FIELD_DS, bizDataByteBuf); + return bizDataByteBuf; + } + return null; + } + + + private ProtocolFieldConfig selectFieldConfig(Long id) { + Optional optionalProtocolFieldConfig = this.protocolFieldConfigs.stream().filter( + e -> e.getId().equals(id) + ).findFirst(); + return optionalProtocolFieldConfig.isPresent() ? optionalProtocolFieldConfig.get() : null; + } + + + private Map getFixFieldConfigMap() { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, e -> e) + ); + return fixDataFieldMap; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(protocolFieldConfigs) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java new file mode 100644 index 0000000..dafba1c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java @@ -0,0 +1,56 @@ +package com.casic.missiles.parser.provider; + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.rule.GenericRuleResolver; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.RuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleConfigProvider { + + private final List ruleConfigs; + + public List getRuleConfigs() { + return ruleConfigs; + } + + public RuleConfigProvider(Long protocolId) { + RuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(RuleConfigRegistry.class); + ruleConfigs = ruleConfigRegistry.getRuleConfigById(protocolId); + } + + /** + * 获取规则匹配结果 + * + * @param parseFixedDataMap + * @param protocolFieldConfigs + * @return + */ + public RuleConfig doGetRule(Map parseFixedDataMap, + String ids, + List protocolFieldConfigs) { + if (showSkip()) { + return null; + } + RuleConfig ruleConfig = GenericRuleResolver.machRule(parseFixedDataMap, ids, protocolFieldConfigs, ruleConfigs); + return ruleConfig; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(ruleConfigs) ? false : true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java index 3c05891..856b399 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java @@ -1,18 +1,11 @@ package com.casic.missiles.parser.resolver; -import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.springframework.web.bind.annotation.RequestBody; -import javax.annotation.Resource; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -20,19 +13,17 @@ @Slf4j public class ByteMergeProvider { - @Resource - private FieldRuleEngineMapper fieldRuleEngineMapper; - //拿到所有的值合并到一个值 - public String resolveByteMerge(List valueList, String ruletypeId, String vaildRange) { + public static String resolveByteMerge(List valueList, String ruleTypeId, String vaildRange) { String values = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Map vaildMap = getValidRangeMap(vaildRange); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(ruletypeId); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } + //暂时不处理 +// fieldRuleEngine = fieldRuleConfigMapper.selectById(ruleTypeId); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } Map env2 = new HashMap(); for (int i = 0; i < valueList.size(); i++) { if (vaildMap.containsKey(i)) { @@ -47,7 +38,7 @@ } } - private Map getValidRangeMap(String vaildRange) { + private static Map getValidRangeMap(String vaildRange) { String[] range = vaildRange.split(","); Map vaildMap = new HashMap(); for (int i = 0; i < range.length; i++) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 8d821cd..85d6bbf 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -1,9 +1,12 @@ package com.casic.missiles.parser.resolver; +import com.casic.missiles.pojo.AbstractFieldConfig; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; import io.netty.buffer.ByteBuf; +import java.util.List; import java.util.Map; /** @@ -11,18 +14,14 @@ */ public interface FieldParser { -// Map fieldProcess(String protocolContent,); - Map dataParser(RuleConfig ruleConfig, String lightText,String protocolId); + Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength); - Map fixDataParser(String protocolId, ByteBuf buffer); + Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap); - Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf); + ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer); - ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer); - - ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer); - - Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer); + Integer getTotalFilterLength(ProtocolConfig protocolConfig, ByteBuf byteBuf, Map protocolFieldConfigMap); } + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java new file mode 100644 index 0000000..9e0c00e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java @@ -0,0 +1,52 @@ +package com.casic.missiles.parser.resolver; + +import com.casic.missiles.pojo.AbstractFieldConfig; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.util.List; + +public class FieldParserSupport { + + //分别计算bit和byte长度=> 合并长度 + protected Integer calculateLength(List fieldConfigList) { + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + Integer fixedLength = bytefixedLength + bitfixedLength / 8; + return fixedLength; + } + + //找到最大值=> 根据最大值计算业务数据下标 + protected Integer calculatePosition(List fieldConfigList) { + String rex = "[0-9]+"; + Integer max = -1; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) + && Integer.valueOf(fieldConfig.getOriginPositionByte()) > max) { + max = Integer.valueOf(fieldConfig.getOriginPositionByte()); + } + } + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) && fieldConfig.getOriginPositionByte().equals(max)) { + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + } + } + Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; + return maxFixedPosition; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java deleted file mode 100644 index dd3a6cd..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java +++ /dev/null @@ -1,170 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.ByteResolverParam; -import io.netty.buffer.ByteBuf; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -/** - * 字段解析管理总类 - */ -@Service -@Slf4j -@AllArgsConstructor -public class FieldResolver extends ByteMergeProvider { - - //1、字段截取 => 2、简单的字节解析和复杂的字节解析 - public Object filedParserManger(ByteBuf byteBuf, FieldConfig fieldConfig, Integer maxFixedPosition) { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - //最大固定位置不为空, - if (!ObjectUtil.isEmpty(maxFixedPosition)) { - orignPosition -= maxFixedPosition; - } - Object fieldValue = 0; - //待优化 - if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { - fieldValue = bitToResolver(byteBuf, fieldConfig); - } else { - ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); - fieldValue = parsingFields(fieldBytes, fieldConfig.getRuleJson()); - } - return fieldValue; - } - - //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, - //目前默认配置的规则设置暂不支持配置化,由实现完成 - private Object parsingFields(ByteBuf byteBuf, String ruleJson) { - Object fieldsResolveValue = null; - List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); - if (ObjectUtil.isEmpty(ruleMapList)) { - fieldsResolveValue = defaultResolveBuilder(byteBuf); - } else { - fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); - } - return fieldsResolveValue; - } - - private Object defaultResolveBuilder(ByteBuf byteBuf) { - Integer defaultResolveValue = 0; - for (int i = 0; i < byteBuf.writerIndex(); i++) { - defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; - } - return defaultResolveValue; - } - - //字段解析构建器(针对字节单位的) - //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 - // 字节归并结束或者规则结束=>继续根据规则进行判断 - private Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { - Object customizeResolveValue = null; - try { - List bytStrList = new ArrayList<>(); - //存放到数组里面 - for (int i = 0; i < byteBuf.writerIndex(); i++) { - bytStrList.add(byteBuf.readByte()); - } - int i = 0; - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - customizeResolveValue = this.resolveByteMerge(bytStrList, ruletypeId,vaildRange); - break; - } else { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - List tempBytStr = new ArrayList<>(); - for (int k = 0; i < bytStrList.size(); i++) { - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(k) - .value(bytStrList.get(k)) - .ruletypeId(ruletypeId).build(); - tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); - } - bytStrList = tempBytStr; - } - i++; - } - //字节归并到一起=>继续根据规则进行判断 - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(customizeResolveValue) - .ruletypeId(ruletypeId).build(); - customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(customizeResolveValue)); - return customizeResolveValue; - } catch (RuntimeException ex) { - log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); - return null; - } - } - - /** - * 1、单个字节情况表示字段 - * 2、多字节情况表示字段(暂未处理) - */ - private Object bitToResolver(ByteBuf byteBuf, FieldConfig fieldConfig) { - Object fieldValue = new Object(); - try { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - byte fields = 0x00; - if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); - } else { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); - } - - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { - if (!StringUtils.isEmpty(fieldConfig.getExactOrignPosition())) { - fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getExactOrignPosition())).byteValue() - >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); - } else { - fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); - } - } else { - fieldValue = Integer.valueOf(fields & 0xff); - } - if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { - return fieldValue; - } - List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); - int i = 0; - //字节归并到一起=>继续根据规则进行判断 - while (i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(fieldValue) - .ruletypeId(ruletypeId).build(); - fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(fieldValue)); - return fieldValue; - } catch (RuntimeException ex) { - log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); - return null; - } - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java new file mode 100644 index 0000000..1d2aeab --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java @@ -0,0 +1,36 @@ +package com.casic.missiles.parser.resolver.bytes; + +import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.mapper.FieldRuleConfigMapper; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.pojo.ByteResolverParam; +import com.googlecode.aviator.AviatorEvaluator; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; +//转换规则 +@Component("convert") +@AllArgsConstructor +@Slf4j +public class ByteRuleResolver implements ByteResolver { + + private final FieldRuleConfigMapper fieldRuleConfigMapper; + + @Override + public Object resolveOperationRule(ByteResolverParam byteResolverParam){ + FieldRuleConfig fieldRuleEngine=fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); + if(ObjectUtil.isEmpty(fieldRuleEngine)){ + return byteResolverParam.getValue(); + } + String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); + Map env2 = new HashMap(); + env2.put("value", (byte) byteResolverParam.getValue()); + String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); + return values; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java index 103821c..786b71c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java @@ -2,34 +2,34 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("logicalShift") +@Component("logicalShift") @AllArgsConstructor @Slf4j public class LogicalShiftResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //字节位移 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { Integer index = byteResolverParam.getIndex(); - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return byteResolverParam.getValue(); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java index 476747d..01149bd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("operation") +@Component("operation") @AllArgsConstructor @Slf4j public class OperationResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //混合运算,有常量或者乘除的缩放 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java index 0b82cf4..79abcce 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.casic.missiles.pojo.ByteResolverParam; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; //精度计算 -@Service("precision") +@Component("precision") @AllArgsConstructor @Slf4j public class PrecisionResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java deleted file mode 100644 index 5c3f332..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; -//转换规则 -@Service("convert") -@AllArgsConstructor -@Slf4j -public class RuleResolver implements ByteResolver { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam){ - RuleEvaluator fieldRuleEngine=fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); - if(ObjectUtil.isEmpty(fieldRuleEngine)){ - return byteResolverParam.getValue(); - } - String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); - Map env2 = new HashMap(); - env2.put("value", (byte) byteResolverParam.getValue()); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java new file mode 100644 index 0000000..d3bbd91 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java @@ -0,0 +1,15 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; + +import java.util.List; +import java.util.Map; +// 前导码匹配->长度字段 +public interface AbstractCombinedFieldProcessor { + + Map invoke(Map map, ByteBuf byteBuf, List combinedFieldConfigList, + Map fieldConfigsMap, Map storeObjectMap); + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java new file mode 100644 index 0000000..03c8480 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java @@ -0,0 +1,59 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-13 + */ +//依次递增进行数据的解析, +public class GenericCombinedFieldResolver { + + + //通过查询,字段长度长度随机 + public void parseDataField(List combinedFieldConfigList, ByteBuf byteBuf, + Map storeObjectMap, Map fieldConfigsMap) { + Integer frameLength = Integer.valueOf(ByteBufUtil.hexDump(byteBuf)); + //添加前置处理器 + com.casic.missiles.util.ClassUtil classUtil = new com.casic.missiles.util.ClassUtil(); + List abstractCombinedProcessors = classUtil.getSubClassList(AbstractCombinedFieldProcessor.class); + + Map fieldFixedMap = combinedFieldLeadCodeMap(combinedFieldConfigList); + //frameLength + Map combinedProcessorFields = null; + while (byteBuf.readableBytes() < frameLength) { + //一直处理 + for (AbstractCombinedFieldProcessor abstractCombinedProcessor : abstractCombinedProcessors) { + combinedProcessorFields = abstractCombinedProcessor.invoke(combinedProcessorFields, byteBuf, + combinedFieldConfigList, + fieldConfigsMap, storeObjectMap); + if (combinedProcessorFields == null || byteBuf.readableBytes() < frameLength) { + return; + } + } + + } + } + + /** + * 取出前导码匹配集合 + */ + private Map combinedFieldLeadCodeMap(List combinedFieldConfigList) { + Map fieldFixedMap = combinedFieldConfigList + .stream() + .collect(Collectors.toMap(CombinedFieldConfig::getPrefixCode, e -> e)); + return fieldFixedMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java new file mode 100644 index 0000000..643a934 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java @@ -0,0 +1,100 @@ +package com.casic.missiles.parser.resolver.fields; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.FieldParserSupport; +import com.casic.missiles.pojo.*; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 保存使用时最基本的信息,并且使用原型模式 + */ +@Slf4j +public class DefaultProtocolFieldParser extends FieldParserSupport implements FieldParser, FixedPropertyEnum { + + //通过传入的配置和报文进行字段解析 + @Override + public Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap) { + Map dataMap = new HashMap<>(); + for (AbstractFieldConfig protocolFieldConfig : protocolFieldConfigs) { + if (!ObjectUtils.isEmpty(protocolFieldConfig.getOriginPositionByte())) { + Object fieldValue = FieldResolver.parseField(buffer, protocolFieldConfig, null); + if (protocolFieldConfig.getIsStorage() == 1) { + storeObjectMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + dataMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + } + return dataMap; + } + + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength) { + Map fixedPropertyMap = new HashMap<>(); + Integer fixedLength = calculateLength(protocolFieldConfigs); + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + fixedPropertyMap.put(FIXED_POSITION, maxFixedPosition); + fixedPropertyMap.put(TOTAL_LENGTH, totalLength); + fixedPropertyMap.put(TAIL_POSITION, totalLength - fixedLength + maxFixedPosition); + return fixedPropertyMap; + } + + //** 获取业务内容的byteBuf + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer) { + //计算固定长度 + Integer fixedLength = calculateLength(protocolFieldConfigs); + //总长度获取 + String lightText = buffer.toString(Charset.forName("ISO-8859-1")); + Integer totalLength = lightText.length(); + //计算固定长度最大长度 + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + //计算数据报文内容 + ByteBuf bizDataFields = buffer.slice(maxFixedPosition - 1, (totalLength - fixedLength)); + return bizDataFields; + } + + /** + * 获取过滤字段的长度 + */ + @Override + public Integer getTotalFilterLength(ProtocolConfig protocolConfig, + ByteBuf byteBuf, + Map protocolFieldConfigMap) { + if (ByteBufUtil.hexDump(byteBuf).equals("")) { + return 0; + } + int totalFilterLength = 0; + String filterFields = protocolConfig.getTotalLengthFilterFields(); + try { + if (!StringUtils.isEmpty(filterFields)) { + String[] filterFieldList = filterFields.split(","); + for (String filterFieldId : filterFieldList) { + if (StringUtils.isNotEmpty(filterFieldId)) { + ProtocolFieldConfig fieldConfig = protocolFieldConfigMap.get(Long.valueOf(filterFieldId)); + //这里都是按字节计算,没有对位进行区分,可能会出现错误 + // 如果对位有需求,需要进一步跟进 + totalFilterLength += fieldConfig.getOffsetLength(); + } + } + } + return totalFilterLength; + } catch (Exception ex) { + log.error("报文确认分发阶段,获取报文总长度过滤长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); + } + return totalFilterLength; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java new file mode 100644 index 0000000..d51e887 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java @@ -0,0 +1,169 @@ +package com.casic.missiles.parser.resolver.fields; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.parser.resolver.ByteMergeProvider; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.AbstractFieldConfig; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.pojo.ByteResolverParam; +import io.netty.buffer.ByteBuf; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * 字段解析管理总类 + */ +@Slf4j +public class FieldResolver extends ByteMergeProvider { + + //1、字段截取 => 2、简单的字节解析和复杂的字节解析 + public static Object parseField(ByteBuf byteBuf,AbstractFieldConfig fieldConfig, Integer maxFixedPosition) { + Integer orignPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + //最大固定位置不为空, + if (!ObjectUtil.isEmpty(maxFixedPosition)) { + orignPosition -= maxFixedPosition; + } + Object fieldValue = 0; + //待优化 + if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { + fieldValue = doParseBitField(byteBuf, fieldConfig); + } else { + ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); + fieldValue = doParseByteField(fieldBytes, fieldConfig.getRuleJson()); + } + return fieldValue; + } + + //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, + //目前默认配置的规则设置暂不支持配置化,由实现完成 + private static Object doParseByteField(ByteBuf byteBuf, String ruleJson) { + Object fieldsResolveValue = null; + List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); + if (ObjectUtil.isEmpty(ruleMapList)) { + fieldsResolveValue = defaultResolveBuilder(byteBuf); + } else { + fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); + } + return fieldsResolveValue; + } + + private static Object defaultResolveBuilder(ByteBuf byteBuf) { + Integer defaultResolveValue = 0; + for (int i = 0; i < byteBuf.writerIndex(); i++) { + defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; + } + return defaultResolveValue; + } + + //字段解析构建器(针对字节单位的) + //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 + // 字节归并结束或者规则结束=>继续根据规则进行判断 + private static Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { + Object customizeResolveValue = null; + try { + List bytStrList = new ArrayList<>(); + //存放到数组里面 + for (int i = 0; i < byteBuf.writerIndex(); i++) { + bytStrList.add(byteBuf.readByte()); + } + int i = 0; + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { + if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + customizeResolveValue = resolveByteMerge(bytStrList, ruletypeId, vaildRange); + break; + } else { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + List tempBytStr = new ArrayList<>(); + for (int k = 0; i < bytStrList.size(); i++) { + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(k) + .value(bytStrList.get(k)) + .ruletypeId(ruletypeId).build(); + tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); + } + bytStrList = tempBytStr; + } + i++; + } + //字节归并到一起=>继续根据规则进行判断 + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(null) + .value(customizeResolveValue) + .ruletypeId(ruletypeId).build(); + customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); + i++; + } + System.out.println(JSON.toJSON(customizeResolveValue)); + return customizeResolveValue; + } catch (RuntimeException ex) { + log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); + return null; + } + } + + /** + * 1、单个字节情况表示字段 + * 2、多字节情况表示字段(暂未处理) + */ + private static Object doParseBitField(ByteBuf byteBuf,AbstractFieldConfig fieldConfig) { + Object fieldValue = new Object(); + try { + Integer orignPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + byte fields = 0x00; + if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { + fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); + } else { + fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); + } + + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { + if (!StringUtils.isEmpty(fieldConfig.getOriginPositionBit())) { + fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getOriginPositionBit())).byteValue() + >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); + } else { + fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); + } + } else { + fieldValue = Integer.valueOf(fields & 0xff); + } + if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { + return fieldValue; + } + List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); + int i = 0; + //字节归并到一起=>继续根据规则进行判断 + while (i < ruleMapList.size()) { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(null) + .value(fieldValue) + .ruletypeId(ruletypeId).build(); + fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); + i++; + } + System.out.println(JSON.toJSON(fieldValue)); + return fieldValue; + } catch (RuntimeException ex) { + log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); + return null; + } + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java deleted file mode 100644 index 35ae3d0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java +++ /dev/null @@ -1,183 +0,0 @@ -package com.casic.missiles.parser.resolver.fields; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufAllocator; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; -import org.springframework.util.ObjectUtils; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service("standard") -@AllArgsConstructor -@Slf4j -public class StandardFieldParser implements FieldParser { - - private final FieldConfigDao fieldConfigDao; - private final FieldResolver fieldResolver; - - //数据解析 - @Override - public Map dataParser(RuleConfig ruleConfig, String lightText, String protocolId) { - String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); - ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); - bufferContent.writeBytes(lightText.getBytes(Charset.forName("ISO-8859-1"))); - Map dataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - for (String dataFieldId : dataFieldIds) { - FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(dataFieldId); - if (!ObjectUtils.isEmpty(fieldConfig)) { - dataMap.put(fieldConfig.getFieldName(), String.valueOf(fieldResolver.filedParserManger(bufferContent, fieldConfig, maxFixedPosition))); - } - } - return dataMap; - } - - //数据解析 - @Override - public Map fixDataParser(String protocolId, ByteBuf buffer) { - List dataFieldIdList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Map dataMap = new HashMap<>(); - for (FieldConfig dataField : dataFieldIdList) { - if (!ObjectUtils.isEmpty(dataField.getOrignPosition())) { - Object fieldValue = (Integer) fieldResolver.filedParserManger(buffer, dataField, null); - dataMap.put(dataField.getFieldName(), fieldValue); - } - } - return dataMap; - } - - @Override - public Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf) { - if (ByteBufUtil.hexDump(byteBuf).equals("")) { - return 0; - } - String filterFields = protocolConfig.getTotalLengthFilterField(); - Integer totalLength = 0; - try { - FieldConfig totalFieldConfig = fieldConfigDao.getFieldConfigById(protocolConfig.getTotalLengthId()); - int totalFilterLength = 0; - if (!StringUtils.isEmpty(filterFields)) { - String[] filterFieldList = filterFields.split(","); - for (String filterField : filterFieldList) { - FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(filterField); - //这里都是按字节计算,没有对位进行区分,可能会出现错误 - - // 如果对位有需求,需要进一步跟进 - totalFilterLength += fieldConfig.getOffsetLength(); - } - } - totalLength = (Integer) fieldResolver.filedParserManger(byteBuf, totalFieldConfig, null) + totalFilterLength; - } catch (Exception ex) { - log.error("报文确认分发阶段,获取报文总长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); - } - return totalLength; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer) { - //业务内容 - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - String protocolId = String.valueOf(protocolConfig.getId()); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - //计算固定长度 - Integer fixedLength = calculateLength(fieldConfigList); -// Integer totalLength = this.getTotalLength(protocolConfig, buffer); - //总长度获取 - Integer totalLength = lightText.length(); - //计算固定长度最大长度 - Integer maxFixedPosition = calculatePosition(fieldConfigList); -// buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - //计算数据报文内容 - ByteBuf bizDataFields = buffer.slice(maxFixedPosition-1, (totalLength - fixedLength)); - return bizDataFields; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer) { - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - String protocolId = String.valueOf(protocolConfig.getId()); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer fixedLength = calculateLength(fieldConfigList); -// Integer totalLength = this.getTotalLength(protocolConfig, buffer); - Integer totalLength = lightText.length(); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - ByteBuf fixDataFields = buffer.slice(0, maxFixedPosition); - return fixDataFields; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer) { - String protocolId = String.valueOf(protocolConfig.getId()); - Map fixedPropertyMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer fixedLength = calculateLength(fieldConfigList); - Integer totalLength = this.getTotalLength(protocolConfig, buffer); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - fixedPropertyMap.put("fixedPosition", maxFixedPosition); - fixedPropertyMap.put("totalLength", totalLength); - fixedPropertyMap.put("tailPosition", totalLength - fixedLength + maxFixedPosition); - return fixedPropertyMap; - } - - //分别计算bit和byte长度=> 合并长度 - private Integer calculateLength(List fieldConfigList) { - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (FieldConfig fieldConfig : fieldConfigList) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - Integer fixedLength = bytefixedLength + bitfixedLength / 8; - return fixedLength; - } - - //找到最大值=> 根据最大值计算业务数据下标 - private Integer calculatePosition(List fieldConfigList) { - String rex = "[0-9]+"; - Integer max = -1; - for (FieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOrignPosition()) - && Integer.valueOf(fieldConfig.getOrignPosition()) > max) { - max = Integer.valueOf(fieldConfig.getOrignPosition()); - } - } - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (FieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOrignPosition()) && fieldConfig.getOrignPosition().equals(max)) { - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - } - } - Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; - return maxFixedPosition; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java index 608af3a..32cc8a4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java @@ -2,48 +2,47 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.delivery.decorator.ByteDecorator; +import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @AllArgsConstructor public class FieldDecoratorManger { - private final RuleDictDao ruleDictDao; + private final RuleConfigRegistry ruleDictDao; // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 // (1)静态的业务字段是字典里面可以配置的 // (2)动态的业务字段是通过规则生成的 public String contentMerge(String ruleJson, String sceneConent, String dynamicContent) { - List ruleDictList = ruleDictDao.getRuleDictConfig(); - Map ruleDictMap = ruleDictList.stream().collect( - Collectors.toMap(RuleDict::getId, e -> e)); - List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); - for (Map ruleMap : ruleMapList) { - String ruleType = String.valueOf(ruleMap.get("ruleType")); - ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); - NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); - byteDecorator.nodeDecoratorRule(nodeDecoratorParm); - } +// List ruleDictList = ruleDictDao.getRuleDictConfig(); +// Map ruleDictMap = ruleDictList.stream().collect( +// Collectors.toMap(RuleDict::getId, e -> e)); +// List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); +// for (Map ruleMap : ruleMapList) { +// String ruleType = String.valueOf(ruleMap.get("ruleType")); +// ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); +// NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); +// byteDecorator.nodeDecoratorRule(nodeDecoratorParm); +// } return null; } - - private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { - NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() - .contents(sceneConent) - .dynamicContent(dynamicContent) - .ruletypeId(ruletypeId) - .ruleDictMap(ruleDictMap) - .build(); - return nodeDecoratorParm; - } +// +// private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { +// NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() +// .contents(sceneConent) +// .dynamicContent(dynamicContent) +// .ruletypeId(ruletypeId) +// .ruleDictMap(ruleDictMap) +// .build(); +// return nodeDecoratorParm; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java index 652970c..b204ac3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java @@ -1,56 +1,56 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@AllArgsConstructor -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", - JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Component; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Component("logicalDecorator") +//@AllArgsConstructor +//@Slf4j +//public class LogicalShiftDecorator implements ByteDecorator { +// +//// private final FieldRuleEngineMapper fieldRuleEngineMapper; +//// +//// //字节位移 +//// @Override +//// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +//// String logicalValue = ""; +//// RuleEvaluator fieldRuleEngine = new RuleEvaluator(); +//// try { +//// Map env2 = new HashMap(); +//// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +//// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +//// for (String contentId : contentIdList) { +//// RuleDict ruleDict = ruleDictMap.get(contentId); +//// if (ruleDict.getCode().contains("#")) { +//// //使用动态的值 +//// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +//// } +//// env2.put(ruleDict.getName(), ruleDict.getCode()); +//// } +//// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +//// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +//// return null; +//// } +//// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +//// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +//// return values; +//// } catch (Exception ex) { +//// log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", +//// JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +//// return null; +//// } +//// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java index 346468f..822fead 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@AllArgsConstructor -@Slf4j -public class OperationDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("optionDecorator") +//@AllArgsConstructor +//@Slf4j +//public class OperationDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //混合运算,有常量或者乘除的缩放 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java index 50fb0a7..7a8bccb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@AllArgsConstructor -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +////精度计算 +//@AllArgsConstructor +//@Registry("precisionDecorator") +//@Slf4j +//public class PrecisionDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java index da39235..27f9cc7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java @@ -1,54 +1,53 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@AllArgsConstructor -@Slf4j -public class RuleDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("ruleDecorator") +//@AllArgsConstructor +//@Slf4j +//public class RuleDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //吃我一套正则表达式 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (Exception ex) { +// log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java index 7f5cbf3..c043f97 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java @@ -2,6 +2,6 @@ import java.util.Map; -public interface ComandeEventService { +public interface ComandeEventService{ Map loadComandeEventConfig(String protocolId,String scene); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java index 476ad84..aaf1837 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java @@ -2,46 +2,46 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.dao.CommandEventDao; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @Slf4j @AllArgsConstructor -public class ComandeEventServiceImpl implements ComandeEventService { +public class ComandeEventServiceImpl implements ComandeEventRegistry { - private final CommandEventDao commandEventDao; + // private final CommandEventDao commandEventDao; // 加密bean 固定字段出现变化的字段解析,业务字段的有序内容 @Override - public Map loadComandeEventConfig(String protocolId,String sceneName) { - CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); - if (ObjectUtil.isEmpty(commandEventConfig)) { - log.error("协议{},没有配置成功接收回复配置,清排查原因"); - return null; - } - String replyJson = commandEventConfig.getReplyContentJson(); - List> replyMapList = JSONArray.parseObject(replyJson, List.class); - List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); - Map fixMap = fixList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); - List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) - .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) - .collect(Collectors.toList()); - Map commandConfigMap = new HashMap<>(); - commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); - commandConfigMap.put("fixContent", fixMap); - commandConfigMap.put("bizContent", contentList); - return commandConfigMap; + public Map loadComandeEventConfig(String protocolId, String sceneName) { +// CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); +// if (ObjectUtil.isEmpty(commandEventConfig)) { +// log.error("协议{},没有配置成功接收回复配置,清排查原因"); +// return null; +// } +// String replyJson = commandEventConfig.getReplyContentJson(); +// List> replyMapList = JSONArray.parseObject(replyJson, List.class); +// List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); +// Map fixMap = fixList.stream() +// .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); +// List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) +// .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) +// .collect(Collectors.toList()); +// Map commandConfigMap = new HashMap<>(); +// commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); +// commandConfigMap.put("fixContent", fixMap); +// commandConfigMap.put("bizContent", contentList); +// return commandConfigMap; + return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 128b09d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java deleted file mode 100644 index 4016b0b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface DatagramEventMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java deleted file mode 100644 index 597c306..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.apache.ibatis.annotations.Mapper; - -public interface FieldConfigMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java deleted file mode 100644 index a31680a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.PreRuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface PreRuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java deleted file mode 100644 index 9060a69..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface ProtocolConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java deleted file mode 100644 index 6fa6936..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java deleted file mode 100644 index 582a705..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleDict; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleDictMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java deleted file mode 100644 index 6e302c8..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.CommandEventMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Optional; - -@Component -public class CommandEventDao { - - @Resource - private CommandEventMapper commandEventMapper; - - public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId) - .eq("scene", sceneName) - .eq("enabled", 1); - List commandEventConfig = commandEventMapper.selectList(queryWrapper); - Optional optionalEventConfig = commandEventConfig.stream().findFirst(); - return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java deleted file mode 100644 index 9137e4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.FieldConfigMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class FieldConfigDao { - - @Resource - private FieldConfigMapper fieldConfigMapper; - - public FieldConfig getFieldConfigById(String fieldId) { - FieldConfig fieldConfig = fieldConfigMapper.selectById(fieldId); - return fieldConfig; - } - - public List getFieldConfigs(String protocolId,Integer isFixed) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",isFixed); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - - public List getStorageFieldConfig(String protocolId) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",1) - .eq("is_storage",1); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java deleted file mode 100644 index 67bff6b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.mapper.PreRuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class PreRuleConfigDao { - - @Resource - private PreRuleConfigMapper preRuleConfigMapper; - - public List getPreRuleList(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return preRuleConfigMapper.selectList(queryWrapper); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java deleted file mode 100644 index d69ea85..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.RuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleConfigDao { - - @Resource - private RuleConfigMapper ruleConfigMapper; - - public RuleConfig getNextRuleConfig(String ruleFields) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("parse_rule_json", ruleFields); - return ruleConfigMapper.selectOne(queryWrapper); - } - - - public List getRuleConfigById(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return ruleConfigMapper.selectList(queryWrapper); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java deleted file mode 100644 index 932c185..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.RuleDictMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleDictDao { - - @Resource - private RuleDictMapper ruleDictMapper; - - public List getRuleDictConfig() { - List ruleDictList = ruleDictMapper.selectList(null); - return ruleDictList; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java index 9f9e279..43bc4d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java @@ -10,20 +10,15 @@ import io.netty.channel.socket.nio.NioServerSocketChannel; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import javax.annotation.PreDestroy; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static cn.hutool.core.util.ClassUtil.getClasses; /** * SensorhubServer netty服务端 */ @Slf4j -@Service +@Component public class SensorhubServer { /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java index 2c79ff5..9a28c36 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java @@ -11,13 +11,13 @@ import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioSocketChannel; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClient 客户端 */ @Slf4j -@Service +@Registry public final class SensorhubClient { public static void main(String[] args) throws Exception { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java index 9774be0..477c3f7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java @@ -6,12 +6,12 @@ import io.netty.channel.socket.SocketChannel; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientChannelInitialHandler */ -@Service +@Registry public class SensorhubClientChannelInitialHandler extends ChannelInitializer { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java index 346f4b3..73560e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java @@ -5,13 +5,13 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientHandler */ @Slf4j -@Service +@Registry public class SensorhubClientHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java index 5c1c6f2..d990af5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java @@ -4,12 +4,12 @@ import com.casic.missiles.pojo.Msg; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** * SensorhubServerHandler */ -@Service +@Component public class SensorhubServerHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 67283ae..af3172c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,41 +1,37 @@ package com.casic.missiles.parser; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultProtocolConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.*; +import com.casic.missiles.registry.FieldConfigRegistry; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; -import java.nio.charset.Charset; import java.util.HashMap; import java.util.List; import java.util.Map; -@Service("genericProtocolParser") +/** + * @author + */ +@Component("genericProtocolParser") @Slf4j -@AllArgsConstructor +@RequiredArgsConstructor public class GenericProtocolParser implements ProtocolParser { - private final LeadingCodeMatcher leadingCodeMatcher; private final List frameStructDispenserList; - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorInstanceSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; // 匹配首字母前导码=> 帧结构匹配前导码=> // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 @@ -44,18 +40,19 @@ public Boolean doParseProtocol(ByteBuf byteBuf) { String protocolContent = ByteBufUtil.hexDump(byteBuf); //匹配前导码 - List preCodeConfigs = leadingCodeMatcher.matchLeadingCode(protocolContent); + List preCodeConfigs = LeadingCodeMatcher.matchFrameLeadingCode(protocolContent); //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 if (preCodeConfigs.size() == 0) { - return rematch(byteBuf,protocolContent); + return rematch(byteBuf, protocolContent); } - //暂时先取第一个 + //暂时先取第一个,提升速度,使用享元模式, 减少类的创建销毁与构建 ProtocolConfig protocolConfig = preCodeConfigs.get(0); + AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); ByteBuf wholeDatagramByte = null; //通过匹配帧结构获取完整的数据包 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, preCodeConfigs.get(0))) != null) { + if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, protocolFactory)) != null) { break; } } @@ -68,76 +65,78 @@ * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 */ - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId, wholeDatagramByte); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap, protocolId); - //选取规则对应的流程实例 - DatagramEventConfig datagramEventConfig = processorInstanceSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); + //进行规则字段解析,进行匹配规则 + RuleConfig ruleConfig = getRuleConfig(protocolFactory, wholeDatagramByte); + if (ruleConfig == null) { + return false; + } //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, wholeDatagramByte); + ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte); + //以下进行业务的规则解析,同时选定流程实例 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); + DatagramEventProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain, + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText, protocolId); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain); //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); + datagramEventProvider.storeData(bizDataMap); return true; } - private Boolean rematch(ByteBuf byteBuf,String protocolContent) { + /** + * 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 + */ + private Boolean rematch(ByteBuf byteBuf, String protocolContent) { //重置位判断 byteBuf.resetReaderIndex(); //判断重置是否前移,如果没有前移,则直接判为匹配失败 if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { return false; } else { + //递归执行 return doParseProtocol(byteBuf); } } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; + //获取匹配规则->匹配规则 + private RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + //取出其中参与逻辑provider并判空 + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); + String rulePrepareFields = protocolConfig.getRulePrepareFields(); + //固定字段 + if (StringUtils.isNotEmpty(rulePrepareFields)) { + //获取统一固定字段解析 + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + //获取该协议的字段配置,用于协议规则匹配 + List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); + //获取规则 + RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, + rulePrepareFields, protocolFieldConfigs); + return ruleConfig; + } + return null; } - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + //数据构建,获取固定字段的store和业务字段store + private Map buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + Map bizDataMap = new HashMap<>(); + Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); + Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); + bizDataMap.putAll(ruleStoreObjectMap); + bizDataMap.putAll(protocolStoreObjectMap); return bizDataMap; } - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java index 8a46e32..16ce2e5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java @@ -3,6 +3,7 @@ import io.netty.buffer.ByteBuf; public interface ProtocolParser { + Boolean doParseProtocol(ByteBuf byteBuf); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java new file mode 100644 index 0000000..f7814af --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java @@ -0,0 +1,35 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.ProtocolConfigProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.ProtocolConfig; + +/** + * 存放基本协议的的加载信息 + */ +public class AbstractProtocolConfigFactory { + private final ProtocolConfigProvider protocolConfigProvider; + private final ProtocolFieldConfigProvider protocolFieldConfigProvider; + private final RuleConfigProvider ruleConfigProvider; + + public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { + this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); + this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); + this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); + } + + public ProtocolConfigProvider getProtocolConfigProvider() { + return protocolConfigProvider; + } + + public ProtocolFieldConfigProvider getProtocolFieldConfigProvider() { + return protocolFieldConfigProvider; + } + + public RuleConfigProvider getRuleConfigProvider() { + return ruleConfigProvider; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java new file mode 100644 index 0000000..6e36147 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java @@ -0,0 +1,57 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.CombinedFieldConfigProvider; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.FieldConfigProvider; +import com.casic.missiles.parser.provider.FieldRuleConfigProvider; + +/** + * 存放规则相关的的的加载信息 + */ +public class AbstractRuleConfigFactory { + + /** + * 处理字节 + */ + private final FieldConfigProvider fieldConfigProvider; + /** + * 处理组合字节解析的解码器 + */ + private final CombinedFieldConfigProvider combinedFieldConfigProvider; + /** + * 处理负责字节解析的规则配置 + */ + private final FieldRuleConfigProvider fieldRuleConfigProvider; + /** + * 处理实例流程 + */ + private final DatagramEventProvider datagramEventProvider; + + + public AbstractRuleConfigFactory(Long ruleId) { + this.fieldConfigProvider = new FieldConfigProvider(ruleId); + this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); + this.fieldRuleConfigProvider = new FieldRuleConfigProvider(ruleId); + this.datagramEventProvider = new DatagramEventProvider(ruleId); + } + + public FieldConfigProvider getFieldConfigProvider() { + return fieldConfigProvider; + } + + public CombinedFieldConfigProvider getCombinedFieldConfigProvider() { + return combinedFieldConfigProvider; + } + + public FieldRuleConfigProvider getFieldRuleConfigProvider() { + return fieldRuleConfigProvider; + } + + public DatagramEventProvider getDatagramEventProvider() { + return datagramEventProvider; + } + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java deleted file mode 100644 index 6e1719a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.factory; - - -import com.casic.missiles.pojo.ProtocolConfig; - -import java.util.List; - -/** - * 数据库访问优化(暂时未做) - *

- * 1、初始化协议解析配置,并存放到处存放缓存,对协议基本配置进行管理 - * 2、其中流程中所有的配置都经过此类进行管理,进行调用获取,增强解析速度 - */ -public interface DatagramFactory { - - /** - * 初始化 - */ - List datagramInit(); - - /** - * 根据前导码配置匹配,模糊匹配获取所有的报文项 - */ - List match(); - - /** - * 根据前导码匹配,返回报文项 - */ - List filer(); - - /** - * 保证数据的唯一性选择器 - */ - List selectOne(); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java new file mode 100644 index 0000000..87444a0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java @@ -0,0 +1,18 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +import java.util.List; + +/** + * 直接用,还是边用边创建 + */ +public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { + + + public DefaultProtocolConfigFactory(ProtocolConfig protocolConfig) { + super(protocolConfig); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java new file mode 100644 index 0000000..cce0c7c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java @@ -0,0 +1,12 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; + +public class DefaultRuleFactory extends AbstractRuleConfigFactory { + + public DefaultRuleFactory(Long ruleId) { + super(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java deleted file mode 100644 index 9ee97e0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.casic.missiles.parser.instance; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service -@Slf4j -@AllArgsConstructor -public class GeneralProcessor { - - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; - - /** - * 统一固定字段解析=>进行规则的查询的判断 - * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 - * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 - */ - @Deprecated - public boolean parseWholeDatagram(ByteBuf buffer, ProtocolConfig protocolConfig) { - try { - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap,protocolId); - //选取规则对应的流程= - DatagramEventConfig datagramEventConfig = processorSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); - //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); - //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); - //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); - //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); - //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); - return true; - } catch (Exception ex) { - log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", - ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); - return false; - } - } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; - } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); - } - - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); - return bizDataMap; - } - - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java index 25e7ad8..6a5777e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java @@ -1,23 +1,31 @@ package com.casic.missiles.parser.instance.impl; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.mapper.DatagramEventMapper; import com.casic.missiles.pojo.DatagramEventConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.SpringContextUtil; -@Service -@AllArgsConstructor +import java.util.List; +import java.util.Optional; + +/** + * @author cz + * + */ public class DefaultProcessorInstanceSelector implements ProcessorInstanceSelector { - private final DatagramEventMapper datagramEventMapper; + private static List datagramEventConfigs; + + static { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + datagramEventConfigs = datagramEventRegistry.getDatagramEventList(); + } @Override public DatagramEventConfig getProcessorInstance(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("rule_id", protocolId); - return datagramEventMapper.selectOne(queryWrapper); + Optional optionalSelectInstance = datagramEventConfigs.stream() + .filter(e -> e.getId().equals(protocolId)).limit(1).findFirst(); + return optionalSelectInstance.isPresent() ? optionalSelectInstance.get() : null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a778671..7b56a43 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,16 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import io.netty.buffer.ByteBuf; /** - * 分析匹配情况 - * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 - * 2、匹配不成功,有后续帧,可以进行下次匹配。 - * 3、匹配不成功,无后续帧,可以进行丢弃。 + * 分析匹配情况 + * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 + * 2、匹配不成功,有后续帧,可以进行下次匹配。 + * 3、匹配不成功,无后续帧,可以进行丢弃。 */ -public interface FrameStructMatcher{ +public interface FrameStructMatcher { - ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig); + ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 05320ab..8ebea78 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,23 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.ProtocolConfigMapper; +import com.casic.missiles.parser.provider.ProtocolConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Component; import java.util.List; import java.util.stream.Collectors; -@Component -@AllArgsConstructor public class LeadingCodeMatcher { - private final ProtocolConfigMapper protocolMapper; - //** 1、首字母匹配前导码, // 2、以匹配出的前导码是否在报文中条件进行前导码的匹配二次筛选 - public List matchLeadingCode(String protocolContent){ + public static List matchFrameLeadingCode(String protocolContent){ List initialConfigs = initialMatch(protocolContent); List preCodeConfigs = initialConfigs.stream() .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) @@ -26,13 +19,16 @@ } //初始化匹配前导码内容 - private List initialMatch(String protocolContent) { - String protocolStr = protocolContent.charAt(0) + ""; - QueryWrapper queryWrapper = new QueryWrapper() - .likeRight("pre_fix", protocolStr); - List protocolConfigList = protocolMapper.selectList(queryWrapper); - return protocolConfigList; + private static List initialMatch(String protocolContent) { + String firstFrameChar = protocolContent.charAt(0) + ""; + ProtocolConfigProvider protocolConfigProvider=new ProtocolConfigProvider(firstFrameChar); + return protocolConfigProvider.getMatchList(); } + + + + + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index cf2113d..e915877 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -1,32 +1,35 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(0) -@Service +@Component public class FrameLengthMatcher implements FrameStructMatcher { - @Autowired - private FieldParser fieldParser; - //超过长度 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { String dataGramContent = ByteBufUtil.hexDump(byteBuf); - if (StringUtils.isEmpty(protocolConfig.getUnpackId()) && StringUtils.isEmpty(protocolConfig.getTailStr())) { - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + //当不存在结尾标志和拆包标志,可以直接使用长度进行匹配 + if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { if (dataGramContent.length() >= totalLength) {//等于长度返回true,超出长度,切断 - ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, protocolConfig, totalLength); + ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, totalLength); return wholeDatagramByte; } else { //读的标志位前移舍弃 @@ -38,7 +41,7 @@ return null; } - private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, Integer totalLength) { byteBuf.readBytes(totalLength); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, totalLength - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 2bfc213..d527ad0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; @@ -13,7 +13,7 @@ import lombok.AllArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.nio.charset.Charset; import java.util.Map; @@ -22,32 +22,30 @@ * 后续标志验证 */ @Order(1) -@Service +@Component @AllArgsConstructor -public class FrameMarkMatcher implements FrameStructMatcher { - - private final FieldConfigDao fieldConfigDao; - private final FieldParser fieldParser; - private final FieldResolver fieldResolverManger; +public class FrameMarkMatcher implements FrameStructMatcher, FixedPropertyEnum { //帧后续标志=>结束,进行帧的重组=>有后续,1、帧移位判别 2、继续接收帧 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig UnpackConfig = StringUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getUnpackId()); - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); - Integer upback = 0; + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); ByteBuf mergeWholeFrameByte = null; - if (!ObjectUtil.isEmpty(UnpackConfig)) { - while (hasNextFullFrame(byteBuf, protocolConfig)) { - upback = (Integer) fieldResolverManger.filedParserManger(byteBuf, UnpackConfig, null); + if (!ObjectUtil.isEmpty(unpackFlag)) { + while (hasNextFullFrame(byteBuf, protocolConfig, protocolFieldConfigProvider)) { //是否存在后续位 - if (upback == 1) {//使用esayRule + if (unpackFlag == 1) {//使用esayRule //表示可以截取 - mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolConfig, totalLength); + mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolFieldConfigProvider, protocolConfig); return mergeWholeFrameByte; } else { - byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig)); + byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig, protocolFieldConfigProvider)); } } } @@ -56,7 +54,8 @@ //选取第一个帧,将业务内容和后面部分分开 //计算数据报文-业务内容 - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolFieldConfigProvider protocolFieldConfigProvider, ProtocolConfig protocolConfig) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); //截取完整报文 byteBuf.readBytes(totalLength); ByteBuf byteBufContent = byteBuf.slice(0, byteBuf.readerIndex()); @@ -68,15 +67,15 @@ String tail = ""; System.out.println(ByteBufUtil.hexDump(byteBufContent)); //会存在多个帧拼接在一起的的情况,进行合并处理 - while (hasNextFullFrame(byteBufContent, protocolConfig)) { - Integer currentFrameLength = fieldParser.getTotalLength(protocolConfig, byteBufContent); + while (hasNextFullFrame(byteBufContent, protocolConfig, protocolFieldConfigProvider)) { + Integer currentFrameLength = protocolFieldConfigProvider.getTotalLength(byteBufContent, protocolConfig); byteBufContent.readBytes(currentFrameLength); ByteBuf currentbyteBuf = byteBufContent.slice(0, byteBufContent.readerIndex()); byteBufContent.markReaderIndex();//读的标志位前移 System.out.println(ByteBufUtil.hexDump(byteBufContent)); String hexDump = currentbyteBuf.toString(Charset.forName("ISO-8859-1")); //获取当前固定帧结构的关系map - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, currentbyteBuf); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(currentbyteBuf, protocolConfig); if (StringUtils.isEmpty(mergeFrameStr)) { //首次获取业务数据报文 mergeFrameStr += hexDump.substring(0, currentFrameFixedProperty.get("tailPosition")); @@ -95,22 +94,22 @@ /** * 获取平移到下一帧起始位置 */ - public int getNextFrameOffset(ByteBuf buffer, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, buffer); - return currentFrameFixedProperty.get("totalLength"); + public int getNextFrameOffset(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + return currentFrameFixedProperty.get(TOTAL_LENGTH); } /** * 判断是否出错进行整个帧的 */ - public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, byteBuf); + public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); //保证读取位置不在固定位置,是可变的业务内容 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("fixedPosition")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(FIXED_POSITION)) { return false; } //判断读取是否操作帧长度 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("totalLength")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(TOTAL_LENGTH)) { return false; } return true; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 76a3784..c3a1bab 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -1,50 +1,50 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.parser.instance.GeneralProcessor; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; +import io.netty.buffer.ByteBufUtil;; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(2) -@Service +@Component public class FrameTailMatcher implements FrameStructMatcher { - @Resource - private FieldConfigDao fieldConfigDao; - @Autowired - private GeneralProcessor generalProcessor; - //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig tailFieldConfig = StringUtils.isEmpty(protocolConfig.getTailStr()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getTailStr()); - if (!ObjectUtil.isEmpty(tailFieldConfig)) { - String tailStr = tailFieldConfig.getFieldName(); + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfig protocolFieldConfig = ObjectUtils.isEmpty(protocolConfig.getTailStr()) ? null : + fieldConfigProvider.getFieldConfigById(protocolConfig.getTailStr()); + if (!ObjectUtil.isEmpty(protocolFieldConfig)) { + String tailStr = protocolFieldConfig.getFieldName(); String dataGramContent = ByteBufUtil.hexDump(byteBuf); Boolean tailFlag = ByteBufUtil.hexDump(byteBuf).contains(tailStr); if (!tailFlag) { //使用esayRule return null; } else if (dataGramContent.indexOf(tailStr) < dataGramContent.length() - tailStr.length()) { Integer length = dataGramContent.indexOf(tailStr) + tailStr.length(); - ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, protocolConfig, length); + ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, length); return wholeDatagramByte; //存在粘包 } } return null; } - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer length) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, Integer length) { byteBuf.readBytes(length); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, length - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java new file mode 100644 index 0000000..5f1c177 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java @@ -0,0 +1,73 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.combined.GenericCombinedFieldResolver; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.CombinedFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class CombinedFieldConfigProvider { + + + /** + * 作为临时配置列表缓存使用 + */ + private final List combinedFieldConfigList; + private Map storeObjectMap = new HashMap<>(); + + public CombinedFieldConfigProvider(Long ruleId) { + CombinedFieldConfigRegistry combinedFieldConfigRegistry = SpringContextUtil.getBean(CombinedFieldConfigRegistry.class); + combinedFieldConfigList = combinedFieldConfigRegistry.getCombinedFieldConfigList(ruleId); + } + + public void parseDataField(RuleConfig ruleConfig, String clearZeroPlain,Map fieldConfigsMap ) { + if (showSkip()) { + return; + } + //匹配对应的数据,然后进行相关的字段解析 + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver(); + combinedFieldResolver.parseDataField(combinedFieldConfigList, byteBuf, storeObjectMap,fieldConfigsMap); + } + + + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getCombinedFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return combinedFieldConfigList.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public List getCombinedFieldConfigList() { + return combinedFieldConfigList; + } + + /* 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(combinedFieldConfigList) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java new file mode 100644 index 0000000..f3cfedc --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java @@ -0,0 +1,11 @@ +package com.casic.missiles.parser.provider; + +/** + * @author cz + * @date 2023-6-12 + */ +public class CommandEventProvider{ + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java new file mode 100644 index 0000000..70eec5e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java @@ -0,0 +1,77 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.safe.SafeStrategy; +import com.casic.missiles.parser.sender.DataSubscribeProvider; +import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class DatagramEventProvider { + + private final DatagramEventConfig processorInstance; + + public DatagramEventProvider(Long ruleId) { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + List datagramEventConfigList = + datagramEventRegistry.getDatagramEventList(ruleId); + processorInstance = this.getProcessorInstance(datagramEventConfigList); + } + + public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { + if (showSkip()) { + return null; + } + return datagramEventConfigList.get(0); + } + + // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 + public String getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap) { + String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? + processorInstance.getSafeBean() : + fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); + if (!StringUtils.isEmpty(safeName)) { + //需要加密 + SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); + String plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); + return clearComplementZero(plain); + } + return ByteBufUtil.hexDump(bizDataContent); + } + + //解密清零操作 + private String clearComplementZero(String plain) { + plain = plain.substring(0, plain.lastIndexOf("00")); + return plain; + } + + //数据发送,数据发送者暂未构建 + public void storeData(Map bizDataMap) { + DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); +// dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return ObjectUtils.isNotEmpty(processorInstance) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java new file mode 100644 index 0000000..7e1fe0a --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java @@ -0,0 +1,97 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.FieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class FieldConfigProvider { + + + private final List fieldConfigs; + private Map storeObjectMap = new HashMap<>(); +// private Map singleObjects = new ConcurrentHashMap<>(); + + public FieldConfigProvider(Long ruleId) { + FieldConfigRegistry fieldConfigRegistry = SpringContextUtil.getBean(FieldConfigRegistry.class); + fieldConfigs = fieldConfigRegistry.getFieldConfigList(ruleId); + } + + public List getFieldConfigs() { + return fieldConfigs; + } + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public Map parseDataField(RuleConfig ruleConfig, String clearZeroPlain) { + if (showSkip()) { + return null; + } + List prepareFieldConfig = prepareParseField(ruleConfig); + if (CollectionUtils.isNotEmpty(prepareFieldConfig)) { + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(fieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + return fixDataMap; + } + } + return null; + } + + /** + * 得到需要处理的业务内容 + * + * @return + */ + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return fieldConfigs.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public Map getFieldConfigsMap() { + return fieldConfigs.stream().collect( + Collectors.toMap(FieldConfig::getId, e -> e) + ); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(fieldConfigs) ? false : true; + } + + +} + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java new file mode 100644 index 0000000..817bfaf --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java @@ -0,0 +1,19 @@ +package com.casic.missiles.parser.provider; + +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.registry.FieldRuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; + +public class FieldRuleConfigProvider { + + private final List fieldRuleConfigList; + + public FieldRuleConfigProvider(Long ruleId) { + FieldRuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(FieldRuleConfigRegistry.class); + fieldRuleConfigList = ruleConfigRegistry.getFieldRuleConfigList(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java new file mode 100644 index 0000000..99a1b06 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java @@ -0,0 +1,53 @@ +package com.casic.missiles.parser.provider; + + +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.registry.ProtocolConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolConfigProvider { + + private final List protocolConfigList; + + public ProtocolConfigProvider(String firstChar) { + ProtocolConfigRegistry registry = SpringContextUtil.getBean(ProtocolConfigRegistry.class); + protocolConfigList = registry.getProtocolConfigList(firstChar); + } + + public List getMatchList() { + return protocolConfigList; + } + + /** + * 设置当前协议 + * + * @param protocolConfig + */ + public ProtocolConfigProvider(ProtocolConfig protocolConfig) { + List protocolConfigs = new ArrayList<>(); + protocolConfigs.add(protocolConfig); + protocolConfigList = protocolConfigs; + } + + /** + * 获取当前协议 + * + * @return + */ + public ProtocolConfig getCurrentProtocolConfig() { + if (this.protocolConfigList == null) { + return null; + } else { + return protocolConfigList.get(0); + } + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java new file mode 100644 index 0000000..043927d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java @@ -0,0 +1,213 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.registry.ProtocolFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolFieldConfigProvider { + + private static final String FIXED_FIELD_DS = "fixedFieldDs"; + private static final String CONTENT_FIELD_DS = "contentFieldDs"; + private static final String PROTOCOL_LENGTH = "protocolLength"; + private static final String PROTOCOL_FIELD_ID = "protocolFieldId"; + private static final String PROTOCOL_POSITION = "protocolPosition"; + + private final List protocolFieldConfigs; + private Map singleObjects = new ConcurrentHashMap<>(); + private Map storeObjectMap = new HashMap<>(); + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public ProtocolFieldConfigProvider(Long protocolId) { + ProtocolFieldConfigRegistry protocolFieldConfigRegistry = SpringContextUtil.getBean(ProtocolFieldConfigRegistry.class); + protocolFieldConfigs = protocolFieldConfigRegistry.getProtocolFieldConfigList(protocolId); + } + + public List getProtocolFieldConfigs() { + return protocolFieldConfigs; + } + + public ProtocolFieldConfig getFieldConfigById(Long fieldId) { + Optional optionalConfig = protocolFieldConfigs.stream().filter( + e -> e.getId().equals(fieldId) + ).findFirst(); + return optionalConfig.isPresent() ? optionalConfig.get() : null; + } + + public Integer getProtocolFieldValue(Long protocolFieldId, ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_FIELD_ID + protocolFieldId + ByteBufUtil.hexDump(byteBuf); + //获取缓存 + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + //加载固定长度数据集合 + Map fixDataMap = this.getProtocolDataMap(byteBuf); + ProtocolFieldConfig protocolFieldConfig = selectFieldConfig(protocolFieldId); + Integer protocolFieldValue = 0; + //获取约定字段的总长度 + if (fixDataMap.containsKey(protocolFieldConfig.getFieldName())) { + Object appointUnpackObject = fixDataMap.get(protocolFieldConfig.getFieldName()); + if (ObjectUtils.isNotEmpty(appointUnpackObject)) { + protocolFieldValue = (Integer) appointUnpackObject; + } + } + if (protocolFieldValue != null) { + //加入缓存 + if (ObjectUtils.isNotEmpty(protocolFieldValue)) { + this.singleObjects.put(catchKey, protocolFieldValue); + return protocolFieldValue; + } + } + return null; + } + + /** + * 获取帧固定位置信息 + * + * @param byteBuf + * @param protocolConfig + * @return + */ + public Map getFixedProperty(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_POSITION + protocolConfig.getId(); + if (this.singleObjects.containsKey(catchKey)) { + return (Map) singleObjects.get(catchKey); + } + Map fixedPropertyMap = new HashMap<>(); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + fixedPropertyMap = fieldParser.doGetFixedProperty(protocolFieldConfigs, this.getTotalLength(byteBuf,protocolConfig)); + if (CollectionUtils.isNotEmpty(fixedPropertyMap)) { + this.singleObjects.put(catchKey, fixedPropertyMap); + return fixedPropertyMap; + } + return fixedPropertyMap; + } + + /** + * 获取帧结构应有的总长度 + */ + public Integer getTotalLength(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_LENGTH + ByteBufUtil.hexDump(byteBuf); + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + Integer appointFrameLength = getProtocolFieldValue(protocolConfig.getTotalLengthId(), byteBuf); + if (appointFrameLength != null) { + //获取过滤的字段集合总长度 + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Integer totalFilterLength = fieldParser.getTotalFilterLength(protocolConfig, byteBuf, getFixFieldConfigMap()); + //计算总长度 + Integer totalLength = appointFrameLength + totalFilterLength; + //加入缓存 + if (ObjectUtils.isNotEmpty(totalLength)) { + this.singleObjects.put(catchKey, totalLength); + return totalLength; + } + } + return null; + } + + /** + * 获取协议有关字段解析内容 + * storeObjectMap存储代转存的数据 + * + * @return + */ + public Map getProtocolDataMap(ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(FIXED_FIELD_DS)) { + return (Map) singleObjects.get(FIXED_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(protocolFieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + this.singleObjects.put(FIXED_FIELD_DS, fixDataMap); + return fixDataMap; + } + return null; + } + + /** + * 获取业务报文内容的content字节 + * + * @param wholeDatagramByte + * @return + */ + public ByteBuf getDataContentBuf(ByteBuf wholeDatagramByte) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(CONTENT_FIELD_DS)) { + return (ByteBuf) singleObjects.get(CONTENT_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + ByteBuf bizDataByteBuf = fieldParser.getDataContentBuf(protocolFieldConfigs, wholeDatagramByte); + if (bizDataByteBuf != null) { + this.singleObjects.put(CONTENT_FIELD_DS, bizDataByteBuf); + return bizDataByteBuf; + } + return null; + } + + + private ProtocolFieldConfig selectFieldConfig(Long id) { + Optional optionalProtocolFieldConfig = this.protocolFieldConfigs.stream().filter( + e -> e.getId().equals(id) + ).findFirst(); + return optionalProtocolFieldConfig.isPresent() ? optionalProtocolFieldConfig.get() : null; + } + + + private Map getFixFieldConfigMap() { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, e -> e) + ); + return fixDataFieldMap; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(protocolFieldConfigs) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java new file mode 100644 index 0000000..dafba1c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java @@ -0,0 +1,56 @@ +package com.casic.missiles.parser.provider; + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.rule.GenericRuleResolver; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.RuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleConfigProvider { + + private final List ruleConfigs; + + public List getRuleConfigs() { + return ruleConfigs; + } + + public RuleConfigProvider(Long protocolId) { + RuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(RuleConfigRegistry.class); + ruleConfigs = ruleConfigRegistry.getRuleConfigById(protocolId); + } + + /** + * 获取规则匹配结果 + * + * @param parseFixedDataMap + * @param protocolFieldConfigs + * @return + */ + public RuleConfig doGetRule(Map parseFixedDataMap, + String ids, + List protocolFieldConfigs) { + if (showSkip()) { + return null; + } + RuleConfig ruleConfig = GenericRuleResolver.machRule(parseFixedDataMap, ids, protocolFieldConfigs, ruleConfigs); + return ruleConfig; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(ruleConfigs) ? false : true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java index 3c05891..856b399 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java @@ -1,18 +1,11 @@ package com.casic.missiles.parser.resolver; -import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.springframework.web.bind.annotation.RequestBody; -import javax.annotation.Resource; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -20,19 +13,17 @@ @Slf4j public class ByteMergeProvider { - @Resource - private FieldRuleEngineMapper fieldRuleEngineMapper; - //拿到所有的值合并到一个值 - public String resolveByteMerge(List valueList, String ruletypeId, String vaildRange) { + public static String resolveByteMerge(List valueList, String ruleTypeId, String vaildRange) { String values = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Map vaildMap = getValidRangeMap(vaildRange); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(ruletypeId); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } + //暂时不处理 +// fieldRuleEngine = fieldRuleConfigMapper.selectById(ruleTypeId); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } Map env2 = new HashMap(); for (int i = 0; i < valueList.size(); i++) { if (vaildMap.containsKey(i)) { @@ -47,7 +38,7 @@ } } - private Map getValidRangeMap(String vaildRange) { + private static Map getValidRangeMap(String vaildRange) { String[] range = vaildRange.split(","); Map vaildMap = new HashMap(); for (int i = 0; i < range.length; i++) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 8d821cd..85d6bbf 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -1,9 +1,12 @@ package com.casic.missiles.parser.resolver; +import com.casic.missiles.pojo.AbstractFieldConfig; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; import io.netty.buffer.ByteBuf; +import java.util.List; import java.util.Map; /** @@ -11,18 +14,14 @@ */ public interface FieldParser { -// Map fieldProcess(String protocolContent,); - Map dataParser(RuleConfig ruleConfig, String lightText,String protocolId); + Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength); - Map fixDataParser(String protocolId, ByteBuf buffer); + Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap); - Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf); + ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer); - ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer); - - ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer); - - Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer); + Integer getTotalFilterLength(ProtocolConfig protocolConfig, ByteBuf byteBuf, Map protocolFieldConfigMap); } + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java new file mode 100644 index 0000000..9e0c00e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java @@ -0,0 +1,52 @@ +package com.casic.missiles.parser.resolver; + +import com.casic.missiles.pojo.AbstractFieldConfig; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.util.List; + +public class FieldParserSupport { + + //分别计算bit和byte长度=> 合并长度 + protected Integer calculateLength(List fieldConfigList) { + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + Integer fixedLength = bytefixedLength + bitfixedLength / 8; + return fixedLength; + } + + //找到最大值=> 根据最大值计算业务数据下标 + protected Integer calculatePosition(List fieldConfigList) { + String rex = "[0-9]+"; + Integer max = -1; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) + && Integer.valueOf(fieldConfig.getOriginPositionByte()) > max) { + max = Integer.valueOf(fieldConfig.getOriginPositionByte()); + } + } + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) && fieldConfig.getOriginPositionByte().equals(max)) { + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + } + } + Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; + return maxFixedPosition; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java deleted file mode 100644 index dd3a6cd..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java +++ /dev/null @@ -1,170 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.ByteResolverParam; -import io.netty.buffer.ByteBuf; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -/** - * 字段解析管理总类 - */ -@Service -@Slf4j -@AllArgsConstructor -public class FieldResolver extends ByteMergeProvider { - - //1、字段截取 => 2、简单的字节解析和复杂的字节解析 - public Object filedParserManger(ByteBuf byteBuf, FieldConfig fieldConfig, Integer maxFixedPosition) { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - //最大固定位置不为空, - if (!ObjectUtil.isEmpty(maxFixedPosition)) { - orignPosition -= maxFixedPosition; - } - Object fieldValue = 0; - //待优化 - if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { - fieldValue = bitToResolver(byteBuf, fieldConfig); - } else { - ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); - fieldValue = parsingFields(fieldBytes, fieldConfig.getRuleJson()); - } - return fieldValue; - } - - //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, - //目前默认配置的规则设置暂不支持配置化,由实现完成 - private Object parsingFields(ByteBuf byteBuf, String ruleJson) { - Object fieldsResolveValue = null; - List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); - if (ObjectUtil.isEmpty(ruleMapList)) { - fieldsResolveValue = defaultResolveBuilder(byteBuf); - } else { - fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); - } - return fieldsResolveValue; - } - - private Object defaultResolveBuilder(ByteBuf byteBuf) { - Integer defaultResolveValue = 0; - for (int i = 0; i < byteBuf.writerIndex(); i++) { - defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; - } - return defaultResolveValue; - } - - //字段解析构建器(针对字节单位的) - //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 - // 字节归并结束或者规则结束=>继续根据规则进行判断 - private Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { - Object customizeResolveValue = null; - try { - List bytStrList = new ArrayList<>(); - //存放到数组里面 - for (int i = 0; i < byteBuf.writerIndex(); i++) { - bytStrList.add(byteBuf.readByte()); - } - int i = 0; - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - customizeResolveValue = this.resolveByteMerge(bytStrList, ruletypeId,vaildRange); - break; - } else { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - List tempBytStr = new ArrayList<>(); - for (int k = 0; i < bytStrList.size(); i++) { - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(k) - .value(bytStrList.get(k)) - .ruletypeId(ruletypeId).build(); - tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); - } - bytStrList = tempBytStr; - } - i++; - } - //字节归并到一起=>继续根据规则进行判断 - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(customizeResolveValue) - .ruletypeId(ruletypeId).build(); - customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(customizeResolveValue)); - return customizeResolveValue; - } catch (RuntimeException ex) { - log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); - return null; - } - } - - /** - * 1、单个字节情况表示字段 - * 2、多字节情况表示字段(暂未处理) - */ - private Object bitToResolver(ByteBuf byteBuf, FieldConfig fieldConfig) { - Object fieldValue = new Object(); - try { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - byte fields = 0x00; - if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); - } else { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); - } - - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { - if (!StringUtils.isEmpty(fieldConfig.getExactOrignPosition())) { - fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getExactOrignPosition())).byteValue() - >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); - } else { - fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); - } - } else { - fieldValue = Integer.valueOf(fields & 0xff); - } - if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { - return fieldValue; - } - List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); - int i = 0; - //字节归并到一起=>继续根据规则进行判断 - while (i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(fieldValue) - .ruletypeId(ruletypeId).build(); - fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(fieldValue)); - return fieldValue; - } catch (RuntimeException ex) { - log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); - return null; - } - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java new file mode 100644 index 0000000..1d2aeab --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java @@ -0,0 +1,36 @@ +package com.casic.missiles.parser.resolver.bytes; + +import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.mapper.FieldRuleConfigMapper; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.pojo.ByteResolverParam; +import com.googlecode.aviator.AviatorEvaluator; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; +//转换规则 +@Component("convert") +@AllArgsConstructor +@Slf4j +public class ByteRuleResolver implements ByteResolver { + + private final FieldRuleConfigMapper fieldRuleConfigMapper; + + @Override + public Object resolveOperationRule(ByteResolverParam byteResolverParam){ + FieldRuleConfig fieldRuleEngine=fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); + if(ObjectUtil.isEmpty(fieldRuleEngine)){ + return byteResolverParam.getValue(); + } + String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); + Map env2 = new HashMap(); + env2.put("value", (byte) byteResolverParam.getValue()); + String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); + return values; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java index 103821c..786b71c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java @@ -2,34 +2,34 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("logicalShift") +@Component("logicalShift") @AllArgsConstructor @Slf4j public class LogicalShiftResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //字节位移 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { Integer index = byteResolverParam.getIndex(); - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return byteResolverParam.getValue(); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java index 476747d..01149bd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("operation") +@Component("operation") @AllArgsConstructor @Slf4j public class OperationResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //混合运算,有常量或者乘除的缩放 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java index 0b82cf4..79abcce 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.casic.missiles.pojo.ByteResolverParam; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; //精度计算 -@Service("precision") +@Component("precision") @AllArgsConstructor @Slf4j public class PrecisionResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java deleted file mode 100644 index 5c3f332..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; -//转换规则 -@Service("convert") -@AllArgsConstructor -@Slf4j -public class RuleResolver implements ByteResolver { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam){ - RuleEvaluator fieldRuleEngine=fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); - if(ObjectUtil.isEmpty(fieldRuleEngine)){ - return byteResolverParam.getValue(); - } - String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); - Map env2 = new HashMap(); - env2.put("value", (byte) byteResolverParam.getValue()); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java new file mode 100644 index 0000000..d3bbd91 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java @@ -0,0 +1,15 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; + +import java.util.List; +import java.util.Map; +// 前导码匹配->长度字段 +public interface AbstractCombinedFieldProcessor { + + Map invoke(Map map, ByteBuf byteBuf, List combinedFieldConfigList, + Map fieldConfigsMap, Map storeObjectMap); + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java new file mode 100644 index 0000000..03c8480 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java @@ -0,0 +1,59 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-13 + */ +//依次递增进行数据的解析, +public class GenericCombinedFieldResolver { + + + //通过查询,字段长度长度随机 + public void parseDataField(List combinedFieldConfigList, ByteBuf byteBuf, + Map storeObjectMap, Map fieldConfigsMap) { + Integer frameLength = Integer.valueOf(ByteBufUtil.hexDump(byteBuf)); + //添加前置处理器 + com.casic.missiles.util.ClassUtil classUtil = new com.casic.missiles.util.ClassUtil(); + List abstractCombinedProcessors = classUtil.getSubClassList(AbstractCombinedFieldProcessor.class); + + Map fieldFixedMap = combinedFieldLeadCodeMap(combinedFieldConfigList); + //frameLength + Map combinedProcessorFields = null; + while (byteBuf.readableBytes() < frameLength) { + //一直处理 + for (AbstractCombinedFieldProcessor abstractCombinedProcessor : abstractCombinedProcessors) { + combinedProcessorFields = abstractCombinedProcessor.invoke(combinedProcessorFields, byteBuf, + combinedFieldConfigList, + fieldConfigsMap, storeObjectMap); + if (combinedProcessorFields == null || byteBuf.readableBytes() < frameLength) { + return; + } + } + + } + } + + /** + * 取出前导码匹配集合 + */ + private Map combinedFieldLeadCodeMap(List combinedFieldConfigList) { + Map fieldFixedMap = combinedFieldConfigList + .stream() + .collect(Collectors.toMap(CombinedFieldConfig::getPrefixCode, e -> e)); + return fieldFixedMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java new file mode 100644 index 0000000..643a934 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java @@ -0,0 +1,100 @@ +package com.casic.missiles.parser.resolver.fields; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.FieldParserSupport; +import com.casic.missiles.pojo.*; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 保存使用时最基本的信息,并且使用原型模式 + */ +@Slf4j +public class DefaultProtocolFieldParser extends FieldParserSupport implements FieldParser, FixedPropertyEnum { + + //通过传入的配置和报文进行字段解析 + @Override + public Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap) { + Map dataMap = new HashMap<>(); + for (AbstractFieldConfig protocolFieldConfig : protocolFieldConfigs) { + if (!ObjectUtils.isEmpty(protocolFieldConfig.getOriginPositionByte())) { + Object fieldValue = FieldResolver.parseField(buffer, protocolFieldConfig, null); + if (protocolFieldConfig.getIsStorage() == 1) { + storeObjectMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + dataMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + } + return dataMap; + } + + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength) { + Map fixedPropertyMap = new HashMap<>(); + Integer fixedLength = calculateLength(protocolFieldConfigs); + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + fixedPropertyMap.put(FIXED_POSITION, maxFixedPosition); + fixedPropertyMap.put(TOTAL_LENGTH, totalLength); + fixedPropertyMap.put(TAIL_POSITION, totalLength - fixedLength + maxFixedPosition); + return fixedPropertyMap; + } + + //** 获取业务内容的byteBuf + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer) { + //计算固定长度 + Integer fixedLength = calculateLength(protocolFieldConfigs); + //总长度获取 + String lightText = buffer.toString(Charset.forName("ISO-8859-1")); + Integer totalLength = lightText.length(); + //计算固定长度最大长度 + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + //计算数据报文内容 + ByteBuf bizDataFields = buffer.slice(maxFixedPosition - 1, (totalLength - fixedLength)); + return bizDataFields; + } + + /** + * 获取过滤字段的长度 + */ + @Override + public Integer getTotalFilterLength(ProtocolConfig protocolConfig, + ByteBuf byteBuf, + Map protocolFieldConfigMap) { + if (ByteBufUtil.hexDump(byteBuf).equals("")) { + return 0; + } + int totalFilterLength = 0; + String filterFields = protocolConfig.getTotalLengthFilterFields(); + try { + if (!StringUtils.isEmpty(filterFields)) { + String[] filterFieldList = filterFields.split(","); + for (String filterFieldId : filterFieldList) { + if (StringUtils.isNotEmpty(filterFieldId)) { + ProtocolFieldConfig fieldConfig = protocolFieldConfigMap.get(Long.valueOf(filterFieldId)); + //这里都是按字节计算,没有对位进行区分,可能会出现错误 + // 如果对位有需求,需要进一步跟进 + totalFilterLength += fieldConfig.getOffsetLength(); + } + } + } + return totalFilterLength; + } catch (Exception ex) { + log.error("报文确认分发阶段,获取报文总长度过滤长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); + } + return totalFilterLength; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java new file mode 100644 index 0000000..d51e887 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java @@ -0,0 +1,169 @@ +package com.casic.missiles.parser.resolver.fields; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.parser.resolver.ByteMergeProvider; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.AbstractFieldConfig; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.pojo.ByteResolverParam; +import io.netty.buffer.ByteBuf; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * 字段解析管理总类 + */ +@Slf4j +public class FieldResolver extends ByteMergeProvider { + + //1、字段截取 => 2、简单的字节解析和复杂的字节解析 + public static Object parseField(ByteBuf byteBuf,AbstractFieldConfig fieldConfig, Integer maxFixedPosition) { + Integer orignPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + //最大固定位置不为空, + if (!ObjectUtil.isEmpty(maxFixedPosition)) { + orignPosition -= maxFixedPosition; + } + Object fieldValue = 0; + //待优化 + if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { + fieldValue = doParseBitField(byteBuf, fieldConfig); + } else { + ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); + fieldValue = doParseByteField(fieldBytes, fieldConfig.getRuleJson()); + } + return fieldValue; + } + + //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, + //目前默认配置的规则设置暂不支持配置化,由实现完成 + private static Object doParseByteField(ByteBuf byteBuf, String ruleJson) { + Object fieldsResolveValue = null; + List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); + if (ObjectUtil.isEmpty(ruleMapList)) { + fieldsResolveValue = defaultResolveBuilder(byteBuf); + } else { + fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); + } + return fieldsResolveValue; + } + + private static Object defaultResolveBuilder(ByteBuf byteBuf) { + Integer defaultResolveValue = 0; + for (int i = 0; i < byteBuf.writerIndex(); i++) { + defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; + } + return defaultResolveValue; + } + + //字段解析构建器(针对字节单位的) + //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 + // 字节归并结束或者规则结束=>继续根据规则进行判断 + private static Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { + Object customizeResolveValue = null; + try { + List bytStrList = new ArrayList<>(); + //存放到数组里面 + for (int i = 0; i < byteBuf.writerIndex(); i++) { + bytStrList.add(byteBuf.readByte()); + } + int i = 0; + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { + if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + customizeResolveValue = resolveByteMerge(bytStrList, ruletypeId, vaildRange); + break; + } else { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + List tempBytStr = new ArrayList<>(); + for (int k = 0; i < bytStrList.size(); i++) { + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(k) + .value(bytStrList.get(k)) + .ruletypeId(ruletypeId).build(); + tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); + } + bytStrList = tempBytStr; + } + i++; + } + //字节归并到一起=>继续根据规则进行判断 + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(null) + .value(customizeResolveValue) + .ruletypeId(ruletypeId).build(); + customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); + i++; + } + System.out.println(JSON.toJSON(customizeResolveValue)); + return customizeResolveValue; + } catch (RuntimeException ex) { + log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); + return null; + } + } + + /** + * 1、单个字节情况表示字段 + * 2、多字节情况表示字段(暂未处理) + */ + private static Object doParseBitField(ByteBuf byteBuf,AbstractFieldConfig fieldConfig) { + Object fieldValue = new Object(); + try { + Integer orignPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + byte fields = 0x00; + if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { + fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); + } else { + fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); + } + + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { + if (!StringUtils.isEmpty(fieldConfig.getOriginPositionBit())) { + fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getOriginPositionBit())).byteValue() + >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); + } else { + fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); + } + } else { + fieldValue = Integer.valueOf(fields & 0xff); + } + if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { + return fieldValue; + } + List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); + int i = 0; + //字节归并到一起=>继续根据规则进行判断 + while (i < ruleMapList.size()) { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(null) + .value(fieldValue) + .ruletypeId(ruletypeId).build(); + fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); + i++; + } + System.out.println(JSON.toJSON(fieldValue)); + return fieldValue; + } catch (RuntimeException ex) { + log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); + return null; + } + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java deleted file mode 100644 index 35ae3d0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java +++ /dev/null @@ -1,183 +0,0 @@ -package com.casic.missiles.parser.resolver.fields; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufAllocator; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; -import org.springframework.util.ObjectUtils; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service("standard") -@AllArgsConstructor -@Slf4j -public class StandardFieldParser implements FieldParser { - - private final FieldConfigDao fieldConfigDao; - private final FieldResolver fieldResolver; - - //数据解析 - @Override - public Map dataParser(RuleConfig ruleConfig, String lightText, String protocolId) { - String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); - ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); - bufferContent.writeBytes(lightText.getBytes(Charset.forName("ISO-8859-1"))); - Map dataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - for (String dataFieldId : dataFieldIds) { - FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(dataFieldId); - if (!ObjectUtils.isEmpty(fieldConfig)) { - dataMap.put(fieldConfig.getFieldName(), String.valueOf(fieldResolver.filedParserManger(bufferContent, fieldConfig, maxFixedPosition))); - } - } - return dataMap; - } - - //数据解析 - @Override - public Map fixDataParser(String protocolId, ByteBuf buffer) { - List dataFieldIdList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Map dataMap = new HashMap<>(); - for (FieldConfig dataField : dataFieldIdList) { - if (!ObjectUtils.isEmpty(dataField.getOrignPosition())) { - Object fieldValue = (Integer) fieldResolver.filedParserManger(buffer, dataField, null); - dataMap.put(dataField.getFieldName(), fieldValue); - } - } - return dataMap; - } - - @Override - public Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf) { - if (ByteBufUtil.hexDump(byteBuf).equals("")) { - return 0; - } - String filterFields = protocolConfig.getTotalLengthFilterField(); - Integer totalLength = 0; - try { - FieldConfig totalFieldConfig = fieldConfigDao.getFieldConfigById(protocolConfig.getTotalLengthId()); - int totalFilterLength = 0; - if (!StringUtils.isEmpty(filterFields)) { - String[] filterFieldList = filterFields.split(","); - for (String filterField : filterFieldList) { - FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(filterField); - //这里都是按字节计算,没有对位进行区分,可能会出现错误 - - // 如果对位有需求,需要进一步跟进 - totalFilterLength += fieldConfig.getOffsetLength(); - } - } - totalLength = (Integer) fieldResolver.filedParserManger(byteBuf, totalFieldConfig, null) + totalFilterLength; - } catch (Exception ex) { - log.error("报文确认分发阶段,获取报文总长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); - } - return totalLength; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer) { - //业务内容 - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - String protocolId = String.valueOf(protocolConfig.getId()); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - //计算固定长度 - Integer fixedLength = calculateLength(fieldConfigList); -// Integer totalLength = this.getTotalLength(protocolConfig, buffer); - //总长度获取 - Integer totalLength = lightText.length(); - //计算固定长度最大长度 - Integer maxFixedPosition = calculatePosition(fieldConfigList); -// buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - //计算数据报文内容 - ByteBuf bizDataFields = buffer.slice(maxFixedPosition-1, (totalLength - fixedLength)); - return bizDataFields; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer) { - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - String protocolId = String.valueOf(protocolConfig.getId()); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer fixedLength = calculateLength(fieldConfigList); -// Integer totalLength = this.getTotalLength(protocolConfig, buffer); - Integer totalLength = lightText.length(); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - ByteBuf fixDataFields = buffer.slice(0, maxFixedPosition); - return fixDataFields; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer) { - String protocolId = String.valueOf(protocolConfig.getId()); - Map fixedPropertyMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer fixedLength = calculateLength(fieldConfigList); - Integer totalLength = this.getTotalLength(protocolConfig, buffer); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - fixedPropertyMap.put("fixedPosition", maxFixedPosition); - fixedPropertyMap.put("totalLength", totalLength); - fixedPropertyMap.put("tailPosition", totalLength - fixedLength + maxFixedPosition); - return fixedPropertyMap; - } - - //分别计算bit和byte长度=> 合并长度 - private Integer calculateLength(List fieldConfigList) { - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (FieldConfig fieldConfig : fieldConfigList) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - Integer fixedLength = bytefixedLength + bitfixedLength / 8; - return fixedLength; - } - - //找到最大值=> 根据最大值计算业务数据下标 - private Integer calculatePosition(List fieldConfigList) { - String rex = "[0-9]+"; - Integer max = -1; - for (FieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOrignPosition()) - && Integer.valueOf(fieldConfig.getOrignPosition()) > max) { - max = Integer.valueOf(fieldConfig.getOrignPosition()); - } - } - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (FieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOrignPosition()) && fieldConfig.getOrignPosition().equals(max)) { - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - } - } - Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; - return maxFixedPosition; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java new file mode 100644 index 0000000..d4ec6c7 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java @@ -0,0 +1,76 @@ +package com.casic.missiles.parser.rule; + +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import org.apache.commons.lang3.StringUtils; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class GenericRuleResolver { + + //根据前置字段的值,找到指定的规则 + //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 + //=>循环判断=>通过规则得到业务字段 + public static RuleConfig machRule(Map fixDataMap, + String ids, + List protocolFieldConfigs, + List ruleConfigs) { + List preRuleConfigList = getPreRuleList(ids, protocolFieldConfigs); + //获取前置规则字段 + final Map metaDataMap = getPreRuleFields(preRuleConfigList, fixDataMap); + //准备固定的字段集合 + Map fixDataFieldMap = getFixDataFieldMap(protocolFieldConfigs); + return RuleResolverCore.doMachRule(ruleConfigs, metaDataMap, fixDataMap, fixDataFieldMap); + } + + private static Map getFixDataFieldMap(List protocolFieldConfigs) { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, ProtocolFieldConfig::getFieldName) + ); + return fixDataFieldMap; + } + + + /** + * 查询前置规则的字段配置 + * + * @param ids + * @return + */ + private static List getPreRuleList(String ids, List protocolFieldConfigs) { + String[] idList = ids.split(","); + Map prepareMaps = new HashMap<>(); + for (String id : idList) { + if (StringUtils.isNotEmpty(id)) { + prepareMaps.put(Long.valueOf(id), ""); + } + } + List preRuleConfigList = protocolFieldConfigs + .stream() + .filter(e -> prepareMaps.containsKey(e.getId())) + .collect(Collectors.toList()); + return preRuleConfigList; + } + + /** + * 获取前置规则解析字段 + */ + private static Map getPreRuleFields(List preRuleFieldConfigList, Map fixDataMap) { + Map ruleFieldMap = new HashMap<>(); + preRuleFieldConfigList.stream() + .forEach( + preRuleFieldConfig -> { + String fieldName = preRuleFieldConfig.getFieldName(); + if (fixDataMap.containsKey(fieldName)) { + ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); + } + } + ); + return ruleFieldMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java index 608af3a..32cc8a4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java @@ -2,48 +2,47 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.delivery.decorator.ByteDecorator; +import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @AllArgsConstructor public class FieldDecoratorManger { - private final RuleDictDao ruleDictDao; + private final RuleConfigRegistry ruleDictDao; // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 // (1)静态的业务字段是字典里面可以配置的 // (2)动态的业务字段是通过规则生成的 public String contentMerge(String ruleJson, String sceneConent, String dynamicContent) { - List ruleDictList = ruleDictDao.getRuleDictConfig(); - Map ruleDictMap = ruleDictList.stream().collect( - Collectors.toMap(RuleDict::getId, e -> e)); - List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); - for (Map ruleMap : ruleMapList) { - String ruleType = String.valueOf(ruleMap.get("ruleType")); - ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); - NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); - byteDecorator.nodeDecoratorRule(nodeDecoratorParm); - } +// List ruleDictList = ruleDictDao.getRuleDictConfig(); +// Map ruleDictMap = ruleDictList.stream().collect( +// Collectors.toMap(RuleDict::getId, e -> e)); +// List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); +// for (Map ruleMap : ruleMapList) { +// String ruleType = String.valueOf(ruleMap.get("ruleType")); +// ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); +// NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); +// byteDecorator.nodeDecoratorRule(nodeDecoratorParm); +// } return null; } - - private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { - NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() - .contents(sceneConent) - .dynamicContent(dynamicContent) - .ruletypeId(ruletypeId) - .ruleDictMap(ruleDictMap) - .build(); - return nodeDecoratorParm; - } +// +// private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { +// NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() +// .contents(sceneConent) +// .dynamicContent(dynamicContent) +// .ruletypeId(ruletypeId) +// .ruleDictMap(ruleDictMap) +// .build(); +// return nodeDecoratorParm; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java index 652970c..b204ac3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java @@ -1,56 +1,56 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@AllArgsConstructor -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", - JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Component; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Component("logicalDecorator") +//@AllArgsConstructor +//@Slf4j +//public class LogicalShiftDecorator implements ByteDecorator { +// +//// private final FieldRuleEngineMapper fieldRuleEngineMapper; +//// +//// //字节位移 +//// @Override +//// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +//// String logicalValue = ""; +//// RuleEvaluator fieldRuleEngine = new RuleEvaluator(); +//// try { +//// Map env2 = new HashMap(); +//// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +//// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +//// for (String contentId : contentIdList) { +//// RuleDict ruleDict = ruleDictMap.get(contentId); +//// if (ruleDict.getCode().contains("#")) { +//// //使用动态的值 +//// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +//// } +//// env2.put(ruleDict.getName(), ruleDict.getCode()); +//// } +//// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +//// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +//// return null; +//// } +//// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +//// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +//// return values; +//// } catch (Exception ex) { +//// log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", +//// JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +//// return null; +//// } +//// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java index 346468f..822fead 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@AllArgsConstructor -@Slf4j -public class OperationDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("optionDecorator") +//@AllArgsConstructor +//@Slf4j +//public class OperationDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //混合运算,有常量或者乘除的缩放 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java index 50fb0a7..7a8bccb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@AllArgsConstructor -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +////精度计算 +//@AllArgsConstructor +//@Registry("precisionDecorator") +//@Slf4j +//public class PrecisionDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java index da39235..27f9cc7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java @@ -1,54 +1,53 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@AllArgsConstructor -@Slf4j -public class RuleDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("ruleDecorator") +//@AllArgsConstructor +//@Slf4j +//public class RuleDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //吃我一套正则表达式 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (Exception ex) { +// log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java index 7f5cbf3..c043f97 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java @@ -2,6 +2,6 @@ import java.util.Map; -public interface ComandeEventService { +public interface ComandeEventService{ Map loadComandeEventConfig(String protocolId,String scene); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java index 476ad84..aaf1837 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java @@ -2,46 +2,46 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.dao.CommandEventDao; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @Slf4j @AllArgsConstructor -public class ComandeEventServiceImpl implements ComandeEventService { +public class ComandeEventServiceImpl implements ComandeEventRegistry { - private final CommandEventDao commandEventDao; + // private final CommandEventDao commandEventDao; // 加密bean 固定字段出现变化的字段解析,业务字段的有序内容 @Override - public Map loadComandeEventConfig(String protocolId,String sceneName) { - CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); - if (ObjectUtil.isEmpty(commandEventConfig)) { - log.error("协议{},没有配置成功接收回复配置,清排查原因"); - return null; - } - String replyJson = commandEventConfig.getReplyContentJson(); - List> replyMapList = JSONArray.parseObject(replyJson, List.class); - List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); - Map fixMap = fixList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); - List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) - .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) - .collect(Collectors.toList()); - Map commandConfigMap = new HashMap<>(); - commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); - commandConfigMap.put("fixContent", fixMap); - commandConfigMap.put("bizContent", contentList); - return commandConfigMap; + public Map loadComandeEventConfig(String protocolId, String sceneName) { +// CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); +// if (ObjectUtil.isEmpty(commandEventConfig)) { +// log.error("协议{},没有配置成功接收回复配置,清排查原因"); +// return null; +// } +// String replyJson = commandEventConfig.getReplyContentJson(); +// List> replyMapList = JSONArray.parseObject(replyJson, List.class); +// List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); +// Map fixMap = fixList.stream() +// .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); +// List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) +// .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) +// .collect(Collectors.toList()); +// Map commandConfigMap = new HashMap<>(); +// commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); +// commandConfigMap.put("fixContent", fixMap); +// commandConfigMap.put("bizContent", contentList); +// return commandConfigMap; + return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 128b09d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java deleted file mode 100644 index 4016b0b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface DatagramEventMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java deleted file mode 100644 index 597c306..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.apache.ibatis.annotations.Mapper; - -public interface FieldConfigMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java deleted file mode 100644 index a31680a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.PreRuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface PreRuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java deleted file mode 100644 index 9060a69..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface ProtocolConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java deleted file mode 100644 index 6fa6936..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java deleted file mode 100644 index 582a705..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleDict; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleDictMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java deleted file mode 100644 index 6e302c8..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.CommandEventMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Optional; - -@Component -public class CommandEventDao { - - @Resource - private CommandEventMapper commandEventMapper; - - public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId) - .eq("scene", sceneName) - .eq("enabled", 1); - List commandEventConfig = commandEventMapper.selectList(queryWrapper); - Optional optionalEventConfig = commandEventConfig.stream().findFirst(); - return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java deleted file mode 100644 index 9137e4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.FieldConfigMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class FieldConfigDao { - - @Resource - private FieldConfigMapper fieldConfigMapper; - - public FieldConfig getFieldConfigById(String fieldId) { - FieldConfig fieldConfig = fieldConfigMapper.selectById(fieldId); - return fieldConfig; - } - - public List getFieldConfigs(String protocolId,Integer isFixed) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",isFixed); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - - public List getStorageFieldConfig(String protocolId) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",1) - .eq("is_storage",1); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java deleted file mode 100644 index 67bff6b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.mapper.PreRuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class PreRuleConfigDao { - - @Resource - private PreRuleConfigMapper preRuleConfigMapper; - - public List getPreRuleList(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return preRuleConfigMapper.selectList(queryWrapper); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java deleted file mode 100644 index d69ea85..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.RuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleConfigDao { - - @Resource - private RuleConfigMapper ruleConfigMapper; - - public RuleConfig getNextRuleConfig(String ruleFields) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("parse_rule_json", ruleFields); - return ruleConfigMapper.selectOne(queryWrapper); - } - - - public List getRuleConfigById(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return ruleConfigMapper.selectList(queryWrapper); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java deleted file mode 100644 index 932c185..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.RuleDictMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleDictDao { - - @Resource - private RuleDictMapper ruleDictMapper; - - public List getRuleDictConfig() { - List ruleDictList = ruleDictMapper.selectList(null); - return ruleDictList; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java index 9f9e279..43bc4d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java @@ -10,20 +10,15 @@ import io.netty.channel.socket.nio.NioServerSocketChannel; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import javax.annotation.PreDestroy; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static cn.hutool.core.util.ClassUtil.getClasses; /** * SensorhubServer netty服务端 */ @Slf4j -@Service +@Component public class SensorhubServer { /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java index 2c79ff5..9a28c36 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java @@ -11,13 +11,13 @@ import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioSocketChannel; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClient 客户端 */ @Slf4j -@Service +@Registry public final class SensorhubClient { public static void main(String[] args) throws Exception { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java index 9774be0..477c3f7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java @@ -6,12 +6,12 @@ import io.netty.channel.socket.SocketChannel; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientChannelInitialHandler */ -@Service +@Registry public class SensorhubClientChannelInitialHandler extends ChannelInitializer { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java index 346f4b3..73560e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java @@ -5,13 +5,13 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientHandler */ @Slf4j -@Service +@Registry public class SensorhubClientHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java index 5c1c6f2..d990af5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java @@ -4,12 +4,12 @@ import com.casic.missiles.pojo.Msg; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** * SensorhubServerHandler */ -@Service +@Component public class SensorhubServerHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 67283ae..af3172c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,41 +1,37 @@ package com.casic.missiles.parser; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultProtocolConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.*; +import com.casic.missiles.registry.FieldConfigRegistry; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; -import java.nio.charset.Charset; import java.util.HashMap; import java.util.List; import java.util.Map; -@Service("genericProtocolParser") +/** + * @author + */ +@Component("genericProtocolParser") @Slf4j -@AllArgsConstructor +@RequiredArgsConstructor public class GenericProtocolParser implements ProtocolParser { - private final LeadingCodeMatcher leadingCodeMatcher; private final List frameStructDispenserList; - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorInstanceSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; // 匹配首字母前导码=> 帧结构匹配前导码=> // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 @@ -44,18 +40,19 @@ public Boolean doParseProtocol(ByteBuf byteBuf) { String protocolContent = ByteBufUtil.hexDump(byteBuf); //匹配前导码 - List preCodeConfigs = leadingCodeMatcher.matchLeadingCode(protocolContent); + List preCodeConfigs = LeadingCodeMatcher.matchFrameLeadingCode(protocolContent); //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 if (preCodeConfigs.size() == 0) { - return rematch(byteBuf,protocolContent); + return rematch(byteBuf, protocolContent); } - //暂时先取第一个 + //暂时先取第一个,提升速度,使用享元模式, 减少类的创建销毁与构建 ProtocolConfig protocolConfig = preCodeConfigs.get(0); + AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); ByteBuf wholeDatagramByte = null; //通过匹配帧结构获取完整的数据包 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, preCodeConfigs.get(0))) != null) { + if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, protocolFactory)) != null) { break; } } @@ -68,76 +65,78 @@ * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 */ - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId, wholeDatagramByte); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap, protocolId); - //选取规则对应的流程实例 - DatagramEventConfig datagramEventConfig = processorInstanceSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); + //进行规则字段解析,进行匹配规则 + RuleConfig ruleConfig = getRuleConfig(protocolFactory, wholeDatagramByte); + if (ruleConfig == null) { + return false; + } //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, wholeDatagramByte); + ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte); + //以下进行业务的规则解析,同时选定流程实例 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); + DatagramEventProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain, + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText, protocolId); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain); //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); + datagramEventProvider.storeData(bizDataMap); return true; } - private Boolean rematch(ByteBuf byteBuf,String protocolContent) { + /** + * 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 + */ + private Boolean rematch(ByteBuf byteBuf, String protocolContent) { //重置位判断 byteBuf.resetReaderIndex(); //判断重置是否前移,如果没有前移,则直接判为匹配失败 if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { return false; } else { + //递归执行 return doParseProtocol(byteBuf); } } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; + //获取匹配规则->匹配规则 + private RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + //取出其中参与逻辑provider并判空 + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); + String rulePrepareFields = protocolConfig.getRulePrepareFields(); + //固定字段 + if (StringUtils.isNotEmpty(rulePrepareFields)) { + //获取统一固定字段解析 + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + //获取该协议的字段配置,用于协议规则匹配 + List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); + //获取规则 + RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, + rulePrepareFields, protocolFieldConfigs); + return ruleConfig; + } + return null; } - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + //数据构建,获取固定字段的store和业务字段store + private Map buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + Map bizDataMap = new HashMap<>(); + Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); + Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); + bizDataMap.putAll(ruleStoreObjectMap); + bizDataMap.putAll(protocolStoreObjectMap); return bizDataMap; } - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java index 8a46e32..16ce2e5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java @@ -3,6 +3,7 @@ import io.netty.buffer.ByteBuf; public interface ProtocolParser { + Boolean doParseProtocol(ByteBuf byteBuf); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java new file mode 100644 index 0000000..f7814af --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java @@ -0,0 +1,35 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.ProtocolConfigProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.ProtocolConfig; + +/** + * 存放基本协议的的加载信息 + */ +public class AbstractProtocolConfigFactory { + private final ProtocolConfigProvider protocolConfigProvider; + private final ProtocolFieldConfigProvider protocolFieldConfigProvider; + private final RuleConfigProvider ruleConfigProvider; + + public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { + this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); + this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); + this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); + } + + public ProtocolConfigProvider getProtocolConfigProvider() { + return protocolConfigProvider; + } + + public ProtocolFieldConfigProvider getProtocolFieldConfigProvider() { + return protocolFieldConfigProvider; + } + + public RuleConfigProvider getRuleConfigProvider() { + return ruleConfigProvider; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java new file mode 100644 index 0000000..6e36147 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java @@ -0,0 +1,57 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.CombinedFieldConfigProvider; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.FieldConfigProvider; +import com.casic.missiles.parser.provider.FieldRuleConfigProvider; + +/** + * 存放规则相关的的的加载信息 + */ +public class AbstractRuleConfigFactory { + + /** + * 处理字节 + */ + private final FieldConfigProvider fieldConfigProvider; + /** + * 处理组合字节解析的解码器 + */ + private final CombinedFieldConfigProvider combinedFieldConfigProvider; + /** + * 处理负责字节解析的规则配置 + */ + private final FieldRuleConfigProvider fieldRuleConfigProvider; + /** + * 处理实例流程 + */ + private final DatagramEventProvider datagramEventProvider; + + + public AbstractRuleConfigFactory(Long ruleId) { + this.fieldConfigProvider = new FieldConfigProvider(ruleId); + this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); + this.fieldRuleConfigProvider = new FieldRuleConfigProvider(ruleId); + this.datagramEventProvider = new DatagramEventProvider(ruleId); + } + + public FieldConfigProvider getFieldConfigProvider() { + return fieldConfigProvider; + } + + public CombinedFieldConfigProvider getCombinedFieldConfigProvider() { + return combinedFieldConfigProvider; + } + + public FieldRuleConfigProvider getFieldRuleConfigProvider() { + return fieldRuleConfigProvider; + } + + public DatagramEventProvider getDatagramEventProvider() { + return datagramEventProvider; + } + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java deleted file mode 100644 index 6e1719a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.factory; - - -import com.casic.missiles.pojo.ProtocolConfig; - -import java.util.List; - -/** - * 数据库访问优化(暂时未做) - *

- * 1、初始化协议解析配置,并存放到处存放缓存,对协议基本配置进行管理 - * 2、其中流程中所有的配置都经过此类进行管理,进行调用获取,增强解析速度 - */ -public interface DatagramFactory { - - /** - * 初始化 - */ - List datagramInit(); - - /** - * 根据前导码配置匹配,模糊匹配获取所有的报文项 - */ - List match(); - - /** - * 根据前导码匹配,返回报文项 - */ - List filer(); - - /** - * 保证数据的唯一性选择器 - */ - List selectOne(); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java new file mode 100644 index 0000000..87444a0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java @@ -0,0 +1,18 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +import java.util.List; + +/** + * 直接用,还是边用边创建 + */ +public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { + + + public DefaultProtocolConfigFactory(ProtocolConfig protocolConfig) { + super(protocolConfig); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java new file mode 100644 index 0000000..cce0c7c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java @@ -0,0 +1,12 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; + +public class DefaultRuleFactory extends AbstractRuleConfigFactory { + + public DefaultRuleFactory(Long ruleId) { + super(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java deleted file mode 100644 index 9ee97e0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.casic.missiles.parser.instance; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service -@Slf4j -@AllArgsConstructor -public class GeneralProcessor { - - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; - - /** - * 统一固定字段解析=>进行规则的查询的判断 - * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 - * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 - */ - @Deprecated - public boolean parseWholeDatagram(ByteBuf buffer, ProtocolConfig protocolConfig) { - try { - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap,protocolId); - //选取规则对应的流程= - DatagramEventConfig datagramEventConfig = processorSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); - //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); - //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); - //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); - //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); - //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); - return true; - } catch (Exception ex) { - log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", - ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); - return false; - } - } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; - } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); - } - - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); - return bizDataMap; - } - - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java index 25e7ad8..6a5777e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java @@ -1,23 +1,31 @@ package com.casic.missiles.parser.instance.impl; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.mapper.DatagramEventMapper; import com.casic.missiles.pojo.DatagramEventConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.SpringContextUtil; -@Service -@AllArgsConstructor +import java.util.List; +import java.util.Optional; + +/** + * @author cz + * + */ public class DefaultProcessorInstanceSelector implements ProcessorInstanceSelector { - private final DatagramEventMapper datagramEventMapper; + private static List datagramEventConfigs; + + static { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + datagramEventConfigs = datagramEventRegistry.getDatagramEventList(); + } @Override public DatagramEventConfig getProcessorInstance(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("rule_id", protocolId); - return datagramEventMapper.selectOne(queryWrapper); + Optional optionalSelectInstance = datagramEventConfigs.stream() + .filter(e -> e.getId().equals(protocolId)).limit(1).findFirst(); + return optionalSelectInstance.isPresent() ? optionalSelectInstance.get() : null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a778671..7b56a43 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,16 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import io.netty.buffer.ByteBuf; /** - * 分析匹配情况 - * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 - * 2、匹配不成功,有后续帧,可以进行下次匹配。 - * 3、匹配不成功,无后续帧,可以进行丢弃。 + * 分析匹配情况 + * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 + * 2、匹配不成功,有后续帧,可以进行下次匹配。 + * 3、匹配不成功,无后续帧,可以进行丢弃。 */ -public interface FrameStructMatcher{ +public interface FrameStructMatcher { - ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig); + ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 05320ab..8ebea78 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,23 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.ProtocolConfigMapper; +import com.casic.missiles.parser.provider.ProtocolConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Component; import java.util.List; import java.util.stream.Collectors; -@Component -@AllArgsConstructor public class LeadingCodeMatcher { - private final ProtocolConfigMapper protocolMapper; - //** 1、首字母匹配前导码, // 2、以匹配出的前导码是否在报文中条件进行前导码的匹配二次筛选 - public List matchLeadingCode(String protocolContent){ + public static List matchFrameLeadingCode(String protocolContent){ List initialConfigs = initialMatch(protocolContent); List preCodeConfigs = initialConfigs.stream() .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) @@ -26,13 +19,16 @@ } //初始化匹配前导码内容 - private List initialMatch(String protocolContent) { - String protocolStr = protocolContent.charAt(0) + ""; - QueryWrapper queryWrapper = new QueryWrapper() - .likeRight("pre_fix", protocolStr); - List protocolConfigList = protocolMapper.selectList(queryWrapper); - return protocolConfigList; + private static List initialMatch(String protocolContent) { + String firstFrameChar = protocolContent.charAt(0) + ""; + ProtocolConfigProvider protocolConfigProvider=new ProtocolConfigProvider(firstFrameChar); + return protocolConfigProvider.getMatchList(); } + + + + + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index cf2113d..e915877 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -1,32 +1,35 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(0) -@Service +@Component public class FrameLengthMatcher implements FrameStructMatcher { - @Autowired - private FieldParser fieldParser; - //超过长度 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { String dataGramContent = ByteBufUtil.hexDump(byteBuf); - if (StringUtils.isEmpty(protocolConfig.getUnpackId()) && StringUtils.isEmpty(protocolConfig.getTailStr())) { - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + //当不存在结尾标志和拆包标志,可以直接使用长度进行匹配 + if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { if (dataGramContent.length() >= totalLength) {//等于长度返回true,超出长度,切断 - ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, protocolConfig, totalLength); + ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, totalLength); return wholeDatagramByte; } else { //读的标志位前移舍弃 @@ -38,7 +41,7 @@ return null; } - private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, Integer totalLength) { byteBuf.readBytes(totalLength); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, totalLength - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 2bfc213..d527ad0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; @@ -13,7 +13,7 @@ import lombok.AllArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.nio.charset.Charset; import java.util.Map; @@ -22,32 +22,30 @@ * 后续标志验证 */ @Order(1) -@Service +@Component @AllArgsConstructor -public class FrameMarkMatcher implements FrameStructMatcher { - - private final FieldConfigDao fieldConfigDao; - private final FieldParser fieldParser; - private final FieldResolver fieldResolverManger; +public class FrameMarkMatcher implements FrameStructMatcher, FixedPropertyEnum { //帧后续标志=>结束,进行帧的重组=>有后续,1、帧移位判别 2、继续接收帧 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig UnpackConfig = StringUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getUnpackId()); - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); - Integer upback = 0; + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); ByteBuf mergeWholeFrameByte = null; - if (!ObjectUtil.isEmpty(UnpackConfig)) { - while (hasNextFullFrame(byteBuf, protocolConfig)) { - upback = (Integer) fieldResolverManger.filedParserManger(byteBuf, UnpackConfig, null); + if (!ObjectUtil.isEmpty(unpackFlag)) { + while (hasNextFullFrame(byteBuf, protocolConfig, protocolFieldConfigProvider)) { //是否存在后续位 - if (upback == 1) {//使用esayRule + if (unpackFlag == 1) {//使用esayRule //表示可以截取 - mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolConfig, totalLength); + mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolFieldConfigProvider, protocolConfig); return mergeWholeFrameByte; } else { - byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig)); + byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig, protocolFieldConfigProvider)); } } } @@ -56,7 +54,8 @@ //选取第一个帧,将业务内容和后面部分分开 //计算数据报文-业务内容 - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolFieldConfigProvider protocolFieldConfigProvider, ProtocolConfig protocolConfig) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); //截取完整报文 byteBuf.readBytes(totalLength); ByteBuf byteBufContent = byteBuf.slice(0, byteBuf.readerIndex()); @@ -68,15 +67,15 @@ String tail = ""; System.out.println(ByteBufUtil.hexDump(byteBufContent)); //会存在多个帧拼接在一起的的情况,进行合并处理 - while (hasNextFullFrame(byteBufContent, protocolConfig)) { - Integer currentFrameLength = fieldParser.getTotalLength(protocolConfig, byteBufContent); + while (hasNextFullFrame(byteBufContent, protocolConfig, protocolFieldConfigProvider)) { + Integer currentFrameLength = protocolFieldConfigProvider.getTotalLength(byteBufContent, protocolConfig); byteBufContent.readBytes(currentFrameLength); ByteBuf currentbyteBuf = byteBufContent.slice(0, byteBufContent.readerIndex()); byteBufContent.markReaderIndex();//读的标志位前移 System.out.println(ByteBufUtil.hexDump(byteBufContent)); String hexDump = currentbyteBuf.toString(Charset.forName("ISO-8859-1")); //获取当前固定帧结构的关系map - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, currentbyteBuf); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(currentbyteBuf, protocolConfig); if (StringUtils.isEmpty(mergeFrameStr)) { //首次获取业务数据报文 mergeFrameStr += hexDump.substring(0, currentFrameFixedProperty.get("tailPosition")); @@ -95,22 +94,22 @@ /** * 获取平移到下一帧起始位置 */ - public int getNextFrameOffset(ByteBuf buffer, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, buffer); - return currentFrameFixedProperty.get("totalLength"); + public int getNextFrameOffset(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + return currentFrameFixedProperty.get(TOTAL_LENGTH); } /** * 判断是否出错进行整个帧的 */ - public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, byteBuf); + public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); //保证读取位置不在固定位置,是可变的业务内容 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("fixedPosition")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(FIXED_POSITION)) { return false; } //判断读取是否操作帧长度 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("totalLength")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(TOTAL_LENGTH)) { return false; } return true; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 76a3784..c3a1bab 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -1,50 +1,50 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.parser.instance.GeneralProcessor; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; +import io.netty.buffer.ByteBufUtil;; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(2) -@Service +@Component public class FrameTailMatcher implements FrameStructMatcher { - @Resource - private FieldConfigDao fieldConfigDao; - @Autowired - private GeneralProcessor generalProcessor; - //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig tailFieldConfig = StringUtils.isEmpty(protocolConfig.getTailStr()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getTailStr()); - if (!ObjectUtil.isEmpty(tailFieldConfig)) { - String tailStr = tailFieldConfig.getFieldName(); + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfig protocolFieldConfig = ObjectUtils.isEmpty(protocolConfig.getTailStr()) ? null : + fieldConfigProvider.getFieldConfigById(protocolConfig.getTailStr()); + if (!ObjectUtil.isEmpty(protocolFieldConfig)) { + String tailStr = protocolFieldConfig.getFieldName(); String dataGramContent = ByteBufUtil.hexDump(byteBuf); Boolean tailFlag = ByteBufUtil.hexDump(byteBuf).contains(tailStr); if (!tailFlag) { //使用esayRule return null; } else if (dataGramContent.indexOf(tailStr) < dataGramContent.length() - tailStr.length()) { Integer length = dataGramContent.indexOf(tailStr) + tailStr.length(); - ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, protocolConfig, length); + ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, length); return wholeDatagramByte; //存在粘包 } } return null; } - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer length) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, Integer length) { byteBuf.readBytes(length); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, length - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java new file mode 100644 index 0000000..5f1c177 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java @@ -0,0 +1,73 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.combined.GenericCombinedFieldResolver; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.CombinedFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class CombinedFieldConfigProvider { + + + /** + * 作为临时配置列表缓存使用 + */ + private final List combinedFieldConfigList; + private Map storeObjectMap = new HashMap<>(); + + public CombinedFieldConfigProvider(Long ruleId) { + CombinedFieldConfigRegistry combinedFieldConfigRegistry = SpringContextUtil.getBean(CombinedFieldConfigRegistry.class); + combinedFieldConfigList = combinedFieldConfigRegistry.getCombinedFieldConfigList(ruleId); + } + + public void parseDataField(RuleConfig ruleConfig, String clearZeroPlain,Map fieldConfigsMap ) { + if (showSkip()) { + return; + } + //匹配对应的数据,然后进行相关的字段解析 + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver(); + combinedFieldResolver.parseDataField(combinedFieldConfigList, byteBuf, storeObjectMap,fieldConfigsMap); + } + + + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getCombinedFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return combinedFieldConfigList.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public List getCombinedFieldConfigList() { + return combinedFieldConfigList; + } + + /* 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(combinedFieldConfigList) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java new file mode 100644 index 0000000..f3cfedc --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java @@ -0,0 +1,11 @@ +package com.casic.missiles.parser.provider; + +/** + * @author cz + * @date 2023-6-12 + */ +public class CommandEventProvider{ + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java new file mode 100644 index 0000000..70eec5e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java @@ -0,0 +1,77 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.safe.SafeStrategy; +import com.casic.missiles.parser.sender.DataSubscribeProvider; +import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class DatagramEventProvider { + + private final DatagramEventConfig processorInstance; + + public DatagramEventProvider(Long ruleId) { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + List datagramEventConfigList = + datagramEventRegistry.getDatagramEventList(ruleId); + processorInstance = this.getProcessorInstance(datagramEventConfigList); + } + + public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { + if (showSkip()) { + return null; + } + return datagramEventConfigList.get(0); + } + + // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 + public String getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap) { + String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? + processorInstance.getSafeBean() : + fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); + if (!StringUtils.isEmpty(safeName)) { + //需要加密 + SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); + String plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); + return clearComplementZero(plain); + } + return ByteBufUtil.hexDump(bizDataContent); + } + + //解密清零操作 + private String clearComplementZero(String plain) { + plain = plain.substring(0, plain.lastIndexOf("00")); + return plain; + } + + //数据发送,数据发送者暂未构建 + public void storeData(Map bizDataMap) { + DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); +// dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return ObjectUtils.isNotEmpty(processorInstance) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java new file mode 100644 index 0000000..7e1fe0a --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java @@ -0,0 +1,97 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.FieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class FieldConfigProvider { + + + private final List fieldConfigs; + private Map storeObjectMap = new HashMap<>(); +// private Map singleObjects = new ConcurrentHashMap<>(); + + public FieldConfigProvider(Long ruleId) { + FieldConfigRegistry fieldConfigRegistry = SpringContextUtil.getBean(FieldConfigRegistry.class); + fieldConfigs = fieldConfigRegistry.getFieldConfigList(ruleId); + } + + public List getFieldConfigs() { + return fieldConfigs; + } + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public Map parseDataField(RuleConfig ruleConfig, String clearZeroPlain) { + if (showSkip()) { + return null; + } + List prepareFieldConfig = prepareParseField(ruleConfig); + if (CollectionUtils.isNotEmpty(prepareFieldConfig)) { + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(fieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + return fixDataMap; + } + } + return null; + } + + /** + * 得到需要处理的业务内容 + * + * @return + */ + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return fieldConfigs.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public Map getFieldConfigsMap() { + return fieldConfigs.stream().collect( + Collectors.toMap(FieldConfig::getId, e -> e) + ); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(fieldConfigs) ? false : true; + } + + +} + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java new file mode 100644 index 0000000..817bfaf --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java @@ -0,0 +1,19 @@ +package com.casic.missiles.parser.provider; + +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.registry.FieldRuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; + +public class FieldRuleConfigProvider { + + private final List fieldRuleConfigList; + + public FieldRuleConfigProvider(Long ruleId) { + FieldRuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(FieldRuleConfigRegistry.class); + fieldRuleConfigList = ruleConfigRegistry.getFieldRuleConfigList(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java new file mode 100644 index 0000000..99a1b06 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java @@ -0,0 +1,53 @@ +package com.casic.missiles.parser.provider; + + +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.registry.ProtocolConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolConfigProvider { + + private final List protocolConfigList; + + public ProtocolConfigProvider(String firstChar) { + ProtocolConfigRegistry registry = SpringContextUtil.getBean(ProtocolConfigRegistry.class); + protocolConfigList = registry.getProtocolConfigList(firstChar); + } + + public List getMatchList() { + return protocolConfigList; + } + + /** + * 设置当前协议 + * + * @param protocolConfig + */ + public ProtocolConfigProvider(ProtocolConfig protocolConfig) { + List protocolConfigs = new ArrayList<>(); + protocolConfigs.add(protocolConfig); + protocolConfigList = protocolConfigs; + } + + /** + * 获取当前协议 + * + * @return + */ + public ProtocolConfig getCurrentProtocolConfig() { + if (this.protocolConfigList == null) { + return null; + } else { + return protocolConfigList.get(0); + } + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java new file mode 100644 index 0000000..043927d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java @@ -0,0 +1,213 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.registry.ProtocolFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolFieldConfigProvider { + + private static final String FIXED_FIELD_DS = "fixedFieldDs"; + private static final String CONTENT_FIELD_DS = "contentFieldDs"; + private static final String PROTOCOL_LENGTH = "protocolLength"; + private static final String PROTOCOL_FIELD_ID = "protocolFieldId"; + private static final String PROTOCOL_POSITION = "protocolPosition"; + + private final List protocolFieldConfigs; + private Map singleObjects = new ConcurrentHashMap<>(); + private Map storeObjectMap = new HashMap<>(); + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public ProtocolFieldConfigProvider(Long protocolId) { + ProtocolFieldConfigRegistry protocolFieldConfigRegistry = SpringContextUtil.getBean(ProtocolFieldConfigRegistry.class); + protocolFieldConfigs = protocolFieldConfigRegistry.getProtocolFieldConfigList(protocolId); + } + + public List getProtocolFieldConfigs() { + return protocolFieldConfigs; + } + + public ProtocolFieldConfig getFieldConfigById(Long fieldId) { + Optional optionalConfig = protocolFieldConfigs.stream().filter( + e -> e.getId().equals(fieldId) + ).findFirst(); + return optionalConfig.isPresent() ? optionalConfig.get() : null; + } + + public Integer getProtocolFieldValue(Long protocolFieldId, ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_FIELD_ID + protocolFieldId + ByteBufUtil.hexDump(byteBuf); + //获取缓存 + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + //加载固定长度数据集合 + Map fixDataMap = this.getProtocolDataMap(byteBuf); + ProtocolFieldConfig protocolFieldConfig = selectFieldConfig(protocolFieldId); + Integer protocolFieldValue = 0; + //获取约定字段的总长度 + if (fixDataMap.containsKey(protocolFieldConfig.getFieldName())) { + Object appointUnpackObject = fixDataMap.get(protocolFieldConfig.getFieldName()); + if (ObjectUtils.isNotEmpty(appointUnpackObject)) { + protocolFieldValue = (Integer) appointUnpackObject; + } + } + if (protocolFieldValue != null) { + //加入缓存 + if (ObjectUtils.isNotEmpty(protocolFieldValue)) { + this.singleObjects.put(catchKey, protocolFieldValue); + return protocolFieldValue; + } + } + return null; + } + + /** + * 获取帧固定位置信息 + * + * @param byteBuf + * @param protocolConfig + * @return + */ + public Map getFixedProperty(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_POSITION + protocolConfig.getId(); + if (this.singleObjects.containsKey(catchKey)) { + return (Map) singleObjects.get(catchKey); + } + Map fixedPropertyMap = new HashMap<>(); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + fixedPropertyMap = fieldParser.doGetFixedProperty(protocolFieldConfigs, this.getTotalLength(byteBuf,protocolConfig)); + if (CollectionUtils.isNotEmpty(fixedPropertyMap)) { + this.singleObjects.put(catchKey, fixedPropertyMap); + return fixedPropertyMap; + } + return fixedPropertyMap; + } + + /** + * 获取帧结构应有的总长度 + */ + public Integer getTotalLength(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_LENGTH + ByteBufUtil.hexDump(byteBuf); + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + Integer appointFrameLength = getProtocolFieldValue(protocolConfig.getTotalLengthId(), byteBuf); + if (appointFrameLength != null) { + //获取过滤的字段集合总长度 + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Integer totalFilterLength = fieldParser.getTotalFilterLength(protocolConfig, byteBuf, getFixFieldConfigMap()); + //计算总长度 + Integer totalLength = appointFrameLength + totalFilterLength; + //加入缓存 + if (ObjectUtils.isNotEmpty(totalLength)) { + this.singleObjects.put(catchKey, totalLength); + return totalLength; + } + } + return null; + } + + /** + * 获取协议有关字段解析内容 + * storeObjectMap存储代转存的数据 + * + * @return + */ + public Map getProtocolDataMap(ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(FIXED_FIELD_DS)) { + return (Map) singleObjects.get(FIXED_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(protocolFieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + this.singleObjects.put(FIXED_FIELD_DS, fixDataMap); + return fixDataMap; + } + return null; + } + + /** + * 获取业务报文内容的content字节 + * + * @param wholeDatagramByte + * @return + */ + public ByteBuf getDataContentBuf(ByteBuf wholeDatagramByte) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(CONTENT_FIELD_DS)) { + return (ByteBuf) singleObjects.get(CONTENT_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + ByteBuf bizDataByteBuf = fieldParser.getDataContentBuf(protocolFieldConfigs, wholeDatagramByte); + if (bizDataByteBuf != null) { + this.singleObjects.put(CONTENT_FIELD_DS, bizDataByteBuf); + return bizDataByteBuf; + } + return null; + } + + + private ProtocolFieldConfig selectFieldConfig(Long id) { + Optional optionalProtocolFieldConfig = this.protocolFieldConfigs.stream().filter( + e -> e.getId().equals(id) + ).findFirst(); + return optionalProtocolFieldConfig.isPresent() ? optionalProtocolFieldConfig.get() : null; + } + + + private Map getFixFieldConfigMap() { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, e -> e) + ); + return fixDataFieldMap; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(protocolFieldConfigs) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java new file mode 100644 index 0000000..dafba1c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java @@ -0,0 +1,56 @@ +package com.casic.missiles.parser.provider; + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.rule.GenericRuleResolver; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.RuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleConfigProvider { + + private final List ruleConfigs; + + public List getRuleConfigs() { + return ruleConfigs; + } + + public RuleConfigProvider(Long protocolId) { + RuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(RuleConfigRegistry.class); + ruleConfigs = ruleConfigRegistry.getRuleConfigById(protocolId); + } + + /** + * 获取规则匹配结果 + * + * @param parseFixedDataMap + * @param protocolFieldConfigs + * @return + */ + public RuleConfig doGetRule(Map parseFixedDataMap, + String ids, + List protocolFieldConfigs) { + if (showSkip()) { + return null; + } + RuleConfig ruleConfig = GenericRuleResolver.machRule(parseFixedDataMap, ids, protocolFieldConfigs, ruleConfigs); + return ruleConfig; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(ruleConfigs) ? false : true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java index 3c05891..856b399 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java @@ -1,18 +1,11 @@ package com.casic.missiles.parser.resolver; -import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.springframework.web.bind.annotation.RequestBody; -import javax.annotation.Resource; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -20,19 +13,17 @@ @Slf4j public class ByteMergeProvider { - @Resource - private FieldRuleEngineMapper fieldRuleEngineMapper; - //拿到所有的值合并到一个值 - public String resolveByteMerge(List valueList, String ruletypeId, String vaildRange) { + public static String resolveByteMerge(List valueList, String ruleTypeId, String vaildRange) { String values = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Map vaildMap = getValidRangeMap(vaildRange); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(ruletypeId); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } + //暂时不处理 +// fieldRuleEngine = fieldRuleConfigMapper.selectById(ruleTypeId); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } Map env2 = new HashMap(); for (int i = 0; i < valueList.size(); i++) { if (vaildMap.containsKey(i)) { @@ -47,7 +38,7 @@ } } - private Map getValidRangeMap(String vaildRange) { + private static Map getValidRangeMap(String vaildRange) { String[] range = vaildRange.split(","); Map vaildMap = new HashMap(); for (int i = 0; i < range.length; i++) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 8d821cd..85d6bbf 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -1,9 +1,12 @@ package com.casic.missiles.parser.resolver; +import com.casic.missiles.pojo.AbstractFieldConfig; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; import io.netty.buffer.ByteBuf; +import java.util.List; import java.util.Map; /** @@ -11,18 +14,14 @@ */ public interface FieldParser { -// Map fieldProcess(String protocolContent,); - Map dataParser(RuleConfig ruleConfig, String lightText,String protocolId); + Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength); - Map fixDataParser(String protocolId, ByteBuf buffer); + Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap); - Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf); + ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer); - ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer); - - ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer); - - Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer); + Integer getTotalFilterLength(ProtocolConfig protocolConfig, ByteBuf byteBuf, Map protocolFieldConfigMap); } + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java new file mode 100644 index 0000000..9e0c00e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java @@ -0,0 +1,52 @@ +package com.casic.missiles.parser.resolver; + +import com.casic.missiles.pojo.AbstractFieldConfig; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.util.List; + +public class FieldParserSupport { + + //分别计算bit和byte长度=> 合并长度 + protected Integer calculateLength(List fieldConfigList) { + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + Integer fixedLength = bytefixedLength + bitfixedLength / 8; + return fixedLength; + } + + //找到最大值=> 根据最大值计算业务数据下标 + protected Integer calculatePosition(List fieldConfigList) { + String rex = "[0-9]+"; + Integer max = -1; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) + && Integer.valueOf(fieldConfig.getOriginPositionByte()) > max) { + max = Integer.valueOf(fieldConfig.getOriginPositionByte()); + } + } + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) && fieldConfig.getOriginPositionByte().equals(max)) { + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + } + } + Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; + return maxFixedPosition; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java deleted file mode 100644 index dd3a6cd..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java +++ /dev/null @@ -1,170 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.ByteResolverParam; -import io.netty.buffer.ByteBuf; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -/** - * 字段解析管理总类 - */ -@Service -@Slf4j -@AllArgsConstructor -public class FieldResolver extends ByteMergeProvider { - - //1、字段截取 => 2、简单的字节解析和复杂的字节解析 - public Object filedParserManger(ByteBuf byteBuf, FieldConfig fieldConfig, Integer maxFixedPosition) { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - //最大固定位置不为空, - if (!ObjectUtil.isEmpty(maxFixedPosition)) { - orignPosition -= maxFixedPosition; - } - Object fieldValue = 0; - //待优化 - if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { - fieldValue = bitToResolver(byteBuf, fieldConfig); - } else { - ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); - fieldValue = parsingFields(fieldBytes, fieldConfig.getRuleJson()); - } - return fieldValue; - } - - //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, - //目前默认配置的规则设置暂不支持配置化,由实现完成 - private Object parsingFields(ByteBuf byteBuf, String ruleJson) { - Object fieldsResolveValue = null; - List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); - if (ObjectUtil.isEmpty(ruleMapList)) { - fieldsResolveValue = defaultResolveBuilder(byteBuf); - } else { - fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); - } - return fieldsResolveValue; - } - - private Object defaultResolveBuilder(ByteBuf byteBuf) { - Integer defaultResolveValue = 0; - for (int i = 0; i < byteBuf.writerIndex(); i++) { - defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; - } - return defaultResolveValue; - } - - //字段解析构建器(针对字节单位的) - //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 - // 字节归并结束或者规则结束=>继续根据规则进行判断 - private Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { - Object customizeResolveValue = null; - try { - List bytStrList = new ArrayList<>(); - //存放到数组里面 - for (int i = 0; i < byteBuf.writerIndex(); i++) { - bytStrList.add(byteBuf.readByte()); - } - int i = 0; - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - customizeResolveValue = this.resolveByteMerge(bytStrList, ruletypeId,vaildRange); - break; - } else { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - List tempBytStr = new ArrayList<>(); - for (int k = 0; i < bytStrList.size(); i++) { - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(k) - .value(bytStrList.get(k)) - .ruletypeId(ruletypeId).build(); - tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); - } - bytStrList = tempBytStr; - } - i++; - } - //字节归并到一起=>继续根据规则进行判断 - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(customizeResolveValue) - .ruletypeId(ruletypeId).build(); - customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(customizeResolveValue)); - return customizeResolveValue; - } catch (RuntimeException ex) { - log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); - return null; - } - } - - /** - * 1、单个字节情况表示字段 - * 2、多字节情况表示字段(暂未处理) - */ - private Object bitToResolver(ByteBuf byteBuf, FieldConfig fieldConfig) { - Object fieldValue = new Object(); - try { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - byte fields = 0x00; - if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); - } else { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); - } - - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { - if (!StringUtils.isEmpty(fieldConfig.getExactOrignPosition())) { - fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getExactOrignPosition())).byteValue() - >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); - } else { - fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); - } - } else { - fieldValue = Integer.valueOf(fields & 0xff); - } - if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { - return fieldValue; - } - List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); - int i = 0; - //字节归并到一起=>继续根据规则进行判断 - while (i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(fieldValue) - .ruletypeId(ruletypeId).build(); - fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(fieldValue)); - return fieldValue; - } catch (RuntimeException ex) { - log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); - return null; - } - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java new file mode 100644 index 0000000..1d2aeab --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java @@ -0,0 +1,36 @@ +package com.casic.missiles.parser.resolver.bytes; + +import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.mapper.FieldRuleConfigMapper; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.pojo.ByteResolverParam; +import com.googlecode.aviator.AviatorEvaluator; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; +//转换规则 +@Component("convert") +@AllArgsConstructor +@Slf4j +public class ByteRuleResolver implements ByteResolver { + + private final FieldRuleConfigMapper fieldRuleConfigMapper; + + @Override + public Object resolveOperationRule(ByteResolverParam byteResolverParam){ + FieldRuleConfig fieldRuleEngine=fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); + if(ObjectUtil.isEmpty(fieldRuleEngine)){ + return byteResolverParam.getValue(); + } + String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); + Map env2 = new HashMap(); + env2.put("value", (byte) byteResolverParam.getValue()); + String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); + return values; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java index 103821c..786b71c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java @@ -2,34 +2,34 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("logicalShift") +@Component("logicalShift") @AllArgsConstructor @Slf4j public class LogicalShiftResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //字节位移 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { Integer index = byteResolverParam.getIndex(); - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return byteResolverParam.getValue(); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java index 476747d..01149bd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("operation") +@Component("operation") @AllArgsConstructor @Slf4j public class OperationResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //混合运算,有常量或者乘除的缩放 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java index 0b82cf4..79abcce 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.casic.missiles.pojo.ByteResolverParam; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; //精度计算 -@Service("precision") +@Component("precision") @AllArgsConstructor @Slf4j public class PrecisionResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java deleted file mode 100644 index 5c3f332..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; -//转换规则 -@Service("convert") -@AllArgsConstructor -@Slf4j -public class RuleResolver implements ByteResolver { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam){ - RuleEvaluator fieldRuleEngine=fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); - if(ObjectUtil.isEmpty(fieldRuleEngine)){ - return byteResolverParam.getValue(); - } - String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); - Map env2 = new HashMap(); - env2.put("value", (byte) byteResolverParam.getValue()); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java new file mode 100644 index 0000000..d3bbd91 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java @@ -0,0 +1,15 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; + +import java.util.List; +import java.util.Map; +// 前导码匹配->长度字段 +public interface AbstractCombinedFieldProcessor { + + Map invoke(Map map, ByteBuf byteBuf, List combinedFieldConfigList, + Map fieldConfigsMap, Map storeObjectMap); + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java new file mode 100644 index 0000000..03c8480 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java @@ -0,0 +1,59 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-13 + */ +//依次递增进行数据的解析, +public class GenericCombinedFieldResolver { + + + //通过查询,字段长度长度随机 + public void parseDataField(List combinedFieldConfigList, ByteBuf byteBuf, + Map storeObjectMap, Map fieldConfigsMap) { + Integer frameLength = Integer.valueOf(ByteBufUtil.hexDump(byteBuf)); + //添加前置处理器 + com.casic.missiles.util.ClassUtil classUtil = new com.casic.missiles.util.ClassUtil(); + List abstractCombinedProcessors = classUtil.getSubClassList(AbstractCombinedFieldProcessor.class); + + Map fieldFixedMap = combinedFieldLeadCodeMap(combinedFieldConfigList); + //frameLength + Map combinedProcessorFields = null; + while (byteBuf.readableBytes() < frameLength) { + //一直处理 + for (AbstractCombinedFieldProcessor abstractCombinedProcessor : abstractCombinedProcessors) { + combinedProcessorFields = abstractCombinedProcessor.invoke(combinedProcessorFields, byteBuf, + combinedFieldConfigList, + fieldConfigsMap, storeObjectMap); + if (combinedProcessorFields == null || byteBuf.readableBytes() < frameLength) { + return; + } + } + + } + } + + /** + * 取出前导码匹配集合 + */ + private Map combinedFieldLeadCodeMap(List combinedFieldConfigList) { + Map fieldFixedMap = combinedFieldConfigList + .stream() + .collect(Collectors.toMap(CombinedFieldConfig::getPrefixCode, e -> e)); + return fieldFixedMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java new file mode 100644 index 0000000..643a934 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java @@ -0,0 +1,100 @@ +package com.casic.missiles.parser.resolver.fields; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.FieldParserSupport; +import com.casic.missiles.pojo.*; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 保存使用时最基本的信息,并且使用原型模式 + */ +@Slf4j +public class DefaultProtocolFieldParser extends FieldParserSupport implements FieldParser, FixedPropertyEnum { + + //通过传入的配置和报文进行字段解析 + @Override + public Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap) { + Map dataMap = new HashMap<>(); + for (AbstractFieldConfig protocolFieldConfig : protocolFieldConfigs) { + if (!ObjectUtils.isEmpty(protocolFieldConfig.getOriginPositionByte())) { + Object fieldValue = FieldResolver.parseField(buffer, protocolFieldConfig, null); + if (protocolFieldConfig.getIsStorage() == 1) { + storeObjectMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + dataMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + } + return dataMap; + } + + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength) { + Map fixedPropertyMap = new HashMap<>(); + Integer fixedLength = calculateLength(protocolFieldConfigs); + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + fixedPropertyMap.put(FIXED_POSITION, maxFixedPosition); + fixedPropertyMap.put(TOTAL_LENGTH, totalLength); + fixedPropertyMap.put(TAIL_POSITION, totalLength - fixedLength + maxFixedPosition); + return fixedPropertyMap; + } + + //** 获取业务内容的byteBuf + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer) { + //计算固定长度 + Integer fixedLength = calculateLength(protocolFieldConfigs); + //总长度获取 + String lightText = buffer.toString(Charset.forName("ISO-8859-1")); + Integer totalLength = lightText.length(); + //计算固定长度最大长度 + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + //计算数据报文内容 + ByteBuf bizDataFields = buffer.slice(maxFixedPosition - 1, (totalLength - fixedLength)); + return bizDataFields; + } + + /** + * 获取过滤字段的长度 + */ + @Override + public Integer getTotalFilterLength(ProtocolConfig protocolConfig, + ByteBuf byteBuf, + Map protocolFieldConfigMap) { + if (ByteBufUtil.hexDump(byteBuf).equals("")) { + return 0; + } + int totalFilterLength = 0; + String filterFields = protocolConfig.getTotalLengthFilterFields(); + try { + if (!StringUtils.isEmpty(filterFields)) { + String[] filterFieldList = filterFields.split(","); + for (String filterFieldId : filterFieldList) { + if (StringUtils.isNotEmpty(filterFieldId)) { + ProtocolFieldConfig fieldConfig = protocolFieldConfigMap.get(Long.valueOf(filterFieldId)); + //这里都是按字节计算,没有对位进行区分,可能会出现错误 + // 如果对位有需求,需要进一步跟进 + totalFilterLength += fieldConfig.getOffsetLength(); + } + } + } + return totalFilterLength; + } catch (Exception ex) { + log.error("报文确认分发阶段,获取报文总长度过滤长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); + } + return totalFilterLength; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java new file mode 100644 index 0000000..d51e887 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java @@ -0,0 +1,169 @@ +package com.casic.missiles.parser.resolver.fields; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.parser.resolver.ByteMergeProvider; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.AbstractFieldConfig; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.pojo.ByteResolverParam; +import io.netty.buffer.ByteBuf; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * 字段解析管理总类 + */ +@Slf4j +public class FieldResolver extends ByteMergeProvider { + + //1、字段截取 => 2、简单的字节解析和复杂的字节解析 + public static Object parseField(ByteBuf byteBuf,AbstractFieldConfig fieldConfig, Integer maxFixedPosition) { + Integer orignPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + //最大固定位置不为空, + if (!ObjectUtil.isEmpty(maxFixedPosition)) { + orignPosition -= maxFixedPosition; + } + Object fieldValue = 0; + //待优化 + if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { + fieldValue = doParseBitField(byteBuf, fieldConfig); + } else { + ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); + fieldValue = doParseByteField(fieldBytes, fieldConfig.getRuleJson()); + } + return fieldValue; + } + + //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, + //目前默认配置的规则设置暂不支持配置化,由实现完成 + private static Object doParseByteField(ByteBuf byteBuf, String ruleJson) { + Object fieldsResolveValue = null; + List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); + if (ObjectUtil.isEmpty(ruleMapList)) { + fieldsResolveValue = defaultResolveBuilder(byteBuf); + } else { + fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); + } + return fieldsResolveValue; + } + + private static Object defaultResolveBuilder(ByteBuf byteBuf) { + Integer defaultResolveValue = 0; + for (int i = 0; i < byteBuf.writerIndex(); i++) { + defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; + } + return defaultResolveValue; + } + + //字段解析构建器(针对字节单位的) + //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 + // 字节归并结束或者规则结束=>继续根据规则进行判断 + private static Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { + Object customizeResolveValue = null; + try { + List bytStrList = new ArrayList<>(); + //存放到数组里面 + for (int i = 0; i < byteBuf.writerIndex(); i++) { + bytStrList.add(byteBuf.readByte()); + } + int i = 0; + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { + if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + customizeResolveValue = resolveByteMerge(bytStrList, ruletypeId, vaildRange); + break; + } else { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + List tempBytStr = new ArrayList<>(); + for (int k = 0; i < bytStrList.size(); i++) { + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(k) + .value(bytStrList.get(k)) + .ruletypeId(ruletypeId).build(); + tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); + } + bytStrList = tempBytStr; + } + i++; + } + //字节归并到一起=>继续根据规则进行判断 + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(null) + .value(customizeResolveValue) + .ruletypeId(ruletypeId).build(); + customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); + i++; + } + System.out.println(JSON.toJSON(customizeResolveValue)); + return customizeResolveValue; + } catch (RuntimeException ex) { + log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); + return null; + } + } + + /** + * 1、单个字节情况表示字段 + * 2、多字节情况表示字段(暂未处理) + */ + private static Object doParseBitField(ByteBuf byteBuf,AbstractFieldConfig fieldConfig) { + Object fieldValue = new Object(); + try { + Integer orignPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + byte fields = 0x00; + if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { + fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); + } else { + fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); + } + + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { + if (!StringUtils.isEmpty(fieldConfig.getOriginPositionBit())) { + fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getOriginPositionBit())).byteValue() + >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); + } else { + fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); + } + } else { + fieldValue = Integer.valueOf(fields & 0xff); + } + if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { + return fieldValue; + } + List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); + int i = 0; + //字节归并到一起=>继续根据规则进行判断 + while (i < ruleMapList.size()) { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(null) + .value(fieldValue) + .ruletypeId(ruletypeId).build(); + fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); + i++; + } + System.out.println(JSON.toJSON(fieldValue)); + return fieldValue; + } catch (RuntimeException ex) { + log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); + return null; + } + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java deleted file mode 100644 index 35ae3d0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java +++ /dev/null @@ -1,183 +0,0 @@ -package com.casic.missiles.parser.resolver.fields; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufAllocator; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; -import org.springframework.util.ObjectUtils; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service("standard") -@AllArgsConstructor -@Slf4j -public class StandardFieldParser implements FieldParser { - - private final FieldConfigDao fieldConfigDao; - private final FieldResolver fieldResolver; - - //数据解析 - @Override - public Map dataParser(RuleConfig ruleConfig, String lightText, String protocolId) { - String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); - ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); - bufferContent.writeBytes(lightText.getBytes(Charset.forName("ISO-8859-1"))); - Map dataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - for (String dataFieldId : dataFieldIds) { - FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(dataFieldId); - if (!ObjectUtils.isEmpty(fieldConfig)) { - dataMap.put(fieldConfig.getFieldName(), String.valueOf(fieldResolver.filedParserManger(bufferContent, fieldConfig, maxFixedPosition))); - } - } - return dataMap; - } - - //数据解析 - @Override - public Map fixDataParser(String protocolId, ByteBuf buffer) { - List dataFieldIdList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Map dataMap = new HashMap<>(); - for (FieldConfig dataField : dataFieldIdList) { - if (!ObjectUtils.isEmpty(dataField.getOrignPosition())) { - Object fieldValue = (Integer) fieldResolver.filedParserManger(buffer, dataField, null); - dataMap.put(dataField.getFieldName(), fieldValue); - } - } - return dataMap; - } - - @Override - public Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf) { - if (ByteBufUtil.hexDump(byteBuf).equals("")) { - return 0; - } - String filterFields = protocolConfig.getTotalLengthFilterField(); - Integer totalLength = 0; - try { - FieldConfig totalFieldConfig = fieldConfigDao.getFieldConfigById(protocolConfig.getTotalLengthId()); - int totalFilterLength = 0; - if (!StringUtils.isEmpty(filterFields)) { - String[] filterFieldList = filterFields.split(","); - for (String filterField : filterFieldList) { - FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(filterField); - //这里都是按字节计算,没有对位进行区分,可能会出现错误 - - // 如果对位有需求,需要进一步跟进 - totalFilterLength += fieldConfig.getOffsetLength(); - } - } - totalLength = (Integer) fieldResolver.filedParserManger(byteBuf, totalFieldConfig, null) + totalFilterLength; - } catch (Exception ex) { - log.error("报文确认分发阶段,获取报文总长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); - } - return totalLength; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer) { - //业务内容 - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - String protocolId = String.valueOf(protocolConfig.getId()); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - //计算固定长度 - Integer fixedLength = calculateLength(fieldConfigList); -// Integer totalLength = this.getTotalLength(protocolConfig, buffer); - //总长度获取 - Integer totalLength = lightText.length(); - //计算固定长度最大长度 - Integer maxFixedPosition = calculatePosition(fieldConfigList); -// buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - //计算数据报文内容 - ByteBuf bizDataFields = buffer.slice(maxFixedPosition-1, (totalLength - fixedLength)); - return bizDataFields; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer) { - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - String protocolId = String.valueOf(protocolConfig.getId()); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer fixedLength = calculateLength(fieldConfigList); -// Integer totalLength = this.getTotalLength(protocolConfig, buffer); - Integer totalLength = lightText.length(); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - ByteBuf fixDataFields = buffer.slice(0, maxFixedPosition); - return fixDataFields; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer) { - String protocolId = String.valueOf(protocolConfig.getId()); - Map fixedPropertyMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer fixedLength = calculateLength(fieldConfigList); - Integer totalLength = this.getTotalLength(protocolConfig, buffer); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - fixedPropertyMap.put("fixedPosition", maxFixedPosition); - fixedPropertyMap.put("totalLength", totalLength); - fixedPropertyMap.put("tailPosition", totalLength - fixedLength + maxFixedPosition); - return fixedPropertyMap; - } - - //分别计算bit和byte长度=> 合并长度 - private Integer calculateLength(List fieldConfigList) { - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (FieldConfig fieldConfig : fieldConfigList) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - Integer fixedLength = bytefixedLength + bitfixedLength / 8; - return fixedLength; - } - - //找到最大值=> 根据最大值计算业务数据下标 - private Integer calculatePosition(List fieldConfigList) { - String rex = "[0-9]+"; - Integer max = -1; - for (FieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOrignPosition()) - && Integer.valueOf(fieldConfig.getOrignPosition()) > max) { - max = Integer.valueOf(fieldConfig.getOrignPosition()); - } - } - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (FieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOrignPosition()) && fieldConfig.getOrignPosition().equals(max)) { - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - } - } - Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; - return maxFixedPosition; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java new file mode 100644 index 0000000..d4ec6c7 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java @@ -0,0 +1,76 @@ +package com.casic.missiles.parser.rule; + +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import org.apache.commons.lang3.StringUtils; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class GenericRuleResolver { + + //根据前置字段的值,找到指定的规则 + //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 + //=>循环判断=>通过规则得到业务字段 + public static RuleConfig machRule(Map fixDataMap, + String ids, + List protocolFieldConfigs, + List ruleConfigs) { + List preRuleConfigList = getPreRuleList(ids, protocolFieldConfigs); + //获取前置规则字段 + final Map metaDataMap = getPreRuleFields(preRuleConfigList, fixDataMap); + //准备固定的字段集合 + Map fixDataFieldMap = getFixDataFieldMap(protocolFieldConfigs); + return RuleResolverCore.doMachRule(ruleConfigs, metaDataMap, fixDataMap, fixDataFieldMap); + } + + private static Map getFixDataFieldMap(List protocolFieldConfigs) { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, ProtocolFieldConfig::getFieldName) + ); + return fixDataFieldMap; + } + + + /** + * 查询前置规则的字段配置 + * + * @param ids + * @return + */ + private static List getPreRuleList(String ids, List protocolFieldConfigs) { + String[] idList = ids.split(","); + Map prepareMaps = new HashMap<>(); + for (String id : idList) { + if (StringUtils.isNotEmpty(id)) { + prepareMaps.put(Long.valueOf(id), ""); + } + } + List preRuleConfigList = protocolFieldConfigs + .stream() + .filter(e -> prepareMaps.containsKey(e.getId())) + .collect(Collectors.toList()); + return preRuleConfigList; + } + + /** + * 获取前置规则解析字段 + */ + private static Map getPreRuleFields(List preRuleFieldConfigList, Map fixDataMap) { + Map ruleFieldMap = new HashMap<>(); + preRuleFieldConfigList.stream() + .forEach( + preRuleFieldConfig -> { + String fieldName = preRuleFieldConfig.getFieldName(); + if (fixDataMap.containsKey(fieldName)) { + ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); + } + } + ); + return ruleFieldMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java new file mode 100644 index 0000000..baae7e8 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -0,0 +1,68 @@ +package com.casic.missiles.parser.rule; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.casic.missiles.pojo.RuleConfig; + +import java.util.*; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleResolverCore { + + + public static RuleConfig doMachRule(List ruleConfigList, Map metaDataMap, + Map fixDataMap, + Map fixDataFieldMap) { + Optional ruleConfigOptional = ruleConfigList.stream() + .filter(ruleConfig -> machRuleConfig( + JSON.parseObject(ruleConfig.getMatchRuleJson(), Map.class), metaDataMap)) + .findFirst(); + if (ObjectUtil.isEmpty(ruleConfigOptional)) { + return null; + } + String[] ruleFields = ruleConfigOptional.get().getDataFieldIds().split(","); + Map ruleMetaDataMap = getRuleFields(ruleFields, fixDataMap, fixDataFieldMap); + //递归选定解析规则,进行规则解析 + if (!ruleConfigOptional.get().getIsFinishMatch().equals("1")) { + //递归选定规则 + doMachRule(ruleConfigList, ruleMetaDataMap, fixDataMap, fixDataFieldMap); + } + return ruleConfigOptional.get(); + } + + + private static Map getRuleFields(String[] preRuleConfigList, Map fixedDataMap, + Map fixedFieldMap) { + Map ruleFieldMap = new HashMap<>(); + for (String preRuleConfigId : preRuleConfigList) { + String fieldName = fixedFieldMap.get(preRuleConfigId); + if (fixedDataMap.containsKey(fieldName)) { + ruleFieldMap.put(fieldName, String.valueOf(fixedDataMap.get(fieldName))); + } + } + return ruleFieldMap; + } + + + //匹配规则配置 + private static Boolean machRuleConfig(Map ruleMap, Map metaDataMap) { + if (ruleMap == null || metaDataMap == null) { + return null; + } + //所有的字段在规则里面必须有有配置 + for (String key : metaDataMap.keySet()) { + if (ruleMap.containsKey(key)) { + if (!ruleMap.get(key).equals(metaDataMap.get(key))) { + return false; + } + } else { + return false; + } + } + return true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java index 608af3a..32cc8a4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java @@ -2,48 +2,47 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.delivery.decorator.ByteDecorator; +import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @AllArgsConstructor public class FieldDecoratorManger { - private final RuleDictDao ruleDictDao; + private final RuleConfigRegistry ruleDictDao; // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 // (1)静态的业务字段是字典里面可以配置的 // (2)动态的业务字段是通过规则生成的 public String contentMerge(String ruleJson, String sceneConent, String dynamicContent) { - List ruleDictList = ruleDictDao.getRuleDictConfig(); - Map ruleDictMap = ruleDictList.stream().collect( - Collectors.toMap(RuleDict::getId, e -> e)); - List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); - for (Map ruleMap : ruleMapList) { - String ruleType = String.valueOf(ruleMap.get("ruleType")); - ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); - NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); - byteDecorator.nodeDecoratorRule(nodeDecoratorParm); - } +// List ruleDictList = ruleDictDao.getRuleDictConfig(); +// Map ruleDictMap = ruleDictList.stream().collect( +// Collectors.toMap(RuleDict::getId, e -> e)); +// List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); +// for (Map ruleMap : ruleMapList) { +// String ruleType = String.valueOf(ruleMap.get("ruleType")); +// ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); +// NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); +// byteDecorator.nodeDecoratorRule(nodeDecoratorParm); +// } return null; } - - private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { - NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() - .contents(sceneConent) - .dynamicContent(dynamicContent) - .ruletypeId(ruletypeId) - .ruleDictMap(ruleDictMap) - .build(); - return nodeDecoratorParm; - } +// +// private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { +// NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() +// .contents(sceneConent) +// .dynamicContent(dynamicContent) +// .ruletypeId(ruletypeId) +// .ruleDictMap(ruleDictMap) +// .build(); +// return nodeDecoratorParm; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java index 652970c..b204ac3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java @@ -1,56 +1,56 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@AllArgsConstructor -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", - JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Component; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Component("logicalDecorator") +//@AllArgsConstructor +//@Slf4j +//public class LogicalShiftDecorator implements ByteDecorator { +// +//// private final FieldRuleEngineMapper fieldRuleEngineMapper; +//// +//// //字节位移 +//// @Override +//// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +//// String logicalValue = ""; +//// RuleEvaluator fieldRuleEngine = new RuleEvaluator(); +//// try { +//// Map env2 = new HashMap(); +//// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +//// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +//// for (String contentId : contentIdList) { +//// RuleDict ruleDict = ruleDictMap.get(contentId); +//// if (ruleDict.getCode().contains("#")) { +//// //使用动态的值 +//// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +//// } +//// env2.put(ruleDict.getName(), ruleDict.getCode()); +//// } +//// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +//// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +//// return null; +//// } +//// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +//// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +//// return values; +//// } catch (Exception ex) { +//// log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", +//// JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +//// return null; +//// } +//// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java index 346468f..822fead 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@AllArgsConstructor -@Slf4j -public class OperationDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("optionDecorator") +//@AllArgsConstructor +//@Slf4j +//public class OperationDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //混合运算,有常量或者乘除的缩放 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java index 50fb0a7..7a8bccb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@AllArgsConstructor -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +////精度计算 +//@AllArgsConstructor +//@Registry("precisionDecorator") +//@Slf4j +//public class PrecisionDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java index da39235..27f9cc7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java @@ -1,54 +1,53 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@AllArgsConstructor -@Slf4j -public class RuleDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("ruleDecorator") +//@AllArgsConstructor +//@Slf4j +//public class RuleDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //吃我一套正则表达式 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (Exception ex) { +// log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java index 7f5cbf3..c043f97 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java @@ -2,6 +2,6 @@ import java.util.Map; -public interface ComandeEventService { +public interface ComandeEventService{ Map loadComandeEventConfig(String protocolId,String scene); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java index 476ad84..aaf1837 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java @@ -2,46 +2,46 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.dao.CommandEventDao; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @Slf4j @AllArgsConstructor -public class ComandeEventServiceImpl implements ComandeEventService { +public class ComandeEventServiceImpl implements ComandeEventRegistry { - private final CommandEventDao commandEventDao; + // private final CommandEventDao commandEventDao; // 加密bean 固定字段出现变化的字段解析,业务字段的有序内容 @Override - public Map loadComandeEventConfig(String protocolId,String sceneName) { - CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); - if (ObjectUtil.isEmpty(commandEventConfig)) { - log.error("协议{},没有配置成功接收回复配置,清排查原因"); - return null; - } - String replyJson = commandEventConfig.getReplyContentJson(); - List> replyMapList = JSONArray.parseObject(replyJson, List.class); - List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); - Map fixMap = fixList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); - List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) - .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) - .collect(Collectors.toList()); - Map commandConfigMap = new HashMap<>(); - commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); - commandConfigMap.put("fixContent", fixMap); - commandConfigMap.put("bizContent", contentList); - return commandConfigMap; + public Map loadComandeEventConfig(String protocolId, String sceneName) { +// CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); +// if (ObjectUtil.isEmpty(commandEventConfig)) { +// log.error("协议{},没有配置成功接收回复配置,清排查原因"); +// return null; +// } +// String replyJson = commandEventConfig.getReplyContentJson(); +// List> replyMapList = JSONArray.parseObject(replyJson, List.class); +// List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); +// Map fixMap = fixList.stream() +// .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); +// List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) +// .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) +// .collect(Collectors.toList()); +// Map commandConfigMap = new HashMap<>(); +// commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); +// commandConfigMap.put("fixContent", fixMap); +// commandConfigMap.put("bizContent", contentList); +// return commandConfigMap; + return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 128b09d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java deleted file mode 100644 index 4016b0b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface DatagramEventMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java deleted file mode 100644 index 597c306..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.apache.ibatis.annotations.Mapper; - -public interface FieldConfigMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java deleted file mode 100644 index a31680a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.PreRuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface PreRuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java deleted file mode 100644 index 9060a69..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface ProtocolConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java deleted file mode 100644 index 6fa6936..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java deleted file mode 100644 index 582a705..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleDict; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleDictMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java deleted file mode 100644 index 6e302c8..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.CommandEventMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Optional; - -@Component -public class CommandEventDao { - - @Resource - private CommandEventMapper commandEventMapper; - - public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId) - .eq("scene", sceneName) - .eq("enabled", 1); - List commandEventConfig = commandEventMapper.selectList(queryWrapper); - Optional optionalEventConfig = commandEventConfig.stream().findFirst(); - return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java deleted file mode 100644 index 9137e4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.FieldConfigMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class FieldConfigDao { - - @Resource - private FieldConfigMapper fieldConfigMapper; - - public FieldConfig getFieldConfigById(String fieldId) { - FieldConfig fieldConfig = fieldConfigMapper.selectById(fieldId); - return fieldConfig; - } - - public List getFieldConfigs(String protocolId,Integer isFixed) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",isFixed); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - - public List getStorageFieldConfig(String protocolId) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",1) - .eq("is_storage",1); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java deleted file mode 100644 index 67bff6b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.mapper.PreRuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class PreRuleConfigDao { - - @Resource - private PreRuleConfigMapper preRuleConfigMapper; - - public List getPreRuleList(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return preRuleConfigMapper.selectList(queryWrapper); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java deleted file mode 100644 index d69ea85..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.RuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleConfigDao { - - @Resource - private RuleConfigMapper ruleConfigMapper; - - public RuleConfig getNextRuleConfig(String ruleFields) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("parse_rule_json", ruleFields); - return ruleConfigMapper.selectOne(queryWrapper); - } - - - public List getRuleConfigById(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return ruleConfigMapper.selectList(queryWrapper); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java deleted file mode 100644 index 932c185..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.RuleDictMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleDictDao { - - @Resource - private RuleDictMapper ruleDictMapper; - - public List getRuleDictConfig() { - List ruleDictList = ruleDictMapper.selectList(null); - return ruleDictList; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java index 9f9e279..43bc4d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java @@ -10,20 +10,15 @@ import io.netty.channel.socket.nio.NioServerSocketChannel; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import javax.annotation.PreDestroy; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static cn.hutool.core.util.ClassUtil.getClasses; /** * SensorhubServer netty服务端 */ @Slf4j -@Service +@Component public class SensorhubServer { /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java index 2c79ff5..9a28c36 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java @@ -11,13 +11,13 @@ import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioSocketChannel; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClient 客户端 */ @Slf4j -@Service +@Registry public final class SensorhubClient { public static void main(String[] args) throws Exception { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java index 9774be0..477c3f7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java @@ -6,12 +6,12 @@ import io.netty.channel.socket.SocketChannel; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientChannelInitialHandler */ -@Service +@Registry public class SensorhubClientChannelInitialHandler extends ChannelInitializer { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java index 346f4b3..73560e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java @@ -5,13 +5,13 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientHandler */ @Slf4j -@Service +@Registry public class SensorhubClientHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java index 5c1c6f2..d990af5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java @@ -4,12 +4,12 @@ import com.casic.missiles.pojo.Msg; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** * SensorhubServerHandler */ -@Service +@Component public class SensorhubServerHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 67283ae..af3172c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,41 +1,37 @@ package com.casic.missiles.parser; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultProtocolConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.*; +import com.casic.missiles.registry.FieldConfigRegistry; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; -import java.nio.charset.Charset; import java.util.HashMap; import java.util.List; import java.util.Map; -@Service("genericProtocolParser") +/** + * @author + */ +@Component("genericProtocolParser") @Slf4j -@AllArgsConstructor +@RequiredArgsConstructor public class GenericProtocolParser implements ProtocolParser { - private final LeadingCodeMatcher leadingCodeMatcher; private final List frameStructDispenserList; - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorInstanceSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; // 匹配首字母前导码=> 帧结构匹配前导码=> // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 @@ -44,18 +40,19 @@ public Boolean doParseProtocol(ByteBuf byteBuf) { String protocolContent = ByteBufUtil.hexDump(byteBuf); //匹配前导码 - List preCodeConfigs = leadingCodeMatcher.matchLeadingCode(protocolContent); + List preCodeConfigs = LeadingCodeMatcher.matchFrameLeadingCode(protocolContent); //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 if (preCodeConfigs.size() == 0) { - return rematch(byteBuf,protocolContent); + return rematch(byteBuf, protocolContent); } - //暂时先取第一个 + //暂时先取第一个,提升速度,使用享元模式, 减少类的创建销毁与构建 ProtocolConfig protocolConfig = preCodeConfigs.get(0); + AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); ByteBuf wholeDatagramByte = null; //通过匹配帧结构获取完整的数据包 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, preCodeConfigs.get(0))) != null) { + if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, protocolFactory)) != null) { break; } } @@ -68,76 +65,78 @@ * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 */ - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId, wholeDatagramByte); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap, protocolId); - //选取规则对应的流程实例 - DatagramEventConfig datagramEventConfig = processorInstanceSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); + //进行规则字段解析,进行匹配规则 + RuleConfig ruleConfig = getRuleConfig(protocolFactory, wholeDatagramByte); + if (ruleConfig == null) { + return false; + } //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, wholeDatagramByte); + ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte); + //以下进行业务的规则解析,同时选定流程实例 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); + DatagramEventProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain, + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText, protocolId); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain); //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); + datagramEventProvider.storeData(bizDataMap); return true; } - private Boolean rematch(ByteBuf byteBuf,String protocolContent) { + /** + * 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 + */ + private Boolean rematch(ByteBuf byteBuf, String protocolContent) { //重置位判断 byteBuf.resetReaderIndex(); //判断重置是否前移,如果没有前移,则直接判为匹配失败 if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { return false; } else { + //递归执行 return doParseProtocol(byteBuf); } } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; + //获取匹配规则->匹配规则 + private RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + //取出其中参与逻辑provider并判空 + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); + String rulePrepareFields = protocolConfig.getRulePrepareFields(); + //固定字段 + if (StringUtils.isNotEmpty(rulePrepareFields)) { + //获取统一固定字段解析 + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + //获取该协议的字段配置,用于协议规则匹配 + List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); + //获取规则 + RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, + rulePrepareFields, protocolFieldConfigs); + return ruleConfig; + } + return null; } - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + //数据构建,获取固定字段的store和业务字段store + private Map buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + Map bizDataMap = new HashMap<>(); + Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); + Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); + bizDataMap.putAll(ruleStoreObjectMap); + bizDataMap.putAll(protocolStoreObjectMap); return bizDataMap; } - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java index 8a46e32..16ce2e5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java @@ -3,6 +3,7 @@ import io.netty.buffer.ByteBuf; public interface ProtocolParser { + Boolean doParseProtocol(ByteBuf byteBuf); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java new file mode 100644 index 0000000..f7814af --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java @@ -0,0 +1,35 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.ProtocolConfigProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.ProtocolConfig; + +/** + * 存放基本协议的的加载信息 + */ +public class AbstractProtocolConfigFactory { + private final ProtocolConfigProvider protocolConfigProvider; + private final ProtocolFieldConfigProvider protocolFieldConfigProvider; + private final RuleConfigProvider ruleConfigProvider; + + public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { + this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); + this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); + this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); + } + + public ProtocolConfigProvider getProtocolConfigProvider() { + return protocolConfigProvider; + } + + public ProtocolFieldConfigProvider getProtocolFieldConfigProvider() { + return protocolFieldConfigProvider; + } + + public RuleConfigProvider getRuleConfigProvider() { + return ruleConfigProvider; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java new file mode 100644 index 0000000..6e36147 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java @@ -0,0 +1,57 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.CombinedFieldConfigProvider; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.FieldConfigProvider; +import com.casic.missiles.parser.provider.FieldRuleConfigProvider; + +/** + * 存放规则相关的的的加载信息 + */ +public class AbstractRuleConfigFactory { + + /** + * 处理字节 + */ + private final FieldConfigProvider fieldConfigProvider; + /** + * 处理组合字节解析的解码器 + */ + private final CombinedFieldConfigProvider combinedFieldConfigProvider; + /** + * 处理负责字节解析的规则配置 + */ + private final FieldRuleConfigProvider fieldRuleConfigProvider; + /** + * 处理实例流程 + */ + private final DatagramEventProvider datagramEventProvider; + + + public AbstractRuleConfigFactory(Long ruleId) { + this.fieldConfigProvider = new FieldConfigProvider(ruleId); + this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); + this.fieldRuleConfigProvider = new FieldRuleConfigProvider(ruleId); + this.datagramEventProvider = new DatagramEventProvider(ruleId); + } + + public FieldConfigProvider getFieldConfigProvider() { + return fieldConfigProvider; + } + + public CombinedFieldConfigProvider getCombinedFieldConfigProvider() { + return combinedFieldConfigProvider; + } + + public FieldRuleConfigProvider getFieldRuleConfigProvider() { + return fieldRuleConfigProvider; + } + + public DatagramEventProvider getDatagramEventProvider() { + return datagramEventProvider; + } + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java deleted file mode 100644 index 6e1719a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.factory; - - -import com.casic.missiles.pojo.ProtocolConfig; - -import java.util.List; - -/** - * 数据库访问优化(暂时未做) - *

- * 1、初始化协议解析配置,并存放到处存放缓存,对协议基本配置进行管理 - * 2、其中流程中所有的配置都经过此类进行管理,进行调用获取,增强解析速度 - */ -public interface DatagramFactory { - - /** - * 初始化 - */ - List datagramInit(); - - /** - * 根据前导码配置匹配,模糊匹配获取所有的报文项 - */ - List match(); - - /** - * 根据前导码匹配,返回报文项 - */ - List filer(); - - /** - * 保证数据的唯一性选择器 - */ - List selectOne(); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java new file mode 100644 index 0000000..87444a0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java @@ -0,0 +1,18 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +import java.util.List; + +/** + * 直接用,还是边用边创建 + */ +public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { + + + public DefaultProtocolConfigFactory(ProtocolConfig protocolConfig) { + super(protocolConfig); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java new file mode 100644 index 0000000..cce0c7c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java @@ -0,0 +1,12 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; + +public class DefaultRuleFactory extends AbstractRuleConfigFactory { + + public DefaultRuleFactory(Long ruleId) { + super(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java deleted file mode 100644 index 9ee97e0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.casic.missiles.parser.instance; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service -@Slf4j -@AllArgsConstructor -public class GeneralProcessor { - - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; - - /** - * 统一固定字段解析=>进行规则的查询的判断 - * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 - * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 - */ - @Deprecated - public boolean parseWholeDatagram(ByteBuf buffer, ProtocolConfig protocolConfig) { - try { - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap,protocolId); - //选取规则对应的流程= - DatagramEventConfig datagramEventConfig = processorSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); - //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); - //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); - //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); - //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); - //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); - return true; - } catch (Exception ex) { - log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", - ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); - return false; - } - } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; - } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); - } - - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); - return bizDataMap; - } - - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java index 25e7ad8..6a5777e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java @@ -1,23 +1,31 @@ package com.casic.missiles.parser.instance.impl; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.mapper.DatagramEventMapper; import com.casic.missiles.pojo.DatagramEventConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.SpringContextUtil; -@Service -@AllArgsConstructor +import java.util.List; +import java.util.Optional; + +/** + * @author cz + * + */ public class DefaultProcessorInstanceSelector implements ProcessorInstanceSelector { - private final DatagramEventMapper datagramEventMapper; + private static List datagramEventConfigs; + + static { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + datagramEventConfigs = datagramEventRegistry.getDatagramEventList(); + } @Override public DatagramEventConfig getProcessorInstance(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("rule_id", protocolId); - return datagramEventMapper.selectOne(queryWrapper); + Optional optionalSelectInstance = datagramEventConfigs.stream() + .filter(e -> e.getId().equals(protocolId)).limit(1).findFirst(); + return optionalSelectInstance.isPresent() ? optionalSelectInstance.get() : null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a778671..7b56a43 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,16 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import io.netty.buffer.ByteBuf; /** - * 分析匹配情况 - * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 - * 2、匹配不成功,有后续帧,可以进行下次匹配。 - * 3、匹配不成功,无后续帧,可以进行丢弃。 + * 分析匹配情况 + * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 + * 2、匹配不成功,有后续帧,可以进行下次匹配。 + * 3、匹配不成功,无后续帧,可以进行丢弃。 */ -public interface FrameStructMatcher{ +public interface FrameStructMatcher { - ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig); + ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 05320ab..8ebea78 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,23 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.ProtocolConfigMapper; +import com.casic.missiles.parser.provider.ProtocolConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Component; import java.util.List; import java.util.stream.Collectors; -@Component -@AllArgsConstructor public class LeadingCodeMatcher { - private final ProtocolConfigMapper protocolMapper; - //** 1、首字母匹配前导码, // 2、以匹配出的前导码是否在报文中条件进行前导码的匹配二次筛选 - public List matchLeadingCode(String protocolContent){ + public static List matchFrameLeadingCode(String protocolContent){ List initialConfigs = initialMatch(protocolContent); List preCodeConfigs = initialConfigs.stream() .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) @@ -26,13 +19,16 @@ } //初始化匹配前导码内容 - private List initialMatch(String protocolContent) { - String protocolStr = protocolContent.charAt(0) + ""; - QueryWrapper queryWrapper = new QueryWrapper() - .likeRight("pre_fix", protocolStr); - List protocolConfigList = protocolMapper.selectList(queryWrapper); - return protocolConfigList; + private static List initialMatch(String protocolContent) { + String firstFrameChar = protocolContent.charAt(0) + ""; + ProtocolConfigProvider protocolConfigProvider=new ProtocolConfigProvider(firstFrameChar); + return protocolConfigProvider.getMatchList(); } + + + + + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index cf2113d..e915877 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -1,32 +1,35 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(0) -@Service +@Component public class FrameLengthMatcher implements FrameStructMatcher { - @Autowired - private FieldParser fieldParser; - //超过长度 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { String dataGramContent = ByteBufUtil.hexDump(byteBuf); - if (StringUtils.isEmpty(protocolConfig.getUnpackId()) && StringUtils.isEmpty(protocolConfig.getTailStr())) { - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + //当不存在结尾标志和拆包标志,可以直接使用长度进行匹配 + if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { if (dataGramContent.length() >= totalLength) {//等于长度返回true,超出长度,切断 - ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, protocolConfig, totalLength); + ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, totalLength); return wholeDatagramByte; } else { //读的标志位前移舍弃 @@ -38,7 +41,7 @@ return null; } - private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, Integer totalLength) { byteBuf.readBytes(totalLength); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, totalLength - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 2bfc213..d527ad0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; @@ -13,7 +13,7 @@ import lombok.AllArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.nio.charset.Charset; import java.util.Map; @@ -22,32 +22,30 @@ * 后续标志验证 */ @Order(1) -@Service +@Component @AllArgsConstructor -public class FrameMarkMatcher implements FrameStructMatcher { - - private final FieldConfigDao fieldConfigDao; - private final FieldParser fieldParser; - private final FieldResolver fieldResolverManger; +public class FrameMarkMatcher implements FrameStructMatcher, FixedPropertyEnum { //帧后续标志=>结束,进行帧的重组=>有后续,1、帧移位判别 2、继续接收帧 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig UnpackConfig = StringUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getUnpackId()); - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); - Integer upback = 0; + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); ByteBuf mergeWholeFrameByte = null; - if (!ObjectUtil.isEmpty(UnpackConfig)) { - while (hasNextFullFrame(byteBuf, protocolConfig)) { - upback = (Integer) fieldResolverManger.filedParserManger(byteBuf, UnpackConfig, null); + if (!ObjectUtil.isEmpty(unpackFlag)) { + while (hasNextFullFrame(byteBuf, protocolConfig, protocolFieldConfigProvider)) { //是否存在后续位 - if (upback == 1) {//使用esayRule + if (unpackFlag == 1) {//使用esayRule //表示可以截取 - mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolConfig, totalLength); + mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolFieldConfigProvider, protocolConfig); return mergeWholeFrameByte; } else { - byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig)); + byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig, protocolFieldConfigProvider)); } } } @@ -56,7 +54,8 @@ //选取第一个帧,将业务内容和后面部分分开 //计算数据报文-业务内容 - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolFieldConfigProvider protocolFieldConfigProvider, ProtocolConfig protocolConfig) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); //截取完整报文 byteBuf.readBytes(totalLength); ByteBuf byteBufContent = byteBuf.slice(0, byteBuf.readerIndex()); @@ -68,15 +67,15 @@ String tail = ""; System.out.println(ByteBufUtil.hexDump(byteBufContent)); //会存在多个帧拼接在一起的的情况,进行合并处理 - while (hasNextFullFrame(byteBufContent, protocolConfig)) { - Integer currentFrameLength = fieldParser.getTotalLength(protocolConfig, byteBufContent); + while (hasNextFullFrame(byteBufContent, protocolConfig, protocolFieldConfigProvider)) { + Integer currentFrameLength = protocolFieldConfigProvider.getTotalLength(byteBufContent, protocolConfig); byteBufContent.readBytes(currentFrameLength); ByteBuf currentbyteBuf = byteBufContent.slice(0, byteBufContent.readerIndex()); byteBufContent.markReaderIndex();//读的标志位前移 System.out.println(ByteBufUtil.hexDump(byteBufContent)); String hexDump = currentbyteBuf.toString(Charset.forName("ISO-8859-1")); //获取当前固定帧结构的关系map - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, currentbyteBuf); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(currentbyteBuf, protocolConfig); if (StringUtils.isEmpty(mergeFrameStr)) { //首次获取业务数据报文 mergeFrameStr += hexDump.substring(0, currentFrameFixedProperty.get("tailPosition")); @@ -95,22 +94,22 @@ /** * 获取平移到下一帧起始位置 */ - public int getNextFrameOffset(ByteBuf buffer, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, buffer); - return currentFrameFixedProperty.get("totalLength"); + public int getNextFrameOffset(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + return currentFrameFixedProperty.get(TOTAL_LENGTH); } /** * 判断是否出错进行整个帧的 */ - public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, byteBuf); + public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); //保证读取位置不在固定位置,是可变的业务内容 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("fixedPosition")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(FIXED_POSITION)) { return false; } //判断读取是否操作帧长度 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("totalLength")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(TOTAL_LENGTH)) { return false; } return true; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 76a3784..c3a1bab 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -1,50 +1,50 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.parser.instance.GeneralProcessor; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; +import io.netty.buffer.ByteBufUtil;; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(2) -@Service +@Component public class FrameTailMatcher implements FrameStructMatcher { - @Resource - private FieldConfigDao fieldConfigDao; - @Autowired - private GeneralProcessor generalProcessor; - //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig tailFieldConfig = StringUtils.isEmpty(protocolConfig.getTailStr()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getTailStr()); - if (!ObjectUtil.isEmpty(tailFieldConfig)) { - String tailStr = tailFieldConfig.getFieldName(); + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfig protocolFieldConfig = ObjectUtils.isEmpty(protocolConfig.getTailStr()) ? null : + fieldConfigProvider.getFieldConfigById(protocolConfig.getTailStr()); + if (!ObjectUtil.isEmpty(protocolFieldConfig)) { + String tailStr = protocolFieldConfig.getFieldName(); String dataGramContent = ByteBufUtil.hexDump(byteBuf); Boolean tailFlag = ByteBufUtil.hexDump(byteBuf).contains(tailStr); if (!tailFlag) { //使用esayRule return null; } else if (dataGramContent.indexOf(tailStr) < dataGramContent.length() - tailStr.length()) { Integer length = dataGramContent.indexOf(tailStr) + tailStr.length(); - ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, protocolConfig, length); + ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, length); return wholeDatagramByte; //存在粘包 } } return null; } - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer length) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, Integer length) { byteBuf.readBytes(length); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, length - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java new file mode 100644 index 0000000..5f1c177 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java @@ -0,0 +1,73 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.combined.GenericCombinedFieldResolver; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.CombinedFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class CombinedFieldConfigProvider { + + + /** + * 作为临时配置列表缓存使用 + */ + private final List combinedFieldConfigList; + private Map storeObjectMap = new HashMap<>(); + + public CombinedFieldConfigProvider(Long ruleId) { + CombinedFieldConfigRegistry combinedFieldConfigRegistry = SpringContextUtil.getBean(CombinedFieldConfigRegistry.class); + combinedFieldConfigList = combinedFieldConfigRegistry.getCombinedFieldConfigList(ruleId); + } + + public void parseDataField(RuleConfig ruleConfig, String clearZeroPlain,Map fieldConfigsMap ) { + if (showSkip()) { + return; + } + //匹配对应的数据,然后进行相关的字段解析 + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver(); + combinedFieldResolver.parseDataField(combinedFieldConfigList, byteBuf, storeObjectMap,fieldConfigsMap); + } + + + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getCombinedFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return combinedFieldConfigList.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public List getCombinedFieldConfigList() { + return combinedFieldConfigList; + } + + /* 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(combinedFieldConfigList) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java new file mode 100644 index 0000000..f3cfedc --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java @@ -0,0 +1,11 @@ +package com.casic.missiles.parser.provider; + +/** + * @author cz + * @date 2023-6-12 + */ +public class CommandEventProvider{ + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java new file mode 100644 index 0000000..70eec5e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java @@ -0,0 +1,77 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.safe.SafeStrategy; +import com.casic.missiles.parser.sender.DataSubscribeProvider; +import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class DatagramEventProvider { + + private final DatagramEventConfig processorInstance; + + public DatagramEventProvider(Long ruleId) { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + List datagramEventConfigList = + datagramEventRegistry.getDatagramEventList(ruleId); + processorInstance = this.getProcessorInstance(datagramEventConfigList); + } + + public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { + if (showSkip()) { + return null; + } + return datagramEventConfigList.get(0); + } + + // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 + public String getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap) { + String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? + processorInstance.getSafeBean() : + fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); + if (!StringUtils.isEmpty(safeName)) { + //需要加密 + SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); + String plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); + return clearComplementZero(plain); + } + return ByteBufUtil.hexDump(bizDataContent); + } + + //解密清零操作 + private String clearComplementZero(String plain) { + plain = plain.substring(0, plain.lastIndexOf("00")); + return plain; + } + + //数据发送,数据发送者暂未构建 + public void storeData(Map bizDataMap) { + DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); +// dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return ObjectUtils.isNotEmpty(processorInstance) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java new file mode 100644 index 0000000..7e1fe0a --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java @@ -0,0 +1,97 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.FieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class FieldConfigProvider { + + + private final List fieldConfigs; + private Map storeObjectMap = new HashMap<>(); +// private Map singleObjects = new ConcurrentHashMap<>(); + + public FieldConfigProvider(Long ruleId) { + FieldConfigRegistry fieldConfigRegistry = SpringContextUtil.getBean(FieldConfigRegistry.class); + fieldConfigs = fieldConfigRegistry.getFieldConfigList(ruleId); + } + + public List getFieldConfigs() { + return fieldConfigs; + } + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public Map parseDataField(RuleConfig ruleConfig, String clearZeroPlain) { + if (showSkip()) { + return null; + } + List prepareFieldConfig = prepareParseField(ruleConfig); + if (CollectionUtils.isNotEmpty(prepareFieldConfig)) { + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(fieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + return fixDataMap; + } + } + return null; + } + + /** + * 得到需要处理的业务内容 + * + * @return + */ + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return fieldConfigs.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public Map getFieldConfigsMap() { + return fieldConfigs.stream().collect( + Collectors.toMap(FieldConfig::getId, e -> e) + ); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(fieldConfigs) ? false : true; + } + + +} + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java new file mode 100644 index 0000000..817bfaf --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java @@ -0,0 +1,19 @@ +package com.casic.missiles.parser.provider; + +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.registry.FieldRuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; + +public class FieldRuleConfigProvider { + + private final List fieldRuleConfigList; + + public FieldRuleConfigProvider(Long ruleId) { + FieldRuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(FieldRuleConfigRegistry.class); + fieldRuleConfigList = ruleConfigRegistry.getFieldRuleConfigList(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java new file mode 100644 index 0000000..99a1b06 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java @@ -0,0 +1,53 @@ +package com.casic.missiles.parser.provider; + + +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.registry.ProtocolConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolConfigProvider { + + private final List protocolConfigList; + + public ProtocolConfigProvider(String firstChar) { + ProtocolConfigRegistry registry = SpringContextUtil.getBean(ProtocolConfigRegistry.class); + protocolConfigList = registry.getProtocolConfigList(firstChar); + } + + public List getMatchList() { + return protocolConfigList; + } + + /** + * 设置当前协议 + * + * @param protocolConfig + */ + public ProtocolConfigProvider(ProtocolConfig protocolConfig) { + List protocolConfigs = new ArrayList<>(); + protocolConfigs.add(protocolConfig); + protocolConfigList = protocolConfigs; + } + + /** + * 获取当前协议 + * + * @return + */ + public ProtocolConfig getCurrentProtocolConfig() { + if (this.protocolConfigList == null) { + return null; + } else { + return protocolConfigList.get(0); + } + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java new file mode 100644 index 0000000..043927d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java @@ -0,0 +1,213 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.registry.ProtocolFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolFieldConfigProvider { + + private static final String FIXED_FIELD_DS = "fixedFieldDs"; + private static final String CONTENT_FIELD_DS = "contentFieldDs"; + private static final String PROTOCOL_LENGTH = "protocolLength"; + private static final String PROTOCOL_FIELD_ID = "protocolFieldId"; + private static final String PROTOCOL_POSITION = "protocolPosition"; + + private final List protocolFieldConfigs; + private Map singleObjects = new ConcurrentHashMap<>(); + private Map storeObjectMap = new HashMap<>(); + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public ProtocolFieldConfigProvider(Long protocolId) { + ProtocolFieldConfigRegistry protocolFieldConfigRegistry = SpringContextUtil.getBean(ProtocolFieldConfigRegistry.class); + protocolFieldConfigs = protocolFieldConfigRegistry.getProtocolFieldConfigList(protocolId); + } + + public List getProtocolFieldConfigs() { + return protocolFieldConfigs; + } + + public ProtocolFieldConfig getFieldConfigById(Long fieldId) { + Optional optionalConfig = protocolFieldConfigs.stream().filter( + e -> e.getId().equals(fieldId) + ).findFirst(); + return optionalConfig.isPresent() ? optionalConfig.get() : null; + } + + public Integer getProtocolFieldValue(Long protocolFieldId, ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_FIELD_ID + protocolFieldId + ByteBufUtil.hexDump(byteBuf); + //获取缓存 + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + //加载固定长度数据集合 + Map fixDataMap = this.getProtocolDataMap(byteBuf); + ProtocolFieldConfig protocolFieldConfig = selectFieldConfig(protocolFieldId); + Integer protocolFieldValue = 0; + //获取约定字段的总长度 + if (fixDataMap.containsKey(protocolFieldConfig.getFieldName())) { + Object appointUnpackObject = fixDataMap.get(protocolFieldConfig.getFieldName()); + if (ObjectUtils.isNotEmpty(appointUnpackObject)) { + protocolFieldValue = (Integer) appointUnpackObject; + } + } + if (protocolFieldValue != null) { + //加入缓存 + if (ObjectUtils.isNotEmpty(protocolFieldValue)) { + this.singleObjects.put(catchKey, protocolFieldValue); + return protocolFieldValue; + } + } + return null; + } + + /** + * 获取帧固定位置信息 + * + * @param byteBuf + * @param protocolConfig + * @return + */ + public Map getFixedProperty(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_POSITION + protocolConfig.getId(); + if (this.singleObjects.containsKey(catchKey)) { + return (Map) singleObjects.get(catchKey); + } + Map fixedPropertyMap = new HashMap<>(); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + fixedPropertyMap = fieldParser.doGetFixedProperty(protocolFieldConfigs, this.getTotalLength(byteBuf,protocolConfig)); + if (CollectionUtils.isNotEmpty(fixedPropertyMap)) { + this.singleObjects.put(catchKey, fixedPropertyMap); + return fixedPropertyMap; + } + return fixedPropertyMap; + } + + /** + * 获取帧结构应有的总长度 + */ + public Integer getTotalLength(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_LENGTH + ByteBufUtil.hexDump(byteBuf); + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + Integer appointFrameLength = getProtocolFieldValue(protocolConfig.getTotalLengthId(), byteBuf); + if (appointFrameLength != null) { + //获取过滤的字段集合总长度 + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Integer totalFilterLength = fieldParser.getTotalFilterLength(protocolConfig, byteBuf, getFixFieldConfigMap()); + //计算总长度 + Integer totalLength = appointFrameLength + totalFilterLength; + //加入缓存 + if (ObjectUtils.isNotEmpty(totalLength)) { + this.singleObjects.put(catchKey, totalLength); + return totalLength; + } + } + return null; + } + + /** + * 获取协议有关字段解析内容 + * storeObjectMap存储代转存的数据 + * + * @return + */ + public Map getProtocolDataMap(ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(FIXED_FIELD_DS)) { + return (Map) singleObjects.get(FIXED_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(protocolFieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + this.singleObjects.put(FIXED_FIELD_DS, fixDataMap); + return fixDataMap; + } + return null; + } + + /** + * 获取业务报文内容的content字节 + * + * @param wholeDatagramByte + * @return + */ + public ByteBuf getDataContentBuf(ByteBuf wholeDatagramByte) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(CONTENT_FIELD_DS)) { + return (ByteBuf) singleObjects.get(CONTENT_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + ByteBuf bizDataByteBuf = fieldParser.getDataContentBuf(protocolFieldConfigs, wholeDatagramByte); + if (bizDataByteBuf != null) { + this.singleObjects.put(CONTENT_FIELD_DS, bizDataByteBuf); + return bizDataByteBuf; + } + return null; + } + + + private ProtocolFieldConfig selectFieldConfig(Long id) { + Optional optionalProtocolFieldConfig = this.protocolFieldConfigs.stream().filter( + e -> e.getId().equals(id) + ).findFirst(); + return optionalProtocolFieldConfig.isPresent() ? optionalProtocolFieldConfig.get() : null; + } + + + private Map getFixFieldConfigMap() { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, e -> e) + ); + return fixDataFieldMap; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(protocolFieldConfigs) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java new file mode 100644 index 0000000..dafba1c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java @@ -0,0 +1,56 @@ +package com.casic.missiles.parser.provider; + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.rule.GenericRuleResolver; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.RuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleConfigProvider { + + private final List ruleConfigs; + + public List getRuleConfigs() { + return ruleConfigs; + } + + public RuleConfigProvider(Long protocolId) { + RuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(RuleConfigRegistry.class); + ruleConfigs = ruleConfigRegistry.getRuleConfigById(protocolId); + } + + /** + * 获取规则匹配结果 + * + * @param parseFixedDataMap + * @param protocolFieldConfigs + * @return + */ + public RuleConfig doGetRule(Map parseFixedDataMap, + String ids, + List protocolFieldConfigs) { + if (showSkip()) { + return null; + } + RuleConfig ruleConfig = GenericRuleResolver.machRule(parseFixedDataMap, ids, protocolFieldConfigs, ruleConfigs); + return ruleConfig; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(ruleConfigs) ? false : true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java index 3c05891..856b399 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java @@ -1,18 +1,11 @@ package com.casic.missiles.parser.resolver; -import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.springframework.web.bind.annotation.RequestBody; -import javax.annotation.Resource; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -20,19 +13,17 @@ @Slf4j public class ByteMergeProvider { - @Resource - private FieldRuleEngineMapper fieldRuleEngineMapper; - //拿到所有的值合并到一个值 - public String resolveByteMerge(List valueList, String ruletypeId, String vaildRange) { + public static String resolveByteMerge(List valueList, String ruleTypeId, String vaildRange) { String values = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Map vaildMap = getValidRangeMap(vaildRange); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(ruletypeId); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } + //暂时不处理 +// fieldRuleEngine = fieldRuleConfigMapper.selectById(ruleTypeId); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } Map env2 = new HashMap(); for (int i = 0; i < valueList.size(); i++) { if (vaildMap.containsKey(i)) { @@ -47,7 +38,7 @@ } } - private Map getValidRangeMap(String vaildRange) { + private static Map getValidRangeMap(String vaildRange) { String[] range = vaildRange.split(","); Map vaildMap = new HashMap(); for (int i = 0; i < range.length; i++) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 8d821cd..85d6bbf 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -1,9 +1,12 @@ package com.casic.missiles.parser.resolver; +import com.casic.missiles.pojo.AbstractFieldConfig; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; import io.netty.buffer.ByteBuf; +import java.util.List; import java.util.Map; /** @@ -11,18 +14,14 @@ */ public interface FieldParser { -// Map fieldProcess(String protocolContent,); - Map dataParser(RuleConfig ruleConfig, String lightText,String protocolId); + Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength); - Map fixDataParser(String protocolId, ByteBuf buffer); + Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap); - Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf); + ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer); - ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer); - - ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer); - - Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer); + Integer getTotalFilterLength(ProtocolConfig protocolConfig, ByteBuf byteBuf, Map protocolFieldConfigMap); } + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java new file mode 100644 index 0000000..9e0c00e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java @@ -0,0 +1,52 @@ +package com.casic.missiles.parser.resolver; + +import com.casic.missiles.pojo.AbstractFieldConfig; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.util.List; + +public class FieldParserSupport { + + //分别计算bit和byte长度=> 合并长度 + protected Integer calculateLength(List fieldConfigList) { + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + Integer fixedLength = bytefixedLength + bitfixedLength / 8; + return fixedLength; + } + + //找到最大值=> 根据最大值计算业务数据下标 + protected Integer calculatePosition(List fieldConfigList) { + String rex = "[0-9]+"; + Integer max = -1; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) + && Integer.valueOf(fieldConfig.getOriginPositionByte()) > max) { + max = Integer.valueOf(fieldConfig.getOriginPositionByte()); + } + } + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) && fieldConfig.getOriginPositionByte().equals(max)) { + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + } + } + Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; + return maxFixedPosition; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java deleted file mode 100644 index dd3a6cd..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java +++ /dev/null @@ -1,170 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.ByteResolverParam; -import io.netty.buffer.ByteBuf; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -/** - * 字段解析管理总类 - */ -@Service -@Slf4j -@AllArgsConstructor -public class FieldResolver extends ByteMergeProvider { - - //1、字段截取 => 2、简单的字节解析和复杂的字节解析 - public Object filedParserManger(ByteBuf byteBuf, FieldConfig fieldConfig, Integer maxFixedPosition) { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - //最大固定位置不为空, - if (!ObjectUtil.isEmpty(maxFixedPosition)) { - orignPosition -= maxFixedPosition; - } - Object fieldValue = 0; - //待优化 - if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { - fieldValue = bitToResolver(byteBuf, fieldConfig); - } else { - ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); - fieldValue = parsingFields(fieldBytes, fieldConfig.getRuleJson()); - } - return fieldValue; - } - - //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, - //目前默认配置的规则设置暂不支持配置化,由实现完成 - private Object parsingFields(ByteBuf byteBuf, String ruleJson) { - Object fieldsResolveValue = null; - List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); - if (ObjectUtil.isEmpty(ruleMapList)) { - fieldsResolveValue = defaultResolveBuilder(byteBuf); - } else { - fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); - } - return fieldsResolveValue; - } - - private Object defaultResolveBuilder(ByteBuf byteBuf) { - Integer defaultResolveValue = 0; - for (int i = 0; i < byteBuf.writerIndex(); i++) { - defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; - } - return defaultResolveValue; - } - - //字段解析构建器(针对字节单位的) - //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 - // 字节归并结束或者规则结束=>继续根据规则进行判断 - private Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { - Object customizeResolveValue = null; - try { - List bytStrList = new ArrayList<>(); - //存放到数组里面 - for (int i = 0; i < byteBuf.writerIndex(); i++) { - bytStrList.add(byteBuf.readByte()); - } - int i = 0; - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - customizeResolveValue = this.resolveByteMerge(bytStrList, ruletypeId,vaildRange); - break; - } else { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - List tempBytStr = new ArrayList<>(); - for (int k = 0; i < bytStrList.size(); i++) { - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(k) - .value(bytStrList.get(k)) - .ruletypeId(ruletypeId).build(); - tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); - } - bytStrList = tempBytStr; - } - i++; - } - //字节归并到一起=>继续根据规则进行判断 - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(customizeResolveValue) - .ruletypeId(ruletypeId).build(); - customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(customizeResolveValue)); - return customizeResolveValue; - } catch (RuntimeException ex) { - log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); - return null; - } - } - - /** - * 1、单个字节情况表示字段 - * 2、多字节情况表示字段(暂未处理) - */ - private Object bitToResolver(ByteBuf byteBuf, FieldConfig fieldConfig) { - Object fieldValue = new Object(); - try { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - byte fields = 0x00; - if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); - } else { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); - } - - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { - if (!StringUtils.isEmpty(fieldConfig.getExactOrignPosition())) { - fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getExactOrignPosition())).byteValue() - >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); - } else { - fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); - } - } else { - fieldValue = Integer.valueOf(fields & 0xff); - } - if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { - return fieldValue; - } - List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); - int i = 0; - //字节归并到一起=>继续根据规则进行判断 - while (i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(fieldValue) - .ruletypeId(ruletypeId).build(); - fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(fieldValue)); - return fieldValue; - } catch (RuntimeException ex) { - log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); - return null; - } - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java new file mode 100644 index 0000000..1d2aeab --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java @@ -0,0 +1,36 @@ +package com.casic.missiles.parser.resolver.bytes; + +import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.mapper.FieldRuleConfigMapper; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.pojo.ByteResolverParam; +import com.googlecode.aviator.AviatorEvaluator; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; +//转换规则 +@Component("convert") +@AllArgsConstructor +@Slf4j +public class ByteRuleResolver implements ByteResolver { + + private final FieldRuleConfigMapper fieldRuleConfigMapper; + + @Override + public Object resolveOperationRule(ByteResolverParam byteResolverParam){ + FieldRuleConfig fieldRuleEngine=fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); + if(ObjectUtil.isEmpty(fieldRuleEngine)){ + return byteResolverParam.getValue(); + } + String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); + Map env2 = new HashMap(); + env2.put("value", (byte) byteResolverParam.getValue()); + String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); + return values; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java index 103821c..786b71c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java @@ -2,34 +2,34 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("logicalShift") +@Component("logicalShift") @AllArgsConstructor @Slf4j public class LogicalShiftResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //字节位移 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { Integer index = byteResolverParam.getIndex(); - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return byteResolverParam.getValue(); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java index 476747d..01149bd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("operation") +@Component("operation") @AllArgsConstructor @Slf4j public class OperationResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //混合运算,有常量或者乘除的缩放 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java index 0b82cf4..79abcce 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.casic.missiles.pojo.ByteResolverParam; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; //精度计算 -@Service("precision") +@Component("precision") @AllArgsConstructor @Slf4j public class PrecisionResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java deleted file mode 100644 index 5c3f332..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; -//转换规则 -@Service("convert") -@AllArgsConstructor -@Slf4j -public class RuleResolver implements ByteResolver { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam){ - RuleEvaluator fieldRuleEngine=fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); - if(ObjectUtil.isEmpty(fieldRuleEngine)){ - return byteResolverParam.getValue(); - } - String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); - Map env2 = new HashMap(); - env2.put("value", (byte) byteResolverParam.getValue()); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java new file mode 100644 index 0000000..d3bbd91 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java @@ -0,0 +1,15 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; + +import java.util.List; +import java.util.Map; +// 前导码匹配->长度字段 +public interface AbstractCombinedFieldProcessor { + + Map invoke(Map map, ByteBuf byteBuf, List combinedFieldConfigList, + Map fieldConfigsMap, Map storeObjectMap); + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java new file mode 100644 index 0000000..03c8480 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java @@ -0,0 +1,59 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-13 + */ +//依次递增进行数据的解析, +public class GenericCombinedFieldResolver { + + + //通过查询,字段长度长度随机 + public void parseDataField(List combinedFieldConfigList, ByteBuf byteBuf, + Map storeObjectMap, Map fieldConfigsMap) { + Integer frameLength = Integer.valueOf(ByteBufUtil.hexDump(byteBuf)); + //添加前置处理器 + com.casic.missiles.util.ClassUtil classUtil = new com.casic.missiles.util.ClassUtil(); + List abstractCombinedProcessors = classUtil.getSubClassList(AbstractCombinedFieldProcessor.class); + + Map fieldFixedMap = combinedFieldLeadCodeMap(combinedFieldConfigList); + //frameLength + Map combinedProcessorFields = null; + while (byteBuf.readableBytes() < frameLength) { + //一直处理 + for (AbstractCombinedFieldProcessor abstractCombinedProcessor : abstractCombinedProcessors) { + combinedProcessorFields = abstractCombinedProcessor.invoke(combinedProcessorFields, byteBuf, + combinedFieldConfigList, + fieldConfigsMap, storeObjectMap); + if (combinedProcessorFields == null || byteBuf.readableBytes() < frameLength) { + return; + } + } + + } + } + + /** + * 取出前导码匹配集合 + */ + private Map combinedFieldLeadCodeMap(List combinedFieldConfigList) { + Map fieldFixedMap = combinedFieldConfigList + .stream() + .collect(Collectors.toMap(CombinedFieldConfig::getPrefixCode, e -> e)); + return fieldFixedMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java new file mode 100644 index 0000000..643a934 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java @@ -0,0 +1,100 @@ +package com.casic.missiles.parser.resolver.fields; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.FieldParserSupport; +import com.casic.missiles.pojo.*; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 保存使用时最基本的信息,并且使用原型模式 + */ +@Slf4j +public class DefaultProtocolFieldParser extends FieldParserSupport implements FieldParser, FixedPropertyEnum { + + //通过传入的配置和报文进行字段解析 + @Override + public Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap) { + Map dataMap = new HashMap<>(); + for (AbstractFieldConfig protocolFieldConfig : protocolFieldConfigs) { + if (!ObjectUtils.isEmpty(protocolFieldConfig.getOriginPositionByte())) { + Object fieldValue = FieldResolver.parseField(buffer, protocolFieldConfig, null); + if (protocolFieldConfig.getIsStorage() == 1) { + storeObjectMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + dataMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + } + return dataMap; + } + + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength) { + Map fixedPropertyMap = new HashMap<>(); + Integer fixedLength = calculateLength(protocolFieldConfigs); + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + fixedPropertyMap.put(FIXED_POSITION, maxFixedPosition); + fixedPropertyMap.put(TOTAL_LENGTH, totalLength); + fixedPropertyMap.put(TAIL_POSITION, totalLength - fixedLength + maxFixedPosition); + return fixedPropertyMap; + } + + //** 获取业务内容的byteBuf + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer) { + //计算固定长度 + Integer fixedLength = calculateLength(protocolFieldConfigs); + //总长度获取 + String lightText = buffer.toString(Charset.forName("ISO-8859-1")); + Integer totalLength = lightText.length(); + //计算固定长度最大长度 + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + //计算数据报文内容 + ByteBuf bizDataFields = buffer.slice(maxFixedPosition - 1, (totalLength - fixedLength)); + return bizDataFields; + } + + /** + * 获取过滤字段的长度 + */ + @Override + public Integer getTotalFilterLength(ProtocolConfig protocolConfig, + ByteBuf byteBuf, + Map protocolFieldConfigMap) { + if (ByteBufUtil.hexDump(byteBuf).equals("")) { + return 0; + } + int totalFilterLength = 0; + String filterFields = protocolConfig.getTotalLengthFilterFields(); + try { + if (!StringUtils.isEmpty(filterFields)) { + String[] filterFieldList = filterFields.split(","); + for (String filterFieldId : filterFieldList) { + if (StringUtils.isNotEmpty(filterFieldId)) { + ProtocolFieldConfig fieldConfig = protocolFieldConfigMap.get(Long.valueOf(filterFieldId)); + //这里都是按字节计算,没有对位进行区分,可能会出现错误 + // 如果对位有需求,需要进一步跟进 + totalFilterLength += fieldConfig.getOffsetLength(); + } + } + } + return totalFilterLength; + } catch (Exception ex) { + log.error("报文确认分发阶段,获取报文总长度过滤长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); + } + return totalFilterLength; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java new file mode 100644 index 0000000..d51e887 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java @@ -0,0 +1,169 @@ +package com.casic.missiles.parser.resolver.fields; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.parser.resolver.ByteMergeProvider; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.AbstractFieldConfig; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.pojo.ByteResolverParam; +import io.netty.buffer.ByteBuf; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * 字段解析管理总类 + */ +@Slf4j +public class FieldResolver extends ByteMergeProvider { + + //1、字段截取 => 2、简单的字节解析和复杂的字节解析 + public static Object parseField(ByteBuf byteBuf,AbstractFieldConfig fieldConfig, Integer maxFixedPosition) { + Integer orignPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + //最大固定位置不为空, + if (!ObjectUtil.isEmpty(maxFixedPosition)) { + orignPosition -= maxFixedPosition; + } + Object fieldValue = 0; + //待优化 + if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { + fieldValue = doParseBitField(byteBuf, fieldConfig); + } else { + ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); + fieldValue = doParseByteField(fieldBytes, fieldConfig.getRuleJson()); + } + return fieldValue; + } + + //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, + //目前默认配置的规则设置暂不支持配置化,由实现完成 + private static Object doParseByteField(ByteBuf byteBuf, String ruleJson) { + Object fieldsResolveValue = null; + List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); + if (ObjectUtil.isEmpty(ruleMapList)) { + fieldsResolveValue = defaultResolveBuilder(byteBuf); + } else { + fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); + } + return fieldsResolveValue; + } + + private static Object defaultResolveBuilder(ByteBuf byteBuf) { + Integer defaultResolveValue = 0; + for (int i = 0; i < byteBuf.writerIndex(); i++) { + defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; + } + return defaultResolveValue; + } + + //字段解析构建器(针对字节单位的) + //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 + // 字节归并结束或者规则结束=>继续根据规则进行判断 + private static Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { + Object customizeResolveValue = null; + try { + List bytStrList = new ArrayList<>(); + //存放到数组里面 + for (int i = 0; i < byteBuf.writerIndex(); i++) { + bytStrList.add(byteBuf.readByte()); + } + int i = 0; + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { + if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + customizeResolveValue = resolveByteMerge(bytStrList, ruletypeId, vaildRange); + break; + } else { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + List tempBytStr = new ArrayList<>(); + for (int k = 0; i < bytStrList.size(); i++) { + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(k) + .value(bytStrList.get(k)) + .ruletypeId(ruletypeId).build(); + tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); + } + bytStrList = tempBytStr; + } + i++; + } + //字节归并到一起=>继续根据规则进行判断 + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(null) + .value(customizeResolveValue) + .ruletypeId(ruletypeId).build(); + customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); + i++; + } + System.out.println(JSON.toJSON(customizeResolveValue)); + return customizeResolveValue; + } catch (RuntimeException ex) { + log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); + return null; + } + } + + /** + * 1、单个字节情况表示字段 + * 2、多字节情况表示字段(暂未处理) + */ + private static Object doParseBitField(ByteBuf byteBuf,AbstractFieldConfig fieldConfig) { + Object fieldValue = new Object(); + try { + Integer orignPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + byte fields = 0x00; + if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { + fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); + } else { + fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); + } + + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { + if (!StringUtils.isEmpty(fieldConfig.getOriginPositionBit())) { + fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getOriginPositionBit())).byteValue() + >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); + } else { + fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); + } + } else { + fieldValue = Integer.valueOf(fields & 0xff); + } + if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { + return fieldValue; + } + List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); + int i = 0; + //字节归并到一起=>继续根据规则进行判断 + while (i < ruleMapList.size()) { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(null) + .value(fieldValue) + .ruletypeId(ruletypeId).build(); + fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); + i++; + } + System.out.println(JSON.toJSON(fieldValue)); + return fieldValue; + } catch (RuntimeException ex) { + log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); + return null; + } + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java deleted file mode 100644 index 35ae3d0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java +++ /dev/null @@ -1,183 +0,0 @@ -package com.casic.missiles.parser.resolver.fields; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufAllocator; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; -import org.springframework.util.ObjectUtils; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service("standard") -@AllArgsConstructor -@Slf4j -public class StandardFieldParser implements FieldParser { - - private final FieldConfigDao fieldConfigDao; - private final FieldResolver fieldResolver; - - //数据解析 - @Override - public Map dataParser(RuleConfig ruleConfig, String lightText, String protocolId) { - String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); - ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); - bufferContent.writeBytes(lightText.getBytes(Charset.forName("ISO-8859-1"))); - Map dataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - for (String dataFieldId : dataFieldIds) { - FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(dataFieldId); - if (!ObjectUtils.isEmpty(fieldConfig)) { - dataMap.put(fieldConfig.getFieldName(), String.valueOf(fieldResolver.filedParserManger(bufferContent, fieldConfig, maxFixedPosition))); - } - } - return dataMap; - } - - //数据解析 - @Override - public Map fixDataParser(String protocolId, ByteBuf buffer) { - List dataFieldIdList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Map dataMap = new HashMap<>(); - for (FieldConfig dataField : dataFieldIdList) { - if (!ObjectUtils.isEmpty(dataField.getOrignPosition())) { - Object fieldValue = (Integer) fieldResolver.filedParserManger(buffer, dataField, null); - dataMap.put(dataField.getFieldName(), fieldValue); - } - } - return dataMap; - } - - @Override - public Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf) { - if (ByteBufUtil.hexDump(byteBuf).equals("")) { - return 0; - } - String filterFields = protocolConfig.getTotalLengthFilterField(); - Integer totalLength = 0; - try { - FieldConfig totalFieldConfig = fieldConfigDao.getFieldConfigById(protocolConfig.getTotalLengthId()); - int totalFilterLength = 0; - if (!StringUtils.isEmpty(filterFields)) { - String[] filterFieldList = filterFields.split(","); - for (String filterField : filterFieldList) { - FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(filterField); - //这里都是按字节计算,没有对位进行区分,可能会出现错误 - - // 如果对位有需求,需要进一步跟进 - totalFilterLength += fieldConfig.getOffsetLength(); - } - } - totalLength = (Integer) fieldResolver.filedParserManger(byteBuf, totalFieldConfig, null) + totalFilterLength; - } catch (Exception ex) { - log.error("报文确认分发阶段,获取报文总长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); - } - return totalLength; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer) { - //业务内容 - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - String protocolId = String.valueOf(protocolConfig.getId()); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - //计算固定长度 - Integer fixedLength = calculateLength(fieldConfigList); -// Integer totalLength = this.getTotalLength(protocolConfig, buffer); - //总长度获取 - Integer totalLength = lightText.length(); - //计算固定长度最大长度 - Integer maxFixedPosition = calculatePosition(fieldConfigList); -// buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - //计算数据报文内容 - ByteBuf bizDataFields = buffer.slice(maxFixedPosition-1, (totalLength - fixedLength)); - return bizDataFields; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer) { - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - String protocolId = String.valueOf(protocolConfig.getId()); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer fixedLength = calculateLength(fieldConfigList); -// Integer totalLength = this.getTotalLength(protocolConfig, buffer); - Integer totalLength = lightText.length(); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - ByteBuf fixDataFields = buffer.slice(0, maxFixedPosition); - return fixDataFields; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer) { - String protocolId = String.valueOf(protocolConfig.getId()); - Map fixedPropertyMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer fixedLength = calculateLength(fieldConfigList); - Integer totalLength = this.getTotalLength(protocolConfig, buffer); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - fixedPropertyMap.put("fixedPosition", maxFixedPosition); - fixedPropertyMap.put("totalLength", totalLength); - fixedPropertyMap.put("tailPosition", totalLength - fixedLength + maxFixedPosition); - return fixedPropertyMap; - } - - //分别计算bit和byte长度=> 合并长度 - private Integer calculateLength(List fieldConfigList) { - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (FieldConfig fieldConfig : fieldConfigList) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - Integer fixedLength = bytefixedLength + bitfixedLength / 8; - return fixedLength; - } - - //找到最大值=> 根据最大值计算业务数据下标 - private Integer calculatePosition(List fieldConfigList) { - String rex = "[0-9]+"; - Integer max = -1; - for (FieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOrignPosition()) - && Integer.valueOf(fieldConfig.getOrignPosition()) > max) { - max = Integer.valueOf(fieldConfig.getOrignPosition()); - } - } - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (FieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOrignPosition()) && fieldConfig.getOrignPosition().equals(max)) { - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - } - } - Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; - return maxFixedPosition; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java new file mode 100644 index 0000000..d4ec6c7 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java @@ -0,0 +1,76 @@ +package com.casic.missiles.parser.rule; + +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import org.apache.commons.lang3.StringUtils; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class GenericRuleResolver { + + //根据前置字段的值,找到指定的规则 + //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 + //=>循环判断=>通过规则得到业务字段 + public static RuleConfig machRule(Map fixDataMap, + String ids, + List protocolFieldConfigs, + List ruleConfigs) { + List preRuleConfigList = getPreRuleList(ids, protocolFieldConfigs); + //获取前置规则字段 + final Map metaDataMap = getPreRuleFields(preRuleConfigList, fixDataMap); + //准备固定的字段集合 + Map fixDataFieldMap = getFixDataFieldMap(protocolFieldConfigs); + return RuleResolverCore.doMachRule(ruleConfigs, metaDataMap, fixDataMap, fixDataFieldMap); + } + + private static Map getFixDataFieldMap(List protocolFieldConfigs) { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, ProtocolFieldConfig::getFieldName) + ); + return fixDataFieldMap; + } + + + /** + * 查询前置规则的字段配置 + * + * @param ids + * @return + */ + private static List getPreRuleList(String ids, List protocolFieldConfigs) { + String[] idList = ids.split(","); + Map prepareMaps = new HashMap<>(); + for (String id : idList) { + if (StringUtils.isNotEmpty(id)) { + prepareMaps.put(Long.valueOf(id), ""); + } + } + List preRuleConfigList = protocolFieldConfigs + .stream() + .filter(e -> prepareMaps.containsKey(e.getId())) + .collect(Collectors.toList()); + return preRuleConfigList; + } + + /** + * 获取前置规则解析字段 + */ + private static Map getPreRuleFields(List preRuleFieldConfigList, Map fixDataMap) { + Map ruleFieldMap = new HashMap<>(); + preRuleFieldConfigList.stream() + .forEach( + preRuleFieldConfig -> { + String fieldName = preRuleFieldConfig.getFieldName(); + if (fixDataMap.containsKey(fieldName)) { + ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); + } + } + ); + return ruleFieldMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java new file mode 100644 index 0000000..baae7e8 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -0,0 +1,68 @@ +package com.casic.missiles.parser.rule; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.casic.missiles.pojo.RuleConfig; + +import java.util.*; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleResolverCore { + + + public static RuleConfig doMachRule(List ruleConfigList, Map metaDataMap, + Map fixDataMap, + Map fixDataFieldMap) { + Optional ruleConfigOptional = ruleConfigList.stream() + .filter(ruleConfig -> machRuleConfig( + JSON.parseObject(ruleConfig.getMatchRuleJson(), Map.class), metaDataMap)) + .findFirst(); + if (ObjectUtil.isEmpty(ruleConfigOptional)) { + return null; + } + String[] ruleFields = ruleConfigOptional.get().getDataFieldIds().split(","); + Map ruleMetaDataMap = getRuleFields(ruleFields, fixDataMap, fixDataFieldMap); + //递归选定解析规则,进行规则解析 + if (!ruleConfigOptional.get().getIsFinishMatch().equals("1")) { + //递归选定规则 + doMachRule(ruleConfigList, ruleMetaDataMap, fixDataMap, fixDataFieldMap); + } + return ruleConfigOptional.get(); + } + + + private static Map getRuleFields(String[] preRuleConfigList, Map fixedDataMap, + Map fixedFieldMap) { + Map ruleFieldMap = new HashMap<>(); + for (String preRuleConfigId : preRuleConfigList) { + String fieldName = fixedFieldMap.get(preRuleConfigId); + if (fixedDataMap.containsKey(fieldName)) { + ruleFieldMap.put(fieldName, String.valueOf(fixedDataMap.get(fieldName))); + } + } + return ruleFieldMap; + } + + + //匹配规则配置 + private static Boolean machRuleConfig(Map ruleMap, Map metaDataMap) { + if (ruleMap == null || metaDataMap == null) { + return null; + } + //所有的字段在规则里面必须有有配置 + for (String key : metaDataMap.keySet()) { + if (ruleMap.containsKey(key)) { + if (!ruleMap.get(key).equals(metaDataMap.get(key))) { + return false; + } + } else { + return false; + } + } + return true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java deleted file mode 100644 index 664088d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java +++ /dev/null @@ -1,92 +0,0 @@ -package com.casic.missiles.parser.rule; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.mapper.dao.PreRuleConfigDao; -import com.casic.missiles.mapper.dao.RuleConfigDao; -import lombok.AllArgsConstructor; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.*; -import java.util.stream.Collectors; - -@Service -@AllArgsConstructor -public class RulerProvider { - - private final FieldConfigDao fieldConfigDao; - private final PreRuleConfigDao preRuleConfigDao; - private final RuleConfigDao ruleConfigDao; - - //根据前置字段的值,找到指定的规则 - //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 - //=>循环判断=>通过规则得到业务字段 - public RuleConfig ruleConfig(Map fixDataMap, String protocolId) { - //批量获取规则 - List preRuleConfigList = preRuleConfigDao.getPreRuleList(protocolId); - //获取固定字段 - Map fixFieldMap = getAllFieldMap(protocolId); - //获取前置规则字段 - final String preRuleFields = getPreRuleFields(preRuleConfigList, fixDataMap, fixFieldMap); - List ruleConfigList = ruleConfigDao.getRuleConfigById(protocolId); - Optional ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig ->preRuleFields.equals( ruleConfig.getParseRuleJson())).findFirst(); - //递归选定解析规则,进行规则解析 - while (!ObjectUtil.isEmpty(ruleConfigOptional) && !ruleConfigOptional.get().getIsBizField().equals("1")) { - String ruleFields = getRuleFields(ruleConfigOptional.get().getDataFieldIds().split(","), fixDataMap, fixFieldMap); - ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig -> ruleConfig.getParseRuleJson().equals(ruleFields)).findFirst(); - } - return ruleConfigOptional.get(); - } - - /** - * 获取前置规则解析字段 - */ - private String getPreRuleFields(List preRuleConfigList, Map fixDataMap, Map fixFieldMap) { - Map ruleFieldMap= new HashMap<>(); - preRuleConfigList.stream() - .forEach( - preRuleConfig -> { - String fieldName = fixFieldMap.get(Long.valueOf(preRuleConfig.getRuleFieldId())); - if (fixDataMap.containsKey(fieldName)) { - ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); - } - } - ); - return JSONObject.toJSONString(ruleFieldMap); - } - - private Map getAllFieldMap(String protocolId) { - List fieldList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Map fixFieldMap = fieldList.stream().collect( - Collectors.toMap(FieldConfig::getId, FieldConfig::getFieldName) - ); - return fixFieldMap; - } - - private String getRuleFields(String[] preRuleConfigList, Map fixDataMap, Map fixFieldMap) { - Map ruleFieldMap= new HashMap<>(); - for (String preRuleConfigId : preRuleConfigList) { - String fieldName = fixFieldMap.get(preRuleConfigId); - if (fixDataMap.containsKey(fieldName)) { - ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); - } - } - return JSONObject.toJSONString(ruleFieldMap); - } - - //弃置 - private String ListToString(List ruleFieldList) { - String ruleFields = ""; - for (String ruleField : ruleFieldList) { - ruleFields += ruleField + ","; - } - ruleFields = StringUtils.isEmpty(ruleFields) ? ruleFields : ruleFields.substring(0, ruleFields.length() - 1); - return ruleFields; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java index 608af3a..32cc8a4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java @@ -2,48 +2,47 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.delivery.decorator.ByteDecorator; +import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @AllArgsConstructor public class FieldDecoratorManger { - private final RuleDictDao ruleDictDao; + private final RuleConfigRegistry ruleDictDao; // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 // (1)静态的业务字段是字典里面可以配置的 // (2)动态的业务字段是通过规则生成的 public String contentMerge(String ruleJson, String sceneConent, String dynamicContent) { - List ruleDictList = ruleDictDao.getRuleDictConfig(); - Map ruleDictMap = ruleDictList.stream().collect( - Collectors.toMap(RuleDict::getId, e -> e)); - List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); - for (Map ruleMap : ruleMapList) { - String ruleType = String.valueOf(ruleMap.get("ruleType")); - ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); - NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); - byteDecorator.nodeDecoratorRule(nodeDecoratorParm); - } +// List ruleDictList = ruleDictDao.getRuleDictConfig(); +// Map ruleDictMap = ruleDictList.stream().collect( +// Collectors.toMap(RuleDict::getId, e -> e)); +// List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); +// for (Map ruleMap : ruleMapList) { +// String ruleType = String.valueOf(ruleMap.get("ruleType")); +// ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); +// NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); +// byteDecorator.nodeDecoratorRule(nodeDecoratorParm); +// } return null; } - - private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { - NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() - .contents(sceneConent) - .dynamicContent(dynamicContent) - .ruletypeId(ruletypeId) - .ruleDictMap(ruleDictMap) - .build(); - return nodeDecoratorParm; - } +// +// private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { +// NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() +// .contents(sceneConent) +// .dynamicContent(dynamicContent) +// .ruletypeId(ruletypeId) +// .ruleDictMap(ruleDictMap) +// .build(); +// return nodeDecoratorParm; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java index 652970c..b204ac3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java @@ -1,56 +1,56 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@AllArgsConstructor -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", - JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Component; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Component("logicalDecorator") +//@AllArgsConstructor +//@Slf4j +//public class LogicalShiftDecorator implements ByteDecorator { +// +//// private final FieldRuleEngineMapper fieldRuleEngineMapper; +//// +//// //字节位移 +//// @Override +//// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +//// String logicalValue = ""; +//// RuleEvaluator fieldRuleEngine = new RuleEvaluator(); +//// try { +//// Map env2 = new HashMap(); +//// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +//// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +//// for (String contentId : contentIdList) { +//// RuleDict ruleDict = ruleDictMap.get(contentId); +//// if (ruleDict.getCode().contains("#")) { +//// //使用动态的值 +//// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +//// } +//// env2.put(ruleDict.getName(), ruleDict.getCode()); +//// } +//// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +//// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +//// return null; +//// } +//// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +//// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +//// return values; +//// } catch (Exception ex) { +//// log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", +//// JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +//// return null; +//// } +//// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java index 346468f..822fead 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@AllArgsConstructor -@Slf4j -public class OperationDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("optionDecorator") +//@AllArgsConstructor +//@Slf4j +//public class OperationDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //混合运算,有常量或者乘除的缩放 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java index 50fb0a7..7a8bccb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@AllArgsConstructor -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +////精度计算 +//@AllArgsConstructor +//@Registry("precisionDecorator") +//@Slf4j +//public class PrecisionDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java index da39235..27f9cc7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java @@ -1,54 +1,53 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@AllArgsConstructor -@Slf4j -public class RuleDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("ruleDecorator") +//@AllArgsConstructor +//@Slf4j +//public class RuleDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //吃我一套正则表达式 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (Exception ex) { +// log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java index 7f5cbf3..c043f97 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java @@ -2,6 +2,6 @@ import java.util.Map; -public interface ComandeEventService { +public interface ComandeEventService{ Map loadComandeEventConfig(String protocolId,String scene); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java index 476ad84..aaf1837 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java @@ -2,46 +2,46 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.dao.CommandEventDao; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @Slf4j @AllArgsConstructor -public class ComandeEventServiceImpl implements ComandeEventService { +public class ComandeEventServiceImpl implements ComandeEventRegistry { - private final CommandEventDao commandEventDao; + // private final CommandEventDao commandEventDao; // 加密bean 固定字段出现变化的字段解析,业务字段的有序内容 @Override - public Map loadComandeEventConfig(String protocolId,String sceneName) { - CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); - if (ObjectUtil.isEmpty(commandEventConfig)) { - log.error("协议{},没有配置成功接收回复配置,清排查原因"); - return null; - } - String replyJson = commandEventConfig.getReplyContentJson(); - List> replyMapList = JSONArray.parseObject(replyJson, List.class); - List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); - Map fixMap = fixList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); - List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) - .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) - .collect(Collectors.toList()); - Map commandConfigMap = new HashMap<>(); - commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); - commandConfigMap.put("fixContent", fixMap); - commandConfigMap.put("bizContent", contentList); - return commandConfigMap; + public Map loadComandeEventConfig(String protocolId, String sceneName) { +// CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); +// if (ObjectUtil.isEmpty(commandEventConfig)) { +// log.error("协议{},没有配置成功接收回复配置,清排查原因"); +// return null; +// } +// String replyJson = commandEventConfig.getReplyContentJson(); +// List> replyMapList = JSONArray.parseObject(replyJson, List.class); +// List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); +// Map fixMap = fixList.stream() +// .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); +// List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) +// .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) +// .collect(Collectors.toList()); +// Map commandConfigMap = new HashMap<>(); +// commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); +// commandConfigMap.put("fixContent", fixMap); +// commandConfigMap.put("bizContent", contentList); +// return commandConfigMap; + return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 128b09d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java deleted file mode 100644 index 4016b0b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface DatagramEventMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java deleted file mode 100644 index 597c306..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.apache.ibatis.annotations.Mapper; - -public interface FieldConfigMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java deleted file mode 100644 index a31680a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.PreRuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface PreRuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java deleted file mode 100644 index 9060a69..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface ProtocolConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java deleted file mode 100644 index 6fa6936..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java deleted file mode 100644 index 582a705..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleDict; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleDictMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java deleted file mode 100644 index 6e302c8..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.CommandEventMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Optional; - -@Component -public class CommandEventDao { - - @Resource - private CommandEventMapper commandEventMapper; - - public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId) - .eq("scene", sceneName) - .eq("enabled", 1); - List commandEventConfig = commandEventMapper.selectList(queryWrapper); - Optional optionalEventConfig = commandEventConfig.stream().findFirst(); - return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java deleted file mode 100644 index 9137e4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.FieldConfigMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class FieldConfigDao { - - @Resource - private FieldConfigMapper fieldConfigMapper; - - public FieldConfig getFieldConfigById(String fieldId) { - FieldConfig fieldConfig = fieldConfigMapper.selectById(fieldId); - return fieldConfig; - } - - public List getFieldConfigs(String protocolId,Integer isFixed) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",isFixed); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - - public List getStorageFieldConfig(String protocolId) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",1) - .eq("is_storage",1); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java deleted file mode 100644 index 67bff6b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.mapper.PreRuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class PreRuleConfigDao { - - @Resource - private PreRuleConfigMapper preRuleConfigMapper; - - public List getPreRuleList(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return preRuleConfigMapper.selectList(queryWrapper); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java deleted file mode 100644 index d69ea85..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.RuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleConfigDao { - - @Resource - private RuleConfigMapper ruleConfigMapper; - - public RuleConfig getNextRuleConfig(String ruleFields) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("parse_rule_json", ruleFields); - return ruleConfigMapper.selectOne(queryWrapper); - } - - - public List getRuleConfigById(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return ruleConfigMapper.selectList(queryWrapper); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java deleted file mode 100644 index 932c185..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.RuleDictMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleDictDao { - - @Resource - private RuleDictMapper ruleDictMapper; - - public List getRuleDictConfig() { - List ruleDictList = ruleDictMapper.selectList(null); - return ruleDictList; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java index 9f9e279..43bc4d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java @@ -10,20 +10,15 @@ import io.netty.channel.socket.nio.NioServerSocketChannel; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import javax.annotation.PreDestroy; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static cn.hutool.core.util.ClassUtil.getClasses; /** * SensorhubServer netty服务端 */ @Slf4j -@Service +@Component public class SensorhubServer { /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java index 2c79ff5..9a28c36 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java @@ -11,13 +11,13 @@ import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioSocketChannel; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClient 客户端 */ @Slf4j -@Service +@Registry public final class SensorhubClient { public static void main(String[] args) throws Exception { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java index 9774be0..477c3f7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java @@ -6,12 +6,12 @@ import io.netty.channel.socket.SocketChannel; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientChannelInitialHandler */ -@Service +@Registry public class SensorhubClientChannelInitialHandler extends ChannelInitializer { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java index 346f4b3..73560e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java @@ -5,13 +5,13 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientHandler */ @Slf4j -@Service +@Registry public class SensorhubClientHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java index 5c1c6f2..d990af5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java @@ -4,12 +4,12 @@ import com.casic.missiles.pojo.Msg; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** * SensorhubServerHandler */ -@Service +@Component public class SensorhubServerHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 67283ae..af3172c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,41 +1,37 @@ package com.casic.missiles.parser; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultProtocolConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.*; +import com.casic.missiles.registry.FieldConfigRegistry; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; -import java.nio.charset.Charset; import java.util.HashMap; import java.util.List; import java.util.Map; -@Service("genericProtocolParser") +/** + * @author + */ +@Component("genericProtocolParser") @Slf4j -@AllArgsConstructor +@RequiredArgsConstructor public class GenericProtocolParser implements ProtocolParser { - private final LeadingCodeMatcher leadingCodeMatcher; private final List frameStructDispenserList; - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorInstanceSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; // 匹配首字母前导码=> 帧结构匹配前导码=> // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 @@ -44,18 +40,19 @@ public Boolean doParseProtocol(ByteBuf byteBuf) { String protocolContent = ByteBufUtil.hexDump(byteBuf); //匹配前导码 - List preCodeConfigs = leadingCodeMatcher.matchLeadingCode(protocolContent); + List preCodeConfigs = LeadingCodeMatcher.matchFrameLeadingCode(protocolContent); //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 if (preCodeConfigs.size() == 0) { - return rematch(byteBuf,protocolContent); + return rematch(byteBuf, protocolContent); } - //暂时先取第一个 + //暂时先取第一个,提升速度,使用享元模式, 减少类的创建销毁与构建 ProtocolConfig protocolConfig = preCodeConfigs.get(0); + AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); ByteBuf wholeDatagramByte = null; //通过匹配帧结构获取完整的数据包 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, preCodeConfigs.get(0))) != null) { + if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, protocolFactory)) != null) { break; } } @@ -68,76 +65,78 @@ * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 */ - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId, wholeDatagramByte); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap, protocolId); - //选取规则对应的流程实例 - DatagramEventConfig datagramEventConfig = processorInstanceSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); + //进行规则字段解析,进行匹配规则 + RuleConfig ruleConfig = getRuleConfig(protocolFactory, wholeDatagramByte); + if (ruleConfig == null) { + return false; + } //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, wholeDatagramByte); + ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte); + //以下进行业务的规则解析,同时选定流程实例 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); + DatagramEventProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain, + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText, protocolId); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain); //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); + datagramEventProvider.storeData(bizDataMap); return true; } - private Boolean rematch(ByteBuf byteBuf,String protocolContent) { + /** + * 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 + */ + private Boolean rematch(ByteBuf byteBuf, String protocolContent) { //重置位判断 byteBuf.resetReaderIndex(); //判断重置是否前移,如果没有前移,则直接判为匹配失败 if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { return false; } else { + //递归执行 return doParseProtocol(byteBuf); } } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; + //获取匹配规则->匹配规则 + private RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + //取出其中参与逻辑provider并判空 + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); + String rulePrepareFields = protocolConfig.getRulePrepareFields(); + //固定字段 + if (StringUtils.isNotEmpty(rulePrepareFields)) { + //获取统一固定字段解析 + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + //获取该协议的字段配置,用于协议规则匹配 + List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); + //获取规则 + RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, + rulePrepareFields, protocolFieldConfigs); + return ruleConfig; + } + return null; } - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + //数据构建,获取固定字段的store和业务字段store + private Map buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + Map bizDataMap = new HashMap<>(); + Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); + Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); + bizDataMap.putAll(ruleStoreObjectMap); + bizDataMap.putAll(protocolStoreObjectMap); return bizDataMap; } - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java index 8a46e32..16ce2e5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java @@ -3,6 +3,7 @@ import io.netty.buffer.ByteBuf; public interface ProtocolParser { + Boolean doParseProtocol(ByteBuf byteBuf); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java new file mode 100644 index 0000000..f7814af --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java @@ -0,0 +1,35 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.ProtocolConfigProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.ProtocolConfig; + +/** + * 存放基本协议的的加载信息 + */ +public class AbstractProtocolConfigFactory { + private final ProtocolConfigProvider protocolConfigProvider; + private final ProtocolFieldConfigProvider protocolFieldConfigProvider; + private final RuleConfigProvider ruleConfigProvider; + + public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { + this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); + this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); + this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); + } + + public ProtocolConfigProvider getProtocolConfigProvider() { + return protocolConfigProvider; + } + + public ProtocolFieldConfigProvider getProtocolFieldConfigProvider() { + return protocolFieldConfigProvider; + } + + public RuleConfigProvider getRuleConfigProvider() { + return ruleConfigProvider; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java new file mode 100644 index 0000000..6e36147 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java @@ -0,0 +1,57 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.CombinedFieldConfigProvider; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.FieldConfigProvider; +import com.casic.missiles.parser.provider.FieldRuleConfigProvider; + +/** + * 存放规则相关的的的加载信息 + */ +public class AbstractRuleConfigFactory { + + /** + * 处理字节 + */ + private final FieldConfigProvider fieldConfigProvider; + /** + * 处理组合字节解析的解码器 + */ + private final CombinedFieldConfigProvider combinedFieldConfigProvider; + /** + * 处理负责字节解析的规则配置 + */ + private final FieldRuleConfigProvider fieldRuleConfigProvider; + /** + * 处理实例流程 + */ + private final DatagramEventProvider datagramEventProvider; + + + public AbstractRuleConfigFactory(Long ruleId) { + this.fieldConfigProvider = new FieldConfigProvider(ruleId); + this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); + this.fieldRuleConfigProvider = new FieldRuleConfigProvider(ruleId); + this.datagramEventProvider = new DatagramEventProvider(ruleId); + } + + public FieldConfigProvider getFieldConfigProvider() { + return fieldConfigProvider; + } + + public CombinedFieldConfigProvider getCombinedFieldConfigProvider() { + return combinedFieldConfigProvider; + } + + public FieldRuleConfigProvider getFieldRuleConfigProvider() { + return fieldRuleConfigProvider; + } + + public DatagramEventProvider getDatagramEventProvider() { + return datagramEventProvider; + } + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java deleted file mode 100644 index 6e1719a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.factory; - - -import com.casic.missiles.pojo.ProtocolConfig; - -import java.util.List; - -/** - * 数据库访问优化(暂时未做) - *

- * 1、初始化协议解析配置,并存放到处存放缓存,对协议基本配置进行管理 - * 2、其中流程中所有的配置都经过此类进行管理,进行调用获取,增强解析速度 - */ -public interface DatagramFactory { - - /** - * 初始化 - */ - List datagramInit(); - - /** - * 根据前导码配置匹配,模糊匹配获取所有的报文项 - */ - List match(); - - /** - * 根据前导码匹配,返回报文项 - */ - List filer(); - - /** - * 保证数据的唯一性选择器 - */ - List selectOne(); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java new file mode 100644 index 0000000..87444a0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java @@ -0,0 +1,18 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +import java.util.List; + +/** + * 直接用,还是边用边创建 + */ +public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { + + + public DefaultProtocolConfigFactory(ProtocolConfig protocolConfig) { + super(protocolConfig); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java new file mode 100644 index 0000000..cce0c7c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java @@ -0,0 +1,12 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; + +public class DefaultRuleFactory extends AbstractRuleConfigFactory { + + public DefaultRuleFactory(Long ruleId) { + super(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java deleted file mode 100644 index 9ee97e0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.casic.missiles.parser.instance; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service -@Slf4j -@AllArgsConstructor -public class GeneralProcessor { - - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; - - /** - * 统一固定字段解析=>进行规则的查询的判断 - * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 - * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 - */ - @Deprecated - public boolean parseWholeDatagram(ByteBuf buffer, ProtocolConfig protocolConfig) { - try { - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap,protocolId); - //选取规则对应的流程= - DatagramEventConfig datagramEventConfig = processorSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); - //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); - //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); - //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); - //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); - //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); - return true; - } catch (Exception ex) { - log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", - ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); - return false; - } - } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; - } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); - } - - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); - return bizDataMap; - } - - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java index 25e7ad8..6a5777e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java @@ -1,23 +1,31 @@ package com.casic.missiles.parser.instance.impl; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.mapper.DatagramEventMapper; import com.casic.missiles.pojo.DatagramEventConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.SpringContextUtil; -@Service -@AllArgsConstructor +import java.util.List; +import java.util.Optional; + +/** + * @author cz + * + */ public class DefaultProcessorInstanceSelector implements ProcessorInstanceSelector { - private final DatagramEventMapper datagramEventMapper; + private static List datagramEventConfigs; + + static { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + datagramEventConfigs = datagramEventRegistry.getDatagramEventList(); + } @Override public DatagramEventConfig getProcessorInstance(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("rule_id", protocolId); - return datagramEventMapper.selectOne(queryWrapper); + Optional optionalSelectInstance = datagramEventConfigs.stream() + .filter(e -> e.getId().equals(protocolId)).limit(1).findFirst(); + return optionalSelectInstance.isPresent() ? optionalSelectInstance.get() : null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a778671..7b56a43 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,16 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import io.netty.buffer.ByteBuf; /** - * 分析匹配情况 - * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 - * 2、匹配不成功,有后续帧,可以进行下次匹配。 - * 3、匹配不成功,无后续帧,可以进行丢弃。 + * 分析匹配情况 + * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 + * 2、匹配不成功,有后续帧,可以进行下次匹配。 + * 3、匹配不成功,无后续帧,可以进行丢弃。 */ -public interface FrameStructMatcher{ +public interface FrameStructMatcher { - ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig); + ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 05320ab..8ebea78 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,23 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.ProtocolConfigMapper; +import com.casic.missiles.parser.provider.ProtocolConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Component; import java.util.List; import java.util.stream.Collectors; -@Component -@AllArgsConstructor public class LeadingCodeMatcher { - private final ProtocolConfigMapper protocolMapper; - //** 1、首字母匹配前导码, // 2、以匹配出的前导码是否在报文中条件进行前导码的匹配二次筛选 - public List matchLeadingCode(String protocolContent){ + public static List matchFrameLeadingCode(String protocolContent){ List initialConfigs = initialMatch(protocolContent); List preCodeConfigs = initialConfigs.stream() .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) @@ -26,13 +19,16 @@ } //初始化匹配前导码内容 - private List initialMatch(String protocolContent) { - String protocolStr = protocolContent.charAt(0) + ""; - QueryWrapper queryWrapper = new QueryWrapper() - .likeRight("pre_fix", protocolStr); - List protocolConfigList = protocolMapper.selectList(queryWrapper); - return protocolConfigList; + private static List initialMatch(String protocolContent) { + String firstFrameChar = protocolContent.charAt(0) + ""; + ProtocolConfigProvider protocolConfigProvider=new ProtocolConfigProvider(firstFrameChar); + return protocolConfigProvider.getMatchList(); } + + + + + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index cf2113d..e915877 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -1,32 +1,35 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(0) -@Service +@Component public class FrameLengthMatcher implements FrameStructMatcher { - @Autowired - private FieldParser fieldParser; - //超过长度 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { String dataGramContent = ByteBufUtil.hexDump(byteBuf); - if (StringUtils.isEmpty(protocolConfig.getUnpackId()) && StringUtils.isEmpty(protocolConfig.getTailStr())) { - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + //当不存在结尾标志和拆包标志,可以直接使用长度进行匹配 + if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { if (dataGramContent.length() >= totalLength) {//等于长度返回true,超出长度,切断 - ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, protocolConfig, totalLength); + ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, totalLength); return wholeDatagramByte; } else { //读的标志位前移舍弃 @@ -38,7 +41,7 @@ return null; } - private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, Integer totalLength) { byteBuf.readBytes(totalLength); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, totalLength - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 2bfc213..d527ad0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; @@ -13,7 +13,7 @@ import lombok.AllArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.nio.charset.Charset; import java.util.Map; @@ -22,32 +22,30 @@ * 后续标志验证 */ @Order(1) -@Service +@Component @AllArgsConstructor -public class FrameMarkMatcher implements FrameStructMatcher { - - private final FieldConfigDao fieldConfigDao; - private final FieldParser fieldParser; - private final FieldResolver fieldResolverManger; +public class FrameMarkMatcher implements FrameStructMatcher, FixedPropertyEnum { //帧后续标志=>结束,进行帧的重组=>有后续,1、帧移位判别 2、继续接收帧 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig UnpackConfig = StringUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getUnpackId()); - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); - Integer upback = 0; + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); ByteBuf mergeWholeFrameByte = null; - if (!ObjectUtil.isEmpty(UnpackConfig)) { - while (hasNextFullFrame(byteBuf, protocolConfig)) { - upback = (Integer) fieldResolverManger.filedParserManger(byteBuf, UnpackConfig, null); + if (!ObjectUtil.isEmpty(unpackFlag)) { + while (hasNextFullFrame(byteBuf, protocolConfig, protocolFieldConfigProvider)) { //是否存在后续位 - if (upback == 1) {//使用esayRule + if (unpackFlag == 1) {//使用esayRule //表示可以截取 - mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolConfig, totalLength); + mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolFieldConfigProvider, protocolConfig); return mergeWholeFrameByte; } else { - byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig)); + byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig, protocolFieldConfigProvider)); } } } @@ -56,7 +54,8 @@ //选取第一个帧,将业务内容和后面部分分开 //计算数据报文-业务内容 - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolFieldConfigProvider protocolFieldConfigProvider, ProtocolConfig protocolConfig) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); //截取完整报文 byteBuf.readBytes(totalLength); ByteBuf byteBufContent = byteBuf.slice(0, byteBuf.readerIndex()); @@ -68,15 +67,15 @@ String tail = ""; System.out.println(ByteBufUtil.hexDump(byteBufContent)); //会存在多个帧拼接在一起的的情况,进行合并处理 - while (hasNextFullFrame(byteBufContent, protocolConfig)) { - Integer currentFrameLength = fieldParser.getTotalLength(protocolConfig, byteBufContent); + while (hasNextFullFrame(byteBufContent, protocolConfig, protocolFieldConfigProvider)) { + Integer currentFrameLength = protocolFieldConfigProvider.getTotalLength(byteBufContent, protocolConfig); byteBufContent.readBytes(currentFrameLength); ByteBuf currentbyteBuf = byteBufContent.slice(0, byteBufContent.readerIndex()); byteBufContent.markReaderIndex();//读的标志位前移 System.out.println(ByteBufUtil.hexDump(byteBufContent)); String hexDump = currentbyteBuf.toString(Charset.forName("ISO-8859-1")); //获取当前固定帧结构的关系map - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, currentbyteBuf); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(currentbyteBuf, protocolConfig); if (StringUtils.isEmpty(mergeFrameStr)) { //首次获取业务数据报文 mergeFrameStr += hexDump.substring(0, currentFrameFixedProperty.get("tailPosition")); @@ -95,22 +94,22 @@ /** * 获取平移到下一帧起始位置 */ - public int getNextFrameOffset(ByteBuf buffer, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, buffer); - return currentFrameFixedProperty.get("totalLength"); + public int getNextFrameOffset(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + return currentFrameFixedProperty.get(TOTAL_LENGTH); } /** * 判断是否出错进行整个帧的 */ - public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, byteBuf); + public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); //保证读取位置不在固定位置,是可变的业务内容 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("fixedPosition")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(FIXED_POSITION)) { return false; } //判断读取是否操作帧长度 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("totalLength")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(TOTAL_LENGTH)) { return false; } return true; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 76a3784..c3a1bab 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -1,50 +1,50 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.parser.instance.GeneralProcessor; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; +import io.netty.buffer.ByteBufUtil;; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(2) -@Service +@Component public class FrameTailMatcher implements FrameStructMatcher { - @Resource - private FieldConfigDao fieldConfigDao; - @Autowired - private GeneralProcessor generalProcessor; - //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig tailFieldConfig = StringUtils.isEmpty(protocolConfig.getTailStr()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getTailStr()); - if (!ObjectUtil.isEmpty(tailFieldConfig)) { - String tailStr = tailFieldConfig.getFieldName(); + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfig protocolFieldConfig = ObjectUtils.isEmpty(protocolConfig.getTailStr()) ? null : + fieldConfigProvider.getFieldConfigById(protocolConfig.getTailStr()); + if (!ObjectUtil.isEmpty(protocolFieldConfig)) { + String tailStr = protocolFieldConfig.getFieldName(); String dataGramContent = ByteBufUtil.hexDump(byteBuf); Boolean tailFlag = ByteBufUtil.hexDump(byteBuf).contains(tailStr); if (!tailFlag) { //使用esayRule return null; } else if (dataGramContent.indexOf(tailStr) < dataGramContent.length() - tailStr.length()) { Integer length = dataGramContent.indexOf(tailStr) + tailStr.length(); - ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, protocolConfig, length); + ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, length); return wholeDatagramByte; //存在粘包 } } return null; } - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer length) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, Integer length) { byteBuf.readBytes(length); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, length - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java new file mode 100644 index 0000000..5f1c177 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java @@ -0,0 +1,73 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.combined.GenericCombinedFieldResolver; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.CombinedFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class CombinedFieldConfigProvider { + + + /** + * 作为临时配置列表缓存使用 + */ + private final List combinedFieldConfigList; + private Map storeObjectMap = new HashMap<>(); + + public CombinedFieldConfigProvider(Long ruleId) { + CombinedFieldConfigRegistry combinedFieldConfigRegistry = SpringContextUtil.getBean(CombinedFieldConfigRegistry.class); + combinedFieldConfigList = combinedFieldConfigRegistry.getCombinedFieldConfigList(ruleId); + } + + public void parseDataField(RuleConfig ruleConfig, String clearZeroPlain,Map fieldConfigsMap ) { + if (showSkip()) { + return; + } + //匹配对应的数据,然后进行相关的字段解析 + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver(); + combinedFieldResolver.parseDataField(combinedFieldConfigList, byteBuf, storeObjectMap,fieldConfigsMap); + } + + + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getCombinedFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return combinedFieldConfigList.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public List getCombinedFieldConfigList() { + return combinedFieldConfigList; + } + + /* 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(combinedFieldConfigList) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java new file mode 100644 index 0000000..f3cfedc --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java @@ -0,0 +1,11 @@ +package com.casic.missiles.parser.provider; + +/** + * @author cz + * @date 2023-6-12 + */ +public class CommandEventProvider{ + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java new file mode 100644 index 0000000..70eec5e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java @@ -0,0 +1,77 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.safe.SafeStrategy; +import com.casic.missiles.parser.sender.DataSubscribeProvider; +import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class DatagramEventProvider { + + private final DatagramEventConfig processorInstance; + + public DatagramEventProvider(Long ruleId) { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + List datagramEventConfigList = + datagramEventRegistry.getDatagramEventList(ruleId); + processorInstance = this.getProcessorInstance(datagramEventConfigList); + } + + public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { + if (showSkip()) { + return null; + } + return datagramEventConfigList.get(0); + } + + // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 + public String getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap) { + String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? + processorInstance.getSafeBean() : + fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); + if (!StringUtils.isEmpty(safeName)) { + //需要加密 + SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); + String plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); + return clearComplementZero(plain); + } + return ByteBufUtil.hexDump(bizDataContent); + } + + //解密清零操作 + private String clearComplementZero(String plain) { + plain = plain.substring(0, plain.lastIndexOf("00")); + return plain; + } + + //数据发送,数据发送者暂未构建 + public void storeData(Map bizDataMap) { + DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); +// dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return ObjectUtils.isNotEmpty(processorInstance) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java new file mode 100644 index 0000000..7e1fe0a --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java @@ -0,0 +1,97 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.FieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class FieldConfigProvider { + + + private final List fieldConfigs; + private Map storeObjectMap = new HashMap<>(); +// private Map singleObjects = new ConcurrentHashMap<>(); + + public FieldConfigProvider(Long ruleId) { + FieldConfigRegistry fieldConfigRegistry = SpringContextUtil.getBean(FieldConfigRegistry.class); + fieldConfigs = fieldConfigRegistry.getFieldConfigList(ruleId); + } + + public List getFieldConfigs() { + return fieldConfigs; + } + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public Map parseDataField(RuleConfig ruleConfig, String clearZeroPlain) { + if (showSkip()) { + return null; + } + List prepareFieldConfig = prepareParseField(ruleConfig); + if (CollectionUtils.isNotEmpty(prepareFieldConfig)) { + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(fieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + return fixDataMap; + } + } + return null; + } + + /** + * 得到需要处理的业务内容 + * + * @return + */ + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return fieldConfigs.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public Map getFieldConfigsMap() { + return fieldConfigs.stream().collect( + Collectors.toMap(FieldConfig::getId, e -> e) + ); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(fieldConfigs) ? false : true; + } + + +} + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java new file mode 100644 index 0000000..817bfaf --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java @@ -0,0 +1,19 @@ +package com.casic.missiles.parser.provider; + +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.registry.FieldRuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; + +public class FieldRuleConfigProvider { + + private final List fieldRuleConfigList; + + public FieldRuleConfigProvider(Long ruleId) { + FieldRuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(FieldRuleConfigRegistry.class); + fieldRuleConfigList = ruleConfigRegistry.getFieldRuleConfigList(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java new file mode 100644 index 0000000..99a1b06 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java @@ -0,0 +1,53 @@ +package com.casic.missiles.parser.provider; + + +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.registry.ProtocolConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolConfigProvider { + + private final List protocolConfigList; + + public ProtocolConfigProvider(String firstChar) { + ProtocolConfigRegistry registry = SpringContextUtil.getBean(ProtocolConfigRegistry.class); + protocolConfigList = registry.getProtocolConfigList(firstChar); + } + + public List getMatchList() { + return protocolConfigList; + } + + /** + * 设置当前协议 + * + * @param protocolConfig + */ + public ProtocolConfigProvider(ProtocolConfig protocolConfig) { + List protocolConfigs = new ArrayList<>(); + protocolConfigs.add(protocolConfig); + protocolConfigList = protocolConfigs; + } + + /** + * 获取当前协议 + * + * @return + */ + public ProtocolConfig getCurrentProtocolConfig() { + if (this.protocolConfigList == null) { + return null; + } else { + return protocolConfigList.get(0); + } + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java new file mode 100644 index 0000000..043927d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java @@ -0,0 +1,213 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.registry.ProtocolFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolFieldConfigProvider { + + private static final String FIXED_FIELD_DS = "fixedFieldDs"; + private static final String CONTENT_FIELD_DS = "contentFieldDs"; + private static final String PROTOCOL_LENGTH = "protocolLength"; + private static final String PROTOCOL_FIELD_ID = "protocolFieldId"; + private static final String PROTOCOL_POSITION = "protocolPosition"; + + private final List protocolFieldConfigs; + private Map singleObjects = new ConcurrentHashMap<>(); + private Map storeObjectMap = new HashMap<>(); + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public ProtocolFieldConfigProvider(Long protocolId) { + ProtocolFieldConfigRegistry protocolFieldConfigRegistry = SpringContextUtil.getBean(ProtocolFieldConfigRegistry.class); + protocolFieldConfigs = protocolFieldConfigRegistry.getProtocolFieldConfigList(protocolId); + } + + public List getProtocolFieldConfigs() { + return protocolFieldConfigs; + } + + public ProtocolFieldConfig getFieldConfigById(Long fieldId) { + Optional optionalConfig = protocolFieldConfigs.stream().filter( + e -> e.getId().equals(fieldId) + ).findFirst(); + return optionalConfig.isPresent() ? optionalConfig.get() : null; + } + + public Integer getProtocolFieldValue(Long protocolFieldId, ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_FIELD_ID + protocolFieldId + ByteBufUtil.hexDump(byteBuf); + //获取缓存 + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + //加载固定长度数据集合 + Map fixDataMap = this.getProtocolDataMap(byteBuf); + ProtocolFieldConfig protocolFieldConfig = selectFieldConfig(protocolFieldId); + Integer protocolFieldValue = 0; + //获取约定字段的总长度 + if (fixDataMap.containsKey(protocolFieldConfig.getFieldName())) { + Object appointUnpackObject = fixDataMap.get(protocolFieldConfig.getFieldName()); + if (ObjectUtils.isNotEmpty(appointUnpackObject)) { + protocolFieldValue = (Integer) appointUnpackObject; + } + } + if (protocolFieldValue != null) { + //加入缓存 + if (ObjectUtils.isNotEmpty(protocolFieldValue)) { + this.singleObjects.put(catchKey, protocolFieldValue); + return protocolFieldValue; + } + } + return null; + } + + /** + * 获取帧固定位置信息 + * + * @param byteBuf + * @param protocolConfig + * @return + */ + public Map getFixedProperty(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_POSITION + protocolConfig.getId(); + if (this.singleObjects.containsKey(catchKey)) { + return (Map) singleObjects.get(catchKey); + } + Map fixedPropertyMap = new HashMap<>(); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + fixedPropertyMap = fieldParser.doGetFixedProperty(protocolFieldConfigs, this.getTotalLength(byteBuf,protocolConfig)); + if (CollectionUtils.isNotEmpty(fixedPropertyMap)) { + this.singleObjects.put(catchKey, fixedPropertyMap); + return fixedPropertyMap; + } + return fixedPropertyMap; + } + + /** + * 获取帧结构应有的总长度 + */ + public Integer getTotalLength(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_LENGTH + ByteBufUtil.hexDump(byteBuf); + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + Integer appointFrameLength = getProtocolFieldValue(protocolConfig.getTotalLengthId(), byteBuf); + if (appointFrameLength != null) { + //获取过滤的字段集合总长度 + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Integer totalFilterLength = fieldParser.getTotalFilterLength(protocolConfig, byteBuf, getFixFieldConfigMap()); + //计算总长度 + Integer totalLength = appointFrameLength + totalFilterLength; + //加入缓存 + if (ObjectUtils.isNotEmpty(totalLength)) { + this.singleObjects.put(catchKey, totalLength); + return totalLength; + } + } + return null; + } + + /** + * 获取协议有关字段解析内容 + * storeObjectMap存储代转存的数据 + * + * @return + */ + public Map getProtocolDataMap(ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(FIXED_FIELD_DS)) { + return (Map) singleObjects.get(FIXED_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(protocolFieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + this.singleObjects.put(FIXED_FIELD_DS, fixDataMap); + return fixDataMap; + } + return null; + } + + /** + * 获取业务报文内容的content字节 + * + * @param wholeDatagramByte + * @return + */ + public ByteBuf getDataContentBuf(ByteBuf wholeDatagramByte) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(CONTENT_FIELD_DS)) { + return (ByteBuf) singleObjects.get(CONTENT_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + ByteBuf bizDataByteBuf = fieldParser.getDataContentBuf(protocolFieldConfigs, wholeDatagramByte); + if (bizDataByteBuf != null) { + this.singleObjects.put(CONTENT_FIELD_DS, bizDataByteBuf); + return bizDataByteBuf; + } + return null; + } + + + private ProtocolFieldConfig selectFieldConfig(Long id) { + Optional optionalProtocolFieldConfig = this.protocolFieldConfigs.stream().filter( + e -> e.getId().equals(id) + ).findFirst(); + return optionalProtocolFieldConfig.isPresent() ? optionalProtocolFieldConfig.get() : null; + } + + + private Map getFixFieldConfigMap() { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, e -> e) + ); + return fixDataFieldMap; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(protocolFieldConfigs) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java new file mode 100644 index 0000000..dafba1c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java @@ -0,0 +1,56 @@ +package com.casic.missiles.parser.provider; + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.rule.GenericRuleResolver; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.RuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleConfigProvider { + + private final List ruleConfigs; + + public List getRuleConfigs() { + return ruleConfigs; + } + + public RuleConfigProvider(Long protocolId) { + RuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(RuleConfigRegistry.class); + ruleConfigs = ruleConfigRegistry.getRuleConfigById(protocolId); + } + + /** + * 获取规则匹配结果 + * + * @param parseFixedDataMap + * @param protocolFieldConfigs + * @return + */ + public RuleConfig doGetRule(Map parseFixedDataMap, + String ids, + List protocolFieldConfigs) { + if (showSkip()) { + return null; + } + RuleConfig ruleConfig = GenericRuleResolver.machRule(parseFixedDataMap, ids, protocolFieldConfigs, ruleConfigs); + return ruleConfig; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(ruleConfigs) ? false : true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java index 3c05891..856b399 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java @@ -1,18 +1,11 @@ package com.casic.missiles.parser.resolver; -import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.springframework.web.bind.annotation.RequestBody; -import javax.annotation.Resource; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -20,19 +13,17 @@ @Slf4j public class ByteMergeProvider { - @Resource - private FieldRuleEngineMapper fieldRuleEngineMapper; - //拿到所有的值合并到一个值 - public String resolveByteMerge(List valueList, String ruletypeId, String vaildRange) { + public static String resolveByteMerge(List valueList, String ruleTypeId, String vaildRange) { String values = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Map vaildMap = getValidRangeMap(vaildRange); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(ruletypeId); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } + //暂时不处理 +// fieldRuleEngine = fieldRuleConfigMapper.selectById(ruleTypeId); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } Map env2 = new HashMap(); for (int i = 0; i < valueList.size(); i++) { if (vaildMap.containsKey(i)) { @@ -47,7 +38,7 @@ } } - private Map getValidRangeMap(String vaildRange) { + private static Map getValidRangeMap(String vaildRange) { String[] range = vaildRange.split(","); Map vaildMap = new HashMap(); for (int i = 0; i < range.length; i++) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 8d821cd..85d6bbf 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -1,9 +1,12 @@ package com.casic.missiles.parser.resolver; +import com.casic.missiles.pojo.AbstractFieldConfig; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; import io.netty.buffer.ByteBuf; +import java.util.List; import java.util.Map; /** @@ -11,18 +14,14 @@ */ public interface FieldParser { -// Map fieldProcess(String protocolContent,); - Map dataParser(RuleConfig ruleConfig, String lightText,String protocolId); + Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength); - Map fixDataParser(String protocolId, ByteBuf buffer); + Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap); - Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf); + ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer); - ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer); - - ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer); - - Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer); + Integer getTotalFilterLength(ProtocolConfig protocolConfig, ByteBuf byteBuf, Map protocolFieldConfigMap); } + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java new file mode 100644 index 0000000..9e0c00e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java @@ -0,0 +1,52 @@ +package com.casic.missiles.parser.resolver; + +import com.casic.missiles.pojo.AbstractFieldConfig; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.util.List; + +public class FieldParserSupport { + + //分别计算bit和byte长度=> 合并长度 + protected Integer calculateLength(List fieldConfigList) { + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + Integer fixedLength = bytefixedLength + bitfixedLength / 8; + return fixedLength; + } + + //找到最大值=> 根据最大值计算业务数据下标 + protected Integer calculatePosition(List fieldConfigList) { + String rex = "[0-9]+"; + Integer max = -1; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) + && Integer.valueOf(fieldConfig.getOriginPositionByte()) > max) { + max = Integer.valueOf(fieldConfig.getOriginPositionByte()); + } + } + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) && fieldConfig.getOriginPositionByte().equals(max)) { + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + } + } + Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; + return maxFixedPosition; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java deleted file mode 100644 index dd3a6cd..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java +++ /dev/null @@ -1,170 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.ByteResolverParam; -import io.netty.buffer.ByteBuf; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -/** - * 字段解析管理总类 - */ -@Service -@Slf4j -@AllArgsConstructor -public class FieldResolver extends ByteMergeProvider { - - //1、字段截取 => 2、简单的字节解析和复杂的字节解析 - public Object filedParserManger(ByteBuf byteBuf, FieldConfig fieldConfig, Integer maxFixedPosition) { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - //最大固定位置不为空, - if (!ObjectUtil.isEmpty(maxFixedPosition)) { - orignPosition -= maxFixedPosition; - } - Object fieldValue = 0; - //待优化 - if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { - fieldValue = bitToResolver(byteBuf, fieldConfig); - } else { - ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); - fieldValue = parsingFields(fieldBytes, fieldConfig.getRuleJson()); - } - return fieldValue; - } - - //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, - //目前默认配置的规则设置暂不支持配置化,由实现完成 - private Object parsingFields(ByteBuf byteBuf, String ruleJson) { - Object fieldsResolveValue = null; - List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); - if (ObjectUtil.isEmpty(ruleMapList)) { - fieldsResolveValue = defaultResolveBuilder(byteBuf); - } else { - fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); - } - return fieldsResolveValue; - } - - private Object defaultResolveBuilder(ByteBuf byteBuf) { - Integer defaultResolveValue = 0; - for (int i = 0; i < byteBuf.writerIndex(); i++) { - defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; - } - return defaultResolveValue; - } - - //字段解析构建器(针对字节单位的) - //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 - // 字节归并结束或者规则结束=>继续根据规则进行判断 - private Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { - Object customizeResolveValue = null; - try { - List bytStrList = new ArrayList<>(); - //存放到数组里面 - for (int i = 0; i < byteBuf.writerIndex(); i++) { - bytStrList.add(byteBuf.readByte()); - } - int i = 0; - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - customizeResolveValue = this.resolveByteMerge(bytStrList, ruletypeId,vaildRange); - break; - } else { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - List tempBytStr = new ArrayList<>(); - for (int k = 0; i < bytStrList.size(); i++) { - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(k) - .value(bytStrList.get(k)) - .ruletypeId(ruletypeId).build(); - tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); - } - bytStrList = tempBytStr; - } - i++; - } - //字节归并到一起=>继续根据规则进行判断 - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(customizeResolveValue) - .ruletypeId(ruletypeId).build(); - customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(customizeResolveValue)); - return customizeResolveValue; - } catch (RuntimeException ex) { - log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); - return null; - } - } - - /** - * 1、单个字节情况表示字段 - * 2、多字节情况表示字段(暂未处理) - */ - private Object bitToResolver(ByteBuf byteBuf, FieldConfig fieldConfig) { - Object fieldValue = new Object(); - try { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - byte fields = 0x00; - if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); - } else { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); - } - - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { - if (!StringUtils.isEmpty(fieldConfig.getExactOrignPosition())) { - fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getExactOrignPosition())).byteValue() - >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); - } else { - fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); - } - } else { - fieldValue = Integer.valueOf(fields & 0xff); - } - if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { - return fieldValue; - } - List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); - int i = 0; - //字节归并到一起=>继续根据规则进行判断 - while (i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(fieldValue) - .ruletypeId(ruletypeId).build(); - fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(fieldValue)); - return fieldValue; - } catch (RuntimeException ex) { - log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); - return null; - } - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java new file mode 100644 index 0000000..1d2aeab --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java @@ -0,0 +1,36 @@ +package com.casic.missiles.parser.resolver.bytes; + +import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.mapper.FieldRuleConfigMapper; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.pojo.ByteResolverParam; +import com.googlecode.aviator.AviatorEvaluator; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; +//转换规则 +@Component("convert") +@AllArgsConstructor +@Slf4j +public class ByteRuleResolver implements ByteResolver { + + private final FieldRuleConfigMapper fieldRuleConfigMapper; + + @Override + public Object resolveOperationRule(ByteResolverParam byteResolverParam){ + FieldRuleConfig fieldRuleEngine=fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); + if(ObjectUtil.isEmpty(fieldRuleEngine)){ + return byteResolverParam.getValue(); + } + String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); + Map env2 = new HashMap(); + env2.put("value", (byte) byteResolverParam.getValue()); + String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); + return values; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java index 103821c..786b71c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java @@ -2,34 +2,34 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("logicalShift") +@Component("logicalShift") @AllArgsConstructor @Slf4j public class LogicalShiftResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //字节位移 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { Integer index = byteResolverParam.getIndex(); - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return byteResolverParam.getValue(); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java index 476747d..01149bd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("operation") +@Component("operation") @AllArgsConstructor @Slf4j public class OperationResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //混合运算,有常量或者乘除的缩放 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java index 0b82cf4..79abcce 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.casic.missiles.pojo.ByteResolverParam; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; //精度计算 -@Service("precision") +@Component("precision") @AllArgsConstructor @Slf4j public class PrecisionResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java deleted file mode 100644 index 5c3f332..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; -//转换规则 -@Service("convert") -@AllArgsConstructor -@Slf4j -public class RuleResolver implements ByteResolver { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam){ - RuleEvaluator fieldRuleEngine=fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); - if(ObjectUtil.isEmpty(fieldRuleEngine)){ - return byteResolverParam.getValue(); - } - String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); - Map env2 = new HashMap(); - env2.put("value", (byte) byteResolverParam.getValue()); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java new file mode 100644 index 0000000..d3bbd91 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java @@ -0,0 +1,15 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; + +import java.util.List; +import java.util.Map; +// 前导码匹配->长度字段 +public interface AbstractCombinedFieldProcessor { + + Map invoke(Map map, ByteBuf byteBuf, List combinedFieldConfigList, + Map fieldConfigsMap, Map storeObjectMap); + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java new file mode 100644 index 0000000..03c8480 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java @@ -0,0 +1,59 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-13 + */ +//依次递增进行数据的解析, +public class GenericCombinedFieldResolver { + + + //通过查询,字段长度长度随机 + public void parseDataField(List combinedFieldConfigList, ByteBuf byteBuf, + Map storeObjectMap, Map fieldConfigsMap) { + Integer frameLength = Integer.valueOf(ByteBufUtil.hexDump(byteBuf)); + //添加前置处理器 + com.casic.missiles.util.ClassUtil classUtil = new com.casic.missiles.util.ClassUtil(); + List abstractCombinedProcessors = classUtil.getSubClassList(AbstractCombinedFieldProcessor.class); + + Map fieldFixedMap = combinedFieldLeadCodeMap(combinedFieldConfigList); + //frameLength + Map combinedProcessorFields = null; + while (byteBuf.readableBytes() < frameLength) { + //一直处理 + for (AbstractCombinedFieldProcessor abstractCombinedProcessor : abstractCombinedProcessors) { + combinedProcessorFields = abstractCombinedProcessor.invoke(combinedProcessorFields, byteBuf, + combinedFieldConfigList, + fieldConfigsMap, storeObjectMap); + if (combinedProcessorFields == null || byteBuf.readableBytes() < frameLength) { + return; + } + } + + } + } + + /** + * 取出前导码匹配集合 + */ + private Map combinedFieldLeadCodeMap(List combinedFieldConfigList) { + Map fieldFixedMap = combinedFieldConfigList + .stream() + .collect(Collectors.toMap(CombinedFieldConfig::getPrefixCode, e -> e)); + return fieldFixedMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java new file mode 100644 index 0000000..643a934 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java @@ -0,0 +1,100 @@ +package com.casic.missiles.parser.resolver.fields; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.FieldParserSupport; +import com.casic.missiles.pojo.*; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 保存使用时最基本的信息,并且使用原型模式 + */ +@Slf4j +public class DefaultProtocolFieldParser extends FieldParserSupport implements FieldParser, FixedPropertyEnum { + + //通过传入的配置和报文进行字段解析 + @Override + public Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap) { + Map dataMap = new HashMap<>(); + for (AbstractFieldConfig protocolFieldConfig : protocolFieldConfigs) { + if (!ObjectUtils.isEmpty(protocolFieldConfig.getOriginPositionByte())) { + Object fieldValue = FieldResolver.parseField(buffer, protocolFieldConfig, null); + if (protocolFieldConfig.getIsStorage() == 1) { + storeObjectMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + dataMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + } + return dataMap; + } + + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength) { + Map fixedPropertyMap = new HashMap<>(); + Integer fixedLength = calculateLength(protocolFieldConfigs); + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + fixedPropertyMap.put(FIXED_POSITION, maxFixedPosition); + fixedPropertyMap.put(TOTAL_LENGTH, totalLength); + fixedPropertyMap.put(TAIL_POSITION, totalLength - fixedLength + maxFixedPosition); + return fixedPropertyMap; + } + + //** 获取业务内容的byteBuf + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer) { + //计算固定长度 + Integer fixedLength = calculateLength(protocolFieldConfigs); + //总长度获取 + String lightText = buffer.toString(Charset.forName("ISO-8859-1")); + Integer totalLength = lightText.length(); + //计算固定长度最大长度 + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + //计算数据报文内容 + ByteBuf bizDataFields = buffer.slice(maxFixedPosition - 1, (totalLength - fixedLength)); + return bizDataFields; + } + + /** + * 获取过滤字段的长度 + */ + @Override + public Integer getTotalFilterLength(ProtocolConfig protocolConfig, + ByteBuf byteBuf, + Map protocolFieldConfigMap) { + if (ByteBufUtil.hexDump(byteBuf).equals("")) { + return 0; + } + int totalFilterLength = 0; + String filterFields = protocolConfig.getTotalLengthFilterFields(); + try { + if (!StringUtils.isEmpty(filterFields)) { + String[] filterFieldList = filterFields.split(","); + for (String filterFieldId : filterFieldList) { + if (StringUtils.isNotEmpty(filterFieldId)) { + ProtocolFieldConfig fieldConfig = protocolFieldConfigMap.get(Long.valueOf(filterFieldId)); + //这里都是按字节计算,没有对位进行区分,可能会出现错误 + // 如果对位有需求,需要进一步跟进 + totalFilterLength += fieldConfig.getOffsetLength(); + } + } + } + return totalFilterLength; + } catch (Exception ex) { + log.error("报文确认分发阶段,获取报文总长度过滤长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); + } + return totalFilterLength; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java new file mode 100644 index 0000000..d51e887 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java @@ -0,0 +1,169 @@ +package com.casic.missiles.parser.resolver.fields; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.parser.resolver.ByteMergeProvider; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.AbstractFieldConfig; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.pojo.ByteResolverParam; +import io.netty.buffer.ByteBuf; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * 字段解析管理总类 + */ +@Slf4j +public class FieldResolver extends ByteMergeProvider { + + //1、字段截取 => 2、简单的字节解析和复杂的字节解析 + public static Object parseField(ByteBuf byteBuf,AbstractFieldConfig fieldConfig, Integer maxFixedPosition) { + Integer orignPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + //最大固定位置不为空, + if (!ObjectUtil.isEmpty(maxFixedPosition)) { + orignPosition -= maxFixedPosition; + } + Object fieldValue = 0; + //待优化 + if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { + fieldValue = doParseBitField(byteBuf, fieldConfig); + } else { + ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); + fieldValue = doParseByteField(fieldBytes, fieldConfig.getRuleJson()); + } + return fieldValue; + } + + //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, + //目前默认配置的规则设置暂不支持配置化,由实现完成 + private static Object doParseByteField(ByteBuf byteBuf, String ruleJson) { + Object fieldsResolveValue = null; + List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); + if (ObjectUtil.isEmpty(ruleMapList)) { + fieldsResolveValue = defaultResolveBuilder(byteBuf); + } else { + fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); + } + return fieldsResolveValue; + } + + private static Object defaultResolveBuilder(ByteBuf byteBuf) { + Integer defaultResolveValue = 0; + for (int i = 0; i < byteBuf.writerIndex(); i++) { + defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; + } + return defaultResolveValue; + } + + //字段解析构建器(针对字节单位的) + //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 + // 字节归并结束或者规则结束=>继续根据规则进行判断 + private static Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { + Object customizeResolveValue = null; + try { + List bytStrList = new ArrayList<>(); + //存放到数组里面 + for (int i = 0; i < byteBuf.writerIndex(); i++) { + bytStrList.add(byteBuf.readByte()); + } + int i = 0; + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { + if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + customizeResolveValue = resolveByteMerge(bytStrList, ruletypeId, vaildRange); + break; + } else { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + List tempBytStr = new ArrayList<>(); + for (int k = 0; i < bytStrList.size(); i++) { + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(k) + .value(bytStrList.get(k)) + .ruletypeId(ruletypeId).build(); + tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); + } + bytStrList = tempBytStr; + } + i++; + } + //字节归并到一起=>继续根据规则进行判断 + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(null) + .value(customizeResolveValue) + .ruletypeId(ruletypeId).build(); + customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); + i++; + } + System.out.println(JSON.toJSON(customizeResolveValue)); + return customizeResolveValue; + } catch (RuntimeException ex) { + log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); + return null; + } + } + + /** + * 1、单个字节情况表示字段 + * 2、多字节情况表示字段(暂未处理) + */ + private static Object doParseBitField(ByteBuf byteBuf,AbstractFieldConfig fieldConfig) { + Object fieldValue = new Object(); + try { + Integer orignPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + byte fields = 0x00; + if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { + fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); + } else { + fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); + } + + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { + if (!StringUtils.isEmpty(fieldConfig.getOriginPositionBit())) { + fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getOriginPositionBit())).byteValue() + >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); + } else { + fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); + } + } else { + fieldValue = Integer.valueOf(fields & 0xff); + } + if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { + return fieldValue; + } + List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); + int i = 0; + //字节归并到一起=>继续根据规则进行判断 + while (i < ruleMapList.size()) { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(null) + .value(fieldValue) + .ruletypeId(ruletypeId).build(); + fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); + i++; + } + System.out.println(JSON.toJSON(fieldValue)); + return fieldValue; + } catch (RuntimeException ex) { + log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); + return null; + } + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java deleted file mode 100644 index 35ae3d0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java +++ /dev/null @@ -1,183 +0,0 @@ -package com.casic.missiles.parser.resolver.fields; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufAllocator; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; -import org.springframework.util.ObjectUtils; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service("standard") -@AllArgsConstructor -@Slf4j -public class StandardFieldParser implements FieldParser { - - private final FieldConfigDao fieldConfigDao; - private final FieldResolver fieldResolver; - - //数据解析 - @Override - public Map dataParser(RuleConfig ruleConfig, String lightText, String protocolId) { - String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); - ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); - bufferContent.writeBytes(lightText.getBytes(Charset.forName("ISO-8859-1"))); - Map dataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - for (String dataFieldId : dataFieldIds) { - FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(dataFieldId); - if (!ObjectUtils.isEmpty(fieldConfig)) { - dataMap.put(fieldConfig.getFieldName(), String.valueOf(fieldResolver.filedParserManger(bufferContent, fieldConfig, maxFixedPosition))); - } - } - return dataMap; - } - - //数据解析 - @Override - public Map fixDataParser(String protocolId, ByteBuf buffer) { - List dataFieldIdList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Map dataMap = new HashMap<>(); - for (FieldConfig dataField : dataFieldIdList) { - if (!ObjectUtils.isEmpty(dataField.getOrignPosition())) { - Object fieldValue = (Integer) fieldResolver.filedParserManger(buffer, dataField, null); - dataMap.put(dataField.getFieldName(), fieldValue); - } - } - return dataMap; - } - - @Override - public Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf) { - if (ByteBufUtil.hexDump(byteBuf).equals("")) { - return 0; - } - String filterFields = protocolConfig.getTotalLengthFilterField(); - Integer totalLength = 0; - try { - FieldConfig totalFieldConfig = fieldConfigDao.getFieldConfigById(protocolConfig.getTotalLengthId()); - int totalFilterLength = 0; - if (!StringUtils.isEmpty(filterFields)) { - String[] filterFieldList = filterFields.split(","); - for (String filterField : filterFieldList) { - FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(filterField); - //这里都是按字节计算,没有对位进行区分,可能会出现错误 - - // 如果对位有需求,需要进一步跟进 - totalFilterLength += fieldConfig.getOffsetLength(); - } - } - totalLength = (Integer) fieldResolver.filedParserManger(byteBuf, totalFieldConfig, null) + totalFilterLength; - } catch (Exception ex) { - log.error("报文确认分发阶段,获取报文总长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); - } - return totalLength; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer) { - //业务内容 - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - String protocolId = String.valueOf(protocolConfig.getId()); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - //计算固定长度 - Integer fixedLength = calculateLength(fieldConfigList); -// Integer totalLength = this.getTotalLength(protocolConfig, buffer); - //总长度获取 - Integer totalLength = lightText.length(); - //计算固定长度最大长度 - Integer maxFixedPosition = calculatePosition(fieldConfigList); -// buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - //计算数据报文内容 - ByteBuf bizDataFields = buffer.slice(maxFixedPosition-1, (totalLength - fixedLength)); - return bizDataFields; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer) { - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - String protocolId = String.valueOf(protocolConfig.getId()); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer fixedLength = calculateLength(fieldConfigList); -// Integer totalLength = this.getTotalLength(protocolConfig, buffer); - Integer totalLength = lightText.length(); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - ByteBuf fixDataFields = buffer.slice(0, maxFixedPosition); - return fixDataFields; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer) { - String protocolId = String.valueOf(protocolConfig.getId()); - Map fixedPropertyMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer fixedLength = calculateLength(fieldConfigList); - Integer totalLength = this.getTotalLength(protocolConfig, buffer); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - fixedPropertyMap.put("fixedPosition", maxFixedPosition); - fixedPropertyMap.put("totalLength", totalLength); - fixedPropertyMap.put("tailPosition", totalLength - fixedLength + maxFixedPosition); - return fixedPropertyMap; - } - - //分别计算bit和byte长度=> 合并长度 - private Integer calculateLength(List fieldConfigList) { - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (FieldConfig fieldConfig : fieldConfigList) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - Integer fixedLength = bytefixedLength + bitfixedLength / 8; - return fixedLength; - } - - //找到最大值=> 根据最大值计算业务数据下标 - private Integer calculatePosition(List fieldConfigList) { - String rex = "[0-9]+"; - Integer max = -1; - for (FieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOrignPosition()) - && Integer.valueOf(fieldConfig.getOrignPosition()) > max) { - max = Integer.valueOf(fieldConfig.getOrignPosition()); - } - } - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (FieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOrignPosition()) && fieldConfig.getOrignPosition().equals(max)) { - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - } - } - Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; - return maxFixedPosition; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java new file mode 100644 index 0000000..d4ec6c7 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java @@ -0,0 +1,76 @@ +package com.casic.missiles.parser.rule; + +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import org.apache.commons.lang3.StringUtils; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class GenericRuleResolver { + + //根据前置字段的值,找到指定的规则 + //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 + //=>循环判断=>通过规则得到业务字段 + public static RuleConfig machRule(Map fixDataMap, + String ids, + List protocolFieldConfigs, + List ruleConfigs) { + List preRuleConfigList = getPreRuleList(ids, protocolFieldConfigs); + //获取前置规则字段 + final Map metaDataMap = getPreRuleFields(preRuleConfigList, fixDataMap); + //准备固定的字段集合 + Map fixDataFieldMap = getFixDataFieldMap(protocolFieldConfigs); + return RuleResolverCore.doMachRule(ruleConfigs, metaDataMap, fixDataMap, fixDataFieldMap); + } + + private static Map getFixDataFieldMap(List protocolFieldConfigs) { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, ProtocolFieldConfig::getFieldName) + ); + return fixDataFieldMap; + } + + + /** + * 查询前置规则的字段配置 + * + * @param ids + * @return + */ + private static List getPreRuleList(String ids, List protocolFieldConfigs) { + String[] idList = ids.split(","); + Map prepareMaps = new HashMap<>(); + for (String id : idList) { + if (StringUtils.isNotEmpty(id)) { + prepareMaps.put(Long.valueOf(id), ""); + } + } + List preRuleConfigList = protocolFieldConfigs + .stream() + .filter(e -> prepareMaps.containsKey(e.getId())) + .collect(Collectors.toList()); + return preRuleConfigList; + } + + /** + * 获取前置规则解析字段 + */ + private static Map getPreRuleFields(List preRuleFieldConfigList, Map fixDataMap) { + Map ruleFieldMap = new HashMap<>(); + preRuleFieldConfigList.stream() + .forEach( + preRuleFieldConfig -> { + String fieldName = preRuleFieldConfig.getFieldName(); + if (fixDataMap.containsKey(fieldName)) { + ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); + } + } + ); + return ruleFieldMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java new file mode 100644 index 0000000..baae7e8 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -0,0 +1,68 @@ +package com.casic.missiles.parser.rule; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.casic.missiles.pojo.RuleConfig; + +import java.util.*; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleResolverCore { + + + public static RuleConfig doMachRule(List ruleConfigList, Map metaDataMap, + Map fixDataMap, + Map fixDataFieldMap) { + Optional ruleConfigOptional = ruleConfigList.stream() + .filter(ruleConfig -> machRuleConfig( + JSON.parseObject(ruleConfig.getMatchRuleJson(), Map.class), metaDataMap)) + .findFirst(); + if (ObjectUtil.isEmpty(ruleConfigOptional)) { + return null; + } + String[] ruleFields = ruleConfigOptional.get().getDataFieldIds().split(","); + Map ruleMetaDataMap = getRuleFields(ruleFields, fixDataMap, fixDataFieldMap); + //递归选定解析规则,进行规则解析 + if (!ruleConfigOptional.get().getIsFinishMatch().equals("1")) { + //递归选定规则 + doMachRule(ruleConfigList, ruleMetaDataMap, fixDataMap, fixDataFieldMap); + } + return ruleConfigOptional.get(); + } + + + private static Map getRuleFields(String[] preRuleConfigList, Map fixedDataMap, + Map fixedFieldMap) { + Map ruleFieldMap = new HashMap<>(); + for (String preRuleConfigId : preRuleConfigList) { + String fieldName = fixedFieldMap.get(preRuleConfigId); + if (fixedDataMap.containsKey(fieldName)) { + ruleFieldMap.put(fieldName, String.valueOf(fixedDataMap.get(fieldName))); + } + } + return ruleFieldMap; + } + + + //匹配规则配置 + private static Boolean machRuleConfig(Map ruleMap, Map metaDataMap) { + if (ruleMap == null || metaDataMap == null) { + return null; + } + //所有的字段在规则里面必须有有配置 + for (String key : metaDataMap.keySet()) { + if (ruleMap.containsKey(key)) { + if (!ruleMap.get(key).equals(metaDataMap.get(key))) { + return false; + } + } else { + return false; + } + } + return true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java deleted file mode 100644 index 664088d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java +++ /dev/null @@ -1,92 +0,0 @@ -package com.casic.missiles.parser.rule; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.mapper.dao.PreRuleConfigDao; -import com.casic.missiles.mapper.dao.RuleConfigDao; -import lombok.AllArgsConstructor; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.*; -import java.util.stream.Collectors; - -@Service -@AllArgsConstructor -public class RulerProvider { - - private final FieldConfigDao fieldConfigDao; - private final PreRuleConfigDao preRuleConfigDao; - private final RuleConfigDao ruleConfigDao; - - //根据前置字段的值,找到指定的规则 - //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 - //=>循环判断=>通过规则得到业务字段 - public RuleConfig ruleConfig(Map fixDataMap, String protocolId) { - //批量获取规则 - List preRuleConfigList = preRuleConfigDao.getPreRuleList(protocolId); - //获取固定字段 - Map fixFieldMap = getAllFieldMap(protocolId); - //获取前置规则字段 - final String preRuleFields = getPreRuleFields(preRuleConfigList, fixDataMap, fixFieldMap); - List ruleConfigList = ruleConfigDao.getRuleConfigById(protocolId); - Optional ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig ->preRuleFields.equals( ruleConfig.getParseRuleJson())).findFirst(); - //递归选定解析规则,进行规则解析 - while (!ObjectUtil.isEmpty(ruleConfigOptional) && !ruleConfigOptional.get().getIsBizField().equals("1")) { - String ruleFields = getRuleFields(ruleConfigOptional.get().getDataFieldIds().split(","), fixDataMap, fixFieldMap); - ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig -> ruleConfig.getParseRuleJson().equals(ruleFields)).findFirst(); - } - return ruleConfigOptional.get(); - } - - /** - * 获取前置规则解析字段 - */ - private String getPreRuleFields(List preRuleConfigList, Map fixDataMap, Map fixFieldMap) { - Map ruleFieldMap= new HashMap<>(); - preRuleConfigList.stream() - .forEach( - preRuleConfig -> { - String fieldName = fixFieldMap.get(Long.valueOf(preRuleConfig.getRuleFieldId())); - if (fixDataMap.containsKey(fieldName)) { - ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); - } - } - ); - return JSONObject.toJSONString(ruleFieldMap); - } - - private Map getAllFieldMap(String protocolId) { - List fieldList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Map fixFieldMap = fieldList.stream().collect( - Collectors.toMap(FieldConfig::getId, FieldConfig::getFieldName) - ); - return fixFieldMap; - } - - private String getRuleFields(String[] preRuleConfigList, Map fixDataMap, Map fixFieldMap) { - Map ruleFieldMap= new HashMap<>(); - for (String preRuleConfigId : preRuleConfigList) { - String fieldName = fixFieldMap.get(preRuleConfigId); - if (fixDataMap.containsKey(fieldName)) { - ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); - } - } - return JSONObject.toJSONString(ruleFieldMap); - } - - //弃置 - private String ListToString(List ruleFieldList) { - String ruleFields = ""; - for (String ruleField : ruleFieldList) { - ruleFields += ruleField + ","; - } - ruleFields = StringUtils.isEmpty(ruleFields) ? ruleFields : ruleFields.substring(0, ruleFields.length() - 1); - return ruleFields; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java index 6177e10..bfa87a5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java @@ -2,7 +2,7 @@ public interface SafeStrategy { - String decryption(byte[] bytes); + String decryption(String cipher); String encryption(String lightText); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java index 608af3a..32cc8a4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java @@ -2,48 +2,47 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.delivery.decorator.ByteDecorator; +import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @AllArgsConstructor public class FieldDecoratorManger { - private final RuleDictDao ruleDictDao; + private final RuleConfigRegistry ruleDictDao; // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 // (1)静态的业务字段是字典里面可以配置的 // (2)动态的业务字段是通过规则生成的 public String contentMerge(String ruleJson, String sceneConent, String dynamicContent) { - List ruleDictList = ruleDictDao.getRuleDictConfig(); - Map ruleDictMap = ruleDictList.stream().collect( - Collectors.toMap(RuleDict::getId, e -> e)); - List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); - for (Map ruleMap : ruleMapList) { - String ruleType = String.valueOf(ruleMap.get("ruleType")); - ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); - NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); - byteDecorator.nodeDecoratorRule(nodeDecoratorParm); - } +// List ruleDictList = ruleDictDao.getRuleDictConfig(); +// Map ruleDictMap = ruleDictList.stream().collect( +// Collectors.toMap(RuleDict::getId, e -> e)); +// List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); +// for (Map ruleMap : ruleMapList) { +// String ruleType = String.valueOf(ruleMap.get("ruleType")); +// ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); +// NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); +// byteDecorator.nodeDecoratorRule(nodeDecoratorParm); +// } return null; } - - private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { - NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() - .contents(sceneConent) - .dynamicContent(dynamicContent) - .ruletypeId(ruletypeId) - .ruleDictMap(ruleDictMap) - .build(); - return nodeDecoratorParm; - } +// +// private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { +// NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() +// .contents(sceneConent) +// .dynamicContent(dynamicContent) +// .ruletypeId(ruletypeId) +// .ruleDictMap(ruleDictMap) +// .build(); +// return nodeDecoratorParm; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java index 652970c..b204ac3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java @@ -1,56 +1,56 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@AllArgsConstructor -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", - JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Component; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Component("logicalDecorator") +//@AllArgsConstructor +//@Slf4j +//public class LogicalShiftDecorator implements ByteDecorator { +// +//// private final FieldRuleEngineMapper fieldRuleEngineMapper; +//// +//// //字节位移 +//// @Override +//// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +//// String logicalValue = ""; +//// RuleEvaluator fieldRuleEngine = new RuleEvaluator(); +//// try { +//// Map env2 = new HashMap(); +//// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +//// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +//// for (String contentId : contentIdList) { +//// RuleDict ruleDict = ruleDictMap.get(contentId); +//// if (ruleDict.getCode().contains("#")) { +//// //使用动态的值 +//// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +//// } +//// env2.put(ruleDict.getName(), ruleDict.getCode()); +//// } +//// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +//// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +//// return null; +//// } +//// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +//// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +//// return values; +//// } catch (Exception ex) { +//// log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", +//// JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +//// return null; +//// } +//// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java index 346468f..822fead 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@AllArgsConstructor -@Slf4j -public class OperationDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("optionDecorator") +//@AllArgsConstructor +//@Slf4j +//public class OperationDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //混合运算,有常量或者乘除的缩放 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java index 50fb0a7..7a8bccb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@AllArgsConstructor -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +////精度计算 +//@AllArgsConstructor +//@Registry("precisionDecorator") +//@Slf4j +//public class PrecisionDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java index da39235..27f9cc7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java @@ -1,54 +1,53 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@AllArgsConstructor -@Slf4j -public class RuleDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("ruleDecorator") +//@AllArgsConstructor +//@Slf4j +//public class RuleDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //吃我一套正则表达式 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (Exception ex) { +// log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java index 7f5cbf3..c043f97 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java @@ -2,6 +2,6 @@ import java.util.Map; -public interface ComandeEventService { +public interface ComandeEventService{ Map loadComandeEventConfig(String protocolId,String scene); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java index 476ad84..aaf1837 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java @@ -2,46 +2,46 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.dao.CommandEventDao; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @Slf4j @AllArgsConstructor -public class ComandeEventServiceImpl implements ComandeEventService { +public class ComandeEventServiceImpl implements ComandeEventRegistry { - private final CommandEventDao commandEventDao; + // private final CommandEventDao commandEventDao; // 加密bean 固定字段出现变化的字段解析,业务字段的有序内容 @Override - public Map loadComandeEventConfig(String protocolId,String sceneName) { - CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); - if (ObjectUtil.isEmpty(commandEventConfig)) { - log.error("协议{},没有配置成功接收回复配置,清排查原因"); - return null; - } - String replyJson = commandEventConfig.getReplyContentJson(); - List> replyMapList = JSONArray.parseObject(replyJson, List.class); - List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); - Map fixMap = fixList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); - List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) - .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) - .collect(Collectors.toList()); - Map commandConfigMap = new HashMap<>(); - commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); - commandConfigMap.put("fixContent", fixMap); - commandConfigMap.put("bizContent", contentList); - return commandConfigMap; + public Map loadComandeEventConfig(String protocolId, String sceneName) { +// CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); +// if (ObjectUtil.isEmpty(commandEventConfig)) { +// log.error("协议{},没有配置成功接收回复配置,清排查原因"); +// return null; +// } +// String replyJson = commandEventConfig.getReplyContentJson(); +// List> replyMapList = JSONArray.parseObject(replyJson, List.class); +// List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); +// Map fixMap = fixList.stream() +// .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); +// List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) +// .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) +// .collect(Collectors.toList()); +// Map commandConfigMap = new HashMap<>(); +// commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); +// commandConfigMap.put("fixContent", fixMap); +// commandConfigMap.put("bizContent", contentList); +// return commandConfigMap; + return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 128b09d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java deleted file mode 100644 index 4016b0b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface DatagramEventMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java deleted file mode 100644 index 597c306..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.apache.ibatis.annotations.Mapper; - -public interface FieldConfigMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java deleted file mode 100644 index a31680a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.PreRuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface PreRuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java deleted file mode 100644 index 9060a69..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface ProtocolConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java deleted file mode 100644 index 6fa6936..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java deleted file mode 100644 index 582a705..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleDict; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleDictMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java deleted file mode 100644 index 6e302c8..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.CommandEventMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Optional; - -@Component -public class CommandEventDao { - - @Resource - private CommandEventMapper commandEventMapper; - - public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId) - .eq("scene", sceneName) - .eq("enabled", 1); - List commandEventConfig = commandEventMapper.selectList(queryWrapper); - Optional optionalEventConfig = commandEventConfig.stream().findFirst(); - return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java deleted file mode 100644 index 9137e4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.FieldConfigMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class FieldConfigDao { - - @Resource - private FieldConfigMapper fieldConfigMapper; - - public FieldConfig getFieldConfigById(String fieldId) { - FieldConfig fieldConfig = fieldConfigMapper.selectById(fieldId); - return fieldConfig; - } - - public List getFieldConfigs(String protocolId,Integer isFixed) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",isFixed); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - - public List getStorageFieldConfig(String protocolId) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",1) - .eq("is_storage",1); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java deleted file mode 100644 index 67bff6b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.mapper.PreRuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class PreRuleConfigDao { - - @Resource - private PreRuleConfigMapper preRuleConfigMapper; - - public List getPreRuleList(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return preRuleConfigMapper.selectList(queryWrapper); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java deleted file mode 100644 index d69ea85..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.RuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleConfigDao { - - @Resource - private RuleConfigMapper ruleConfigMapper; - - public RuleConfig getNextRuleConfig(String ruleFields) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("parse_rule_json", ruleFields); - return ruleConfigMapper.selectOne(queryWrapper); - } - - - public List getRuleConfigById(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return ruleConfigMapper.selectList(queryWrapper); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java deleted file mode 100644 index 932c185..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.RuleDictMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleDictDao { - - @Resource - private RuleDictMapper ruleDictMapper; - - public List getRuleDictConfig() { - List ruleDictList = ruleDictMapper.selectList(null); - return ruleDictList; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java index 9f9e279..43bc4d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java @@ -10,20 +10,15 @@ import io.netty.channel.socket.nio.NioServerSocketChannel; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import javax.annotation.PreDestroy; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static cn.hutool.core.util.ClassUtil.getClasses; /** * SensorhubServer netty服务端 */ @Slf4j -@Service +@Component public class SensorhubServer { /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java index 2c79ff5..9a28c36 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java @@ -11,13 +11,13 @@ import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioSocketChannel; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClient 客户端 */ @Slf4j -@Service +@Registry public final class SensorhubClient { public static void main(String[] args) throws Exception { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java index 9774be0..477c3f7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java @@ -6,12 +6,12 @@ import io.netty.channel.socket.SocketChannel; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientChannelInitialHandler */ -@Service +@Registry public class SensorhubClientChannelInitialHandler extends ChannelInitializer { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java index 346f4b3..73560e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java @@ -5,13 +5,13 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientHandler */ @Slf4j -@Service +@Registry public class SensorhubClientHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java index 5c1c6f2..d990af5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java @@ -4,12 +4,12 @@ import com.casic.missiles.pojo.Msg; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** * SensorhubServerHandler */ -@Service +@Component public class SensorhubServerHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 67283ae..af3172c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,41 +1,37 @@ package com.casic.missiles.parser; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultProtocolConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.*; +import com.casic.missiles.registry.FieldConfigRegistry; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; -import java.nio.charset.Charset; import java.util.HashMap; import java.util.List; import java.util.Map; -@Service("genericProtocolParser") +/** + * @author + */ +@Component("genericProtocolParser") @Slf4j -@AllArgsConstructor +@RequiredArgsConstructor public class GenericProtocolParser implements ProtocolParser { - private final LeadingCodeMatcher leadingCodeMatcher; private final List frameStructDispenserList; - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorInstanceSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; // 匹配首字母前导码=> 帧结构匹配前导码=> // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 @@ -44,18 +40,19 @@ public Boolean doParseProtocol(ByteBuf byteBuf) { String protocolContent = ByteBufUtil.hexDump(byteBuf); //匹配前导码 - List preCodeConfigs = leadingCodeMatcher.matchLeadingCode(protocolContent); + List preCodeConfigs = LeadingCodeMatcher.matchFrameLeadingCode(protocolContent); //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 if (preCodeConfigs.size() == 0) { - return rematch(byteBuf,protocolContent); + return rematch(byteBuf, protocolContent); } - //暂时先取第一个 + //暂时先取第一个,提升速度,使用享元模式, 减少类的创建销毁与构建 ProtocolConfig protocolConfig = preCodeConfigs.get(0); + AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); ByteBuf wholeDatagramByte = null; //通过匹配帧结构获取完整的数据包 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, preCodeConfigs.get(0))) != null) { + if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, protocolFactory)) != null) { break; } } @@ -68,76 +65,78 @@ * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 */ - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId, wholeDatagramByte); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap, protocolId); - //选取规则对应的流程实例 - DatagramEventConfig datagramEventConfig = processorInstanceSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); + //进行规则字段解析,进行匹配规则 + RuleConfig ruleConfig = getRuleConfig(protocolFactory, wholeDatagramByte); + if (ruleConfig == null) { + return false; + } //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, wholeDatagramByte); + ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte); + //以下进行业务的规则解析,同时选定流程实例 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); + DatagramEventProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain, + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText, protocolId); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain); //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); + datagramEventProvider.storeData(bizDataMap); return true; } - private Boolean rematch(ByteBuf byteBuf,String protocolContent) { + /** + * 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 + */ + private Boolean rematch(ByteBuf byteBuf, String protocolContent) { //重置位判断 byteBuf.resetReaderIndex(); //判断重置是否前移,如果没有前移,则直接判为匹配失败 if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { return false; } else { + //递归执行 return doParseProtocol(byteBuf); } } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; + //获取匹配规则->匹配规则 + private RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + //取出其中参与逻辑provider并判空 + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); + String rulePrepareFields = protocolConfig.getRulePrepareFields(); + //固定字段 + if (StringUtils.isNotEmpty(rulePrepareFields)) { + //获取统一固定字段解析 + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + //获取该协议的字段配置,用于协议规则匹配 + List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); + //获取规则 + RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, + rulePrepareFields, protocolFieldConfigs); + return ruleConfig; + } + return null; } - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + //数据构建,获取固定字段的store和业务字段store + private Map buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + Map bizDataMap = new HashMap<>(); + Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); + Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); + bizDataMap.putAll(ruleStoreObjectMap); + bizDataMap.putAll(protocolStoreObjectMap); return bizDataMap; } - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java index 8a46e32..16ce2e5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java @@ -3,6 +3,7 @@ import io.netty.buffer.ByteBuf; public interface ProtocolParser { + Boolean doParseProtocol(ByteBuf byteBuf); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java new file mode 100644 index 0000000..f7814af --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java @@ -0,0 +1,35 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.ProtocolConfigProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.ProtocolConfig; + +/** + * 存放基本协议的的加载信息 + */ +public class AbstractProtocolConfigFactory { + private final ProtocolConfigProvider protocolConfigProvider; + private final ProtocolFieldConfigProvider protocolFieldConfigProvider; + private final RuleConfigProvider ruleConfigProvider; + + public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { + this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); + this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); + this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); + } + + public ProtocolConfigProvider getProtocolConfigProvider() { + return protocolConfigProvider; + } + + public ProtocolFieldConfigProvider getProtocolFieldConfigProvider() { + return protocolFieldConfigProvider; + } + + public RuleConfigProvider getRuleConfigProvider() { + return ruleConfigProvider; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java new file mode 100644 index 0000000..6e36147 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java @@ -0,0 +1,57 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.CombinedFieldConfigProvider; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.FieldConfigProvider; +import com.casic.missiles.parser.provider.FieldRuleConfigProvider; + +/** + * 存放规则相关的的的加载信息 + */ +public class AbstractRuleConfigFactory { + + /** + * 处理字节 + */ + private final FieldConfigProvider fieldConfigProvider; + /** + * 处理组合字节解析的解码器 + */ + private final CombinedFieldConfigProvider combinedFieldConfigProvider; + /** + * 处理负责字节解析的规则配置 + */ + private final FieldRuleConfigProvider fieldRuleConfigProvider; + /** + * 处理实例流程 + */ + private final DatagramEventProvider datagramEventProvider; + + + public AbstractRuleConfigFactory(Long ruleId) { + this.fieldConfigProvider = new FieldConfigProvider(ruleId); + this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); + this.fieldRuleConfigProvider = new FieldRuleConfigProvider(ruleId); + this.datagramEventProvider = new DatagramEventProvider(ruleId); + } + + public FieldConfigProvider getFieldConfigProvider() { + return fieldConfigProvider; + } + + public CombinedFieldConfigProvider getCombinedFieldConfigProvider() { + return combinedFieldConfigProvider; + } + + public FieldRuleConfigProvider getFieldRuleConfigProvider() { + return fieldRuleConfigProvider; + } + + public DatagramEventProvider getDatagramEventProvider() { + return datagramEventProvider; + } + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java deleted file mode 100644 index 6e1719a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.factory; - - -import com.casic.missiles.pojo.ProtocolConfig; - -import java.util.List; - -/** - * 数据库访问优化(暂时未做) - *

- * 1、初始化协议解析配置,并存放到处存放缓存,对协议基本配置进行管理 - * 2、其中流程中所有的配置都经过此类进行管理,进行调用获取,增强解析速度 - */ -public interface DatagramFactory { - - /** - * 初始化 - */ - List datagramInit(); - - /** - * 根据前导码配置匹配,模糊匹配获取所有的报文项 - */ - List match(); - - /** - * 根据前导码匹配,返回报文项 - */ - List filer(); - - /** - * 保证数据的唯一性选择器 - */ - List selectOne(); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java new file mode 100644 index 0000000..87444a0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java @@ -0,0 +1,18 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +import java.util.List; + +/** + * 直接用,还是边用边创建 + */ +public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { + + + public DefaultProtocolConfigFactory(ProtocolConfig protocolConfig) { + super(protocolConfig); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java new file mode 100644 index 0000000..cce0c7c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java @@ -0,0 +1,12 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; + +public class DefaultRuleFactory extends AbstractRuleConfigFactory { + + public DefaultRuleFactory(Long ruleId) { + super(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java deleted file mode 100644 index 9ee97e0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.casic.missiles.parser.instance; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service -@Slf4j -@AllArgsConstructor -public class GeneralProcessor { - - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; - - /** - * 统一固定字段解析=>进行规则的查询的判断 - * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 - * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 - */ - @Deprecated - public boolean parseWholeDatagram(ByteBuf buffer, ProtocolConfig protocolConfig) { - try { - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap,protocolId); - //选取规则对应的流程= - DatagramEventConfig datagramEventConfig = processorSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); - //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); - //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); - //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); - //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); - //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); - return true; - } catch (Exception ex) { - log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", - ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); - return false; - } - } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; - } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); - } - - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); - return bizDataMap; - } - - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java index 25e7ad8..6a5777e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java @@ -1,23 +1,31 @@ package com.casic.missiles.parser.instance.impl; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.mapper.DatagramEventMapper; import com.casic.missiles.pojo.DatagramEventConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.SpringContextUtil; -@Service -@AllArgsConstructor +import java.util.List; +import java.util.Optional; + +/** + * @author cz + * + */ public class DefaultProcessorInstanceSelector implements ProcessorInstanceSelector { - private final DatagramEventMapper datagramEventMapper; + private static List datagramEventConfigs; + + static { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + datagramEventConfigs = datagramEventRegistry.getDatagramEventList(); + } @Override public DatagramEventConfig getProcessorInstance(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("rule_id", protocolId); - return datagramEventMapper.selectOne(queryWrapper); + Optional optionalSelectInstance = datagramEventConfigs.stream() + .filter(e -> e.getId().equals(protocolId)).limit(1).findFirst(); + return optionalSelectInstance.isPresent() ? optionalSelectInstance.get() : null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a778671..7b56a43 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,16 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import io.netty.buffer.ByteBuf; /** - * 分析匹配情况 - * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 - * 2、匹配不成功,有后续帧,可以进行下次匹配。 - * 3、匹配不成功,无后续帧,可以进行丢弃。 + * 分析匹配情况 + * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 + * 2、匹配不成功,有后续帧,可以进行下次匹配。 + * 3、匹配不成功,无后续帧,可以进行丢弃。 */ -public interface FrameStructMatcher{ +public interface FrameStructMatcher { - ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig); + ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 05320ab..8ebea78 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,23 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.ProtocolConfigMapper; +import com.casic.missiles.parser.provider.ProtocolConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Component; import java.util.List; import java.util.stream.Collectors; -@Component -@AllArgsConstructor public class LeadingCodeMatcher { - private final ProtocolConfigMapper protocolMapper; - //** 1、首字母匹配前导码, // 2、以匹配出的前导码是否在报文中条件进行前导码的匹配二次筛选 - public List matchLeadingCode(String protocolContent){ + public static List matchFrameLeadingCode(String protocolContent){ List initialConfigs = initialMatch(protocolContent); List preCodeConfigs = initialConfigs.stream() .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) @@ -26,13 +19,16 @@ } //初始化匹配前导码内容 - private List initialMatch(String protocolContent) { - String protocolStr = protocolContent.charAt(0) + ""; - QueryWrapper queryWrapper = new QueryWrapper() - .likeRight("pre_fix", protocolStr); - List protocolConfigList = protocolMapper.selectList(queryWrapper); - return protocolConfigList; + private static List initialMatch(String protocolContent) { + String firstFrameChar = protocolContent.charAt(0) + ""; + ProtocolConfigProvider protocolConfigProvider=new ProtocolConfigProvider(firstFrameChar); + return protocolConfigProvider.getMatchList(); } + + + + + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index cf2113d..e915877 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -1,32 +1,35 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(0) -@Service +@Component public class FrameLengthMatcher implements FrameStructMatcher { - @Autowired - private FieldParser fieldParser; - //超过长度 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { String dataGramContent = ByteBufUtil.hexDump(byteBuf); - if (StringUtils.isEmpty(protocolConfig.getUnpackId()) && StringUtils.isEmpty(protocolConfig.getTailStr())) { - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + //当不存在结尾标志和拆包标志,可以直接使用长度进行匹配 + if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { if (dataGramContent.length() >= totalLength) {//等于长度返回true,超出长度,切断 - ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, protocolConfig, totalLength); + ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, totalLength); return wholeDatagramByte; } else { //读的标志位前移舍弃 @@ -38,7 +41,7 @@ return null; } - private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, Integer totalLength) { byteBuf.readBytes(totalLength); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, totalLength - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 2bfc213..d527ad0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; @@ -13,7 +13,7 @@ import lombok.AllArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.nio.charset.Charset; import java.util.Map; @@ -22,32 +22,30 @@ * 后续标志验证 */ @Order(1) -@Service +@Component @AllArgsConstructor -public class FrameMarkMatcher implements FrameStructMatcher { - - private final FieldConfigDao fieldConfigDao; - private final FieldParser fieldParser; - private final FieldResolver fieldResolverManger; +public class FrameMarkMatcher implements FrameStructMatcher, FixedPropertyEnum { //帧后续标志=>结束,进行帧的重组=>有后续,1、帧移位判别 2、继续接收帧 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig UnpackConfig = StringUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getUnpackId()); - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); - Integer upback = 0; + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); ByteBuf mergeWholeFrameByte = null; - if (!ObjectUtil.isEmpty(UnpackConfig)) { - while (hasNextFullFrame(byteBuf, protocolConfig)) { - upback = (Integer) fieldResolverManger.filedParserManger(byteBuf, UnpackConfig, null); + if (!ObjectUtil.isEmpty(unpackFlag)) { + while (hasNextFullFrame(byteBuf, protocolConfig, protocolFieldConfigProvider)) { //是否存在后续位 - if (upback == 1) {//使用esayRule + if (unpackFlag == 1) {//使用esayRule //表示可以截取 - mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolConfig, totalLength); + mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolFieldConfigProvider, protocolConfig); return mergeWholeFrameByte; } else { - byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig)); + byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig, protocolFieldConfigProvider)); } } } @@ -56,7 +54,8 @@ //选取第一个帧,将业务内容和后面部分分开 //计算数据报文-业务内容 - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolFieldConfigProvider protocolFieldConfigProvider, ProtocolConfig protocolConfig) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); //截取完整报文 byteBuf.readBytes(totalLength); ByteBuf byteBufContent = byteBuf.slice(0, byteBuf.readerIndex()); @@ -68,15 +67,15 @@ String tail = ""; System.out.println(ByteBufUtil.hexDump(byteBufContent)); //会存在多个帧拼接在一起的的情况,进行合并处理 - while (hasNextFullFrame(byteBufContent, protocolConfig)) { - Integer currentFrameLength = fieldParser.getTotalLength(protocolConfig, byteBufContent); + while (hasNextFullFrame(byteBufContent, protocolConfig, protocolFieldConfigProvider)) { + Integer currentFrameLength = protocolFieldConfigProvider.getTotalLength(byteBufContent, protocolConfig); byteBufContent.readBytes(currentFrameLength); ByteBuf currentbyteBuf = byteBufContent.slice(0, byteBufContent.readerIndex()); byteBufContent.markReaderIndex();//读的标志位前移 System.out.println(ByteBufUtil.hexDump(byteBufContent)); String hexDump = currentbyteBuf.toString(Charset.forName("ISO-8859-1")); //获取当前固定帧结构的关系map - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, currentbyteBuf); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(currentbyteBuf, protocolConfig); if (StringUtils.isEmpty(mergeFrameStr)) { //首次获取业务数据报文 mergeFrameStr += hexDump.substring(0, currentFrameFixedProperty.get("tailPosition")); @@ -95,22 +94,22 @@ /** * 获取平移到下一帧起始位置 */ - public int getNextFrameOffset(ByteBuf buffer, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, buffer); - return currentFrameFixedProperty.get("totalLength"); + public int getNextFrameOffset(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + return currentFrameFixedProperty.get(TOTAL_LENGTH); } /** * 判断是否出错进行整个帧的 */ - public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, byteBuf); + public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); //保证读取位置不在固定位置,是可变的业务内容 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("fixedPosition")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(FIXED_POSITION)) { return false; } //判断读取是否操作帧长度 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("totalLength")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(TOTAL_LENGTH)) { return false; } return true; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 76a3784..c3a1bab 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -1,50 +1,50 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.parser.instance.GeneralProcessor; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; +import io.netty.buffer.ByteBufUtil;; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(2) -@Service +@Component public class FrameTailMatcher implements FrameStructMatcher { - @Resource - private FieldConfigDao fieldConfigDao; - @Autowired - private GeneralProcessor generalProcessor; - //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig tailFieldConfig = StringUtils.isEmpty(protocolConfig.getTailStr()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getTailStr()); - if (!ObjectUtil.isEmpty(tailFieldConfig)) { - String tailStr = tailFieldConfig.getFieldName(); + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfig protocolFieldConfig = ObjectUtils.isEmpty(protocolConfig.getTailStr()) ? null : + fieldConfigProvider.getFieldConfigById(protocolConfig.getTailStr()); + if (!ObjectUtil.isEmpty(protocolFieldConfig)) { + String tailStr = protocolFieldConfig.getFieldName(); String dataGramContent = ByteBufUtil.hexDump(byteBuf); Boolean tailFlag = ByteBufUtil.hexDump(byteBuf).contains(tailStr); if (!tailFlag) { //使用esayRule return null; } else if (dataGramContent.indexOf(tailStr) < dataGramContent.length() - tailStr.length()) { Integer length = dataGramContent.indexOf(tailStr) + tailStr.length(); - ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, protocolConfig, length); + ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, length); return wholeDatagramByte; //存在粘包 } } return null; } - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer length) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, Integer length) { byteBuf.readBytes(length); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, length - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java new file mode 100644 index 0000000..5f1c177 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java @@ -0,0 +1,73 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.combined.GenericCombinedFieldResolver; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.CombinedFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class CombinedFieldConfigProvider { + + + /** + * 作为临时配置列表缓存使用 + */ + private final List combinedFieldConfigList; + private Map storeObjectMap = new HashMap<>(); + + public CombinedFieldConfigProvider(Long ruleId) { + CombinedFieldConfigRegistry combinedFieldConfigRegistry = SpringContextUtil.getBean(CombinedFieldConfigRegistry.class); + combinedFieldConfigList = combinedFieldConfigRegistry.getCombinedFieldConfigList(ruleId); + } + + public void parseDataField(RuleConfig ruleConfig, String clearZeroPlain,Map fieldConfigsMap ) { + if (showSkip()) { + return; + } + //匹配对应的数据,然后进行相关的字段解析 + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver(); + combinedFieldResolver.parseDataField(combinedFieldConfigList, byteBuf, storeObjectMap,fieldConfigsMap); + } + + + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getCombinedFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return combinedFieldConfigList.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public List getCombinedFieldConfigList() { + return combinedFieldConfigList; + } + + /* 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(combinedFieldConfigList) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java new file mode 100644 index 0000000..f3cfedc --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java @@ -0,0 +1,11 @@ +package com.casic.missiles.parser.provider; + +/** + * @author cz + * @date 2023-6-12 + */ +public class CommandEventProvider{ + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java new file mode 100644 index 0000000..70eec5e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java @@ -0,0 +1,77 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.safe.SafeStrategy; +import com.casic.missiles.parser.sender.DataSubscribeProvider; +import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class DatagramEventProvider { + + private final DatagramEventConfig processorInstance; + + public DatagramEventProvider(Long ruleId) { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + List datagramEventConfigList = + datagramEventRegistry.getDatagramEventList(ruleId); + processorInstance = this.getProcessorInstance(datagramEventConfigList); + } + + public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { + if (showSkip()) { + return null; + } + return datagramEventConfigList.get(0); + } + + // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 + public String getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap) { + String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? + processorInstance.getSafeBean() : + fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); + if (!StringUtils.isEmpty(safeName)) { + //需要加密 + SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); + String plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); + return clearComplementZero(plain); + } + return ByteBufUtil.hexDump(bizDataContent); + } + + //解密清零操作 + private String clearComplementZero(String plain) { + plain = plain.substring(0, plain.lastIndexOf("00")); + return plain; + } + + //数据发送,数据发送者暂未构建 + public void storeData(Map bizDataMap) { + DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); +// dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return ObjectUtils.isNotEmpty(processorInstance) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java new file mode 100644 index 0000000..7e1fe0a --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java @@ -0,0 +1,97 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.FieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class FieldConfigProvider { + + + private final List fieldConfigs; + private Map storeObjectMap = new HashMap<>(); +// private Map singleObjects = new ConcurrentHashMap<>(); + + public FieldConfigProvider(Long ruleId) { + FieldConfigRegistry fieldConfigRegistry = SpringContextUtil.getBean(FieldConfigRegistry.class); + fieldConfigs = fieldConfigRegistry.getFieldConfigList(ruleId); + } + + public List getFieldConfigs() { + return fieldConfigs; + } + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public Map parseDataField(RuleConfig ruleConfig, String clearZeroPlain) { + if (showSkip()) { + return null; + } + List prepareFieldConfig = prepareParseField(ruleConfig); + if (CollectionUtils.isNotEmpty(prepareFieldConfig)) { + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(fieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + return fixDataMap; + } + } + return null; + } + + /** + * 得到需要处理的业务内容 + * + * @return + */ + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return fieldConfigs.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public Map getFieldConfigsMap() { + return fieldConfigs.stream().collect( + Collectors.toMap(FieldConfig::getId, e -> e) + ); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(fieldConfigs) ? false : true; + } + + +} + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java new file mode 100644 index 0000000..817bfaf --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java @@ -0,0 +1,19 @@ +package com.casic.missiles.parser.provider; + +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.registry.FieldRuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; + +public class FieldRuleConfigProvider { + + private final List fieldRuleConfigList; + + public FieldRuleConfigProvider(Long ruleId) { + FieldRuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(FieldRuleConfigRegistry.class); + fieldRuleConfigList = ruleConfigRegistry.getFieldRuleConfigList(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java new file mode 100644 index 0000000..99a1b06 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java @@ -0,0 +1,53 @@ +package com.casic.missiles.parser.provider; + + +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.registry.ProtocolConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolConfigProvider { + + private final List protocolConfigList; + + public ProtocolConfigProvider(String firstChar) { + ProtocolConfigRegistry registry = SpringContextUtil.getBean(ProtocolConfigRegistry.class); + protocolConfigList = registry.getProtocolConfigList(firstChar); + } + + public List getMatchList() { + return protocolConfigList; + } + + /** + * 设置当前协议 + * + * @param protocolConfig + */ + public ProtocolConfigProvider(ProtocolConfig protocolConfig) { + List protocolConfigs = new ArrayList<>(); + protocolConfigs.add(protocolConfig); + protocolConfigList = protocolConfigs; + } + + /** + * 获取当前协议 + * + * @return + */ + public ProtocolConfig getCurrentProtocolConfig() { + if (this.protocolConfigList == null) { + return null; + } else { + return protocolConfigList.get(0); + } + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java new file mode 100644 index 0000000..043927d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java @@ -0,0 +1,213 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.registry.ProtocolFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolFieldConfigProvider { + + private static final String FIXED_FIELD_DS = "fixedFieldDs"; + private static final String CONTENT_FIELD_DS = "contentFieldDs"; + private static final String PROTOCOL_LENGTH = "protocolLength"; + private static final String PROTOCOL_FIELD_ID = "protocolFieldId"; + private static final String PROTOCOL_POSITION = "protocolPosition"; + + private final List protocolFieldConfigs; + private Map singleObjects = new ConcurrentHashMap<>(); + private Map storeObjectMap = new HashMap<>(); + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public ProtocolFieldConfigProvider(Long protocolId) { + ProtocolFieldConfigRegistry protocolFieldConfigRegistry = SpringContextUtil.getBean(ProtocolFieldConfigRegistry.class); + protocolFieldConfigs = protocolFieldConfigRegistry.getProtocolFieldConfigList(protocolId); + } + + public List getProtocolFieldConfigs() { + return protocolFieldConfigs; + } + + public ProtocolFieldConfig getFieldConfigById(Long fieldId) { + Optional optionalConfig = protocolFieldConfigs.stream().filter( + e -> e.getId().equals(fieldId) + ).findFirst(); + return optionalConfig.isPresent() ? optionalConfig.get() : null; + } + + public Integer getProtocolFieldValue(Long protocolFieldId, ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_FIELD_ID + protocolFieldId + ByteBufUtil.hexDump(byteBuf); + //获取缓存 + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + //加载固定长度数据集合 + Map fixDataMap = this.getProtocolDataMap(byteBuf); + ProtocolFieldConfig protocolFieldConfig = selectFieldConfig(protocolFieldId); + Integer protocolFieldValue = 0; + //获取约定字段的总长度 + if (fixDataMap.containsKey(protocolFieldConfig.getFieldName())) { + Object appointUnpackObject = fixDataMap.get(protocolFieldConfig.getFieldName()); + if (ObjectUtils.isNotEmpty(appointUnpackObject)) { + protocolFieldValue = (Integer) appointUnpackObject; + } + } + if (protocolFieldValue != null) { + //加入缓存 + if (ObjectUtils.isNotEmpty(protocolFieldValue)) { + this.singleObjects.put(catchKey, protocolFieldValue); + return protocolFieldValue; + } + } + return null; + } + + /** + * 获取帧固定位置信息 + * + * @param byteBuf + * @param protocolConfig + * @return + */ + public Map getFixedProperty(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_POSITION + protocolConfig.getId(); + if (this.singleObjects.containsKey(catchKey)) { + return (Map) singleObjects.get(catchKey); + } + Map fixedPropertyMap = new HashMap<>(); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + fixedPropertyMap = fieldParser.doGetFixedProperty(protocolFieldConfigs, this.getTotalLength(byteBuf,protocolConfig)); + if (CollectionUtils.isNotEmpty(fixedPropertyMap)) { + this.singleObjects.put(catchKey, fixedPropertyMap); + return fixedPropertyMap; + } + return fixedPropertyMap; + } + + /** + * 获取帧结构应有的总长度 + */ + public Integer getTotalLength(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_LENGTH + ByteBufUtil.hexDump(byteBuf); + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + Integer appointFrameLength = getProtocolFieldValue(protocolConfig.getTotalLengthId(), byteBuf); + if (appointFrameLength != null) { + //获取过滤的字段集合总长度 + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Integer totalFilterLength = fieldParser.getTotalFilterLength(protocolConfig, byteBuf, getFixFieldConfigMap()); + //计算总长度 + Integer totalLength = appointFrameLength + totalFilterLength; + //加入缓存 + if (ObjectUtils.isNotEmpty(totalLength)) { + this.singleObjects.put(catchKey, totalLength); + return totalLength; + } + } + return null; + } + + /** + * 获取协议有关字段解析内容 + * storeObjectMap存储代转存的数据 + * + * @return + */ + public Map getProtocolDataMap(ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(FIXED_FIELD_DS)) { + return (Map) singleObjects.get(FIXED_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(protocolFieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + this.singleObjects.put(FIXED_FIELD_DS, fixDataMap); + return fixDataMap; + } + return null; + } + + /** + * 获取业务报文内容的content字节 + * + * @param wholeDatagramByte + * @return + */ + public ByteBuf getDataContentBuf(ByteBuf wholeDatagramByte) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(CONTENT_FIELD_DS)) { + return (ByteBuf) singleObjects.get(CONTENT_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + ByteBuf bizDataByteBuf = fieldParser.getDataContentBuf(protocolFieldConfigs, wholeDatagramByte); + if (bizDataByteBuf != null) { + this.singleObjects.put(CONTENT_FIELD_DS, bizDataByteBuf); + return bizDataByteBuf; + } + return null; + } + + + private ProtocolFieldConfig selectFieldConfig(Long id) { + Optional optionalProtocolFieldConfig = this.protocolFieldConfigs.stream().filter( + e -> e.getId().equals(id) + ).findFirst(); + return optionalProtocolFieldConfig.isPresent() ? optionalProtocolFieldConfig.get() : null; + } + + + private Map getFixFieldConfigMap() { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, e -> e) + ); + return fixDataFieldMap; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(protocolFieldConfigs) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java new file mode 100644 index 0000000..dafba1c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java @@ -0,0 +1,56 @@ +package com.casic.missiles.parser.provider; + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.rule.GenericRuleResolver; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.RuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleConfigProvider { + + private final List ruleConfigs; + + public List getRuleConfigs() { + return ruleConfigs; + } + + public RuleConfigProvider(Long protocolId) { + RuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(RuleConfigRegistry.class); + ruleConfigs = ruleConfigRegistry.getRuleConfigById(protocolId); + } + + /** + * 获取规则匹配结果 + * + * @param parseFixedDataMap + * @param protocolFieldConfigs + * @return + */ + public RuleConfig doGetRule(Map parseFixedDataMap, + String ids, + List protocolFieldConfigs) { + if (showSkip()) { + return null; + } + RuleConfig ruleConfig = GenericRuleResolver.machRule(parseFixedDataMap, ids, protocolFieldConfigs, ruleConfigs); + return ruleConfig; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(ruleConfigs) ? false : true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java index 3c05891..856b399 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java @@ -1,18 +1,11 @@ package com.casic.missiles.parser.resolver; -import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.springframework.web.bind.annotation.RequestBody; -import javax.annotation.Resource; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -20,19 +13,17 @@ @Slf4j public class ByteMergeProvider { - @Resource - private FieldRuleEngineMapper fieldRuleEngineMapper; - //拿到所有的值合并到一个值 - public String resolveByteMerge(List valueList, String ruletypeId, String vaildRange) { + public static String resolveByteMerge(List valueList, String ruleTypeId, String vaildRange) { String values = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Map vaildMap = getValidRangeMap(vaildRange); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(ruletypeId); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } + //暂时不处理 +// fieldRuleEngine = fieldRuleConfigMapper.selectById(ruleTypeId); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } Map env2 = new HashMap(); for (int i = 0; i < valueList.size(); i++) { if (vaildMap.containsKey(i)) { @@ -47,7 +38,7 @@ } } - private Map getValidRangeMap(String vaildRange) { + private static Map getValidRangeMap(String vaildRange) { String[] range = vaildRange.split(","); Map vaildMap = new HashMap(); for (int i = 0; i < range.length; i++) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 8d821cd..85d6bbf 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -1,9 +1,12 @@ package com.casic.missiles.parser.resolver; +import com.casic.missiles.pojo.AbstractFieldConfig; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; import io.netty.buffer.ByteBuf; +import java.util.List; import java.util.Map; /** @@ -11,18 +14,14 @@ */ public interface FieldParser { -// Map fieldProcess(String protocolContent,); - Map dataParser(RuleConfig ruleConfig, String lightText,String protocolId); + Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength); - Map fixDataParser(String protocolId, ByteBuf buffer); + Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap); - Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf); + ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer); - ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer); - - ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer); - - Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer); + Integer getTotalFilterLength(ProtocolConfig protocolConfig, ByteBuf byteBuf, Map protocolFieldConfigMap); } + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java new file mode 100644 index 0000000..9e0c00e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java @@ -0,0 +1,52 @@ +package com.casic.missiles.parser.resolver; + +import com.casic.missiles.pojo.AbstractFieldConfig; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.util.List; + +public class FieldParserSupport { + + //分别计算bit和byte长度=> 合并长度 + protected Integer calculateLength(List fieldConfigList) { + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + Integer fixedLength = bytefixedLength + bitfixedLength / 8; + return fixedLength; + } + + //找到最大值=> 根据最大值计算业务数据下标 + protected Integer calculatePosition(List fieldConfigList) { + String rex = "[0-9]+"; + Integer max = -1; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) + && Integer.valueOf(fieldConfig.getOriginPositionByte()) > max) { + max = Integer.valueOf(fieldConfig.getOriginPositionByte()); + } + } + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) && fieldConfig.getOriginPositionByte().equals(max)) { + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + } + } + Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; + return maxFixedPosition; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java deleted file mode 100644 index dd3a6cd..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java +++ /dev/null @@ -1,170 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.ByteResolverParam; -import io.netty.buffer.ByteBuf; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -/** - * 字段解析管理总类 - */ -@Service -@Slf4j -@AllArgsConstructor -public class FieldResolver extends ByteMergeProvider { - - //1、字段截取 => 2、简单的字节解析和复杂的字节解析 - public Object filedParserManger(ByteBuf byteBuf, FieldConfig fieldConfig, Integer maxFixedPosition) { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - //最大固定位置不为空, - if (!ObjectUtil.isEmpty(maxFixedPosition)) { - orignPosition -= maxFixedPosition; - } - Object fieldValue = 0; - //待优化 - if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { - fieldValue = bitToResolver(byteBuf, fieldConfig); - } else { - ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); - fieldValue = parsingFields(fieldBytes, fieldConfig.getRuleJson()); - } - return fieldValue; - } - - //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, - //目前默认配置的规则设置暂不支持配置化,由实现完成 - private Object parsingFields(ByteBuf byteBuf, String ruleJson) { - Object fieldsResolveValue = null; - List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); - if (ObjectUtil.isEmpty(ruleMapList)) { - fieldsResolveValue = defaultResolveBuilder(byteBuf); - } else { - fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); - } - return fieldsResolveValue; - } - - private Object defaultResolveBuilder(ByteBuf byteBuf) { - Integer defaultResolveValue = 0; - for (int i = 0; i < byteBuf.writerIndex(); i++) { - defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; - } - return defaultResolveValue; - } - - //字段解析构建器(针对字节单位的) - //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 - // 字节归并结束或者规则结束=>继续根据规则进行判断 - private Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { - Object customizeResolveValue = null; - try { - List bytStrList = new ArrayList<>(); - //存放到数组里面 - for (int i = 0; i < byteBuf.writerIndex(); i++) { - bytStrList.add(byteBuf.readByte()); - } - int i = 0; - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - customizeResolveValue = this.resolveByteMerge(bytStrList, ruletypeId,vaildRange); - break; - } else { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - List tempBytStr = new ArrayList<>(); - for (int k = 0; i < bytStrList.size(); i++) { - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(k) - .value(bytStrList.get(k)) - .ruletypeId(ruletypeId).build(); - tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); - } - bytStrList = tempBytStr; - } - i++; - } - //字节归并到一起=>继续根据规则进行判断 - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(customizeResolveValue) - .ruletypeId(ruletypeId).build(); - customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(customizeResolveValue)); - return customizeResolveValue; - } catch (RuntimeException ex) { - log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); - return null; - } - } - - /** - * 1、单个字节情况表示字段 - * 2、多字节情况表示字段(暂未处理) - */ - private Object bitToResolver(ByteBuf byteBuf, FieldConfig fieldConfig) { - Object fieldValue = new Object(); - try { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - byte fields = 0x00; - if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); - } else { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); - } - - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { - if (!StringUtils.isEmpty(fieldConfig.getExactOrignPosition())) { - fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getExactOrignPosition())).byteValue() - >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); - } else { - fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); - } - } else { - fieldValue = Integer.valueOf(fields & 0xff); - } - if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { - return fieldValue; - } - List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); - int i = 0; - //字节归并到一起=>继续根据规则进行判断 - while (i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(fieldValue) - .ruletypeId(ruletypeId).build(); - fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(fieldValue)); - return fieldValue; - } catch (RuntimeException ex) { - log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); - return null; - } - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java new file mode 100644 index 0000000..1d2aeab --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java @@ -0,0 +1,36 @@ +package com.casic.missiles.parser.resolver.bytes; + +import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.mapper.FieldRuleConfigMapper; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.pojo.ByteResolverParam; +import com.googlecode.aviator.AviatorEvaluator; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; +//转换规则 +@Component("convert") +@AllArgsConstructor +@Slf4j +public class ByteRuleResolver implements ByteResolver { + + private final FieldRuleConfigMapper fieldRuleConfigMapper; + + @Override + public Object resolveOperationRule(ByteResolverParam byteResolverParam){ + FieldRuleConfig fieldRuleEngine=fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); + if(ObjectUtil.isEmpty(fieldRuleEngine)){ + return byteResolverParam.getValue(); + } + String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); + Map env2 = new HashMap(); + env2.put("value", (byte) byteResolverParam.getValue()); + String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); + return values; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java index 103821c..786b71c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java @@ -2,34 +2,34 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("logicalShift") +@Component("logicalShift") @AllArgsConstructor @Slf4j public class LogicalShiftResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //字节位移 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { Integer index = byteResolverParam.getIndex(); - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return byteResolverParam.getValue(); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java index 476747d..01149bd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("operation") +@Component("operation") @AllArgsConstructor @Slf4j public class OperationResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //混合运算,有常量或者乘除的缩放 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java index 0b82cf4..79abcce 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.casic.missiles.pojo.ByteResolverParam; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; //精度计算 -@Service("precision") +@Component("precision") @AllArgsConstructor @Slf4j public class PrecisionResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java deleted file mode 100644 index 5c3f332..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; -//转换规则 -@Service("convert") -@AllArgsConstructor -@Slf4j -public class RuleResolver implements ByteResolver { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam){ - RuleEvaluator fieldRuleEngine=fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); - if(ObjectUtil.isEmpty(fieldRuleEngine)){ - return byteResolverParam.getValue(); - } - String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); - Map env2 = new HashMap(); - env2.put("value", (byte) byteResolverParam.getValue()); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java new file mode 100644 index 0000000..d3bbd91 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java @@ -0,0 +1,15 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; + +import java.util.List; +import java.util.Map; +// 前导码匹配->长度字段 +public interface AbstractCombinedFieldProcessor { + + Map invoke(Map map, ByteBuf byteBuf, List combinedFieldConfigList, + Map fieldConfigsMap, Map storeObjectMap); + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java new file mode 100644 index 0000000..03c8480 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java @@ -0,0 +1,59 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-13 + */ +//依次递增进行数据的解析, +public class GenericCombinedFieldResolver { + + + //通过查询,字段长度长度随机 + public void parseDataField(List combinedFieldConfigList, ByteBuf byteBuf, + Map storeObjectMap, Map fieldConfigsMap) { + Integer frameLength = Integer.valueOf(ByteBufUtil.hexDump(byteBuf)); + //添加前置处理器 + com.casic.missiles.util.ClassUtil classUtil = new com.casic.missiles.util.ClassUtil(); + List abstractCombinedProcessors = classUtil.getSubClassList(AbstractCombinedFieldProcessor.class); + + Map fieldFixedMap = combinedFieldLeadCodeMap(combinedFieldConfigList); + //frameLength + Map combinedProcessorFields = null; + while (byteBuf.readableBytes() < frameLength) { + //一直处理 + for (AbstractCombinedFieldProcessor abstractCombinedProcessor : abstractCombinedProcessors) { + combinedProcessorFields = abstractCombinedProcessor.invoke(combinedProcessorFields, byteBuf, + combinedFieldConfigList, + fieldConfigsMap, storeObjectMap); + if (combinedProcessorFields == null || byteBuf.readableBytes() < frameLength) { + return; + } + } + + } + } + + /** + * 取出前导码匹配集合 + */ + private Map combinedFieldLeadCodeMap(List combinedFieldConfigList) { + Map fieldFixedMap = combinedFieldConfigList + .stream() + .collect(Collectors.toMap(CombinedFieldConfig::getPrefixCode, e -> e)); + return fieldFixedMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java new file mode 100644 index 0000000..643a934 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java @@ -0,0 +1,100 @@ +package com.casic.missiles.parser.resolver.fields; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.FieldParserSupport; +import com.casic.missiles.pojo.*; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 保存使用时最基本的信息,并且使用原型模式 + */ +@Slf4j +public class DefaultProtocolFieldParser extends FieldParserSupport implements FieldParser, FixedPropertyEnum { + + //通过传入的配置和报文进行字段解析 + @Override + public Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap) { + Map dataMap = new HashMap<>(); + for (AbstractFieldConfig protocolFieldConfig : protocolFieldConfigs) { + if (!ObjectUtils.isEmpty(protocolFieldConfig.getOriginPositionByte())) { + Object fieldValue = FieldResolver.parseField(buffer, protocolFieldConfig, null); + if (protocolFieldConfig.getIsStorage() == 1) { + storeObjectMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + dataMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + } + return dataMap; + } + + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength) { + Map fixedPropertyMap = new HashMap<>(); + Integer fixedLength = calculateLength(protocolFieldConfigs); + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + fixedPropertyMap.put(FIXED_POSITION, maxFixedPosition); + fixedPropertyMap.put(TOTAL_LENGTH, totalLength); + fixedPropertyMap.put(TAIL_POSITION, totalLength - fixedLength + maxFixedPosition); + return fixedPropertyMap; + } + + //** 获取业务内容的byteBuf + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer) { + //计算固定长度 + Integer fixedLength = calculateLength(protocolFieldConfigs); + //总长度获取 + String lightText = buffer.toString(Charset.forName("ISO-8859-1")); + Integer totalLength = lightText.length(); + //计算固定长度最大长度 + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + //计算数据报文内容 + ByteBuf bizDataFields = buffer.slice(maxFixedPosition - 1, (totalLength - fixedLength)); + return bizDataFields; + } + + /** + * 获取过滤字段的长度 + */ + @Override + public Integer getTotalFilterLength(ProtocolConfig protocolConfig, + ByteBuf byteBuf, + Map protocolFieldConfigMap) { + if (ByteBufUtil.hexDump(byteBuf).equals("")) { + return 0; + } + int totalFilterLength = 0; + String filterFields = protocolConfig.getTotalLengthFilterFields(); + try { + if (!StringUtils.isEmpty(filterFields)) { + String[] filterFieldList = filterFields.split(","); + for (String filterFieldId : filterFieldList) { + if (StringUtils.isNotEmpty(filterFieldId)) { + ProtocolFieldConfig fieldConfig = protocolFieldConfigMap.get(Long.valueOf(filterFieldId)); + //这里都是按字节计算,没有对位进行区分,可能会出现错误 + // 如果对位有需求,需要进一步跟进 + totalFilterLength += fieldConfig.getOffsetLength(); + } + } + } + return totalFilterLength; + } catch (Exception ex) { + log.error("报文确认分发阶段,获取报文总长度过滤长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); + } + return totalFilterLength; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java new file mode 100644 index 0000000..d51e887 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java @@ -0,0 +1,169 @@ +package com.casic.missiles.parser.resolver.fields; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.parser.resolver.ByteMergeProvider; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.AbstractFieldConfig; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.pojo.ByteResolverParam; +import io.netty.buffer.ByteBuf; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * 字段解析管理总类 + */ +@Slf4j +public class FieldResolver extends ByteMergeProvider { + + //1、字段截取 => 2、简单的字节解析和复杂的字节解析 + public static Object parseField(ByteBuf byteBuf,AbstractFieldConfig fieldConfig, Integer maxFixedPosition) { + Integer orignPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + //最大固定位置不为空, + if (!ObjectUtil.isEmpty(maxFixedPosition)) { + orignPosition -= maxFixedPosition; + } + Object fieldValue = 0; + //待优化 + if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { + fieldValue = doParseBitField(byteBuf, fieldConfig); + } else { + ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); + fieldValue = doParseByteField(fieldBytes, fieldConfig.getRuleJson()); + } + return fieldValue; + } + + //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, + //目前默认配置的规则设置暂不支持配置化,由实现完成 + private static Object doParseByteField(ByteBuf byteBuf, String ruleJson) { + Object fieldsResolveValue = null; + List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); + if (ObjectUtil.isEmpty(ruleMapList)) { + fieldsResolveValue = defaultResolveBuilder(byteBuf); + } else { + fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); + } + return fieldsResolveValue; + } + + private static Object defaultResolveBuilder(ByteBuf byteBuf) { + Integer defaultResolveValue = 0; + for (int i = 0; i < byteBuf.writerIndex(); i++) { + defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; + } + return defaultResolveValue; + } + + //字段解析构建器(针对字节单位的) + //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 + // 字节归并结束或者规则结束=>继续根据规则进行判断 + private static Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { + Object customizeResolveValue = null; + try { + List bytStrList = new ArrayList<>(); + //存放到数组里面 + for (int i = 0; i < byteBuf.writerIndex(); i++) { + bytStrList.add(byteBuf.readByte()); + } + int i = 0; + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { + if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + customizeResolveValue = resolveByteMerge(bytStrList, ruletypeId, vaildRange); + break; + } else { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + List tempBytStr = new ArrayList<>(); + for (int k = 0; i < bytStrList.size(); i++) { + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(k) + .value(bytStrList.get(k)) + .ruletypeId(ruletypeId).build(); + tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); + } + bytStrList = tempBytStr; + } + i++; + } + //字节归并到一起=>继续根据规则进行判断 + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(null) + .value(customizeResolveValue) + .ruletypeId(ruletypeId).build(); + customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); + i++; + } + System.out.println(JSON.toJSON(customizeResolveValue)); + return customizeResolveValue; + } catch (RuntimeException ex) { + log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); + return null; + } + } + + /** + * 1、单个字节情况表示字段 + * 2、多字节情况表示字段(暂未处理) + */ + private static Object doParseBitField(ByteBuf byteBuf,AbstractFieldConfig fieldConfig) { + Object fieldValue = new Object(); + try { + Integer orignPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + byte fields = 0x00; + if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { + fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); + } else { + fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); + } + + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { + if (!StringUtils.isEmpty(fieldConfig.getOriginPositionBit())) { + fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getOriginPositionBit())).byteValue() + >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); + } else { + fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); + } + } else { + fieldValue = Integer.valueOf(fields & 0xff); + } + if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { + return fieldValue; + } + List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); + int i = 0; + //字节归并到一起=>继续根据规则进行判断 + while (i < ruleMapList.size()) { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(null) + .value(fieldValue) + .ruletypeId(ruletypeId).build(); + fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); + i++; + } + System.out.println(JSON.toJSON(fieldValue)); + return fieldValue; + } catch (RuntimeException ex) { + log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); + return null; + } + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java deleted file mode 100644 index 35ae3d0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java +++ /dev/null @@ -1,183 +0,0 @@ -package com.casic.missiles.parser.resolver.fields; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufAllocator; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; -import org.springframework.util.ObjectUtils; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service("standard") -@AllArgsConstructor -@Slf4j -public class StandardFieldParser implements FieldParser { - - private final FieldConfigDao fieldConfigDao; - private final FieldResolver fieldResolver; - - //数据解析 - @Override - public Map dataParser(RuleConfig ruleConfig, String lightText, String protocolId) { - String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); - ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); - bufferContent.writeBytes(lightText.getBytes(Charset.forName("ISO-8859-1"))); - Map dataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - for (String dataFieldId : dataFieldIds) { - FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(dataFieldId); - if (!ObjectUtils.isEmpty(fieldConfig)) { - dataMap.put(fieldConfig.getFieldName(), String.valueOf(fieldResolver.filedParserManger(bufferContent, fieldConfig, maxFixedPosition))); - } - } - return dataMap; - } - - //数据解析 - @Override - public Map fixDataParser(String protocolId, ByteBuf buffer) { - List dataFieldIdList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Map dataMap = new HashMap<>(); - for (FieldConfig dataField : dataFieldIdList) { - if (!ObjectUtils.isEmpty(dataField.getOrignPosition())) { - Object fieldValue = (Integer) fieldResolver.filedParserManger(buffer, dataField, null); - dataMap.put(dataField.getFieldName(), fieldValue); - } - } - return dataMap; - } - - @Override - public Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf) { - if (ByteBufUtil.hexDump(byteBuf).equals("")) { - return 0; - } - String filterFields = protocolConfig.getTotalLengthFilterField(); - Integer totalLength = 0; - try { - FieldConfig totalFieldConfig = fieldConfigDao.getFieldConfigById(protocolConfig.getTotalLengthId()); - int totalFilterLength = 0; - if (!StringUtils.isEmpty(filterFields)) { - String[] filterFieldList = filterFields.split(","); - for (String filterField : filterFieldList) { - FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(filterField); - //这里都是按字节计算,没有对位进行区分,可能会出现错误 - - // 如果对位有需求,需要进一步跟进 - totalFilterLength += fieldConfig.getOffsetLength(); - } - } - totalLength = (Integer) fieldResolver.filedParserManger(byteBuf, totalFieldConfig, null) + totalFilterLength; - } catch (Exception ex) { - log.error("报文确认分发阶段,获取报文总长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); - } - return totalLength; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer) { - //业务内容 - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - String protocolId = String.valueOf(protocolConfig.getId()); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - //计算固定长度 - Integer fixedLength = calculateLength(fieldConfigList); -// Integer totalLength = this.getTotalLength(protocolConfig, buffer); - //总长度获取 - Integer totalLength = lightText.length(); - //计算固定长度最大长度 - Integer maxFixedPosition = calculatePosition(fieldConfigList); -// buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - //计算数据报文内容 - ByteBuf bizDataFields = buffer.slice(maxFixedPosition-1, (totalLength - fixedLength)); - return bizDataFields; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer) { - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - String protocolId = String.valueOf(protocolConfig.getId()); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer fixedLength = calculateLength(fieldConfigList); -// Integer totalLength = this.getTotalLength(protocolConfig, buffer); - Integer totalLength = lightText.length(); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - ByteBuf fixDataFields = buffer.slice(0, maxFixedPosition); - return fixDataFields; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer) { - String protocolId = String.valueOf(protocolConfig.getId()); - Map fixedPropertyMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer fixedLength = calculateLength(fieldConfigList); - Integer totalLength = this.getTotalLength(protocolConfig, buffer); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - fixedPropertyMap.put("fixedPosition", maxFixedPosition); - fixedPropertyMap.put("totalLength", totalLength); - fixedPropertyMap.put("tailPosition", totalLength - fixedLength + maxFixedPosition); - return fixedPropertyMap; - } - - //分别计算bit和byte长度=> 合并长度 - private Integer calculateLength(List fieldConfigList) { - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (FieldConfig fieldConfig : fieldConfigList) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - Integer fixedLength = bytefixedLength + bitfixedLength / 8; - return fixedLength; - } - - //找到最大值=> 根据最大值计算业务数据下标 - private Integer calculatePosition(List fieldConfigList) { - String rex = "[0-9]+"; - Integer max = -1; - for (FieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOrignPosition()) - && Integer.valueOf(fieldConfig.getOrignPosition()) > max) { - max = Integer.valueOf(fieldConfig.getOrignPosition()); - } - } - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (FieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOrignPosition()) && fieldConfig.getOrignPosition().equals(max)) { - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - } - } - Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; - return maxFixedPosition; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java new file mode 100644 index 0000000..d4ec6c7 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java @@ -0,0 +1,76 @@ +package com.casic.missiles.parser.rule; + +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import org.apache.commons.lang3.StringUtils; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class GenericRuleResolver { + + //根据前置字段的值,找到指定的规则 + //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 + //=>循环判断=>通过规则得到业务字段 + public static RuleConfig machRule(Map fixDataMap, + String ids, + List protocolFieldConfigs, + List ruleConfigs) { + List preRuleConfigList = getPreRuleList(ids, protocolFieldConfigs); + //获取前置规则字段 + final Map metaDataMap = getPreRuleFields(preRuleConfigList, fixDataMap); + //准备固定的字段集合 + Map fixDataFieldMap = getFixDataFieldMap(protocolFieldConfigs); + return RuleResolverCore.doMachRule(ruleConfigs, metaDataMap, fixDataMap, fixDataFieldMap); + } + + private static Map getFixDataFieldMap(List protocolFieldConfigs) { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, ProtocolFieldConfig::getFieldName) + ); + return fixDataFieldMap; + } + + + /** + * 查询前置规则的字段配置 + * + * @param ids + * @return + */ + private static List getPreRuleList(String ids, List protocolFieldConfigs) { + String[] idList = ids.split(","); + Map prepareMaps = new HashMap<>(); + for (String id : idList) { + if (StringUtils.isNotEmpty(id)) { + prepareMaps.put(Long.valueOf(id), ""); + } + } + List preRuleConfigList = protocolFieldConfigs + .stream() + .filter(e -> prepareMaps.containsKey(e.getId())) + .collect(Collectors.toList()); + return preRuleConfigList; + } + + /** + * 获取前置规则解析字段 + */ + private static Map getPreRuleFields(List preRuleFieldConfigList, Map fixDataMap) { + Map ruleFieldMap = new HashMap<>(); + preRuleFieldConfigList.stream() + .forEach( + preRuleFieldConfig -> { + String fieldName = preRuleFieldConfig.getFieldName(); + if (fixDataMap.containsKey(fieldName)) { + ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); + } + } + ); + return ruleFieldMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java new file mode 100644 index 0000000..baae7e8 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -0,0 +1,68 @@ +package com.casic.missiles.parser.rule; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.casic.missiles.pojo.RuleConfig; + +import java.util.*; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleResolverCore { + + + public static RuleConfig doMachRule(List ruleConfigList, Map metaDataMap, + Map fixDataMap, + Map fixDataFieldMap) { + Optional ruleConfigOptional = ruleConfigList.stream() + .filter(ruleConfig -> machRuleConfig( + JSON.parseObject(ruleConfig.getMatchRuleJson(), Map.class), metaDataMap)) + .findFirst(); + if (ObjectUtil.isEmpty(ruleConfigOptional)) { + return null; + } + String[] ruleFields = ruleConfigOptional.get().getDataFieldIds().split(","); + Map ruleMetaDataMap = getRuleFields(ruleFields, fixDataMap, fixDataFieldMap); + //递归选定解析规则,进行规则解析 + if (!ruleConfigOptional.get().getIsFinishMatch().equals("1")) { + //递归选定规则 + doMachRule(ruleConfigList, ruleMetaDataMap, fixDataMap, fixDataFieldMap); + } + return ruleConfigOptional.get(); + } + + + private static Map getRuleFields(String[] preRuleConfigList, Map fixedDataMap, + Map fixedFieldMap) { + Map ruleFieldMap = new HashMap<>(); + for (String preRuleConfigId : preRuleConfigList) { + String fieldName = fixedFieldMap.get(preRuleConfigId); + if (fixedDataMap.containsKey(fieldName)) { + ruleFieldMap.put(fieldName, String.valueOf(fixedDataMap.get(fieldName))); + } + } + return ruleFieldMap; + } + + + //匹配规则配置 + private static Boolean machRuleConfig(Map ruleMap, Map metaDataMap) { + if (ruleMap == null || metaDataMap == null) { + return null; + } + //所有的字段在规则里面必须有有配置 + for (String key : metaDataMap.keySet()) { + if (ruleMap.containsKey(key)) { + if (!ruleMap.get(key).equals(metaDataMap.get(key))) { + return false; + } + } else { + return false; + } + } + return true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java deleted file mode 100644 index 664088d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java +++ /dev/null @@ -1,92 +0,0 @@ -package com.casic.missiles.parser.rule; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.mapper.dao.PreRuleConfigDao; -import com.casic.missiles.mapper.dao.RuleConfigDao; -import lombok.AllArgsConstructor; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.*; -import java.util.stream.Collectors; - -@Service -@AllArgsConstructor -public class RulerProvider { - - private final FieldConfigDao fieldConfigDao; - private final PreRuleConfigDao preRuleConfigDao; - private final RuleConfigDao ruleConfigDao; - - //根据前置字段的值,找到指定的规则 - //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 - //=>循环判断=>通过规则得到业务字段 - public RuleConfig ruleConfig(Map fixDataMap, String protocolId) { - //批量获取规则 - List preRuleConfigList = preRuleConfigDao.getPreRuleList(protocolId); - //获取固定字段 - Map fixFieldMap = getAllFieldMap(protocolId); - //获取前置规则字段 - final String preRuleFields = getPreRuleFields(preRuleConfigList, fixDataMap, fixFieldMap); - List ruleConfigList = ruleConfigDao.getRuleConfigById(protocolId); - Optional ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig ->preRuleFields.equals( ruleConfig.getParseRuleJson())).findFirst(); - //递归选定解析规则,进行规则解析 - while (!ObjectUtil.isEmpty(ruleConfigOptional) && !ruleConfigOptional.get().getIsBizField().equals("1")) { - String ruleFields = getRuleFields(ruleConfigOptional.get().getDataFieldIds().split(","), fixDataMap, fixFieldMap); - ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig -> ruleConfig.getParseRuleJson().equals(ruleFields)).findFirst(); - } - return ruleConfigOptional.get(); - } - - /** - * 获取前置规则解析字段 - */ - private String getPreRuleFields(List preRuleConfigList, Map fixDataMap, Map fixFieldMap) { - Map ruleFieldMap= new HashMap<>(); - preRuleConfigList.stream() - .forEach( - preRuleConfig -> { - String fieldName = fixFieldMap.get(Long.valueOf(preRuleConfig.getRuleFieldId())); - if (fixDataMap.containsKey(fieldName)) { - ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); - } - } - ); - return JSONObject.toJSONString(ruleFieldMap); - } - - private Map getAllFieldMap(String protocolId) { - List fieldList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Map fixFieldMap = fieldList.stream().collect( - Collectors.toMap(FieldConfig::getId, FieldConfig::getFieldName) - ); - return fixFieldMap; - } - - private String getRuleFields(String[] preRuleConfigList, Map fixDataMap, Map fixFieldMap) { - Map ruleFieldMap= new HashMap<>(); - for (String preRuleConfigId : preRuleConfigList) { - String fieldName = fixFieldMap.get(preRuleConfigId); - if (fixDataMap.containsKey(fieldName)) { - ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); - } - } - return JSONObject.toJSONString(ruleFieldMap); - } - - //弃置 - private String ListToString(List ruleFieldList) { - String ruleFields = ""; - for (String ruleField : ruleFieldList) { - ruleFields += ruleField + ","; - } - ruleFields = StringUtils.isEmpty(ruleFields) ? ruleFields : ruleFields.substring(0, ruleFields.length() - 1); - return ruleFields; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java index 6177e10..bfa87a5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java @@ -2,7 +2,7 @@ public interface SafeStrategy { - String decryption(byte[] bytes); + String decryption(String cipher); String encryption(String lightText); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java index 618716c..6236302 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java @@ -9,9 +9,9 @@ //十六进制的字符串转换成字节数组 byte[] bytes = hexStrToBinaryStr(msg); //计算CRC8 - byte crc8 = CRC8(bytes, 0, bytes.length); - String crc8ToStr = "" + Integer.toHexString(0xff & crc8); - return crc8ToStr; +// String crc8ToStr = "" + Integer.toHexString(0xff & crc8); +// return crc8ToStr; + return null; } /** @@ -33,50 +33,5 @@ return bytes; } - /** - * CRC8 校验 多项式 x8+x2+x+1 - * - * @param b - * @param off - * @param len - * @return - */ - public static byte CRC8(final byte[] b, final int off, final int len) { - byte result = 0x00; - for (int i = 0; i < len; i++) { - result = CHECKSUM_TABLE[(result ^ (b[i + off] & 0xFF)) & 0xFF]; - } - return (byte) (result & 0xFFL); - } - - private final static byte[] CHECKSUM_TABLE = {(byte) 0x00, (byte) 0x07, (byte) 0x0e, (byte) 0x09, (byte) 0x1c, (byte) 0x1b, - (byte) 0x12, (byte) 0x15, (byte) 0x38, (byte) 0x3f, (byte) 0x36, (byte) 0x31, (byte) 0x24, (byte) 0x23, (byte) 0x2a, - (byte) 0x2d, (byte) 0x70, (byte) 0x77, (byte) 0x7e, (byte) 0x79, (byte) 0x6c, (byte) 0x6b, (byte) 0x62, (byte) 0x65, - (byte) 0x48, (byte) 0x4f, (byte) 0x46, (byte) 0x41, (byte) 0x54, (byte) 0x53, (byte) 0x5a, (byte) 0x5d, (byte) 0xe0, - (byte) 0xe7, (byte) 0xee, (byte) 0xe9, (byte) 0xfc, (byte) 0xfb, (byte) 0xf2, (byte) 0xf5, (byte) 0xd8, (byte) 0xdf, - (byte) 0xd6, (byte) 0xd1, (byte) 0xc4, (byte) 0xc3, (byte) 0xca, (byte) 0xcd, (byte) 0x90, (byte) 0x97, (byte) 0x9e, - (byte) 0x99, (byte) 0x8c, (byte) 0x8b, (byte) 0x82, (byte) 0x85, (byte) 0xa8, (byte) 0xaf, (byte) 0xa6, (byte) 0xa1, - (byte) 0xb4, (byte) 0xb3, (byte) 0xba, (byte) 0xbd, (byte) 0xc7, (byte) 0xc0, (byte) 0xc9, (byte) 0xce, (byte) 0xdb, - (byte) 0xdc, (byte) 0xd5, (byte) 0xd2, (byte) 0xff, (byte) 0xf8, (byte) 0xf1, (byte) 0xf6, (byte) 0xe3, (byte) 0xe4, - (byte) 0xed, (byte) 0xea, (byte) 0xb7, (byte) 0xb0, (byte) 0xb9, (byte) 0xbe, (byte) 0xab, (byte) 0xac, (byte) 0xa5, - (byte) 0xa2, (byte) 0x8f, (byte) 0x88, (byte) 0x81, (byte) 0x86, (byte) 0x93, (byte) 0x94, (byte) 0x9d, (byte) 0x9a, - (byte) 0x27, (byte) 0x20, (byte) 0x29, (byte) 0x2e, (byte) 0x3b, (byte) 0x3c, (byte) 0x35, (byte) 0x32, (byte) 0x1f, - (byte) 0x18, (byte) 0x11, (byte) 0x16, (byte) 0x03, (byte) 0x04, (byte) 0x0d, (byte) 0x0a, (byte) 0x57, (byte) 0x50, - (byte) 0x59, (byte) 0x5e, (byte) 0x4b, (byte) 0x4c, (byte) 0x45, (byte) 0x42, (byte) 0x6f, (byte) 0x68, (byte) 0x61, - (byte) 0x66, (byte) 0x73, (byte) 0x74, (byte) 0x7d, (byte) 0x7a, (byte) 0x89, (byte) 0x8e, (byte) 0x87, (byte) 0x80, - (byte) 0x95, (byte) 0x92, (byte) 0x9b, (byte) 0x9c, (byte) 0xb1, (byte) 0xb6, (byte) 0xbf, (byte) 0xb8, (byte) 0xad, - (byte) 0xaa, (byte) 0xa3, (byte) 0xa4, (byte) 0xf9, (byte) 0xfe, (byte) 0xf7, (byte) 0xf0, (byte) 0xe5, (byte) 0xe2, - (byte) 0xeb, (byte) 0xec, (byte) 0xc1, (byte) 0xc6, (byte) 0xcf, (byte) 0xc8, (byte) 0xdd, (byte) 0xda, (byte) 0xd3, - (byte) 0xd4, (byte) 0x69, (byte) 0x6e, (byte) 0x67, (byte) 0x60, (byte) 0x75, (byte) 0x72, (byte) 0x7b, (byte) 0x7c, - (byte) 0x51, (byte) 0x56, (byte) 0x5f, (byte) 0x58, (byte) 0x4d, (byte) 0x4a, (byte) 0x43, (byte) 0x44, (byte) 0x19, - (byte) 0x1e, (byte) 0x17, (byte) 0x10, (byte) 0x05, (byte) 0x02, (byte) 0x0b, (byte) 0x0c, (byte) 0x21, (byte) 0x26, - (byte) 0x2f, (byte) 0x28, (byte) 0x3d, (byte) 0x3a, (byte) 0x33, (byte) 0x34, (byte) 0x4e, (byte) 0x49, (byte) 0x40, - (byte) 0x47, (byte) 0x52, (byte) 0x55, (byte) 0x5c, (byte) 0x5b, (byte) 0x76, (byte) 0x71, (byte) 0x78, (byte) 0x7f, - (byte) 0x6a, (byte) 0x6d, (byte) 0x64, (byte) 0x63, (byte) 0x3e, (byte) 0x39, (byte) 0x30, (byte) 0x37, (byte) 0x22, - (byte) 0x25, (byte) 0x2c, (byte) 0x2b, (byte) 0x06, (byte) 0x01, (byte) 0x08, (byte) 0x0f, (byte) 0x1a, (byte) 0x1d, - (byte) 0x14, (byte) 0x13, (byte) 0xae, (byte) 0xa9, (byte) 0xa0, (byte) 0xa7, (byte) 0xb2, (byte) 0xb5, (byte) 0xbc, - (byte) 0xbb, (byte) 0x96, (byte) 0x91, (byte) 0x98, (byte) 0x9f, (byte) 0x8a, (byte) 0x8d, (byte) 0x84, (byte) 0x83, - (byte) 0xde, (byte) 0xd9, (byte) 0xd0, (byte) 0xd7, (byte) 0xc2, (byte) 0xc5, (byte) 0xcc, (byte) 0xcb, (byte) 0xe6, - (byte) 0xe1, (byte) 0xe8, (byte) 0xef, (byte) 0xfa, (byte) 0xfd, (byte) 0xf4, (byte) 0xf3}; } \ No newline at end of file diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java index 608af3a..32cc8a4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java @@ -2,48 +2,47 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.delivery.decorator.ByteDecorator; +import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @AllArgsConstructor public class FieldDecoratorManger { - private final RuleDictDao ruleDictDao; + private final RuleConfigRegistry ruleDictDao; // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 // (1)静态的业务字段是字典里面可以配置的 // (2)动态的业务字段是通过规则生成的 public String contentMerge(String ruleJson, String sceneConent, String dynamicContent) { - List ruleDictList = ruleDictDao.getRuleDictConfig(); - Map ruleDictMap = ruleDictList.stream().collect( - Collectors.toMap(RuleDict::getId, e -> e)); - List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); - for (Map ruleMap : ruleMapList) { - String ruleType = String.valueOf(ruleMap.get("ruleType")); - ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); - NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); - byteDecorator.nodeDecoratorRule(nodeDecoratorParm); - } +// List ruleDictList = ruleDictDao.getRuleDictConfig(); +// Map ruleDictMap = ruleDictList.stream().collect( +// Collectors.toMap(RuleDict::getId, e -> e)); +// List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); +// for (Map ruleMap : ruleMapList) { +// String ruleType = String.valueOf(ruleMap.get("ruleType")); +// ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); +// NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); +// byteDecorator.nodeDecoratorRule(nodeDecoratorParm); +// } return null; } - - private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { - NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() - .contents(sceneConent) - .dynamicContent(dynamicContent) - .ruletypeId(ruletypeId) - .ruleDictMap(ruleDictMap) - .build(); - return nodeDecoratorParm; - } +// +// private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { +// NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() +// .contents(sceneConent) +// .dynamicContent(dynamicContent) +// .ruletypeId(ruletypeId) +// .ruleDictMap(ruleDictMap) +// .build(); +// return nodeDecoratorParm; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java index 652970c..b204ac3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java @@ -1,56 +1,56 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@AllArgsConstructor -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", - JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Component; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Component("logicalDecorator") +//@AllArgsConstructor +//@Slf4j +//public class LogicalShiftDecorator implements ByteDecorator { +// +//// private final FieldRuleEngineMapper fieldRuleEngineMapper; +//// +//// //字节位移 +//// @Override +//// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +//// String logicalValue = ""; +//// RuleEvaluator fieldRuleEngine = new RuleEvaluator(); +//// try { +//// Map env2 = new HashMap(); +//// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +//// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +//// for (String contentId : contentIdList) { +//// RuleDict ruleDict = ruleDictMap.get(contentId); +//// if (ruleDict.getCode().contains("#")) { +//// //使用动态的值 +//// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +//// } +//// env2.put(ruleDict.getName(), ruleDict.getCode()); +//// } +//// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +//// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +//// return null; +//// } +//// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +//// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +//// return values; +//// } catch (Exception ex) { +//// log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", +//// JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +//// return null; +//// } +//// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java index 346468f..822fead 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@AllArgsConstructor -@Slf4j -public class OperationDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("optionDecorator") +//@AllArgsConstructor +//@Slf4j +//public class OperationDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //混合运算,有常量或者乘除的缩放 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java index 50fb0a7..7a8bccb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@AllArgsConstructor -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +////精度计算 +//@AllArgsConstructor +//@Registry("precisionDecorator") +//@Slf4j +//public class PrecisionDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java index da39235..27f9cc7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java @@ -1,54 +1,53 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@AllArgsConstructor -@Slf4j -public class RuleDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("ruleDecorator") +//@AllArgsConstructor +//@Slf4j +//public class RuleDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //吃我一套正则表达式 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (Exception ex) { +// log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java index 7f5cbf3..c043f97 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java @@ -2,6 +2,6 @@ import java.util.Map; -public interface ComandeEventService { +public interface ComandeEventService{ Map loadComandeEventConfig(String protocolId,String scene); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java index 476ad84..aaf1837 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java @@ -2,46 +2,46 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.dao.CommandEventDao; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @Slf4j @AllArgsConstructor -public class ComandeEventServiceImpl implements ComandeEventService { +public class ComandeEventServiceImpl implements ComandeEventRegistry { - private final CommandEventDao commandEventDao; + // private final CommandEventDao commandEventDao; // 加密bean 固定字段出现变化的字段解析,业务字段的有序内容 @Override - public Map loadComandeEventConfig(String protocolId,String sceneName) { - CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); - if (ObjectUtil.isEmpty(commandEventConfig)) { - log.error("协议{},没有配置成功接收回复配置,清排查原因"); - return null; - } - String replyJson = commandEventConfig.getReplyContentJson(); - List> replyMapList = JSONArray.parseObject(replyJson, List.class); - List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); - Map fixMap = fixList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); - List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) - .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) - .collect(Collectors.toList()); - Map commandConfigMap = new HashMap<>(); - commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); - commandConfigMap.put("fixContent", fixMap); - commandConfigMap.put("bizContent", contentList); - return commandConfigMap; + public Map loadComandeEventConfig(String protocolId, String sceneName) { +// CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); +// if (ObjectUtil.isEmpty(commandEventConfig)) { +// log.error("协议{},没有配置成功接收回复配置,清排查原因"); +// return null; +// } +// String replyJson = commandEventConfig.getReplyContentJson(); +// List> replyMapList = JSONArray.parseObject(replyJson, List.class); +// List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); +// Map fixMap = fixList.stream() +// .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); +// List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) +// .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) +// .collect(Collectors.toList()); +// Map commandConfigMap = new HashMap<>(); +// commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); +// commandConfigMap.put("fixContent", fixMap); +// commandConfigMap.put("bizContent", contentList); +// return commandConfigMap; + return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 128b09d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java deleted file mode 100644 index 4016b0b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface DatagramEventMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java deleted file mode 100644 index 597c306..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.apache.ibatis.annotations.Mapper; - -public interface FieldConfigMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java deleted file mode 100644 index a31680a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.PreRuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface PreRuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java deleted file mode 100644 index 9060a69..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface ProtocolConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java deleted file mode 100644 index 6fa6936..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java deleted file mode 100644 index 582a705..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleDict; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleDictMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java deleted file mode 100644 index 6e302c8..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.CommandEventMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Optional; - -@Component -public class CommandEventDao { - - @Resource - private CommandEventMapper commandEventMapper; - - public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId) - .eq("scene", sceneName) - .eq("enabled", 1); - List commandEventConfig = commandEventMapper.selectList(queryWrapper); - Optional optionalEventConfig = commandEventConfig.stream().findFirst(); - return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java deleted file mode 100644 index 9137e4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.FieldConfigMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class FieldConfigDao { - - @Resource - private FieldConfigMapper fieldConfigMapper; - - public FieldConfig getFieldConfigById(String fieldId) { - FieldConfig fieldConfig = fieldConfigMapper.selectById(fieldId); - return fieldConfig; - } - - public List getFieldConfigs(String protocolId,Integer isFixed) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",isFixed); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - - public List getStorageFieldConfig(String protocolId) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",1) - .eq("is_storage",1); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java deleted file mode 100644 index 67bff6b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.mapper.PreRuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class PreRuleConfigDao { - - @Resource - private PreRuleConfigMapper preRuleConfigMapper; - - public List getPreRuleList(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return preRuleConfigMapper.selectList(queryWrapper); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java deleted file mode 100644 index d69ea85..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.RuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleConfigDao { - - @Resource - private RuleConfigMapper ruleConfigMapper; - - public RuleConfig getNextRuleConfig(String ruleFields) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("parse_rule_json", ruleFields); - return ruleConfigMapper.selectOne(queryWrapper); - } - - - public List getRuleConfigById(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return ruleConfigMapper.selectList(queryWrapper); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java deleted file mode 100644 index 932c185..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.RuleDictMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleDictDao { - - @Resource - private RuleDictMapper ruleDictMapper; - - public List getRuleDictConfig() { - List ruleDictList = ruleDictMapper.selectList(null); - return ruleDictList; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java index 9f9e279..43bc4d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java @@ -10,20 +10,15 @@ import io.netty.channel.socket.nio.NioServerSocketChannel; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import javax.annotation.PreDestroy; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static cn.hutool.core.util.ClassUtil.getClasses; /** * SensorhubServer netty服务端 */ @Slf4j -@Service +@Component public class SensorhubServer { /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java index 2c79ff5..9a28c36 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java @@ -11,13 +11,13 @@ import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioSocketChannel; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClient 客户端 */ @Slf4j -@Service +@Registry public final class SensorhubClient { public static void main(String[] args) throws Exception { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java index 9774be0..477c3f7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java @@ -6,12 +6,12 @@ import io.netty.channel.socket.SocketChannel; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientChannelInitialHandler */ -@Service +@Registry public class SensorhubClientChannelInitialHandler extends ChannelInitializer { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java index 346f4b3..73560e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java @@ -5,13 +5,13 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientHandler */ @Slf4j -@Service +@Registry public class SensorhubClientHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java index 5c1c6f2..d990af5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java @@ -4,12 +4,12 @@ import com.casic.missiles.pojo.Msg; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** * SensorhubServerHandler */ -@Service +@Component public class SensorhubServerHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 67283ae..af3172c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,41 +1,37 @@ package com.casic.missiles.parser; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultProtocolConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.*; +import com.casic.missiles.registry.FieldConfigRegistry; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; -import java.nio.charset.Charset; import java.util.HashMap; import java.util.List; import java.util.Map; -@Service("genericProtocolParser") +/** + * @author + */ +@Component("genericProtocolParser") @Slf4j -@AllArgsConstructor +@RequiredArgsConstructor public class GenericProtocolParser implements ProtocolParser { - private final LeadingCodeMatcher leadingCodeMatcher; private final List frameStructDispenserList; - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorInstanceSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; // 匹配首字母前导码=> 帧结构匹配前导码=> // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 @@ -44,18 +40,19 @@ public Boolean doParseProtocol(ByteBuf byteBuf) { String protocolContent = ByteBufUtil.hexDump(byteBuf); //匹配前导码 - List preCodeConfigs = leadingCodeMatcher.matchLeadingCode(protocolContent); + List preCodeConfigs = LeadingCodeMatcher.matchFrameLeadingCode(protocolContent); //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 if (preCodeConfigs.size() == 0) { - return rematch(byteBuf,protocolContent); + return rematch(byteBuf, protocolContent); } - //暂时先取第一个 + //暂时先取第一个,提升速度,使用享元模式, 减少类的创建销毁与构建 ProtocolConfig protocolConfig = preCodeConfigs.get(0); + AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); ByteBuf wholeDatagramByte = null; //通过匹配帧结构获取完整的数据包 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, preCodeConfigs.get(0))) != null) { + if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, protocolFactory)) != null) { break; } } @@ -68,76 +65,78 @@ * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 */ - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId, wholeDatagramByte); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap, protocolId); - //选取规则对应的流程实例 - DatagramEventConfig datagramEventConfig = processorInstanceSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); + //进行规则字段解析,进行匹配规则 + RuleConfig ruleConfig = getRuleConfig(protocolFactory, wholeDatagramByte); + if (ruleConfig == null) { + return false; + } //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, wholeDatagramByte); + ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte); + //以下进行业务的规则解析,同时选定流程实例 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); + DatagramEventProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain, + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText, protocolId); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain); //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); + datagramEventProvider.storeData(bizDataMap); return true; } - private Boolean rematch(ByteBuf byteBuf,String protocolContent) { + /** + * 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 + */ + private Boolean rematch(ByteBuf byteBuf, String protocolContent) { //重置位判断 byteBuf.resetReaderIndex(); //判断重置是否前移,如果没有前移,则直接判为匹配失败 if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { return false; } else { + //递归执行 return doParseProtocol(byteBuf); } } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; + //获取匹配规则->匹配规则 + private RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + //取出其中参与逻辑provider并判空 + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); + String rulePrepareFields = protocolConfig.getRulePrepareFields(); + //固定字段 + if (StringUtils.isNotEmpty(rulePrepareFields)) { + //获取统一固定字段解析 + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + //获取该协议的字段配置,用于协议规则匹配 + List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); + //获取规则 + RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, + rulePrepareFields, protocolFieldConfigs); + return ruleConfig; + } + return null; } - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + //数据构建,获取固定字段的store和业务字段store + private Map buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + Map bizDataMap = new HashMap<>(); + Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); + Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); + bizDataMap.putAll(ruleStoreObjectMap); + bizDataMap.putAll(protocolStoreObjectMap); return bizDataMap; } - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java index 8a46e32..16ce2e5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java @@ -3,6 +3,7 @@ import io.netty.buffer.ByteBuf; public interface ProtocolParser { + Boolean doParseProtocol(ByteBuf byteBuf); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java new file mode 100644 index 0000000..f7814af --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java @@ -0,0 +1,35 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.ProtocolConfigProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.ProtocolConfig; + +/** + * 存放基本协议的的加载信息 + */ +public class AbstractProtocolConfigFactory { + private final ProtocolConfigProvider protocolConfigProvider; + private final ProtocolFieldConfigProvider protocolFieldConfigProvider; + private final RuleConfigProvider ruleConfigProvider; + + public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { + this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); + this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); + this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); + } + + public ProtocolConfigProvider getProtocolConfigProvider() { + return protocolConfigProvider; + } + + public ProtocolFieldConfigProvider getProtocolFieldConfigProvider() { + return protocolFieldConfigProvider; + } + + public RuleConfigProvider getRuleConfigProvider() { + return ruleConfigProvider; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java new file mode 100644 index 0000000..6e36147 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java @@ -0,0 +1,57 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.CombinedFieldConfigProvider; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.FieldConfigProvider; +import com.casic.missiles.parser.provider.FieldRuleConfigProvider; + +/** + * 存放规则相关的的的加载信息 + */ +public class AbstractRuleConfigFactory { + + /** + * 处理字节 + */ + private final FieldConfigProvider fieldConfigProvider; + /** + * 处理组合字节解析的解码器 + */ + private final CombinedFieldConfigProvider combinedFieldConfigProvider; + /** + * 处理负责字节解析的规则配置 + */ + private final FieldRuleConfigProvider fieldRuleConfigProvider; + /** + * 处理实例流程 + */ + private final DatagramEventProvider datagramEventProvider; + + + public AbstractRuleConfigFactory(Long ruleId) { + this.fieldConfigProvider = new FieldConfigProvider(ruleId); + this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); + this.fieldRuleConfigProvider = new FieldRuleConfigProvider(ruleId); + this.datagramEventProvider = new DatagramEventProvider(ruleId); + } + + public FieldConfigProvider getFieldConfigProvider() { + return fieldConfigProvider; + } + + public CombinedFieldConfigProvider getCombinedFieldConfigProvider() { + return combinedFieldConfigProvider; + } + + public FieldRuleConfigProvider getFieldRuleConfigProvider() { + return fieldRuleConfigProvider; + } + + public DatagramEventProvider getDatagramEventProvider() { + return datagramEventProvider; + } + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java deleted file mode 100644 index 6e1719a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.factory; - - -import com.casic.missiles.pojo.ProtocolConfig; - -import java.util.List; - -/** - * 数据库访问优化(暂时未做) - *

- * 1、初始化协议解析配置,并存放到处存放缓存,对协议基本配置进行管理 - * 2、其中流程中所有的配置都经过此类进行管理,进行调用获取,增强解析速度 - */ -public interface DatagramFactory { - - /** - * 初始化 - */ - List datagramInit(); - - /** - * 根据前导码配置匹配,模糊匹配获取所有的报文项 - */ - List match(); - - /** - * 根据前导码匹配,返回报文项 - */ - List filer(); - - /** - * 保证数据的唯一性选择器 - */ - List selectOne(); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java new file mode 100644 index 0000000..87444a0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java @@ -0,0 +1,18 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +import java.util.List; + +/** + * 直接用,还是边用边创建 + */ +public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { + + + public DefaultProtocolConfigFactory(ProtocolConfig protocolConfig) { + super(protocolConfig); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java new file mode 100644 index 0000000..cce0c7c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java @@ -0,0 +1,12 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; + +public class DefaultRuleFactory extends AbstractRuleConfigFactory { + + public DefaultRuleFactory(Long ruleId) { + super(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java deleted file mode 100644 index 9ee97e0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.casic.missiles.parser.instance; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service -@Slf4j -@AllArgsConstructor -public class GeneralProcessor { - - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; - - /** - * 统一固定字段解析=>进行规则的查询的判断 - * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 - * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 - */ - @Deprecated - public boolean parseWholeDatagram(ByteBuf buffer, ProtocolConfig protocolConfig) { - try { - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap,protocolId); - //选取规则对应的流程= - DatagramEventConfig datagramEventConfig = processorSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); - //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); - //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); - //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); - //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); - //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); - return true; - } catch (Exception ex) { - log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", - ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); - return false; - } - } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; - } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); - } - - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); - return bizDataMap; - } - - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java index 25e7ad8..6a5777e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java @@ -1,23 +1,31 @@ package com.casic.missiles.parser.instance.impl; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.mapper.DatagramEventMapper; import com.casic.missiles.pojo.DatagramEventConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.SpringContextUtil; -@Service -@AllArgsConstructor +import java.util.List; +import java.util.Optional; + +/** + * @author cz + * + */ public class DefaultProcessorInstanceSelector implements ProcessorInstanceSelector { - private final DatagramEventMapper datagramEventMapper; + private static List datagramEventConfigs; + + static { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + datagramEventConfigs = datagramEventRegistry.getDatagramEventList(); + } @Override public DatagramEventConfig getProcessorInstance(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("rule_id", protocolId); - return datagramEventMapper.selectOne(queryWrapper); + Optional optionalSelectInstance = datagramEventConfigs.stream() + .filter(e -> e.getId().equals(protocolId)).limit(1).findFirst(); + return optionalSelectInstance.isPresent() ? optionalSelectInstance.get() : null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a778671..7b56a43 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,16 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import io.netty.buffer.ByteBuf; /** - * 分析匹配情况 - * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 - * 2、匹配不成功,有后续帧,可以进行下次匹配。 - * 3、匹配不成功,无后续帧,可以进行丢弃。 + * 分析匹配情况 + * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 + * 2、匹配不成功,有后续帧,可以进行下次匹配。 + * 3、匹配不成功,无后续帧,可以进行丢弃。 */ -public interface FrameStructMatcher{ +public interface FrameStructMatcher { - ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig); + ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 05320ab..8ebea78 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,23 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.ProtocolConfigMapper; +import com.casic.missiles.parser.provider.ProtocolConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Component; import java.util.List; import java.util.stream.Collectors; -@Component -@AllArgsConstructor public class LeadingCodeMatcher { - private final ProtocolConfigMapper protocolMapper; - //** 1、首字母匹配前导码, // 2、以匹配出的前导码是否在报文中条件进行前导码的匹配二次筛选 - public List matchLeadingCode(String protocolContent){ + public static List matchFrameLeadingCode(String protocolContent){ List initialConfigs = initialMatch(protocolContent); List preCodeConfigs = initialConfigs.stream() .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) @@ -26,13 +19,16 @@ } //初始化匹配前导码内容 - private List initialMatch(String protocolContent) { - String protocolStr = protocolContent.charAt(0) + ""; - QueryWrapper queryWrapper = new QueryWrapper() - .likeRight("pre_fix", protocolStr); - List protocolConfigList = protocolMapper.selectList(queryWrapper); - return protocolConfigList; + private static List initialMatch(String protocolContent) { + String firstFrameChar = protocolContent.charAt(0) + ""; + ProtocolConfigProvider protocolConfigProvider=new ProtocolConfigProvider(firstFrameChar); + return protocolConfigProvider.getMatchList(); } + + + + + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index cf2113d..e915877 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -1,32 +1,35 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(0) -@Service +@Component public class FrameLengthMatcher implements FrameStructMatcher { - @Autowired - private FieldParser fieldParser; - //超过长度 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { String dataGramContent = ByteBufUtil.hexDump(byteBuf); - if (StringUtils.isEmpty(protocolConfig.getUnpackId()) && StringUtils.isEmpty(protocolConfig.getTailStr())) { - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + //当不存在结尾标志和拆包标志,可以直接使用长度进行匹配 + if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { if (dataGramContent.length() >= totalLength) {//等于长度返回true,超出长度,切断 - ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, protocolConfig, totalLength); + ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, totalLength); return wholeDatagramByte; } else { //读的标志位前移舍弃 @@ -38,7 +41,7 @@ return null; } - private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, Integer totalLength) { byteBuf.readBytes(totalLength); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, totalLength - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 2bfc213..d527ad0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; @@ -13,7 +13,7 @@ import lombok.AllArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.nio.charset.Charset; import java.util.Map; @@ -22,32 +22,30 @@ * 后续标志验证 */ @Order(1) -@Service +@Component @AllArgsConstructor -public class FrameMarkMatcher implements FrameStructMatcher { - - private final FieldConfigDao fieldConfigDao; - private final FieldParser fieldParser; - private final FieldResolver fieldResolverManger; +public class FrameMarkMatcher implements FrameStructMatcher, FixedPropertyEnum { //帧后续标志=>结束,进行帧的重组=>有后续,1、帧移位判别 2、继续接收帧 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig UnpackConfig = StringUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getUnpackId()); - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); - Integer upback = 0; + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); ByteBuf mergeWholeFrameByte = null; - if (!ObjectUtil.isEmpty(UnpackConfig)) { - while (hasNextFullFrame(byteBuf, protocolConfig)) { - upback = (Integer) fieldResolverManger.filedParserManger(byteBuf, UnpackConfig, null); + if (!ObjectUtil.isEmpty(unpackFlag)) { + while (hasNextFullFrame(byteBuf, protocolConfig, protocolFieldConfigProvider)) { //是否存在后续位 - if (upback == 1) {//使用esayRule + if (unpackFlag == 1) {//使用esayRule //表示可以截取 - mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolConfig, totalLength); + mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolFieldConfigProvider, protocolConfig); return mergeWholeFrameByte; } else { - byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig)); + byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig, protocolFieldConfigProvider)); } } } @@ -56,7 +54,8 @@ //选取第一个帧,将业务内容和后面部分分开 //计算数据报文-业务内容 - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolFieldConfigProvider protocolFieldConfigProvider, ProtocolConfig protocolConfig) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); //截取完整报文 byteBuf.readBytes(totalLength); ByteBuf byteBufContent = byteBuf.slice(0, byteBuf.readerIndex()); @@ -68,15 +67,15 @@ String tail = ""; System.out.println(ByteBufUtil.hexDump(byteBufContent)); //会存在多个帧拼接在一起的的情况,进行合并处理 - while (hasNextFullFrame(byteBufContent, protocolConfig)) { - Integer currentFrameLength = fieldParser.getTotalLength(protocolConfig, byteBufContent); + while (hasNextFullFrame(byteBufContent, protocolConfig, protocolFieldConfigProvider)) { + Integer currentFrameLength = protocolFieldConfigProvider.getTotalLength(byteBufContent, protocolConfig); byteBufContent.readBytes(currentFrameLength); ByteBuf currentbyteBuf = byteBufContent.slice(0, byteBufContent.readerIndex()); byteBufContent.markReaderIndex();//读的标志位前移 System.out.println(ByteBufUtil.hexDump(byteBufContent)); String hexDump = currentbyteBuf.toString(Charset.forName("ISO-8859-1")); //获取当前固定帧结构的关系map - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, currentbyteBuf); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(currentbyteBuf, protocolConfig); if (StringUtils.isEmpty(mergeFrameStr)) { //首次获取业务数据报文 mergeFrameStr += hexDump.substring(0, currentFrameFixedProperty.get("tailPosition")); @@ -95,22 +94,22 @@ /** * 获取平移到下一帧起始位置 */ - public int getNextFrameOffset(ByteBuf buffer, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, buffer); - return currentFrameFixedProperty.get("totalLength"); + public int getNextFrameOffset(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + return currentFrameFixedProperty.get(TOTAL_LENGTH); } /** * 判断是否出错进行整个帧的 */ - public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, byteBuf); + public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); //保证读取位置不在固定位置,是可变的业务内容 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("fixedPosition")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(FIXED_POSITION)) { return false; } //判断读取是否操作帧长度 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("totalLength")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(TOTAL_LENGTH)) { return false; } return true; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 76a3784..c3a1bab 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -1,50 +1,50 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.parser.instance.GeneralProcessor; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; +import io.netty.buffer.ByteBufUtil;; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(2) -@Service +@Component public class FrameTailMatcher implements FrameStructMatcher { - @Resource - private FieldConfigDao fieldConfigDao; - @Autowired - private GeneralProcessor generalProcessor; - //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig tailFieldConfig = StringUtils.isEmpty(protocolConfig.getTailStr()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getTailStr()); - if (!ObjectUtil.isEmpty(tailFieldConfig)) { - String tailStr = tailFieldConfig.getFieldName(); + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfig protocolFieldConfig = ObjectUtils.isEmpty(protocolConfig.getTailStr()) ? null : + fieldConfigProvider.getFieldConfigById(protocolConfig.getTailStr()); + if (!ObjectUtil.isEmpty(protocolFieldConfig)) { + String tailStr = protocolFieldConfig.getFieldName(); String dataGramContent = ByteBufUtil.hexDump(byteBuf); Boolean tailFlag = ByteBufUtil.hexDump(byteBuf).contains(tailStr); if (!tailFlag) { //使用esayRule return null; } else if (dataGramContent.indexOf(tailStr) < dataGramContent.length() - tailStr.length()) { Integer length = dataGramContent.indexOf(tailStr) + tailStr.length(); - ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, protocolConfig, length); + ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, length); return wholeDatagramByte; //存在粘包 } } return null; } - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer length) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, Integer length) { byteBuf.readBytes(length); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, length - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java new file mode 100644 index 0000000..5f1c177 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java @@ -0,0 +1,73 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.combined.GenericCombinedFieldResolver; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.CombinedFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class CombinedFieldConfigProvider { + + + /** + * 作为临时配置列表缓存使用 + */ + private final List combinedFieldConfigList; + private Map storeObjectMap = new HashMap<>(); + + public CombinedFieldConfigProvider(Long ruleId) { + CombinedFieldConfigRegistry combinedFieldConfigRegistry = SpringContextUtil.getBean(CombinedFieldConfigRegistry.class); + combinedFieldConfigList = combinedFieldConfigRegistry.getCombinedFieldConfigList(ruleId); + } + + public void parseDataField(RuleConfig ruleConfig, String clearZeroPlain,Map fieldConfigsMap ) { + if (showSkip()) { + return; + } + //匹配对应的数据,然后进行相关的字段解析 + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver(); + combinedFieldResolver.parseDataField(combinedFieldConfigList, byteBuf, storeObjectMap,fieldConfigsMap); + } + + + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getCombinedFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return combinedFieldConfigList.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public List getCombinedFieldConfigList() { + return combinedFieldConfigList; + } + + /* 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(combinedFieldConfigList) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java new file mode 100644 index 0000000..f3cfedc --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java @@ -0,0 +1,11 @@ +package com.casic.missiles.parser.provider; + +/** + * @author cz + * @date 2023-6-12 + */ +public class CommandEventProvider{ + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java new file mode 100644 index 0000000..70eec5e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java @@ -0,0 +1,77 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.safe.SafeStrategy; +import com.casic.missiles.parser.sender.DataSubscribeProvider; +import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class DatagramEventProvider { + + private final DatagramEventConfig processorInstance; + + public DatagramEventProvider(Long ruleId) { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + List datagramEventConfigList = + datagramEventRegistry.getDatagramEventList(ruleId); + processorInstance = this.getProcessorInstance(datagramEventConfigList); + } + + public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { + if (showSkip()) { + return null; + } + return datagramEventConfigList.get(0); + } + + // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 + public String getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap) { + String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? + processorInstance.getSafeBean() : + fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); + if (!StringUtils.isEmpty(safeName)) { + //需要加密 + SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); + String plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); + return clearComplementZero(plain); + } + return ByteBufUtil.hexDump(bizDataContent); + } + + //解密清零操作 + private String clearComplementZero(String plain) { + plain = plain.substring(0, plain.lastIndexOf("00")); + return plain; + } + + //数据发送,数据发送者暂未构建 + public void storeData(Map bizDataMap) { + DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); +// dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return ObjectUtils.isNotEmpty(processorInstance) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java new file mode 100644 index 0000000..7e1fe0a --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java @@ -0,0 +1,97 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.FieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class FieldConfigProvider { + + + private final List fieldConfigs; + private Map storeObjectMap = new HashMap<>(); +// private Map singleObjects = new ConcurrentHashMap<>(); + + public FieldConfigProvider(Long ruleId) { + FieldConfigRegistry fieldConfigRegistry = SpringContextUtil.getBean(FieldConfigRegistry.class); + fieldConfigs = fieldConfigRegistry.getFieldConfigList(ruleId); + } + + public List getFieldConfigs() { + return fieldConfigs; + } + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public Map parseDataField(RuleConfig ruleConfig, String clearZeroPlain) { + if (showSkip()) { + return null; + } + List prepareFieldConfig = prepareParseField(ruleConfig); + if (CollectionUtils.isNotEmpty(prepareFieldConfig)) { + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(fieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + return fixDataMap; + } + } + return null; + } + + /** + * 得到需要处理的业务内容 + * + * @return + */ + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return fieldConfigs.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public Map getFieldConfigsMap() { + return fieldConfigs.stream().collect( + Collectors.toMap(FieldConfig::getId, e -> e) + ); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(fieldConfigs) ? false : true; + } + + +} + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java new file mode 100644 index 0000000..817bfaf --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java @@ -0,0 +1,19 @@ +package com.casic.missiles.parser.provider; + +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.registry.FieldRuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; + +public class FieldRuleConfigProvider { + + private final List fieldRuleConfigList; + + public FieldRuleConfigProvider(Long ruleId) { + FieldRuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(FieldRuleConfigRegistry.class); + fieldRuleConfigList = ruleConfigRegistry.getFieldRuleConfigList(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java new file mode 100644 index 0000000..99a1b06 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java @@ -0,0 +1,53 @@ +package com.casic.missiles.parser.provider; + + +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.registry.ProtocolConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolConfigProvider { + + private final List protocolConfigList; + + public ProtocolConfigProvider(String firstChar) { + ProtocolConfigRegistry registry = SpringContextUtil.getBean(ProtocolConfigRegistry.class); + protocolConfigList = registry.getProtocolConfigList(firstChar); + } + + public List getMatchList() { + return protocolConfigList; + } + + /** + * 设置当前协议 + * + * @param protocolConfig + */ + public ProtocolConfigProvider(ProtocolConfig protocolConfig) { + List protocolConfigs = new ArrayList<>(); + protocolConfigs.add(protocolConfig); + protocolConfigList = protocolConfigs; + } + + /** + * 获取当前协议 + * + * @return + */ + public ProtocolConfig getCurrentProtocolConfig() { + if (this.protocolConfigList == null) { + return null; + } else { + return protocolConfigList.get(0); + } + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java new file mode 100644 index 0000000..043927d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java @@ -0,0 +1,213 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.registry.ProtocolFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolFieldConfigProvider { + + private static final String FIXED_FIELD_DS = "fixedFieldDs"; + private static final String CONTENT_FIELD_DS = "contentFieldDs"; + private static final String PROTOCOL_LENGTH = "protocolLength"; + private static final String PROTOCOL_FIELD_ID = "protocolFieldId"; + private static final String PROTOCOL_POSITION = "protocolPosition"; + + private final List protocolFieldConfigs; + private Map singleObjects = new ConcurrentHashMap<>(); + private Map storeObjectMap = new HashMap<>(); + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public ProtocolFieldConfigProvider(Long protocolId) { + ProtocolFieldConfigRegistry protocolFieldConfigRegistry = SpringContextUtil.getBean(ProtocolFieldConfigRegistry.class); + protocolFieldConfigs = protocolFieldConfigRegistry.getProtocolFieldConfigList(protocolId); + } + + public List getProtocolFieldConfigs() { + return protocolFieldConfigs; + } + + public ProtocolFieldConfig getFieldConfigById(Long fieldId) { + Optional optionalConfig = protocolFieldConfigs.stream().filter( + e -> e.getId().equals(fieldId) + ).findFirst(); + return optionalConfig.isPresent() ? optionalConfig.get() : null; + } + + public Integer getProtocolFieldValue(Long protocolFieldId, ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_FIELD_ID + protocolFieldId + ByteBufUtil.hexDump(byteBuf); + //获取缓存 + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + //加载固定长度数据集合 + Map fixDataMap = this.getProtocolDataMap(byteBuf); + ProtocolFieldConfig protocolFieldConfig = selectFieldConfig(protocolFieldId); + Integer protocolFieldValue = 0; + //获取约定字段的总长度 + if (fixDataMap.containsKey(protocolFieldConfig.getFieldName())) { + Object appointUnpackObject = fixDataMap.get(protocolFieldConfig.getFieldName()); + if (ObjectUtils.isNotEmpty(appointUnpackObject)) { + protocolFieldValue = (Integer) appointUnpackObject; + } + } + if (protocolFieldValue != null) { + //加入缓存 + if (ObjectUtils.isNotEmpty(protocolFieldValue)) { + this.singleObjects.put(catchKey, protocolFieldValue); + return protocolFieldValue; + } + } + return null; + } + + /** + * 获取帧固定位置信息 + * + * @param byteBuf + * @param protocolConfig + * @return + */ + public Map getFixedProperty(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_POSITION + protocolConfig.getId(); + if (this.singleObjects.containsKey(catchKey)) { + return (Map) singleObjects.get(catchKey); + } + Map fixedPropertyMap = new HashMap<>(); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + fixedPropertyMap = fieldParser.doGetFixedProperty(protocolFieldConfigs, this.getTotalLength(byteBuf,protocolConfig)); + if (CollectionUtils.isNotEmpty(fixedPropertyMap)) { + this.singleObjects.put(catchKey, fixedPropertyMap); + return fixedPropertyMap; + } + return fixedPropertyMap; + } + + /** + * 获取帧结构应有的总长度 + */ + public Integer getTotalLength(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_LENGTH + ByteBufUtil.hexDump(byteBuf); + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + Integer appointFrameLength = getProtocolFieldValue(protocolConfig.getTotalLengthId(), byteBuf); + if (appointFrameLength != null) { + //获取过滤的字段集合总长度 + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Integer totalFilterLength = fieldParser.getTotalFilterLength(protocolConfig, byteBuf, getFixFieldConfigMap()); + //计算总长度 + Integer totalLength = appointFrameLength + totalFilterLength; + //加入缓存 + if (ObjectUtils.isNotEmpty(totalLength)) { + this.singleObjects.put(catchKey, totalLength); + return totalLength; + } + } + return null; + } + + /** + * 获取协议有关字段解析内容 + * storeObjectMap存储代转存的数据 + * + * @return + */ + public Map getProtocolDataMap(ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(FIXED_FIELD_DS)) { + return (Map) singleObjects.get(FIXED_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(protocolFieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + this.singleObjects.put(FIXED_FIELD_DS, fixDataMap); + return fixDataMap; + } + return null; + } + + /** + * 获取业务报文内容的content字节 + * + * @param wholeDatagramByte + * @return + */ + public ByteBuf getDataContentBuf(ByteBuf wholeDatagramByte) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(CONTENT_FIELD_DS)) { + return (ByteBuf) singleObjects.get(CONTENT_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + ByteBuf bizDataByteBuf = fieldParser.getDataContentBuf(protocolFieldConfigs, wholeDatagramByte); + if (bizDataByteBuf != null) { + this.singleObjects.put(CONTENT_FIELD_DS, bizDataByteBuf); + return bizDataByteBuf; + } + return null; + } + + + private ProtocolFieldConfig selectFieldConfig(Long id) { + Optional optionalProtocolFieldConfig = this.protocolFieldConfigs.stream().filter( + e -> e.getId().equals(id) + ).findFirst(); + return optionalProtocolFieldConfig.isPresent() ? optionalProtocolFieldConfig.get() : null; + } + + + private Map getFixFieldConfigMap() { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, e -> e) + ); + return fixDataFieldMap; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(protocolFieldConfigs) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java new file mode 100644 index 0000000..dafba1c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java @@ -0,0 +1,56 @@ +package com.casic.missiles.parser.provider; + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.rule.GenericRuleResolver; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.RuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleConfigProvider { + + private final List ruleConfigs; + + public List getRuleConfigs() { + return ruleConfigs; + } + + public RuleConfigProvider(Long protocolId) { + RuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(RuleConfigRegistry.class); + ruleConfigs = ruleConfigRegistry.getRuleConfigById(protocolId); + } + + /** + * 获取规则匹配结果 + * + * @param parseFixedDataMap + * @param protocolFieldConfigs + * @return + */ + public RuleConfig doGetRule(Map parseFixedDataMap, + String ids, + List protocolFieldConfigs) { + if (showSkip()) { + return null; + } + RuleConfig ruleConfig = GenericRuleResolver.machRule(parseFixedDataMap, ids, protocolFieldConfigs, ruleConfigs); + return ruleConfig; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(ruleConfigs) ? false : true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java index 3c05891..856b399 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java @@ -1,18 +1,11 @@ package com.casic.missiles.parser.resolver; -import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.springframework.web.bind.annotation.RequestBody; -import javax.annotation.Resource; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -20,19 +13,17 @@ @Slf4j public class ByteMergeProvider { - @Resource - private FieldRuleEngineMapper fieldRuleEngineMapper; - //拿到所有的值合并到一个值 - public String resolveByteMerge(List valueList, String ruletypeId, String vaildRange) { + public static String resolveByteMerge(List valueList, String ruleTypeId, String vaildRange) { String values = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Map vaildMap = getValidRangeMap(vaildRange); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(ruletypeId); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } + //暂时不处理 +// fieldRuleEngine = fieldRuleConfigMapper.selectById(ruleTypeId); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } Map env2 = new HashMap(); for (int i = 0; i < valueList.size(); i++) { if (vaildMap.containsKey(i)) { @@ -47,7 +38,7 @@ } } - private Map getValidRangeMap(String vaildRange) { + private static Map getValidRangeMap(String vaildRange) { String[] range = vaildRange.split(","); Map vaildMap = new HashMap(); for (int i = 0; i < range.length; i++) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 8d821cd..85d6bbf 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -1,9 +1,12 @@ package com.casic.missiles.parser.resolver; +import com.casic.missiles.pojo.AbstractFieldConfig; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; import io.netty.buffer.ByteBuf; +import java.util.List; import java.util.Map; /** @@ -11,18 +14,14 @@ */ public interface FieldParser { -// Map fieldProcess(String protocolContent,); - Map dataParser(RuleConfig ruleConfig, String lightText,String protocolId); + Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength); - Map fixDataParser(String protocolId, ByteBuf buffer); + Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap); - Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf); + ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer); - ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer); - - ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer); - - Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer); + Integer getTotalFilterLength(ProtocolConfig protocolConfig, ByteBuf byteBuf, Map protocolFieldConfigMap); } + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java new file mode 100644 index 0000000..9e0c00e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java @@ -0,0 +1,52 @@ +package com.casic.missiles.parser.resolver; + +import com.casic.missiles.pojo.AbstractFieldConfig; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.util.List; + +public class FieldParserSupport { + + //分别计算bit和byte长度=> 合并长度 + protected Integer calculateLength(List fieldConfigList) { + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + Integer fixedLength = bytefixedLength + bitfixedLength / 8; + return fixedLength; + } + + //找到最大值=> 根据最大值计算业务数据下标 + protected Integer calculatePosition(List fieldConfigList) { + String rex = "[0-9]+"; + Integer max = -1; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) + && Integer.valueOf(fieldConfig.getOriginPositionByte()) > max) { + max = Integer.valueOf(fieldConfig.getOriginPositionByte()); + } + } + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) && fieldConfig.getOriginPositionByte().equals(max)) { + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + } + } + Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; + return maxFixedPosition; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java deleted file mode 100644 index dd3a6cd..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java +++ /dev/null @@ -1,170 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.ByteResolverParam; -import io.netty.buffer.ByteBuf; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -/** - * 字段解析管理总类 - */ -@Service -@Slf4j -@AllArgsConstructor -public class FieldResolver extends ByteMergeProvider { - - //1、字段截取 => 2、简单的字节解析和复杂的字节解析 - public Object filedParserManger(ByteBuf byteBuf, FieldConfig fieldConfig, Integer maxFixedPosition) { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - //最大固定位置不为空, - if (!ObjectUtil.isEmpty(maxFixedPosition)) { - orignPosition -= maxFixedPosition; - } - Object fieldValue = 0; - //待优化 - if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { - fieldValue = bitToResolver(byteBuf, fieldConfig); - } else { - ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); - fieldValue = parsingFields(fieldBytes, fieldConfig.getRuleJson()); - } - return fieldValue; - } - - //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, - //目前默认配置的规则设置暂不支持配置化,由实现完成 - private Object parsingFields(ByteBuf byteBuf, String ruleJson) { - Object fieldsResolveValue = null; - List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); - if (ObjectUtil.isEmpty(ruleMapList)) { - fieldsResolveValue = defaultResolveBuilder(byteBuf); - } else { - fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); - } - return fieldsResolveValue; - } - - private Object defaultResolveBuilder(ByteBuf byteBuf) { - Integer defaultResolveValue = 0; - for (int i = 0; i < byteBuf.writerIndex(); i++) { - defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; - } - return defaultResolveValue; - } - - //字段解析构建器(针对字节单位的) - //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 - // 字节归并结束或者规则结束=>继续根据规则进行判断 - private Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { - Object customizeResolveValue = null; - try { - List bytStrList = new ArrayList<>(); - //存放到数组里面 - for (int i = 0; i < byteBuf.writerIndex(); i++) { - bytStrList.add(byteBuf.readByte()); - } - int i = 0; - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - customizeResolveValue = this.resolveByteMerge(bytStrList, ruletypeId,vaildRange); - break; - } else { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - List tempBytStr = new ArrayList<>(); - for (int k = 0; i < bytStrList.size(); i++) { - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(k) - .value(bytStrList.get(k)) - .ruletypeId(ruletypeId).build(); - tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); - } - bytStrList = tempBytStr; - } - i++; - } - //字节归并到一起=>继续根据规则进行判断 - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(customizeResolveValue) - .ruletypeId(ruletypeId).build(); - customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(customizeResolveValue)); - return customizeResolveValue; - } catch (RuntimeException ex) { - log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); - return null; - } - } - - /** - * 1、单个字节情况表示字段 - * 2、多字节情况表示字段(暂未处理) - */ - private Object bitToResolver(ByteBuf byteBuf, FieldConfig fieldConfig) { - Object fieldValue = new Object(); - try { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - byte fields = 0x00; - if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); - } else { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); - } - - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { - if (!StringUtils.isEmpty(fieldConfig.getExactOrignPosition())) { - fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getExactOrignPosition())).byteValue() - >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); - } else { - fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); - } - } else { - fieldValue = Integer.valueOf(fields & 0xff); - } - if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { - return fieldValue; - } - List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); - int i = 0; - //字节归并到一起=>继续根据规则进行判断 - while (i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(fieldValue) - .ruletypeId(ruletypeId).build(); - fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(fieldValue)); - return fieldValue; - } catch (RuntimeException ex) { - log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); - return null; - } - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java new file mode 100644 index 0000000..1d2aeab --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java @@ -0,0 +1,36 @@ +package com.casic.missiles.parser.resolver.bytes; + +import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.mapper.FieldRuleConfigMapper; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.pojo.ByteResolverParam; +import com.googlecode.aviator.AviatorEvaluator; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; +//转换规则 +@Component("convert") +@AllArgsConstructor +@Slf4j +public class ByteRuleResolver implements ByteResolver { + + private final FieldRuleConfigMapper fieldRuleConfigMapper; + + @Override + public Object resolveOperationRule(ByteResolverParam byteResolverParam){ + FieldRuleConfig fieldRuleEngine=fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); + if(ObjectUtil.isEmpty(fieldRuleEngine)){ + return byteResolverParam.getValue(); + } + String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); + Map env2 = new HashMap(); + env2.put("value", (byte) byteResolverParam.getValue()); + String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); + return values; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java index 103821c..786b71c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java @@ -2,34 +2,34 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("logicalShift") +@Component("logicalShift") @AllArgsConstructor @Slf4j public class LogicalShiftResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //字节位移 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { Integer index = byteResolverParam.getIndex(); - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return byteResolverParam.getValue(); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java index 476747d..01149bd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("operation") +@Component("operation") @AllArgsConstructor @Slf4j public class OperationResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //混合运算,有常量或者乘除的缩放 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java index 0b82cf4..79abcce 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.casic.missiles.pojo.ByteResolverParam; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; //精度计算 -@Service("precision") +@Component("precision") @AllArgsConstructor @Slf4j public class PrecisionResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java deleted file mode 100644 index 5c3f332..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; -//转换规则 -@Service("convert") -@AllArgsConstructor -@Slf4j -public class RuleResolver implements ByteResolver { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam){ - RuleEvaluator fieldRuleEngine=fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); - if(ObjectUtil.isEmpty(fieldRuleEngine)){ - return byteResolverParam.getValue(); - } - String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); - Map env2 = new HashMap(); - env2.put("value", (byte) byteResolverParam.getValue()); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java new file mode 100644 index 0000000..d3bbd91 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java @@ -0,0 +1,15 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; + +import java.util.List; +import java.util.Map; +// 前导码匹配->长度字段 +public interface AbstractCombinedFieldProcessor { + + Map invoke(Map map, ByteBuf byteBuf, List combinedFieldConfigList, + Map fieldConfigsMap, Map storeObjectMap); + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java new file mode 100644 index 0000000..03c8480 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java @@ -0,0 +1,59 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-13 + */ +//依次递增进行数据的解析, +public class GenericCombinedFieldResolver { + + + //通过查询,字段长度长度随机 + public void parseDataField(List combinedFieldConfigList, ByteBuf byteBuf, + Map storeObjectMap, Map fieldConfigsMap) { + Integer frameLength = Integer.valueOf(ByteBufUtil.hexDump(byteBuf)); + //添加前置处理器 + com.casic.missiles.util.ClassUtil classUtil = new com.casic.missiles.util.ClassUtil(); + List abstractCombinedProcessors = classUtil.getSubClassList(AbstractCombinedFieldProcessor.class); + + Map fieldFixedMap = combinedFieldLeadCodeMap(combinedFieldConfigList); + //frameLength + Map combinedProcessorFields = null; + while (byteBuf.readableBytes() < frameLength) { + //一直处理 + for (AbstractCombinedFieldProcessor abstractCombinedProcessor : abstractCombinedProcessors) { + combinedProcessorFields = abstractCombinedProcessor.invoke(combinedProcessorFields, byteBuf, + combinedFieldConfigList, + fieldConfigsMap, storeObjectMap); + if (combinedProcessorFields == null || byteBuf.readableBytes() < frameLength) { + return; + } + } + + } + } + + /** + * 取出前导码匹配集合 + */ + private Map combinedFieldLeadCodeMap(List combinedFieldConfigList) { + Map fieldFixedMap = combinedFieldConfigList + .stream() + .collect(Collectors.toMap(CombinedFieldConfig::getPrefixCode, e -> e)); + return fieldFixedMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java new file mode 100644 index 0000000..643a934 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java @@ -0,0 +1,100 @@ +package com.casic.missiles.parser.resolver.fields; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.FieldParserSupport; +import com.casic.missiles.pojo.*; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 保存使用时最基本的信息,并且使用原型模式 + */ +@Slf4j +public class DefaultProtocolFieldParser extends FieldParserSupport implements FieldParser, FixedPropertyEnum { + + //通过传入的配置和报文进行字段解析 + @Override + public Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap) { + Map dataMap = new HashMap<>(); + for (AbstractFieldConfig protocolFieldConfig : protocolFieldConfigs) { + if (!ObjectUtils.isEmpty(protocolFieldConfig.getOriginPositionByte())) { + Object fieldValue = FieldResolver.parseField(buffer, protocolFieldConfig, null); + if (protocolFieldConfig.getIsStorage() == 1) { + storeObjectMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + dataMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + } + return dataMap; + } + + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength) { + Map fixedPropertyMap = new HashMap<>(); + Integer fixedLength = calculateLength(protocolFieldConfigs); + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + fixedPropertyMap.put(FIXED_POSITION, maxFixedPosition); + fixedPropertyMap.put(TOTAL_LENGTH, totalLength); + fixedPropertyMap.put(TAIL_POSITION, totalLength - fixedLength + maxFixedPosition); + return fixedPropertyMap; + } + + //** 获取业务内容的byteBuf + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer) { + //计算固定长度 + Integer fixedLength = calculateLength(protocolFieldConfigs); + //总长度获取 + String lightText = buffer.toString(Charset.forName("ISO-8859-1")); + Integer totalLength = lightText.length(); + //计算固定长度最大长度 + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + //计算数据报文内容 + ByteBuf bizDataFields = buffer.slice(maxFixedPosition - 1, (totalLength - fixedLength)); + return bizDataFields; + } + + /** + * 获取过滤字段的长度 + */ + @Override + public Integer getTotalFilterLength(ProtocolConfig protocolConfig, + ByteBuf byteBuf, + Map protocolFieldConfigMap) { + if (ByteBufUtil.hexDump(byteBuf).equals("")) { + return 0; + } + int totalFilterLength = 0; + String filterFields = protocolConfig.getTotalLengthFilterFields(); + try { + if (!StringUtils.isEmpty(filterFields)) { + String[] filterFieldList = filterFields.split(","); + for (String filterFieldId : filterFieldList) { + if (StringUtils.isNotEmpty(filterFieldId)) { + ProtocolFieldConfig fieldConfig = protocolFieldConfigMap.get(Long.valueOf(filterFieldId)); + //这里都是按字节计算,没有对位进行区分,可能会出现错误 + // 如果对位有需求,需要进一步跟进 + totalFilterLength += fieldConfig.getOffsetLength(); + } + } + } + return totalFilterLength; + } catch (Exception ex) { + log.error("报文确认分发阶段,获取报文总长度过滤长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); + } + return totalFilterLength; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java new file mode 100644 index 0000000..d51e887 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java @@ -0,0 +1,169 @@ +package com.casic.missiles.parser.resolver.fields; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.parser.resolver.ByteMergeProvider; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.AbstractFieldConfig; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.pojo.ByteResolverParam; +import io.netty.buffer.ByteBuf; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * 字段解析管理总类 + */ +@Slf4j +public class FieldResolver extends ByteMergeProvider { + + //1、字段截取 => 2、简单的字节解析和复杂的字节解析 + public static Object parseField(ByteBuf byteBuf,AbstractFieldConfig fieldConfig, Integer maxFixedPosition) { + Integer orignPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + //最大固定位置不为空, + if (!ObjectUtil.isEmpty(maxFixedPosition)) { + orignPosition -= maxFixedPosition; + } + Object fieldValue = 0; + //待优化 + if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { + fieldValue = doParseBitField(byteBuf, fieldConfig); + } else { + ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); + fieldValue = doParseByteField(fieldBytes, fieldConfig.getRuleJson()); + } + return fieldValue; + } + + //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, + //目前默认配置的规则设置暂不支持配置化,由实现完成 + private static Object doParseByteField(ByteBuf byteBuf, String ruleJson) { + Object fieldsResolveValue = null; + List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); + if (ObjectUtil.isEmpty(ruleMapList)) { + fieldsResolveValue = defaultResolveBuilder(byteBuf); + } else { + fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); + } + return fieldsResolveValue; + } + + private static Object defaultResolveBuilder(ByteBuf byteBuf) { + Integer defaultResolveValue = 0; + for (int i = 0; i < byteBuf.writerIndex(); i++) { + defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; + } + return defaultResolveValue; + } + + //字段解析构建器(针对字节单位的) + //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 + // 字节归并结束或者规则结束=>继续根据规则进行判断 + private static Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { + Object customizeResolveValue = null; + try { + List bytStrList = new ArrayList<>(); + //存放到数组里面 + for (int i = 0; i < byteBuf.writerIndex(); i++) { + bytStrList.add(byteBuf.readByte()); + } + int i = 0; + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { + if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + customizeResolveValue = resolveByteMerge(bytStrList, ruletypeId, vaildRange); + break; + } else { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + List tempBytStr = new ArrayList<>(); + for (int k = 0; i < bytStrList.size(); i++) { + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(k) + .value(bytStrList.get(k)) + .ruletypeId(ruletypeId).build(); + tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); + } + bytStrList = tempBytStr; + } + i++; + } + //字节归并到一起=>继续根据规则进行判断 + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(null) + .value(customizeResolveValue) + .ruletypeId(ruletypeId).build(); + customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); + i++; + } + System.out.println(JSON.toJSON(customizeResolveValue)); + return customizeResolveValue; + } catch (RuntimeException ex) { + log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); + return null; + } + } + + /** + * 1、单个字节情况表示字段 + * 2、多字节情况表示字段(暂未处理) + */ + private static Object doParseBitField(ByteBuf byteBuf,AbstractFieldConfig fieldConfig) { + Object fieldValue = new Object(); + try { + Integer orignPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + byte fields = 0x00; + if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { + fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); + } else { + fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); + } + + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { + if (!StringUtils.isEmpty(fieldConfig.getOriginPositionBit())) { + fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getOriginPositionBit())).byteValue() + >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); + } else { + fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); + } + } else { + fieldValue = Integer.valueOf(fields & 0xff); + } + if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { + return fieldValue; + } + List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); + int i = 0; + //字节归并到一起=>继续根据规则进行判断 + while (i < ruleMapList.size()) { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(null) + .value(fieldValue) + .ruletypeId(ruletypeId).build(); + fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); + i++; + } + System.out.println(JSON.toJSON(fieldValue)); + return fieldValue; + } catch (RuntimeException ex) { + log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); + return null; + } + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java deleted file mode 100644 index 35ae3d0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java +++ /dev/null @@ -1,183 +0,0 @@ -package com.casic.missiles.parser.resolver.fields; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufAllocator; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; -import org.springframework.util.ObjectUtils; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service("standard") -@AllArgsConstructor -@Slf4j -public class StandardFieldParser implements FieldParser { - - private final FieldConfigDao fieldConfigDao; - private final FieldResolver fieldResolver; - - //数据解析 - @Override - public Map dataParser(RuleConfig ruleConfig, String lightText, String protocolId) { - String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); - ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); - bufferContent.writeBytes(lightText.getBytes(Charset.forName("ISO-8859-1"))); - Map dataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - for (String dataFieldId : dataFieldIds) { - FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(dataFieldId); - if (!ObjectUtils.isEmpty(fieldConfig)) { - dataMap.put(fieldConfig.getFieldName(), String.valueOf(fieldResolver.filedParserManger(bufferContent, fieldConfig, maxFixedPosition))); - } - } - return dataMap; - } - - //数据解析 - @Override - public Map fixDataParser(String protocolId, ByteBuf buffer) { - List dataFieldIdList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Map dataMap = new HashMap<>(); - for (FieldConfig dataField : dataFieldIdList) { - if (!ObjectUtils.isEmpty(dataField.getOrignPosition())) { - Object fieldValue = (Integer) fieldResolver.filedParserManger(buffer, dataField, null); - dataMap.put(dataField.getFieldName(), fieldValue); - } - } - return dataMap; - } - - @Override - public Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf) { - if (ByteBufUtil.hexDump(byteBuf).equals("")) { - return 0; - } - String filterFields = protocolConfig.getTotalLengthFilterField(); - Integer totalLength = 0; - try { - FieldConfig totalFieldConfig = fieldConfigDao.getFieldConfigById(protocolConfig.getTotalLengthId()); - int totalFilterLength = 0; - if (!StringUtils.isEmpty(filterFields)) { - String[] filterFieldList = filterFields.split(","); - for (String filterField : filterFieldList) { - FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(filterField); - //这里都是按字节计算,没有对位进行区分,可能会出现错误 - - // 如果对位有需求,需要进一步跟进 - totalFilterLength += fieldConfig.getOffsetLength(); - } - } - totalLength = (Integer) fieldResolver.filedParserManger(byteBuf, totalFieldConfig, null) + totalFilterLength; - } catch (Exception ex) { - log.error("报文确认分发阶段,获取报文总长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); - } - return totalLength; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer) { - //业务内容 - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - String protocolId = String.valueOf(protocolConfig.getId()); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - //计算固定长度 - Integer fixedLength = calculateLength(fieldConfigList); -// Integer totalLength = this.getTotalLength(protocolConfig, buffer); - //总长度获取 - Integer totalLength = lightText.length(); - //计算固定长度最大长度 - Integer maxFixedPosition = calculatePosition(fieldConfigList); -// buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - //计算数据报文内容 - ByteBuf bizDataFields = buffer.slice(maxFixedPosition-1, (totalLength - fixedLength)); - return bizDataFields; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer) { - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - String protocolId = String.valueOf(protocolConfig.getId()); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer fixedLength = calculateLength(fieldConfigList); -// Integer totalLength = this.getTotalLength(protocolConfig, buffer); - Integer totalLength = lightText.length(); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - ByteBuf fixDataFields = buffer.slice(0, maxFixedPosition); - return fixDataFields; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer) { - String protocolId = String.valueOf(protocolConfig.getId()); - Map fixedPropertyMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer fixedLength = calculateLength(fieldConfigList); - Integer totalLength = this.getTotalLength(protocolConfig, buffer); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - fixedPropertyMap.put("fixedPosition", maxFixedPosition); - fixedPropertyMap.put("totalLength", totalLength); - fixedPropertyMap.put("tailPosition", totalLength - fixedLength + maxFixedPosition); - return fixedPropertyMap; - } - - //分别计算bit和byte长度=> 合并长度 - private Integer calculateLength(List fieldConfigList) { - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (FieldConfig fieldConfig : fieldConfigList) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - Integer fixedLength = bytefixedLength + bitfixedLength / 8; - return fixedLength; - } - - //找到最大值=> 根据最大值计算业务数据下标 - private Integer calculatePosition(List fieldConfigList) { - String rex = "[0-9]+"; - Integer max = -1; - for (FieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOrignPosition()) - && Integer.valueOf(fieldConfig.getOrignPosition()) > max) { - max = Integer.valueOf(fieldConfig.getOrignPosition()); - } - } - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (FieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOrignPosition()) && fieldConfig.getOrignPosition().equals(max)) { - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - } - } - Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; - return maxFixedPosition; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java new file mode 100644 index 0000000..d4ec6c7 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java @@ -0,0 +1,76 @@ +package com.casic.missiles.parser.rule; + +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import org.apache.commons.lang3.StringUtils; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class GenericRuleResolver { + + //根据前置字段的值,找到指定的规则 + //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 + //=>循环判断=>通过规则得到业务字段 + public static RuleConfig machRule(Map fixDataMap, + String ids, + List protocolFieldConfigs, + List ruleConfigs) { + List preRuleConfigList = getPreRuleList(ids, protocolFieldConfigs); + //获取前置规则字段 + final Map metaDataMap = getPreRuleFields(preRuleConfigList, fixDataMap); + //准备固定的字段集合 + Map fixDataFieldMap = getFixDataFieldMap(protocolFieldConfigs); + return RuleResolverCore.doMachRule(ruleConfigs, metaDataMap, fixDataMap, fixDataFieldMap); + } + + private static Map getFixDataFieldMap(List protocolFieldConfigs) { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, ProtocolFieldConfig::getFieldName) + ); + return fixDataFieldMap; + } + + + /** + * 查询前置规则的字段配置 + * + * @param ids + * @return + */ + private static List getPreRuleList(String ids, List protocolFieldConfigs) { + String[] idList = ids.split(","); + Map prepareMaps = new HashMap<>(); + for (String id : idList) { + if (StringUtils.isNotEmpty(id)) { + prepareMaps.put(Long.valueOf(id), ""); + } + } + List preRuleConfigList = protocolFieldConfigs + .stream() + .filter(e -> prepareMaps.containsKey(e.getId())) + .collect(Collectors.toList()); + return preRuleConfigList; + } + + /** + * 获取前置规则解析字段 + */ + private static Map getPreRuleFields(List preRuleFieldConfigList, Map fixDataMap) { + Map ruleFieldMap = new HashMap<>(); + preRuleFieldConfigList.stream() + .forEach( + preRuleFieldConfig -> { + String fieldName = preRuleFieldConfig.getFieldName(); + if (fixDataMap.containsKey(fieldName)) { + ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); + } + } + ); + return ruleFieldMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java new file mode 100644 index 0000000..baae7e8 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -0,0 +1,68 @@ +package com.casic.missiles.parser.rule; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.casic.missiles.pojo.RuleConfig; + +import java.util.*; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleResolverCore { + + + public static RuleConfig doMachRule(List ruleConfigList, Map metaDataMap, + Map fixDataMap, + Map fixDataFieldMap) { + Optional ruleConfigOptional = ruleConfigList.stream() + .filter(ruleConfig -> machRuleConfig( + JSON.parseObject(ruleConfig.getMatchRuleJson(), Map.class), metaDataMap)) + .findFirst(); + if (ObjectUtil.isEmpty(ruleConfigOptional)) { + return null; + } + String[] ruleFields = ruleConfigOptional.get().getDataFieldIds().split(","); + Map ruleMetaDataMap = getRuleFields(ruleFields, fixDataMap, fixDataFieldMap); + //递归选定解析规则,进行规则解析 + if (!ruleConfigOptional.get().getIsFinishMatch().equals("1")) { + //递归选定规则 + doMachRule(ruleConfigList, ruleMetaDataMap, fixDataMap, fixDataFieldMap); + } + return ruleConfigOptional.get(); + } + + + private static Map getRuleFields(String[] preRuleConfigList, Map fixedDataMap, + Map fixedFieldMap) { + Map ruleFieldMap = new HashMap<>(); + for (String preRuleConfigId : preRuleConfigList) { + String fieldName = fixedFieldMap.get(preRuleConfigId); + if (fixedDataMap.containsKey(fieldName)) { + ruleFieldMap.put(fieldName, String.valueOf(fixedDataMap.get(fieldName))); + } + } + return ruleFieldMap; + } + + + //匹配规则配置 + private static Boolean machRuleConfig(Map ruleMap, Map metaDataMap) { + if (ruleMap == null || metaDataMap == null) { + return null; + } + //所有的字段在规则里面必须有有配置 + for (String key : metaDataMap.keySet()) { + if (ruleMap.containsKey(key)) { + if (!ruleMap.get(key).equals(metaDataMap.get(key))) { + return false; + } + } else { + return false; + } + } + return true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java deleted file mode 100644 index 664088d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java +++ /dev/null @@ -1,92 +0,0 @@ -package com.casic.missiles.parser.rule; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.mapper.dao.PreRuleConfigDao; -import com.casic.missiles.mapper.dao.RuleConfigDao; -import lombok.AllArgsConstructor; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.*; -import java.util.stream.Collectors; - -@Service -@AllArgsConstructor -public class RulerProvider { - - private final FieldConfigDao fieldConfigDao; - private final PreRuleConfigDao preRuleConfigDao; - private final RuleConfigDao ruleConfigDao; - - //根据前置字段的值,找到指定的规则 - //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 - //=>循环判断=>通过规则得到业务字段 - public RuleConfig ruleConfig(Map fixDataMap, String protocolId) { - //批量获取规则 - List preRuleConfigList = preRuleConfigDao.getPreRuleList(protocolId); - //获取固定字段 - Map fixFieldMap = getAllFieldMap(protocolId); - //获取前置规则字段 - final String preRuleFields = getPreRuleFields(preRuleConfigList, fixDataMap, fixFieldMap); - List ruleConfigList = ruleConfigDao.getRuleConfigById(protocolId); - Optional ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig ->preRuleFields.equals( ruleConfig.getParseRuleJson())).findFirst(); - //递归选定解析规则,进行规则解析 - while (!ObjectUtil.isEmpty(ruleConfigOptional) && !ruleConfigOptional.get().getIsBizField().equals("1")) { - String ruleFields = getRuleFields(ruleConfigOptional.get().getDataFieldIds().split(","), fixDataMap, fixFieldMap); - ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig -> ruleConfig.getParseRuleJson().equals(ruleFields)).findFirst(); - } - return ruleConfigOptional.get(); - } - - /** - * 获取前置规则解析字段 - */ - private String getPreRuleFields(List preRuleConfigList, Map fixDataMap, Map fixFieldMap) { - Map ruleFieldMap= new HashMap<>(); - preRuleConfigList.stream() - .forEach( - preRuleConfig -> { - String fieldName = fixFieldMap.get(Long.valueOf(preRuleConfig.getRuleFieldId())); - if (fixDataMap.containsKey(fieldName)) { - ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); - } - } - ); - return JSONObject.toJSONString(ruleFieldMap); - } - - private Map getAllFieldMap(String protocolId) { - List fieldList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Map fixFieldMap = fieldList.stream().collect( - Collectors.toMap(FieldConfig::getId, FieldConfig::getFieldName) - ); - return fixFieldMap; - } - - private String getRuleFields(String[] preRuleConfigList, Map fixDataMap, Map fixFieldMap) { - Map ruleFieldMap= new HashMap<>(); - for (String preRuleConfigId : preRuleConfigList) { - String fieldName = fixFieldMap.get(preRuleConfigId); - if (fixDataMap.containsKey(fieldName)) { - ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); - } - } - return JSONObject.toJSONString(ruleFieldMap); - } - - //弃置 - private String ListToString(List ruleFieldList) { - String ruleFields = ""; - for (String ruleField : ruleFieldList) { - ruleFields += ruleField + ","; - } - ruleFields = StringUtils.isEmpty(ruleFields) ? ruleFields : ruleFields.substring(0, ruleFields.length() - 1); - return ruleFields; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java index 6177e10..bfa87a5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java @@ -2,7 +2,7 @@ public interface SafeStrategy { - String decryption(byte[] bytes); + String decryption(String cipher); String encryption(String lightText); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java index 618716c..6236302 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java @@ -9,9 +9,9 @@ //十六进制的字符串转换成字节数组 byte[] bytes = hexStrToBinaryStr(msg); //计算CRC8 - byte crc8 = CRC8(bytes, 0, bytes.length); - String crc8ToStr = "" + Integer.toHexString(0xff & crc8); - return crc8ToStr; +// String crc8ToStr = "" + Integer.toHexString(0xff & crc8); +// return crc8ToStr; + return null; } /** @@ -33,50 +33,5 @@ return bytes; } - /** - * CRC8 校验 多项式 x8+x2+x+1 - * - * @param b - * @param off - * @param len - * @return - */ - public static byte CRC8(final byte[] b, final int off, final int len) { - byte result = 0x00; - for (int i = 0; i < len; i++) { - result = CHECKSUM_TABLE[(result ^ (b[i + off] & 0xFF)) & 0xFF]; - } - return (byte) (result & 0xFFL); - } - - private final static byte[] CHECKSUM_TABLE = {(byte) 0x00, (byte) 0x07, (byte) 0x0e, (byte) 0x09, (byte) 0x1c, (byte) 0x1b, - (byte) 0x12, (byte) 0x15, (byte) 0x38, (byte) 0x3f, (byte) 0x36, (byte) 0x31, (byte) 0x24, (byte) 0x23, (byte) 0x2a, - (byte) 0x2d, (byte) 0x70, (byte) 0x77, (byte) 0x7e, (byte) 0x79, (byte) 0x6c, (byte) 0x6b, (byte) 0x62, (byte) 0x65, - (byte) 0x48, (byte) 0x4f, (byte) 0x46, (byte) 0x41, (byte) 0x54, (byte) 0x53, (byte) 0x5a, (byte) 0x5d, (byte) 0xe0, - (byte) 0xe7, (byte) 0xee, (byte) 0xe9, (byte) 0xfc, (byte) 0xfb, (byte) 0xf2, (byte) 0xf5, (byte) 0xd8, (byte) 0xdf, - (byte) 0xd6, (byte) 0xd1, (byte) 0xc4, (byte) 0xc3, (byte) 0xca, (byte) 0xcd, (byte) 0x90, (byte) 0x97, (byte) 0x9e, - (byte) 0x99, (byte) 0x8c, (byte) 0x8b, (byte) 0x82, (byte) 0x85, (byte) 0xa8, (byte) 0xaf, (byte) 0xa6, (byte) 0xa1, - (byte) 0xb4, (byte) 0xb3, (byte) 0xba, (byte) 0xbd, (byte) 0xc7, (byte) 0xc0, (byte) 0xc9, (byte) 0xce, (byte) 0xdb, - (byte) 0xdc, (byte) 0xd5, (byte) 0xd2, (byte) 0xff, (byte) 0xf8, (byte) 0xf1, (byte) 0xf6, (byte) 0xe3, (byte) 0xe4, - (byte) 0xed, (byte) 0xea, (byte) 0xb7, (byte) 0xb0, (byte) 0xb9, (byte) 0xbe, (byte) 0xab, (byte) 0xac, (byte) 0xa5, - (byte) 0xa2, (byte) 0x8f, (byte) 0x88, (byte) 0x81, (byte) 0x86, (byte) 0x93, (byte) 0x94, (byte) 0x9d, (byte) 0x9a, - (byte) 0x27, (byte) 0x20, (byte) 0x29, (byte) 0x2e, (byte) 0x3b, (byte) 0x3c, (byte) 0x35, (byte) 0x32, (byte) 0x1f, - (byte) 0x18, (byte) 0x11, (byte) 0x16, (byte) 0x03, (byte) 0x04, (byte) 0x0d, (byte) 0x0a, (byte) 0x57, (byte) 0x50, - (byte) 0x59, (byte) 0x5e, (byte) 0x4b, (byte) 0x4c, (byte) 0x45, (byte) 0x42, (byte) 0x6f, (byte) 0x68, (byte) 0x61, - (byte) 0x66, (byte) 0x73, (byte) 0x74, (byte) 0x7d, (byte) 0x7a, (byte) 0x89, (byte) 0x8e, (byte) 0x87, (byte) 0x80, - (byte) 0x95, (byte) 0x92, (byte) 0x9b, (byte) 0x9c, (byte) 0xb1, (byte) 0xb6, (byte) 0xbf, (byte) 0xb8, (byte) 0xad, - (byte) 0xaa, (byte) 0xa3, (byte) 0xa4, (byte) 0xf9, (byte) 0xfe, (byte) 0xf7, (byte) 0xf0, (byte) 0xe5, (byte) 0xe2, - (byte) 0xeb, (byte) 0xec, (byte) 0xc1, (byte) 0xc6, (byte) 0xcf, (byte) 0xc8, (byte) 0xdd, (byte) 0xda, (byte) 0xd3, - (byte) 0xd4, (byte) 0x69, (byte) 0x6e, (byte) 0x67, (byte) 0x60, (byte) 0x75, (byte) 0x72, (byte) 0x7b, (byte) 0x7c, - (byte) 0x51, (byte) 0x56, (byte) 0x5f, (byte) 0x58, (byte) 0x4d, (byte) 0x4a, (byte) 0x43, (byte) 0x44, (byte) 0x19, - (byte) 0x1e, (byte) 0x17, (byte) 0x10, (byte) 0x05, (byte) 0x02, (byte) 0x0b, (byte) 0x0c, (byte) 0x21, (byte) 0x26, - (byte) 0x2f, (byte) 0x28, (byte) 0x3d, (byte) 0x3a, (byte) 0x33, (byte) 0x34, (byte) 0x4e, (byte) 0x49, (byte) 0x40, - (byte) 0x47, (byte) 0x52, (byte) 0x55, (byte) 0x5c, (byte) 0x5b, (byte) 0x76, (byte) 0x71, (byte) 0x78, (byte) 0x7f, - (byte) 0x6a, (byte) 0x6d, (byte) 0x64, (byte) 0x63, (byte) 0x3e, (byte) 0x39, (byte) 0x30, (byte) 0x37, (byte) 0x22, - (byte) 0x25, (byte) 0x2c, (byte) 0x2b, (byte) 0x06, (byte) 0x01, (byte) 0x08, (byte) 0x0f, (byte) 0x1a, (byte) 0x1d, - (byte) 0x14, (byte) 0x13, (byte) 0xae, (byte) 0xa9, (byte) 0xa0, (byte) 0xa7, (byte) 0xb2, (byte) 0xb5, (byte) 0xbc, - (byte) 0xbb, (byte) 0x96, (byte) 0x91, (byte) 0x98, (byte) 0x9f, (byte) 0x8a, (byte) 0x8d, (byte) 0x84, (byte) 0x83, - (byte) 0xde, (byte) 0xd9, (byte) 0xd0, (byte) 0xd7, (byte) 0xc2, (byte) 0xc5, (byte) 0xcc, (byte) 0xcb, (byte) 0xe6, - (byte) 0xe1, (byte) 0xe8, (byte) 0xef, (byte) 0xfa, (byte) 0xfd, (byte) 0xf4, (byte) 0xf3}; } \ No newline at end of file diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java index 27c2838..6e078a3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java @@ -1,9 +1,6 @@ package com.casic.missiles.parser.safe.impl; -import cn.hutool.core.util.CharsetUtil; -import cn.hutool.crypto.symmetric.SM4; -import cn.hutool.crypto.symmetric.SymmetricCrypto; - +import com.casic.missiles.parser.safe.SafeStrategy; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; @@ -11,19 +8,44 @@ import org.bouncycastle.crypto.engines.SM4Engine; import org.bouncycastle.crypto.params.KeyParameter; import org.bouncycastle.util.encoders.Hex; - -import static cn.hutool.crypto.Mode.ECB; -import static cn.hutool.crypto.Padding.NoPadding; +import org.springframework.stereotype.Component; /** * SM4算法工具类 */ @Slf4j -public class Sm4 { +@Component("sm4") +public class Sm4 implements SafeStrategy { //加解密的字节快大小 public static final int BlockSize = 16; + @Override + public String decryption(String cipher) { + byte[] keyByte = { + 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 + }; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(keyByte); + byte[] in = Hex.decode(cipher); + byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); + String plain = EcbDecrypt(in, keyBytes); + return plain; + } + + @Override + public String encryption(String cipher) { + byte[] keyByte = { + 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 + }; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(keyByte); + byte[] in = Hex.decode(cipher); + byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); + String plain = EcbDecrypt(in, keyBytes); + return plain; + } + /** * SM4ECB加密算法,对内 * @@ -32,8 +54,6 @@ * @return */ private static byte[] ecb_encrypt(byte[] in, byte[] keyBytes) { - - SM4Engine sm4Engine = new SM4Engine(); sm4Engine.init(true, new KeyParameter(keyBytes)); byte[] out = new byte[in.length]; @@ -58,27 +78,6 @@ return cipher; } - - /** - * hutool 解密SM4 - * - * @param encodeContent - * @return - */ - public static String decode(String encodeContent) { - String key = "24ad182507479a5da3ad94d9d78ea203"; - try { - SymmetricCrypto sm4 = new SM4(ECB, NoPadding, key.getBytes()); - String decryptStr = sm4.decryptStr(encodeContent, CharsetUtil.CHARSET_UTF_8); - return decryptStr; - } catch (Exception e) { - e.printStackTrace(); - log.error("SM4解密失败"); - } - return null; - } - - /** * SM4的ECB加密算法 * @@ -129,20 +128,6 @@ return plain; } - /** - * SM4的ECB解密算法 - * - * @param cipher 输入的密文字符串 - * @param key 密钥 - * @return - */ - public static String EcbDecrypt(String cipher, String key) { - byte[] in = Hex.decode(cipher); - byte[] keyBytes = Hex.decode(key); - - String plain = EcbDecrypt(in, keyBytes); - return plain; - } /** * 主函数 @@ -151,28 +136,24 @@ */ public static void main(String[] args) { byte[] ciphertext = { + 0x4B, (byte) 0x8C, (byte) 0x9D, 0x08, (byte) 0xE4, (byte) 0xD3, 0x64, 0x42, (byte) 0xB9, (byte) 0xA5, (byte) 0xFE, (byte) 0xCD, (byte) 0x91, 0x1B, 0x38, (byte) 0xAC, (byte) 0xE9, 0x1C, (byte) 0xCD, 0x53, 0x02, (byte) 0xD7, 0x0C, (byte) 0x9B, (byte) 0x96, 0x30, 0x62, (byte) 0xE8, (byte) 0xFB, (byte) 0xEF, (byte) 0xB9, (byte) 0xFF, (byte) 0xDE, 0x19, (byte) 0x80, 0x35, 0x3E, (byte) 0x90, 0x4F, 0x2F, 0x12, 0x2B, 0x19, (byte) 0x8B, 0x6C, 0x7A, (byte) 0x85, (byte) 0xA1, (byte) 0xB1, (byte) 0x86, (byte) 0xA3, 0x7A, 0x46, 0x0C, 0x2F, (byte) 0x94, 0x4F, 0x7F, 0x2C, 0x56, 0x14, (byte) 0xF3, (byte) 0x89, (byte) 0xC3, - 0x3F, 0x20, (byte) 0xF9, (byte) 0x87, (byte) 0xA1, 0x60, (byte) 0xD9, (byte) 0xA8, (byte) 0xFD, (byte) 0xD7, (byte) 0x9B, 0x4B, 0x26, 0x06, 0x30, 0x44}; + 0x3F, 0x20, (byte) 0xF9, (byte) 0x87, (byte) 0xA1, 0x60, (byte) 0xD9, (byte) 0xA8, (byte) 0xFD, (byte) 0xD7, (byte) 0x9B, 0x4B, 0x26, 0x06, 0x30, 0x44 + }; ByteBuf in = ByteBufAllocator.DEFAULT.heapBuffer(); in.writeBytes(ciphertext); - byte[] keyByte = { 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 }; ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); - key.writeBytes(ciphertext); - String resCipherData = decode(ByteBufUtil.hexDump(in)); - ByteBuf out = ByteBufAllocator.DEFAULT.heapBuffer(); -// out.writeBytes(resCipherData); -// System.out.println(hexBytes); - System.out.println(resCipherData.toString()); -// String resPlainData = EcbDecrypt(resCipherData, key); -// System.out.println("原始明文:" + data); -// System.out.println("解密后明文:" + resPlainData); + key.writeBytes(keyByte); +// String resCipherData = EcbDecrypt(ByteBufUtil.hexDump(in), ByteBufUtil.hexDump(key)); +// System.out.println(resCipherData); } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java index 608af3a..32cc8a4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java @@ -2,48 +2,47 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.delivery.decorator.ByteDecorator; +import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @AllArgsConstructor public class FieldDecoratorManger { - private final RuleDictDao ruleDictDao; + private final RuleConfigRegistry ruleDictDao; // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 // (1)静态的业务字段是字典里面可以配置的 // (2)动态的业务字段是通过规则生成的 public String contentMerge(String ruleJson, String sceneConent, String dynamicContent) { - List ruleDictList = ruleDictDao.getRuleDictConfig(); - Map ruleDictMap = ruleDictList.stream().collect( - Collectors.toMap(RuleDict::getId, e -> e)); - List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); - for (Map ruleMap : ruleMapList) { - String ruleType = String.valueOf(ruleMap.get("ruleType")); - ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); - NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); - byteDecorator.nodeDecoratorRule(nodeDecoratorParm); - } +// List ruleDictList = ruleDictDao.getRuleDictConfig(); +// Map ruleDictMap = ruleDictList.stream().collect( +// Collectors.toMap(RuleDict::getId, e -> e)); +// List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); +// for (Map ruleMap : ruleMapList) { +// String ruleType = String.valueOf(ruleMap.get("ruleType")); +// ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); +// NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); +// byteDecorator.nodeDecoratorRule(nodeDecoratorParm); +// } return null; } - - private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { - NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() - .contents(sceneConent) - .dynamicContent(dynamicContent) - .ruletypeId(ruletypeId) - .ruleDictMap(ruleDictMap) - .build(); - return nodeDecoratorParm; - } +// +// private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { +// NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() +// .contents(sceneConent) +// .dynamicContent(dynamicContent) +// .ruletypeId(ruletypeId) +// .ruleDictMap(ruleDictMap) +// .build(); +// return nodeDecoratorParm; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java index 652970c..b204ac3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java @@ -1,56 +1,56 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@AllArgsConstructor -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", - JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Component; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Component("logicalDecorator") +//@AllArgsConstructor +//@Slf4j +//public class LogicalShiftDecorator implements ByteDecorator { +// +//// private final FieldRuleEngineMapper fieldRuleEngineMapper; +//// +//// //字节位移 +//// @Override +//// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +//// String logicalValue = ""; +//// RuleEvaluator fieldRuleEngine = new RuleEvaluator(); +//// try { +//// Map env2 = new HashMap(); +//// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +//// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +//// for (String contentId : contentIdList) { +//// RuleDict ruleDict = ruleDictMap.get(contentId); +//// if (ruleDict.getCode().contains("#")) { +//// //使用动态的值 +//// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +//// } +//// env2.put(ruleDict.getName(), ruleDict.getCode()); +//// } +//// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +//// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +//// return null; +//// } +//// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +//// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +//// return values; +//// } catch (Exception ex) { +//// log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", +//// JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +//// return null; +//// } +//// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java index 346468f..822fead 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@AllArgsConstructor -@Slf4j -public class OperationDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("optionDecorator") +//@AllArgsConstructor +//@Slf4j +//public class OperationDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //混合运算,有常量或者乘除的缩放 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java index 50fb0a7..7a8bccb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@AllArgsConstructor -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +////精度计算 +//@AllArgsConstructor +//@Registry("precisionDecorator") +//@Slf4j +//public class PrecisionDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java index da39235..27f9cc7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java @@ -1,54 +1,53 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@AllArgsConstructor -@Slf4j -public class RuleDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("ruleDecorator") +//@AllArgsConstructor +//@Slf4j +//public class RuleDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //吃我一套正则表达式 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (Exception ex) { +// log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java index 7f5cbf3..c043f97 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java @@ -2,6 +2,6 @@ import java.util.Map; -public interface ComandeEventService { +public interface ComandeEventService{ Map loadComandeEventConfig(String protocolId,String scene); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java index 476ad84..aaf1837 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java @@ -2,46 +2,46 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.dao.CommandEventDao; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @Slf4j @AllArgsConstructor -public class ComandeEventServiceImpl implements ComandeEventService { +public class ComandeEventServiceImpl implements ComandeEventRegistry { - private final CommandEventDao commandEventDao; + // private final CommandEventDao commandEventDao; // 加密bean 固定字段出现变化的字段解析,业务字段的有序内容 @Override - public Map loadComandeEventConfig(String protocolId,String sceneName) { - CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); - if (ObjectUtil.isEmpty(commandEventConfig)) { - log.error("协议{},没有配置成功接收回复配置,清排查原因"); - return null; - } - String replyJson = commandEventConfig.getReplyContentJson(); - List> replyMapList = JSONArray.parseObject(replyJson, List.class); - List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); - Map fixMap = fixList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); - List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) - .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) - .collect(Collectors.toList()); - Map commandConfigMap = new HashMap<>(); - commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); - commandConfigMap.put("fixContent", fixMap); - commandConfigMap.put("bizContent", contentList); - return commandConfigMap; + public Map loadComandeEventConfig(String protocolId, String sceneName) { +// CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); +// if (ObjectUtil.isEmpty(commandEventConfig)) { +// log.error("协议{},没有配置成功接收回复配置,清排查原因"); +// return null; +// } +// String replyJson = commandEventConfig.getReplyContentJson(); +// List> replyMapList = JSONArray.parseObject(replyJson, List.class); +// List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); +// Map fixMap = fixList.stream() +// .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); +// List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) +// .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) +// .collect(Collectors.toList()); +// Map commandConfigMap = new HashMap<>(); +// commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); +// commandConfigMap.put("fixContent", fixMap); +// commandConfigMap.put("bizContent", contentList); +// return commandConfigMap; + return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 128b09d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java deleted file mode 100644 index 4016b0b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface DatagramEventMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java deleted file mode 100644 index 597c306..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.apache.ibatis.annotations.Mapper; - -public interface FieldConfigMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java deleted file mode 100644 index a31680a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.PreRuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface PreRuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java deleted file mode 100644 index 9060a69..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface ProtocolConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java deleted file mode 100644 index 6fa6936..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java deleted file mode 100644 index 582a705..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleDict; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleDictMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java deleted file mode 100644 index 6e302c8..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.CommandEventMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Optional; - -@Component -public class CommandEventDao { - - @Resource - private CommandEventMapper commandEventMapper; - - public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId) - .eq("scene", sceneName) - .eq("enabled", 1); - List commandEventConfig = commandEventMapper.selectList(queryWrapper); - Optional optionalEventConfig = commandEventConfig.stream().findFirst(); - return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java deleted file mode 100644 index 9137e4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.FieldConfigMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class FieldConfigDao { - - @Resource - private FieldConfigMapper fieldConfigMapper; - - public FieldConfig getFieldConfigById(String fieldId) { - FieldConfig fieldConfig = fieldConfigMapper.selectById(fieldId); - return fieldConfig; - } - - public List getFieldConfigs(String protocolId,Integer isFixed) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",isFixed); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - - public List getStorageFieldConfig(String protocolId) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",1) - .eq("is_storage",1); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java deleted file mode 100644 index 67bff6b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.mapper.PreRuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class PreRuleConfigDao { - - @Resource - private PreRuleConfigMapper preRuleConfigMapper; - - public List getPreRuleList(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return preRuleConfigMapper.selectList(queryWrapper); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java deleted file mode 100644 index d69ea85..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.RuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleConfigDao { - - @Resource - private RuleConfigMapper ruleConfigMapper; - - public RuleConfig getNextRuleConfig(String ruleFields) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("parse_rule_json", ruleFields); - return ruleConfigMapper.selectOne(queryWrapper); - } - - - public List getRuleConfigById(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return ruleConfigMapper.selectList(queryWrapper); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java deleted file mode 100644 index 932c185..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.RuleDictMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleDictDao { - - @Resource - private RuleDictMapper ruleDictMapper; - - public List getRuleDictConfig() { - List ruleDictList = ruleDictMapper.selectList(null); - return ruleDictList; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java index 9f9e279..43bc4d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java @@ -10,20 +10,15 @@ import io.netty.channel.socket.nio.NioServerSocketChannel; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import javax.annotation.PreDestroy; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static cn.hutool.core.util.ClassUtil.getClasses; /** * SensorhubServer netty服务端 */ @Slf4j -@Service +@Component public class SensorhubServer { /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java index 2c79ff5..9a28c36 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java @@ -11,13 +11,13 @@ import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioSocketChannel; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClient 客户端 */ @Slf4j -@Service +@Registry public final class SensorhubClient { public static void main(String[] args) throws Exception { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java index 9774be0..477c3f7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java @@ -6,12 +6,12 @@ import io.netty.channel.socket.SocketChannel; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientChannelInitialHandler */ -@Service +@Registry public class SensorhubClientChannelInitialHandler extends ChannelInitializer { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java index 346f4b3..73560e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java @@ -5,13 +5,13 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientHandler */ @Slf4j -@Service +@Registry public class SensorhubClientHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java index 5c1c6f2..d990af5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java @@ -4,12 +4,12 @@ import com.casic.missiles.pojo.Msg; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** * SensorhubServerHandler */ -@Service +@Component public class SensorhubServerHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 67283ae..af3172c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,41 +1,37 @@ package com.casic.missiles.parser; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultProtocolConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.*; +import com.casic.missiles.registry.FieldConfigRegistry; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; -import java.nio.charset.Charset; import java.util.HashMap; import java.util.List; import java.util.Map; -@Service("genericProtocolParser") +/** + * @author + */ +@Component("genericProtocolParser") @Slf4j -@AllArgsConstructor +@RequiredArgsConstructor public class GenericProtocolParser implements ProtocolParser { - private final LeadingCodeMatcher leadingCodeMatcher; private final List frameStructDispenserList; - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorInstanceSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; // 匹配首字母前导码=> 帧结构匹配前导码=> // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 @@ -44,18 +40,19 @@ public Boolean doParseProtocol(ByteBuf byteBuf) { String protocolContent = ByteBufUtil.hexDump(byteBuf); //匹配前导码 - List preCodeConfigs = leadingCodeMatcher.matchLeadingCode(protocolContent); + List preCodeConfigs = LeadingCodeMatcher.matchFrameLeadingCode(protocolContent); //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 if (preCodeConfigs.size() == 0) { - return rematch(byteBuf,protocolContent); + return rematch(byteBuf, protocolContent); } - //暂时先取第一个 + //暂时先取第一个,提升速度,使用享元模式, 减少类的创建销毁与构建 ProtocolConfig protocolConfig = preCodeConfigs.get(0); + AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); ByteBuf wholeDatagramByte = null; //通过匹配帧结构获取完整的数据包 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, preCodeConfigs.get(0))) != null) { + if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, protocolFactory)) != null) { break; } } @@ -68,76 +65,78 @@ * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 */ - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId, wholeDatagramByte); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap, protocolId); - //选取规则对应的流程实例 - DatagramEventConfig datagramEventConfig = processorInstanceSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); + //进行规则字段解析,进行匹配规则 + RuleConfig ruleConfig = getRuleConfig(protocolFactory, wholeDatagramByte); + if (ruleConfig == null) { + return false; + } //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, wholeDatagramByte); + ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte); + //以下进行业务的规则解析,同时选定流程实例 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); + DatagramEventProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain, + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText, protocolId); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain); //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); + datagramEventProvider.storeData(bizDataMap); return true; } - private Boolean rematch(ByteBuf byteBuf,String protocolContent) { + /** + * 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 + */ + private Boolean rematch(ByteBuf byteBuf, String protocolContent) { //重置位判断 byteBuf.resetReaderIndex(); //判断重置是否前移,如果没有前移,则直接判为匹配失败 if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { return false; } else { + //递归执行 return doParseProtocol(byteBuf); } } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; + //获取匹配规则->匹配规则 + private RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + //取出其中参与逻辑provider并判空 + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); + String rulePrepareFields = protocolConfig.getRulePrepareFields(); + //固定字段 + if (StringUtils.isNotEmpty(rulePrepareFields)) { + //获取统一固定字段解析 + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + //获取该协议的字段配置,用于协议规则匹配 + List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); + //获取规则 + RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, + rulePrepareFields, protocolFieldConfigs); + return ruleConfig; + } + return null; } - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + //数据构建,获取固定字段的store和业务字段store + private Map buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + Map bizDataMap = new HashMap<>(); + Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); + Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); + bizDataMap.putAll(ruleStoreObjectMap); + bizDataMap.putAll(protocolStoreObjectMap); return bizDataMap; } - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java index 8a46e32..16ce2e5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java @@ -3,6 +3,7 @@ import io.netty.buffer.ByteBuf; public interface ProtocolParser { + Boolean doParseProtocol(ByteBuf byteBuf); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java new file mode 100644 index 0000000..f7814af --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java @@ -0,0 +1,35 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.ProtocolConfigProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.ProtocolConfig; + +/** + * 存放基本协议的的加载信息 + */ +public class AbstractProtocolConfigFactory { + private final ProtocolConfigProvider protocolConfigProvider; + private final ProtocolFieldConfigProvider protocolFieldConfigProvider; + private final RuleConfigProvider ruleConfigProvider; + + public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { + this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); + this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); + this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); + } + + public ProtocolConfigProvider getProtocolConfigProvider() { + return protocolConfigProvider; + } + + public ProtocolFieldConfigProvider getProtocolFieldConfigProvider() { + return protocolFieldConfigProvider; + } + + public RuleConfigProvider getRuleConfigProvider() { + return ruleConfigProvider; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java new file mode 100644 index 0000000..6e36147 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java @@ -0,0 +1,57 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.CombinedFieldConfigProvider; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.FieldConfigProvider; +import com.casic.missiles.parser.provider.FieldRuleConfigProvider; + +/** + * 存放规则相关的的的加载信息 + */ +public class AbstractRuleConfigFactory { + + /** + * 处理字节 + */ + private final FieldConfigProvider fieldConfigProvider; + /** + * 处理组合字节解析的解码器 + */ + private final CombinedFieldConfigProvider combinedFieldConfigProvider; + /** + * 处理负责字节解析的规则配置 + */ + private final FieldRuleConfigProvider fieldRuleConfigProvider; + /** + * 处理实例流程 + */ + private final DatagramEventProvider datagramEventProvider; + + + public AbstractRuleConfigFactory(Long ruleId) { + this.fieldConfigProvider = new FieldConfigProvider(ruleId); + this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); + this.fieldRuleConfigProvider = new FieldRuleConfigProvider(ruleId); + this.datagramEventProvider = new DatagramEventProvider(ruleId); + } + + public FieldConfigProvider getFieldConfigProvider() { + return fieldConfigProvider; + } + + public CombinedFieldConfigProvider getCombinedFieldConfigProvider() { + return combinedFieldConfigProvider; + } + + public FieldRuleConfigProvider getFieldRuleConfigProvider() { + return fieldRuleConfigProvider; + } + + public DatagramEventProvider getDatagramEventProvider() { + return datagramEventProvider; + } + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java deleted file mode 100644 index 6e1719a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.factory; - - -import com.casic.missiles.pojo.ProtocolConfig; - -import java.util.List; - -/** - * 数据库访问优化(暂时未做) - *

- * 1、初始化协议解析配置,并存放到处存放缓存,对协议基本配置进行管理 - * 2、其中流程中所有的配置都经过此类进行管理,进行调用获取,增强解析速度 - */ -public interface DatagramFactory { - - /** - * 初始化 - */ - List datagramInit(); - - /** - * 根据前导码配置匹配,模糊匹配获取所有的报文项 - */ - List match(); - - /** - * 根据前导码匹配,返回报文项 - */ - List filer(); - - /** - * 保证数据的唯一性选择器 - */ - List selectOne(); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java new file mode 100644 index 0000000..87444a0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java @@ -0,0 +1,18 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +import java.util.List; + +/** + * 直接用,还是边用边创建 + */ +public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { + + + public DefaultProtocolConfigFactory(ProtocolConfig protocolConfig) { + super(protocolConfig); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java new file mode 100644 index 0000000..cce0c7c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java @@ -0,0 +1,12 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; + +public class DefaultRuleFactory extends AbstractRuleConfigFactory { + + public DefaultRuleFactory(Long ruleId) { + super(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java deleted file mode 100644 index 9ee97e0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.casic.missiles.parser.instance; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service -@Slf4j -@AllArgsConstructor -public class GeneralProcessor { - - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; - - /** - * 统一固定字段解析=>进行规则的查询的判断 - * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 - * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 - */ - @Deprecated - public boolean parseWholeDatagram(ByteBuf buffer, ProtocolConfig protocolConfig) { - try { - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap,protocolId); - //选取规则对应的流程= - DatagramEventConfig datagramEventConfig = processorSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); - //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); - //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); - //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); - //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); - //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); - return true; - } catch (Exception ex) { - log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", - ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); - return false; - } - } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; - } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); - } - - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); - return bizDataMap; - } - - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java index 25e7ad8..6a5777e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java @@ -1,23 +1,31 @@ package com.casic.missiles.parser.instance.impl; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.mapper.DatagramEventMapper; import com.casic.missiles.pojo.DatagramEventConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.SpringContextUtil; -@Service -@AllArgsConstructor +import java.util.List; +import java.util.Optional; + +/** + * @author cz + * + */ public class DefaultProcessorInstanceSelector implements ProcessorInstanceSelector { - private final DatagramEventMapper datagramEventMapper; + private static List datagramEventConfigs; + + static { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + datagramEventConfigs = datagramEventRegistry.getDatagramEventList(); + } @Override public DatagramEventConfig getProcessorInstance(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("rule_id", protocolId); - return datagramEventMapper.selectOne(queryWrapper); + Optional optionalSelectInstance = datagramEventConfigs.stream() + .filter(e -> e.getId().equals(protocolId)).limit(1).findFirst(); + return optionalSelectInstance.isPresent() ? optionalSelectInstance.get() : null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a778671..7b56a43 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,16 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import io.netty.buffer.ByteBuf; /** - * 分析匹配情况 - * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 - * 2、匹配不成功,有后续帧,可以进行下次匹配。 - * 3、匹配不成功,无后续帧,可以进行丢弃。 + * 分析匹配情况 + * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 + * 2、匹配不成功,有后续帧,可以进行下次匹配。 + * 3、匹配不成功,无后续帧,可以进行丢弃。 */ -public interface FrameStructMatcher{ +public interface FrameStructMatcher { - ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig); + ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 05320ab..8ebea78 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,23 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.ProtocolConfigMapper; +import com.casic.missiles.parser.provider.ProtocolConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Component; import java.util.List; import java.util.stream.Collectors; -@Component -@AllArgsConstructor public class LeadingCodeMatcher { - private final ProtocolConfigMapper protocolMapper; - //** 1、首字母匹配前导码, // 2、以匹配出的前导码是否在报文中条件进行前导码的匹配二次筛选 - public List matchLeadingCode(String protocolContent){ + public static List matchFrameLeadingCode(String protocolContent){ List initialConfigs = initialMatch(protocolContent); List preCodeConfigs = initialConfigs.stream() .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) @@ -26,13 +19,16 @@ } //初始化匹配前导码内容 - private List initialMatch(String protocolContent) { - String protocolStr = protocolContent.charAt(0) + ""; - QueryWrapper queryWrapper = new QueryWrapper() - .likeRight("pre_fix", protocolStr); - List protocolConfigList = protocolMapper.selectList(queryWrapper); - return protocolConfigList; + private static List initialMatch(String protocolContent) { + String firstFrameChar = protocolContent.charAt(0) + ""; + ProtocolConfigProvider protocolConfigProvider=new ProtocolConfigProvider(firstFrameChar); + return protocolConfigProvider.getMatchList(); } + + + + + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index cf2113d..e915877 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -1,32 +1,35 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(0) -@Service +@Component public class FrameLengthMatcher implements FrameStructMatcher { - @Autowired - private FieldParser fieldParser; - //超过长度 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { String dataGramContent = ByteBufUtil.hexDump(byteBuf); - if (StringUtils.isEmpty(protocolConfig.getUnpackId()) && StringUtils.isEmpty(protocolConfig.getTailStr())) { - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + //当不存在结尾标志和拆包标志,可以直接使用长度进行匹配 + if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { if (dataGramContent.length() >= totalLength) {//等于长度返回true,超出长度,切断 - ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, protocolConfig, totalLength); + ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, totalLength); return wholeDatagramByte; } else { //读的标志位前移舍弃 @@ -38,7 +41,7 @@ return null; } - private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, Integer totalLength) { byteBuf.readBytes(totalLength); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, totalLength - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 2bfc213..d527ad0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; @@ -13,7 +13,7 @@ import lombok.AllArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.nio.charset.Charset; import java.util.Map; @@ -22,32 +22,30 @@ * 后续标志验证 */ @Order(1) -@Service +@Component @AllArgsConstructor -public class FrameMarkMatcher implements FrameStructMatcher { - - private final FieldConfigDao fieldConfigDao; - private final FieldParser fieldParser; - private final FieldResolver fieldResolverManger; +public class FrameMarkMatcher implements FrameStructMatcher, FixedPropertyEnum { //帧后续标志=>结束,进行帧的重组=>有后续,1、帧移位判别 2、继续接收帧 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig UnpackConfig = StringUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getUnpackId()); - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); - Integer upback = 0; + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); ByteBuf mergeWholeFrameByte = null; - if (!ObjectUtil.isEmpty(UnpackConfig)) { - while (hasNextFullFrame(byteBuf, protocolConfig)) { - upback = (Integer) fieldResolverManger.filedParserManger(byteBuf, UnpackConfig, null); + if (!ObjectUtil.isEmpty(unpackFlag)) { + while (hasNextFullFrame(byteBuf, protocolConfig, protocolFieldConfigProvider)) { //是否存在后续位 - if (upback == 1) {//使用esayRule + if (unpackFlag == 1) {//使用esayRule //表示可以截取 - mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolConfig, totalLength); + mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolFieldConfigProvider, protocolConfig); return mergeWholeFrameByte; } else { - byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig)); + byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig, protocolFieldConfigProvider)); } } } @@ -56,7 +54,8 @@ //选取第一个帧,将业务内容和后面部分分开 //计算数据报文-业务内容 - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolFieldConfigProvider protocolFieldConfigProvider, ProtocolConfig protocolConfig) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); //截取完整报文 byteBuf.readBytes(totalLength); ByteBuf byteBufContent = byteBuf.slice(0, byteBuf.readerIndex()); @@ -68,15 +67,15 @@ String tail = ""; System.out.println(ByteBufUtil.hexDump(byteBufContent)); //会存在多个帧拼接在一起的的情况,进行合并处理 - while (hasNextFullFrame(byteBufContent, protocolConfig)) { - Integer currentFrameLength = fieldParser.getTotalLength(protocolConfig, byteBufContent); + while (hasNextFullFrame(byteBufContent, protocolConfig, protocolFieldConfigProvider)) { + Integer currentFrameLength = protocolFieldConfigProvider.getTotalLength(byteBufContent, protocolConfig); byteBufContent.readBytes(currentFrameLength); ByteBuf currentbyteBuf = byteBufContent.slice(0, byteBufContent.readerIndex()); byteBufContent.markReaderIndex();//读的标志位前移 System.out.println(ByteBufUtil.hexDump(byteBufContent)); String hexDump = currentbyteBuf.toString(Charset.forName("ISO-8859-1")); //获取当前固定帧结构的关系map - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, currentbyteBuf); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(currentbyteBuf, protocolConfig); if (StringUtils.isEmpty(mergeFrameStr)) { //首次获取业务数据报文 mergeFrameStr += hexDump.substring(0, currentFrameFixedProperty.get("tailPosition")); @@ -95,22 +94,22 @@ /** * 获取平移到下一帧起始位置 */ - public int getNextFrameOffset(ByteBuf buffer, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, buffer); - return currentFrameFixedProperty.get("totalLength"); + public int getNextFrameOffset(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + return currentFrameFixedProperty.get(TOTAL_LENGTH); } /** * 判断是否出错进行整个帧的 */ - public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, byteBuf); + public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); //保证读取位置不在固定位置,是可变的业务内容 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("fixedPosition")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(FIXED_POSITION)) { return false; } //判断读取是否操作帧长度 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("totalLength")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(TOTAL_LENGTH)) { return false; } return true; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 76a3784..c3a1bab 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -1,50 +1,50 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.parser.instance.GeneralProcessor; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; +import io.netty.buffer.ByteBufUtil;; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(2) -@Service +@Component public class FrameTailMatcher implements FrameStructMatcher { - @Resource - private FieldConfigDao fieldConfigDao; - @Autowired - private GeneralProcessor generalProcessor; - //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig tailFieldConfig = StringUtils.isEmpty(protocolConfig.getTailStr()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getTailStr()); - if (!ObjectUtil.isEmpty(tailFieldConfig)) { - String tailStr = tailFieldConfig.getFieldName(); + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfig protocolFieldConfig = ObjectUtils.isEmpty(protocolConfig.getTailStr()) ? null : + fieldConfigProvider.getFieldConfigById(protocolConfig.getTailStr()); + if (!ObjectUtil.isEmpty(protocolFieldConfig)) { + String tailStr = protocolFieldConfig.getFieldName(); String dataGramContent = ByteBufUtil.hexDump(byteBuf); Boolean tailFlag = ByteBufUtil.hexDump(byteBuf).contains(tailStr); if (!tailFlag) { //使用esayRule return null; } else if (dataGramContent.indexOf(tailStr) < dataGramContent.length() - tailStr.length()) { Integer length = dataGramContent.indexOf(tailStr) + tailStr.length(); - ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, protocolConfig, length); + ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, length); return wholeDatagramByte; //存在粘包 } } return null; } - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer length) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, Integer length) { byteBuf.readBytes(length); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, length - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java new file mode 100644 index 0000000..5f1c177 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java @@ -0,0 +1,73 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.combined.GenericCombinedFieldResolver; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.CombinedFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class CombinedFieldConfigProvider { + + + /** + * 作为临时配置列表缓存使用 + */ + private final List combinedFieldConfigList; + private Map storeObjectMap = new HashMap<>(); + + public CombinedFieldConfigProvider(Long ruleId) { + CombinedFieldConfigRegistry combinedFieldConfigRegistry = SpringContextUtil.getBean(CombinedFieldConfigRegistry.class); + combinedFieldConfigList = combinedFieldConfigRegistry.getCombinedFieldConfigList(ruleId); + } + + public void parseDataField(RuleConfig ruleConfig, String clearZeroPlain,Map fieldConfigsMap ) { + if (showSkip()) { + return; + } + //匹配对应的数据,然后进行相关的字段解析 + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver(); + combinedFieldResolver.parseDataField(combinedFieldConfigList, byteBuf, storeObjectMap,fieldConfigsMap); + } + + + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getCombinedFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return combinedFieldConfigList.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public List getCombinedFieldConfigList() { + return combinedFieldConfigList; + } + + /* 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(combinedFieldConfigList) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java new file mode 100644 index 0000000..f3cfedc --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java @@ -0,0 +1,11 @@ +package com.casic.missiles.parser.provider; + +/** + * @author cz + * @date 2023-6-12 + */ +public class CommandEventProvider{ + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java new file mode 100644 index 0000000..70eec5e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java @@ -0,0 +1,77 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.safe.SafeStrategy; +import com.casic.missiles.parser.sender.DataSubscribeProvider; +import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class DatagramEventProvider { + + private final DatagramEventConfig processorInstance; + + public DatagramEventProvider(Long ruleId) { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + List datagramEventConfigList = + datagramEventRegistry.getDatagramEventList(ruleId); + processorInstance = this.getProcessorInstance(datagramEventConfigList); + } + + public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { + if (showSkip()) { + return null; + } + return datagramEventConfigList.get(0); + } + + // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 + public String getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap) { + String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? + processorInstance.getSafeBean() : + fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); + if (!StringUtils.isEmpty(safeName)) { + //需要加密 + SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); + String plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); + return clearComplementZero(plain); + } + return ByteBufUtil.hexDump(bizDataContent); + } + + //解密清零操作 + private String clearComplementZero(String plain) { + plain = plain.substring(0, plain.lastIndexOf("00")); + return plain; + } + + //数据发送,数据发送者暂未构建 + public void storeData(Map bizDataMap) { + DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); +// dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return ObjectUtils.isNotEmpty(processorInstance) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java new file mode 100644 index 0000000..7e1fe0a --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java @@ -0,0 +1,97 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.FieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class FieldConfigProvider { + + + private final List fieldConfigs; + private Map storeObjectMap = new HashMap<>(); +// private Map singleObjects = new ConcurrentHashMap<>(); + + public FieldConfigProvider(Long ruleId) { + FieldConfigRegistry fieldConfigRegistry = SpringContextUtil.getBean(FieldConfigRegistry.class); + fieldConfigs = fieldConfigRegistry.getFieldConfigList(ruleId); + } + + public List getFieldConfigs() { + return fieldConfigs; + } + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public Map parseDataField(RuleConfig ruleConfig, String clearZeroPlain) { + if (showSkip()) { + return null; + } + List prepareFieldConfig = prepareParseField(ruleConfig); + if (CollectionUtils.isNotEmpty(prepareFieldConfig)) { + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(fieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + return fixDataMap; + } + } + return null; + } + + /** + * 得到需要处理的业务内容 + * + * @return + */ + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return fieldConfigs.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public Map getFieldConfigsMap() { + return fieldConfigs.stream().collect( + Collectors.toMap(FieldConfig::getId, e -> e) + ); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(fieldConfigs) ? false : true; + } + + +} + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java new file mode 100644 index 0000000..817bfaf --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java @@ -0,0 +1,19 @@ +package com.casic.missiles.parser.provider; + +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.registry.FieldRuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; + +public class FieldRuleConfigProvider { + + private final List fieldRuleConfigList; + + public FieldRuleConfigProvider(Long ruleId) { + FieldRuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(FieldRuleConfigRegistry.class); + fieldRuleConfigList = ruleConfigRegistry.getFieldRuleConfigList(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java new file mode 100644 index 0000000..99a1b06 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java @@ -0,0 +1,53 @@ +package com.casic.missiles.parser.provider; + + +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.registry.ProtocolConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolConfigProvider { + + private final List protocolConfigList; + + public ProtocolConfigProvider(String firstChar) { + ProtocolConfigRegistry registry = SpringContextUtil.getBean(ProtocolConfigRegistry.class); + protocolConfigList = registry.getProtocolConfigList(firstChar); + } + + public List getMatchList() { + return protocolConfigList; + } + + /** + * 设置当前协议 + * + * @param protocolConfig + */ + public ProtocolConfigProvider(ProtocolConfig protocolConfig) { + List protocolConfigs = new ArrayList<>(); + protocolConfigs.add(protocolConfig); + protocolConfigList = protocolConfigs; + } + + /** + * 获取当前协议 + * + * @return + */ + public ProtocolConfig getCurrentProtocolConfig() { + if (this.protocolConfigList == null) { + return null; + } else { + return protocolConfigList.get(0); + } + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java new file mode 100644 index 0000000..043927d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java @@ -0,0 +1,213 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.registry.ProtocolFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolFieldConfigProvider { + + private static final String FIXED_FIELD_DS = "fixedFieldDs"; + private static final String CONTENT_FIELD_DS = "contentFieldDs"; + private static final String PROTOCOL_LENGTH = "protocolLength"; + private static final String PROTOCOL_FIELD_ID = "protocolFieldId"; + private static final String PROTOCOL_POSITION = "protocolPosition"; + + private final List protocolFieldConfigs; + private Map singleObjects = new ConcurrentHashMap<>(); + private Map storeObjectMap = new HashMap<>(); + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public ProtocolFieldConfigProvider(Long protocolId) { + ProtocolFieldConfigRegistry protocolFieldConfigRegistry = SpringContextUtil.getBean(ProtocolFieldConfigRegistry.class); + protocolFieldConfigs = protocolFieldConfigRegistry.getProtocolFieldConfigList(protocolId); + } + + public List getProtocolFieldConfigs() { + return protocolFieldConfigs; + } + + public ProtocolFieldConfig getFieldConfigById(Long fieldId) { + Optional optionalConfig = protocolFieldConfigs.stream().filter( + e -> e.getId().equals(fieldId) + ).findFirst(); + return optionalConfig.isPresent() ? optionalConfig.get() : null; + } + + public Integer getProtocolFieldValue(Long protocolFieldId, ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_FIELD_ID + protocolFieldId + ByteBufUtil.hexDump(byteBuf); + //获取缓存 + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + //加载固定长度数据集合 + Map fixDataMap = this.getProtocolDataMap(byteBuf); + ProtocolFieldConfig protocolFieldConfig = selectFieldConfig(protocolFieldId); + Integer protocolFieldValue = 0; + //获取约定字段的总长度 + if (fixDataMap.containsKey(protocolFieldConfig.getFieldName())) { + Object appointUnpackObject = fixDataMap.get(protocolFieldConfig.getFieldName()); + if (ObjectUtils.isNotEmpty(appointUnpackObject)) { + protocolFieldValue = (Integer) appointUnpackObject; + } + } + if (protocolFieldValue != null) { + //加入缓存 + if (ObjectUtils.isNotEmpty(protocolFieldValue)) { + this.singleObjects.put(catchKey, protocolFieldValue); + return protocolFieldValue; + } + } + return null; + } + + /** + * 获取帧固定位置信息 + * + * @param byteBuf + * @param protocolConfig + * @return + */ + public Map getFixedProperty(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_POSITION + protocolConfig.getId(); + if (this.singleObjects.containsKey(catchKey)) { + return (Map) singleObjects.get(catchKey); + } + Map fixedPropertyMap = new HashMap<>(); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + fixedPropertyMap = fieldParser.doGetFixedProperty(protocolFieldConfigs, this.getTotalLength(byteBuf,protocolConfig)); + if (CollectionUtils.isNotEmpty(fixedPropertyMap)) { + this.singleObjects.put(catchKey, fixedPropertyMap); + return fixedPropertyMap; + } + return fixedPropertyMap; + } + + /** + * 获取帧结构应有的总长度 + */ + public Integer getTotalLength(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_LENGTH + ByteBufUtil.hexDump(byteBuf); + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + Integer appointFrameLength = getProtocolFieldValue(protocolConfig.getTotalLengthId(), byteBuf); + if (appointFrameLength != null) { + //获取过滤的字段集合总长度 + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Integer totalFilterLength = fieldParser.getTotalFilterLength(protocolConfig, byteBuf, getFixFieldConfigMap()); + //计算总长度 + Integer totalLength = appointFrameLength + totalFilterLength; + //加入缓存 + if (ObjectUtils.isNotEmpty(totalLength)) { + this.singleObjects.put(catchKey, totalLength); + return totalLength; + } + } + return null; + } + + /** + * 获取协议有关字段解析内容 + * storeObjectMap存储代转存的数据 + * + * @return + */ + public Map getProtocolDataMap(ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(FIXED_FIELD_DS)) { + return (Map) singleObjects.get(FIXED_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(protocolFieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + this.singleObjects.put(FIXED_FIELD_DS, fixDataMap); + return fixDataMap; + } + return null; + } + + /** + * 获取业务报文内容的content字节 + * + * @param wholeDatagramByte + * @return + */ + public ByteBuf getDataContentBuf(ByteBuf wholeDatagramByte) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(CONTENT_FIELD_DS)) { + return (ByteBuf) singleObjects.get(CONTENT_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + ByteBuf bizDataByteBuf = fieldParser.getDataContentBuf(protocolFieldConfigs, wholeDatagramByte); + if (bizDataByteBuf != null) { + this.singleObjects.put(CONTENT_FIELD_DS, bizDataByteBuf); + return bizDataByteBuf; + } + return null; + } + + + private ProtocolFieldConfig selectFieldConfig(Long id) { + Optional optionalProtocolFieldConfig = this.protocolFieldConfigs.stream().filter( + e -> e.getId().equals(id) + ).findFirst(); + return optionalProtocolFieldConfig.isPresent() ? optionalProtocolFieldConfig.get() : null; + } + + + private Map getFixFieldConfigMap() { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, e -> e) + ); + return fixDataFieldMap; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(protocolFieldConfigs) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java new file mode 100644 index 0000000..dafba1c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java @@ -0,0 +1,56 @@ +package com.casic.missiles.parser.provider; + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.rule.GenericRuleResolver; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.RuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleConfigProvider { + + private final List ruleConfigs; + + public List getRuleConfigs() { + return ruleConfigs; + } + + public RuleConfigProvider(Long protocolId) { + RuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(RuleConfigRegistry.class); + ruleConfigs = ruleConfigRegistry.getRuleConfigById(protocolId); + } + + /** + * 获取规则匹配结果 + * + * @param parseFixedDataMap + * @param protocolFieldConfigs + * @return + */ + public RuleConfig doGetRule(Map parseFixedDataMap, + String ids, + List protocolFieldConfigs) { + if (showSkip()) { + return null; + } + RuleConfig ruleConfig = GenericRuleResolver.machRule(parseFixedDataMap, ids, protocolFieldConfigs, ruleConfigs); + return ruleConfig; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(ruleConfigs) ? false : true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java index 3c05891..856b399 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java @@ -1,18 +1,11 @@ package com.casic.missiles.parser.resolver; -import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.springframework.web.bind.annotation.RequestBody; -import javax.annotation.Resource; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -20,19 +13,17 @@ @Slf4j public class ByteMergeProvider { - @Resource - private FieldRuleEngineMapper fieldRuleEngineMapper; - //拿到所有的值合并到一个值 - public String resolveByteMerge(List valueList, String ruletypeId, String vaildRange) { + public static String resolveByteMerge(List valueList, String ruleTypeId, String vaildRange) { String values = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Map vaildMap = getValidRangeMap(vaildRange); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(ruletypeId); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } + //暂时不处理 +// fieldRuleEngine = fieldRuleConfigMapper.selectById(ruleTypeId); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } Map env2 = new HashMap(); for (int i = 0; i < valueList.size(); i++) { if (vaildMap.containsKey(i)) { @@ -47,7 +38,7 @@ } } - private Map getValidRangeMap(String vaildRange) { + private static Map getValidRangeMap(String vaildRange) { String[] range = vaildRange.split(","); Map vaildMap = new HashMap(); for (int i = 0; i < range.length; i++) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 8d821cd..85d6bbf 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -1,9 +1,12 @@ package com.casic.missiles.parser.resolver; +import com.casic.missiles.pojo.AbstractFieldConfig; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; import io.netty.buffer.ByteBuf; +import java.util.List; import java.util.Map; /** @@ -11,18 +14,14 @@ */ public interface FieldParser { -// Map fieldProcess(String protocolContent,); - Map dataParser(RuleConfig ruleConfig, String lightText,String protocolId); + Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength); - Map fixDataParser(String protocolId, ByteBuf buffer); + Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap); - Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf); + ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer); - ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer); - - ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer); - - Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer); + Integer getTotalFilterLength(ProtocolConfig protocolConfig, ByteBuf byteBuf, Map protocolFieldConfigMap); } + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java new file mode 100644 index 0000000..9e0c00e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java @@ -0,0 +1,52 @@ +package com.casic.missiles.parser.resolver; + +import com.casic.missiles.pojo.AbstractFieldConfig; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.util.List; + +public class FieldParserSupport { + + //分别计算bit和byte长度=> 合并长度 + protected Integer calculateLength(List fieldConfigList) { + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + Integer fixedLength = bytefixedLength + bitfixedLength / 8; + return fixedLength; + } + + //找到最大值=> 根据最大值计算业务数据下标 + protected Integer calculatePosition(List fieldConfigList) { + String rex = "[0-9]+"; + Integer max = -1; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) + && Integer.valueOf(fieldConfig.getOriginPositionByte()) > max) { + max = Integer.valueOf(fieldConfig.getOriginPositionByte()); + } + } + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) && fieldConfig.getOriginPositionByte().equals(max)) { + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + } + } + Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; + return maxFixedPosition; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java deleted file mode 100644 index dd3a6cd..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java +++ /dev/null @@ -1,170 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.ByteResolverParam; -import io.netty.buffer.ByteBuf; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -/** - * 字段解析管理总类 - */ -@Service -@Slf4j -@AllArgsConstructor -public class FieldResolver extends ByteMergeProvider { - - //1、字段截取 => 2、简单的字节解析和复杂的字节解析 - public Object filedParserManger(ByteBuf byteBuf, FieldConfig fieldConfig, Integer maxFixedPosition) { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - //最大固定位置不为空, - if (!ObjectUtil.isEmpty(maxFixedPosition)) { - orignPosition -= maxFixedPosition; - } - Object fieldValue = 0; - //待优化 - if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { - fieldValue = bitToResolver(byteBuf, fieldConfig); - } else { - ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); - fieldValue = parsingFields(fieldBytes, fieldConfig.getRuleJson()); - } - return fieldValue; - } - - //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, - //目前默认配置的规则设置暂不支持配置化,由实现完成 - private Object parsingFields(ByteBuf byteBuf, String ruleJson) { - Object fieldsResolveValue = null; - List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); - if (ObjectUtil.isEmpty(ruleMapList)) { - fieldsResolveValue = defaultResolveBuilder(byteBuf); - } else { - fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); - } - return fieldsResolveValue; - } - - private Object defaultResolveBuilder(ByteBuf byteBuf) { - Integer defaultResolveValue = 0; - for (int i = 0; i < byteBuf.writerIndex(); i++) { - defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; - } - return defaultResolveValue; - } - - //字段解析构建器(针对字节单位的) - //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 - // 字节归并结束或者规则结束=>继续根据规则进行判断 - private Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { - Object customizeResolveValue = null; - try { - List bytStrList = new ArrayList<>(); - //存放到数组里面 - for (int i = 0; i < byteBuf.writerIndex(); i++) { - bytStrList.add(byteBuf.readByte()); - } - int i = 0; - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - customizeResolveValue = this.resolveByteMerge(bytStrList, ruletypeId,vaildRange); - break; - } else { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - List tempBytStr = new ArrayList<>(); - for (int k = 0; i < bytStrList.size(); i++) { - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(k) - .value(bytStrList.get(k)) - .ruletypeId(ruletypeId).build(); - tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); - } - bytStrList = tempBytStr; - } - i++; - } - //字节归并到一起=>继续根据规则进行判断 - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(customizeResolveValue) - .ruletypeId(ruletypeId).build(); - customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(customizeResolveValue)); - return customizeResolveValue; - } catch (RuntimeException ex) { - log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); - return null; - } - } - - /** - * 1、单个字节情况表示字段 - * 2、多字节情况表示字段(暂未处理) - */ - private Object bitToResolver(ByteBuf byteBuf, FieldConfig fieldConfig) { - Object fieldValue = new Object(); - try { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - byte fields = 0x00; - if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); - } else { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); - } - - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { - if (!StringUtils.isEmpty(fieldConfig.getExactOrignPosition())) { - fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getExactOrignPosition())).byteValue() - >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); - } else { - fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); - } - } else { - fieldValue = Integer.valueOf(fields & 0xff); - } - if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { - return fieldValue; - } - List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); - int i = 0; - //字节归并到一起=>继续根据规则进行判断 - while (i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(fieldValue) - .ruletypeId(ruletypeId).build(); - fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(fieldValue)); - return fieldValue; - } catch (RuntimeException ex) { - log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); - return null; - } - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java new file mode 100644 index 0000000..1d2aeab --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java @@ -0,0 +1,36 @@ +package com.casic.missiles.parser.resolver.bytes; + +import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.mapper.FieldRuleConfigMapper; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.pojo.ByteResolverParam; +import com.googlecode.aviator.AviatorEvaluator; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; +//转换规则 +@Component("convert") +@AllArgsConstructor +@Slf4j +public class ByteRuleResolver implements ByteResolver { + + private final FieldRuleConfigMapper fieldRuleConfigMapper; + + @Override + public Object resolveOperationRule(ByteResolverParam byteResolverParam){ + FieldRuleConfig fieldRuleEngine=fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); + if(ObjectUtil.isEmpty(fieldRuleEngine)){ + return byteResolverParam.getValue(); + } + String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); + Map env2 = new HashMap(); + env2.put("value", (byte) byteResolverParam.getValue()); + String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); + return values; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java index 103821c..786b71c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java @@ -2,34 +2,34 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("logicalShift") +@Component("logicalShift") @AllArgsConstructor @Slf4j public class LogicalShiftResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //字节位移 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { Integer index = byteResolverParam.getIndex(); - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return byteResolverParam.getValue(); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java index 476747d..01149bd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("operation") +@Component("operation") @AllArgsConstructor @Slf4j public class OperationResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //混合运算,有常量或者乘除的缩放 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java index 0b82cf4..79abcce 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.casic.missiles.pojo.ByteResolverParam; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; //精度计算 -@Service("precision") +@Component("precision") @AllArgsConstructor @Slf4j public class PrecisionResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java deleted file mode 100644 index 5c3f332..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; -//转换规则 -@Service("convert") -@AllArgsConstructor -@Slf4j -public class RuleResolver implements ByteResolver { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam){ - RuleEvaluator fieldRuleEngine=fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); - if(ObjectUtil.isEmpty(fieldRuleEngine)){ - return byteResolverParam.getValue(); - } - String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); - Map env2 = new HashMap(); - env2.put("value", (byte) byteResolverParam.getValue()); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java new file mode 100644 index 0000000..d3bbd91 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java @@ -0,0 +1,15 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; + +import java.util.List; +import java.util.Map; +// 前导码匹配->长度字段 +public interface AbstractCombinedFieldProcessor { + + Map invoke(Map map, ByteBuf byteBuf, List combinedFieldConfigList, + Map fieldConfigsMap, Map storeObjectMap); + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java new file mode 100644 index 0000000..03c8480 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java @@ -0,0 +1,59 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-13 + */ +//依次递增进行数据的解析, +public class GenericCombinedFieldResolver { + + + //通过查询,字段长度长度随机 + public void parseDataField(List combinedFieldConfigList, ByteBuf byteBuf, + Map storeObjectMap, Map fieldConfigsMap) { + Integer frameLength = Integer.valueOf(ByteBufUtil.hexDump(byteBuf)); + //添加前置处理器 + com.casic.missiles.util.ClassUtil classUtil = new com.casic.missiles.util.ClassUtil(); + List abstractCombinedProcessors = classUtil.getSubClassList(AbstractCombinedFieldProcessor.class); + + Map fieldFixedMap = combinedFieldLeadCodeMap(combinedFieldConfigList); + //frameLength + Map combinedProcessorFields = null; + while (byteBuf.readableBytes() < frameLength) { + //一直处理 + for (AbstractCombinedFieldProcessor abstractCombinedProcessor : abstractCombinedProcessors) { + combinedProcessorFields = abstractCombinedProcessor.invoke(combinedProcessorFields, byteBuf, + combinedFieldConfigList, + fieldConfigsMap, storeObjectMap); + if (combinedProcessorFields == null || byteBuf.readableBytes() < frameLength) { + return; + } + } + + } + } + + /** + * 取出前导码匹配集合 + */ + private Map combinedFieldLeadCodeMap(List combinedFieldConfigList) { + Map fieldFixedMap = combinedFieldConfigList + .stream() + .collect(Collectors.toMap(CombinedFieldConfig::getPrefixCode, e -> e)); + return fieldFixedMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java new file mode 100644 index 0000000..643a934 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java @@ -0,0 +1,100 @@ +package com.casic.missiles.parser.resolver.fields; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.FieldParserSupport; +import com.casic.missiles.pojo.*; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 保存使用时最基本的信息,并且使用原型模式 + */ +@Slf4j +public class DefaultProtocolFieldParser extends FieldParserSupport implements FieldParser, FixedPropertyEnum { + + //通过传入的配置和报文进行字段解析 + @Override + public Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap) { + Map dataMap = new HashMap<>(); + for (AbstractFieldConfig protocolFieldConfig : protocolFieldConfigs) { + if (!ObjectUtils.isEmpty(protocolFieldConfig.getOriginPositionByte())) { + Object fieldValue = FieldResolver.parseField(buffer, protocolFieldConfig, null); + if (protocolFieldConfig.getIsStorage() == 1) { + storeObjectMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + dataMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + } + return dataMap; + } + + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength) { + Map fixedPropertyMap = new HashMap<>(); + Integer fixedLength = calculateLength(protocolFieldConfigs); + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + fixedPropertyMap.put(FIXED_POSITION, maxFixedPosition); + fixedPropertyMap.put(TOTAL_LENGTH, totalLength); + fixedPropertyMap.put(TAIL_POSITION, totalLength - fixedLength + maxFixedPosition); + return fixedPropertyMap; + } + + //** 获取业务内容的byteBuf + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer) { + //计算固定长度 + Integer fixedLength = calculateLength(protocolFieldConfigs); + //总长度获取 + String lightText = buffer.toString(Charset.forName("ISO-8859-1")); + Integer totalLength = lightText.length(); + //计算固定长度最大长度 + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + //计算数据报文内容 + ByteBuf bizDataFields = buffer.slice(maxFixedPosition - 1, (totalLength - fixedLength)); + return bizDataFields; + } + + /** + * 获取过滤字段的长度 + */ + @Override + public Integer getTotalFilterLength(ProtocolConfig protocolConfig, + ByteBuf byteBuf, + Map protocolFieldConfigMap) { + if (ByteBufUtil.hexDump(byteBuf).equals("")) { + return 0; + } + int totalFilterLength = 0; + String filterFields = protocolConfig.getTotalLengthFilterFields(); + try { + if (!StringUtils.isEmpty(filterFields)) { + String[] filterFieldList = filterFields.split(","); + for (String filterFieldId : filterFieldList) { + if (StringUtils.isNotEmpty(filterFieldId)) { + ProtocolFieldConfig fieldConfig = protocolFieldConfigMap.get(Long.valueOf(filterFieldId)); + //这里都是按字节计算,没有对位进行区分,可能会出现错误 + // 如果对位有需求,需要进一步跟进 + totalFilterLength += fieldConfig.getOffsetLength(); + } + } + } + return totalFilterLength; + } catch (Exception ex) { + log.error("报文确认分发阶段,获取报文总长度过滤长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); + } + return totalFilterLength; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java new file mode 100644 index 0000000..d51e887 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java @@ -0,0 +1,169 @@ +package com.casic.missiles.parser.resolver.fields; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.parser.resolver.ByteMergeProvider; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.AbstractFieldConfig; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.pojo.ByteResolverParam; +import io.netty.buffer.ByteBuf; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * 字段解析管理总类 + */ +@Slf4j +public class FieldResolver extends ByteMergeProvider { + + //1、字段截取 => 2、简单的字节解析和复杂的字节解析 + public static Object parseField(ByteBuf byteBuf,AbstractFieldConfig fieldConfig, Integer maxFixedPosition) { + Integer orignPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + //最大固定位置不为空, + if (!ObjectUtil.isEmpty(maxFixedPosition)) { + orignPosition -= maxFixedPosition; + } + Object fieldValue = 0; + //待优化 + if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { + fieldValue = doParseBitField(byteBuf, fieldConfig); + } else { + ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); + fieldValue = doParseByteField(fieldBytes, fieldConfig.getRuleJson()); + } + return fieldValue; + } + + //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, + //目前默认配置的规则设置暂不支持配置化,由实现完成 + private static Object doParseByteField(ByteBuf byteBuf, String ruleJson) { + Object fieldsResolveValue = null; + List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); + if (ObjectUtil.isEmpty(ruleMapList)) { + fieldsResolveValue = defaultResolveBuilder(byteBuf); + } else { + fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); + } + return fieldsResolveValue; + } + + private static Object defaultResolveBuilder(ByteBuf byteBuf) { + Integer defaultResolveValue = 0; + for (int i = 0; i < byteBuf.writerIndex(); i++) { + defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; + } + return defaultResolveValue; + } + + //字段解析构建器(针对字节单位的) + //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 + // 字节归并结束或者规则结束=>继续根据规则进行判断 + private static Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { + Object customizeResolveValue = null; + try { + List bytStrList = new ArrayList<>(); + //存放到数组里面 + for (int i = 0; i < byteBuf.writerIndex(); i++) { + bytStrList.add(byteBuf.readByte()); + } + int i = 0; + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { + if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + customizeResolveValue = resolveByteMerge(bytStrList, ruletypeId, vaildRange); + break; + } else { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + List tempBytStr = new ArrayList<>(); + for (int k = 0; i < bytStrList.size(); i++) { + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(k) + .value(bytStrList.get(k)) + .ruletypeId(ruletypeId).build(); + tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); + } + bytStrList = tempBytStr; + } + i++; + } + //字节归并到一起=>继续根据规则进行判断 + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(null) + .value(customizeResolveValue) + .ruletypeId(ruletypeId).build(); + customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); + i++; + } + System.out.println(JSON.toJSON(customizeResolveValue)); + return customizeResolveValue; + } catch (RuntimeException ex) { + log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); + return null; + } + } + + /** + * 1、单个字节情况表示字段 + * 2、多字节情况表示字段(暂未处理) + */ + private static Object doParseBitField(ByteBuf byteBuf,AbstractFieldConfig fieldConfig) { + Object fieldValue = new Object(); + try { + Integer orignPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + byte fields = 0x00; + if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { + fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); + } else { + fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); + } + + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { + if (!StringUtils.isEmpty(fieldConfig.getOriginPositionBit())) { + fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getOriginPositionBit())).byteValue() + >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); + } else { + fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); + } + } else { + fieldValue = Integer.valueOf(fields & 0xff); + } + if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { + return fieldValue; + } + List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); + int i = 0; + //字节归并到一起=>继续根据规则进行判断 + while (i < ruleMapList.size()) { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(null) + .value(fieldValue) + .ruletypeId(ruletypeId).build(); + fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); + i++; + } + System.out.println(JSON.toJSON(fieldValue)); + return fieldValue; + } catch (RuntimeException ex) { + log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); + return null; + } + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java deleted file mode 100644 index 35ae3d0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java +++ /dev/null @@ -1,183 +0,0 @@ -package com.casic.missiles.parser.resolver.fields; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufAllocator; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; -import org.springframework.util.ObjectUtils; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service("standard") -@AllArgsConstructor -@Slf4j -public class StandardFieldParser implements FieldParser { - - private final FieldConfigDao fieldConfigDao; - private final FieldResolver fieldResolver; - - //数据解析 - @Override - public Map dataParser(RuleConfig ruleConfig, String lightText, String protocolId) { - String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); - ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); - bufferContent.writeBytes(lightText.getBytes(Charset.forName("ISO-8859-1"))); - Map dataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - for (String dataFieldId : dataFieldIds) { - FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(dataFieldId); - if (!ObjectUtils.isEmpty(fieldConfig)) { - dataMap.put(fieldConfig.getFieldName(), String.valueOf(fieldResolver.filedParserManger(bufferContent, fieldConfig, maxFixedPosition))); - } - } - return dataMap; - } - - //数据解析 - @Override - public Map fixDataParser(String protocolId, ByteBuf buffer) { - List dataFieldIdList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Map dataMap = new HashMap<>(); - for (FieldConfig dataField : dataFieldIdList) { - if (!ObjectUtils.isEmpty(dataField.getOrignPosition())) { - Object fieldValue = (Integer) fieldResolver.filedParserManger(buffer, dataField, null); - dataMap.put(dataField.getFieldName(), fieldValue); - } - } - return dataMap; - } - - @Override - public Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf) { - if (ByteBufUtil.hexDump(byteBuf).equals("")) { - return 0; - } - String filterFields = protocolConfig.getTotalLengthFilterField(); - Integer totalLength = 0; - try { - FieldConfig totalFieldConfig = fieldConfigDao.getFieldConfigById(protocolConfig.getTotalLengthId()); - int totalFilterLength = 0; - if (!StringUtils.isEmpty(filterFields)) { - String[] filterFieldList = filterFields.split(","); - for (String filterField : filterFieldList) { - FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(filterField); - //这里都是按字节计算,没有对位进行区分,可能会出现错误 - - // 如果对位有需求,需要进一步跟进 - totalFilterLength += fieldConfig.getOffsetLength(); - } - } - totalLength = (Integer) fieldResolver.filedParserManger(byteBuf, totalFieldConfig, null) + totalFilterLength; - } catch (Exception ex) { - log.error("报文确认分发阶段,获取报文总长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); - } - return totalLength; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer) { - //业务内容 - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - String protocolId = String.valueOf(protocolConfig.getId()); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - //计算固定长度 - Integer fixedLength = calculateLength(fieldConfigList); -// Integer totalLength = this.getTotalLength(protocolConfig, buffer); - //总长度获取 - Integer totalLength = lightText.length(); - //计算固定长度最大长度 - Integer maxFixedPosition = calculatePosition(fieldConfigList); -// buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - //计算数据报文内容 - ByteBuf bizDataFields = buffer.slice(maxFixedPosition-1, (totalLength - fixedLength)); - return bizDataFields; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer) { - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - String protocolId = String.valueOf(protocolConfig.getId()); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer fixedLength = calculateLength(fieldConfigList); -// Integer totalLength = this.getTotalLength(protocolConfig, buffer); - Integer totalLength = lightText.length(); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - ByteBuf fixDataFields = buffer.slice(0, maxFixedPosition); - return fixDataFields; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer) { - String protocolId = String.valueOf(protocolConfig.getId()); - Map fixedPropertyMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer fixedLength = calculateLength(fieldConfigList); - Integer totalLength = this.getTotalLength(protocolConfig, buffer); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - fixedPropertyMap.put("fixedPosition", maxFixedPosition); - fixedPropertyMap.put("totalLength", totalLength); - fixedPropertyMap.put("tailPosition", totalLength - fixedLength + maxFixedPosition); - return fixedPropertyMap; - } - - //分别计算bit和byte长度=> 合并长度 - private Integer calculateLength(List fieldConfigList) { - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (FieldConfig fieldConfig : fieldConfigList) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - Integer fixedLength = bytefixedLength + bitfixedLength / 8; - return fixedLength; - } - - //找到最大值=> 根据最大值计算业务数据下标 - private Integer calculatePosition(List fieldConfigList) { - String rex = "[0-9]+"; - Integer max = -1; - for (FieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOrignPosition()) - && Integer.valueOf(fieldConfig.getOrignPosition()) > max) { - max = Integer.valueOf(fieldConfig.getOrignPosition()); - } - } - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (FieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOrignPosition()) && fieldConfig.getOrignPosition().equals(max)) { - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - } - } - Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; - return maxFixedPosition; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java new file mode 100644 index 0000000..d4ec6c7 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java @@ -0,0 +1,76 @@ +package com.casic.missiles.parser.rule; + +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import org.apache.commons.lang3.StringUtils; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class GenericRuleResolver { + + //根据前置字段的值,找到指定的规则 + //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 + //=>循环判断=>通过规则得到业务字段 + public static RuleConfig machRule(Map fixDataMap, + String ids, + List protocolFieldConfigs, + List ruleConfigs) { + List preRuleConfigList = getPreRuleList(ids, protocolFieldConfigs); + //获取前置规则字段 + final Map metaDataMap = getPreRuleFields(preRuleConfigList, fixDataMap); + //准备固定的字段集合 + Map fixDataFieldMap = getFixDataFieldMap(protocolFieldConfigs); + return RuleResolverCore.doMachRule(ruleConfigs, metaDataMap, fixDataMap, fixDataFieldMap); + } + + private static Map getFixDataFieldMap(List protocolFieldConfigs) { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, ProtocolFieldConfig::getFieldName) + ); + return fixDataFieldMap; + } + + + /** + * 查询前置规则的字段配置 + * + * @param ids + * @return + */ + private static List getPreRuleList(String ids, List protocolFieldConfigs) { + String[] idList = ids.split(","); + Map prepareMaps = new HashMap<>(); + for (String id : idList) { + if (StringUtils.isNotEmpty(id)) { + prepareMaps.put(Long.valueOf(id), ""); + } + } + List preRuleConfigList = protocolFieldConfigs + .stream() + .filter(e -> prepareMaps.containsKey(e.getId())) + .collect(Collectors.toList()); + return preRuleConfigList; + } + + /** + * 获取前置规则解析字段 + */ + private static Map getPreRuleFields(List preRuleFieldConfigList, Map fixDataMap) { + Map ruleFieldMap = new HashMap<>(); + preRuleFieldConfigList.stream() + .forEach( + preRuleFieldConfig -> { + String fieldName = preRuleFieldConfig.getFieldName(); + if (fixDataMap.containsKey(fieldName)) { + ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); + } + } + ); + return ruleFieldMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java new file mode 100644 index 0000000..baae7e8 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -0,0 +1,68 @@ +package com.casic.missiles.parser.rule; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.casic.missiles.pojo.RuleConfig; + +import java.util.*; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleResolverCore { + + + public static RuleConfig doMachRule(List ruleConfigList, Map metaDataMap, + Map fixDataMap, + Map fixDataFieldMap) { + Optional ruleConfigOptional = ruleConfigList.stream() + .filter(ruleConfig -> machRuleConfig( + JSON.parseObject(ruleConfig.getMatchRuleJson(), Map.class), metaDataMap)) + .findFirst(); + if (ObjectUtil.isEmpty(ruleConfigOptional)) { + return null; + } + String[] ruleFields = ruleConfigOptional.get().getDataFieldIds().split(","); + Map ruleMetaDataMap = getRuleFields(ruleFields, fixDataMap, fixDataFieldMap); + //递归选定解析规则,进行规则解析 + if (!ruleConfigOptional.get().getIsFinishMatch().equals("1")) { + //递归选定规则 + doMachRule(ruleConfigList, ruleMetaDataMap, fixDataMap, fixDataFieldMap); + } + return ruleConfigOptional.get(); + } + + + private static Map getRuleFields(String[] preRuleConfigList, Map fixedDataMap, + Map fixedFieldMap) { + Map ruleFieldMap = new HashMap<>(); + for (String preRuleConfigId : preRuleConfigList) { + String fieldName = fixedFieldMap.get(preRuleConfigId); + if (fixedDataMap.containsKey(fieldName)) { + ruleFieldMap.put(fieldName, String.valueOf(fixedDataMap.get(fieldName))); + } + } + return ruleFieldMap; + } + + + //匹配规则配置 + private static Boolean machRuleConfig(Map ruleMap, Map metaDataMap) { + if (ruleMap == null || metaDataMap == null) { + return null; + } + //所有的字段在规则里面必须有有配置 + for (String key : metaDataMap.keySet()) { + if (ruleMap.containsKey(key)) { + if (!ruleMap.get(key).equals(metaDataMap.get(key))) { + return false; + } + } else { + return false; + } + } + return true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java deleted file mode 100644 index 664088d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java +++ /dev/null @@ -1,92 +0,0 @@ -package com.casic.missiles.parser.rule; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.mapper.dao.PreRuleConfigDao; -import com.casic.missiles.mapper.dao.RuleConfigDao; -import lombok.AllArgsConstructor; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.*; -import java.util.stream.Collectors; - -@Service -@AllArgsConstructor -public class RulerProvider { - - private final FieldConfigDao fieldConfigDao; - private final PreRuleConfigDao preRuleConfigDao; - private final RuleConfigDao ruleConfigDao; - - //根据前置字段的值,找到指定的规则 - //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 - //=>循环判断=>通过规则得到业务字段 - public RuleConfig ruleConfig(Map fixDataMap, String protocolId) { - //批量获取规则 - List preRuleConfigList = preRuleConfigDao.getPreRuleList(protocolId); - //获取固定字段 - Map fixFieldMap = getAllFieldMap(protocolId); - //获取前置规则字段 - final String preRuleFields = getPreRuleFields(preRuleConfigList, fixDataMap, fixFieldMap); - List ruleConfigList = ruleConfigDao.getRuleConfigById(protocolId); - Optional ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig ->preRuleFields.equals( ruleConfig.getParseRuleJson())).findFirst(); - //递归选定解析规则,进行规则解析 - while (!ObjectUtil.isEmpty(ruleConfigOptional) && !ruleConfigOptional.get().getIsBizField().equals("1")) { - String ruleFields = getRuleFields(ruleConfigOptional.get().getDataFieldIds().split(","), fixDataMap, fixFieldMap); - ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig -> ruleConfig.getParseRuleJson().equals(ruleFields)).findFirst(); - } - return ruleConfigOptional.get(); - } - - /** - * 获取前置规则解析字段 - */ - private String getPreRuleFields(List preRuleConfigList, Map fixDataMap, Map fixFieldMap) { - Map ruleFieldMap= new HashMap<>(); - preRuleConfigList.stream() - .forEach( - preRuleConfig -> { - String fieldName = fixFieldMap.get(Long.valueOf(preRuleConfig.getRuleFieldId())); - if (fixDataMap.containsKey(fieldName)) { - ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); - } - } - ); - return JSONObject.toJSONString(ruleFieldMap); - } - - private Map getAllFieldMap(String protocolId) { - List fieldList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Map fixFieldMap = fieldList.stream().collect( - Collectors.toMap(FieldConfig::getId, FieldConfig::getFieldName) - ); - return fixFieldMap; - } - - private String getRuleFields(String[] preRuleConfigList, Map fixDataMap, Map fixFieldMap) { - Map ruleFieldMap= new HashMap<>(); - for (String preRuleConfigId : preRuleConfigList) { - String fieldName = fixFieldMap.get(preRuleConfigId); - if (fixDataMap.containsKey(fieldName)) { - ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); - } - } - return JSONObject.toJSONString(ruleFieldMap); - } - - //弃置 - private String ListToString(List ruleFieldList) { - String ruleFields = ""; - for (String ruleField : ruleFieldList) { - ruleFields += ruleField + ","; - } - ruleFields = StringUtils.isEmpty(ruleFields) ? ruleFields : ruleFields.substring(0, ruleFields.length() - 1); - return ruleFields; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java index 6177e10..bfa87a5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java @@ -2,7 +2,7 @@ public interface SafeStrategy { - String decryption(byte[] bytes); + String decryption(String cipher); String encryption(String lightText); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java index 618716c..6236302 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java @@ -9,9 +9,9 @@ //十六进制的字符串转换成字节数组 byte[] bytes = hexStrToBinaryStr(msg); //计算CRC8 - byte crc8 = CRC8(bytes, 0, bytes.length); - String crc8ToStr = "" + Integer.toHexString(0xff & crc8); - return crc8ToStr; +// String crc8ToStr = "" + Integer.toHexString(0xff & crc8); +// return crc8ToStr; + return null; } /** @@ -33,50 +33,5 @@ return bytes; } - /** - * CRC8 校验 多项式 x8+x2+x+1 - * - * @param b - * @param off - * @param len - * @return - */ - public static byte CRC8(final byte[] b, final int off, final int len) { - byte result = 0x00; - for (int i = 0; i < len; i++) { - result = CHECKSUM_TABLE[(result ^ (b[i + off] & 0xFF)) & 0xFF]; - } - return (byte) (result & 0xFFL); - } - - private final static byte[] CHECKSUM_TABLE = {(byte) 0x00, (byte) 0x07, (byte) 0x0e, (byte) 0x09, (byte) 0x1c, (byte) 0x1b, - (byte) 0x12, (byte) 0x15, (byte) 0x38, (byte) 0x3f, (byte) 0x36, (byte) 0x31, (byte) 0x24, (byte) 0x23, (byte) 0x2a, - (byte) 0x2d, (byte) 0x70, (byte) 0x77, (byte) 0x7e, (byte) 0x79, (byte) 0x6c, (byte) 0x6b, (byte) 0x62, (byte) 0x65, - (byte) 0x48, (byte) 0x4f, (byte) 0x46, (byte) 0x41, (byte) 0x54, (byte) 0x53, (byte) 0x5a, (byte) 0x5d, (byte) 0xe0, - (byte) 0xe7, (byte) 0xee, (byte) 0xe9, (byte) 0xfc, (byte) 0xfb, (byte) 0xf2, (byte) 0xf5, (byte) 0xd8, (byte) 0xdf, - (byte) 0xd6, (byte) 0xd1, (byte) 0xc4, (byte) 0xc3, (byte) 0xca, (byte) 0xcd, (byte) 0x90, (byte) 0x97, (byte) 0x9e, - (byte) 0x99, (byte) 0x8c, (byte) 0x8b, (byte) 0x82, (byte) 0x85, (byte) 0xa8, (byte) 0xaf, (byte) 0xa6, (byte) 0xa1, - (byte) 0xb4, (byte) 0xb3, (byte) 0xba, (byte) 0xbd, (byte) 0xc7, (byte) 0xc0, (byte) 0xc9, (byte) 0xce, (byte) 0xdb, - (byte) 0xdc, (byte) 0xd5, (byte) 0xd2, (byte) 0xff, (byte) 0xf8, (byte) 0xf1, (byte) 0xf6, (byte) 0xe3, (byte) 0xe4, - (byte) 0xed, (byte) 0xea, (byte) 0xb7, (byte) 0xb0, (byte) 0xb9, (byte) 0xbe, (byte) 0xab, (byte) 0xac, (byte) 0xa5, - (byte) 0xa2, (byte) 0x8f, (byte) 0x88, (byte) 0x81, (byte) 0x86, (byte) 0x93, (byte) 0x94, (byte) 0x9d, (byte) 0x9a, - (byte) 0x27, (byte) 0x20, (byte) 0x29, (byte) 0x2e, (byte) 0x3b, (byte) 0x3c, (byte) 0x35, (byte) 0x32, (byte) 0x1f, - (byte) 0x18, (byte) 0x11, (byte) 0x16, (byte) 0x03, (byte) 0x04, (byte) 0x0d, (byte) 0x0a, (byte) 0x57, (byte) 0x50, - (byte) 0x59, (byte) 0x5e, (byte) 0x4b, (byte) 0x4c, (byte) 0x45, (byte) 0x42, (byte) 0x6f, (byte) 0x68, (byte) 0x61, - (byte) 0x66, (byte) 0x73, (byte) 0x74, (byte) 0x7d, (byte) 0x7a, (byte) 0x89, (byte) 0x8e, (byte) 0x87, (byte) 0x80, - (byte) 0x95, (byte) 0x92, (byte) 0x9b, (byte) 0x9c, (byte) 0xb1, (byte) 0xb6, (byte) 0xbf, (byte) 0xb8, (byte) 0xad, - (byte) 0xaa, (byte) 0xa3, (byte) 0xa4, (byte) 0xf9, (byte) 0xfe, (byte) 0xf7, (byte) 0xf0, (byte) 0xe5, (byte) 0xe2, - (byte) 0xeb, (byte) 0xec, (byte) 0xc1, (byte) 0xc6, (byte) 0xcf, (byte) 0xc8, (byte) 0xdd, (byte) 0xda, (byte) 0xd3, - (byte) 0xd4, (byte) 0x69, (byte) 0x6e, (byte) 0x67, (byte) 0x60, (byte) 0x75, (byte) 0x72, (byte) 0x7b, (byte) 0x7c, - (byte) 0x51, (byte) 0x56, (byte) 0x5f, (byte) 0x58, (byte) 0x4d, (byte) 0x4a, (byte) 0x43, (byte) 0x44, (byte) 0x19, - (byte) 0x1e, (byte) 0x17, (byte) 0x10, (byte) 0x05, (byte) 0x02, (byte) 0x0b, (byte) 0x0c, (byte) 0x21, (byte) 0x26, - (byte) 0x2f, (byte) 0x28, (byte) 0x3d, (byte) 0x3a, (byte) 0x33, (byte) 0x34, (byte) 0x4e, (byte) 0x49, (byte) 0x40, - (byte) 0x47, (byte) 0x52, (byte) 0x55, (byte) 0x5c, (byte) 0x5b, (byte) 0x76, (byte) 0x71, (byte) 0x78, (byte) 0x7f, - (byte) 0x6a, (byte) 0x6d, (byte) 0x64, (byte) 0x63, (byte) 0x3e, (byte) 0x39, (byte) 0x30, (byte) 0x37, (byte) 0x22, - (byte) 0x25, (byte) 0x2c, (byte) 0x2b, (byte) 0x06, (byte) 0x01, (byte) 0x08, (byte) 0x0f, (byte) 0x1a, (byte) 0x1d, - (byte) 0x14, (byte) 0x13, (byte) 0xae, (byte) 0xa9, (byte) 0xa0, (byte) 0xa7, (byte) 0xb2, (byte) 0xb5, (byte) 0xbc, - (byte) 0xbb, (byte) 0x96, (byte) 0x91, (byte) 0x98, (byte) 0x9f, (byte) 0x8a, (byte) 0x8d, (byte) 0x84, (byte) 0x83, - (byte) 0xde, (byte) 0xd9, (byte) 0xd0, (byte) 0xd7, (byte) 0xc2, (byte) 0xc5, (byte) 0xcc, (byte) 0xcb, (byte) 0xe6, - (byte) 0xe1, (byte) 0xe8, (byte) 0xef, (byte) 0xfa, (byte) 0xfd, (byte) 0xf4, (byte) 0xf3}; } \ No newline at end of file diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java index 27c2838..6e078a3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java @@ -1,9 +1,6 @@ package com.casic.missiles.parser.safe.impl; -import cn.hutool.core.util.CharsetUtil; -import cn.hutool.crypto.symmetric.SM4; -import cn.hutool.crypto.symmetric.SymmetricCrypto; - +import com.casic.missiles.parser.safe.SafeStrategy; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; @@ -11,19 +8,44 @@ import org.bouncycastle.crypto.engines.SM4Engine; import org.bouncycastle.crypto.params.KeyParameter; import org.bouncycastle.util.encoders.Hex; - -import static cn.hutool.crypto.Mode.ECB; -import static cn.hutool.crypto.Padding.NoPadding; +import org.springframework.stereotype.Component; /** * SM4算法工具类 */ @Slf4j -public class Sm4 { +@Component("sm4") +public class Sm4 implements SafeStrategy { //加解密的字节快大小 public static final int BlockSize = 16; + @Override + public String decryption(String cipher) { + byte[] keyByte = { + 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 + }; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(keyByte); + byte[] in = Hex.decode(cipher); + byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); + String plain = EcbDecrypt(in, keyBytes); + return plain; + } + + @Override + public String encryption(String cipher) { + byte[] keyByte = { + 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 + }; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(keyByte); + byte[] in = Hex.decode(cipher); + byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); + String plain = EcbDecrypt(in, keyBytes); + return plain; + } + /** * SM4ECB加密算法,对内 * @@ -32,8 +54,6 @@ * @return */ private static byte[] ecb_encrypt(byte[] in, byte[] keyBytes) { - - SM4Engine sm4Engine = new SM4Engine(); sm4Engine.init(true, new KeyParameter(keyBytes)); byte[] out = new byte[in.length]; @@ -58,27 +78,6 @@ return cipher; } - - /** - * hutool 解密SM4 - * - * @param encodeContent - * @return - */ - public static String decode(String encodeContent) { - String key = "24ad182507479a5da3ad94d9d78ea203"; - try { - SymmetricCrypto sm4 = new SM4(ECB, NoPadding, key.getBytes()); - String decryptStr = sm4.decryptStr(encodeContent, CharsetUtil.CHARSET_UTF_8); - return decryptStr; - } catch (Exception e) { - e.printStackTrace(); - log.error("SM4解密失败"); - } - return null; - } - - /** * SM4的ECB加密算法 * @@ -129,20 +128,6 @@ return plain; } - /** - * SM4的ECB解密算法 - * - * @param cipher 输入的密文字符串 - * @param key 密钥 - * @return - */ - public static String EcbDecrypt(String cipher, String key) { - byte[] in = Hex.decode(cipher); - byte[] keyBytes = Hex.decode(key); - - String plain = EcbDecrypt(in, keyBytes); - return plain; - } /** * 主函数 @@ -151,28 +136,24 @@ */ public static void main(String[] args) { byte[] ciphertext = { + 0x4B, (byte) 0x8C, (byte) 0x9D, 0x08, (byte) 0xE4, (byte) 0xD3, 0x64, 0x42, (byte) 0xB9, (byte) 0xA5, (byte) 0xFE, (byte) 0xCD, (byte) 0x91, 0x1B, 0x38, (byte) 0xAC, (byte) 0xE9, 0x1C, (byte) 0xCD, 0x53, 0x02, (byte) 0xD7, 0x0C, (byte) 0x9B, (byte) 0x96, 0x30, 0x62, (byte) 0xE8, (byte) 0xFB, (byte) 0xEF, (byte) 0xB9, (byte) 0xFF, (byte) 0xDE, 0x19, (byte) 0x80, 0x35, 0x3E, (byte) 0x90, 0x4F, 0x2F, 0x12, 0x2B, 0x19, (byte) 0x8B, 0x6C, 0x7A, (byte) 0x85, (byte) 0xA1, (byte) 0xB1, (byte) 0x86, (byte) 0xA3, 0x7A, 0x46, 0x0C, 0x2F, (byte) 0x94, 0x4F, 0x7F, 0x2C, 0x56, 0x14, (byte) 0xF3, (byte) 0x89, (byte) 0xC3, - 0x3F, 0x20, (byte) 0xF9, (byte) 0x87, (byte) 0xA1, 0x60, (byte) 0xD9, (byte) 0xA8, (byte) 0xFD, (byte) 0xD7, (byte) 0x9B, 0x4B, 0x26, 0x06, 0x30, 0x44}; + 0x3F, 0x20, (byte) 0xF9, (byte) 0x87, (byte) 0xA1, 0x60, (byte) 0xD9, (byte) 0xA8, (byte) 0xFD, (byte) 0xD7, (byte) 0x9B, 0x4B, 0x26, 0x06, 0x30, 0x44 + }; ByteBuf in = ByteBufAllocator.DEFAULT.heapBuffer(); in.writeBytes(ciphertext); - byte[] keyByte = { 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 }; ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); - key.writeBytes(ciphertext); - String resCipherData = decode(ByteBufUtil.hexDump(in)); - ByteBuf out = ByteBufAllocator.DEFAULT.heapBuffer(); -// out.writeBytes(resCipherData); -// System.out.println(hexBytes); - System.out.println(resCipherData.toString()); -// String resPlainData = EcbDecrypt(resCipherData, key); -// System.out.println("原始明文:" + data); -// System.out.println("解密后明文:" + resPlainData); + key.writeBytes(keyByte); +// String resCipherData = EcbDecrypt(ByteBufUtil.hexDump(in), ByteBufUtil.hexDump(key)); +// System.out.println(resCipherData); } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java index 1395a51..ac5f957 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java @@ -1,7 +1,7 @@ package com.casic.missiles.parser.safe.impl; import io.netty.buffer.ByteBufUtil; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** *

@@ -14,9 +14,8 @@ * @author hyl * @version v1.0: Tea.java, v 0.1 2021/3/12 13:48 $ */ -@Service("tea") -///tea算法类 - +//tea算法类 +@Component("tea") public class Tea { public static byte[] MyTea_Encrypt(byte[] MyTeaContent, int ByteLen, byte[] MyTeakey) { @@ -99,7 +98,6 @@ // for(int i32Index = 0; i32Index < 8; i32Index++) { // System.out.print("0x" + Integer.toHexString(MyContent[i32Index]) + " "); // } - // System.out.println("密钥为:"); // for(int i32Index = 0; i32Index < 16; i32Index++) { // System.out.print("0x" + Integer.toHexString(MyKeys[i32Index]) + " "); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java index 608af3a..32cc8a4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java @@ -2,48 +2,47 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.delivery.decorator.ByteDecorator; +import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @AllArgsConstructor public class FieldDecoratorManger { - private final RuleDictDao ruleDictDao; + private final RuleConfigRegistry ruleDictDao; // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 // (1)静态的业务字段是字典里面可以配置的 // (2)动态的业务字段是通过规则生成的 public String contentMerge(String ruleJson, String sceneConent, String dynamicContent) { - List ruleDictList = ruleDictDao.getRuleDictConfig(); - Map ruleDictMap = ruleDictList.stream().collect( - Collectors.toMap(RuleDict::getId, e -> e)); - List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); - for (Map ruleMap : ruleMapList) { - String ruleType = String.valueOf(ruleMap.get("ruleType")); - ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); - NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); - byteDecorator.nodeDecoratorRule(nodeDecoratorParm); - } +// List ruleDictList = ruleDictDao.getRuleDictConfig(); +// Map ruleDictMap = ruleDictList.stream().collect( +// Collectors.toMap(RuleDict::getId, e -> e)); +// List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); +// for (Map ruleMap : ruleMapList) { +// String ruleType = String.valueOf(ruleMap.get("ruleType")); +// ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); +// NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); +// byteDecorator.nodeDecoratorRule(nodeDecoratorParm); +// } return null; } - - private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { - NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() - .contents(sceneConent) - .dynamicContent(dynamicContent) - .ruletypeId(ruletypeId) - .ruleDictMap(ruleDictMap) - .build(); - return nodeDecoratorParm; - } +// +// private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { +// NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() +// .contents(sceneConent) +// .dynamicContent(dynamicContent) +// .ruletypeId(ruletypeId) +// .ruleDictMap(ruleDictMap) +// .build(); +// return nodeDecoratorParm; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java index 652970c..b204ac3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java @@ -1,56 +1,56 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@AllArgsConstructor -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", - JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Component; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Component("logicalDecorator") +//@AllArgsConstructor +//@Slf4j +//public class LogicalShiftDecorator implements ByteDecorator { +// +//// private final FieldRuleEngineMapper fieldRuleEngineMapper; +//// +//// //字节位移 +//// @Override +//// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +//// String logicalValue = ""; +//// RuleEvaluator fieldRuleEngine = new RuleEvaluator(); +//// try { +//// Map env2 = new HashMap(); +//// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +//// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +//// for (String contentId : contentIdList) { +//// RuleDict ruleDict = ruleDictMap.get(contentId); +//// if (ruleDict.getCode().contains("#")) { +//// //使用动态的值 +//// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +//// } +//// env2.put(ruleDict.getName(), ruleDict.getCode()); +//// } +//// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +//// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +//// return null; +//// } +//// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +//// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +//// return values; +//// } catch (Exception ex) { +//// log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", +//// JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +//// return null; +//// } +//// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java index 346468f..822fead 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@AllArgsConstructor -@Slf4j -public class OperationDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("optionDecorator") +//@AllArgsConstructor +//@Slf4j +//public class OperationDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //混合运算,有常量或者乘除的缩放 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java index 50fb0a7..7a8bccb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@AllArgsConstructor -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +////精度计算 +//@AllArgsConstructor +//@Registry("precisionDecorator") +//@Slf4j +//public class PrecisionDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java index da39235..27f9cc7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java @@ -1,54 +1,53 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@AllArgsConstructor -@Slf4j -public class RuleDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("ruleDecorator") +//@AllArgsConstructor +//@Slf4j +//public class RuleDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //吃我一套正则表达式 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (Exception ex) { +// log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java index 7f5cbf3..c043f97 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java @@ -2,6 +2,6 @@ import java.util.Map; -public interface ComandeEventService { +public interface ComandeEventService{ Map loadComandeEventConfig(String protocolId,String scene); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java index 476ad84..aaf1837 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java @@ -2,46 +2,46 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.dao.CommandEventDao; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @Slf4j @AllArgsConstructor -public class ComandeEventServiceImpl implements ComandeEventService { +public class ComandeEventServiceImpl implements ComandeEventRegistry { - private final CommandEventDao commandEventDao; + // private final CommandEventDao commandEventDao; // 加密bean 固定字段出现变化的字段解析,业务字段的有序内容 @Override - public Map loadComandeEventConfig(String protocolId,String sceneName) { - CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); - if (ObjectUtil.isEmpty(commandEventConfig)) { - log.error("协议{},没有配置成功接收回复配置,清排查原因"); - return null; - } - String replyJson = commandEventConfig.getReplyContentJson(); - List> replyMapList = JSONArray.parseObject(replyJson, List.class); - List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); - Map fixMap = fixList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); - List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) - .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) - .collect(Collectors.toList()); - Map commandConfigMap = new HashMap<>(); - commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); - commandConfigMap.put("fixContent", fixMap); - commandConfigMap.put("bizContent", contentList); - return commandConfigMap; + public Map loadComandeEventConfig(String protocolId, String sceneName) { +// CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); +// if (ObjectUtil.isEmpty(commandEventConfig)) { +// log.error("协议{},没有配置成功接收回复配置,清排查原因"); +// return null; +// } +// String replyJson = commandEventConfig.getReplyContentJson(); +// List> replyMapList = JSONArray.parseObject(replyJson, List.class); +// List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); +// Map fixMap = fixList.stream() +// .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); +// List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) +// .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) +// .collect(Collectors.toList()); +// Map commandConfigMap = new HashMap<>(); +// commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); +// commandConfigMap.put("fixContent", fixMap); +// commandConfigMap.put("bizContent", contentList); +// return commandConfigMap; + return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 128b09d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java deleted file mode 100644 index 4016b0b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface DatagramEventMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java deleted file mode 100644 index 597c306..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.apache.ibatis.annotations.Mapper; - -public interface FieldConfigMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java deleted file mode 100644 index a31680a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.PreRuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface PreRuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java deleted file mode 100644 index 9060a69..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface ProtocolConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java deleted file mode 100644 index 6fa6936..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java deleted file mode 100644 index 582a705..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleDict; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleDictMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java deleted file mode 100644 index 6e302c8..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.CommandEventMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Optional; - -@Component -public class CommandEventDao { - - @Resource - private CommandEventMapper commandEventMapper; - - public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId) - .eq("scene", sceneName) - .eq("enabled", 1); - List commandEventConfig = commandEventMapper.selectList(queryWrapper); - Optional optionalEventConfig = commandEventConfig.stream().findFirst(); - return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java deleted file mode 100644 index 9137e4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.FieldConfigMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class FieldConfigDao { - - @Resource - private FieldConfigMapper fieldConfigMapper; - - public FieldConfig getFieldConfigById(String fieldId) { - FieldConfig fieldConfig = fieldConfigMapper.selectById(fieldId); - return fieldConfig; - } - - public List getFieldConfigs(String protocolId,Integer isFixed) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",isFixed); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - - public List getStorageFieldConfig(String protocolId) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",1) - .eq("is_storage",1); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java deleted file mode 100644 index 67bff6b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.mapper.PreRuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class PreRuleConfigDao { - - @Resource - private PreRuleConfigMapper preRuleConfigMapper; - - public List getPreRuleList(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return preRuleConfigMapper.selectList(queryWrapper); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java deleted file mode 100644 index d69ea85..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.RuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleConfigDao { - - @Resource - private RuleConfigMapper ruleConfigMapper; - - public RuleConfig getNextRuleConfig(String ruleFields) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("parse_rule_json", ruleFields); - return ruleConfigMapper.selectOne(queryWrapper); - } - - - public List getRuleConfigById(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return ruleConfigMapper.selectList(queryWrapper); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java deleted file mode 100644 index 932c185..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.RuleDictMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleDictDao { - - @Resource - private RuleDictMapper ruleDictMapper; - - public List getRuleDictConfig() { - List ruleDictList = ruleDictMapper.selectList(null); - return ruleDictList; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java index 9f9e279..43bc4d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java @@ -10,20 +10,15 @@ import io.netty.channel.socket.nio.NioServerSocketChannel; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import javax.annotation.PreDestroy; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static cn.hutool.core.util.ClassUtil.getClasses; /** * SensorhubServer netty服务端 */ @Slf4j -@Service +@Component public class SensorhubServer { /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java index 2c79ff5..9a28c36 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java @@ -11,13 +11,13 @@ import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioSocketChannel; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClient 客户端 */ @Slf4j -@Service +@Registry public final class SensorhubClient { public static void main(String[] args) throws Exception { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java index 9774be0..477c3f7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java @@ -6,12 +6,12 @@ import io.netty.channel.socket.SocketChannel; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientChannelInitialHandler */ -@Service +@Registry public class SensorhubClientChannelInitialHandler extends ChannelInitializer { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java index 346f4b3..73560e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java @@ -5,13 +5,13 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientHandler */ @Slf4j -@Service +@Registry public class SensorhubClientHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java index 5c1c6f2..d990af5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java @@ -4,12 +4,12 @@ import com.casic.missiles.pojo.Msg; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** * SensorhubServerHandler */ -@Service +@Component public class SensorhubServerHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 67283ae..af3172c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,41 +1,37 @@ package com.casic.missiles.parser; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultProtocolConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.*; +import com.casic.missiles.registry.FieldConfigRegistry; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; -import java.nio.charset.Charset; import java.util.HashMap; import java.util.List; import java.util.Map; -@Service("genericProtocolParser") +/** + * @author + */ +@Component("genericProtocolParser") @Slf4j -@AllArgsConstructor +@RequiredArgsConstructor public class GenericProtocolParser implements ProtocolParser { - private final LeadingCodeMatcher leadingCodeMatcher; private final List frameStructDispenserList; - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorInstanceSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; // 匹配首字母前导码=> 帧结构匹配前导码=> // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 @@ -44,18 +40,19 @@ public Boolean doParseProtocol(ByteBuf byteBuf) { String protocolContent = ByteBufUtil.hexDump(byteBuf); //匹配前导码 - List preCodeConfigs = leadingCodeMatcher.matchLeadingCode(protocolContent); + List preCodeConfigs = LeadingCodeMatcher.matchFrameLeadingCode(protocolContent); //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 if (preCodeConfigs.size() == 0) { - return rematch(byteBuf,protocolContent); + return rematch(byteBuf, protocolContent); } - //暂时先取第一个 + //暂时先取第一个,提升速度,使用享元模式, 减少类的创建销毁与构建 ProtocolConfig protocolConfig = preCodeConfigs.get(0); + AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); ByteBuf wholeDatagramByte = null; //通过匹配帧结构获取完整的数据包 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, preCodeConfigs.get(0))) != null) { + if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, protocolFactory)) != null) { break; } } @@ -68,76 +65,78 @@ * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 */ - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId, wholeDatagramByte); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap, protocolId); - //选取规则对应的流程实例 - DatagramEventConfig datagramEventConfig = processorInstanceSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); + //进行规则字段解析,进行匹配规则 + RuleConfig ruleConfig = getRuleConfig(protocolFactory, wholeDatagramByte); + if (ruleConfig == null) { + return false; + } //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, wholeDatagramByte); + ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte); + //以下进行业务的规则解析,同时选定流程实例 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); + DatagramEventProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain, + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText, protocolId); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain); //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); + datagramEventProvider.storeData(bizDataMap); return true; } - private Boolean rematch(ByteBuf byteBuf,String protocolContent) { + /** + * 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 + */ + private Boolean rematch(ByteBuf byteBuf, String protocolContent) { //重置位判断 byteBuf.resetReaderIndex(); //判断重置是否前移,如果没有前移,则直接判为匹配失败 if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { return false; } else { + //递归执行 return doParseProtocol(byteBuf); } } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; + //获取匹配规则->匹配规则 + private RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + //取出其中参与逻辑provider并判空 + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); + String rulePrepareFields = protocolConfig.getRulePrepareFields(); + //固定字段 + if (StringUtils.isNotEmpty(rulePrepareFields)) { + //获取统一固定字段解析 + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + //获取该协议的字段配置,用于协议规则匹配 + List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); + //获取规则 + RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, + rulePrepareFields, protocolFieldConfigs); + return ruleConfig; + } + return null; } - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + //数据构建,获取固定字段的store和业务字段store + private Map buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + Map bizDataMap = new HashMap<>(); + Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); + Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); + bizDataMap.putAll(ruleStoreObjectMap); + bizDataMap.putAll(protocolStoreObjectMap); return bizDataMap; } - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java index 8a46e32..16ce2e5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java @@ -3,6 +3,7 @@ import io.netty.buffer.ByteBuf; public interface ProtocolParser { + Boolean doParseProtocol(ByteBuf byteBuf); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java new file mode 100644 index 0000000..f7814af --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java @@ -0,0 +1,35 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.ProtocolConfigProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.ProtocolConfig; + +/** + * 存放基本协议的的加载信息 + */ +public class AbstractProtocolConfigFactory { + private final ProtocolConfigProvider protocolConfigProvider; + private final ProtocolFieldConfigProvider protocolFieldConfigProvider; + private final RuleConfigProvider ruleConfigProvider; + + public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { + this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); + this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); + this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); + } + + public ProtocolConfigProvider getProtocolConfigProvider() { + return protocolConfigProvider; + } + + public ProtocolFieldConfigProvider getProtocolFieldConfigProvider() { + return protocolFieldConfigProvider; + } + + public RuleConfigProvider getRuleConfigProvider() { + return ruleConfigProvider; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java new file mode 100644 index 0000000..6e36147 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java @@ -0,0 +1,57 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.CombinedFieldConfigProvider; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.FieldConfigProvider; +import com.casic.missiles.parser.provider.FieldRuleConfigProvider; + +/** + * 存放规则相关的的的加载信息 + */ +public class AbstractRuleConfigFactory { + + /** + * 处理字节 + */ + private final FieldConfigProvider fieldConfigProvider; + /** + * 处理组合字节解析的解码器 + */ + private final CombinedFieldConfigProvider combinedFieldConfigProvider; + /** + * 处理负责字节解析的规则配置 + */ + private final FieldRuleConfigProvider fieldRuleConfigProvider; + /** + * 处理实例流程 + */ + private final DatagramEventProvider datagramEventProvider; + + + public AbstractRuleConfigFactory(Long ruleId) { + this.fieldConfigProvider = new FieldConfigProvider(ruleId); + this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); + this.fieldRuleConfigProvider = new FieldRuleConfigProvider(ruleId); + this.datagramEventProvider = new DatagramEventProvider(ruleId); + } + + public FieldConfigProvider getFieldConfigProvider() { + return fieldConfigProvider; + } + + public CombinedFieldConfigProvider getCombinedFieldConfigProvider() { + return combinedFieldConfigProvider; + } + + public FieldRuleConfigProvider getFieldRuleConfigProvider() { + return fieldRuleConfigProvider; + } + + public DatagramEventProvider getDatagramEventProvider() { + return datagramEventProvider; + } + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java deleted file mode 100644 index 6e1719a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.factory; - - -import com.casic.missiles.pojo.ProtocolConfig; - -import java.util.List; - -/** - * 数据库访问优化(暂时未做) - *

- * 1、初始化协议解析配置,并存放到处存放缓存,对协议基本配置进行管理 - * 2、其中流程中所有的配置都经过此类进行管理,进行调用获取,增强解析速度 - */ -public interface DatagramFactory { - - /** - * 初始化 - */ - List datagramInit(); - - /** - * 根据前导码配置匹配,模糊匹配获取所有的报文项 - */ - List match(); - - /** - * 根据前导码匹配,返回报文项 - */ - List filer(); - - /** - * 保证数据的唯一性选择器 - */ - List selectOne(); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java new file mode 100644 index 0000000..87444a0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java @@ -0,0 +1,18 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +import java.util.List; + +/** + * 直接用,还是边用边创建 + */ +public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { + + + public DefaultProtocolConfigFactory(ProtocolConfig protocolConfig) { + super(protocolConfig); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java new file mode 100644 index 0000000..cce0c7c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java @@ -0,0 +1,12 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; + +public class DefaultRuleFactory extends AbstractRuleConfigFactory { + + public DefaultRuleFactory(Long ruleId) { + super(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java deleted file mode 100644 index 9ee97e0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.casic.missiles.parser.instance; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service -@Slf4j -@AllArgsConstructor -public class GeneralProcessor { - - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; - - /** - * 统一固定字段解析=>进行规则的查询的判断 - * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 - * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 - */ - @Deprecated - public boolean parseWholeDatagram(ByteBuf buffer, ProtocolConfig protocolConfig) { - try { - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap,protocolId); - //选取规则对应的流程= - DatagramEventConfig datagramEventConfig = processorSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); - //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); - //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); - //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); - //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); - //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); - return true; - } catch (Exception ex) { - log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", - ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); - return false; - } - } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; - } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); - } - - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); - return bizDataMap; - } - - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java index 25e7ad8..6a5777e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java @@ -1,23 +1,31 @@ package com.casic.missiles.parser.instance.impl; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.mapper.DatagramEventMapper; import com.casic.missiles.pojo.DatagramEventConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.SpringContextUtil; -@Service -@AllArgsConstructor +import java.util.List; +import java.util.Optional; + +/** + * @author cz + * + */ public class DefaultProcessorInstanceSelector implements ProcessorInstanceSelector { - private final DatagramEventMapper datagramEventMapper; + private static List datagramEventConfigs; + + static { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + datagramEventConfigs = datagramEventRegistry.getDatagramEventList(); + } @Override public DatagramEventConfig getProcessorInstance(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("rule_id", protocolId); - return datagramEventMapper.selectOne(queryWrapper); + Optional optionalSelectInstance = datagramEventConfigs.stream() + .filter(e -> e.getId().equals(protocolId)).limit(1).findFirst(); + return optionalSelectInstance.isPresent() ? optionalSelectInstance.get() : null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a778671..7b56a43 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,16 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import io.netty.buffer.ByteBuf; /** - * 分析匹配情况 - * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 - * 2、匹配不成功,有后续帧,可以进行下次匹配。 - * 3、匹配不成功,无后续帧,可以进行丢弃。 + * 分析匹配情况 + * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 + * 2、匹配不成功,有后续帧,可以进行下次匹配。 + * 3、匹配不成功,无后续帧,可以进行丢弃。 */ -public interface FrameStructMatcher{ +public interface FrameStructMatcher { - ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig); + ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 05320ab..8ebea78 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,23 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.ProtocolConfigMapper; +import com.casic.missiles.parser.provider.ProtocolConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Component; import java.util.List; import java.util.stream.Collectors; -@Component -@AllArgsConstructor public class LeadingCodeMatcher { - private final ProtocolConfigMapper protocolMapper; - //** 1、首字母匹配前导码, // 2、以匹配出的前导码是否在报文中条件进行前导码的匹配二次筛选 - public List matchLeadingCode(String protocolContent){ + public static List matchFrameLeadingCode(String protocolContent){ List initialConfigs = initialMatch(protocolContent); List preCodeConfigs = initialConfigs.stream() .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) @@ -26,13 +19,16 @@ } //初始化匹配前导码内容 - private List initialMatch(String protocolContent) { - String protocolStr = protocolContent.charAt(0) + ""; - QueryWrapper queryWrapper = new QueryWrapper() - .likeRight("pre_fix", protocolStr); - List protocolConfigList = protocolMapper.selectList(queryWrapper); - return protocolConfigList; + private static List initialMatch(String protocolContent) { + String firstFrameChar = protocolContent.charAt(0) + ""; + ProtocolConfigProvider protocolConfigProvider=new ProtocolConfigProvider(firstFrameChar); + return protocolConfigProvider.getMatchList(); } + + + + + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index cf2113d..e915877 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -1,32 +1,35 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(0) -@Service +@Component public class FrameLengthMatcher implements FrameStructMatcher { - @Autowired - private FieldParser fieldParser; - //超过长度 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { String dataGramContent = ByteBufUtil.hexDump(byteBuf); - if (StringUtils.isEmpty(protocolConfig.getUnpackId()) && StringUtils.isEmpty(protocolConfig.getTailStr())) { - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + //当不存在结尾标志和拆包标志,可以直接使用长度进行匹配 + if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { if (dataGramContent.length() >= totalLength) {//等于长度返回true,超出长度,切断 - ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, protocolConfig, totalLength); + ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, totalLength); return wholeDatagramByte; } else { //读的标志位前移舍弃 @@ -38,7 +41,7 @@ return null; } - private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, Integer totalLength) { byteBuf.readBytes(totalLength); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, totalLength - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 2bfc213..d527ad0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; @@ -13,7 +13,7 @@ import lombok.AllArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.nio.charset.Charset; import java.util.Map; @@ -22,32 +22,30 @@ * 后续标志验证 */ @Order(1) -@Service +@Component @AllArgsConstructor -public class FrameMarkMatcher implements FrameStructMatcher { - - private final FieldConfigDao fieldConfigDao; - private final FieldParser fieldParser; - private final FieldResolver fieldResolverManger; +public class FrameMarkMatcher implements FrameStructMatcher, FixedPropertyEnum { //帧后续标志=>结束,进行帧的重组=>有后续,1、帧移位判别 2、继续接收帧 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig UnpackConfig = StringUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getUnpackId()); - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); - Integer upback = 0; + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); ByteBuf mergeWholeFrameByte = null; - if (!ObjectUtil.isEmpty(UnpackConfig)) { - while (hasNextFullFrame(byteBuf, protocolConfig)) { - upback = (Integer) fieldResolverManger.filedParserManger(byteBuf, UnpackConfig, null); + if (!ObjectUtil.isEmpty(unpackFlag)) { + while (hasNextFullFrame(byteBuf, protocolConfig, protocolFieldConfigProvider)) { //是否存在后续位 - if (upback == 1) {//使用esayRule + if (unpackFlag == 1) {//使用esayRule //表示可以截取 - mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolConfig, totalLength); + mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolFieldConfigProvider, protocolConfig); return mergeWholeFrameByte; } else { - byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig)); + byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig, protocolFieldConfigProvider)); } } } @@ -56,7 +54,8 @@ //选取第一个帧,将业务内容和后面部分分开 //计算数据报文-业务内容 - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolFieldConfigProvider protocolFieldConfigProvider, ProtocolConfig protocolConfig) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); //截取完整报文 byteBuf.readBytes(totalLength); ByteBuf byteBufContent = byteBuf.slice(0, byteBuf.readerIndex()); @@ -68,15 +67,15 @@ String tail = ""; System.out.println(ByteBufUtil.hexDump(byteBufContent)); //会存在多个帧拼接在一起的的情况,进行合并处理 - while (hasNextFullFrame(byteBufContent, protocolConfig)) { - Integer currentFrameLength = fieldParser.getTotalLength(protocolConfig, byteBufContent); + while (hasNextFullFrame(byteBufContent, protocolConfig, protocolFieldConfigProvider)) { + Integer currentFrameLength = protocolFieldConfigProvider.getTotalLength(byteBufContent, protocolConfig); byteBufContent.readBytes(currentFrameLength); ByteBuf currentbyteBuf = byteBufContent.slice(0, byteBufContent.readerIndex()); byteBufContent.markReaderIndex();//读的标志位前移 System.out.println(ByteBufUtil.hexDump(byteBufContent)); String hexDump = currentbyteBuf.toString(Charset.forName("ISO-8859-1")); //获取当前固定帧结构的关系map - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, currentbyteBuf); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(currentbyteBuf, protocolConfig); if (StringUtils.isEmpty(mergeFrameStr)) { //首次获取业务数据报文 mergeFrameStr += hexDump.substring(0, currentFrameFixedProperty.get("tailPosition")); @@ -95,22 +94,22 @@ /** * 获取平移到下一帧起始位置 */ - public int getNextFrameOffset(ByteBuf buffer, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, buffer); - return currentFrameFixedProperty.get("totalLength"); + public int getNextFrameOffset(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + return currentFrameFixedProperty.get(TOTAL_LENGTH); } /** * 判断是否出错进行整个帧的 */ - public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, byteBuf); + public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); //保证读取位置不在固定位置,是可变的业务内容 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("fixedPosition")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(FIXED_POSITION)) { return false; } //判断读取是否操作帧长度 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("totalLength")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(TOTAL_LENGTH)) { return false; } return true; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 76a3784..c3a1bab 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -1,50 +1,50 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.parser.instance.GeneralProcessor; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; +import io.netty.buffer.ByteBufUtil;; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(2) -@Service +@Component public class FrameTailMatcher implements FrameStructMatcher { - @Resource - private FieldConfigDao fieldConfigDao; - @Autowired - private GeneralProcessor generalProcessor; - //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig tailFieldConfig = StringUtils.isEmpty(protocolConfig.getTailStr()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getTailStr()); - if (!ObjectUtil.isEmpty(tailFieldConfig)) { - String tailStr = tailFieldConfig.getFieldName(); + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfig protocolFieldConfig = ObjectUtils.isEmpty(protocolConfig.getTailStr()) ? null : + fieldConfigProvider.getFieldConfigById(protocolConfig.getTailStr()); + if (!ObjectUtil.isEmpty(protocolFieldConfig)) { + String tailStr = protocolFieldConfig.getFieldName(); String dataGramContent = ByteBufUtil.hexDump(byteBuf); Boolean tailFlag = ByteBufUtil.hexDump(byteBuf).contains(tailStr); if (!tailFlag) { //使用esayRule return null; } else if (dataGramContent.indexOf(tailStr) < dataGramContent.length() - tailStr.length()) { Integer length = dataGramContent.indexOf(tailStr) + tailStr.length(); - ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, protocolConfig, length); + ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, length); return wholeDatagramByte; //存在粘包 } } return null; } - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer length) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, Integer length) { byteBuf.readBytes(length); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, length - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java new file mode 100644 index 0000000..5f1c177 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java @@ -0,0 +1,73 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.combined.GenericCombinedFieldResolver; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.CombinedFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class CombinedFieldConfigProvider { + + + /** + * 作为临时配置列表缓存使用 + */ + private final List combinedFieldConfigList; + private Map storeObjectMap = new HashMap<>(); + + public CombinedFieldConfigProvider(Long ruleId) { + CombinedFieldConfigRegistry combinedFieldConfigRegistry = SpringContextUtil.getBean(CombinedFieldConfigRegistry.class); + combinedFieldConfigList = combinedFieldConfigRegistry.getCombinedFieldConfigList(ruleId); + } + + public void parseDataField(RuleConfig ruleConfig, String clearZeroPlain,Map fieldConfigsMap ) { + if (showSkip()) { + return; + } + //匹配对应的数据,然后进行相关的字段解析 + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver(); + combinedFieldResolver.parseDataField(combinedFieldConfigList, byteBuf, storeObjectMap,fieldConfigsMap); + } + + + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getCombinedFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return combinedFieldConfigList.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public List getCombinedFieldConfigList() { + return combinedFieldConfigList; + } + + /* 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(combinedFieldConfigList) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java new file mode 100644 index 0000000..f3cfedc --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java @@ -0,0 +1,11 @@ +package com.casic.missiles.parser.provider; + +/** + * @author cz + * @date 2023-6-12 + */ +public class CommandEventProvider{ + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java new file mode 100644 index 0000000..70eec5e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java @@ -0,0 +1,77 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.safe.SafeStrategy; +import com.casic.missiles.parser.sender.DataSubscribeProvider; +import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class DatagramEventProvider { + + private final DatagramEventConfig processorInstance; + + public DatagramEventProvider(Long ruleId) { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + List datagramEventConfigList = + datagramEventRegistry.getDatagramEventList(ruleId); + processorInstance = this.getProcessorInstance(datagramEventConfigList); + } + + public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { + if (showSkip()) { + return null; + } + return datagramEventConfigList.get(0); + } + + // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 + public String getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap) { + String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? + processorInstance.getSafeBean() : + fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); + if (!StringUtils.isEmpty(safeName)) { + //需要加密 + SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); + String plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); + return clearComplementZero(plain); + } + return ByteBufUtil.hexDump(bizDataContent); + } + + //解密清零操作 + private String clearComplementZero(String plain) { + plain = plain.substring(0, plain.lastIndexOf("00")); + return plain; + } + + //数据发送,数据发送者暂未构建 + public void storeData(Map bizDataMap) { + DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); +// dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return ObjectUtils.isNotEmpty(processorInstance) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java new file mode 100644 index 0000000..7e1fe0a --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java @@ -0,0 +1,97 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.FieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class FieldConfigProvider { + + + private final List fieldConfigs; + private Map storeObjectMap = new HashMap<>(); +// private Map singleObjects = new ConcurrentHashMap<>(); + + public FieldConfigProvider(Long ruleId) { + FieldConfigRegistry fieldConfigRegistry = SpringContextUtil.getBean(FieldConfigRegistry.class); + fieldConfigs = fieldConfigRegistry.getFieldConfigList(ruleId); + } + + public List getFieldConfigs() { + return fieldConfigs; + } + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public Map parseDataField(RuleConfig ruleConfig, String clearZeroPlain) { + if (showSkip()) { + return null; + } + List prepareFieldConfig = prepareParseField(ruleConfig); + if (CollectionUtils.isNotEmpty(prepareFieldConfig)) { + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(fieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + return fixDataMap; + } + } + return null; + } + + /** + * 得到需要处理的业务内容 + * + * @return + */ + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return fieldConfigs.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public Map getFieldConfigsMap() { + return fieldConfigs.stream().collect( + Collectors.toMap(FieldConfig::getId, e -> e) + ); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(fieldConfigs) ? false : true; + } + + +} + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java new file mode 100644 index 0000000..817bfaf --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java @@ -0,0 +1,19 @@ +package com.casic.missiles.parser.provider; + +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.registry.FieldRuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; + +public class FieldRuleConfigProvider { + + private final List fieldRuleConfigList; + + public FieldRuleConfigProvider(Long ruleId) { + FieldRuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(FieldRuleConfigRegistry.class); + fieldRuleConfigList = ruleConfigRegistry.getFieldRuleConfigList(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java new file mode 100644 index 0000000..99a1b06 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java @@ -0,0 +1,53 @@ +package com.casic.missiles.parser.provider; + + +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.registry.ProtocolConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolConfigProvider { + + private final List protocolConfigList; + + public ProtocolConfigProvider(String firstChar) { + ProtocolConfigRegistry registry = SpringContextUtil.getBean(ProtocolConfigRegistry.class); + protocolConfigList = registry.getProtocolConfigList(firstChar); + } + + public List getMatchList() { + return protocolConfigList; + } + + /** + * 设置当前协议 + * + * @param protocolConfig + */ + public ProtocolConfigProvider(ProtocolConfig protocolConfig) { + List protocolConfigs = new ArrayList<>(); + protocolConfigs.add(protocolConfig); + protocolConfigList = protocolConfigs; + } + + /** + * 获取当前协议 + * + * @return + */ + public ProtocolConfig getCurrentProtocolConfig() { + if (this.protocolConfigList == null) { + return null; + } else { + return protocolConfigList.get(0); + } + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java new file mode 100644 index 0000000..043927d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java @@ -0,0 +1,213 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.registry.ProtocolFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolFieldConfigProvider { + + private static final String FIXED_FIELD_DS = "fixedFieldDs"; + private static final String CONTENT_FIELD_DS = "contentFieldDs"; + private static final String PROTOCOL_LENGTH = "protocolLength"; + private static final String PROTOCOL_FIELD_ID = "protocolFieldId"; + private static final String PROTOCOL_POSITION = "protocolPosition"; + + private final List protocolFieldConfigs; + private Map singleObjects = new ConcurrentHashMap<>(); + private Map storeObjectMap = new HashMap<>(); + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public ProtocolFieldConfigProvider(Long protocolId) { + ProtocolFieldConfigRegistry protocolFieldConfigRegistry = SpringContextUtil.getBean(ProtocolFieldConfigRegistry.class); + protocolFieldConfigs = protocolFieldConfigRegistry.getProtocolFieldConfigList(protocolId); + } + + public List getProtocolFieldConfigs() { + return protocolFieldConfigs; + } + + public ProtocolFieldConfig getFieldConfigById(Long fieldId) { + Optional optionalConfig = protocolFieldConfigs.stream().filter( + e -> e.getId().equals(fieldId) + ).findFirst(); + return optionalConfig.isPresent() ? optionalConfig.get() : null; + } + + public Integer getProtocolFieldValue(Long protocolFieldId, ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_FIELD_ID + protocolFieldId + ByteBufUtil.hexDump(byteBuf); + //获取缓存 + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + //加载固定长度数据集合 + Map fixDataMap = this.getProtocolDataMap(byteBuf); + ProtocolFieldConfig protocolFieldConfig = selectFieldConfig(protocolFieldId); + Integer protocolFieldValue = 0; + //获取约定字段的总长度 + if (fixDataMap.containsKey(protocolFieldConfig.getFieldName())) { + Object appointUnpackObject = fixDataMap.get(protocolFieldConfig.getFieldName()); + if (ObjectUtils.isNotEmpty(appointUnpackObject)) { + protocolFieldValue = (Integer) appointUnpackObject; + } + } + if (protocolFieldValue != null) { + //加入缓存 + if (ObjectUtils.isNotEmpty(protocolFieldValue)) { + this.singleObjects.put(catchKey, protocolFieldValue); + return protocolFieldValue; + } + } + return null; + } + + /** + * 获取帧固定位置信息 + * + * @param byteBuf + * @param protocolConfig + * @return + */ + public Map getFixedProperty(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_POSITION + protocolConfig.getId(); + if (this.singleObjects.containsKey(catchKey)) { + return (Map) singleObjects.get(catchKey); + } + Map fixedPropertyMap = new HashMap<>(); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + fixedPropertyMap = fieldParser.doGetFixedProperty(protocolFieldConfigs, this.getTotalLength(byteBuf,protocolConfig)); + if (CollectionUtils.isNotEmpty(fixedPropertyMap)) { + this.singleObjects.put(catchKey, fixedPropertyMap); + return fixedPropertyMap; + } + return fixedPropertyMap; + } + + /** + * 获取帧结构应有的总长度 + */ + public Integer getTotalLength(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_LENGTH + ByteBufUtil.hexDump(byteBuf); + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + Integer appointFrameLength = getProtocolFieldValue(protocolConfig.getTotalLengthId(), byteBuf); + if (appointFrameLength != null) { + //获取过滤的字段集合总长度 + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Integer totalFilterLength = fieldParser.getTotalFilterLength(protocolConfig, byteBuf, getFixFieldConfigMap()); + //计算总长度 + Integer totalLength = appointFrameLength + totalFilterLength; + //加入缓存 + if (ObjectUtils.isNotEmpty(totalLength)) { + this.singleObjects.put(catchKey, totalLength); + return totalLength; + } + } + return null; + } + + /** + * 获取协议有关字段解析内容 + * storeObjectMap存储代转存的数据 + * + * @return + */ + public Map getProtocolDataMap(ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(FIXED_FIELD_DS)) { + return (Map) singleObjects.get(FIXED_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(protocolFieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + this.singleObjects.put(FIXED_FIELD_DS, fixDataMap); + return fixDataMap; + } + return null; + } + + /** + * 获取业务报文内容的content字节 + * + * @param wholeDatagramByte + * @return + */ + public ByteBuf getDataContentBuf(ByteBuf wholeDatagramByte) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(CONTENT_FIELD_DS)) { + return (ByteBuf) singleObjects.get(CONTENT_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + ByteBuf bizDataByteBuf = fieldParser.getDataContentBuf(protocolFieldConfigs, wholeDatagramByte); + if (bizDataByteBuf != null) { + this.singleObjects.put(CONTENT_FIELD_DS, bizDataByteBuf); + return bizDataByteBuf; + } + return null; + } + + + private ProtocolFieldConfig selectFieldConfig(Long id) { + Optional optionalProtocolFieldConfig = this.protocolFieldConfigs.stream().filter( + e -> e.getId().equals(id) + ).findFirst(); + return optionalProtocolFieldConfig.isPresent() ? optionalProtocolFieldConfig.get() : null; + } + + + private Map getFixFieldConfigMap() { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, e -> e) + ); + return fixDataFieldMap; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(protocolFieldConfigs) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java new file mode 100644 index 0000000..dafba1c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java @@ -0,0 +1,56 @@ +package com.casic.missiles.parser.provider; + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.rule.GenericRuleResolver; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.RuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleConfigProvider { + + private final List ruleConfigs; + + public List getRuleConfigs() { + return ruleConfigs; + } + + public RuleConfigProvider(Long protocolId) { + RuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(RuleConfigRegistry.class); + ruleConfigs = ruleConfigRegistry.getRuleConfigById(protocolId); + } + + /** + * 获取规则匹配结果 + * + * @param parseFixedDataMap + * @param protocolFieldConfigs + * @return + */ + public RuleConfig doGetRule(Map parseFixedDataMap, + String ids, + List protocolFieldConfigs) { + if (showSkip()) { + return null; + } + RuleConfig ruleConfig = GenericRuleResolver.machRule(parseFixedDataMap, ids, protocolFieldConfigs, ruleConfigs); + return ruleConfig; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(ruleConfigs) ? false : true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java index 3c05891..856b399 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java @@ -1,18 +1,11 @@ package com.casic.missiles.parser.resolver; -import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.springframework.web.bind.annotation.RequestBody; -import javax.annotation.Resource; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -20,19 +13,17 @@ @Slf4j public class ByteMergeProvider { - @Resource - private FieldRuleEngineMapper fieldRuleEngineMapper; - //拿到所有的值合并到一个值 - public String resolveByteMerge(List valueList, String ruletypeId, String vaildRange) { + public static String resolveByteMerge(List valueList, String ruleTypeId, String vaildRange) { String values = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Map vaildMap = getValidRangeMap(vaildRange); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(ruletypeId); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } + //暂时不处理 +// fieldRuleEngine = fieldRuleConfigMapper.selectById(ruleTypeId); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } Map env2 = new HashMap(); for (int i = 0; i < valueList.size(); i++) { if (vaildMap.containsKey(i)) { @@ -47,7 +38,7 @@ } } - private Map getValidRangeMap(String vaildRange) { + private static Map getValidRangeMap(String vaildRange) { String[] range = vaildRange.split(","); Map vaildMap = new HashMap(); for (int i = 0; i < range.length; i++) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 8d821cd..85d6bbf 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -1,9 +1,12 @@ package com.casic.missiles.parser.resolver; +import com.casic.missiles.pojo.AbstractFieldConfig; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; import io.netty.buffer.ByteBuf; +import java.util.List; import java.util.Map; /** @@ -11,18 +14,14 @@ */ public interface FieldParser { -// Map fieldProcess(String protocolContent,); - Map dataParser(RuleConfig ruleConfig, String lightText,String protocolId); + Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength); - Map fixDataParser(String protocolId, ByteBuf buffer); + Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap); - Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf); + ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer); - ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer); - - ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer); - - Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer); + Integer getTotalFilterLength(ProtocolConfig protocolConfig, ByteBuf byteBuf, Map protocolFieldConfigMap); } + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java new file mode 100644 index 0000000..9e0c00e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java @@ -0,0 +1,52 @@ +package com.casic.missiles.parser.resolver; + +import com.casic.missiles.pojo.AbstractFieldConfig; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.util.List; + +public class FieldParserSupport { + + //分别计算bit和byte长度=> 合并长度 + protected Integer calculateLength(List fieldConfigList) { + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + Integer fixedLength = bytefixedLength + bitfixedLength / 8; + return fixedLength; + } + + //找到最大值=> 根据最大值计算业务数据下标 + protected Integer calculatePosition(List fieldConfigList) { + String rex = "[0-9]+"; + Integer max = -1; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) + && Integer.valueOf(fieldConfig.getOriginPositionByte()) > max) { + max = Integer.valueOf(fieldConfig.getOriginPositionByte()); + } + } + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) && fieldConfig.getOriginPositionByte().equals(max)) { + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + } + } + Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; + return maxFixedPosition; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java deleted file mode 100644 index dd3a6cd..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java +++ /dev/null @@ -1,170 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.ByteResolverParam; -import io.netty.buffer.ByteBuf; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -/** - * 字段解析管理总类 - */ -@Service -@Slf4j -@AllArgsConstructor -public class FieldResolver extends ByteMergeProvider { - - //1、字段截取 => 2、简单的字节解析和复杂的字节解析 - public Object filedParserManger(ByteBuf byteBuf, FieldConfig fieldConfig, Integer maxFixedPosition) { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - //最大固定位置不为空, - if (!ObjectUtil.isEmpty(maxFixedPosition)) { - orignPosition -= maxFixedPosition; - } - Object fieldValue = 0; - //待优化 - if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { - fieldValue = bitToResolver(byteBuf, fieldConfig); - } else { - ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); - fieldValue = parsingFields(fieldBytes, fieldConfig.getRuleJson()); - } - return fieldValue; - } - - //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, - //目前默认配置的规则设置暂不支持配置化,由实现完成 - private Object parsingFields(ByteBuf byteBuf, String ruleJson) { - Object fieldsResolveValue = null; - List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); - if (ObjectUtil.isEmpty(ruleMapList)) { - fieldsResolveValue = defaultResolveBuilder(byteBuf); - } else { - fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); - } - return fieldsResolveValue; - } - - private Object defaultResolveBuilder(ByteBuf byteBuf) { - Integer defaultResolveValue = 0; - for (int i = 0; i < byteBuf.writerIndex(); i++) { - defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; - } - return defaultResolveValue; - } - - //字段解析构建器(针对字节单位的) - //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 - // 字节归并结束或者规则结束=>继续根据规则进行判断 - private Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { - Object customizeResolveValue = null; - try { - List bytStrList = new ArrayList<>(); - //存放到数组里面 - for (int i = 0; i < byteBuf.writerIndex(); i++) { - bytStrList.add(byteBuf.readByte()); - } - int i = 0; - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - customizeResolveValue = this.resolveByteMerge(bytStrList, ruletypeId,vaildRange); - break; - } else { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - List tempBytStr = new ArrayList<>(); - for (int k = 0; i < bytStrList.size(); i++) { - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(k) - .value(bytStrList.get(k)) - .ruletypeId(ruletypeId).build(); - tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); - } - bytStrList = tempBytStr; - } - i++; - } - //字节归并到一起=>继续根据规则进行判断 - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(customizeResolveValue) - .ruletypeId(ruletypeId).build(); - customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(customizeResolveValue)); - return customizeResolveValue; - } catch (RuntimeException ex) { - log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); - return null; - } - } - - /** - * 1、单个字节情况表示字段 - * 2、多字节情况表示字段(暂未处理) - */ - private Object bitToResolver(ByteBuf byteBuf, FieldConfig fieldConfig) { - Object fieldValue = new Object(); - try { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - byte fields = 0x00; - if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); - } else { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); - } - - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { - if (!StringUtils.isEmpty(fieldConfig.getExactOrignPosition())) { - fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getExactOrignPosition())).byteValue() - >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); - } else { - fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); - } - } else { - fieldValue = Integer.valueOf(fields & 0xff); - } - if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { - return fieldValue; - } - List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); - int i = 0; - //字节归并到一起=>继续根据规则进行判断 - while (i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(fieldValue) - .ruletypeId(ruletypeId).build(); - fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(fieldValue)); - return fieldValue; - } catch (RuntimeException ex) { - log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); - return null; - } - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java new file mode 100644 index 0000000..1d2aeab --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java @@ -0,0 +1,36 @@ +package com.casic.missiles.parser.resolver.bytes; + +import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.mapper.FieldRuleConfigMapper; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.pojo.ByteResolverParam; +import com.googlecode.aviator.AviatorEvaluator; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; +//转换规则 +@Component("convert") +@AllArgsConstructor +@Slf4j +public class ByteRuleResolver implements ByteResolver { + + private final FieldRuleConfigMapper fieldRuleConfigMapper; + + @Override + public Object resolveOperationRule(ByteResolverParam byteResolverParam){ + FieldRuleConfig fieldRuleEngine=fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); + if(ObjectUtil.isEmpty(fieldRuleEngine)){ + return byteResolverParam.getValue(); + } + String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); + Map env2 = new HashMap(); + env2.put("value", (byte) byteResolverParam.getValue()); + String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); + return values; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java index 103821c..786b71c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java @@ -2,34 +2,34 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("logicalShift") +@Component("logicalShift") @AllArgsConstructor @Slf4j public class LogicalShiftResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //字节位移 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { Integer index = byteResolverParam.getIndex(); - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return byteResolverParam.getValue(); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java index 476747d..01149bd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("operation") +@Component("operation") @AllArgsConstructor @Slf4j public class OperationResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //混合运算,有常量或者乘除的缩放 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java index 0b82cf4..79abcce 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.casic.missiles.pojo.ByteResolverParam; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; //精度计算 -@Service("precision") +@Component("precision") @AllArgsConstructor @Slf4j public class PrecisionResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java deleted file mode 100644 index 5c3f332..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; -//转换规则 -@Service("convert") -@AllArgsConstructor -@Slf4j -public class RuleResolver implements ByteResolver { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam){ - RuleEvaluator fieldRuleEngine=fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); - if(ObjectUtil.isEmpty(fieldRuleEngine)){ - return byteResolverParam.getValue(); - } - String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); - Map env2 = new HashMap(); - env2.put("value", (byte) byteResolverParam.getValue()); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java new file mode 100644 index 0000000..d3bbd91 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java @@ -0,0 +1,15 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; + +import java.util.List; +import java.util.Map; +// 前导码匹配->长度字段 +public interface AbstractCombinedFieldProcessor { + + Map invoke(Map map, ByteBuf byteBuf, List combinedFieldConfigList, + Map fieldConfigsMap, Map storeObjectMap); + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java new file mode 100644 index 0000000..03c8480 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java @@ -0,0 +1,59 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-13 + */ +//依次递增进行数据的解析, +public class GenericCombinedFieldResolver { + + + //通过查询,字段长度长度随机 + public void parseDataField(List combinedFieldConfigList, ByteBuf byteBuf, + Map storeObjectMap, Map fieldConfigsMap) { + Integer frameLength = Integer.valueOf(ByteBufUtil.hexDump(byteBuf)); + //添加前置处理器 + com.casic.missiles.util.ClassUtil classUtil = new com.casic.missiles.util.ClassUtil(); + List abstractCombinedProcessors = classUtil.getSubClassList(AbstractCombinedFieldProcessor.class); + + Map fieldFixedMap = combinedFieldLeadCodeMap(combinedFieldConfigList); + //frameLength + Map combinedProcessorFields = null; + while (byteBuf.readableBytes() < frameLength) { + //一直处理 + for (AbstractCombinedFieldProcessor abstractCombinedProcessor : abstractCombinedProcessors) { + combinedProcessorFields = abstractCombinedProcessor.invoke(combinedProcessorFields, byteBuf, + combinedFieldConfigList, + fieldConfigsMap, storeObjectMap); + if (combinedProcessorFields == null || byteBuf.readableBytes() < frameLength) { + return; + } + } + + } + } + + /** + * 取出前导码匹配集合 + */ + private Map combinedFieldLeadCodeMap(List combinedFieldConfigList) { + Map fieldFixedMap = combinedFieldConfigList + .stream() + .collect(Collectors.toMap(CombinedFieldConfig::getPrefixCode, e -> e)); + return fieldFixedMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java new file mode 100644 index 0000000..643a934 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java @@ -0,0 +1,100 @@ +package com.casic.missiles.parser.resolver.fields; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.FieldParserSupport; +import com.casic.missiles.pojo.*; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 保存使用时最基本的信息,并且使用原型模式 + */ +@Slf4j +public class DefaultProtocolFieldParser extends FieldParserSupport implements FieldParser, FixedPropertyEnum { + + //通过传入的配置和报文进行字段解析 + @Override + public Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap) { + Map dataMap = new HashMap<>(); + for (AbstractFieldConfig protocolFieldConfig : protocolFieldConfigs) { + if (!ObjectUtils.isEmpty(protocolFieldConfig.getOriginPositionByte())) { + Object fieldValue = FieldResolver.parseField(buffer, protocolFieldConfig, null); + if (protocolFieldConfig.getIsStorage() == 1) { + storeObjectMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + dataMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + } + return dataMap; + } + + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength) { + Map fixedPropertyMap = new HashMap<>(); + Integer fixedLength = calculateLength(protocolFieldConfigs); + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + fixedPropertyMap.put(FIXED_POSITION, maxFixedPosition); + fixedPropertyMap.put(TOTAL_LENGTH, totalLength); + fixedPropertyMap.put(TAIL_POSITION, totalLength - fixedLength + maxFixedPosition); + return fixedPropertyMap; + } + + //** 获取业务内容的byteBuf + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer) { + //计算固定长度 + Integer fixedLength = calculateLength(protocolFieldConfigs); + //总长度获取 + String lightText = buffer.toString(Charset.forName("ISO-8859-1")); + Integer totalLength = lightText.length(); + //计算固定长度最大长度 + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + //计算数据报文内容 + ByteBuf bizDataFields = buffer.slice(maxFixedPosition - 1, (totalLength - fixedLength)); + return bizDataFields; + } + + /** + * 获取过滤字段的长度 + */ + @Override + public Integer getTotalFilterLength(ProtocolConfig protocolConfig, + ByteBuf byteBuf, + Map protocolFieldConfigMap) { + if (ByteBufUtil.hexDump(byteBuf).equals("")) { + return 0; + } + int totalFilterLength = 0; + String filterFields = protocolConfig.getTotalLengthFilterFields(); + try { + if (!StringUtils.isEmpty(filterFields)) { + String[] filterFieldList = filterFields.split(","); + for (String filterFieldId : filterFieldList) { + if (StringUtils.isNotEmpty(filterFieldId)) { + ProtocolFieldConfig fieldConfig = protocolFieldConfigMap.get(Long.valueOf(filterFieldId)); + //这里都是按字节计算,没有对位进行区分,可能会出现错误 + // 如果对位有需求,需要进一步跟进 + totalFilterLength += fieldConfig.getOffsetLength(); + } + } + } + return totalFilterLength; + } catch (Exception ex) { + log.error("报文确认分发阶段,获取报文总长度过滤长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); + } + return totalFilterLength; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java new file mode 100644 index 0000000..d51e887 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java @@ -0,0 +1,169 @@ +package com.casic.missiles.parser.resolver.fields; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.parser.resolver.ByteMergeProvider; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.AbstractFieldConfig; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.pojo.ByteResolverParam; +import io.netty.buffer.ByteBuf; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * 字段解析管理总类 + */ +@Slf4j +public class FieldResolver extends ByteMergeProvider { + + //1、字段截取 => 2、简单的字节解析和复杂的字节解析 + public static Object parseField(ByteBuf byteBuf,AbstractFieldConfig fieldConfig, Integer maxFixedPosition) { + Integer orignPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + //最大固定位置不为空, + if (!ObjectUtil.isEmpty(maxFixedPosition)) { + orignPosition -= maxFixedPosition; + } + Object fieldValue = 0; + //待优化 + if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { + fieldValue = doParseBitField(byteBuf, fieldConfig); + } else { + ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); + fieldValue = doParseByteField(fieldBytes, fieldConfig.getRuleJson()); + } + return fieldValue; + } + + //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, + //目前默认配置的规则设置暂不支持配置化,由实现完成 + private static Object doParseByteField(ByteBuf byteBuf, String ruleJson) { + Object fieldsResolveValue = null; + List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); + if (ObjectUtil.isEmpty(ruleMapList)) { + fieldsResolveValue = defaultResolveBuilder(byteBuf); + } else { + fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); + } + return fieldsResolveValue; + } + + private static Object defaultResolveBuilder(ByteBuf byteBuf) { + Integer defaultResolveValue = 0; + for (int i = 0; i < byteBuf.writerIndex(); i++) { + defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; + } + return defaultResolveValue; + } + + //字段解析构建器(针对字节单位的) + //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 + // 字节归并结束或者规则结束=>继续根据规则进行判断 + private static Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { + Object customizeResolveValue = null; + try { + List bytStrList = new ArrayList<>(); + //存放到数组里面 + for (int i = 0; i < byteBuf.writerIndex(); i++) { + bytStrList.add(byteBuf.readByte()); + } + int i = 0; + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { + if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + customizeResolveValue = resolveByteMerge(bytStrList, ruletypeId, vaildRange); + break; + } else { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + List tempBytStr = new ArrayList<>(); + for (int k = 0; i < bytStrList.size(); i++) { + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(k) + .value(bytStrList.get(k)) + .ruletypeId(ruletypeId).build(); + tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); + } + bytStrList = tempBytStr; + } + i++; + } + //字节归并到一起=>继续根据规则进行判断 + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(null) + .value(customizeResolveValue) + .ruletypeId(ruletypeId).build(); + customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); + i++; + } + System.out.println(JSON.toJSON(customizeResolveValue)); + return customizeResolveValue; + } catch (RuntimeException ex) { + log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); + return null; + } + } + + /** + * 1、单个字节情况表示字段 + * 2、多字节情况表示字段(暂未处理) + */ + private static Object doParseBitField(ByteBuf byteBuf,AbstractFieldConfig fieldConfig) { + Object fieldValue = new Object(); + try { + Integer orignPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + byte fields = 0x00; + if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { + fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); + } else { + fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); + } + + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { + if (!StringUtils.isEmpty(fieldConfig.getOriginPositionBit())) { + fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getOriginPositionBit())).byteValue() + >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); + } else { + fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); + } + } else { + fieldValue = Integer.valueOf(fields & 0xff); + } + if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { + return fieldValue; + } + List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); + int i = 0; + //字节归并到一起=>继续根据规则进行判断 + while (i < ruleMapList.size()) { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(null) + .value(fieldValue) + .ruletypeId(ruletypeId).build(); + fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); + i++; + } + System.out.println(JSON.toJSON(fieldValue)); + return fieldValue; + } catch (RuntimeException ex) { + log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); + return null; + } + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java deleted file mode 100644 index 35ae3d0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java +++ /dev/null @@ -1,183 +0,0 @@ -package com.casic.missiles.parser.resolver.fields; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufAllocator; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; -import org.springframework.util.ObjectUtils; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service("standard") -@AllArgsConstructor -@Slf4j -public class StandardFieldParser implements FieldParser { - - private final FieldConfigDao fieldConfigDao; - private final FieldResolver fieldResolver; - - //数据解析 - @Override - public Map dataParser(RuleConfig ruleConfig, String lightText, String protocolId) { - String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); - ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); - bufferContent.writeBytes(lightText.getBytes(Charset.forName("ISO-8859-1"))); - Map dataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - for (String dataFieldId : dataFieldIds) { - FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(dataFieldId); - if (!ObjectUtils.isEmpty(fieldConfig)) { - dataMap.put(fieldConfig.getFieldName(), String.valueOf(fieldResolver.filedParserManger(bufferContent, fieldConfig, maxFixedPosition))); - } - } - return dataMap; - } - - //数据解析 - @Override - public Map fixDataParser(String protocolId, ByteBuf buffer) { - List dataFieldIdList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Map dataMap = new HashMap<>(); - for (FieldConfig dataField : dataFieldIdList) { - if (!ObjectUtils.isEmpty(dataField.getOrignPosition())) { - Object fieldValue = (Integer) fieldResolver.filedParserManger(buffer, dataField, null); - dataMap.put(dataField.getFieldName(), fieldValue); - } - } - return dataMap; - } - - @Override - public Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf) { - if (ByteBufUtil.hexDump(byteBuf).equals("")) { - return 0; - } - String filterFields = protocolConfig.getTotalLengthFilterField(); - Integer totalLength = 0; - try { - FieldConfig totalFieldConfig = fieldConfigDao.getFieldConfigById(protocolConfig.getTotalLengthId()); - int totalFilterLength = 0; - if (!StringUtils.isEmpty(filterFields)) { - String[] filterFieldList = filterFields.split(","); - for (String filterField : filterFieldList) { - FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(filterField); - //这里都是按字节计算,没有对位进行区分,可能会出现错误 - - // 如果对位有需求,需要进一步跟进 - totalFilterLength += fieldConfig.getOffsetLength(); - } - } - totalLength = (Integer) fieldResolver.filedParserManger(byteBuf, totalFieldConfig, null) + totalFilterLength; - } catch (Exception ex) { - log.error("报文确认分发阶段,获取报文总长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); - } - return totalLength; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer) { - //业务内容 - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - String protocolId = String.valueOf(protocolConfig.getId()); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - //计算固定长度 - Integer fixedLength = calculateLength(fieldConfigList); -// Integer totalLength = this.getTotalLength(protocolConfig, buffer); - //总长度获取 - Integer totalLength = lightText.length(); - //计算固定长度最大长度 - Integer maxFixedPosition = calculatePosition(fieldConfigList); -// buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - //计算数据报文内容 - ByteBuf bizDataFields = buffer.slice(maxFixedPosition-1, (totalLength - fixedLength)); - return bizDataFields; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer) { - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - String protocolId = String.valueOf(protocolConfig.getId()); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer fixedLength = calculateLength(fieldConfigList); -// Integer totalLength = this.getTotalLength(protocolConfig, buffer); - Integer totalLength = lightText.length(); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - ByteBuf fixDataFields = buffer.slice(0, maxFixedPosition); - return fixDataFields; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer) { - String protocolId = String.valueOf(protocolConfig.getId()); - Map fixedPropertyMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer fixedLength = calculateLength(fieldConfigList); - Integer totalLength = this.getTotalLength(protocolConfig, buffer); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - fixedPropertyMap.put("fixedPosition", maxFixedPosition); - fixedPropertyMap.put("totalLength", totalLength); - fixedPropertyMap.put("tailPosition", totalLength - fixedLength + maxFixedPosition); - return fixedPropertyMap; - } - - //分别计算bit和byte长度=> 合并长度 - private Integer calculateLength(List fieldConfigList) { - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (FieldConfig fieldConfig : fieldConfigList) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - Integer fixedLength = bytefixedLength + bitfixedLength / 8; - return fixedLength; - } - - //找到最大值=> 根据最大值计算业务数据下标 - private Integer calculatePosition(List fieldConfigList) { - String rex = "[0-9]+"; - Integer max = -1; - for (FieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOrignPosition()) - && Integer.valueOf(fieldConfig.getOrignPosition()) > max) { - max = Integer.valueOf(fieldConfig.getOrignPosition()); - } - } - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (FieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOrignPosition()) && fieldConfig.getOrignPosition().equals(max)) { - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - } - } - Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; - return maxFixedPosition; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java new file mode 100644 index 0000000..d4ec6c7 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java @@ -0,0 +1,76 @@ +package com.casic.missiles.parser.rule; + +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import org.apache.commons.lang3.StringUtils; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class GenericRuleResolver { + + //根据前置字段的值,找到指定的规则 + //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 + //=>循环判断=>通过规则得到业务字段 + public static RuleConfig machRule(Map fixDataMap, + String ids, + List protocolFieldConfigs, + List ruleConfigs) { + List preRuleConfigList = getPreRuleList(ids, protocolFieldConfigs); + //获取前置规则字段 + final Map metaDataMap = getPreRuleFields(preRuleConfigList, fixDataMap); + //准备固定的字段集合 + Map fixDataFieldMap = getFixDataFieldMap(protocolFieldConfigs); + return RuleResolverCore.doMachRule(ruleConfigs, metaDataMap, fixDataMap, fixDataFieldMap); + } + + private static Map getFixDataFieldMap(List protocolFieldConfigs) { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, ProtocolFieldConfig::getFieldName) + ); + return fixDataFieldMap; + } + + + /** + * 查询前置规则的字段配置 + * + * @param ids + * @return + */ + private static List getPreRuleList(String ids, List protocolFieldConfigs) { + String[] idList = ids.split(","); + Map prepareMaps = new HashMap<>(); + for (String id : idList) { + if (StringUtils.isNotEmpty(id)) { + prepareMaps.put(Long.valueOf(id), ""); + } + } + List preRuleConfigList = protocolFieldConfigs + .stream() + .filter(e -> prepareMaps.containsKey(e.getId())) + .collect(Collectors.toList()); + return preRuleConfigList; + } + + /** + * 获取前置规则解析字段 + */ + private static Map getPreRuleFields(List preRuleFieldConfigList, Map fixDataMap) { + Map ruleFieldMap = new HashMap<>(); + preRuleFieldConfigList.stream() + .forEach( + preRuleFieldConfig -> { + String fieldName = preRuleFieldConfig.getFieldName(); + if (fixDataMap.containsKey(fieldName)) { + ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); + } + } + ); + return ruleFieldMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java new file mode 100644 index 0000000..baae7e8 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -0,0 +1,68 @@ +package com.casic.missiles.parser.rule; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.casic.missiles.pojo.RuleConfig; + +import java.util.*; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleResolverCore { + + + public static RuleConfig doMachRule(List ruleConfigList, Map metaDataMap, + Map fixDataMap, + Map fixDataFieldMap) { + Optional ruleConfigOptional = ruleConfigList.stream() + .filter(ruleConfig -> machRuleConfig( + JSON.parseObject(ruleConfig.getMatchRuleJson(), Map.class), metaDataMap)) + .findFirst(); + if (ObjectUtil.isEmpty(ruleConfigOptional)) { + return null; + } + String[] ruleFields = ruleConfigOptional.get().getDataFieldIds().split(","); + Map ruleMetaDataMap = getRuleFields(ruleFields, fixDataMap, fixDataFieldMap); + //递归选定解析规则,进行规则解析 + if (!ruleConfigOptional.get().getIsFinishMatch().equals("1")) { + //递归选定规则 + doMachRule(ruleConfigList, ruleMetaDataMap, fixDataMap, fixDataFieldMap); + } + return ruleConfigOptional.get(); + } + + + private static Map getRuleFields(String[] preRuleConfigList, Map fixedDataMap, + Map fixedFieldMap) { + Map ruleFieldMap = new HashMap<>(); + for (String preRuleConfigId : preRuleConfigList) { + String fieldName = fixedFieldMap.get(preRuleConfigId); + if (fixedDataMap.containsKey(fieldName)) { + ruleFieldMap.put(fieldName, String.valueOf(fixedDataMap.get(fieldName))); + } + } + return ruleFieldMap; + } + + + //匹配规则配置 + private static Boolean machRuleConfig(Map ruleMap, Map metaDataMap) { + if (ruleMap == null || metaDataMap == null) { + return null; + } + //所有的字段在规则里面必须有有配置 + for (String key : metaDataMap.keySet()) { + if (ruleMap.containsKey(key)) { + if (!ruleMap.get(key).equals(metaDataMap.get(key))) { + return false; + } + } else { + return false; + } + } + return true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java deleted file mode 100644 index 664088d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java +++ /dev/null @@ -1,92 +0,0 @@ -package com.casic.missiles.parser.rule; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.mapper.dao.PreRuleConfigDao; -import com.casic.missiles.mapper.dao.RuleConfigDao; -import lombok.AllArgsConstructor; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.*; -import java.util.stream.Collectors; - -@Service -@AllArgsConstructor -public class RulerProvider { - - private final FieldConfigDao fieldConfigDao; - private final PreRuleConfigDao preRuleConfigDao; - private final RuleConfigDao ruleConfigDao; - - //根据前置字段的值,找到指定的规则 - //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 - //=>循环判断=>通过规则得到业务字段 - public RuleConfig ruleConfig(Map fixDataMap, String protocolId) { - //批量获取规则 - List preRuleConfigList = preRuleConfigDao.getPreRuleList(protocolId); - //获取固定字段 - Map fixFieldMap = getAllFieldMap(protocolId); - //获取前置规则字段 - final String preRuleFields = getPreRuleFields(preRuleConfigList, fixDataMap, fixFieldMap); - List ruleConfigList = ruleConfigDao.getRuleConfigById(protocolId); - Optional ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig ->preRuleFields.equals( ruleConfig.getParseRuleJson())).findFirst(); - //递归选定解析规则,进行规则解析 - while (!ObjectUtil.isEmpty(ruleConfigOptional) && !ruleConfigOptional.get().getIsBizField().equals("1")) { - String ruleFields = getRuleFields(ruleConfigOptional.get().getDataFieldIds().split(","), fixDataMap, fixFieldMap); - ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig -> ruleConfig.getParseRuleJson().equals(ruleFields)).findFirst(); - } - return ruleConfigOptional.get(); - } - - /** - * 获取前置规则解析字段 - */ - private String getPreRuleFields(List preRuleConfigList, Map fixDataMap, Map fixFieldMap) { - Map ruleFieldMap= new HashMap<>(); - preRuleConfigList.stream() - .forEach( - preRuleConfig -> { - String fieldName = fixFieldMap.get(Long.valueOf(preRuleConfig.getRuleFieldId())); - if (fixDataMap.containsKey(fieldName)) { - ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); - } - } - ); - return JSONObject.toJSONString(ruleFieldMap); - } - - private Map getAllFieldMap(String protocolId) { - List fieldList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Map fixFieldMap = fieldList.stream().collect( - Collectors.toMap(FieldConfig::getId, FieldConfig::getFieldName) - ); - return fixFieldMap; - } - - private String getRuleFields(String[] preRuleConfigList, Map fixDataMap, Map fixFieldMap) { - Map ruleFieldMap= new HashMap<>(); - for (String preRuleConfigId : preRuleConfigList) { - String fieldName = fixFieldMap.get(preRuleConfigId); - if (fixDataMap.containsKey(fieldName)) { - ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); - } - } - return JSONObject.toJSONString(ruleFieldMap); - } - - //弃置 - private String ListToString(List ruleFieldList) { - String ruleFields = ""; - for (String ruleField : ruleFieldList) { - ruleFields += ruleField + ","; - } - ruleFields = StringUtils.isEmpty(ruleFields) ? ruleFields : ruleFields.substring(0, ruleFields.length() - 1); - return ruleFields; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java index 6177e10..bfa87a5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java @@ -2,7 +2,7 @@ public interface SafeStrategy { - String decryption(byte[] bytes); + String decryption(String cipher); String encryption(String lightText); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java index 618716c..6236302 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java @@ -9,9 +9,9 @@ //十六进制的字符串转换成字节数组 byte[] bytes = hexStrToBinaryStr(msg); //计算CRC8 - byte crc8 = CRC8(bytes, 0, bytes.length); - String crc8ToStr = "" + Integer.toHexString(0xff & crc8); - return crc8ToStr; +// String crc8ToStr = "" + Integer.toHexString(0xff & crc8); +// return crc8ToStr; + return null; } /** @@ -33,50 +33,5 @@ return bytes; } - /** - * CRC8 校验 多项式 x8+x2+x+1 - * - * @param b - * @param off - * @param len - * @return - */ - public static byte CRC8(final byte[] b, final int off, final int len) { - byte result = 0x00; - for (int i = 0; i < len; i++) { - result = CHECKSUM_TABLE[(result ^ (b[i + off] & 0xFF)) & 0xFF]; - } - return (byte) (result & 0xFFL); - } - - private final static byte[] CHECKSUM_TABLE = {(byte) 0x00, (byte) 0x07, (byte) 0x0e, (byte) 0x09, (byte) 0x1c, (byte) 0x1b, - (byte) 0x12, (byte) 0x15, (byte) 0x38, (byte) 0x3f, (byte) 0x36, (byte) 0x31, (byte) 0x24, (byte) 0x23, (byte) 0x2a, - (byte) 0x2d, (byte) 0x70, (byte) 0x77, (byte) 0x7e, (byte) 0x79, (byte) 0x6c, (byte) 0x6b, (byte) 0x62, (byte) 0x65, - (byte) 0x48, (byte) 0x4f, (byte) 0x46, (byte) 0x41, (byte) 0x54, (byte) 0x53, (byte) 0x5a, (byte) 0x5d, (byte) 0xe0, - (byte) 0xe7, (byte) 0xee, (byte) 0xe9, (byte) 0xfc, (byte) 0xfb, (byte) 0xf2, (byte) 0xf5, (byte) 0xd8, (byte) 0xdf, - (byte) 0xd6, (byte) 0xd1, (byte) 0xc4, (byte) 0xc3, (byte) 0xca, (byte) 0xcd, (byte) 0x90, (byte) 0x97, (byte) 0x9e, - (byte) 0x99, (byte) 0x8c, (byte) 0x8b, (byte) 0x82, (byte) 0x85, (byte) 0xa8, (byte) 0xaf, (byte) 0xa6, (byte) 0xa1, - (byte) 0xb4, (byte) 0xb3, (byte) 0xba, (byte) 0xbd, (byte) 0xc7, (byte) 0xc0, (byte) 0xc9, (byte) 0xce, (byte) 0xdb, - (byte) 0xdc, (byte) 0xd5, (byte) 0xd2, (byte) 0xff, (byte) 0xf8, (byte) 0xf1, (byte) 0xf6, (byte) 0xe3, (byte) 0xe4, - (byte) 0xed, (byte) 0xea, (byte) 0xb7, (byte) 0xb0, (byte) 0xb9, (byte) 0xbe, (byte) 0xab, (byte) 0xac, (byte) 0xa5, - (byte) 0xa2, (byte) 0x8f, (byte) 0x88, (byte) 0x81, (byte) 0x86, (byte) 0x93, (byte) 0x94, (byte) 0x9d, (byte) 0x9a, - (byte) 0x27, (byte) 0x20, (byte) 0x29, (byte) 0x2e, (byte) 0x3b, (byte) 0x3c, (byte) 0x35, (byte) 0x32, (byte) 0x1f, - (byte) 0x18, (byte) 0x11, (byte) 0x16, (byte) 0x03, (byte) 0x04, (byte) 0x0d, (byte) 0x0a, (byte) 0x57, (byte) 0x50, - (byte) 0x59, (byte) 0x5e, (byte) 0x4b, (byte) 0x4c, (byte) 0x45, (byte) 0x42, (byte) 0x6f, (byte) 0x68, (byte) 0x61, - (byte) 0x66, (byte) 0x73, (byte) 0x74, (byte) 0x7d, (byte) 0x7a, (byte) 0x89, (byte) 0x8e, (byte) 0x87, (byte) 0x80, - (byte) 0x95, (byte) 0x92, (byte) 0x9b, (byte) 0x9c, (byte) 0xb1, (byte) 0xb6, (byte) 0xbf, (byte) 0xb8, (byte) 0xad, - (byte) 0xaa, (byte) 0xa3, (byte) 0xa4, (byte) 0xf9, (byte) 0xfe, (byte) 0xf7, (byte) 0xf0, (byte) 0xe5, (byte) 0xe2, - (byte) 0xeb, (byte) 0xec, (byte) 0xc1, (byte) 0xc6, (byte) 0xcf, (byte) 0xc8, (byte) 0xdd, (byte) 0xda, (byte) 0xd3, - (byte) 0xd4, (byte) 0x69, (byte) 0x6e, (byte) 0x67, (byte) 0x60, (byte) 0x75, (byte) 0x72, (byte) 0x7b, (byte) 0x7c, - (byte) 0x51, (byte) 0x56, (byte) 0x5f, (byte) 0x58, (byte) 0x4d, (byte) 0x4a, (byte) 0x43, (byte) 0x44, (byte) 0x19, - (byte) 0x1e, (byte) 0x17, (byte) 0x10, (byte) 0x05, (byte) 0x02, (byte) 0x0b, (byte) 0x0c, (byte) 0x21, (byte) 0x26, - (byte) 0x2f, (byte) 0x28, (byte) 0x3d, (byte) 0x3a, (byte) 0x33, (byte) 0x34, (byte) 0x4e, (byte) 0x49, (byte) 0x40, - (byte) 0x47, (byte) 0x52, (byte) 0x55, (byte) 0x5c, (byte) 0x5b, (byte) 0x76, (byte) 0x71, (byte) 0x78, (byte) 0x7f, - (byte) 0x6a, (byte) 0x6d, (byte) 0x64, (byte) 0x63, (byte) 0x3e, (byte) 0x39, (byte) 0x30, (byte) 0x37, (byte) 0x22, - (byte) 0x25, (byte) 0x2c, (byte) 0x2b, (byte) 0x06, (byte) 0x01, (byte) 0x08, (byte) 0x0f, (byte) 0x1a, (byte) 0x1d, - (byte) 0x14, (byte) 0x13, (byte) 0xae, (byte) 0xa9, (byte) 0xa0, (byte) 0xa7, (byte) 0xb2, (byte) 0xb5, (byte) 0xbc, - (byte) 0xbb, (byte) 0x96, (byte) 0x91, (byte) 0x98, (byte) 0x9f, (byte) 0x8a, (byte) 0x8d, (byte) 0x84, (byte) 0x83, - (byte) 0xde, (byte) 0xd9, (byte) 0xd0, (byte) 0xd7, (byte) 0xc2, (byte) 0xc5, (byte) 0xcc, (byte) 0xcb, (byte) 0xe6, - (byte) 0xe1, (byte) 0xe8, (byte) 0xef, (byte) 0xfa, (byte) 0xfd, (byte) 0xf4, (byte) 0xf3}; } \ No newline at end of file diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java index 27c2838..6e078a3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java @@ -1,9 +1,6 @@ package com.casic.missiles.parser.safe.impl; -import cn.hutool.core.util.CharsetUtil; -import cn.hutool.crypto.symmetric.SM4; -import cn.hutool.crypto.symmetric.SymmetricCrypto; - +import com.casic.missiles.parser.safe.SafeStrategy; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; @@ -11,19 +8,44 @@ import org.bouncycastle.crypto.engines.SM4Engine; import org.bouncycastle.crypto.params.KeyParameter; import org.bouncycastle.util.encoders.Hex; - -import static cn.hutool.crypto.Mode.ECB; -import static cn.hutool.crypto.Padding.NoPadding; +import org.springframework.stereotype.Component; /** * SM4算法工具类 */ @Slf4j -public class Sm4 { +@Component("sm4") +public class Sm4 implements SafeStrategy { //加解密的字节快大小 public static final int BlockSize = 16; + @Override + public String decryption(String cipher) { + byte[] keyByte = { + 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 + }; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(keyByte); + byte[] in = Hex.decode(cipher); + byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); + String plain = EcbDecrypt(in, keyBytes); + return plain; + } + + @Override + public String encryption(String cipher) { + byte[] keyByte = { + 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 + }; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(keyByte); + byte[] in = Hex.decode(cipher); + byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); + String plain = EcbDecrypt(in, keyBytes); + return plain; + } + /** * SM4ECB加密算法,对内 * @@ -32,8 +54,6 @@ * @return */ private static byte[] ecb_encrypt(byte[] in, byte[] keyBytes) { - - SM4Engine sm4Engine = new SM4Engine(); sm4Engine.init(true, new KeyParameter(keyBytes)); byte[] out = new byte[in.length]; @@ -58,27 +78,6 @@ return cipher; } - - /** - * hutool 解密SM4 - * - * @param encodeContent - * @return - */ - public static String decode(String encodeContent) { - String key = "24ad182507479a5da3ad94d9d78ea203"; - try { - SymmetricCrypto sm4 = new SM4(ECB, NoPadding, key.getBytes()); - String decryptStr = sm4.decryptStr(encodeContent, CharsetUtil.CHARSET_UTF_8); - return decryptStr; - } catch (Exception e) { - e.printStackTrace(); - log.error("SM4解密失败"); - } - return null; - } - - /** * SM4的ECB加密算法 * @@ -129,20 +128,6 @@ return plain; } - /** - * SM4的ECB解密算法 - * - * @param cipher 输入的密文字符串 - * @param key 密钥 - * @return - */ - public static String EcbDecrypt(String cipher, String key) { - byte[] in = Hex.decode(cipher); - byte[] keyBytes = Hex.decode(key); - - String plain = EcbDecrypt(in, keyBytes); - return plain; - } /** * 主函数 @@ -151,28 +136,24 @@ */ public static void main(String[] args) { byte[] ciphertext = { + 0x4B, (byte) 0x8C, (byte) 0x9D, 0x08, (byte) 0xE4, (byte) 0xD3, 0x64, 0x42, (byte) 0xB9, (byte) 0xA5, (byte) 0xFE, (byte) 0xCD, (byte) 0x91, 0x1B, 0x38, (byte) 0xAC, (byte) 0xE9, 0x1C, (byte) 0xCD, 0x53, 0x02, (byte) 0xD7, 0x0C, (byte) 0x9B, (byte) 0x96, 0x30, 0x62, (byte) 0xE8, (byte) 0xFB, (byte) 0xEF, (byte) 0xB9, (byte) 0xFF, (byte) 0xDE, 0x19, (byte) 0x80, 0x35, 0x3E, (byte) 0x90, 0x4F, 0x2F, 0x12, 0x2B, 0x19, (byte) 0x8B, 0x6C, 0x7A, (byte) 0x85, (byte) 0xA1, (byte) 0xB1, (byte) 0x86, (byte) 0xA3, 0x7A, 0x46, 0x0C, 0x2F, (byte) 0x94, 0x4F, 0x7F, 0x2C, 0x56, 0x14, (byte) 0xF3, (byte) 0x89, (byte) 0xC3, - 0x3F, 0x20, (byte) 0xF9, (byte) 0x87, (byte) 0xA1, 0x60, (byte) 0xD9, (byte) 0xA8, (byte) 0xFD, (byte) 0xD7, (byte) 0x9B, 0x4B, 0x26, 0x06, 0x30, 0x44}; + 0x3F, 0x20, (byte) 0xF9, (byte) 0x87, (byte) 0xA1, 0x60, (byte) 0xD9, (byte) 0xA8, (byte) 0xFD, (byte) 0xD7, (byte) 0x9B, 0x4B, 0x26, 0x06, 0x30, 0x44 + }; ByteBuf in = ByteBufAllocator.DEFAULT.heapBuffer(); in.writeBytes(ciphertext); - byte[] keyByte = { 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 }; ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); - key.writeBytes(ciphertext); - String resCipherData = decode(ByteBufUtil.hexDump(in)); - ByteBuf out = ByteBufAllocator.DEFAULT.heapBuffer(); -// out.writeBytes(resCipherData); -// System.out.println(hexBytes); - System.out.println(resCipherData.toString()); -// String resPlainData = EcbDecrypt(resCipherData, key); -// System.out.println("原始明文:" + data); -// System.out.println("解密后明文:" + resPlainData); + key.writeBytes(keyByte); +// String resCipherData = EcbDecrypt(ByteBufUtil.hexDump(in), ByteBufUtil.hexDump(key)); +// System.out.println(resCipherData); } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java index 1395a51..ac5f957 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java @@ -1,7 +1,7 @@ package com.casic.missiles.parser.safe.impl; import io.netty.buffer.ByteBufUtil; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** *

@@ -14,9 +14,8 @@ * @author hyl * @version v1.0: Tea.java, v 0.1 2021/3/12 13:48 $ */ -@Service("tea") -///tea算法类 - +//tea算法类 +@Component("tea") public class Tea { public static byte[] MyTea_Encrypt(byte[] MyTeaContent, int ByteLen, byte[] MyTeakey) { @@ -99,7 +98,6 @@ // for(int i32Index = 0; i32Index < 8; i32Index++) { // System.out.print("0x" + Integer.toHexString(MyContent[i32Index]) + " "); // } - // System.out.println("密钥为:"); // for(int i32Index = 0; i32Index < 16; i32Index++) { // System.out.print("0x" + Integer.toHexString(MyKeys[i32Index]) + " "); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java index bdd0721..bd1516a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java @@ -3,7 +3,7 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.parser.sender.DataSubscribeProvider; import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponents; import org.springframework.web.util.UriComponentsBuilder; @@ -12,7 +12,7 @@ import java.util.Collections; import java.util.Map; -@Service("functionCallback") +@Component("functionCallback") public class FunctionCallback implements DataSubscribeProvider { @Resource diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java index 608af3a..32cc8a4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java @@ -2,48 +2,47 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.delivery.decorator.ByteDecorator; +import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @AllArgsConstructor public class FieldDecoratorManger { - private final RuleDictDao ruleDictDao; + private final RuleConfigRegistry ruleDictDao; // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 // (1)静态的业务字段是字典里面可以配置的 // (2)动态的业务字段是通过规则生成的 public String contentMerge(String ruleJson, String sceneConent, String dynamicContent) { - List ruleDictList = ruleDictDao.getRuleDictConfig(); - Map ruleDictMap = ruleDictList.stream().collect( - Collectors.toMap(RuleDict::getId, e -> e)); - List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); - for (Map ruleMap : ruleMapList) { - String ruleType = String.valueOf(ruleMap.get("ruleType")); - ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); - NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); - byteDecorator.nodeDecoratorRule(nodeDecoratorParm); - } +// List ruleDictList = ruleDictDao.getRuleDictConfig(); +// Map ruleDictMap = ruleDictList.stream().collect( +// Collectors.toMap(RuleDict::getId, e -> e)); +// List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); +// for (Map ruleMap : ruleMapList) { +// String ruleType = String.valueOf(ruleMap.get("ruleType")); +// ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); +// NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); +// byteDecorator.nodeDecoratorRule(nodeDecoratorParm); +// } return null; } - - private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { - NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() - .contents(sceneConent) - .dynamicContent(dynamicContent) - .ruletypeId(ruletypeId) - .ruleDictMap(ruleDictMap) - .build(); - return nodeDecoratorParm; - } +// +// private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { +// NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() +// .contents(sceneConent) +// .dynamicContent(dynamicContent) +// .ruletypeId(ruletypeId) +// .ruleDictMap(ruleDictMap) +// .build(); +// return nodeDecoratorParm; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java index 652970c..b204ac3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java @@ -1,56 +1,56 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@AllArgsConstructor -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", - JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Component; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Component("logicalDecorator") +//@AllArgsConstructor +//@Slf4j +//public class LogicalShiftDecorator implements ByteDecorator { +// +//// private final FieldRuleEngineMapper fieldRuleEngineMapper; +//// +//// //字节位移 +//// @Override +//// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +//// String logicalValue = ""; +//// RuleEvaluator fieldRuleEngine = new RuleEvaluator(); +//// try { +//// Map env2 = new HashMap(); +//// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +//// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +//// for (String contentId : contentIdList) { +//// RuleDict ruleDict = ruleDictMap.get(contentId); +//// if (ruleDict.getCode().contains("#")) { +//// //使用动态的值 +//// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +//// } +//// env2.put(ruleDict.getName(), ruleDict.getCode()); +//// } +//// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +//// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +//// return null; +//// } +//// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +//// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +//// return values; +//// } catch (Exception ex) { +//// log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", +//// JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +//// return null; +//// } +//// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java index 346468f..822fead 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@AllArgsConstructor -@Slf4j -public class OperationDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("optionDecorator") +//@AllArgsConstructor +//@Slf4j +//public class OperationDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //混合运算,有常量或者乘除的缩放 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java index 50fb0a7..7a8bccb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@AllArgsConstructor -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +////精度计算 +//@AllArgsConstructor +//@Registry("precisionDecorator") +//@Slf4j +//public class PrecisionDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java index da39235..27f9cc7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java @@ -1,54 +1,53 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@AllArgsConstructor -@Slf4j -public class RuleDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("ruleDecorator") +//@AllArgsConstructor +//@Slf4j +//public class RuleDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //吃我一套正则表达式 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (Exception ex) { +// log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java index 7f5cbf3..c043f97 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java @@ -2,6 +2,6 @@ import java.util.Map; -public interface ComandeEventService { +public interface ComandeEventService{ Map loadComandeEventConfig(String protocolId,String scene); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java index 476ad84..aaf1837 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java @@ -2,46 +2,46 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.dao.CommandEventDao; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @Slf4j @AllArgsConstructor -public class ComandeEventServiceImpl implements ComandeEventService { +public class ComandeEventServiceImpl implements ComandeEventRegistry { - private final CommandEventDao commandEventDao; + // private final CommandEventDao commandEventDao; // 加密bean 固定字段出现变化的字段解析,业务字段的有序内容 @Override - public Map loadComandeEventConfig(String protocolId,String sceneName) { - CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); - if (ObjectUtil.isEmpty(commandEventConfig)) { - log.error("协议{},没有配置成功接收回复配置,清排查原因"); - return null; - } - String replyJson = commandEventConfig.getReplyContentJson(); - List> replyMapList = JSONArray.parseObject(replyJson, List.class); - List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); - Map fixMap = fixList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); - List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) - .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) - .collect(Collectors.toList()); - Map commandConfigMap = new HashMap<>(); - commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); - commandConfigMap.put("fixContent", fixMap); - commandConfigMap.put("bizContent", contentList); - return commandConfigMap; + public Map loadComandeEventConfig(String protocolId, String sceneName) { +// CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); +// if (ObjectUtil.isEmpty(commandEventConfig)) { +// log.error("协议{},没有配置成功接收回复配置,清排查原因"); +// return null; +// } +// String replyJson = commandEventConfig.getReplyContentJson(); +// List> replyMapList = JSONArray.parseObject(replyJson, List.class); +// List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); +// Map fixMap = fixList.stream() +// .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); +// List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) +// .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) +// .collect(Collectors.toList()); +// Map commandConfigMap = new HashMap<>(); +// commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); +// commandConfigMap.put("fixContent", fixMap); +// commandConfigMap.put("bizContent", contentList); +// return commandConfigMap; + return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 128b09d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java deleted file mode 100644 index 4016b0b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface DatagramEventMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java deleted file mode 100644 index 597c306..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.apache.ibatis.annotations.Mapper; - -public interface FieldConfigMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java deleted file mode 100644 index a31680a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.PreRuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface PreRuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java deleted file mode 100644 index 9060a69..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface ProtocolConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java deleted file mode 100644 index 6fa6936..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java deleted file mode 100644 index 582a705..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleDict; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleDictMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java deleted file mode 100644 index 6e302c8..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.CommandEventMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Optional; - -@Component -public class CommandEventDao { - - @Resource - private CommandEventMapper commandEventMapper; - - public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId) - .eq("scene", sceneName) - .eq("enabled", 1); - List commandEventConfig = commandEventMapper.selectList(queryWrapper); - Optional optionalEventConfig = commandEventConfig.stream().findFirst(); - return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java deleted file mode 100644 index 9137e4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.FieldConfigMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class FieldConfigDao { - - @Resource - private FieldConfigMapper fieldConfigMapper; - - public FieldConfig getFieldConfigById(String fieldId) { - FieldConfig fieldConfig = fieldConfigMapper.selectById(fieldId); - return fieldConfig; - } - - public List getFieldConfigs(String protocolId,Integer isFixed) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",isFixed); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - - public List getStorageFieldConfig(String protocolId) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",1) - .eq("is_storage",1); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java deleted file mode 100644 index 67bff6b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.mapper.PreRuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class PreRuleConfigDao { - - @Resource - private PreRuleConfigMapper preRuleConfigMapper; - - public List getPreRuleList(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return preRuleConfigMapper.selectList(queryWrapper); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java deleted file mode 100644 index d69ea85..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.RuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleConfigDao { - - @Resource - private RuleConfigMapper ruleConfigMapper; - - public RuleConfig getNextRuleConfig(String ruleFields) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("parse_rule_json", ruleFields); - return ruleConfigMapper.selectOne(queryWrapper); - } - - - public List getRuleConfigById(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return ruleConfigMapper.selectList(queryWrapper); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java deleted file mode 100644 index 932c185..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.RuleDictMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleDictDao { - - @Resource - private RuleDictMapper ruleDictMapper; - - public List getRuleDictConfig() { - List ruleDictList = ruleDictMapper.selectList(null); - return ruleDictList; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java index 9f9e279..43bc4d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java @@ -10,20 +10,15 @@ import io.netty.channel.socket.nio.NioServerSocketChannel; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import javax.annotation.PreDestroy; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static cn.hutool.core.util.ClassUtil.getClasses; /** * SensorhubServer netty服务端 */ @Slf4j -@Service +@Component public class SensorhubServer { /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java index 2c79ff5..9a28c36 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java @@ -11,13 +11,13 @@ import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioSocketChannel; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClient 客户端 */ @Slf4j -@Service +@Registry public final class SensorhubClient { public static void main(String[] args) throws Exception { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java index 9774be0..477c3f7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java @@ -6,12 +6,12 @@ import io.netty.channel.socket.SocketChannel; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientChannelInitialHandler */ -@Service +@Registry public class SensorhubClientChannelInitialHandler extends ChannelInitializer { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java index 346f4b3..73560e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java @@ -5,13 +5,13 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientHandler */ @Slf4j -@Service +@Registry public class SensorhubClientHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java index 5c1c6f2..d990af5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java @@ -4,12 +4,12 @@ import com.casic.missiles.pojo.Msg; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** * SensorhubServerHandler */ -@Service +@Component public class SensorhubServerHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 67283ae..af3172c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,41 +1,37 @@ package com.casic.missiles.parser; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultProtocolConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.*; +import com.casic.missiles.registry.FieldConfigRegistry; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; -import java.nio.charset.Charset; import java.util.HashMap; import java.util.List; import java.util.Map; -@Service("genericProtocolParser") +/** + * @author + */ +@Component("genericProtocolParser") @Slf4j -@AllArgsConstructor +@RequiredArgsConstructor public class GenericProtocolParser implements ProtocolParser { - private final LeadingCodeMatcher leadingCodeMatcher; private final List frameStructDispenserList; - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorInstanceSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; // 匹配首字母前导码=> 帧结构匹配前导码=> // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 @@ -44,18 +40,19 @@ public Boolean doParseProtocol(ByteBuf byteBuf) { String protocolContent = ByteBufUtil.hexDump(byteBuf); //匹配前导码 - List preCodeConfigs = leadingCodeMatcher.matchLeadingCode(protocolContent); + List preCodeConfigs = LeadingCodeMatcher.matchFrameLeadingCode(protocolContent); //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 if (preCodeConfigs.size() == 0) { - return rematch(byteBuf,protocolContent); + return rematch(byteBuf, protocolContent); } - //暂时先取第一个 + //暂时先取第一个,提升速度,使用享元模式, 减少类的创建销毁与构建 ProtocolConfig protocolConfig = preCodeConfigs.get(0); + AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); ByteBuf wholeDatagramByte = null; //通过匹配帧结构获取完整的数据包 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, preCodeConfigs.get(0))) != null) { + if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, protocolFactory)) != null) { break; } } @@ -68,76 +65,78 @@ * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 */ - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId, wholeDatagramByte); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap, protocolId); - //选取规则对应的流程实例 - DatagramEventConfig datagramEventConfig = processorInstanceSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); + //进行规则字段解析,进行匹配规则 + RuleConfig ruleConfig = getRuleConfig(protocolFactory, wholeDatagramByte); + if (ruleConfig == null) { + return false; + } //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, wholeDatagramByte); + ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte); + //以下进行业务的规则解析,同时选定流程实例 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); + DatagramEventProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain, + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText, protocolId); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain); //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); + datagramEventProvider.storeData(bizDataMap); return true; } - private Boolean rematch(ByteBuf byteBuf,String protocolContent) { + /** + * 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 + */ + private Boolean rematch(ByteBuf byteBuf, String protocolContent) { //重置位判断 byteBuf.resetReaderIndex(); //判断重置是否前移,如果没有前移,则直接判为匹配失败 if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { return false; } else { + //递归执行 return doParseProtocol(byteBuf); } } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; + //获取匹配规则->匹配规则 + private RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + //取出其中参与逻辑provider并判空 + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); + String rulePrepareFields = protocolConfig.getRulePrepareFields(); + //固定字段 + if (StringUtils.isNotEmpty(rulePrepareFields)) { + //获取统一固定字段解析 + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + //获取该协议的字段配置,用于协议规则匹配 + List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); + //获取规则 + RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, + rulePrepareFields, protocolFieldConfigs); + return ruleConfig; + } + return null; } - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + //数据构建,获取固定字段的store和业务字段store + private Map buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + Map bizDataMap = new HashMap<>(); + Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); + Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); + bizDataMap.putAll(ruleStoreObjectMap); + bizDataMap.putAll(protocolStoreObjectMap); return bizDataMap; } - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java index 8a46e32..16ce2e5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java @@ -3,6 +3,7 @@ import io.netty.buffer.ByteBuf; public interface ProtocolParser { + Boolean doParseProtocol(ByteBuf byteBuf); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java new file mode 100644 index 0000000..f7814af --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java @@ -0,0 +1,35 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.ProtocolConfigProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.ProtocolConfig; + +/** + * 存放基本协议的的加载信息 + */ +public class AbstractProtocolConfigFactory { + private final ProtocolConfigProvider protocolConfigProvider; + private final ProtocolFieldConfigProvider protocolFieldConfigProvider; + private final RuleConfigProvider ruleConfigProvider; + + public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { + this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); + this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); + this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); + } + + public ProtocolConfigProvider getProtocolConfigProvider() { + return protocolConfigProvider; + } + + public ProtocolFieldConfigProvider getProtocolFieldConfigProvider() { + return protocolFieldConfigProvider; + } + + public RuleConfigProvider getRuleConfigProvider() { + return ruleConfigProvider; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java new file mode 100644 index 0000000..6e36147 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java @@ -0,0 +1,57 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.CombinedFieldConfigProvider; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.FieldConfigProvider; +import com.casic.missiles.parser.provider.FieldRuleConfigProvider; + +/** + * 存放规则相关的的的加载信息 + */ +public class AbstractRuleConfigFactory { + + /** + * 处理字节 + */ + private final FieldConfigProvider fieldConfigProvider; + /** + * 处理组合字节解析的解码器 + */ + private final CombinedFieldConfigProvider combinedFieldConfigProvider; + /** + * 处理负责字节解析的规则配置 + */ + private final FieldRuleConfigProvider fieldRuleConfigProvider; + /** + * 处理实例流程 + */ + private final DatagramEventProvider datagramEventProvider; + + + public AbstractRuleConfigFactory(Long ruleId) { + this.fieldConfigProvider = new FieldConfigProvider(ruleId); + this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); + this.fieldRuleConfigProvider = new FieldRuleConfigProvider(ruleId); + this.datagramEventProvider = new DatagramEventProvider(ruleId); + } + + public FieldConfigProvider getFieldConfigProvider() { + return fieldConfigProvider; + } + + public CombinedFieldConfigProvider getCombinedFieldConfigProvider() { + return combinedFieldConfigProvider; + } + + public FieldRuleConfigProvider getFieldRuleConfigProvider() { + return fieldRuleConfigProvider; + } + + public DatagramEventProvider getDatagramEventProvider() { + return datagramEventProvider; + } + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java deleted file mode 100644 index 6e1719a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.factory; - - -import com.casic.missiles.pojo.ProtocolConfig; - -import java.util.List; - -/** - * 数据库访问优化(暂时未做) - *

- * 1、初始化协议解析配置,并存放到处存放缓存,对协议基本配置进行管理 - * 2、其中流程中所有的配置都经过此类进行管理,进行调用获取,增强解析速度 - */ -public interface DatagramFactory { - - /** - * 初始化 - */ - List datagramInit(); - - /** - * 根据前导码配置匹配,模糊匹配获取所有的报文项 - */ - List match(); - - /** - * 根据前导码匹配,返回报文项 - */ - List filer(); - - /** - * 保证数据的唯一性选择器 - */ - List selectOne(); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java new file mode 100644 index 0000000..87444a0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java @@ -0,0 +1,18 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +import java.util.List; + +/** + * 直接用,还是边用边创建 + */ +public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { + + + public DefaultProtocolConfigFactory(ProtocolConfig protocolConfig) { + super(protocolConfig); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java new file mode 100644 index 0000000..cce0c7c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java @@ -0,0 +1,12 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; + +public class DefaultRuleFactory extends AbstractRuleConfigFactory { + + public DefaultRuleFactory(Long ruleId) { + super(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java deleted file mode 100644 index 9ee97e0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.casic.missiles.parser.instance; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service -@Slf4j -@AllArgsConstructor -public class GeneralProcessor { - - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; - - /** - * 统一固定字段解析=>进行规则的查询的判断 - * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 - * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 - */ - @Deprecated - public boolean parseWholeDatagram(ByteBuf buffer, ProtocolConfig protocolConfig) { - try { - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap,protocolId); - //选取规则对应的流程= - DatagramEventConfig datagramEventConfig = processorSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); - //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); - //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); - //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); - //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); - //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); - return true; - } catch (Exception ex) { - log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", - ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); - return false; - } - } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; - } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); - } - - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); - return bizDataMap; - } - - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java index 25e7ad8..6a5777e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java @@ -1,23 +1,31 @@ package com.casic.missiles.parser.instance.impl; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.mapper.DatagramEventMapper; import com.casic.missiles.pojo.DatagramEventConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.SpringContextUtil; -@Service -@AllArgsConstructor +import java.util.List; +import java.util.Optional; + +/** + * @author cz + * + */ public class DefaultProcessorInstanceSelector implements ProcessorInstanceSelector { - private final DatagramEventMapper datagramEventMapper; + private static List datagramEventConfigs; + + static { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + datagramEventConfigs = datagramEventRegistry.getDatagramEventList(); + } @Override public DatagramEventConfig getProcessorInstance(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("rule_id", protocolId); - return datagramEventMapper.selectOne(queryWrapper); + Optional optionalSelectInstance = datagramEventConfigs.stream() + .filter(e -> e.getId().equals(protocolId)).limit(1).findFirst(); + return optionalSelectInstance.isPresent() ? optionalSelectInstance.get() : null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a778671..7b56a43 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,16 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import io.netty.buffer.ByteBuf; /** - * 分析匹配情况 - * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 - * 2、匹配不成功,有后续帧,可以进行下次匹配。 - * 3、匹配不成功,无后续帧,可以进行丢弃。 + * 分析匹配情况 + * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 + * 2、匹配不成功,有后续帧,可以进行下次匹配。 + * 3、匹配不成功,无后续帧,可以进行丢弃。 */ -public interface FrameStructMatcher{ +public interface FrameStructMatcher { - ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig); + ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 05320ab..8ebea78 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,23 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.ProtocolConfigMapper; +import com.casic.missiles.parser.provider.ProtocolConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Component; import java.util.List; import java.util.stream.Collectors; -@Component -@AllArgsConstructor public class LeadingCodeMatcher { - private final ProtocolConfigMapper protocolMapper; - //** 1、首字母匹配前导码, // 2、以匹配出的前导码是否在报文中条件进行前导码的匹配二次筛选 - public List matchLeadingCode(String protocolContent){ + public static List matchFrameLeadingCode(String protocolContent){ List initialConfigs = initialMatch(protocolContent); List preCodeConfigs = initialConfigs.stream() .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) @@ -26,13 +19,16 @@ } //初始化匹配前导码内容 - private List initialMatch(String protocolContent) { - String protocolStr = protocolContent.charAt(0) + ""; - QueryWrapper queryWrapper = new QueryWrapper() - .likeRight("pre_fix", protocolStr); - List protocolConfigList = protocolMapper.selectList(queryWrapper); - return protocolConfigList; + private static List initialMatch(String protocolContent) { + String firstFrameChar = protocolContent.charAt(0) + ""; + ProtocolConfigProvider protocolConfigProvider=new ProtocolConfigProvider(firstFrameChar); + return protocolConfigProvider.getMatchList(); } + + + + + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index cf2113d..e915877 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -1,32 +1,35 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(0) -@Service +@Component public class FrameLengthMatcher implements FrameStructMatcher { - @Autowired - private FieldParser fieldParser; - //超过长度 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { String dataGramContent = ByteBufUtil.hexDump(byteBuf); - if (StringUtils.isEmpty(protocolConfig.getUnpackId()) && StringUtils.isEmpty(protocolConfig.getTailStr())) { - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + //当不存在结尾标志和拆包标志,可以直接使用长度进行匹配 + if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { if (dataGramContent.length() >= totalLength) {//等于长度返回true,超出长度,切断 - ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, protocolConfig, totalLength); + ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, totalLength); return wholeDatagramByte; } else { //读的标志位前移舍弃 @@ -38,7 +41,7 @@ return null; } - private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, Integer totalLength) { byteBuf.readBytes(totalLength); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, totalLength - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 2bfc213..d527ad0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; @@ -13,7 +13,7 @@ import lombok.AllArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.nio.charset.Charset; import java.util.Map; @@ -22,32 +22,30 @@ * 后续标志验证 */ @Order(1) -@Service +@Component @AllArgsConstructor -public class FrameMarkMatcher implements FrameStructMatcher { - - private final FieldConfigDao fieldConfigDao; - private final FieldParser fieldParser; - private final FieldResolver fieldResolverManger; +public class FrameMarkMatcher implements FrameStructMatcher, FixedPropertyEnum { //帧后续标志=>结束,进行帧的重组=>有后续,1、帧移位判别 2、继续接收帧 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig UnpackConfig = StringUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getUnpackId()); - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); - Integer upback = 0; + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); ByteBuf mergeWholeFrameByte = null; - if (!ObjectUtil.isEmpty(UnpackConfig)) { - while (hasNextFullFrame(byteBuf, protocolConfig)) { - upback = (Integer) fieldResolverManger.filedParserManger(byteBuf, UnpackConfig, null); + if (!ObjectUtil.isEmpty(unpackFlag)) { + while (hasNextFullFrame(byteBuf, protocolConfig, protocolFieldConfigProvider)) { //是否存在后续位 - if (upback == 1) {//使用esayRule + if (unpackFlag == 1) {//使用esayRule //表示可以截取 - mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolConfig, totalLength); + mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolFieldConfigProvider, protocolConfig); return mergeWholeFrameByte; } else { - byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig)); + byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig, protocolFieldConfigProvider)); } } } @@ -56,7 +54,8 @@ //选取第一个帧,将业务内容和后面部分分开 //计算数据报文-业务内容 - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolFieldConfigProvider protocolFieldConfigProvider, ProtocolConfig protocolConfig) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); //截取完整报文 byteBuf.readBytes(totalLength); ByteBuf byteBufContent = byteBuf.slice(0, byteBuf.readerIndex()); @@ -68,15 +67,15 @@ String tail = ""; System.out.println(ByteBufUtil.hexDump(byteBufContent)); //会存在多个帧拼接在一起的的情况,进行合并处理 - while (hasNextFullFrame(byteBufContent, protocolConfig)) { - Integer currentFrameLength = fieldParser.getTotalLength(protocolConfig, byteBufContent); + while (hasNextFullFrame(byteBufContent, protocolConfig, protocolFieldConfigProvider)) { + Integer currentFrameLength = protocolFieldConfigProvider.getTotalLength(byteBufContent, protocolConfig); byteBufContent.readBytes(currentFrameLength); ByteBuf currentbyteBuf = byteBufContent.slice(0, byteBufContent.readerIndex()); byteBufContent.markReaderIndex();//读的标志位前移 System.out.println(ByteBufUtil.hexDump(byteBufContent)); String hexDump = currentbyteBuf.toString(Charset.forName("ISO-8859-1")); //获取当前固定帧结构的关系map - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, currentbyteBuf); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(currentbyteBuf, protocolConfig); if (StringUtils.isEmpty(mergeFrameStr)) { //首次获取业务数据报文 mergeFrameStr += hexDump.substring(0, currentFrameFixedProperty.get("tailPosition")); @@ -95,22 +94,22 @@ /** * 获取平移到下一帧起始位置 */ - public int getNextFrameOffset(ByteBuf buffer, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, buffer); - return currentFrameFixedProperty.get("totalLength"); + public int getNextFrameOffset(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + return currentFrameFixedProperty.get(TOTAL_LENGTH); } /** * 判断是否出错进行整个帧的 */ - public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, byteBuf); + public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); //保证读取位置不在固定位置,是可变的业务内容 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("fixedPosition")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(FIXED_POSITION)) { return false; } //判断读取是否操作帧长度 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("totalLength")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(TOTAL_LENGTH)) { return false; } return true; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 76a3784..c3a1bab 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -1,50 +1,50 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.parser.instance.GeneralProcessor; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; +import io.netty.buffer.ByteBufUtil;; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(2) -@Service +@Component public class FrameTailMatcher implements FrameStructMatcher { - @Resource - private FieldConfigDao fieldConfigDao; - @Autowired - private GeneralProcessor generalProcessor; - //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig tailFieldConfig = StringUtils.isEmpty(protocolConfig.getTailStr()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getTailStr()); - if (!ObjectUtil.isEmpty(tailFieldConfig)) { - String tailStr = tailFieldConfig.getFieldName(); + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfig protocolFieldConfig = ObjectUtils.isEmpty(protocolConfig.getTailStr()) ? null : + fieldConfigProvider.getFieldConfigById(protocolConfig.getTailStr()); + if (!ObjectUtil.isEmpty(protocolFieldConfig)) { + String tailStr = protocolFieldConfig.getFieldName(); String dataGramContent = ByteBufUtil.hexDump(byteBuf); Boolean tailFlag = ByteBufUtil.hexDump(byteBuf).contains(tailStr); if (!tailFlag) { //使用esayRule return null; } else if (dataGramContent.indexOf(tailStr) < dataGramContent.length() - tailStr.length()) { Integer length = dataGramContent.indexOf(tailStr) + tailStr.length(); - ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, protocolConfig, length); + ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, length); return wholeDatagramByte; //存在粘包 } } return null; } - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer length) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, Integer length) { byteBuf.readBytes(length); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, length - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java new file mode 100644 index 0000000..5f1c177 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java @@ -0,0 +1,73 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.combined.GenericCombinedFieldResolver; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.CombinedFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class CombinedFieldConfigProvider { + + + /** + * 作为临时配置列表缓存使用 + */ + private final List combinedFieldConfigList; + private Map storeObjectMap = new HashMap<>(); + + public CombinedFieldConfigProvider(Long ruleId) { + CombinedFieldConfigRegistry combinedFieldConfigRegistry = SpringContextUtil.getBean(CombinedFieldConfigRegistry.class); + combinedFieldConfigList = combinedFieldConfigRegistry.getCombinedFieldConfigList(ruleId); + } + + public void parseDataField(RuleConfig ruleConfig, String clearZeroPlain,Map fieldConfigsMap ) { + if (showSkip()) { + return; + } + //匹配对应的数据,然后进行相关的字段解析 + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver(); + combinedFieldResolver.parseDataField(combinedFieldConfigList, byteBuf, storeObjectMap,fieldConfigsMap); + } + + + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getCombinedFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return combinedFieldConfigList.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public List getCombinedFieldConfigList() { + return combinedFieldConfigList; + } + + /* 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(combinedFieldConfigList) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java new file mode 100644 index 0000000..f3cfedc --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java @@ -0,0 +1,11 @@ +package com.casic.missiles.parser.provider; + +/** + * @author cz + * @date 2023-6-12 + */ +public class CommandEventProvider{ + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java new file mode 100644 index 0000000..70eec5e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java @@ -0,0 +1,77 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.safe.SafeStrategy; +import com.casic.missiles.parser.sender.DataSubscribeProvider; +import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class DatagramEventProvider { + + private final DatagramEventConfig processorInstance; + + public DatagramEventProvider(Long ruleId) { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + List datagramEventConfigList = + datagramEventRegistry.getDatagramEventList(ruleId); + processorInstance = this.getProcessorInstance(datagramEventConfigList); + } + + public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { + if (showSkip()) { + return null; + } + return datagramEventConfigList.get(0); + } + + // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 + public String getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap) { + String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? + processorInstance.getSafeBean() : + fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); + if (!StringUtils.isEmpty(safeName)) { + //需要加密 + SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); + String plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); + return clearComplementZero(plain); + } + return ByteBufUtil.hexDump(bizDataContent); + } + + //解密清零操作 + private String clearComplementZero(String plain) { + plain = plain.substring(0, plain.lastIndexOf("00")); + return plain; + } + + //数据发送,数据发送者暂未构建 + public void storeData(Map bizDataMap) { + DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); +// dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return ObjectUtils.isNotEmpty(processorInstance) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java new file mode 100644 index 0000000..7e1fe0a --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java @@ -0,0 +1,97 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.FieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class FieldConfigProvider { + + + private final List fieldConfigs; + private Map storeObjectMap = new HashMap<>(); +// private Map singleObjects = new ConcurrentHashMap<>(); + + public FieldConfigProvider(Long ruleId) { + FieldConfigRegistry fieldConfigRegistry = SpringContextUtil.getBean(FieldConfigRegistry.class); + fieldConfigs = fieldConfigRegistry.getFieldConfigList(ruleId); + } + + public List getFieldConfigs() { + return fieldConfigs; + } + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public Map parseDataField(RuleConfig ruleConfig, String clearZeroPlain) { + if (showSkip()) { + return null; + } + List prepareFieldConfig = prepareParseField(ruleConfig); + if (CollectionUtils.isNotEmpty(prepareFieldConfig)) { + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(fieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + return fixDataMap; + } + } + return null; + } + + /** + * 得到需要处理的业务内容 + * + * @return + */ + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return fieldConfigs.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public Map getFieldConfigsMap() { + return fieldConfigs.stream().collect( + Collectors.toMap(FieldConfig::getId, e -> e) + ); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(fieldConfigs) ? false : true; + } + + +} + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java new file mode 100644 index 0000000..817bfaf --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java @@ -0,0 +1,19 @@ +package com.casic.missiles.parser.provider; + +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.registry.FieldRuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; + +public class FieldRuleConfigProvider { + + private final List fieldRuleConfigList; + + public FieldRuleConfigProvider(Long ruleId) { + FieldRuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(FieldRuleConfigRegistry.class); + fieldRuleConfigList = ruleConfigRegistry.getFieldRuleConfigList(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java new file mode 100644 index 0000000..99a1b06 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java @@ -0,0 +1,53 @@ +package com.casic.missiles.parser.provider; + + +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.registry.ProtocolConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolConfigProvider { + + private final List protocolConfigList; + + public ProtocolConfigProvider(String firstChar) { + ProtocolConfigRegistry registry = SpringContextUtil.getBean(ProtocolConfigRegistry.class); + protocolConfigList = registry.getProtocolConfigList(firstChar); + } + + public List getMatchList() { + return protocolConfigList; + } + + /** + * 设置当前协议 + * + * @param protocolConfig + */ + public ProtocolConfigProvider(ProtocolConfig protocolConfig) { + List protocolConfigs = new ArrayList<>(); + protocolConfigs.add(protocolConfig); + protocolConfigList = protocolConfigs; + } + + /** + * 获取当前协议 + * + * @return + */ + public ProtocolConfig getCurrentProtocolConfig() { + if (this.protocolConfigList == null) { + return null; + } else { + return protocolConfigList.get(0); + } + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java new file mode 100644 index 0000000..043927d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java @@ -0,0 +1,213 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.registry.ProtocolFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolFieldConfigProvider { + + private static final String FIXED_FIELD_DS = "fixedFieldDs"; + private static final String CONTENT_FIELD_DS = "contentFieldDs"; + private static final String PROTOCOL_LENGTH = "protocolLength"; + private static final String PROTOCOL_FIELD_ID = "protocolFieldId"; + private static final String PROTOCOL_POSITION = "protocolPosition"; + + private final List protocolFieldConfigs; + private Map singleObjects = new ConcurrentHashMap<>(); + private Map storeObjectMap = new HashMap<>(); + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public ProtocolFieldConfigProvider(Long protocolId) { + ProtocolFieldConfigRegistry protocolFieldConfigRegistry = SpringContextUtil.getBean(ProtocolFieldConfigRegistry.class); + protocolFieldConfigs = protocolFieldConfigRegistry.getProtocolFieldConfigList(protocolId); + } + + public List getProtocolFieldConfigs() { + return protocolFieldConfigs; + } + + public ProtocolFieldConfig getFieldConfigById(Long fieldId) { + Optional optionalConfig = protocolFieldConfigs.stream().filter( + e -> e.getId().equals(fieldId) + ).findFirst(); + return optionalConfig.isPresent() ? optionalConfig.get() : null; + } + + public Integer getProtocolFieldValue(Long protocolFieldId, ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_FIELD_ID + protocolFieldId + ByteBufUtil.hexDump(byteBuf); + //获取缓存 + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + //加载固定长度数据集合 + Map fixDataMap = this.getProtocolDataMap(byteBuf); + ProtocolFieldConfig protocolFieldConfig = selectFieldConfig(protocolFieldId); + Integer protocolFieldValue = 0; + //获取约定字段的总长度 + if (fixDataMap.containsKey(protocolFieldConfig.getFieldName())) { + Object appointUnpackObject = fixDataMap.get(protocolFieldConfig.getFieldName()); + if (ObjectUtils.isNotEmpty(appointUnpackObject)) { + protocolFieldValue = (Integer) appointUnpackObject; + } + } + if (protocolFieldValue != null) { + //加入缓存 + if (ObjectUtils.isNotEmpty(protocolFieldValue)) { + this.singleObjects.put(catchKey, protocolFieldValue); + return protocolFieldValue; + } + } + return null; + } + + /** + * 获取帧固定位置信息 + * + * @param byteBuf + * @param protocolConfig + * @return + */ + public Map getFixedProperty(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_POSITION + protocolConfig.getId(); + if (this.singleObjects.containsKey(catchKey)) { + return (Map) singleObjects.get(catchKey); + } + Map fixedPropertyMap = new HashMap<>(); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + fixedPropertyMap = fieldParser.doGetFixedProperty(protocolFieldConfigs, this.getTotalLength(byteBuf,protocolConfig)); + if (CollectionUtils.isNotEmpty(fixedPropertyMap)) { + this.singleObjects.put(catchKey, fixedPropertyMap); + return fixedPropertyMap; + } + return fixedPropertyMap; + } + + /** + * 获取帧结构应有的总长度 + */ + public Integer getTotalLength(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_LENGTH + ByteBufUtil.hexDump(byteBuf); + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + Integer appointFrameLength = getProtocolFieldValue(protocolConfig.getTotalLengthId(), byteBuf); + if (appointFrameLength != null) { + //获取过滤的字段集合总长度 + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Integer totalFilterLength = fieldParser.getTotalFilterLength(protocolConfig, byteBuf, getFixFieldConfigMap()); + //计算总长度 + Integer totalLength = appointFrameLength + totalFilterLength; + //加入缓存 + if (ObjectUtils.isNotEmpty(totalLength)) { + this.singleObjects.put(catchKey, totalLength); + return totalLength; + } + } + return null; + } + + /** + * 获取协议有关字段解析内容 + * storeObjectMap存储代转存的数据 + * + * @return + */ + public Map getProtocolDataMap(ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(FIXED_FIELD_DS)) { + return (Map) singleObjects.get(FIXED_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(protocolFieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + this.singleObjects.put(FIXED_FIELD_DS, fixDataMap); + return fixDataMap; + } + return null; + } + + /** + * 获取业务报文内容的content字节 + * + * @param wholeDatagramByte + * @return + */ + public ByteBuf getDataContentBuf(ByteBuf wholeDatagramByte) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(CONTENT_FIELD_DS)) { + return (ByteBuf) singleObjects.get(CONTENT_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + ByteBuf bizDataByteBuf = fieldParser.getDataContentBuf(protocolFieldConfigs, wholeDatagramByte); + if (bizDataByteBuf != null) { + this.singleObjects.put(CONTENT_FIELD_DS, bizDataByteBuf); + return bizDataByteBuf; + } + return null; + } + + + private ProtocolFieldConfig selectFieldConfig(Long id) { + Optional optionalProtocolFieldConfig = this.protocolFieldConfigs.stream().filter( + e -> e.getId().equals(id) + ).findFirst(); + return optionalProtocolFieldConfig.isPresent() ? optionalProtocolFieldConfig.get() : null; + } + + + private Map getFixFieldConfigMap() { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, e -> e) + ); + return fixDataFieldMap; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(protocolFieldConfigs) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java new file mode 100644 index 0000000..dafba1c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java @@ -0,0 +1,56 @@ +package com.casic.missiles.parser.provider; + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.rule.GenericRuleResolver; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.RuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleConfigProvider { + + private final List ruleConfigs; + + public List getRuleConfigs() { + return ruleConfigs; + } + + public RuleConfigProvider(Long protocolId) { + RuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(RuleConfigRegistry.class); + ruleConfigs = ruleConfigRegistry.getRuleConfigById(protocolId); + } + + /** + * 获取规则匹配结果 + * + * @param parseFixedDataMap + * @param protocolFieldConfigs + * @return + */ + public RuleConfig doGetRule(Map parseFixedDataMap, + String ids, + List protocolFieldConfigs) { + if (showSkip()) { + return null; + } + RuleConfig ruleConfig = GenericRuleResolver.machRule(parseFixedDataMap, ids, protocolFieldConfigs, ruleConfigs); + return ruleConfig; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(ruleConfigs) ? false : true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java index 3c05891..856b399 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java @@ -1,18 +1,11 @@ package com.casic.missiles.parser.resolver; -import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.springframework.web.bind.annotation.RequestBody; -import javax.annotation.Resource; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -20,19 +13,17 @@ @Slf4j public class ByteMergeProvider { - @Resource - private FieldRuleEngineMapper fieldRuleEngineMapper; - //拿到所有的值合并到一个值 - public String resolveByteMerge(List valueList, String ruletypeId, String vaildRange) { + public static String resolveByteMerge(List valueList, String ruleTypeId, String vaildRange) { String values = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Map vaildMap = getValidRangeMap(vaildRange); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(ruletypeId); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } + //暂时不处理 +// fieldRuleEngine = fieldRuleConfigMapper.selectById(ruleTypeId); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } Map env2 = new HashMap(); for (int i = 0; i < valueList.size(); i++) { if (vaildMap.containsKey(i)) { @@ -47,7 +38,7 @@ } } - private Map getValidRangeMap(String vaildRange) { + private static Map getValidRangeMap(String vaildRange) { String[] range = vaildRange.split(","); Map vaildMap = new HashMap(); for (int i = 0; i < range.length; i++) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 8d821cd..85d6bbf 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -1,9 +1,12 @@ package com.casic.missiles.parser.resolver; +import com.casic.missiles.pojo.AbstractFieldConfig; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; import io.netty.buffer.ByteBuf; +import java.util.List; import java.util.Map; /** @@ -11,18 +14,14 @@ */ public interface FieldParser { -// Map fieldProcess(String protocolContent,); - Map dataParser(RuleConfig ruleConfig, String lightText,String protocolId); + Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength); - Map fixDataParser(String protocolId, ByteBuf buffer); + Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap); - Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf); + ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer); - ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer); - - ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer); - - Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer); + Integer getTotalFilterLength(ProtocolConfig protocolConfig, ByteBuf byteBuf, Map protocolFieldConfigMap); } + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java new file mode 100644 index 0000000..9e0c00e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java @@ -0,0 +1,52 @@ +package com.casic.missiles.parser.resolver; + +import com.casic.missiles.pojo.AbstractFieldConfig; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.util.List; + +public class FieldParserSupport { + + //分别计算bit和byte长度=> 合并长度 + protected Integer calculateLength(List fieldConfigList) { + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + Integer fixedLength = bytefixedLength + bitfixedLength / 8; + return fixedLength; + } + + //找到最大值=> 根据最大值计算业务数据下标 + protected Integer calculatePosition(List fieldConfigList) { + String rex = "[0-9]+"; + Integer max = -1; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) + && Integer.valueOf(fieldConfig.getOriginPositionByte()) > max) { + max = Integer.valueOf(fieldConfig.getOriginPositionByte()); + } + } + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) && fieldConfig.getOriginPositionByte().equals(max)) { + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + } + } + Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; + return maxFixedPosition; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java deleted file mode 100644 index dd3a6cd..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java +++ /dev/null @@ -1,170 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.ByteResolverParam; -import io.netty.buffer.ByteBuf; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -/** - * 字段解析管理总类 - */ -@Service -@Slf4j -@AllArgsConstructor -public class FieldResolver extends ByteMergeProvider { - - //1、字段截取 => 2、简单的字节解析和复杂的字节解析 - public Object filedParserManger(ByteBuf byteBuf, FieldConfig fieldConfig, Integer maxFixedPosition) { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - //最大固定位置不为空, - if (!ObjectUtil.isEmpty(maxFixedPosition)) { - orignPosition -= maxFixedPosition; - } - Object fieldValue = 0; - //待优化 - if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { - fieldValue = bitToResolver(byteBuf, fieldConfig); - } else { - ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); - fieldValue = parsingFields(fieldBytes, fieldConfig.getRuleJson()); - } - return fieldValue; - } - - //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, - //目前默认配置的规则设置暂不支持配置化,由实现完成 - private Object parsingFields(ByteBuf byteBuf, String ruleJson) { - Object fieldsResolveValue = null; - List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); - if (ObjectUtil.isEmpty(ruleMapList)) { - fieldsResolveValue = defaultResolveBuilder(byteBuf); - } else { - fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); - } - return fieldsResolveValue; - } - - private Object defaultResolveBuilder(ByteBuf byteBuf) { - Integer defaultResolveValue = 0; - for (int i = 0; i < byteBuf.writerIndex(); i++) { - defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; - } - return defaultResolveValue; - } - - //字段解析构建器(针对字节单位的) - //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 - // 字节归并结束或者规则结束=>继续根据规则进行判断 - private Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { - Object customizeResolveValue = null; - try { - List bytStrList = new ArrayList<>(); - //存放到数组里面 - for (int i = 0; i < byteBuf.writerIndex(); i++) { - bytStrList.add(byteBuf.readByte()); - } - int i = 0; - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - customizeResolveValue = this.resolveByteMerge(bytStrList, ruletypeId,vaildRange); - break; - } else { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - List tempBytStr = new ArrayList<>(); - for (int k = 0; i < bytStrList.size(); i++) { - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(k) - .value(bytStrList.get(k)) - .ruletypeId(ruletypeId).build(); - tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); - } - bytStrList = tempBytStr; - } - i++; - } - //字节归并到一起=>继续根据规则进行判断 - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(customizeResolveValue) - .ruletypeId(ruletypeId).build(); - customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(customizeResolveValue)); - return customizeResolveValue; - } catch (RuntimeException ex) { - log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); - return null; - } - } - - /** - * 1、单个字节情况表示字段 - * 2、多字节情况表示字段(暂未处理) - */ - private Object bitToResolver(ByteBuf byteBuf, FieldConfig fieldConfig) { - Object fieldValue = new Object(); - try { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - byte fields = 0x00; - if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); - } else { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); - } - - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { - if (!StringUtils.isEmpty(fieldConfig.getExactOrignPosition())) { - fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getExactOrignPosition())).byteValue() - >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); - } else { - fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); - } - } else { - fieldValue = Integer.valueOf(fields & 0xff); - } - if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { - return fieldValue; - } - List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); - int i = 0; - //字节归并到一起=>继续根据规则进行判断 - while (i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(fieldValue) - .ruletypeId(ruletypeId).build(); - fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(fieldValue)); - return fieldValue; - } catch (RuntimeException ex) { - log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); - return null; - } - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java new file mode 100644 index 0000000..1d2aeab --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java @@ -0,0 +1,36 @@ +package com.casic.missiles.parser.resolver.bytes; + +import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.mapper.FieldRuleConfigMapper; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.pojo.ByteResolverParam; +import com.googlecode.aviator.AviatorEvaluator; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; +//转换规则 +@Component("convert") +@AllArgsConstructor +@Slf4j +public class ByteRuleResolver implements ByteResolver { + + private final FieldRuleConfigMapper fieldRuleConfigMapper; + + @Override + public Object resolveOperationRule(ByteResolverParam byteResolverParam){ + FieldRuleConfig fieldRuleEngine=fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); + if(ObjectUtil.isEmpty(fieldRuleEngine)){ + return byteResolverParam.getValue(); + } + String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); + Map env2 = new HashMap(); + env2.put("value", (byte) byteResolverParam.getValue()); + String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); + return values; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java index 103821c..786b71c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java @@ -2,34 +2,34 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("logicalShift") +@Component("logicalShift") @AllArgsConstructor @Slf4j public class LogicalShiftResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //字节位移 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { Integer index = byteResolverParam.getIndex(); - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return byteResolverParam.getValue(); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java index 476747d..01149bd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("operation") +@Component("operation") @AllArgsConstructor @Slf4j public class OperationResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //混合运算,有常量或者乘除的缩放 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java index 0b82cf4..79abcce 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.casic.missiles.pojo.ByteResolverParam; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; //精度计算 -@Service("precision") +@Component("precision") @AllArgsConstructor @Slf4j public class PrecisionResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java deleted file mode 100644 index 5c3f332..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; -//转换规则 -@Service("convert") -@AllArgsConstructor -@Slf4j -public class RuleResolver implements ByteResolver { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam){ - RuleEvaluator fieldRuleEngine=fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); - if(ObjectUtil.isEmpty(fieldRuleEngine)){ - return byteResolverParam.getValue(); - } - String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); - Map env2 = new HashMap(); - env2.put("value", (byte) byteResolverParam.getValue()); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java new file mode 100644 index 0000000..d3bbd91 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java @@ -0,0 +1,15 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; + +import java.util.List; +import java.util.Map; +// 前导码匹配->长度字段 +public interface AbstractCombinedFieldProcessor { + + Map invoke(Map map, ByteBuf byteBuf, List combinedFieldConfigList, + Map fieldConfigsMap, Map storeObjectMap); + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java new file mode 100644 index 0000000..03c8480 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java @@ -0,0 +1,59 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-13 + */ +//依次递增进行数据的解析, +public class GenericCombinedFieldResolver { + + + //通过查询,字段长度长度随机 + public void parseDataField(List combinedFieldConfigList, ByteBuf byteBuf, + Map storeObjectMap, Map fieldConfigsMap) { + Integer frameLength = Integer.valueOf(ByteBufUtil.hexDump(byteBuf)); + //添加前置处理器 + com.casic.missiles.util.ClassUtil classUtil = new com.casic.missiles.util.ClassUtil(); + List abstractCombinedProcessors = classUtil.getSubClassList(AbstractCombinedFieldProcessor.class); + + Map fieldFixedMap = combinedFieldLeadCodeMap(combinedFieldConfigList); + //frameLength + Map combinedProcessorFields = null; + while (byteBuf.readableBytes() < frameLength) { + //一直处理 + for (AbstractCombinedFieldProcessor abstractCombinedProcessor : abstractCombinedProcessors) { + combinedProcessorFields = abstractCombinedProcessor.invoke(combinedProcessorFields, byteBuf, + combinedFieldConfigList, + fieldConfigsMap, storeObjectMap); + if (combinedProcessorFields == null || byteBuf.readableBytes() < frameLength) { + return; + } + } + + } + } + + /** + * 取出前导码匹配集合 + */ + private Map combinedFieldLeadCodeMap(List combinedFieldConfigList) { + Map fieldFixedMap = combinedFieldConfigList + .stream() + .collect(Collectors.toMap(CombinedFieldConfig::getPrefixCode, e -> e)); + return fieldFixedMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java new file mode 100644 index 0000000..643a934 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java @@ -0,0 +1,100 @@ +package com.casic.missiles.parser.resolver.fields; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.FieldParserSupport; +import com.casic.missiles.pojo.*; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 保存使用时最基本的信息,并且使用原型模式 + */ +@Slf4j +public class DefaultProtocolFieldParser extends FieldParserSupport implements FieldParser, FixedPropertyEnum { + + //通过传入的配置和报文进行字段解析 + @Override + public Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap) { + Map dataMap = new HashMap<>(); + for (AbstractFieldConfig protocolFieldConfig : protocolFieldConfigs) { + if (!ObjectUtils.isEmpty(protocolFieldConfig.getOriginPositionByte())) { + Object fieldValue = FieldResolver.parseField(buffer, protocolFieldConfig, null); + if (protocolFieldConfig.getIsStorage() == 1) { + storeObjectMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + dataMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + } + return dataMap; + } + + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength) { + Map fixedPropertyMap = new HashMap<>(); + Integer fixedLength = calculateLength(protocolFieldConfigs); + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + fixedPropertyMap.put(FIXED_POSITION, maxFixedPosition); + fixedPropertyMap.put(TOTAL_LENGTH, totalLength); + fixedPropertyMap.put(TAIL_POSITION, totalLength - fixedLength + maxFixedPosition); + return fixedPropertyMap; + } + + //** 获取业务内容的byteBuf + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer) { + //计算固定长度 + Integer fixedLength = calculateLength(protocolFieldConfigs); + //总长度获取 + String lightText = buffer.toString(Charset.forName("ISO-8859-1")); + Integer totalLength = lightText.length(); + //计算固定长度最大长度 + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + //计算数据报文内容 + ByteBuf bizDataFields = buffer.slice(maxFixedPosition - 1, (totalLength - fixedLength)); + return bizDataFields; + } + + /** + * 获取过滤字段的长度 + */ + @Override + public Integer getTotalFilterLength(ProtocolConfig protocolConfig, + ByteBuf byteBuf, + Map protocolFieldConfigMap) { + if (ByteBufUtil.hexDump(byteBuf).equals("")) { + return 0; + } + int totalFilterLength = 0; + String filterFields = protocolConfig.getTotalLengthFilterFields(); + try { + if (!StringUtils.isEmpty(filterFields)) { + String[] filterFieldList = filterFields.split(","); + for (String filterFieldId : filterFieldList) { + if (StringUtils.isNotEmpty(filterFieldId)) { + ProtocolFieldConfig fieldConfig = protocolFieldConfigMap.get(Long.valueOf(filterFieldId)); + //这里都是按字节计算,没有对位进行区分,可能会出现错误 + // 如果对位有需求,需要进一步跟进 + totalFilterLength += fieldConfig.getOffsetLength(); + } + } + } + return totalFilterLength; + } catch (Exception ex) { + log.error("报文确认分发阶段,获取报文总长度过滤长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); + } + return totalFilterLength; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java new file mode 100644 index 0000000..d51e887 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java @@ -0,0 +1,169 @@ +package com.casic.missiles.parser.resolver.fields; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.parser.resolver.ByteMergeProvider; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.AbstractFieldConfig; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.pojo.ByteResolverParam; +import io.netty.buffer.ByteBuf; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * 字段解析管理总类 + */ +@Slf4j +public class FieldResolver extends ByteMergeProvider { + + //1、字段截取 => 2、简单的字节解析和复杂的字节解析 + public static Object parseField(ByteBuf byteBuf,AbstractFieldConfig fieldConfig, Integer maxFixedPosition) { + Integer orignPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + //最大固定位置不为空, + if (!ObjectUtil.isEmpty(maxFixedPosition)) { + orignPosition -= maxFixedPosition; + } + Object fieldValue = 0; + //待优化 + if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { + fieldValue = doParseBitField(byteBuf, fieldConfig); + } else { + ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); + fieldValue = doParseByteField(fieldBytes, fieldConfig.getRuleJson()); + } + return fieldValue; + } + + //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, + //目前默认配置的规则设置暂不支持配置化,由实现完成 + private static Object doParseByteField(ByteBuf byteBuf, String ruleJson) { + Object fieldsResolveValue = null; + List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); + if (ObjectUtil.isEmpty(ruleMapList)) { + fieldsResolveValue = defaultResolveBuilder(byteBuf); + } else { + fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); + } + return fieldsResolveValue; + } + + private static Object defaultResolveBuilder(ByteBuf byteBuf) { + Integer defaultResolveValue = 0; + for (int i = 0; i < byteBuf.writerIndex(); i++) { + defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; + } + return defaultResolveValue; + } + + //字段解析构建器(针对字节单位的) + //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 + // 字节归并结束或者规则结束=>继续根据规则进行判断 + private static Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { + Object customizeResolveValue = null; + try { + List bytStrList = new ArrayList<>(); + //存放到数组里面 + for (int i = 0; i < byteBuf.writerIndex(); i++) { + bytStrList.add(byteBuf.readByte()); + } + int i = 0; + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { + if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + customizeResolveValue = resolveByteMerge(bytStrList, ruletypeId, vaildRange); + break; + } else { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + List tempBytStr = new ArrayList<>(); + for (int k = 0; i < bytStrList.size(); i++) { + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(k) + .value(bytStrList.get(k)) + .ruletypeId(ruletypeId).build(); + tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); + } + bytStrList = tempBytStr; + } + i++; + } + //字节归并到一起=>继续根据规则进行判断 + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(null) + .value(customizeResolveValue) + .ruletypeId(ruletypeId).build(); + customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); + i++; + } + System.out.println(JSON.toJSON(customizeResolveValue)); + return customizeResolveValue; + } catch (RuntimeException ex) { + log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); + return null; + } + } + + /** + * 1、单个字节情况表示字段 + * 2、多字节情况表示字段(暂未处理) + */ + private static Object doParseBitField(ByteBuf byteBuf,AbstractFieldConfig fieldConfig) { + Object fieldValue = new Object(); + try { + Integer orignPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + byte fields = 0x00; + if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { + fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); + } else { + fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); + } + + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { + if (!StringUtils.isEmpty(fieldConfig.getOriginPositionBit())) { + fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getOriginPositionBit())).byteValue() + >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); + } else { + fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); + } + } else { + fieldValue = Integer.valueOf(fields & 0xff); + } + if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { + return fieldValue; + } + List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); + int i = 0; + //字节归并到一起=>继续根据规则进行判断 + while (i < ruleMapList.size()) { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(null) + .value(fieldValue) + .ruletypeId(ruletypeId).build(); + fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); + i++; + } + System.out.println(JSON.toJSON(fieldValue)); + return fieldValue; + } catch (RuntimeException ex) { + log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); + return null; + } + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java deleted file mode 100644 index 35ae3d0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java +++ /dev/null @@ -1,183 +0,0 @@ -package com.casic.missiles.parser.resolver.fields; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufAllocator; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; -import org.springframework.util.ObjectUtils; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service("standard") -@AllArgsConstructor -@Slf4j -public class StandardFieldParser implements FieldParser { - - private final FieldConfigDao fieldConfigDao; - private final FieldResolver fieldResolver; - - //数据解析 - @Override - public Map dataParser(RuleConfig ruleConfig, String lightText, String protocolId) { - String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); - ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); - bufferContent.writeBytes(lightText.getBytes(Charset.forName("ISO-8859-1"))); - Map dataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - for (String dataFieldId : dataFieldIds) { - FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(dataFieldId); - if (!ObjectUtils.isEmpty(fieldConfig)) { - dataMap.put(fieldConfig.getFieldName(), String.valueOf(fieldResolver.filedParserManger(bufferContent, fieldConfig, maxFixedPosition))); - } - } - return dataMap; - } - - //数据解析 - @Override - public Map fixDataParser(String protocolId, ByteBuf buffer) { - List dataFieldIdList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Map dataMap = new HashMap<>(); - for (FieldConfig dataField : dataFieldIdList) { - if (!ObjectUtils.isEmpty(dataField.getOrignPosition())) { - Object fieldValue = (Integer) fieldResolver.filedParserManger(buffer, dataField, null); - dataMap.put(dataField.getFieldName(), fieldValue); - } - } - return dataMap; - } - - @Override - public Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf) { - if (ByteBufUtil.hexDump(byteBuf).equals("")) { - return 0; - } - String filterFields = protocolConfig.getTotalLengthFilterField(); - Integer totalLength = 0; - try { - FieldConfig totalFieldConfig = fieldConfigDao.getFieldConfigById(protocolConfig.getTotalLengthId()); - int totalFilterLength = 0; - if (!StringUtils.isEmpty(filterFields)) { - String[] filterFieldList = filterFields.split(","); - for (String filterField : filterFieldList) { - FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(filterField); - //这里都是按字节计算,没有对位进行区分,可能会出现错误 - - // 如果对位有需求,需要进一步跟进 - totalFilterLength += fieldConfig.getOffsetLength(); - } - } - totalLength = (Integer) fieldResolver.filedParserManger(byteBuf, totalFieldConfig, null) + totalFilterLength; - } catch (Exception ex) { - log.error("报文确认分发阶段,获取报文总长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); - } - return totalLength; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer) { - //业务内容 - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - String protocolId = String.valueOf(protocolConfig.getId()); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - //计算固定长度 - Integer fixedLength = calculateLength(fieldConfigList); -// Integer totalLength = this.getTotalLength(protocolConfig, buffer); - //总长度获取 - Integer totalLength = lightText.length(); - //计算固定长度最大长度 - Integer maxFixedPosition = calculatePosition(fieldConfigList); -// buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - //计算数据报文内容 - ByteBuf bizDataFields = buffer.slice(maxFixedPosition-1, (totalLength - fixedLength)); - return bizDataFields; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer) { - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - String protocolId = String.valueOf(protocolConfig.getId()); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer fixedLength = calculateLength(fieldConfigList); -// Integer totalLength = this.getTotalLength(protocolConfig, buffer); - Integer totalLength = lightText.length(); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - ByteBuf fixDataFields = buffer.slice(0, maxFixedPosition); - return fixDataFields; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer) { - String protocolId = String.valueOf(protocolConfig.getId()); - Map fixedPropertyMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer fixedLength = calculateLength(fieldConfigList); - Integer totalLength = this.getTotalLength(protocolConfig, buffer); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - fixedPropertyMap.put("fixedPosition", maxFixedPosition); - fixedPropertyMap.put("totalLength", totalLength); - fixedPropertyMap.put("tailPosition", totalLength - fixedLength + maxFixedPosition); - return fixedPropertyMap; - } - - //分别计算bit和byte长度=> 合并长度 - private Integer calculateLength(List fieldConfigList) { - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (FieldConfig fieldConfig : fieldConfigList) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - Integer fixedLength = bytefixedLength + bitfixedLength / 8; - return fixedLength; - } - - //找到最大值=> 根据最大值计算业务数据下标 - private Integer calculatePosition(List fieldConfigList) { - String rex = "[0-9]+"; - Integer max = -1; - for (FieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOrignPosition()) - && Integer.valueOf(fieldConfig.getOrignPosition()) > max) { - max = Integer.valueOf(fieldConfig.getOrignPosition()); - } - } - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (FieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOrignPosition()) && fieldConfig.getOrignPosition().equals(max)) { - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - } - } - Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; - return maxFixedPosition; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java new file mode 100644 index 0000000..d4ec6c7 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java @@ -0,0 +1,76 @@ +package com.casic.missiles.parser.rule; + +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import org.apache.commons.lang3.StringUtils; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class GenericRuleResolver { + + //根据前置字段的值,找到指定的规则 + //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 + //=>循环判断=>通过规则得到业务字段 + public static RuleConfig machRule(Map fixDataMap, + String ids, + List protocolFieldConfigs, + List ruleConfigs) { + List preRuleConfigList = getPreRuleList(ids, protocolFieldConfigs); + //获取前置规则字段 + final Map metaDataMap = getPreRuleFields(preRuleConfigList, fixDataMap); + //准备固定的字段集合 + Map fixDataFieldMap = getFixDataFieldMap(protocolFieldConfigs); + return RuleResolverCore.doMachRule(ruleConfigs, metaDataMap, fixDataMap, fixDataFieldMap); + } + + private static Map getFixDataFieldMap(List protocolFieldConfigs) { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, ProtocolFieldConfig::getFieldName) + ); + return fixDataFieldMap; + } + + + /** + * 查询前置规则的字段配置 + * + * @param ids + * @return + */ + private static List getPreRuleList(String ids, List protocolFieldConfigs) { + String[] idList = ids.split(","); + Map prepareMaps = new HashMap<>(); + for (String id : idList) { + if (StringUtils.isNotEmpty(id)) { + prepareMaps.put(Long.valueOf(id), ""); + } + } + List preRuleConfigList = protocolFieldConfigs + .stream() + .filter(e -> prepareMaps.containsKey(e.getId())) + .collect(Collectors.toList()); + return preRuleConfigList; + } + + /** + * 获取前置规则解析字段 + */ + private static Map getPreRuleFields(List preRuleFieldConfigList, Map fixDataMap) { + Map ruleFieldMap = new HashMap<>(); + preRuleFieldConfigList.stream() + .forEach( + preRuleFieldConfig -> { + String fieldName = preRuleFieldConfig.getFieldName(); + if (fixDataMap.containsKey(fieldName)) { + ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); + } + } + ); + return ruleFieldMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java new file mode 100644 index 0000000..baae7e8 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -0,0 +1,68 @@ +package com.casic.missiles.parser.rule; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.casic.missiles.pojo.RuleConfig; + +import java.util.*; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleResolverCore { + + + public static RuleConfig doMachRule(List ruleConfigList, Map metaDataMap, + Map fixDataMap, + Map fixDataFieldMap) { + Optional ruleConfigOptional = ruleConfigList.stream() + .filter(ruleConfig -> machRuleConfig( + JSON.parseObject(ruleConfig.getMatchRuleJson(), Map.class), metaDataMap)) + .findFirst(); + if (ObjectUtil.isEmpty(ruleConfigOptional)) { + return null; + } + String[] ruleFields = ruleConfigOptional.get().getDataFieldIds().split(","); + Map ruleMetaDataMap = getRuleFields(ruleFields, fixDataMap, fixDataFieldMap); + //递归选定解析规则,进行规则解析 + if (!ruleConfigOptional.get().getIsFinishMatch().equals("1")) { + //递归选定规则 + doMachRule(ruleConfigList, ruleMetaDataMap, fixDataMap, fixDataFieldMap); + } + return ruleConfigOptional.get(); + } + + + private static Map getRuleFields(String[] preRuleConfigList, Map fixedDataMap, + Map fixedFieldMap) { + Map ruleFieldMap = new HashMap<>(); + for (String preRuleConfigId : preRuleConfigList) { + String fieldName = fixedFieldMap.get(preRuleConfigId); + if (fixedDataMap.containsKey(fieldName)) { + ruleFieldMap.put(fieldName, String.valueOf(fixedDataMap.get(fieldName))); + } + } + return ruleFieldMap; + } + + + //匹配规则配置 + private static Boolean machRuleConfig(Map ruleMap, Map metaDataMap) { + if (ruleMap == null || metaDataMap == null) { + return null; + } + //所有的字段在规则里面必须有有配置 + for (String key : metaDataMap.keySet()) { + if (ruleMap.containsKey(key)) { + if (!ruleMap.get(key).equals(metaDataMap.get(key))) { + return false; + } + } else { + return false; + } + } + return true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java deleted file mode 100644 index 664088d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java +++ /dev/null @@ -1,92 +0,0 @@ -package com.casic.missiles.parser.rule; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.mapper.dao.PreRuleConfigDao; -import com.casic.missiles.mapper.dao.RuleConfigDao; -import lombok.AllArgsConstructor; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.*; -import java.util.stream.Collectors; - -@Service -@AllArgsConstructor -public class RulerProvider { - - private final FieldConfigDao fieldConfigDao; - private final PreRuleConfigDao preRuleConfigDao; - private final RuleConfigDao ruleConfigDao; - - //根据前置字段的值,找到指定的规则 - //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 - //=>循环判断=>通过规则得到业务字段 - public RuleConfig ruleConfig(Map fixDataMap, String protocolId) { - //批量获取规则 - List preRuleConfigList = preRuleConfigDao.getPreRuleList(protocolId); - //获取固定字段 - Map fixFieldMap = getAllFieldMap(protocolId); - //获取前置规则字段 - final String preRuleFields = getPreRuleFields(preRuleConfigList, fixDataMap, fixFieldMap); - List ruleConfigList = ruleConfigDao.getRuleConfigById(protocolId); - Optional ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig ->preRuleFields.equals( ruleConfig.getParseRuleJson())).findFirst(); - //递归选定解析规则,进行规则解析 - while (!ObjectUtil.isEmpty(ruleConfigOptional) && !ruleConfigOptional.get().getIsBizField().equals("1")) { - String ruleFields = getRuleFields(ruleConfigOptional.get().getDataFieldIds().split(","), fixDataMap, fixFieldMap); - ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig -> ruleConfig.getParseRuleJson().equals(ruleFields)).findFirst(); - } - return ruleConfigOptional.get(); - } - - /** - * 获取前置规则解析字段 - */ - private String getPreRuleFields(List preRuleConfigList, Map fixDataMap, Map fixFieldMap) { - Map ruleFieldMap= new HashMap<>(); - preRuleConfigList.stream() - .forEach( - preRuleConfig -> { - String fieldName = fixFieldMap.get(Long.valueOf(preRuleConfig.getRuleFieldId())); - if (fixDataMap.containsKey(fieldName)) { - ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); - } - } - ); - return JSONObject.toJSONString(ruleFieldMap); - } - - private Map getAllFieldMap(String protocolId) { - List fieldList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Map fixFieldMap = fieldList.stream().collect( - Collectors.toMap(FieldConfig::getId, FieldConfig::getFieldName) - ); - return fixFieldMap; - } - - private String getRuleFields(String[] preRuleConfigList, Map fixDataMap, Map fixFieldMap) { - Map ruleFieldMap= new HashMap<>(); - for (String preRuleConfigId : preRuleConfigList) { - String fieldName = fixFieldMap.get(preRuleConfigId); - if (fixDataMap.containsKey(fieldName)) { - ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); - } - } - return JSONObject.toJSONString(ruleFieldMap); - } - - //弃置 - private String ListToString(List ruleFieldList) { - String ruleFields = ""; - for (String ruleField : ruleFieldList) { - ruleFields += ruleField + ","; - } - ruleFields = StringUtils.isEmpty(ruleFields) ? ruleFields : ruleFields.substring(0, ruleFields.length() - 1); - return ruleFields; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java index 6177e10..bfa87a5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java @@ -2,7 +2,7 @@ public interface SafeStrategy { - String decryption(byte[] bytes); + String decryption(String cipher); String encryption(String lightText); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java index 618716c..6236302 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java @@ -9,9 +9,9 @@ //十六进制的字符串转换成字节数组 byte[] bytes = hexStrToBinaryStr(msg); //计算CRC8 - byte crc8 = CRC8(bytes, 0, bytes.length); - String crc8ToStr = "" + Integer.toHexString(0xff & crc8); - return crc8ToStr; +// String crc8ToStr = "" + Integer.toHexString(0xff & crc8); +// return crc8ToStr; + return null; } /** @@ -33,50 +33,5 @@ return bytes; } - /** - * CRC8 校验 多项式 x8+x2+x+1 - * - * @param b - * @param off - * @param len - * @return - */ - public static byte CRC8(final byte[] b, final int off, final int len) { - byte result = 0x00; - for (int i = 0; i < len; i++) { - result = CHECKSUM_TABLE[(result ^ (b[i + off] & 0xFF)) & 0xFF]; - } - return (byte) (result & 0xFFL); - } - - private final static byte[] CHECKSUM_TABLE = {(byte) 0x00, (byte) 0x07, (byte) 0x0e, (byte) 0x09, (byte) 0x1c, (byte) 0x1b, - (byte) 0x12, (byte) 0x15, (byte) 0x38, (byte) 0x3f, (byte) 0x36, (byte) 0x31, (byte) 0x24, (byte) 0x23, (byte) 0x2a, - (byte) 0x2d, (byte) 0x70, (byte) 0x77, (byte) 0x7e, (byte) 0x79, (byte) 0x6c, (byte) 0x6b, (byte) 0x62, (byte) 0x65, - (byte) 0x48, (byte) 0x4f, (byte) 0x46, (byte) 0x41, (byte) 0x54, (byte) 0x53, (byte) 0x5a, (byte) 0x5d, (byte) 0xe0, - (byte) 0xe7, (byte) 0xee, (byte) 0xe9, (byte) 0xfc, (byte) 0xfb, (byte) 0xf2, (byte) 0xf5, (byte) 0xd8, (byte) 0xdf, - (byte) 0xd6, (byte) 0xd1, (byte) 0xc4, (byte) 0xc3, (byte) 0xca, (byte) 0xcd, (byte) 0x90, (byte) 0x97, (byte) 0x9e, - (byte) 0x99, (byte) 0x8c, (byte) 0x8b, (byte) 0x82, (byte) 0x85, (byte) 0xa8, (byte) 0xaf, (byte) 0xa6, (byte) 0xa1, - (byte) 0xb4, (byte) 0xb3, (byte) 0xba, (byte) 0xbd, (byte) 0xc7, (byte) 0xc0, (byte) 0xc9, (byte) 0xce, (byte) 0xdb, - (byte) 0xdc, (byte) 0xd5, (byte) 0xd2, (byte) 0xff, (byte) 0xf8, (byte) 0xf1, (byte) 0xf6, (byte) 0xe3, (byte) 0xe4, - (byte) 0xed, (byte) 0xea, (byte) 0xb7, (byte) 0xb0, (byte) 0xb9, (byte) 0xbe, (byte) 0xab, (byte) 0xac, (byte) 0xa5, - (byte) 0xa2, (byte) 0x8f, (byte) 0x88, (byte) 0x81, (byte) 0x86, (byte) 0x93, (byte) 0x94, (byte) 0x9d, (byte) 0x9a, - (byte) 0x27, (byte) 0x20, (byte) 0x29, (byte) 0x2e, (byte) 0x3b, (byte) 0x3c, (byte) 0x35, (byte) 0x32, (byte) 0x1f, - (byte) 0x18, (byte) 0x11, (byte) 0x16, (byte) 0x03, (byte) 0x04, (byte) 0x0d, (byte) 0x0a, (byte) 0x57, (byte) 0x50, - (byte) 0x59, (byte) 0x5e, (byte) 0x4b, (byte) 0x4c, (byte) 0x45, (byte) 0x42, (byte) 0x6f, (byte) 0x68, (byte) 0x61, - (byte) 0x66, (byte) 0x73, (byte) 0x74, (byte) 0x7d, (byte) 0x7a, (byte) 0x89, (byte) 0x8e, (byte) 0x87, (byte) 0x80, - (byte) 0x95, (byte) 0x92, (byte) 0x9b, (byte) 0x9c, (byte) 0xb1, (byte) 0xb6, (byte) 0xbf, (byte) 0xb8, (byte) 0xad, - (byte) 0xaa, (byte) 0xa3, (byte) 0xa4, (byte) 0xf9, (byte) 0xfe, (byte) 0xf7, (byte) 0xf0, (byte) 0xe5, (byte) 0xe2, - (byte) 0xeb, (byte) 0xec, (byte) 0xc1, (byte) 0xc6, (byte) 0xcf, (byte) 0xc8, (byte) 0xdd, (byte) 0xda, (byte) 0xd3, - (byte) 0xd4, (byte) 0x69, (byte) 0x6e, (byte) 0x67, (byte) 0x60, (byte) 0x75, (byte) 0x72, (byte) 0x7b, (byte) 0x7c, - (byte) 0x51, (byte) 0x56, (byte) 0x5f, (byte) 0x58, (byte) 0x4d, (byte) 0x4a, (byte) 0x43, (byte) 0x44, (byte) 0x19, - (byte) 0x1e, (byte) 0x17, (byte) 0x10, (byte) 0x05, (byte) 0x02, (byte) 0x0b, (byte) 0x0c, (byte) 0x21, (byte) 0x26, - (byte) 0x2f, (byte) 0x28, (byte) 0x3d, (byte) 0x3a, (byte) 0x33, (byte) 0x34, (byte) 0x4e, (byte) 0x49, (byte) 0x40, - (byte) 0x47, (byte) 0x52, (byte) 0x55, (byte) 0x5c, (byte) 0x5b, (byte) 0x76, (byte) 0x71, (byte) 0x78, (byte) 0x7f, - (byte) 0x6a, (byte) 0x6d, (byte) 0x64, (byte) 0x63, (byte) 0x3e, (byte) 0x39, (byte) 0x30, (byte) 0x37, (byte) 0x22, - (byte) 0x25, (byte) 0x2c, (byte) 0x2b, (byte) 0x06, (byte) 0x01, (byte) 0x08, (byte) 0x0f, (byte) 0x1a, (byte) 0x1d, - (byte) 0x14, (byte) 0x13, (byte) 0xae, (byte) 0xa9, (byte) 0xa0, (byte) 0xa7, (byte) 0xb2, (byte) 0xb5, (byte) 0xbc, - (byte) 0xbb, (byte) 0x96, (byte) 0x91, (byte) 0x98, (byte) 0x9f, (byte) 0x8a, (byte) 0x8d, (byte) 0x84, (byte) 0x83, - (byte) 0xde, (byte) 0xd9, (byte) 0xd0, (byte) 0xd7, (byte) 0xc2, (byte) 0xc5, (byte) 0xcc, (byte) 0xcb, (byte) 0xe6, - (byte) 0xe1, (byte) 0xe8, (byte) 0xef, (byte) 0xfa, (byte) 0xfd, (byte) 0xf4, (byte) 0xf3}; } \ No newline at end of file diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java index 27c2838..6e078a3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java @@ -1,9 +1,6 @@ package com.casic.missiles.parser.safe.impl; -import cn.hutool.core.util.CharsetUtil; -import cn.hutool.crypto.symmetric.SM4; -import cn.hutool.crypto.symmetric.SymmetricCrypto; - +import com.casic.missiles.parser.safe.SafeStrategy; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; @@ -11,19 +8,44 @@ import org.bouncycastle.crypto.engines.SM4Engine; import org.bouncycastle.crypto.params.KeyParameter; import org.bouncycastle.util.encoders.Hex; - -import static cn.hutool.crypto.Mode.ECB; -import static cn.hutool.crypto.Padding.NoPadding; +import org.springframework.stereotype.Component; /** * SM4算法工具类 */ @Slf4j -public class Sm4 { +@Component("sm4") +public class Sm4 implements SafeStrategy { //加解密的字节快大小 public static final int BlockSize = 16; + @Override + public String decryption(String cipher) { + byte[] keyByte = { + 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 + }; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(keyByte); + byte[] in = Hex.decode(cipher); + byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); + String plain = EcbDecrypt(in, keyBytes); + return plain; + } + + @Override + public String encryption(String cipher) { + byte[] keyByte = { + 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 + }; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(keyByte); + byte[] in = Hex.decode(cipher); + byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); + String plain = EcbDecrypt(in, keyBytes); + return plain; + } + /** * SM4ECB加密算法,对内 * @@ -32,8 +54,6 @@ * @return */ private static byte[] ecb_encrypt(byte[] in, byte[] keyBytes) { - - SM4Engine sm4Engine = new SM4Engine(); sm4Engine.init(true, new KeyParameter(keyBytes)); byte[] out = new byte[in.length]; @@ -58,27 +78,6 @@ return cipher; } - - /** - * hutool 解密SM4 - * - * @param encodeContent - * @return - */ - public static String decode(String encodeContent) { - String key = "24ad182507479a5da3ad94d9d78ea203"; - try { - SymmetricCrypto sm4 = new SM4(ECB, NoPadding, key.getBytes()); - String decryptStr = sm4.decryptStr(encodeContent, CharsetUtil.CHARSET_UTF_8); - return decryptStr; - } catch (Exception e) { - e.printStackTrace(); - log.error("SM4解密失败"); - } - return null; - } - - /** * SM4的ECB加密算法 * @@ -129,20 +128,6 @@ return plain; } - /** - * SM4的ECB解密算法 - * - * @param cipher 输入的密文字符串 - * @param key 密钥 - * @return - */ - public static String EcbDecrypt(String cipher, String key) { - byte[] in = Hex.decode(cipher); - byte[] keyBytes = Hex.decode(key); - - String plain = EcbDecrypt(in, keyBytes); - return plain; - } /** * 主函数 @@ -151,28 +136,24 @@ */ public static void main(String[] args) { byte[] ciphertext = { + 0x4B, (byte) 0x8C, (byte) 0x9D, 0x08, (byte) 0xE4, (byte) 0xD3, 0x64, 0x42, (byte) 0xB9, (byte) 0xA5, (byte) 0xFE, (byte) 0xCD, (byte) 0x91, 0x1B, 0x38, (byte) 0xAC, (byte) 0xE9, 0x1C, (byte) 0xCD, 0x53, 0x02, (byte) 0xD7, 0x0C, (byte) 0x9B, (byte) 0x96, 0x30, 0x62, (byte) 0xE8, (byte) 0xFB, (byte) 0xEF, (byte) 0xB9, (byte) 0xFF, (byte) 0xDE, 0x19, (byte) 0x80, 0x35, 0x3E, (byte) 0x90, 0x4F, 0x2F, 0x12, 0x2B, 0x19, (byte) 0x8B, 0x6C, 0x7A, (byte) 0x85, (byte) 0xA1, (byte) 0xB1, (byte) 0x86, (byte) 0xA3, 0x7A, 0x46, 0x0C, 0x2F, (byte) 0x94, 0x4F, 0x7F, 0x2C, 0x56, 0x14, (byte) 0xF3, (byte) 0x89, (byte) 0xC3, - 0x3F, 0x20, (byte) 0xF9, (byte) 0x87, (byte) 0xA1, 0x60, (byte) 0xD9, (byte) 0xA8, (byte) 0xFD, (byte) 0xD7, (byte) 0x9B, 0x4B, 0x26, 0x06, 0x30, 0x44}; + 0x3F, 0x20, (byte) 0xF9, (byte) 0x87, (byte) 0xA1, 0x60, (byte) 0xD9, (byte) 0xA8, (byte) 0xFD, (byte) 0xD7, (byte) 0x9B, 0x4B, 0x26, 0x06, 0x30, 0x44 + }; ByteBuf in = ByteBufAllocator.DEFAULT.heapBuffer(); in.writeBytes(ciphertext); - byte[] keyByte = { 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 }; ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); - key.writeBytes(ciphertext); - String resCipherData = decode(ByteBufUtil.hexDump(in)); - ByteBuf out = ByteBufAllocator.DEFAULT.heapBuffer(); -// out.writeBytes(resCipherData); -// System.out.println(hexBytes); - System.out.println(resCipherData.toString()); -// String resPlainData = EcbDecrypt(resCipherData, key); -// System.out.println("原始明文:" + data); -// System.out.println("解密后明文:" + resPlainData); + key.writeBytes(keyByte); +// String resCipherData = EcbDecrypt(ByteBufUtil.hexDump(in), ByteBufUtil.hexDump(key)); +// System.out.println(resCipherData); } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java index 1395a51..ac5f957 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java @@ -1,7 +1,7 @@ package com.casic.missiles.parser.safe.impl; import io.netty.buffer.ByteBufUtil; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** *

@@ -14,9 +14,8 @@ * @author hyl * @version v1.0: Tea.java, v 0.1 2021/3/12 13:48 $ */ -@Service("tea") -///tea算法类 - +//tea算法类 +@Component("tea") public class Tea { public static byte[] MyTea_Encrypt(byte[] MyTeaContent, int ByteLen, byte[] MyTeakey) { @@ -99,7 +98,6 @@ // for(int i32Index = 0; i32Index < 8; i32Index++) { // System.out.print("0x" + Integer.toHexString(MyContent[i32Index]) + " "); // } - // System.out.println("密钥为:"); // for(int i32Index = 0; i32Index < 16; i32Index++) { // System.out.print("0x" + Integer.toHexString(MyKeys[i32Index]) + " "); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java index bdd0721..bd1516a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java @@ -3,7 +3,7 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.parser.sender.DataSubscribeProvider; import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponents; import org.springframework.web.util.UriComponentsBuilder; @@ -12,7 +12,7 @@ import java.util.Collections; import java.util.Map; -@Service("functionCallback") +@Component("functionCallback") public class FunctionCallback implements DataSubscribeProvider { @Resource diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java index 0b44fb9..7526de2 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.Map; -@Service("middleware") +@Component("middleware") public class MiddlewareSubscribe implements DataSubscribeProvider { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java index 608af3a..32cc8a4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java @@ -2,48 +2,47 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.delivery.decorator.ByteDecorator; +import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @AllArgsConstructor public class FieldDecoratorManger { - private final RuleDictDao ruleDictDao; + private final RuleConfigRegistry ruleDictDao; // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 // (1)静态的业务字段是字典里面可以配置的 // (2)动态的业务字段是通过规则生成的 public String contentMerge(String ruleJson, String sceneConent, String dynamicContent) { - List ruleDictList = ruleDictDao.getRuleDictConfig(); - Map ruleDictMap = ruleDictList.stream().collect( - Collectors.toMap(RuleDict::getId, e -> e)); - List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); - for (Map ruleMap : ruleMapList) { - String ruleType = String.valueOf(ruleMap.get("ruleType")); - ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); - NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); - byteDecorator.nodeDecoratorRule(nodeDecoratorParm); - } +// List ruleDictList = ruleDictDao.getRuleDictConfig(); +// Map ruleDictMap = ruleDictList.stream().collect( +// Collectors.toMap(RuleDict::getId, e -> e)); +// List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); +// for (Map ruleMap : ruleMapList) { +// String ruleType = String.valueOf(ruleMap.get("ruleType")); +// ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); +// NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); +// byteDecorator.nodeDecoratorRule(nodeDecoratorParm); +// } return null; } - - private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { - NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() - .contents(sceneConent) - .dynamicContent(dynamicContent) - .ruletypeId(ruletypeId) - .ruleDictMap(ruleDictMap) - .build(); - return nodeDecoratorParm; - } +// +// private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { +// NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() +// .contents(sceneConent) +// .dynamicContent(dynamicContent) +// .ruletypeId(ruletypeId) +// .ruleDictMap(ruleDictMap) +// .build(); +// return nodeDecoratorParm; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java index 652970c..b204ac3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java @@ -1,56 +1,56 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@AllArgsConstructor -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", - JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Component; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Component("logicalDecorator") +//@AllArgsConstructor +//@Slf4j +//public class LogicalShiftDecorator implements ByteDecorator { +// +//// private final FieldRuleEngineMapper fieldRuleEngineMapper; +//// +//// //字节位移 +//// @Override +//// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +//// String logicalValue = ""; +//// RuleEvaluator fieldRuleEngine = new RuleEvaluator(); +//// try { +//// Map env2 = new HashMap(); +//// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +//// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +//// for (String contentId : contentIdList) { +//// RuleDict ruleDict = ruleDictMap.get(contentId); +//// if (ruleDict.getCode().contains("#")) { +//// //使用动态的值 +//// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +//// } +//// env2.put(ruleDict.getName(), ruleDict.getCode()); +//// } +//// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +//// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +//// return null; +//// } +//// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +//// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +//// return values; +//// } catch (Exception ex) { +//// log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", +//// JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +//// return null; +//// } +//// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java index 346468f..822fead 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@AllArgsConstructor -@Slf4j -public class OperationDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("optionDecorator") +//@AllArgsConstructor +//@Slf4j +//public class OperationDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //混合运算,有常量或者乘除的缩放 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java index 50fb0a7..7a8bccb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@AllArgsConstructor -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +////精度计算 +//@AllArgsConstructor +//@Registry("precisionDecorator") +//@Slf4j +//public class PrecisionDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java index da39235..27f9cc7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java @@ -1,54 +1,53 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@AllArgsConstructor -@Slf4j -public class RuleDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("ruleDecorator") +//@AllArgsConstructor +//@Slf4j +//public class RuleDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //吃我一套正则表达式 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (Exception ex) { +// log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java index 7f5cbf3..c043f97 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java @@ -2,6 +2,6 @@ import java.util.Map; -public interface ComandeEventService { +public interface ComandeEventService{ Map loadComandeEventConfig(String protocolId,String scene); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java index 476ad84..aaf1837 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java @@ -2,46 +2,46 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.dao.CommandEventDao; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @Slf4j @AllArgsConstructor -public class ComandeEventServiceImpl implements ComandeEventService { +public class ComandeEventServiceImpl implements ComandeEventRegistry { - private final CommandEventDao commandEventDao; + // private final CommandEventDao commandEventDao; // 加密bean 固定字段出现变化的字段解析,业务字段的有序内容 @Override - public Map loadComandeEventConfig(String protocolId,String sceneName) { - CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); - if (ObjectUtil.isEmpty(commandEventConfig)) { - log.error("协议{},没有配置成功接收回复配置,清排查原因"); - return null; - } - String replyJson = commandEventConfig.getReplyContentJson(); - List> replyMapList = JSONArray.parseObject(replyJson, List.class); - List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); - Map fixMap = fixList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); - List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) - .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) - .collect(Collectors.toList()); - Map commandConfigMap = new HashMap<>(); - commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); - commandConfigMap.put("fixContent", fixMap); - commandConfigMap.put("bizContent", contentList); - return commandConfigMap; + public Map loadComandeEventConfig(String protocolId, String sceneName) { +// CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); +// if (ObjectUtil.isEmpty(commandEventConfig)) { +// log.error("协议{},没有配置成功接收回复配置,清排查原因"); +// return null; +// } +// String replyJson = commandEventConfig.getReplyContentJson(); +// List> replyMapList = JSONArray.parseObject(replyJson, List.class); +// List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); +// Map fixMap = fixList.stream() +// .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); +// List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) +// .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) +// .collect(Collectors.toList()); +// Map commandConfigMap = new HashMap<>(); +// commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); +// commandConfigMap.put("fixContent", fixMap); +// commandConfigMap.put("bizContent", contentList); +// return commandConfigMap; + return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 128b09d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java deleted file mode 100644 index 4016b0b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface DatagramEventMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java deleted file mode 100644 index 597c306..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.apache.ibatis.annotations.Mapper; - -public interface FieldConfigMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java deleted file mode 100644 index a31680a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.PreRuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface PreRuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java deleted file mode 100644 index 9060a69..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface ProtocolConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java deleted file mode 100644 index 6fa6936..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java deleted file mode 100644 index 582a705..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleDict; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleDictMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java deleted file mode 100644 index 6e302c8..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.CommandEventMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Optional; - -@Component -public class CommandEventDao { - - @Resource - private CommandEventMapper commandEventMapper; - - public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId) - .eq("scene", sceneName) - .eq("enabled", 1); - List commandEventConfig = commandEventMapper.selectList(queryWrapper); - Optional optionalEventConfig = commandEventConfig.stream().findFirst(); - return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java deleted file mode 100644 index 9137e4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.FieldConfigMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class FieldConfigDao { - - @Resource - private FieldConfigMapper fieldConfigMapper; - - public FieldConfig getFieldConfigById(String fieldId) { - FieldConfig fieldConfig = fieldConfigMapper.selectById(fieldId); - return fieldConfig; - } - - public List getFieldConfigs(String protocolId,Integer isFixed) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",isFixed); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - - public List getStorageFieldConfig(String protocolId) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",1) - .eq("is_storage",1); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java deleted file mode 100644 index 67bff6b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.mapper.PreRuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class PreRuleConfigDao { - - @Resource - private PreRuleConfigMapper preRuleConfigMapper; - - public List getPreRuleList(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return preRuleConfigMapper.selectList(queryWrapper); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java deleted file mode 100644 index d69ea85..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.RuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleConfigDao { - - @Resource - private RuleConfigMapper ruleConfigMapper; - - public RuleConfig getNextRuleConfig(String ruleFields) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("parse_rule_json", ruleFields); - return ruleConfigMapper.selectOne(queryWrapper); - } - - - public List getRuleConfigById(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return ruleConfigMapper.selectList(queryWrapper); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java deleted file mode 100644 index 932c185..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.RuleDictMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleDictDao { - - @Resource - private RuleDictMapper ruleDictMapper; - - public List getRuleDictConfig() { - List ruleDictList = ruleDictMapper.selectList(null); - return ruleDictList; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java index 9f9e279..43bc4d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java @@ -10,20 +10,15 @@ import io.netty.channel.socket.nio.NioServerSocketChannel; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import javax.annotation.PreDestroy; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static cn.hutool.core.util.ClassUtil.getClasses; /** * SensorhubServer netty服务端 */ @Slf4j -@Service +@Component public class SensorhubServer { /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java index 2c79ff5..9a28c36 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java @@ -11,13 +11,13 @@ import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioSocketChannel; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClient 客户端 */ @Slf4j -@Service +@Registry public final class SensorhubClient { public static void main(String[] args) throws Exception { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java index 9774be0..477c3f7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java @@ -6,12 +6,12 @@ import io.netty.channel.socket.SocketChannel; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientChannelInitialHandler */ -@Service +@Registry public class SensorhubClientChannelInitialHandler extends ChannelInitializer { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java index 346f4b3..73560e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java @@ -5,13 +5,13 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientHandler */ @Slf4j -@Service +@Registry public class SensorhubClientHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java index 5c1c6f2..d990af5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java @@ -4,12 +4,12 @@ import com.casic.missiles.pojo.Msg; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** * SensorhubServerHandler */ -@Service +@Component public class SensorhubServerHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 67283ae..af3172c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,41 +1,37 @@ package com.casic.missiles.parser; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultProtocolConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.*; +import com.casic.missiles.registry.FieldConfigRegistry; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; -import java.nio.charset.Charset; import java.util.HashMap; import java.util.List; import java.util.Map; -@Service("genericProtocolParser") +/** + * @author + */ +@Component("genericProtocolParser") @Slf4j -@AllArgsConstructor +@RequiredArgsConstructor public class GenericProtocolParser implements ProtocolParser { - private final LeadingCodeMatcher leadingCodeMatcher; private final List frameStructDispenserList; - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorInstanceSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; // 匹配首字母前导码=> 帧结构匹配前导码=> // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 @@ -44,18 +40,19 @@ public Boolean doParseProtocol(ByteBuf byteBuf) { String protocolContent = ByteBufUtil.hexDump(byteBuf); //匹配前导码 - List preCodeConfigs = leadingCodeMatcher.matchLeadingCode(protocolContent); + List preCodeConfigs = LeadingCodeMatcher.matchFrameLeadingCode(protocolContent); //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 if (preCodeConfigs.size() == 0) { - return rematch(byteBuf,protocolContent); + return rematch(byteBuf, protocolContent); } - //暂时先取第一个 + //暂时先取第一个,提升速度,使用享元模式, 减少类的创建销毁与构建 ProtocolConfig protocolConfig = preCodeConfigs.get(0); + AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); ByteBuf wholeDatagramByte = null; //通过匹配帧结构获取完整的数据包 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, preCodeConfigs.get(0))) != null) { + if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, protocolFactory)) != null) { break; } } @@ -68,76 +65,78 @@ * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 */ - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId, wholeDatagramByte); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap, protocolId); - //选取规则对应的流程实例 - DatagramEventConfig datagramEventConfig = processorInstanceSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); + //进行规则字段解析,进行匹配规则 + RuleConfig ruleConfig = getRuleConfig(protocolFactory, wholeDatagramByte); + if (ruleConfig == null) { + return false; + } //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, wholeDatagramByte); + ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte); + //以下进行业务的规则解析,同时选定流程实例 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); + DatagramEventProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain, + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText, protocolId); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain); //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); + datagramEventProvider.storeData(bizDataMap); return true; } - private Boolean rematch(ByteBuf byteBuf,String protocolContent) { + /** + * 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 + */ + private Boolean rematch(ByteBuf byteBuf, String protocolContent) { //重置位判断 byteBuf.resetReaderIndex(); //判断重置是否前移,如果没有前移,则直接判为匹配失败 if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { return false; } else { + //递归执行 return doParseProtocol(byteBuf); } } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; + //获取匹配规则->匹配规则 + private RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + //取出其中参与逻辑provider并判空 + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); + String rulePrepareFields = protocolConfig.getRulePrepareFields(); + //固定字段 + if (StringUtils.isNotEmpty(rulePrepareFields)) { + //获取统一固定字段解析 + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + //获取该协议的字段配置,用于协议规则匹配 + List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); + //获取规则 + RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, + rulePrepareFields, protocolFieldConfigs); + return ruleConfig; + } + return null; } - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + //数据构建,获取固定字段的store和业务字段store + private Map buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + Map bizDataMap = new HashMap<>(); + Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); + Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); + bizDataMap.putAll(ruleStoreObjectMap); + bizDataMap.putAll(protocolStoreObjectMap); return bizDataMap; } - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java index 8a46e32..16ce2e5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java @@ -3,6 +3,7 @@ import io.netty.buffer.ByteBuf; public interface ProtocolParser { + Boolean doParseProtocol(ByteBuf byteBuf); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java new file mode 100644 index 0000000..f7814af --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java @@ -0,0 +1,35 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.ProtocolConfigProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.ProtocolConfig; + +/** + * 存放基本协议的的加载信息 + */ +public class AbstractProtocolConfigFactory { + private final ProtocolConfigProvider protocolConfigProvider; + private final ProtocolFieldConfigProvider protocolFieldConfigProvider; + private final RuleConfigProvider ruleConfigProvider; + + public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { + this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); + this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); + this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); + } + + public ProtocolConfigProvider getProtocolConfigProvider() { + return protocolConfigProvider; + } + + public ProtocolFieldConfigProvider getProtocolFieldConfigProvider() { + return protocolFieldConfigProvider; + } + + public RuleConfigProvider getRuleConfigProvider() { + return ruleConfigProvider; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java new file mode 100644 index 0000000..6e36147 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java @@ -0,0 +1,57 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.CombinedFieldConfigProvider; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.FieldConfigProvider; +import com.casic.missiles.parser.provider.FieldRuleConfigProvider; + +/** + * 存放规则相关的的的加载信息 + */ +public class AbstractRuleConfigFactory { + + /** + * 处理字节 + */ + private final FieldConfigProvider fieldConfigProvider; + /** + * 处理组合字节解析的解码器 + */ + private final CombinedFieldConfigProvider combinedFieldConfigProvider; + /** + * 处理负责字节解析的规则配置 + */ + private final FieldRuleConfigProvider fieldRuleConfigProvider; + /** + * 处理实例流程 + */ + private final DatagramEventProvider datagramEventProvider; + + + public AbstractRuleConfigFactory(Long ruleId) { + this.fieldConfigProvider = new FieldConfigProvider(ruleId); + this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); + this.fieldRuleConfigProvider = new FieldRuleConfigProvider(ruleId); + this.datagramEventProvider = new DatagramEventProvider(ruleId); + } + + public FieldConfigProvider getFieldConfigProvider() { + return fieldConfigProvider; + } + + public CombinedFieldConfigProvider getCombinedFieldConfigProvider() { + return combinedFieldConfigProvider; + } + + public FieldRuleConfigProvider getFieldRuleConfigProvider() { + return fieldRuleConfigProvider; + } + + public DatagramEventProvider getDatagramEventProvider() { + return datagramEventProvider; + } + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java deleted file mode 100644 index 6e1719a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.factory; - - -import com.casic.missiles.pojo.ProtocolConfig; - -import java.util.List; - -/** - * 数据库访问优化(暂时未做) - *

- * 1、初始化协议解析配置,并存放到处存放缓存,对协议基本配置进行管理 - * 2、其中流程中所有的配置都经过此类进行管理,进行调用获取,增强解析速度 - */ -public interface DatagramFactory { - - /** - * 初始化 - */ - List datagramInit(); - - /** - * 根据前导码配置匹配,模糊匹配获取所有的报文项 - */ - List match(); - - /** - * 根据前导码匹配,返回报文项 - */ - List filer(); - - /** - * 保证数据的唯一性选择器 - */ - List selectOne(); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java new file mode 100644 index 0000000..87444a0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java @@ -0,0 +1,18 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +import java.util.List; + +/** + * 直接用,还是边用边创建 + */ +public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { + + + public DefaultProtocolConfigFactory(ProtocolConfig protocolConfig) { + super(protocolConfig); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java new file mode 100644 index 0000000..cce0c7c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java @@ -0,0 +1,12 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; + +public class DefaultRuleFactory extends AbstractRuleConfigFactory { + + public DefaultRuleFactory(Long ruleId) { + super(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java deleted file mode 100644 index 9ee97e0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.casic.missiles.parser.instance; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service -@Slf4j -@AllArgsConstructor -public class GeneralProcessor { - - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; - - /** - * 统一固定字段解析=>进行规则的查询的判断 - * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 - * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 - */ - @Deprecated - public boolean parseWholeDatagram(ByteBuf buffer, ProtocolConfig protocolConfig) { - try { - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap,protocolId); - //选取规则对应的流程= - DatagramEventConfig datagramEventConfig = processorSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); - //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); - //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); - //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); - //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); - //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); - return true; - } catch (Exception ex) { - log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", - ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); - return false; - } - } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; - } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); - } - - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); - return bizDataMap; - } - - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java index 25e7ad8..6a5777e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java @@ -1,23 +1,31 @@ package com.casic.missiles.parser.instance.impl; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.mapper.DatagramEventMapper; import com.casic.missiles.pojo.DatagramEventConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.SpringContextUtil; -@Service -@AllArgsConstructor +import java.util.List; +import java.util.Optional; + +/** + * @author cz + * + */ public class DefaultProcessorInstanceSelector implements ProcessorInstanceSelector { - private final DatagramEventMapper datagramEventMapper; + private static List datagramEventConfigs; + + static { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + datagramEventConfigs = datagramEventRegistry.getDatagramEventList(); + } @Override public DatagramEventConfig getProcessorInstance(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("rule_id", protocolId); - return datagramEventMapper.selectOne(queryWrapper); + Optional optionalSelectInstance = datagramEventConfigs.stream() + .filter(e -> e.getId().equals(protocolId)).limit(1).findFirst(); + return optionalSelectInstance.isPresent() ? optionalSelectInstance.get() : null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a778671..7b56a43 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,16 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import io.netty.buffer.ByteBuf; /** - * 分析匹配情况 - * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 - * 2、匹配不成功,有后续帧,可以进行下次匹配。 - * 3、匹配不成功,无后续帧,可以进行丢弃。 + * 分析匹配情况 + * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 + * 2、匹配不成功,有后续帧,可以进行下次匹配。 + * 3、匹配不成功,无后续帧,可以进行丢弃。 */ -public interface FrameStructMatcher{ +public interface FrameStructMatcher { - ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig); + ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 05320ab..8ebea78 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,23 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.ProtocolConfigMapper; +import com.casic.missiles.parser.provider.ProtocolConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Component; import java.util.List; import java.util.stream.Collectors; -@Component -@AllArgsConstructor public class LeadingCodeMatcher { - private final ProtocolConfigMapper protocolMapper; - //** 1、首字母匹配前导码, // 2、以匹配出的前导码是否在报文中条件进行前导码的匹配二次筛选 - public List matchLeadingCode(String protocolContent){ + public static List matchFrameLeadingCode(String protocolContent){ List initialConfigs = initialMatch(protocolContent); List preCodeConfigs = initialConfigs.stream() .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) @@ -26,13 +19,16 @@ } //初始化匹配前导码内容 - private List initialMatch(String protocolContent) { - String protocolStr = protocolContent.charAt(0) + ""; - QueryWrapper queryWrapper = new QueryWrapper() - .likeRight("pre_fix", protocolStr); - List protocolConfigList = protocolMapper.selectList(queryWrapper); - return protocolConfigList; + private static List initialMatch(String protocolContent) { + String firstFrameChar = protocolContent.charAt(0) + ""; + ProtocolConfigProvider protocolConfigProvider=new ProtocolConfigProvider(firstFrameChar); + return protocolConfigProvider.getMatchList(); } + + + + + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index cf2113d..e915877 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -1,32 +1,35 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(0) -@Service +@Component public class FrameLengthMatcher implements FrameStructMatcher { - @Autowired - private FieldParser fieldParser; - //超过长度 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { String dataGramContent = ByteBufUtil.hexDump(byteBuf); - if (StringUtils.isEmpty(protocolConfig.getUnpackId()) && StringUtils.isEmpty(protocolConfig.getTailStr())) { - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + //当不存在结尾标志和拆包标志,可以直接使用长度进行匹配 + if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { if (dataGramContent.length() >= totalLength) {//等于长度返回true,超出长度,切断 - ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, protocolConfig, totalLength); + ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, totalLength); return wholeDatagramByte; } else { //读的标志位前移舍弃 @@ -38,7 +41,7 @@ return null; } - private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, Integer totalLength) { byteBuf.readBytes(totalLength); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, totalLength - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 2bfc213..d527ad0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; @@ -13,7 +13,7 @@ import lombok.AllArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.nio.charset.Charset; import java.util.Map; @@ -22,32 +22,30 @@ * 后续标志验证 */ @Order(1) -@Service +@Component @AllArgsConstructor -public class FrameMarkMatcher implements FrameStructMatcher { - - private final FieldConfigDao fieldConfigDao; - private final FieldParser fieldParser; - private final FieldResolver fieldResolverManger; +public class FrameMarkMatcher implements FrameStructMatcher, FixedPropertyEnum { //帧后续标志=>结束,进行帧的重组=>有后续,1、帧移位判别 2、继续接收帧 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig UnpackConfig = StringUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getUnpackId()); - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); - Integer upback = 0; + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); ByteBuf mergeWholeFrameByte = null; - if (!ObjectUtil.isEmpty(UnpackConfig)) { - while (hasNextFullFrame(byteBuf, protocolConfig)) { - upback = (Integer) fieldResolverManger.filedParserManger(byteBuf, UnpackConfig, null); + if (!ObjectUtil.isEmpty(unpackFlag)) { + while (hasNextFullFrame(byteBuf, protocolConfig, protocolFieldConfigProvider)) { //是否存在后续位 - if (upback == 1) {//使用esayRule + if (unpackFlag == 1) {//使用esayRule //表示可以截取 - mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolConfig, totalLength); + mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolFieldConfigProvider, protocolConfig); return mergeWholeFrameByte; } else { - byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig)); + byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig, protocolFieldConfigProvider)); } } } @@ -56,7 +54,8 @@ //选取第一个帧,将业务内容和后面部分分开 //计算数据报文-业务内容 - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolFieldConfigProvider protocolFieldConfigProvider, ProtocolConfig protocolConfig) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); //截取完整报文 byteBuf.readBytes(totalLength); ByteBuf byteBufContent = byteBuf.slice(0, byteBuf.readerIndex()); @@ -68,15 +67,15 @@ String tail = ""; System.out.println(ByteBufUtil.hexDump(byteBufContent)); //会存在多个帧拼接在一起的的情况,进行合并处理 - while (hasNextFullFrame(byteBufContent, protocolConfig)) { - Integer currentFrameLength = fieldParser.getTotalLength(protocolConfig, byteBufContent); + while (hasNextFullFrame(byteBufContent, protocolConfig, protocolFieldConfigProvider)) { + Integer currentFrameLength = protocolFieldConfigProvider.getTotalLength(byteBufContent, protocolConfig); byteBufContent.readBytes(currentFrameLength); ByteBuf currentbyteBuf = byteBufContent.slice(0, byteBufContent.readerIndex()); byteBufContent.markReaderIndex();//读的标志位前移 System.out.println(ByteBufUtil.hexDump(byteBufContent)); String hexDump = currentbyteBuf.toString(Charset.forName("ISO-8859-1")); //获取当前固定帧结构的关系map - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, currentbyteBuf); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(currentbyteBuf, protocolConfig); if (StringUtils.isEmpty(mergeFrameStr)) { //首次获取业务数据报文 mergeFrameStr += hexDump.substring(0, currentFrameFixedProperty.get("tailPosition")); @@ -95,22 +94,22 @@ /** * 获取平移到下一帧起始位置 */ - public int getNextFrameOffset(ByteBuf buffer, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, buffer); - return currentFrameFixedProperty.get("totalLength"); + public int getNextFrameOffset(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + return currentFrameFixedProperty.get(TOTAL_LENGTH); } /** * 判断是否出错进行整个帧的 */ - public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, byteBuf); + public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); //保证读取位置不在固定位置,是可变的业务内容 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("fixedPosition")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(FIXED_POSITION)) { return false; } //判断读取是否操作帧长度 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("totalLength")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(TOTAL_LENGTH)) { return false; } return true; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 76a3784..c3a1bab 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -1,50 +1,50 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.parser.instance.GeneralProcessor; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; +import io.netty.buffer.ByteBufUtil;; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(2) -@Service +@Component public class FrameTailMatcher implements FrameStructMatcher { - @Resource - private FieldConfigDao fieldConfigDao; - @Autowired - private GeneralProcessor generalProcessor; - //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig tailFieldConfig = StringUtils.isEmpty(protocolConfig.getTailStr()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getTailStr()); - if (!ObjectUtil.isEmpty(tailFieldConfig)) { - String tailStr = tailFieldConfig.getFieldName(); + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfig protocolFieldConfig = ObjectUtils.isEmpty(protocolConfig.getTailStr()) ? null : + fieldConfigProvider.getFieldConfigById(protocolConfig.getTailStr()); + if (!ObjectUtil.isEmpty(protocolFieldConfig)) { + String tailStr = protocolFieldConfig.getFieldName(); String dataGramContent = ByteBufUtil.hexDump(byteBuf); Boolean tailFlag = ByteBufUtil.hexDump(byteBuf).contains(tailStr); if (!tailFlag) { //使用esayRule return null; } else if (dataGramContent.indexOf(tailStr) < dataGramContent.length() - tailStr.length()) { Integer length = dataGramContent.indexOf(tailStr) + tailStr.length(); - ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, protocolConfig, length); + ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, length); return wholeDatagramByte; //存在粘包 } } return null; } - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer length) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, Integer length) { byteBuf.readBytes(length); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, length - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java new file mode 100644 index 0000000..5f1c177 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java @@ -0,0 +1,73 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.combined.GenericCombinedFieldResolver; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.CombinedFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class CombinedFieldConfigProvider { + + + /** + * 作为临时配置列表缓存使用 + */ + private final List combinedFieldConfigList; + private Map storeObjectMap = new HashMap<>(); + + public CombinedFieldConfigProvider(Long ruleId) { + CombinedFieldConfigRegistry combinedFieldConfigRegistry = SpringContextUtil.getBean(CombinedFieldConfigRegistry.class); + combinedFieldConfigList = combinedFieldConfigRegistry.getCombinedFieldConfigList(ruleId); + } + + public void parseDataField(RuleConfig ruleConfig, String clearZeroPlain,Map fieldConfigsMap ) { + if (showSkip()) { + return; + } + //匹配对应的数据,然后进行相关的字段解析 + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver(); + combinedFieldResolver.parseDataField(combinedFieldConfigList, byteBuf, storeObjectMap,fieldConfigsMap); + } + + + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getCombinedFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return combinedFieldConfigList.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public List getCombinedFieldConfigList() { + return combinedFieldConfigList; + } + + /* 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(combinedFieldConfigList) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java new file mode 100644 index 0000000..f3cfedc --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java @@ -0,0 +1,11 @@ +package com.casic.missiles.parser.provider; + +/** + * @author cz + * @date 2023-6-12 + */ +public class CommandEventProvider{ + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java new file mode 100644 index 0000000..70eec5e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java @@ -0,0 +1,77 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.safe.SafeStrategy; +import com.casic.missiles.parser.sender.DataSubscribeProvider; +import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class DatagramEventProvider { + + private final DatagramEventConfig processorInstance; + + public DatagramEventProvider(Long ruleId) { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + List datagramEventConfigList = + datagramEventRegistry.getDatagramEventList(ruleId); + processorInstance = this.getProcessorInstance(datagramEventConfigList); + } + + public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { + if (showSkip()) { + return null; + } + return datagramEventConfigList.get(0); + } + + // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 + public String getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap) { + String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? + processorInstance.getSafeBean() : + fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); + if (!StringUtils.isEmpty(safeName)) { + //需要加密 + SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); + String plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); + return clearComplementZero(plain); + } + return ByteBufUtil.hexDump(bizDataContent); + } + + //解密清零操作 + private String clearComplementZero(String plain) { + plain = plain.substring(0, plain.lastIndexOf("00")); + return plain; + } + + //数据发送,数据发送者暂未构建 + public void storeData(Map bizDataMap) { + DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); +// dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return ObjectUtils.isNotEmpty(processorInstance) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java new file mode 100644 index 0000000..7e1fe0a --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java @@ -0,0 +1,97 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.FieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class FieldConfigProvider { + + + private final List fieldConfigs; + private Map storeObjectMap = new HashMap<>(); +// private Map singleObjects = new ConcurrentHashMap<>(); + + public FieldConfigProvider(Long ruleId) { + FieldConfigRegistry fieldConfigRegistry = SpringContextUtil.getBean(FieldConfigRegistry.class); + fieldConfigs = fieldConfigRegistry.getFieldConfigList(ruleId); + } + + public List getFieldConfigs() { + return fieldConfigs; + } + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public Map parseDataField(RuleConfig ruleConfig, String clearZeroPlain) { + if (showSkip()) { + return null; + } + List prepareFieldConfig = prepareParseField(ruleConfig); + if (CollectionUtils.isNotEmpty(prepareFieldConfig)) { + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(fieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + return fixDataMap; + } + } + return null; + } + + /** + * 得到需要处理的业务内容 + * + * @return + */ + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return fieldConfigs.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public Map getFieldConfigsMap() { + return fieldConfigs.stream().collect( + Collectors.toMap(FieldConfig::getId, e -> e) + ); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(fieldConfigs) ? false : true; + } + + +} + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java new file mode 100644 index 0000000..817bfaf --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java @@ -0,0 +1,19 @@ +package com.casic.missiles.parser.provider; + +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.registry.FieldRuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; + +public class FieldRuleConfigProvider { + + private final List fieldRuleConfigList; + + public FieldRuleConfigProvider(Long ruleId) { + FieldRuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(FieldRuleConfigRegistry.class); + fieldRuleConfigList = ruleConfigRegistry.getFieldRuleConfigList(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java new file mode 100644 index 0000000..99a1b06 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java @@ -0,0 +1,53 @@ +package com.casic.missiles.parser.provider; + + +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.registry.ProtocolConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolConfigProvider { + + private final List protocolConfigList; + + public ProtocolConfigProvider(String firstChar) { + ProtocolConfigRegistry registry = SpringContextUtil.getBean(ProtocolConfigRegistry.class); + protocolConfigList = registry.getProtocolConfigList(firstChar); + } + + public List getMatchList() { + return protocolConfigList; + } + + /** + * 设置当前协议 + * + * @param protocolConfig + */ + public ProtocolConfigProvider(ProtocolConfig protocolConfig) { + List protocolConfigs = new ArrayList<>(); + protocolConfigs.add(protocolConfig); + protocolConfigList = protocolConfigs; + } + + /** + * 获取当前协议 + * + * @return + */ + public ProtocolConfig getCurrentProtocolConfig() { + if (this.protocolConfigList == null) { + return null; + } else { + return protocolConfigList.get(0); + } + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java new file mode 100644 index 0000000..043927d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java @@ -0,0 +1,213 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.registry.ProtocolFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolFieldConfigProvider { + + private static final String FIXED_FIELD_DS = "fixedFieldDs"; + private static final String CONTENT_FIELD_DS = "contentFieldDs"; + private static final String PROTOCOL_LENGTH = "protocolLength"; + private static final String PROTOCOL_FIELD_ID = "protocolFieldId"; + private static final String PROTOCOL_POSITION = "protocolPosition"; + + private final List protocolFieldConfigs; + private Map singleObjects = new ConcurrentHashMap<>(); + private Map storeObjectMap = new HashMap<>(); + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public ProtocolFieldConfigProvider(Long protocolId) { + ProtocolFieldConfigRegistry protocolFieldConfigRegistry = SpringContextUtil.getBean(ProtocolFieldConfigRegistry.class); + protocolFieldConfigs = protocolFieldConfigRegistry.getProtocolFieldConfigList(protocolId); + } + + public List getProtocolFieldConfigs() { + return protocolFieldConfigs; + } + + public ProtocolFieldConfig getFieldConfigById(Long fieldId) { + Optional optionalConfig = protocolFieldConfigs.stream().filter( + e -> e.getId().equals(fieldId) + ).findFirst(); + return optionalConfig.isPresent() ? optionalConfig.get() : null; + } + + public Integer getProtocolFieldValue(Long protocolFieldId, ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_FIELD_ID + protocolFieldId + ByteBufUtil.hexDump(byteBuf); + //获取缓存 + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + //加载固定长度数据集合 + Map fixDataMap = this.getProtocolDataMap(byteBuf); + ProtocolFieldConfig protocolFieldConfig = selectFieldConfig(protocolFieldId); + Integer protocolFieldValue = 0; + //获取约定字段的总长度 + if (fixDataMap.containsKey(protocolFieldConfig.getFieldName())) { + Object appointUnpackObject = fixDataMap.get(protocolFieldConfig.getFieldName()); + if (ObjectUtils.isNotEmpty(appointUnpackObject)) { + protocolFieldValue = (Integer) appointUnpackObject; + } + } + if (protocolFieldValue != null) { + //加入缓存 + if (ObjectUtils.isNotEmpty(protocolFieldValue)) { + this.singleObjects.put(catchKey, protocolFieldValue); + return protocolFieldValue; + } + } + return null; + } + + /** + * 获取帧固定位置信息 + * + * @param byteBuf + * @param protocolConfig + * @return + */ + public Map getFixedProperty(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_POSITION + protocolConfig.getId(); + if (this.singleObjects.containsKey(catchKey)) { + return (Map) singleObjects.get(catchKey); + } + Map fixedPropertyMap = new HashMap<>(); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + fixedPropertyMap = fieldParser.doGetFixedProperty(protocolFieldConfigs, this.getTotalLength(byteBuf,protocolConfig)); + if (CollectionUtils.isNotEmpty(fixedPropertyMap)) { + this.singleObjects.put(catchKey, fixedPropertyMap); + return fixedPropertyMap; + } + return fixedPropertyMap; + } + + /** + * 获取帧结构应有的总长度 + */ + public Integer getTotalLength(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_LENGTH + ByteBufUtil.hexDump(byteBuf); + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + Integer appointFrameLength = getProtocolFieldValue(protocolConfig.getTotalLengthId(), byteBuf); + if (appointFrameLength != null) { + //获取过滤的字段集合总长度 + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Integer totalFilterLength = fieldParser.getTotalFilterLength(protocolConfig, byteBuf, getFixFieldConfigMap()); + //计算总长度 + Integer totalLength = appointFrameLength + totalFilterLength; + //加入缓存 + if (ObjectUtils.isNotEmpty(totalLength)) { + this.singleObjects.put(catchKey, totalLength); + return totalLength; + } + } + return null; + } + + /** + * 获取协议有关字段解析内容 + * storeObjectMap存储代转存的数据 + * + * @return + */ + public Map getProtocolDataMap(ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(FIXED_FIELD_DS)) { + return (Map) singleObjects.get(FIXED_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(protocolFieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + this.singleObjects.put(FIXED_FIELD_DS, fixDataMap); + return fixDataMap; + } + return null; + } + + /** + * 获取业务报文内容的content字节 + * + * @param wholeDatagramByte + * @return + */ + public ByteBuf getDataContentBuf(ByteBuf wholeDatagramByte) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(CONTENT_FIELD_DS)) { + return (ByteBuf) singleObjects.get(CONTENT_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + ByteBuf bizDataByteBuf = fieldParser.getDataContentBuf(protocolFieldConfigs, wholeDatagramByte); + if (bizDataByteBuf != null) { + this.singleObjects.put(CONTENT_FIELD_DS, bizDataByteBuf); + return bizDataByteBuf; + } + return null; + } + + + private ProtocolFieldConfig selectFieldConfig(Long id) { + Optional optionalProtocolFieldConfig = this.protocolFieldConfigs.stream().filter( + e -> e.getId().equals(id) + ).findFirst(); + return optionalProtocolFieldConfig.isPresent() ? optionalProtocolFieldConfig.get() : null; + } + + + private Map getFixFieldConfigMap() { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, e -> e) + ); + return fixDataFieldMap; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(protocolFieldConfigs) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java new file mode 100644 index 0000000..dafba1c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java @@ -0,0 +1,56 @@ +package com.casic.missiles.parser.provider; + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.rule.GenericRuleResolver; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.RuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleConfigProvider { + + private final List ruleConfigs; + + public List getRuleConfigs() { + return ruleConfigs; + } + + public RuleConfigProvider(Long protocolId) { + RuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(RuleConfigRegistry.class); + ruleConfigs = ruleConfigRegistry.getRuleConfigById(protocolId); + } + + /** + * 获取规则匹配结果 + * + * @param parseFixedDataMap + * @param protocolFieldConfigs + * @return + */ + public RuleConfig doGetRule(Map parseFixedDataMap, + String ids, + List protocolFieldConfigs) { + if (showSkip()) { + return null; + } + RuleConfig ruleConfig = GenericRuleResolver.machRule(parseFixedDataMap, ids, protocolFieldConfigs, ruleConfigs); + return ruleConfig; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(ruleConfigs) ? false : true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java index 3c05891..856b399 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java @@ -1,18 +1,11 @@ package com.casic.missiles.parser.resolver; -import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.springframework.web.bind.annotation.RequestBody; -import javax.annotation.Resource; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -20,19 +13,17 @@ @Slf4j public class ByteMergeProvider { - @Resource - private FieldRuleEngineMapper fieldRuleEngineMapper; - //拿到所有的值合并到一个值 - public String resolveByteMerge(List valueList, String ruletypeId, String vaildRange) { + public static String resolveByteMerge(List valueList, String ruleTypeId, String vaildRange) { String values = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Map vaildMap = getValidRangeMap(vaildRange); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(ruletypeId); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } + //暂时不处理 +// fieldRuleEngine = fieldRuleConfigMapper.selectById(ruleTypeId); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } Map env2 = new HashMap(); for (int i = 0; i < valueList.size(); i++) { if (vaildMap.containsKey(i)) { @@ -47,7 +38,7 @@ } } - private Map getValidRangeMap(String vaildRange) { + private static Map getValidRangeMap(String vaildRange) { String[] range = vaildRange.split(","); Map vaildMap = new HashMap(); for (int i = 0; i < range.length; i++) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 8d821cd..85d6bbf 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -1,9 +1,12 @@ package com.casic.missiles.parser.resolver; +import com.casic.missiles.pojo.AbstractFieldConfig; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; import io.netty.buffer.ByteBuf; +import java.util.List; import java.util.Map; /** @@ -11,18 +14,14 @@ */ public interface FieldParser { -// Map fieldProcess(String protocolContent,); - Map dataParser(RuleConfig ruleConfig, String lightText,String protocolId); + Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength); - Map fixDataParser(String protocolId, ByteBuf buffer); + Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap); - Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf); + ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer); - ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer); - - ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer); - - Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer); + Integer getTotalFilterLength(ProtocolConfig protocolConfig, ByteBuf byteBuf, Map protocolFieldConfigMap); } + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java new file mode 100644 index 0000000..9e0c00e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java @@ -0,0 +1,52 @@ +package com.casic.missiles.parser.resolver; + +import com.casic.missiles.pojo.AbstractFieldConfig; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.util.List; + +public class FieldParserSupport { + + //分别计算bit和byte长度=> 合并长度 + protected Integer calculateLength(List fieldConfigList) { + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + Integer fixedLength = bytefixedLength + bitfixedLength / 8; + return fixedLength; + } + + //找到最大值=> 根据最大值计算业务数据下标 + protected Integer calculatePosition(List fieldConfigList) { + String rex = "[0-9]+"; + Integer max = -1; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) + && Integer.valueOf(fieldConfig.getOriginPositionByte()) > max) { + max = Integer.valueOf(fieldConfig.getOriginPositionByte()); + } + } + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) && fieldConfig.getOriginPositionByte().equals(max)) { + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + } + } + Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; + return maxFixedPosition; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java deleted file mode 100644 index dd3a6cd..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java +++ /dev/null @@ -1,170 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.ByteResolverParam; -import io.netty.buffer.ByteBuf; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -/** - * 字段解析管理总类 - */ -@Service -@Slf4j -@AllArgsConstructor -public class FieldResolver extends ByteMergeProvider { - - //1、字段截取 => 2、简单的字节解析和复杂的字节解析 - public Object filedParserManger(ByteBuf byteBuf, FieldConfig fieldConfig, Integer maxFixedPosition) { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - //最大固定位置不为空, - if (!ObjectUtil.isEmpty(maxFixedPosition)) { - orignPosition -= maxFixedPosition; - } - Object fieldValue = 0; - //待优化 - if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { - fieldValue = bitToResolver(byteBuf, fieldConfig); - } else { - ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); - fieldValue = parsingFields(fieldBytes, fieldConfig.getRuleJson()); - } - return fieldValue; - } - - //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, - //目前默认配置的规则设置暂不支持配置化,由实现完成 - private Object parsingFields(ByteBuf byteBuf, String ruleJson) { - Object fieldsResolveValue = null; - List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); - if (ObjectUtil.isEmpty(ruleMapList)) { - fieldsResolveValue = defaultResolveBuilder(byteBuf); - } else { - fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); - } - return fieldsResolveValue; - } - - private Object defaultResolveBuilder(ByteBuf byteBuf) { - Integer defaultResolveValue = 0; - for (int i = 0; i < byteBuf.writerIndex(); i++) { - defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; - } - return defaultResolveValue; - } - - //字段解析构建器(针对字节单位的) - //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 - // 字节归并结束或者规则结束=>继续根据规则进行判断 - private Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { - Object customizeResolveValue = null; - try { - List bytStrList = new ArrayList<>(); - //存放到数组里面 - for (int i = 0; i < byteBuf.writerIndex(); i++) { - bytStrList.add(byteBuf.readByte()); - } - int i = 0; - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - customizeResolveValue = this.resolveByteMerge(bytStrList, ruletypeId,vaildRange); - break; - } else { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - List tempBytStr = new ArrayList<>(); - for (int k = 0; i < bytStrList.size(); i++) { - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(k) - .value(bytStrList.get(k)) - .ruletypeId(ruletypeId).build(); - tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); - } - bytStrList = tempBytStr; - } - i++; - } - //字节归并到一起=>继续根据规则进行判断 - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(customizeResolveValue) - .ruletypeId(ruletypeId).build(); - customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(customizeResolveValue)); - return customizeResolveValue; - } catch (RuntimeException ex) { - log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); - return null; - } - } - - /** - * 1、单个字节情况表示字段 - * 2、多字节情况表示字段(暂未处理) - */ - private Object bitToResolver(ByteBuf byteBuf, FieldConfig fieldConfig) { - Object fieldValue = new Object(); - try { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - byte fields = 0x00; - if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); - } else { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); - } - - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { - if (!StringUtils.isEmpty(fieldConfig.getExactOrignPosition())) { - fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getExactOrignPosition())).byteValue() - >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); - } else { - fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); - } - } else { - fieldValue = Integer.valueOf(fields & 0xff); - } - if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { - return fieldValue; - } - List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); - int i = 0; - //字节归并到一起=>继续根据规则进行判断 - while (i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(fieldValue) - .ruletypeId(ruletypeId).build(); - fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(fieldValue)); - return fieldValue; - } catch (RuntimeException ex) { - log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); - return null; - } - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java new file mode 100644 index 0000000..1d2aeab --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java @@ -0,0 +1,36 @@ +package com.casic.missiles.parser.resolver.bytes; + +import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.mapper.FieldRuleConfigMapper; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.pojo.ByteResolverParam; +import com.googlecode.aviator.AviatorEvaluator; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; +//转换规则 +@Component("convert") +@AllArgsConstructor +@Slf4j +public class ByteRuleResolver implements ByteResolver { + + private final FieldRuleConfigMapper fieldRuleConfigMapper; + + @Override + public Object resolveOperationRule(ByteResolverParam byteResolverParam){ + FieldRuleConfig fieldRuleEngine=fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); + if(ObjectUtil.isEmpty(fieldRuleEngine)){ + return byteResolverParam.getValue(); + } + String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); + Map env2 = new HashMap(); + env2.put("value", (byte) byteResolverParam.getValue()); + String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); + return values; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java index 103821c..786b71c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java @@ -2,34 +2,34 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("logicalShift") +@Component("logicalShift") @AllArgsConstructor @Slf4j public class LogicalShiftResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //字节位移 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { Integer index = byteResolverParam.getIndex(); - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return byteResolverParam.getValue(); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java index 476747d..01149bd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("operation") +@Component("operation") @AllArgsConstructor @Slf4j public class OperationResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //混合运算,有常量或者乘除的缩放 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java index 0b82cf4..79abcce 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.casic.missiles.pojo.ByteResolverParam; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; //精度计算 -@Service("precision") +@Component("precision") @AllArgsConstructor @Slf4j public class PrecisionResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java deleted file mode 100644 index 5c3f332..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; -//转换规则 -@Service("convert") -@AllArgsConstructor -@Slf4j -public class RuleResolver implements ByteResolver { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam){ - RuleEvaluator fieldRuleEngine=fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); - if(ObjectUtil.isEmpty(fieldRuleEngine)){ - return byteResolverParam.getValue(); - } - String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); - Map env2 = new HashMap(); - env2.put("value", (byte) byteResolverParam.getValue()); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java new file mode 100644 index 0000000..d3bbd91 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java @@ -0,0 +1,15 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; + +import java.util.List; +import java.util.Map; +// 前导码匹配->长度字段 +public interface AbstractCombinedFieldProcessor { + + Map invoke(Map map, ByteBuf byteBuf, List combinedFieldConfigList, + Map fieldConfigsMap, Map storeObjectMap); + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java new file mode 100644 index 0000000..03c8480 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java @@ -0,0 +1,59 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-13 + */ +//依次递增进行数据的解析, +public class GenericCombinedFieldResolver { + + + //通过查询,字段长度长度随机 + public void parseDataField(List combinedFieldConfigList, ByteBuf byteBuf, + Map storeObjectMap, Map fieldConfigsMap) { + Integer frameLength = Integer.valueOf(ByteBufUtil.hexDump(byteBuf)); + //添加前置处理器 + com.casic.missiles.util.ClassUtil classUtil = new com.casic.missiles.util.ClassUtil(); + List abstractCombinedProcessors = classUtil.getSubClassList(AbstractCombinedFieldProcessor.class); + + Map fieldFixedMap = combinedFieldLeadCodeMap(combinedFieldConfigList); + //frameLength + Map combinedProcessorFields = null; + while (byteBuf.readableBytes() < frameLength) { + //一直处理 + for (AbstractCombinedFieldProcessor abstractCombinedProcessor : abstractCombinedProcessors) { + combinedProcessorFields = abstractCombinedProcessor.invoke(combinedProcessorFields, byteBuf, + combinedFieldConfigList, + fieldConfigsMap, storeObjectMap); + if (combinedProcessorFields == null || byteBuf.readableBytes() < frameLength) { + return; + } + } + + } + } + + /** + * 取出前导码匹配集合 + */ + private Map combinedFieldLeadCodeMap(List combinedFieldConfigList) { + Map fieldFixedMap = combinedFieldConfigList + .stream() + .collect(Collectors.toMap(CombinedFieldConfig::getPrefixCode, e -> e)); + return fieldFixedMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java new file mode 100644 index 0000000..643a934 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java @@ -0,0 +1,100 @@ +package com.casic.missiles.parser.resolver.fields; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.FieldParserSupport; +import com.casic.missiles.pojo.*; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 保存使用时最基本的信息,并且使用原型模式 + */ +@Slf4j +public class DefaultProtocolFieldParser extends FieldParserSupport implements FieldParser, FixedPropertyEnum { + + //通过传入的配置和报文进行字段解析 + @Override + public Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap) { + Map dataMap = new HashMap<>(); + for (AbstractFieldConfig protocolFieldConfig : protocolFieldConfigs) { + if (!ObjectUtils.isEmpty(protocolFieldConfig.getOriginPositionByte())) { + Object fieldValue = FieldResolver.parseField(buffer, protocolFieldConfig, null); + if (protocolFieldConfig.getIsStorage() == 1) { + storeObjectMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + dataMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + } + return dataMap; + } + + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength) { + Map fixedPropertyMap = new HashMap<>(); + Integer fixedLength = calculateLength(protocolFieldConfigs); + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + fixedPropertyMap.put(FIXED_POSITION, maxFixedPosition); + fixedPropertyMap.put(TOTAL_LENGTH, totalLength); + fixedPropertyMap.put(TAIL_POSITION, totalLength - fixedLength + maxFixedPosition); + return fixedPropertyMap; + } + + //** 获取业务内容的byteBuf + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer) { + //计算固定长度 + Integer fixedLength = calculateLength(protocolFieldConfigs); + //总长度获取 + String lightText = buffer.toString(Charset.forName("ISO-8859-1")); + Integer totalLength = lightText.length(); + //计算固定长度最大长度 + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + //计算数据报文内容 + ByteBuf bizDataFields = buffer.slice(maxFixedPosition - 1, (totalLength - fixedLength)); + return bizDataFields; + } + + /** + * 获取过滤字段的长度 + */ + @Override + public Integer getTotalFilterLength(ProtocolConfig protocolConfig, + ByteBuf byteBuf, + Map protocolFieldConfigMap) { + if (ByteBufUtil.hexDump(byteBuf).equals("")) { + return 0; + } + int totalFilterLength = 0; + String filterFields = protocolConfig.getTotalLengthFilterFields(); + try { + if (!StringUtils.isEmpty(filterFields)) { + String[] filterFieldList = filterFields.split(","); + for (String filterFieldId : filterFieldList) { + if (StringUtils.isNotEmpty(filterFieldId)) { + ProtocolFieldConfig fieldConfig = protocolFieldConfigMap.get(Long.valueOf(filterFieldId)); + //这里都是按字节计算,没有对位进行区分,可能会出现错误 + // 如果对位有需求,需要进一步跟进 + totalFilterLength += fieldConfig.getOffsetLength(); + } + } + } + return totalFilterLength; + } catch (Exception ex) { + log.error("报文确认分发阶段,获取报文总长度过滤长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); + } + return totalFilterLength; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java new file mode 100644 index 0000000..d51e887 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java @@ -0,0 +1,169 @@ +package com.casic.missiles.parser.resolver.fields; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.parser.resolver.ByteMergeProvider; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.AbstractFieldConfig; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.pojo.ByteResolverParam; +import io.netty.buffer.ByteBuf; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * 字段解析管理总类 + */ +@Slf4j +public class FieldResolver extends ByteMergeProvider { + + //1、字段截取 => 2、简单的字节解析和复杂的字节解析 + public static Object parseField(ByteBuf byteBuf,AbstractFieldConfig fieldConfig, Integer maxFixedPosition) { + Integer orignPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + //最大固定位置不为空, + if (!ObjectUtil.isEmpty(maxFixedPosition)) { + orignPosition -= maxFixedPosition; + } + Object fieldValue = 0; + //待优化 + if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { + fieldValue = doParseBitField(byteBuf, fieldConfig); + } else { + ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); + fieldValue = doParseByteField(fieldBytes, fieldConfig.getRuleJson()); + } + return fieldValue; + } + + //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, + //目前默认配置的规则设置暂不支持配置化,由实现完成 + private static Object doParseByteField(ByteBuf byteBuf, String ruleJson) { + Object fieldsResolveValue = null; + List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); + if (ObjectUtil.isEmpty(ruleMapList)) { + fieldsResolveValue = defaultResolveBuilder(byteBuf); + } else { + fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); + } + return fieldsResolveValue; + } + + private static Object defaultResolveBuilder(ByteBuf byteBuf) { + Integer defaultResolveValue = 0; + for (int i = 0; i < byteBuf.writerIndex(); i++) { + defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; + } + return defaultResolveValue; + } + + //字段解析构建器(针对字节单位的) + //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 + // 字节归并结束或者规则结束=>继续根据规则进行判断 + private static Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { + Object customizeResolveValue = null; + try { + List bytStrList = new ArrayList<>(); + //存放到数组里面 + for (int i = 0; i < byteBuf.writerIndex(); i++) { + bytStrList.add(byteBuf.readByte()); + } + int i = 0; + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { + if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + customizeResolveValue = resolveByteMerge(bytStrList, ruletypeId, vaildRange); + break; + } else { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + List tempBytStr = new ArrayList<>(); + for (int k = 0; i < bytStrList.size(); i++) { + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(k) + .value(bytStrList.get(k)) + .ruletypeId(ruletypeId).build(); + tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); + } + bytStrList = tempBytStr; + } + i++; + } + //字节归并到一起=>继续根据规则进行判断 + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(null) + .value(customizeResolveValue) + .ruletypeId(ruletypeId).build(); + customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); + i++; + } + System.out.println(JSON.toJSON(customizeResolveValue)); + return customizeResolveValue; + } catch (RuntimeException ex) { + log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); + return null; + } + } + + /** + * 1、单个字节情况表示字段 + * 2、多字节情况表示字段(暂未处理) + */ + private static Object doParseBitField(ByteBuf byteBuf,AbstractFieldConfig fieldConfig) { + Object fieldValue = new Object(); + try { + Integer orignPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + byte fields = 0x00; + if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { + fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); + } else { + fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); + } + + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { + if (!StringUtils.isEmpty(fieldConfig.getOriginPositionBit())) { + fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getOriginPositionBit())).byteValue() + >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); + } else { + fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); + } + } else { + fieldValue = Integer.valueOf(fields & 0xff); + } + if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { + return fieldValue; + } + List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); + int i = 0; + //字节归并到一起=>继续根据规则进行判断 + while (i < ruleMapList.size()) { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(null) + .value(fieldValue) + .ruletypeId(ruletypeId).build(); + fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); + i++; + } + System.out.println(JSON.toJSON(fieldValue)); + return fieldValue; + } catch (RuntimeException ex) { + log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); + return null; + } + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java deleted file mode 100644 index 35ae3d0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java +++ /dev/null @@ -1,183 +0,0 @@ -package com.casic.missiles.parser.resolver.fields; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufAllocator; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; -import org.springframework.util.ObjectUtils; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service("standard") -@AllArgsConstructor -@Slf4j -public class StandardFieldParser implements FieldParser { - - private final FieldConfigDao fieldConfigDao; - private final FieldResolver fieldResolver; - - //数据解析 - @Override - public Map dataParser(RuleConfig ruleConfig, String lightText, String protocolId) { - String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); - ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); - bufferContent.writeBytes(lightText.getBytes(Charset.forName("ISO-8859-1"))); - Map dataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - for (String dataFieldId : dataFieldIds) { - FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(dataFieldId); - if (!ObjectUtils.isEmpty(fieldConfig)) { - dataMap.put(fieldConfig.getFieldName(), String.valueOf(fieldResolver.filedParserManger(bufferContent, fieldConfig, maxFixedPosition))); - } - } - return dataMap; - } - - //数据解析 - @Override - public Map fixDataParser(String protocolId, ByteBuf buffer) { - List dataFieldIdList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Map dataMap = new HashMap<>(); - for (FieldConfig dataField : dataFieldIdList) { - if (!ObjectUtils.isEmpty(dataField.getOrignPosition())) { - Object fieldValue = (Integer) fieldResolver.filedParserManger(buffer, dataField, null); - dataMap.put(dataField.getFieldName(), fieldValue); - } - } - return dataMap; - } - - @Override - public Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf) { - if (ByteBufUtil.hexDump(byteBuf).equals("")) { - return 0; - } - String filterFields = protocolConfig.getTotalLengthFilterField(); - Integer totalLength = 0; - try { - FieldConfig totalFieldConfig = fieldConfigDao.getFieldConfigById(protocolConfig.getTotalLengthId()); - int totalFilterLength = 0; - if (!StringUtils.isEmpty(filterFields)) { - String[] filterFieldList = filterFields.split(","); - for (String filterField : filterFieldList) { - FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(filterField); - //这里都是按字节计算,没有对位进行区分,可能会出现错误 - - // 如果对位有需求,需要进一步跟进 - totalFilterLength += fieldConfig.getOffsetLength(); - } - } - totalLength = (Integer) fieldResolver.filedParserManger(byteBuf, totalFieldConfig, null) + totalFilterLength; - } catch (Exception ex) { - log.error("报文确认分发阶段,获取报文总长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); - } - return totalLength; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer) { - //业务内容 - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - String protocolId = String.valueOf(protocolConfig.getId()); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - //计算固定长度 - Integer fixedLength = calculateLength(fieldConfigList); -// Integer totalLength = this.getTotalLength(protocolConfig, buffer); - //总长度获取 - Integer totalLength = lightText.length(); - //计算固定长度最大长度 - Integer maxFixedPosition = calculatePosition(fieldConfigList); -// buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - //计算数据报文内容 - ByteBuf bizDataFields = buffer.slice(maxFixedPosition-1, (totalLength - fixedLength)); - return bizDataFields; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer) { - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - String protocolId = String.valueOf(protocolConfig.getId()); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer fixedLength = calculateLength(fieldConfigList); -// Integer totalLength = this.getTotalLength(protocolConfig, buffer); - Integer totalLength = lightText.length(); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - ByteBuf fixDataFields = buffer.slice(0, maxFixedPosition); - return fixDataFields; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer) { - String protocolId = String.valueOf(protocolConfig.getId()); - Map fixedPropertyMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer fixedLength = calculateLength(fieldConfigList); - Integer totalLength = this.getTotalLength(protocolConfig, buffer); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - fixedPropertyMap.put("fixedPosition", maxFixedPosition); - fixedPropertyMap.put("totalLength", totalLength); - fixedPropertyMap.put("tailPosition", totalLength - fixedLength + maxFixedPosition); - return fixedPropertyMap; - } - - //分别计算bit和byte长度=> 合并长度 - private Integer calculateLength(List fieldConfigList) { - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (FieldConfig fieldConfig : fieldConfigList) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - Integer fixedLength = bytefixedLength + bitfixedLength / 8; - return fixedLength; - } - - //找到最大值=> 根据最大值计算业务数据下标 - private Integer calculatePosition(List fieldConfigList) { - String rex = "[0-9]+"; - Integer max = -1; - for (FieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOrignPosition()) - && Integer.valueOf(fieldConfig.getOrignPosition()) > max) { - max = Integer.valueOf(fieldConfig.getOrignPosition()); - } - } - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (FieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOrignPosition()) && fieldConfig.getOrignPosition().equals(max)) { - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - } - } - Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; - return maxFixedPosition; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java new file mode 100644 index 0000000..d4ec6c7 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java @@ -0,0 +1,76 @@ +package com.casic.missiles.parser.rule; + +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import org.apache.commons.lang3.StringUtils; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class GenericRuleResolver { + + //根据前置字段的值,找到指定的规则 + //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 + //=>循环判断=>通过规则得到业务字段 + public static RuleConfig machRule(Map fixDataMap, + String ids, + List protocolFieldConfigs, + List ruleConfigs) { + List preRuleConfigList = getPreRuleList(ids, protocolFieldConfigs); + //获取前置规则字段 + final Map metaDataMap = getPreRuleFields(preRuleConfigList, fixDataMap); + //准备固定的字段集合 + Map fixDataFieldMap = getFixDataFieldMap(protocolFieldConfigs); + return RuleResolverCore.doMachRule(ruleConfigs, metaDataMap, fixDataMap, fixDataFieldMap); + } + + private static Map getFixDataFieldMap(List protocolFieldConfigs) { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, ProtocolFieldConfig::getFieldName) + ); + return fixDataFieldMap; + } + + + /** + * 查询前置规则的字段配置 + * + * @param ids + * @return + */ + private static List getPreRuleList(String ids, List protocolFieldConfigs) { + String[] idList = ids.split(","); + Map prepareMaps = new HashMap<>(); + for (String id : idList) { + if (StringUtils.isNotEmpty(id)) { + prepareMaps.put(Long.valueOf(id), ""); + } + } + List preRuleConfigList = protocolFieldConfigs + .stream() + .filter(e -> prepareMaps.containsKey(e.getId())) + .collect(Collectors.toList()); + return preRuleConfigList; + } + + /** + * 获取前置规则解析字段 + */ + private static Map getPreRuleFields(List preRuleFieldConfigList, Map fixDataMap) { + Map ruleFieldMap = new HashMap<>(); + preRuleFieldConfigList.stream() + .forEach( + preRuleFieldConfig -> { + String fieldName = preRuleFieldConfig.getFieldName(); + if (fixDataMap.containsKey(fieldName)) { + ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); + } + } + ); + return ruleFieldMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java new file mode 100644 index 0000000..baae7e8 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -0,0 +1,68 @@ +package com.casic.missiles.parser.rule; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.casic.missiles.pojo.RuleConfig; + +import java.util.*; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleResolverCore { + + + public static RuleConfig doMachRule(List ruleConfigList, Map metaDataMap, + Map fixDataMap, + Map fixDataFieldMap) { + Optional ruleConfigOptional = ruleConfigList.stream() + .filter(ruleConfig -> machRuleConfig( + JSON.parseObject(ruleConfig.getMatchRuleJson(), Map.class), metaDataMap)) + .findFirst(); + if (ObjectUtil.isEmpty(ruleConfigOptional)) { + return null; + } + String[] ruleFields = ruleConfigOptional.get().getDataFieldIds().split(","); + Map ruleMetaDataMap = getRuleFields(ruleFields, fixDataMap, fixDataFieldMap); + //递归选定解析规则,进行规则解析 + if (!ruleConfigOptional.get().getIsFinishMatch().equals("1")) { + //递归选定规则 + doMachRule(ruleConfigList, ruleMetaDataMap, fixDataMap, fixDataFieldMap); + } + return ruleConfigOptional.get(); + } + + + private static Map getRuleFields(String[] preRuleConfigList, Map fixedDataMap, + Map fixedFieldMap) { + Map ruleFieldMap = new HashMap<>(); + for (String preRuleConfigId : preRuleConfigList) { + String fieldName = fixedFieldMap.get(preRuleConfigId); + if (fixedDataMap.containsKey(fieldName)) { + ruleFieldMap.put(fieldName, String.valueOf(fixedDataMap.get(fieldName))); + } + } + return ruleFieldMap; + } + + + //匹配规则配置 + private static Boolean machRuleConfig(Map ruleMap, Map metaDataMap) { + if (ruleMap == null || metaDataMap == null) { + return null; + } + //所有的字段在规则里面必须有有配置 + for (String key : metaDataMap.keySet()) { + if (ruleMap.containsKey(key)) { + if (!ruleMap.get(key).equals(metaDataMap.get(key))) { + return false; + } + } else { + return false; + } + } + return true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java deleted file mode 100644 index 664088d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java +++ /dev/null @@ -1,92 +0,0 @@ -package com.casic.missiles.parser.rule; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.mapper.dao.PreRuleConfigDao; -import com.casic.missiles.mapper.dao.RuleConfigDao; -import lombok.AllArgsConstructor; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.*; -import java.util.stream.Collectors; - -@Service -@AllArgsConstructor -public class RulerProvider { - - private final FieldConfigDao fieldConfigDao; - private final PreRuleConfigDao preRuleConfigDao; - private final RuleConfigDao ruleConfigDao; - - //根据前置字段的值,找到指定的规则 - //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 - //=>循环判断=>通过规则得到业务字段 - public RuleConfig ruleConfig(Map fixDataMap, String protocolId) { - //批量获取规则 - List preRuleConfigList = preRuleConfigDao.getPreRuleList(protocolId); - //获取固定字段 - Map fixFieldMap = getAllFieldMap(protocolId); - //获取前置规则字段 - final String preRuleFields = getPreRuleFields(preRuleConfigList, fixDataMap, fixFieldMap); - List ruleConfigList = ruleConfigDao.getRuleConfigById(protocolId); - Optional ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig ->preRuleFields.equals( ruleConfig.getParseRuleJson())).findFirst(); - //递归选定解析规则,进行规则解析 - while (!ObjectUtil.isEmpty(ruleConfigOptional) && !ruleConfigOptional.get().getIsBizField().equals("1")) { - String ruleFields = getRuleFields(ruleConfigOptional.get().getDataFieldIds().split(","), fixDataMap, fixFieldMap); - ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig -> ruleConfig.getParseRuleJson().equals(ruleFields)).findFirst(); - } - return ruleConfigOptional.get(); - } - - /** - * 获取前置规则解析字段 - */ - private String getPreRuleFields(List preRuleConfigList, Map fixDataMap, Map fixFieldMap) { - Map ruleFieldMap= new HashMap<>(); - preRuleConfigList.stream() - .forEach( - preRuleConfig -> { - String fieldName = fixFieldMap.get(Long.valueOf(preRuleConfig.getRuleFieldId())); - if (fixDataMap.containsKey(fieldName)) { - ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); - } - } - ); - return JSONObject.toJSONString(ruleFieldMap); - } - - private Map getAllFieldMap(String protocolId) { - List fieldList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Map fixFieldMap = fieldList.stream().collect( - Collectors.toMap(FieldConfig::getId, FieldConfig::getFieldName) - ); - return fixFieldMap; - } - - private String getRuleFields(String[] preRuleConfigList, Map fixDataMap, Map fixFieldMap) { - Map ruleFieldMap= new HashMap<>(); - for (String preRuleConfigId : preRuleConfigList) { - String fieldName = fixFieldMap.get(preRuleConfigId); - if (fixDataMap.containsKey(fieldName)) { - ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); - } - } - return JSONObject.toJSONString(ruleFieldMap); - } - - //弃置 - private String ListToString(List ruleFieldList) { - String ruleFields = ""; - for (String ruleField : ruleFieldList) { - ruleFields += ruleField + ","; - } - ruleFields = StringUtils.isEmpty(ruleFields) ? ruleFields : ruleFields.substring(0, ruleFields.length() - 1); - return ruleFields; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java index 6177e10..bfa87a5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java @@ -2,7 +2,7 @@ public interface SafeStrategy { - String decryption(byte[] bytes); + String decryption(String cipher); String encryption(String lightText); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java index 618716c..6236302 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java @@ -9,9 +9,9 @@ //十六进制的字符串转换成字节数组 byte[] bytes = hexStrToBinaryStr(msg); //计算CRC8 - byte crc8 = CRC8(bytes, 0, bytes.length); - String crc8ToStr = "" + Integer.toHexString(0xff & crc8); - return crc8ToStr; +// String crc8ToStr = "" + Integer.toHexString(0xff & crc8); +// return crc8ToStr; + return null; } /** @@ -33,50 +33,5 @@ return bytes; } - /** - * CRC8 校验 多项式 x8+x2+x+1 - * - * @param b - * @param off - * @param len - * @return - */ - public static byte CRC8(final byte[] b, final int off, final int len) { - byte result = 0x00; - for (int i = 0; i < len; i++) { - result = CHECKSUM_TABLE[(result ^ (b[i + off] & 0xFF)) & 0xFF]; - } - return (byte) (result & 0xFFL); - } - - private final static byte[] CHECKSUM_TABLE = {(byte) 0x00, (byte) 0x07, (byte) 0x0e, (byte) 0x09, (byte) 0x1c, (byte) 0x1b, - (byte) 0x12, (byte) 0x15, (byte) 0x38, (byte) 0x3f, (byte) 0x36, (byte) 0x31, (byte) 0x24, (byte) 0x23, (byte) 0x2a, - (byte) 0x2d, (byte) 0x70, (byte) 0x77, (byte) 0x7e, (byte) 0x79, (byte) 0x6c, (byte) 0x6b, (byte) 0x62, (byte) 0x65, - (byte) 0x48, (byte) 0x4f, (byte) 0x46, (byte) 0x41, (byte) 0x54, (byte) 0x53, (byte) 0x5a, (byte) 0x5d, (byte) 0xe0, - (byte) 0xe7, (byte) 0xee, (byte) 0xe9, (byte) 0xfc, (byte) 0xfb, (byte) 0xf2, (byte) 0xf5, (byte) 0xd8, (byte) 0xdf, - (byte) 0xd6, (byte) 0xd1, (byte) 0xc4, (byte) 0xc3, (byte) 0xca, (byte) 0xcd, (byte) 0x90, (byte) 0x97, (byte) 0x9e, - (byte) 0x99, (byte) 0x8c, (byte) 0x8b, (byte) 0x82, (byte) 0x85, (byte) 0xa8, (byte) 0xaf, (byte) 0xa6, (byte) 0xa1, - (byte) 0xb4, (byte) 0xb3, (byte) 0xba, (byte) 0xbd, (byte) 0xc7, (byte) 0xc0, (byte) 0xc9, (byte) 0xce, (byte) 0xdb, - (byte) 0xdc, (byte) 0xd5, (byte) 0xd2, (byte) 0xff, (byte) 0xf8, (byte) 0xf1, (byte) 0xf6, (byte) 0xe3, (byte) 0xe4, - (byte) 0xed, (byte) 0xea, (byte) 0xb7, (byte) 0xb0, (byte) 0xb9, (byte) 0xbe, (byte) 0xab, (byte) 0xac, (byte) 0xa5, - (byte) 0xa2, (byte) 0x8f, (byte) 0x88, (byte) 0x81, (byte) 0x86, (byte) 0x93, (byte) 0x94, (byte) 0x9d, (byte) 0x9a, - (byte) 0x27, (byte) 0x20, (byte) 0x29, (byte) 0x2e, (byte) 0x3b, (byte) 0x3c, (byte) 0x35, (byte) 0x32, (byte) 0x1f, - (byte) 0x18, (byte) 0x11, (byte) 0x16, (byte) 0x03, (byte) 0x04, (byte) 0x0d, (byte) 0x0a, (byte) 0x57, (byte) 0x50, - (byte) 0x59, (byte) 0x5e, (byte) 0x4b, (byte) 0x4c, (byte) 0x45, (byte) 0x42, (byte) 0x6f, (byte) 0x68, (byte) 0x61, - (byte) 0x66, (byte) 0x73, (byte) 0x74, (byte) 0x7d, (byte) 0x7a, (byte) 0x89, (byte) 0x8e, (byte) 0x87, (byte) 0x80, - (byte) 0x95, (byte) 0x92, (byte) 0x9b, (byte) 0x9c, (byte) 0xb1, (byte) 0xb6, (byte) 0xbf, (byte) 0xb8, (byte) 0xad, - (byte) 0xaa, (byte) 0xa3, (byte) 0xa4, (byte) 0xf9, (byte) 0xfe, (byte) 0xf7, (byte) 0xf0, (byte) 0xe5, (byte) 0xe2, - (byte) 0xeb, (byte) 0xec, (byte) 0xc1, (byte) 0xc6, (byte) 0xcf, (byte) 0xc8, (byte) 0xdd, (byte) 0xda, (byte) 0xd3, - (byte) 0xd4, (byte) 0x69, (byte) 0x6e, (byte) 0x67, (byte) 0x60, (byte) 0x75, (byte) 0x72, (byte) 0x7b, (byte) 0x7c, - (byte) 0x51, (byte) 0x56, (byte) 0x5f, (byte) 0x58, (byte) 0x4d, (byte) 0x4a, (byte) 0x43, (byte) 0x44, (byte) 0x19, - (byte) 0x1e, (byte) 0x17, (byte) 0x10, (byte) 0x05, (byte) 0x02, (byte) 0x0b, (byte) 0x0c, (byte) 0x21, (byte) 0x26, - (byte) 0x2f, (byte) 0x28, (byte) 0x3d, (byte) 0x3a, (byte) 0x33, (byte) 0x34, (byte) 0x4e, (byte) 0x49, (byte) 0x40, - (byte) 0x47, (byte) 0x52, (byte) 0x55, (byte) 0x5c, (byte) 0x5b, (byte) 0x76, (byte) 0x71, (byte) 0x78, (byte) 0x7f, - (byte) 0x6a, (byte) 0x6d, (byte) 0x64, (byte) 0x63, (byte) 0x3e, (byte) 0x39, (byte) 0x30, (byte) 0x37, (byte) 0x22, - (byte) 0x25, (byte) 0x2c, (byte) 0x2b, (byte) 0x06, (byte) 0x01, (byte) 0x08, (byte) 0x0f, (byte) 0x1a, (byte) 0x1d, - (byte) 0x14, (byte) 0x13, (byte) 0xae, (byte) 0xa9, (byte) 0xa0, (byte) 0xa7, (byte) 0xb2, (byte) 0xb5, (byte) 0xbc, - (byte) 0xbb, (byte) 0x96, (byte) 0x91, (byte) 0x98, (byte) 0x9f, (byte) 0x8a, (byte) 0x8d, (byte) 0x84, (byte) 0x83, - (byte) 0xde, (byte) 0xd9, (byte) 0xd0, (byte) 0xd7, (byte) 0xc2, (byte) 0xc5, (byte) 0xcc, (byte) 0xcb, (byte) 0xe6, - (byte) 0xe1, (byte) 0xe8, (byte) 0xef, (byte) 0xfa, (byte) 0xfd, (byte) 0xf4, (byte) 0xf3}; } \ No newline at end of file diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java index 27c2838..6e078a3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java @@ -1,9 +1,6 @@ package com.casic.missiles.parser.safe.impl; -import cn.hutool.core.util.CharsetUtil; -import cn.hutool.crypto.symmetric.SM4; -import cn.hutool.crypto.symmetric.SymmetricCrypto; - +import com.casic.missiles.parser.safe.SafeStrategy; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; @@ -11,19 +8,44 @@ import org.bouncycastle.crypto.engines.SM4Engine; import org.bouncycastle.crypto.params.KeyParameter; import org.bouncycastle.util.encoders.Hex; - -import static cn.hutool.crypto.Mode.ECB; -import static cn.hutool.crypto.Padding.NoPadding; +import org.springframework.stereotype.Component; /** * SM4算法工具类 */ @Slf4j -public class Sm4 { +@Component("sm4") +public class Sm4 implements SafeStrategy { //加解密的字节快大小 public static final int BlockSize = 16; + @Override + public String decryption(String cipher) { + byte[] keyByte = { + 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 + }; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(keyByte); + byte[] in = Hex.decode(cipher); + byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); + String plain = EcbDecrypt(in, keyBytes); + return plain; + } + + @Override + public String encryption(String cipher) { + byte[] keyByte = { + 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 + }; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(keyByte); + byte[] in = Hex.decode(cipher); + byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); + String plain = EcbDecrypt(in, keyBytes); + return plain; + } + /** * SM4ECB加密算法,对内 * @@ -32,8 +54,6 @@ * @return */ private static byte[] ecb_encrypt(byte[] in, byte[] keyBytes) { - - SM4Engine sm4Engine = new SM4Engine(); sm4Engine.init(true, new KeyParameter(keyBytes)); byte[] out = new byte[in.length]; @@ -58,27 +78,6 @@ return cipher; } - - /** - * hutool 解密SM4 - * - * @param encodeContent - * @return - */ - public static String decode(String encodeContent) { - String key = "24ad182507479a5da3ad94d9d78ea203"; - try { - SymmetricCrypto sm4 = new SM4(ECB, NoPadding, key.getBytes()); - String decryptStr = sm4.decryptStr(encodeContent, CharsetUtil.CHARSET_UTF_8); - return decryptStr; - } catch (Exception e) { - e.printStackTrace(); - log.error("SM4解密失败"); - } - return null; - } - - /** * SM4的ECB加密算法 * @@ -129,20 +128,6 @@ return plain; } - /** - * SM4的ECB解密算法 - * - * @param cipher 输入的密文字符串 - * @param key 密钥 - * @return - */ - public static String EcbDecrypt(String cipher, String key) { - byte[] in = Hex.decode(cipher); - byte[] keyBytes = Hex.decode(key); - - String plain = EcbDecrypt(in, keyBytes); - return plain; - } /** * 主函数 @@ -151,28 +136,24 @@ */ public static void main(String[] args) { byte[] ciphertext = { + 0x4B, (byte) 0x8C, (byte) 0x9D, 0x08, (byte) 0xE4, (byte) 0xD3, 0x64, 0x42, (byte) 0xB9, (byte) 0xA5, (byte) 0xFE, (byte) 0xCD, (byte) 0x91, 0x1B, 0x38, (byte) 0xAC, (byte) 0xE9, 0x1C, (byte) 0xCD, 0x53, 0x02, (byte) 0xD7, 0x0C, (byte) 0x9B, (byte) 0x96, 0x30, 0x62, (byte) 0xE8, (byte) 0xFB, (byte) 0xEF, (byte) 0xB9, (byte) 0xFF, (byte) 0xDE, 0x19, (byte) 0x80, 0x35, 0x3E, (byte) 0x90, 0x4F, 0x2F, 0x12, 0x2B, 0x19, (byte) 0x8B, 0x6C, 0x7A, (byte) 0x85, (byte) 0xA1, (byte) 0xB1, (byte) 0x86, (byte) 0xA3, 0x7A, 0x46, 0x0C, 0x2F, (byte) 0x94, 0x4F, 0x7F, 0x2C, 0x56, 0x14, (byte) 0xF3, (byte) 0x89, (byte) 0xC3, - 0x3F, 0x20, (byte) 0xF9, (byte) 0x87, (byte) 0xA1, 0x60, (byte) 0xD9, (byte) 0xA8, (byte) 0xFD, (byte) 0xD7, (byte) 0x9B, 0x4B, 0x26, 0x06, 0x30, 0x44}; + 0x3F, 0x20, (byte) 0xF9, (byte) 0x87, (byte) 0xA1, 0x60, (byte) 0xD9, (byte) 0xA8, (byte) 0xFD, (byte) 0xD7, (byte) 0x9B, 0x4B, 0x26, 0x06, 0x30, 0x44 + }; ByteBuf in = ByteBufAllocator.DEFAULT.heapBuffer(); in.writeBytes(ciphertext); - byte[] keyByte = { 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 }; ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); - key.writeBytes(ciphertext); - String resCipherData = decode(ByteBufUtil.hexDump(in)); - ByteBuf out = ByteBufAllocator.DEFAULT.heapBuffer(); -// out.writeBytes(resCipherData); -// System.out.println(hexBytes); - System.out.println(resCipherData.toString()); -// String resPlainData = EcbDecrypt(resCipherData, key); -// System.out.println("原始明文:" + data); -// System.out.println("解密后明文:" + resPlainData); + key.writeBytes(keyByte); +// String resCipherData = EcbDecrypt(ByteBufUtil.hexDump(in), ByteBufUtil.hexDump(key)); +// System.out.println(resCipherData); } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java index 1395a51..ac5f957 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java @@ -1,7 +1,7 @@ package com.casic.missiles.parser.safe.impl; import io.netty.buffer.ByteBufUtil; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** *

@@ -14,9 +14,8 @@ * @author hyl * @version v1.0: Tea.java, v 0.1 2021/3/12 13:48 $ */ -@Service("tea") -///tea算法类 - +//tea算法类 +@Component("tea") public class Tea { public static byte[] MyTea_Encrypt(byte[] MyTeaContent, int ByteLen, byte[] MyTeakey) { @@ -99,7 +98,6 @@ // for(int i32Index = 0; i32Index < 8; i32Index++) { // System.out.print("0x" + Integer.toHexString(MyContent[i32Index]) + " "); // } - // System.out.println("密钥为:"); // for(int i32Index = 0; i32Index < 16; i32Index++) { // System.out.print("0x" + Integer.toHexString(MyKeys[i32Index]) + " "); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java index bdd0721..bd1516a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java @@ -3,7 +3,7 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.parser.sender.DataSubscribeProvider; import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponents; import org.springframework.web.util.UriComponentsBuilder; @@ -12,7 +12,7 @@ import java.util.Collections; import java.util.Map; -@Service("functionCallback") +@Component("functionCallback") public class FunctionCallback implements DataSubscribeProvider { @Resource diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java index 0b44fb9..7526de2 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.Map; -@Service("middleware") +@Component("middleware") public class MiddlewareSubscribe implements DataSubscribeProvider { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java index 5dcee3f..e2f1192 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.Map; -@Service("nosql") +@Component("nosql") public class NoSqlSubscribe implements DataSubscribeProvider { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java index 608af3a..32cc8a4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java @@ -2,48 +2,47 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.delivery.decorator.ByteDecorator; +import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @AllArgsConstructor public class FieldDecoratorManger { - private final RuleDictDao ruleDictDao; + private final RuleConfigRegistry ruleDictDao; // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 // (1)静态的业务字段是字典里面可以配置的 // (2)动态的业务字段是通过规则生成的 public String contentMerge(String ruleJson, String sceneConent, String dynamicContent) { - List ruleDictList = ruleDictDao.getRuleDictConfig(); - Map ruleDictMap = ruleDictList.stream().collect( - Collectors.toMap(RuleDict::getId, e -> e)); - List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); - for (Map ruleMap : ruleMapList) { - String ruleType = String.valueOf(ruleMap.get("ruleType")); - ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); - NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); - byteDecorator.nodeDecoratorRule(nodeDecoratorParm); - } +// List ruleDictList = ruleDictDao.getRuleDictConfig(); +// Map ruleDictMap = ruleDictList.stream().collect( +// Collectors.toMap(RuleDict::getId, e -> e)); +// List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); +// for (Map ruleMap : ruleMapList) { +// String ruleType = String.valueOf(ruleMap.get("ruleType")); +// ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); +// NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); +// byteDecorator.nodeDecoratorRule(nodeDecoratorParm); +// } return null; } - - private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { - NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() - .contents(sceneConent) - .dynamicContent(dynamicContent) - .ruletypeId(ruletypeId) - .ruleDictMap(ruleDictMap) - .build(); - return nodeDecoratorParm; - } +// +// private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { +// NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() +// .contents(sceneConent) +// .dynamicContent(dynamicContent) +// .ruletypeId(ruletypeId) +// .ruleDictMap(ruleDictMap) +// .build(); +// return nodeDecoratorParm; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java index 652970c..b204ac3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java @@ -1,56 +1,56 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@AllArgsConstructor -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", - JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Component; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Component("logicalDecorator") +//@AllArgsConstructor +//@Slf4j +//public class LogicalShiftDecorator implements ByteDecorator { +// +//// private final FieldRuleEngineMapper fieldRuleEngineMapper; +//// +//// //字节位移 +//// @Override +//// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +//// String logicalValue = ""; +//// RuleEvaluator fieldRuleEngine = new RuleEvaluator(); +//// try { +//// Map env2 = new HashMap(); +//// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +//// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +//// for (String contentId : contentIdList) { +//// RuleDict ruleDict = ruleDictMap.get(contentId); +//// if (ruleDict.getCode().contains("#")) { +//// //使用动态的值 +//// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +//// } +//// env2.put(ruleDict.getName(), ruleDict.getCode()); +//// } +//// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +//// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +//// return null; +//// } +//// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +//// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +//// return values; +//// } catch (Exception ex) { +//// log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", +//// JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +//// return null; +//// } +//// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java index 346468f..822fead 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@AllArgsConstructor -@Slf4j -public class OperationDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("optionDecorator") +//@AllArgsConstructor +//@Slf4j +//public class OperationDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //混合运算,有常量或者乘除的缩放 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java index 50fb0a7..7a8bccb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@AllArgsConstructor -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +////精度计算 +//@AllArgsConstructor +//@Registry("precisionDecorator") +//@Slf4j +//public class PrecisionDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java index da39235..27f9cc7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java @@ -1,54 +1,53 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@AllArgsConstructor -@Slf4j -public class RuleDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("ruleDecorator") +//@AllArgsConstructor +//@Slf4j +//public class RuleDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //吃我一套正则表达式 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (Exception ex) { +// log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java index 7f5cbf3..c043f97 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java @@ -2,6 +2,6 @@ import java.util.Map; -public interface ComandeEventService { +public interface ComandeEventService{ Map loadComandeEventConfig(String protocolId,String scene); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java index 476ad84..aaf1837 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java @@ -2,46 +2,46 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.dao.CommandEventDao; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @Slf4j @AllArgsConstructor -public class ComandeEventServiceImpl implements ComandeEventService { +public class ComandeEventServiceImpl implements ComandeEventRegistry { - private final CommandEventDao commandEventDao; + // private final CommandEventDao commandEventDao; // 加密bean 固定字段出现变化的字段解析,业务字段的有序内容 @Override - public Map loadComandeEventConfig(String protocolId,String sceneName) { - CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); - if (ObjectUtil.isEmpty(commandEventConfig)) { - log.error("协议{},没有配置成功接收回复配置,清排查原因"); - return null; - } - String replyJson = commandEventConfig.getReplyContentJson(); - List> replyMapList = JSONArray.parseObject(replyJson, List.class); - List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); - Map fixMap = fixList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); - List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) - .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) - .collect(Collectors.toList()); - Map commandConfigMap = new HashMap<>(); - commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); - commandConfigMap.put("fixContent", fixMap); - commandConfigMap.put("bizContent", contentList); - return commandConfigMap; + public Map loadComandeEventConfig(String protocolId, String sceneName) { +// CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); +// if (ObjectUtil.isEmpty(commandEventConfig)) { +// log.error("协议{},没有配置成功接收回复配置,清排查原因"); +// return null; +// } +// String replyJson = commandEventConfig.getReplyContentJson(); +// List> replyMapList = JSONArray.parseObject(replyJson, List.class); +// List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); +// Map fixMap = fixList.stream() +// .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); +// List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) +// .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) +// .collect(Collectors.toList()); +// Map commandConfigMap = new HashMap<>(); +// commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); +// commandConfigMap.put("fixContent", fixMap); +// commandConfigMap.put("bizContent", contentList); +// return commandConfigMap; + return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 128b09d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java deleted file mode 100644 index 4016b0b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface DatagramEventMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java deleted file mode 100644 index 597c306..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.apache.ibatis.annotations.Mapper; - -public interface FieldConfigMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java deleted file mode 100644 index a31680a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.PreRuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface PreRuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java deleted file mode 100644 index 9060a69..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface ProtocolConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java deleted file mode 100644 index 6fa6936..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java deleted file mode 100644 index 582a705..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleDict; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleDictMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java deleted file mode 100644 index 6e302c8..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.CommandEventMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Optional; - -@Component -public class CommandEventDao { - - @Resource - private CommandEventMapper commandEventMapper; - - public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId) - .eq("scene", sceneName) - .eq("enabled", 1); - List commandEventConfig = commandEventMapper.selectList(queryWrapper); - Optional optionalEventConfig = commandEventConfig.stream().findFirst(); - return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java deleted file mode 100644 index 9137e4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.FieldConfigMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class FieldConfigDao { - - @Resource - private FieldConfigMapper fieldConfigMapper; - - public FieldConfig getFieldConfigById(String fieldId) { - FieldConfig fieldConfig = fieldConfigMapper.selectById(fieldId); - return fieldConfig; - } - - public List getFieldConfigs(String protocolId,Integer isFixed) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",isFixed); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - - public List getStorageFieldConfig(String protocolId) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",1) - .eq("is_storage",1); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java deleted file mode 100644 index 67bff6b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.mapper.PreRuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class PreRuleConfigDao { - - @Resource - private PreRuleConfigMapper preRuleConfigMapper; - - public List getPreRuleList(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return preRuleConfigMapper.selectList(queryWrapper); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java deleted file mode 100644 index d69ea85..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.RuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleConfigDao { - - @Resource - private RuleConfigMapper ruleConfigMapper; - - public RuleConfig getNextRuleConfig(String ruleFields) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("parse_rule_json", ruleFields); - return ruleConfigMapper.selectOne(queryWrapper); - } - - - public List getRuleConfigById(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return ruleConfigMapper.selectList(queryWrapper); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java deleted file mode 100644 index 932c185..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.RuleDictMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleDictDao { - - @Resource - private RuleDictMapper ruleDictMapper; - - public List getRuleDictConfig() { - List ruleDictList = ruleDictMapper.selectList(null); - return ruleDictList; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java index 9f9e279..43bc4d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java @@ -10,20 +10,15 @@ import io.netty.channel.socket.nio.NioServerSocketChannel; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import javax.annotation.PreDestroy; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static cn.hutool.core.util.ClassUtil.getClasses; /** * SensorhubServer netty服务端 */ @Slf4j -@Service +@Component public class SensorhubServer { /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java index 2c79ff5..9a28c36 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java @@ -11,13 +11,13 @@ import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioSocketChannel; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClient 客户端 */ @Slf4j -@Service +@Registry public final class SensorhubClient { public static void main(String[] args) throws Exception { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java index 9774be0..477c3f7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java @@ -6,12 +6,12 @@ import io.netty.channel.socket.SocketChannel; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientChannelInitialHandler */ -@Service +@Registry public class SensorhubClientChannelInitialHandler extends ChannelInitializer { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java index 346f4b3..73560e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java @@ -5,13 +5,13 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientHandler */ @Slf4j -@Service +@Registry public class SensorhubClientHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java index 5c1c6f2..d990af5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java @@ -4,12 +4,12 @@ import com.casic.missiles.pojo.Msg; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** * SensorhubServerHandler */ -@Service +@Component public class SensorhubServerHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 67283ae..af3172c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,41 +1,37 @@ package com.casic.missiles.parser; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultProtocolConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.*; +import com.casic.missiles.registry.FieldConfigRegistry; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; -import java.nio.charset.Charset; import java.util.HashMap; import java.util.List; import java.util.Map; -@Service("genericProtocolParser") +/** + * @author + */ +@Component("genericProtocolParser") @Slf4j -@AllArgsConstructor +@RequiredArgsConstructor public class GenericProtocolParser implements ProtocolParser { - private final LeadingCodeMatcher leadingCodeMatcher; private final List frameStructDispenserList; - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorInstanceSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; // 匹配首字母前导码=> 帧结构匹配前导码=> // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 @@ -44,18 +40,19 @@ public Boolean doParseProtocol(ByteBuf byteBuf) { String protocolContent = ByteBufUtil.hexDump(byteBuf); //匹配前导码 - List preCodeConfigs = leadingCodeMatcher.matchLeadingCode(protocolContent); + List preCodeConfigs = LeadingCodeMatcher.matchFrameLeadingCode(protocolContent); //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 if (preCodeConfigs.size() == 0) { - return rematch(byteBuf,protocolContent); + return rematch(byteBuf, protocolContent); } - //暂时先取第一个 + //暂时先取第一个,提升速度,使用享元模式, 减少类的创建销毁与构建 ProtocolConfig protocolConfig = preCodeConfigs.get(0); + AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); ByteBuf wholeDatagramByte = null; //通过匹配帧结构获取完整的数据包 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, preCodeConfigs.get(0))) != null) { + if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, protocolFactory)) != null) { break; } } @@ -68,76 +65,78 @@ * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 */ - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId, wholeDatagramByte); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap, protocolId); - //选取规则对应的流程实例 - DatagramEventConfig datagramEventConfig = processorInstanceSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); + //进行规则字段解析,进行匹配规则 + RuleConfig ruleConfig = getRuleConfig(protocolFactory, wholeDatagramByte); + if (ruleConfig == null) { + return false; + } //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, wholeDatagramByte); + ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte); + //以下进行业务的规则解析,同时选定流程实例 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); + DatagramEventProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain, + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText, protocolId); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain); //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); + datagramEventProvider.storeData(bizDataMap); return true; } - private Boolean rematch(ByteBuf byteBuf,String protocolContent) { + /** + * 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 + */ + private Boolean rematch(ByteBuf byteBuf, String protocolContent) { //重置位判断 byteBuf.resetReaderIndex(); //判断重置是否前移,如果没有前移,则直接判为匹配失败 if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { return false; } else { + //递归执行 return doParseProtocol(byteBuf); } } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; + //获取匹配规则->匹配规则 + private RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + //取出其中参与逻辑provider并判空 + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); + String rulePrepareFields = protocolConfig.getRulePrepareFields(); + //固定字段 + if (StringUtils.isNotEmpty(rulePrepareFields)) { + //获取统一固定字段解析 + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + //获取该协议的字段配置,用于协议规则匹配 + List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); + //获取规则 + RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, + rulePrepareFields, protocolFieldConfigs); + return ruleConfig; + } + return null; } - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + //数据构建,获取固定字段的store和业务字段store + private Map buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + Map bizDataMap = new HashMap<>(); + Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); + Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); + bizDataMap.putAll(ruleStoreObjectMap); + bizDataMap.putAll(protocolStoreObjectMap); return bizDataMap; } - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java index 8a46e32..16ce2e5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java @@ -3,6 +3,7 @@ import io.netty.buffer.ByteBuf; public interface ProtocolParser { + Boolean doParseProtocol(ByteBuf byteBuf); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java new file mode 100644 index 0000000..f7814af --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java @@ -0,0 +1,35 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.ProtocolConfigProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.ProtocolConfig; + +/** + * 存放基本协议的的加载信息 + */ +public class AbstractProtocolConfigFactory { + private final ProtocolConfigProvider protocolConfigProvider; + private final ProtocolFieldConfigProvider protocolFieldConfigProvider; + private final RuleConfigProvider ruleConfigProvider; + + public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { + this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); + this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); + this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); + } + + public ProtocolConfigProvider getProtocolConfigProvider() { + return protocolConfigProvider; + } + + public ProtocolFieldConfigProvider getProtocolFieldConfigProvider() { + return protocolFieldConfigProvider; + } + + public RuleConfigProvider getRuleConfigProvider() { + return ruleConfigProvider; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java new file mode 100644 index 0000000..6e36147 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java @@ -0,0 +1,57 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.CombinedFieldConfigProvider; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.FieldConfigProvider; +import com.casic.missiles.parser.provider.FieldRuleConfigProvider; + +/** + * 存放规则相关的的的加载信息 + */ +public class AbstractRuleConfigFactory { + + /** + * 处理字节 + */ + private final FieldConfigProvider fieldConfigProvider; + /** + * 处理组合字节解析的解码器 + */ + private final CombinedFieldConfigProvider combinedFieldConfigProvider; + /** + * 处理负责字节解析的规则配置 + */ + private final FieldRuleConfigProvider fieldRuleConfigProvider; + /** + * 处理实例流程 + */ + private final DatagramEventProvider datagramEventProvider; + + + public AbstractRuleConfigFactory(Long ruleId) { + this.fieldConfigProvider = new FieldConfigProvider(ruleId); + this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); + this.fieldRuleConfigProvider = new FieldRuleConfigProvider(ruleId); + this.datagramEventProvider = new DatagramEventProvider(ruleId); + } + + public FieldConfigProvider getFieldConfigProvider() { + return fieldConfigProvider; + } + + public CombinedFieldConfigProvider getCombinedFieldConfigProvider() { + return combinedFieldConfigProvider; + } + + public FieldRuleConfigProvider getFieldRuleConfigProvider() { + return fieldRuleConfigProvider; + } + + public DatagramEventProvider getDatagramEventProvider() { + return datagramEventProvider; + } + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java deleted file mode 100644 index 6e1719a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.factory; - - -import com.casic.missiles.pojo.ProtocolConfig; - -import java.util.List; - -/** - * 数据库访问优化(暂时未做) - *

- * 1、初始化协议解析配置,并存放到处存放缓存,对协议基本配置进行管理 - * 2、其中流程中所有的配置都经过此类进行管理,进行调用获取,增强解析速度 - */ -public interface DatagramFactory { - - /** - * 初始化 - */ - List datagramInit(); - - /** - * 根据前导码配置匹配,模糊匹配获取所有的报文项 - */ - List match(); - - /** - * 根据前导码匹配,返回报文项 - */ - List filer(); - - /** - * 保证数据的唯一性选择器 - */ - List selectOne(); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java new file mode 100644 index 0000000..87444a0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java @@ -0,0 +1,18 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +import java.util.List; + +/** + * 直接用,还是边用边创建 + */ +public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { + + + public DefaultProtocolConfigFactory(ProtocolConfig protocolConfig) { + super(protocolConfig); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java new file mode 100644 index 0000000..cce0c7c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java @@ -0,0 +1,12 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; + +public class DefaultRuleFactory extends AbstractRuleConfigFactory { + + public DefaultRuleFactory(Long ruleId) { + super(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java deleted file mode 100644 index 9ee97e0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.casic.missiles.parser.instance; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service -@Slf4j -@AllArgsConstructor -public class GeneralProcessor { - - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; - - /** - * 统一固定字段解析=>进行规则的查询的判断 - * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 - * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 - */ - @Deprecated - public boolean parseWholeDatagram(ByteBuf buffer, ProtocolConfig protocolConfig) { - try { - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap,protocolId); - //选取规则对应的流程= - DatagramEventConfig datagramEventConfig = processorSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); - //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); - //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); - //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); - //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); - //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); - return true; - } catch (Exception ex) { - log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", - ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); - return false; - } - } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; - } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); - } - - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); - return bizDataMap; - } - - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java index 25e7ad8..6a5777e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java @@ -1,23 +1,31 @@ package com.casic.missiles.parser.instance.impl; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.mapper.DatagramEventMapper; import com.casic.missiles.pojo.DatagramEventConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.SpringContextUtil; -@Service -@AllArgsConstructor +import java.util.List; +import java.util.Optional; + +/** + * @author cz + * + */ public class DefaultProcessorInstanceSelector implements ProcessorInstanceSelector { - private final DatagramEventMapper datagramEventMapper; + private static List datagramEventConfigs; + + static { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + datagramEventConfigs = datagramEventRegistry.getDatagramEventList(); + } @Override public DatagramEventConfig getProcessorInstance(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("rule_id", protocolId); - return datagramEventMapper.selectOne(queryWrapper); + Optional optionalSelectInstance = datagramEventConfigs.stream() + .filter(e -> e.getId().equals(protocolId)).limit(1).findFirst(); + return optionalSelectInstance.isPresent() ? optionalSelectInstance.get() : null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a778671..7b56a43 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,16 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import io.netty.buffer.ByteBuf; /** - * 分析匹配情况 - * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 - * 2、匹配不成功,有后续帧,可以进行下次匹配。 - * 3、匹配不成功,无后续帧,可以进行丢弃。 + * 分析匹配情况 + * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 + * 2、匹配不成功,有后续帧,可以进行下次匹配。 + * 3、匹配不成功,无后续帧,可以进行丢弃。 */ -public interface FrameStructMatcher{ +public interface FrameStructMatcher { - ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig); + ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 05320ab..8ebea78 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,23 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.ProtocolConfigMapper; +import com.casic.missiles.parser.provider.ProtocolConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Component; import java.util.List; import java.util.stream.Collectors; -@Component -@AllArgsConstructor public class LeadingCodeMatcher { - private final ProtocolConfigMapper protocolMapper; - //** 1、首字母匹配前导码, // 2、以匹配出的前导码是否在报文中条件进行前导码的匹配二次筛选 - public List matchLeadingCode(String protocolContent){ + public static List matchFrameLeadingCode(String protocolContent){ List initialConfigs = initialMatch(protocolContent); List preCodeConfigs = initialConfigs.stream() .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) @@ -26,13 +19,16 @@ } //初始化匹配前导码内容 - private List initialMatch(String protocolContent) { - String protocolStr = protocolContent.charAt(0) + ""; - QueryWrapper queryWrapper = new QueryWrapper() - .likeRight("pre_fix", protocolStr); - List protocolConfigList = protocolMapper.selectList(queryWrapper); - return protocolConfigList; + private static List initialMatch(String protocolContent) { + String firstFrameChar = protocolContent.charAt(0) + ""; + ProtocolConfigProvider protocolConfigProvider=new ProtocolConfigProvider(firstFrameChar); + return protocolConfigProvider.getMatchList(); } + + + + + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index cf2113d..e915877 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -1,32 +1,35 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(0) -@Service +@Component public class FrameLengthMatcher implements FrameStructMatcher { - @Autowired - private FieldParser fieldParser; - //超过长度 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { String dataGramContent = ByteBufUtil.hexDump(byteBuf); - if (StringUtils.isEmpty(protocolConfig.getUnpackId()) && StringUtils.isEmpty(protocolConfig.getTailStr())) { - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + //当不存在结尾标志和拆包标志,可以直接使用长度进行匹配 + if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { if (dataGramContent.length() >= totalLength) {//等于长度返回true,超出长度,切断 - ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, protocolConfig, totalLength); + ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, totalLength); return wholeDatagramByte; } else { //读的标志位前移舍弃 @@ -38,7 +41,7 @@ return null; } - private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, Integer totalLength) { byteBuf.readBytes(totalLength); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, totalLength - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 2bfc213..d527ad0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; @@ -13,7 +13,7 @@ import lombok.AllArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.nio.charset.Charset; import java.util.Map; @@ -22,32 +22,30 @@ * 后续标志验证 */ @Order(1) -@Service +@Component @AllArgsConstructor -public class FrameMarkMatcher implements FrameStructMatcher { - - private final FieldConfigDao fieldConfigDao; - private final FieldParser fieldParser; - private final FieldResolver fieldResolverManger; +public class FrameMarkMatcher implements FrameStructMatcher, FixedPropertyEnum { //帧后续标志=>结束,进行帧的重组=>有后续,1、帧移位判别 2、继续接收帧 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig UnpackConfig = StringUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getUnpackId()); - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); - Integer upback = 0; + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); ByteBuf mergeWholeFrameByte = null; - if (!ObjectUtil.isEmpty(UnpackConfig)) { - while (hasNextFullFrame(byteBuf, protocolConfig)) { - upback = (Integer) fieldResolverManger.filedParserManger(byteBuf, UnpackConfig, null); + if (!ObjectUtil.isEmpty(unpackFlag)) { + while (hasNextFullFrame(byteBuf, protocolConfig, protocolFieldConfigProvider)) { //是否存在后续位 - if (upback == 1) {//使用esayRule + if (unpackFlag == 1) {//使用esayRule //表示可以截取 - mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolConfig, totalLength); + mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolFieldConfigProvider, protocolConfig); return mergeWholeFrameByte; } else { - byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig)); + byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig, protocolFieldConfigProvider)); } } } @@ -56,7 +54,8 @@ //选取第一个帧,将业务内容和后面部分分开 //计算数据报文-业务内容 - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolFieldConfigProvider protocolFieldConfigProvider, ProtocolConfig protocolConfig) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); //截取完整报文 byteBuf.readBytes(totalLength); ByteBuf byteBufContent = byteBuf.slice(0, byteBuf.readerIndex()); @@ -68,15 +67,15 @@ String tail = ""; System.out.println(ByteBufUtil.hexDump(byteBufContent)); //会存在多个帧拼接在一起的的情况,进行合并处理 - while (hasNextFullFrame(byteBufContent, protocolConfig)) { - Integer currentFrameLength = fieldParser.getTotalLength(protocolConfig, byteBufContent); + while (hasNextFullFrame(byteBufContent, protocolConfig, protocolFieldConfigProvider)) { + Integer currentFrameLength = protocolFieldConfigProvider.getTotalLength(byteBufContent, protocolConfig); byteBufContent.readBytes(currentFrameLength); ByteBuf currentbyteBuf = byteBufContent.slice(0, byteBufContent.readerIndex()); byteBufContent.markReaderIndex();//读的标志位前移 System.out.println(ByteBufUtil.hexDump(byteBufContent)); String hexDump = currentbyteBuf.toString(Charset.forName("ISO-8859-1")); //获取当前固定帧结构的关系map - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, currentbyteBuf); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(currentbyteBuf, protocolConfig); if (StringUtils.isEmpty(mergeFrameStr)) { //首次获取业务数据报文 mergeFrameStr += hexDump.substring(0, currentFrameFixedProperty.get("tailPosition")); @@ -95,22 +94,22 @@ /** * 获取平移到下一帧起始位置 */ - public int getNextFrameOffset(ByteBuf buffer, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, buffer); - return currentFrameFixedProperty.get("totalLength"); + public int getNextFrameOffset(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + return currentFrameFixedProperty.get(TOTAL_LENGTH); } /** * 判断是否出错进行整个帧的 */ - public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, byteBuf); + public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); //保证读取位置不在固定位置,是可变的业务内容 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("fixedPosition")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(FIXED_POSITION)) { return false; } //判断读取是否操作帧长度 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("totalLength")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(TOTAL_LENGTH)) { return false; } return true; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 76a3784..c3a1bab 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -1,50 +1,50 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.parser.instance.GeneralProcessor; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; +import io.netty.buffer.ByteBufUtil;; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(2) -@Service +@Component public class FrameTailMatcher implements FrameStructMatcher { - @Resource - private FieldConfigDao fieldConfigDao; - @Autowired - private GeneralProcessor generalProcessor; - //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig tailFieldConfig = StringUtils.isEmpty(protocolConfig.getTailStr()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getTailStr()); - if (!ObjectUtil.isEmpty(tailFieldConfig)) { - String tailStr = tailFieldConfig.getFieldName(); + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfig protocolFieldConfig = ObjectUtils.isEmpty(protocolConfig.getTailStr()) ? null : + fieldConfigProvider.getFieldConfigById(protocolConfig.getTailStr()); + if (!ObjectUtil.isEmpty(protocolFieldConfig)) { + String tailStr = protocolFieldConfig.getFieldName(); String dataGramContent = ByteBufUtil.hexDump(byteBuf); Boolean tailFlag = ByteBufUtil.hexDump(byteBuf).contains(tailStr); if (!tailFlag) { //使用esayRule return null; } else if (dataGramContent.indexOf(tailStr) < dataGramContent.length() - tailStr.length()) { Integer length = dataGramContent.indexOf(tailStr) + tailStr.length(); - ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, protocolConfig, length); + ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, length); return wholeDatagramByte; //存在粘包 } } return null; } - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer length) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, Integer length) { byteBuf.readBytes(length); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, length - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java new file mode 100644 index 0000000..5f1c177 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java @@ -0,0 +1,73 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.combined.GenericCombinedFieldResolver; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.CombinedFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class CombinedFieldConfigProvider { + + + /** + * 作为临时配置列表缓存使用 + */ + private final List combinedFieldConfigList; + private Map storeObjectMap = new HashMap<>(); + + public CombinedFieldConfigProvider(Long ruleId) { + CombinedFieldConfigRegistry combinedFieldConfigRegistry = SpringContextUtil.getBean(CombinedFieldConfigRegistry.class); + combinedFieldConfigList = combinedFieldConfigRegistry.getCombinedFieldConfigList(ruleId); + } + + public void parseDataField(RuleConfig ruleConfig, String clearZeroPlain,Map fieldConfigsMap ) { + if (showSkip()) { + return; + } + //匹配对应的数据,然后进行相关的字段解析 + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver(); + combinedFieldResolver.parseDataField(combinedFieldConfigList, byteBuf, storeObjectMap,fieldConfigsMap); + } + + + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getCombinedFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return combinedFieldConfigList.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public List getCombinedFieldConfigList() { + return combinedFieldConfigList; + } + + /* 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(combinedFieldConfigList) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java new file mode 100644 index 0000000..f3cfedc --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java @@ -0,0 +1,11 @@ +package com.casic.missiles.parser.provider; + +/** + * @author cz + * @date 2023-6-12 + */ +public class CommandEventProvider{ + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java new file mode 100644 index 0000000..70eec5e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java @@ -0,0 +1,77 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.safe.SafeStrategy; +import com.casic.missiles.parser.sender.DataSubscribeProvider; +import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class DatagramEventProvider { + + private final DatagramEventConfig processorInstance; + + public DatagramEventProvider(Long ruleId) { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + List datagramEventConfigList = + datagramEventRegistry.getDatagramEventList(ruleId); + processorInstance = this.getProcessorInstance(datagramEventConfigList); + } + + public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { + if (showSkip()) { + return null; + } + return datagramEventConfigList.get(0); + } + + // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 + public String getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap) { + String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? + processorInstance.getSafeBean() : + fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); + if (!StringUtils.isEmpty(safeName)) { + //需要加密 + SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); + String plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); + return clearComplementZero(plain); + } + return ByteBufUtil.hexDump(bizDataContent); + } + + //解密清零操作 + private String clearComplementZero(String plain) { + plain = plain.substring(0, plain.lastIndexOf("00")); + return plain; + } + + //数据发送,数据发送者暂未构建 + public void storeData(Map bizDataMap) { + DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); +// dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return ObjectUtils.isNotEmpty(processorInstance) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java new file mode 100644 index 0000000..7e1fe0a --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java @@ -0,0 +1,97 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.FieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class FieldConfigProvider { + + + private final List fieldConfigs; + private Map storeObjectMap = new HashMap<>(); +// private Map singleObjects = new ConcurrentHashMap<>(); + + public FieldConfigProvider(Long ruleId) { + FieldConfigRegistry fieldConfigRegistry = SpringContextUtil.getBean(FieldConfigRegistry.class); + fieldConfigs = fieldConfigRegistry.getFieldConfigList(ruleId); + } + + public List getFieldConfigs() { + return fieldConfigs; + } + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public Map parseDataField(RuleConfig ruleConfig, String clearZeroPlain) { + if (showSkip()) { + return null; + } + List prepareFieldConfig = prepareParseField(ruleConfig); + if (CollectionUtils.isNotEmpty(prepareFieldConfig)) { + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(fieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + return fixDataMap; + } + } + return null; + } + + /** + * 得到需要处理的业务内容 + * + * @return + */ + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return fieldConfigs.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public Map getFieldConfigsMap() { + return fieldConfigs.stream().collect( + Collectors.toMap(FieldConfig::getId, e -> e) + ); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(fieldConfigs) ? false : true; + } + + +} + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java new file mode 100644 index 0000000..817bfaf --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java @@ -0,0 +1,19 @@ +package com.casic.missiles.parser.provider; + +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.registry.FieldRuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; + +public class FieldRuleConfigProvider { + + private final List fieldRuleConfigList; + + public FieldRuleConfigProvider(Long ruleId) { + FieldRuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(FieldRuleConfigRegistry.class); + fieldRuleConfigList = ruleConfigRegistry.getFieldRuleConfigList(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java new file mode 100644 index 0000000..99a1b06 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java @@ -0,0 +1,53 @@ +package com.casic.missiles.parser.provider; + + +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.registry.ProtocolConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolConfigProvider { + + private final List protocolConfigList; + + public ProtocolConfigProvider(String firstChar) { + ProtocolConfigRegistry registry = SpringContextUtil.getBean(ProtocolConfigRegistry.class); + protocolConfigList = registry.getProtocolConfigList(firstChar); + } + + public List getMatchList() { + return protocolConfigList; + } + + /** + * 设置当前协议 + * + * @param protocolConfig + */ + public ProtocolConfigProvider(ProtocolConfig protocolConfig) { + List protocolConfigs = new ArrayList<>(); + protocolConfigs.add(protocolConfig); + protocolConfigList = protocolConfigs; + } + + /** + * 获取当前协议 + * + * @return + */ + public ProtocolConfig getCurrentProtocolConfig() { + if (this.protocolConfigList == null) { + return null; + } else { + return protocolConfigList.get(0); + } + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java new file mode 100644 index 0000000..043927d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java @@ -0,0 +1,213 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.registry.ProtocolFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolFieldConfigProvider { + + private static final String FIXED_FIELD_DS = "fixedFieldDs"; + private static final String CONTENT_FIELD_DS = "contentFieldDs"; + private static final String PROTOCOL_LENGTH = "protocolLength"; + private static final String PROTOCOL_FIELD_ID = "protocolFieldId"; + private static final String PROTOCOL_POSITION = "protocolPosition"; + + private final List protocolFieldConfigs; + private Map singleObjects = new ConcurrentHashMap<>(); + private Map storeObjectMap = new HashMap<>(); + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public ProtocolFieldConfigProvider(Long protocolId) { + ProtocolFieldConfigRegistry protocolFieldConfigRegistry = SpringContextUtil.getBean(ProtocolFieldConfigRegistry.class); + protocolFieldConfigs = protocolFieldConfigRegistry.getProtocolFieldConfigList(protocolId); + } + + public List getProtocolFieldConfigs() { + return protocolFieldConfigs; + } + + public ProtocolFieldConfig getFieldConfigById(Long fieldId) { + Optional optionalConfig = protocolFieldConfigs.stream().filter( + e -> e.getId().equals(fieldId) + ).findFirst(); + return optionalConfig.isPresent() ? optionalConfig.get() : null; + } + + public Integer getProtocolFieldValue(Long protocolFieldId, ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_FIELD_ID + protocolFieldId + ByteBufUtil.hexDump(byteBuf); + //获取缓存 + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + //加载固定长度数据集合 + Map fixDataMap = this.getProtocolDataMap(byteBuf); + ProtocolFieldConfig protocolFieldConfig = selectFieldConfig(protocolFieldId); + Integer protocolFieldValue = 0; + //获取约定字段的总长度 + if (fixDataMap.containsKey(protocolFieldConfig.getFieldName())) { + Object appointUnpackObject = fixDataMap.get(protocolFieldConfig.getFieldName()); + if (ObjectUtils.isNotEmpty(appointUnpackObject)) { + protocolFieldValue = (Integer) appointUnpackObject; + } + } + if (protocolFieldValue != null) { + //加入缓存 + if (ObjectUtils.isNotEmpty(protocolFieldValue)) { + this.singleObjects.put(catchKey, protocolFieldValue); + return protocolFieldValue; + } + } + return null; + } + + /** + * 获取帧固定位置信息 + * + * @param byteBuf + * @param protocolConfig + * @return + */ + public Map getFixedProperty(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_POSITION + protocolConfig.getId(); + if (this.singleObjects.containsKey(catchKey)) { + return (Map) singleObjects.get(catchKey); + } + Map fixedPropertyMap = new HashMap<>(); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + fixedPropertyMap = fieldParser.doGetFixedProperty(protocolFieldConfigs, this.getTotalLength(byteBuf,protocolConfig)); + if (CollectionUtils.isNotEmpty(fixedPropertyMap)) { + this.singleObjects.put(catchKey, fixedPropertyMap); + return fixedPropertyMap; + } + return fixedPropertyMap; + } + + /** + * 获取帧结构应有的总长度 + */ + public Integer getTotalLength(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_LENGTH + ByteBufUtil.hexDump(byteBuf); + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + Integer appointFrameLength = getProtocolFieldValue(protocolConfig.getTotalLengthId(), byteBuf); + if (appointFrameLength != null) { + //获取过滤的字段集合总长度 + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Integer totalFilterLength = fieldParser.getTotalFilterLength(protocolConfig, byteBuf, getFixFieldConfigMap()); + //计算总长度 + Integer totalLength = appointFrameLength + totalFilterLength; + //加入缓存 + if (ObjectUtils.isNotEmpty(totalLength)) { + this.singleObjects.put(catchKey, totalLength); + return totalLength; + } + } + return null; + } + + /** + * 获取协议有关字段解析内容 + * storeObjectMap存储代转存的数据 + * + * @return + */ + public Map getProtocolDataMap(ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(FIXED_FIELD_DS)) { + return (Map) singleObjects.get(FIXED_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(protocolFieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + this.singleObjects.put(FIXED_FIELD_DS, fixDataMap); + return fixDataMap; + } + return null; + } + + /** + * 获取业务报文内容的content字节 + * + * @param wholeDatagramByte + * @return + */ + public ByteBuf getDataContentBuf(ByteBuf wholeDatagramByte) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(CONTENT_FIELD_DS)) { + return (ByteBuf) singleObjects.get(CONTENT_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + ByteBuf bizDataByteBuf = fieldParser.getDataContentBuf(protocolFieldConfigs, wholeDatagramByte); + if (bizDataByteBuf != null) { + this.singleObjects.put(CONTENT_FIELD_DS, bizDataByteBuf); + return bizDataByteBuf; + } + return null; + } + + + private ProtocolFieldConfig selectFieldConfig(Long id) { + Optional optionalProtocolFieldConfig = this.protocolFieldConfigs.stream().filter( + e -> e.getId().equals(id) + ).findFirst(); + return optionalProtocolFieldConfig.isPresent() ? optionalProtocolFieldConfig.get() : null; + } + + + private Map getFixFieldConfigMap() { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, e -> e) + ); + return fixDataFieldMap; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(protocolFieldConfigs) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java new file mode 100644 index 0000000..dafba1c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java @@ -0,0 +1,56 @@ +package com.casic.missiles.parser.provider; + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.rule.GenericRuleResolver; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.RuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleConfigProvider { + + private final List ruleConfigs; + + public List getRuleConfigs() { + return ruleConfigs; + } + + public RuleConfigProvider(Long protocolId) { + RuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(RuleConfigRegistry.class); + ruleConfigs = ruleConfigRegistry.getRuleConfigById(protocolId); + } + + /** + * 获取规则匹配结果 + * + * @param parseFixedDataMap + * @param protocolFieldConfigs + * @return + */ + public RuleConfig doGetRule(Map parseFixedDataMap, + String ids, + List protocolFieldConfigs) { + if (showSkip()) { + return null; + } + RuleConfig ruleConfig = GenericRuleResolver.machRule(parseFixedDataMap, ids, protocolFieldConfigs, ruleConfigs); + return ruleConfig; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(ruleConfigs) ? false : true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java index 3c05891..856b399 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java @@ -1,18 +1,11 @@ package com.casic.missiles.parser.resolver; -import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.springframework.web.bind.annotation.RequestBody; -import javax.annotation.Resource; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -20,19 +13,17 @@ @Slf4j public class ByteMergeProvider { - @Resource - private FieldRuleEngineMapper fieldRuleEngineMapper; - //拿到所有的值合并到一个值 - public String resolveByteMerge(List valueList, String ruletypeId, String vaildRange) { + public static String resolveByteMerge(List valueList, String ruleTypeId, String vaildRange) { String values = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Map vaildMap = getValidRangeMap(vaildRange); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(ruletypeId); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } + //暂时不处理 +// fieldRuleEngine = fieldRuleConfigMapper.selectById(ruleTypeId); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } Map env2 = new HashMap(); for (int i = 0; i < valueList.size(); i++) { if (vaildMap.containsKey(i)) { @@ -47,7 +38,7 @@ } } - private Map getValidRangeMap(String vaildRange) { + private static Map getValidRangeMap(String vaildRange) { String[] range = vaildRange.split(","); Map vaildMap = new HashMap(); for (int i = 0; i < range.length; i++) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 8d821cd..85d6bbf 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -1,9 +1,12 @@ package com.casic.missiles.parser.resolver; +import com.casic.missiles.pojo.AbstractFieldConfig; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; import io.netty.buffer.ByteBuf; +import java.util.List; import java.util.Map; /** @@ -11,18 +14,14 @@ */ public interface FieldParser { -// Map fieldProcess(String protocolContent,); - Map dataParser(RuleConfig ruleConfig, String lightText,String protocolId); + Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength); - Map fixDataParser(String protocolId, ByteBuf buffer); + Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap); - Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf); + ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer); - ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer); - - ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer); - - Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer); + Integer getTotalFilterLength(ProtocolConfig protocolConfig, ByteBuf byteBuf, Map protocolFieldConfigMap); } + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java new file mode 100644 index 0000000..9e0c00e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java @@ -0,0 +1,52 @@ +package com.casic.missiles.parser.resolver; + +import com.casic.missiles.pojo.AbstractFieldConfig; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.util.List; + +public class FieldParserSupport { + + //分别计算bit和byte长度=> 合并长度 + protected Integer calculateLength(List fieldConfigList) { + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + Integer fixedLength = bytefixedLength + bitfixedLength / 8; + return fixedLength; + } + + //找到最大值=> 根据最大值计算业务数据下标 + protected Integer calculatePosition(List fieldConfigList) { + String rex = "[0-9]+"; + Integer max = -1; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) + && Integer.valueOf(fieldConfig.getOriginPositionByte()) > max) { + max = Integer.valueOf(fieldConfig.getOriginPositionByte()); + } + } + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) && fieldConfig.getOriginPositionByte().equals(max)) { + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + } + } + Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; + return maxFixedPosition; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java deleted file mode 100644 index dd3a6cd..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java +++ /dev/null @@ -1,170 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.ByteResolverParam; -import io.netty.buffer.ByteBuf; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -/** - * 字段解析管理总类 - */ -@Service -@Slf4j -@AllArgsConstructor -public class FieldResolver extends ByteMergeProvider { - - //1、字段截取 => 2、简单的字节解析和复杂的字节解析 - public Object filedParserManger(ByteBuf byteBuf, FieldConfig fieldConfig, Integer maxFixedPosition) { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - //最大固定位置不为空, - if (!ObjectUtil.isEmpty(maxFixedPosition)) { - orignPosition -= maxFixedPosition; - } - Object fieldValue = 0; - //待优化 - if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { - fieldValue = bitToResolver(byteBuf, fieldConfig); - } else { - ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); - fieldValue = parsingFields(fieldBytes, fieldConfig.getRuleJson()); - } - return fieldValue; - } - - //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, - //目前默认配置的规则设置暂不支持配置化,由实现完成 - private Object parsingFields(ByteBuf byteBuf, String ruleJson) { - Object fieldsResolveValue = null; - List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); - if (ObjectUtil.isEmpty(ruleMapList)) { - fieldsResolveValue = defaultResolveBuilder(byteBuf); - } else { - fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); - } - return fieldsResolveValue; - } - - private Object defaultResolveBuilder(ByteBuf byteBuf) { - Integer defaultResolveValue = 0; - for (int i = 0; i < byteBuf.writerIndex(); i++) { - defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; - } - return defaultResolveValue; - } - - //字段解析构建器(针对字节单位的) - //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 - // 字节归并结束或者规则结束=>继续根据规则进行判断 - private Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { - Object customizeResolveValue = null; - try { - List bytStrList = new ArrayList<>(); - //存放到数组里面 - for (int i = 0; i < byteBuf.writerIndex(); i++) { - bytStrList.add(byteBuf.readByte()); - } - int i = 0; - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - customizeResolveValue = this.resolveByteMerge(bytStrList, ruletypeId,vaildRange); - break; - } else { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - List tempBytStr = new ArrayList<>(); - for (int k = 0; i < bytStrList.size(); i++) { - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(k) - .value(bytStrList.get(k)) - .ruletypeId(ruletypeId).build(); - tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); - } - bytStrList = tempBytStr; - } - i++; - } - //字节归并到一起=>继续根据规则进行判断 - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(customizeResolveValue) - .ruletypeId(ruletypeId).build(); - customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(customizeResolveValue)); - return customizeResolveValue; - } catch (RuntimeException ex) { - log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); - return null; - } - } - - /** - * 1、单个字节情况表示字段 - * 2、多字节情况表示字段(暂未处理) - */ - private Object bitToResolver(ByteBuf byteBuf, FieldConfig fieldConfig) { - Object fieldValue = new Object(); - try { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - byte fields = 0x00; - if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); - } else { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); - } - - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { - if (!StringUtils.isEmpty(fieldConfig.getExactOrignPosition())) { - fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getExactOrignPosition())).byteValue() - >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); - } else { - fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); - } - } else { - fieldValue = Integer.valueOf(fields & 0xff); - } - if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { - return fieldValue; - } - List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); - int i = 0; - //字节归并到一起=>继续根据规则进行判断 - while (i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(fieldValue) - .ruletypeId(ruletypeId).build(); - fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(fieldValue)); - return fieldValue; - } catch (RuntimeException ex) { - log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); - return null; - } - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java new file mode 100644 index 0000000..1d2aeab --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java @@ -0,0 +1,36 @@ +package com.casic.missiles.parser.resolver.bytes; + +import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.mapper.FieldRuleConfigMapper; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.pojo.ByteResolverParam; +import com.googlecode.aviator.AviatorEvaluator; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; +//转换规则 +@Component("convert") +@AllArgsConstructor +@Slf4j +public class ByteRuleResolver implements ByteResolver { + + private final FieldRuleConfigMapper fieldRuleConfigMapper; + + @Override + public Object resolveOperationRule(ByteResolverParam byteResolverParam){ + FieldRuleConfig fieldRuleEngine=fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); + if(ObjectUtil.isEmpty(fieldRuleEngine)){ + return byteResolverParam.getValue(); + } + String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); + Map env2 = new HashMap(); + env2.put("value", (byte) byteResolverParam.getValue()); + String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); + return values; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java index 103821c..786b71c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java @@ -2,34 +2,34 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("logicalShift") +@Component("logicalShift") @AllArgsConstructor @Slf4j public class LogicalShiftResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //字节位移 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { Integer index = byteResolverParam.getIndex(); - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return byteResolverParam.getValue(); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java index 476747d..01149bd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("operation") +@Component("operation") @AllArgsConstructor @Slf4j public class OperationResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //混合运算,有常量或者乘除的缩放 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java index 0b82cf4..79abcce 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.casic.missiles.pojo.ByteResolverParam; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; //精度计算 -@Service("precision") +@Component("precision") @AllArgsConstructor @Slf4j public class PrecisionResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java deleted file mode 100644 index 5c3f332..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; -//转换规则 -@Service("convert") -@AllArgsConstructor -@Slf4j -public class RuleResolver implements ByteResolver { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam){ - RuleEvaluator fieldRuleEngine=fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); - if(ObjectUtil.isEmpty(fieldRuleEngine)){ - return byteResolverParam.getValue(); - } - String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); - Map env2 = new HashMap(); - env2.put("value", (byte) byteResolverParam.getValue()); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java new file mode 100644 index 0000000..d3bbd91 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java @@ -0,0 +1,15 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; + +import java.util.List; +import java.util.Map; +// 前导码匹配->长度字段 +public interface AbstractCombinedFieldProcessor { + + Map invoke(Map map, ByteBuf byteBuf, List combinedFieldConfigList, + Map fieldConfigsMap, Map storeObjectMap); + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java new file mode 100644 index 0000000..03c8480 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java @@ -0,0 +1,59 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-13 + */ +//依次递增进行数据的解析, +public class GenericCombinedFieldResolver { + + + //通过查询,字段长度长度随机 + public void parseDataField(List combinedFieldConfigList, ByteBuf byteBuf, + Map storeObjectMap, Map fieldConfigsMap) { + Integer frameLength = Integer.valueOf(ByteBufUtil.hexDump(byteBuf)); + //添加前置处理器 + com.casic.missiles.util.ClassUtil classUtil = new com.casic.missiles.util.ClassUtil(); + List abstractCombinedProcessors = classUtil.getSubClassList(AbstractCombinedFieldProcessor.class); + + Map fieldFixedMap = combinedFieldLeadCodeMap(combinedFieldConfigList); + //frameLength + Map combinedProcessorFields = null; + while (byteBuf.readableBytes() < frameLength) { + //一直处理 + for (AbstractCombinedFieldProcessor abstractCombinedProcessor : abstractCombinedProcessors) { + combinedProcessorFields = abstractCombinedProcessor.invoke(combinedProcessorFields, byteBuf, + combinedFieldConfigList, + fieldConfigsMap, storeObjectMap); + if (combinedProcessorFields == null || byteBuf.readableBytes() < frameLength) { + return; + } + } + + } + } + + /** + * 取出前导码匹配集合 + */ + private Map combinedFieldLeadCodeMap(List combinedFieldConfigList) { + Map fieldFixedMap = combinedFieldConfigList + .stream() + .collect(Collectors.toMap(CombinedFieldConfig::getPrefixCode, e -> e)); + return fieldFixedMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java new file mode 100644 index 0000000..643a934 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java @@ -0,0 +1,100 @@ +package com.casic.missiles.parser.resolver.fields; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.FieldParserSupport; +import com.casic.missiles.pojo.*; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 保存使用时最基本的信息,并且使用原型模式 + */ +@Slf4j +public class DefaultProtocolFieldParser extends FieldParserSupport implements FieldParser, FixedPropertyEnum { + + //通过传入的配置和报文进行字段解析 + @Override + public Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap) { + Map dataMap = new HashMap<>(); + for (AbstractFieldConfig protocolFieldConfig : protocolFieldConfigs) { + if (!ObjectUtils.isEmpty(protocolFieldConfig.getOriginPositionByte())) { + Object fieldValue = FieldResolver.parseField(buffer, protocolFieldConfig, null); + if (protocolFieldConfig.getIsStorage() == 1) { + storeObjectMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + dataMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + } + return dataMap; + } + + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength) { + Map fixedPropertyMap = new HashMap<>(); + Integer fixedLength = calculateLength(protocolFieldConfigs); + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + fixedPropertyMap.put(FIXED_POSITION, maxFixedPosition); + fixedPropertyMap.put(TOTAL_LENGTH, totalLength); + fixedPropertyMap.put(TAIL_POSITION, totalLength - fixedLength + maxFixedPosition); + return fixedPropertyMap; + } + + //** 获取业务内容的byteBuf + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer) { + //计算固定长度 + Integer fixedLength = calculateLength(protocolFieldConfigs); + //总长度获取 + String lightText = buffer.toString(Charset.forName("ISO-8859-1")); + Integer totalLength = lightText.length(); + //计算固定长度最大长度 + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + //计算数据报文内容 + ByteBuf bizDataFields = buffer.slice(maxFixedPosition - 1, (totalLength - fixedLength)); + return bizDataFields; + } + + /** + * 获取过滤字段的长度 + */ + @Override + public Integer getTotalFilterLength(ProtocolConfig protocolConfig, + ByteBuf byteBuf, + Map protocolFieldConfigMap) { + if (ByteBufUtil.hexDump(byteBuf).equals("")) { + return 0; + } + int totalFilterLength = 0; + String filterFields = protocolConfig.getTotalLengthFilterFields(); + try { + if (!StringUtils.isEmpty(filterFields)) { + String[] filterFieldList = filterFields.split(","); + for (String filterFieldId : filterFieldList) { + if (StringUtils.isNotEmpty(filterFieldId)) { + ProtocolFieldConfig fieldConfig = protocolFieldConfigMap.get(Long.valueOf(filterFieldId)); + //这里都是按字节计算,没有对位进行区分,可能会出现错误 + // 如果对位有需求,需要进一步跟进 + totalFilterLength += fieldConfig.getOffsetLength(); + } + } + } + return totalFilterLength; + } catch (Exception ex) { + log.error("报文确认分发阶段,获取报文总长度过滤长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); + } + return totalFilterLength; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java new file mode 100644 index 0000000..d51e887 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java @@ -0,0 +1,169 @@ +package com.casic.missiles.parser.resolver.fields; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.parser.resolver.ByteMergeProvider; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.AbstractFieldConfig; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.pojo.ByteResolverParam; +import io.netty.buffer.ByteBuf; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * 字段解析管理总类 + */ +@Slf4j +public class FieldResolver extends ByteMergeProvider { + + //1、字段截取 => 2、简单的字节解析和复杂的字节解析 + public static Object parseField(ByteBuf byteBuf,AbstractFieldConfig fieldConfig, Integer maxFixedPosition) { + Integer orignPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + //最大固定位置不为空, + if (!ObjectUtil.isEmpty(maxFixedPosition)) { + orignPosition -= maxFixedPosition; + } + Object fieldValue = 0; + //待优化 + if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { + fieldValue = doParseBitField(byteBuf, fieldConfig); + } else { + ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); + fieldValue = doParseByteField(fieldBytes, fieldConfig.getRuleJson()); + } + return fieldValue; + } + + //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, + //目前默认配置的规则设置暂不支持配置化,由实现完成 + private static Object doParseByteField(ByteBuf byteBuf, String ruleJson) { + Object fieldsResolveValue = null; + List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); + if (ObjectUtil.isEmpty(ruleMapList)) { + fieldsResolveValue = defaultResolveBuilder(byteBuf); + } else { + fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); + } + return fieldsResolveValue; + } + + private static Object defaultResolveBuilder(ByteBuf byteBuf) { + Integer defaultResolveValue = 0; + for (int i = 0; i < byteBuf.writerIndex(); i++) { + defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; + } + return defaultResolveValue; + } + + //字段解析构建器(针对字节单位的) + //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 + // 字节归并结束或者规则结束=>继续根据规则进行判断 + private static Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { + Object customizeResolveValue = null; + try { + List bytStrList = new ArrayList<>(); + //存放到数组里面 + for (int i = 0; i < byteBuf.writerIndex(); i++) { + bytStrList.add(byteBuf.readByte()); + } + int i = 0; + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { + if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + customizeResolveValue = resolveByteMerge(bytStrList, ruletypeId, vaildRange); + break; + } else { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + List tempBytStr = new ArrayList<>(); + for (int k = 0; i < bytStrList.size(); i++) { + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(k) + .value(bytStrList.get(k)) + .ruletypeId(ruletypeId).build(); + tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); + } + bytStrList = tempBytStr; + } + i++; + } + //字节归并到一起=>继续根据规则进行判断 + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(null) + .value(customizeResolveValue) + .ruletypeId(ruletypeId).build(); + customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); + i++; + } + System.out.println(JSON.toJSON(customizeResolveValue)); + return customizeResolveValue; + } catch (RuntimeException ex) { + log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); + return null; + } + } + + /** + * 1、单个字节情况表示字段 + * 2、多字节情况表示字段(暂未处理) + */ + private static Object doParseBitField(ByteBuf byteBuf,AbstractFieldConfig fieldConfig) { + Object fieldValue = new Object(); + try { + Integer orignPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + byte fields = 0x00; + if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { + fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); + } else { + fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); + } + + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { + if (!StringUtils.isEmpty(fieldConfig.getOriginPositionBit())) { + fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getOriginPositionBit())).byteValue() + >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); + } else { + fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); + } + } else { + fieldValue = Integer.valueOf(fields & 0xff); + } + if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { + return fieldValue; + } + List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); + int i = 0; + //字节归并到一起=>继续根据规则进行判断 + while (i < ruleMapList.size()) { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(null) + .value(fieldValue) + .ruletypeId(ruletypeId).build(); + fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); + i++; + } + System.out.println(JSON.toJSON(fieldValue)); + return fieldValue; + } catch (RuntimeException ex) { + log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); + return null; + } + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java deleted file mode 100644 index 35ae3d0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java +++ /dev/null @@ -1,183 +0,0 @@ -package com.casic.missiles.parser.resolver.fields; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufAllocator; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; -import org.springframework.util.ObjectUtils; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service("standard") -@AllArgsConstructor -@Slf4j -public class StandardFieldParser implements FieldParser { - - private final FieldConfigDao fieldConfigDao; - private final FieldResolver fieldResolver; - - //数据解析 - @Override - public Map dataParser(RuleConfig ruleConfig, String lightText, String protocolId) { - String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); - ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); - bufferContent.writeBytes(lightText.getBytes(Charset.forName("ISO-8859-1"))); - Map dataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - for (String dataFieldId : dataFieldIds) { - FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(dataFieldId); - if (!ObjectUtils.isEmpty(fieldConfig)) { - dataMap.put(fieldConfig.getFieldName(), String.valueOf(fieldResolver.filedParserManger(bufferContent, fieldConfig, maxFixedPosition))); - } - } - return dataMap; - } - - //数据解析 - @Override - public Map fixDataParser(String protocolId, ByteBuf buffer) { - List dataFieldIdList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Map dataMap = new HashMap<>(); - for (FieldConfig dataField : dataFieldIdList) { - if (!ObjectUtils.isEmpty(dataField.getOrignPosition())) { - Object fieldValue = (Integer) fieldResolver.filedParserManger(buffer, dataField, null); - dataMap.put(dataField.getFieldName(), fieldValue); - } - } - return dataMap; - } - - @Override - public Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf) { - if (ByteBufUtil.hexDump(byteBuf).equals("")) { - return 0; - } - String filterFields = protocolConfig.getTotalLengthFilterField(); - Integer totalLength = 0; - try { - FieldConfig totalFieldConfig = fieldConfigDao.getFieldConfigById(protocolConfig.getTotalLengthId()); - int totalFilterLength = 0; - if (!StringUtils.isEmpty(filterFields)) { - String[] filterFieldList = filterFields.split(","); - for (String filterField : filterFieldList) { - FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(filterField); - //这里都是按字节计算,没有对位进行区分,可能会出现错误 - - // 如果对位有需求,需要进一步跟进 - totalFilterLength += fieldConfig.getOffsetLength(); - } - } - totalLength = (Integer) fieldResolver.filedParserManger(byteBuf, totalFieldConfig, null) + totalFilterLength; - } catch (Exception ex) { - log.error("报文确认分发阶段,获取报文总长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); - } - return totalLength; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer) { - //业务内容 - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - String protocolId = String.valueOf(protocolConfig.getId()); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - //计算固定长度 - Integer fixedLength = calculateLength(fieldConfigList); -// Integer totalLength = this.getTotalLength(protocolConfig, buffer); - //总长度获取 - Integer totalLength = lightText.length(); - //计算固定长度最大长度 - Integer maxFixedPosition = calculatePosition(fieldConfigList); -// buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - //计算数据报文内容 - ByteBuf bizDataFields = buffer.slice(maxFixedPosition-1, (totalLength - fixedLength)); - return bizDataFields; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer) { - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - String protocolId = String.valueOf(protocolConfig.getId()); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer fixedLength = calculateLength(fieldConfigList); -// Integer totalLength = this.getTotalLength(protocolConfig, buffer); - Integer totalLength = lightText.length(); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - ByteBuf fixDataFields = buffer.slice(0, maxFixedPosition); - return fixDataFields; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer) { - String protocolId = String.valueOf(protocolConfig.getId()); - Map fixedPropertyMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer fixedLength = calculateLength(fieldConfigList); - Integer totalLength = this.getTotalLength(protocolConfig, buffer); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - fixedPropertyMap.put("fixedPosition", maxFixedPosition); - fixedPropertyMap.put("totalLength", totalLength); - fixedPropertyMap.put("tailPosition", totalLength - fixedLength + maxFixedPosition); - return fixedPropertyMap; - } - - //分别计算bit和byte长度=> 合并长度 - private Integer calculateLength(List fieldConfigList) { - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (FieldConfig fieldConfig : fieldConfigList) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - Integer fixedLength = bytefixedLength + bitfixedLength / 8; - return fixedLength; - } - - //找到最大值=> 根据最大值计算业务数据下标 - private Integer calculatePosition(List fieldConfigList) { - String rex = "[0-9]+"; - Integer max = -1; - for (FieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOrignPosition()) - && Integer.valueOf(fieldConfig.getOrignPosition()) > max) { - max = Integer.valueOf(fieldConfig.getOrignPosition()); - } - } - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (FieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOrignPosition()) && fieldConfig.getOrignPosition().equals(max)) { - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - } - } - Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; - return maxFixedPosition; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java new file mode 100644 index 0000000..d4ec6c7 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java @@ -0,0 +1,76 @@ +package com.casic.missiles.parser.rule; + +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import org.apache.commons.lang3.StringUtils; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class GenericRuleResolver { + + //根据前置字段的值,找到指定的规则 + //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 + //=>循环判断=>通过规则得到业务字段 + public static RuleConfig machRule(Map fixDataMap, + String ids, + List protocolFieldConfigs, + List ruleConfigs) { + List preRuleConfigList = getPreRuleList(ids, protocolFieldConfigs); + //获取前置规则字段 + final Map metaDataMap = getPreRuleFields(preRuleConfigList, fixDataMap); + //准备固定的字段集合 + Map fixDataFieldMap = getFixDataFieldMap(protocolFieldConfigs); + return RuleResolverCore.doMachRule(ruleConfigs, metaDataMap, fixDataMap, fixDataFieldMap); + } + + private static Map getFixDataFieldMap(List protocolFieldConfigs) { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, ProtocolFieldConfig::getFieldName) + ); + return fixDataFieldMap; + } + + + /** + * 查询前置规则的字段配置 + * + * @param ids + * @return + */ + private static List getPreRuleList(String ids, List protocolFieldConfigs) { + String[] idList = ids.split(","); + Map prepareMaps = new HashMap<>(); + for (String id : idList) { + if (StringUtils.isNotEmpty(id)) { + prepareMaps.put(Long.valueOf(id), ""); + } + } + List preRuleConfigList = protocolFieldConfigs + .stream() + .filter(e -> prepareMaps.containsKey(e.getId())) + .collect(Collectors.toList()); + return preRuleConfigList; + } + + /** + * 获取前置规则解析字段 + */ + private static Map getPreRuleFields(List preRuleFieldConfigList, Map fixDataMap) { + Map ruleFieldMap = new HashMap<>(); + preRuleFieldConfigList.stream() + .forEach( + preRuleFieldConfig -> { + String fieldName = preRuleFieldConfig.getFieldName(); + if (fixDataMap.containsKey(fieldName)) { + ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); + } + } + ); + return ruleFieldMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java new file mode 100644 index 0000000..baae7e8 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -0,0 +1,68 @@ +package com.casic.missiles.parser.rule; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.casic.missiles.pojo.RuleConfig; + +import java.util.*; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleResolverCore { + + + public static RuleConfig doMachRule(List ruleConfigList, Map metaDataMap, + Map fixDataMap, + Map fixDataFieldMap) { + Optional ruleConfigOptional = ruleConfigList.stream() + .filter(ruleConfig -> machRuleConfig( + JSON.parseObject(ruleConfig.getMatchRuleJson(), Map.class), metaDataMap)) + .findFirst(); + if (ObjectUtil.isEmpty(ruleConfigOptional)) { + return null; + } + String[] ruleFields = ruleConfigOptional.get().getDataFieldIds().split(","); + Map ruleMetaDataMap = getRuleFields(ruleFields, fixDataMap, fixDataFieldMap); + //递归选定解析规则,进行规则解析 + if (!ruleConfigOptional.get().getIsFinishMatch().equals("1")) { + //递归选定规则 + doMachRule(ruleConfigList, ruleMetaDataMap, fixDataMap, fixDataFieldMap); + } + return ruleConfigOptional.get(); + } + + + private static Map getRuleFields(String[] preRuleConfigList, Map fixedDataMap, + Map fixedFieldMap) { + Map ruleFieldMap = new HashMap<>(); + for (String preRuleConfigId : preRuleConfigList) { + String fieldName = fixedFieldMap.get(preRuleConfigId); + if (fixedDataMap.containsKey(fieldName)) { + ruleFieldMap.put(fieldName, String.valueOf(fixedDataMap.get(fieldName))); + } + } + return ruleFieldMap; + } + + + //匹配规则配置 + private static Boolean machRuleConfig(Map ruleMap, Map metaDataMap) { + if (ruleMap == null || metaDataMap == null) { + return null; + } + //所有的字段在规则里面必须有有配置 + for (String key : metaDataMap.keySet()) { + if (ruleMap.containsKey(key)) { + if (!ruleMap.get(key).equals(metaDataMap.get(key))) { + return false; + } + } else { + return false; + } + } + return true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java deleted file mode 100644 index 664088d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java +++ /dev/null @@ -1,92 +0,0 @@ -package com.casic.missiles.parser.rule; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.mapper.dao.PreRuleConfigDao; -import com.casic.missiles.mapper.dao.RuleConfigDao; -import lombok.AllArgsConstructor; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.*; -import java.util.stream.Collectors; - -@Service -@AllArgsConstructor -public class RulerProvider { - - private final FieldConfigDao fieldConfigDao; - private final PreRuleConfigDao preRuleConfigDao; - private final RuleConfigDao ruleConfigDao; - - //根据前置字段的值,找到指定的规则 - //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 - //=>循环判断=>通过规则得到业务字段 - public RuleConfig ruleConfig(Map fixDataMap, String protocolId) { - //批量获取规则 - List preRuleConfigList = preRuleConfigDao.getPreRuleList(protocolId); - //获取固定字段 - Map fixFieldMap = getAllFieldMap(protocolId); - //获取前置规则字段 - final String preRuleFields = getPreRuleFields(preRuleConfigList, fixDataMap, fixFieldMap); - List ruleConfigList = ruleConfigDao.getRuleConfigById(protocolId); - Optional ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig ->preRuleFields.equals( ruleConfig.getParseRuleJson())).findFirst(); - //递归选定解析规则,进行规则解析 - while (!ObjectUtil.isEmpty(ruleConfigOptional) && !ruleConfigOptional.get().getIsBizField().equals("1")) { - String ruleFields = getRuleFields(ruleConfigOptional.get().getDataFieldIds().split(","), fixDataMap, fixFieldMap); - ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig -> ruleConfig.getParseRuleJson().equals(ruleFields)).findFirst(); - } - return ruleConfigOptional.get(); - } - - /** - * 获取前置规则解析字段 - */ - private String getPreRuleFields(List preRuleConfigList, Map fixDataMap, Map fixFieldMap) { - Map ruleFieldMap= new HashMap<>(); - preRuleConfigList.stream() - .forEach( - preRuleConfig -> { - String fieldName = fixFieldMap.get(Long.valueOf(preRuleConfig.getRuleFieldId())); - if (fixDataMap.containsKey(fieldName)) { - ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); - } - } - ); - return JSONObject.toJSONString(ruleFieldMap); - } - - private Map getAllFieldMap(String protocolId) { - List fieldList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Map fixFieldMap = fieldList.stream().collect( - Collectors.toMap(FieldConfig::getId, FieldConfig::getFieldName) - ); - return fixFieldMap; - } - - private String getRuleFields(String[] preRuleConfigList, Map fixDataMap, Map fixFieldMap) { - Map ruleFieldMap= new HashMap<>(); - for (String preRuleConfigId : preRuleConfigList) { - String fieldName = fixFieldMap.get(preRuleConfigId); - if (fixDataMap.containsKey(fieldName)) { - ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); - } - } - return JSONObject.toJSONString(ruleFieldMap); - } - - //弃置 - private String ListToString(List ruleFieldList) { - String ruleFields = ""; - for (String ruleField : ruleFieldList) { - ruleFields += ruleField + ","; - } - ruleFields = StringUtils.isEmpty(ruleFields) ? ruleFields : ruleFields.substring(0, ruleFields.length() - 1); - return ruleFields; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java index 6177e10..bfa87a5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java @@ -2,7 +2,7 @@ public interface SafeStrategy { - String decryption(byte[] bytes); + String decryption(String cipher); String encryption(String lightText); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java index 618716c..6236302 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java @@ -9,9 +9,9 @@ //十六进制的字符串转换成字节数组 byte[] bytes = hexStrToBinaryStr(msg); //计算CRC8 - byte crc8 = CRC8(bytes, 0, bytes.length); - String crc8ToStr = "" + Integer.toHexString(0xff & crc8); - return crc8ToStr; +// String crc8ToStr = "" + Integer.toHexString(0xff & crc8); +// return crc8ToStr; + return null; } /** @@ -33,50 +33,5 @@ return bytes; } - /** - * CRC8 校验 多项式 x8+x2+x+1 - * - * @param b - * @param off - * @param len - * @return - */ - public static byte CRC8(final byte[] b, final int off, final int len) { - byte result = 0x00; - for (int i = 0; i < len; i++) { - result = CHECKSUM_TABLE[(result ^ (b[i + off] & 0xFF)) & 0xFF]; - } - return (byte) (result & 0xFFL); - } - - private final static byte[] CHECKSUM_TABLE = {(byte) 0x00, (byte) 0x07, (byte) 0x0e, (byte) 0x09, (byte) 0x1c, (byte) 0x1b, - (byte) 0x12, (byte) 0x15, (byte) 0x38, (byte) 0x3f, (byte) 0x36, (byte) 0x31, (byte) 0x24, (byte) 0x23, (byte) 0x2a, - (byte) 0x2d, (byte) 0x70, (byte) 0x77, (byte) 0x7e, (byte) 0x79, (byte) 0x6c, (byte) 0x6b, (byte) 0x62, (byte) 0x65, - (byte) 0x48, (byte) 0x4f, (byte) 0x46, (byte) 0x41, (byte) 0x54, (byte) 0x53, (byte) 0x5a, (byte) 0x5d, (byte) 0xe0, - (byte) 0xe7, (byte) 0xee, (byte) 0xe9, (byte) 0xfc, (byte) 0xfb, (byte) 0xf2, (byte) 0xf5, (byte) 0xd8, (byte) 0xdf, - (byte) 0xd6, (byte) 0xd1, (byte) 0xc4, (byte) 0xc3, (byte) 0xca, (byte) 0xcd, (byte) 0x90, (byte) 0x97, (byte) 0x9e, - (byte) 0x99, (byte) 0x8c, (byte) 0x8b, (byte) 0x82, (byte) 0x85, (byte) 0xa8, (byte) 0xaf, (byte) 0xa6, (byte) 0xa1, - (byte) 0xb4, (byte) 0xb3, (byte) 0xba, (byte) 0xbd, (byte) 0xc7, (byte) 0xc0, (byte) 0xc9, (byte) 0xce, (byte) 0xdb, - (byte) 0xdc, (byte) 0xd5, (byte) 0xd2, (byte) 0xff, (byte) 0xf8, (byte) 0xf1, (byte) 0xf6, (byte) 0xe3, (byte) 0xe4, - (byte) 0xed, (byte) 0xea, (byte) 0xb7, (byte) 0xb0, (byte) 0xb9, (byte) 0xbe, (byte) 0xab, (byte) 0xac, (byte) 0xa5, - (byte) 0xa2, (byte) 0x8f, (byte) 0x88, (byte) 0x81, (byte) 0x86, (byte) 0x93, (byte) 0x94, (byte) 0x9d, (byte) 0x9a, - (byte) 0x27, (byte) 0x20, (byte) 0x29, (byte) 0x2e, (byte) 0x3b, (byte) 0x3c, (byte) 0x35, (byte) 0x32, (byte) 0x1f, - (byte) 0x18, (byte) 0x11, (byte) 0x16, (byte) 0x03, (byte) 0x04, (byte) 0x0d, (byte) 0x0a, (byte) 0x57, (byte) 0x50, - (byte) 0x59, (byte) 0x5e, (byte) 0x4b, (byte) 0x4c, (byte) 0x45, (byte) 0x42, (byte) 0x6f, (byte) 0x68, (byte) 0x61, - (byte) 0x66, (byte) 0x73, (byte) 0x74, (byte) 0x7d, (byte) 0x7a, (byte) 0x89, (byte) 0x8e, (byte) 0x87, (byte) 0x80, - (byte) 0x95, (byte) 0x92, (byte) 0x9b, (byte) 0x9c, (byte) 0xb1, (byte) 0xb6, (byte) 0xbf, (byte) 0xb8, (byte) 0xad, - (byte) 0xaa, (byte) 0xa3, (byte) 0xa4, (byte) 0xf9, (byte) 0xfe, (byte) 0xf7, (byte) 0xf0, (byte) 0xe5, (byte) 0xe2, - (byte) 0xeb, (byte) 0xec, (byte) 0xc1, (byte) 0xc6, (byte) 0xcf, (byte) 0xc8, (byte) 0xdd, (byte) 0xda, (byte) 0xd3, - (byte) 0xd4, (byte) 0x69, (byte) 0x6e, (byte) 0x67, (byte) 0x60, (byte) 0x75, (byte) 0x72, (byte) 0x7b, (byte) 0x7c, - (byte) 0x51, (byte) 0x56, (byte) 0x5f, (byte) 0x58, (byte) 0x4d, (byte) 0x4a, (byte) 0x43, (byte) 0x44, (byte) 0x19, - (byte) 0x1e, (byte) 0x17, (byte) 0x10, (byte) 0x05, (byte) 0x02, (byte) 0x0b, (byte) 0x0c, (byte) 0x21, (byte) 0x26, - (byte) 0x2f, (byte) 0x28, (byte) 0x3d, (byte) 0x3a, (byte) 0x33, (byte) 0x34, (byte) 0x4e, (byte) 0x49, (byte) 0x40, - (byte) 0x47, (byte) 0x52, (byte) 0x55, (byte) 0x5c, (byte) 0x5b, (byte) 0x76, (byte) 0x71, (byte) 0x78, (byte) 0x7f, - (byte) 0x6a, (byte) 0x6d, (byte) 0x64, (byte) 0x63, (byte) 0x3e, (byte) 0x39, (byte) 0x30, (byte) 0x37, (byte) 0x22, - (byte) 0x25, (byte) 0x2c, (byte) 0x2b, (byte) 0x06, (byte) 0x01, (byte) 0x08, (byte) 0x0f, (byte) 0x1a, (byte) 0x1d, - (byte) 0x14, (byte) 0x13, (byte) 0xae, (byte) 0xa9, (byte) 0xa0, (byte) 0xa7, (byte) 0xb2, (byte) 0xb5, (byte) 0xbc, - (byte) 0xbb, (byte) 0x96, (byte) 0x91, (byte) 0x98, (byte) 0x9f, (byte) 0x8a, (byte) 0x8d, (byte) 0x84, (byte) 0x83, - (byte) 0xde, (byte) 0xd9, (byte) 0xd0, (byte) 0xd7, (byte) 0xc2, (byte) 0xc5, (byte) 0xcc, (byte) 0xcb, (byte) 0xe6, - (byte) 0xe1, (byte) 0xe8, (byte) 0xef, (byte) 0xfa, (byte) 0xfd, (byte) 0xf4, (byte) 0xf3}; } \ No newline at end of file diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java index 27c2838..6e078a3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java @@ -1,9 +1,6 @@ package com.casic.missiles.parser.safe.impl; -import cn.hutool.core.util.CharsetUtil; -import cn.hutool.crypto.symmetric.SM4; -import cn.hutool.crypto.symmetric.SymmetricCrypto; - +import com.casic.missiles.parser.safe.SafeStrategy; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; @@ -11,19 +8,44 @@ import org.bouncycastle.crypto.engines.SM4Engine; import org.bouncycastle.crypto.params.KeyParameter; import org.bouncycastle.util.encoders.Hex; - -import static cn.hutool.crypto.Mode.ECB; -import static cn.hutool.crypto.Padding.NoPadding; +import org.springframework.stereotype.Component; /** * SM4算法工具类 */ @Slf4j -public class Sm4 { +@Component("sm4") +public class Sm4 implements SafeStrategy { //加解密的字节快大小 public static final int BlockSize = 16; + @Override + public String decryption(String cipher) { + byte[] keyByte = { + 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 + }; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(keyByte); + byte[] in = Hex.decode(cipher); + byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); + String plain = EcbDecrypt(in, keyBytes); + return plain; + } + + @Override + public String encryption(String cipher) { + byte[] keyByte = { + 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 + }; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(keyByte); + byte[] in = Hex.decode(cipher); + byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); + String plain = EcbDecrypt(in, keyBytes); + return plain; + } + /** * SM4ECB加密算法,对内 * @@ -32,8 +54,6 @@ * @return */ private static byte[] ecb_encrypt(byte[] in, byte[] keyBytes) { - - SM4Engine sm4Engine = new SM4Engine(); sm4Engine.init(true, new KeyParameter(keyBytes)); byte[] out = new byte[in.length]; @@ -58,27 +78,6 @@ return cipher; } - - /** - * hutool 解密SM4 - * - * @param encodeContent - * @return - */ - public static String decode(String encodeContent) { - String key = "24ad182507479a5da3ad94d9d78ea203"; - try { - SymmetricCrypto sm4 = new SM4(ECB, NoPadding, key.getBytes()); - String decryptStr = sm4.decryptStr(encodeContent, CharsetUtil.CHARSET_UTF_8); - return decryptStr; - } catch (Exception e) { - e.printStackTrace(); - log.error("SM4解密失败"); - } - return null; - } - - /** * SM4的ECB加密算法 * @@ -129,20 +128,6 @@ return plain; } - /** - * SM4的ECB解密算法 - * - * @param cipher 输入的密文字符串 - * @param key 密钥 - * @return - */ - public static String EcbDecrypt(String cipher, String key) { - byte[] in = Hex.decode(cipher); - byte[] keyBytes = Hex.decode(key); - - String plain = EcbDecrypt(in, keyBytes); - return plain; - } /** * 主函数 @@ -151,28 +136,24 @@ */ public static void main(String[] args) { byte[] ciphertext = { + 0x4B, (byte) 0x8C, (byte) 0x9D, 0x08, (byte) 0xE4, (byte) 0xD3, 0x64, 0x42, (byte) 0xB9, (byte) 0xA5, (byte) 0xFE, (byte) 0xCD, (byte) 0x91, 0x1B, 0x38, (byte) 0xAC, (byte) 0xE9, 0x1C, (byte) 0xCD, 0x53, 0x02, (byte) 0xD7, 0x0C, (byte) 0x9B, (byte) 0x96, 0x30, 0x62, (byte) 0xE8, (byte) 0xFB, (byte) 0xEF, (byte) 0xB9, (byte) 0xFF, (byte) 0xDE, 0x19, (byte) 0x80, 0x35, 0x3E, (byte) 0x90, 0x4F, 0x2F, 0x12, 0x2B, 0x19, (byte) 0x8B, 0x6C, 0x7A, (byte) 0x85, (byte) 0xA1, (byte) 0xB1, (byte) 0x86, (byte) 0xA3, 0x7A, 0x46, 0x0C, 0x2F, (byte) 0x94, 0x4F, 0x7F, 0x2C, 0x56, 0x14, (byte) 0xF3, (byte) 0x89, (byte) 0xC3, - 0x3F, 0x20, (byte) 0xF9, (byte) 0x87, (byte) 0xA1, 0x60, (byte) 0xD9, (byte) 0xA8, (byte) 0xFD, (byte) 0xD7, (byte) 0x9B, 0x4B, 0x26, 0x06, 0x30, 0x44}; + 0x3F, 0x20, (byte) 0xF9, (byte) 0x87, (byte) 0xA1, 0x60, (byte) 0xD9, (byte) 0xA8, (byte) 0xFD, (byte) 0xD7, (byte) 0x9B, 0x4B, 0x26, 0x06, 0x30, 0x44 + }; ByteBuf in = ByteBufAllocator.DEFAULT.heapBuffer(); in.writeBytes(ciphertext); - byte[] keyByte = { 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 }; ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); - key.writeBytes(ciphertext); - String resCipherData = decode(ByteBufUtil.hexDump(in)); - ByteBuf out = ByteBufAllocator.DEFAULT.heapBuffer(); -// out.writeBytes(resCipherData); -// System.out.println(hexBytes); - System.out.println(resCipherData.toString()); -// String resPlainData = EcbDecrypt(resCipherData, key); -// System.out.println("原始明文:" + data); -// System.out.println("解密后明文:" + resPlainData); + key.writeBytes(keyByte); +// String resCipherData = EcbDecrypt(ByteBufUtil.hexDump(in), ByteBufUtil.hexDump(key)); +// System.out.println(resCipherData); } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java index 1395a51..ac5f957 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java @@ -1,7 +1,7 @@ package com.casic.missiles.parser.safe.impl; import io.netty.buffer.ByteBufUtil; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** *

@@ -14,9 +14,8 @@ * @author hyl * @version v1.0: Tea.java, v 0.1 2021/3/12 13:48 $ */ -@Service("tea") -///tea算法类 - +//tea算法类 +@Component("tea") public class Tea { public static byte[] MyTea_Encrypt(byte[] MyTeaContent, int ByteLen, byte[] MyTeakey) { @@ -99,7 +98,6 @@ // for(int i32Index = 0; i32Index < 8; i32Index++) { // System.out.print("0x" + Integer.toHexString(MyContent[i32Index]) + " "); // } - // System.out.println("密钥为:"); // for(int i32Index = 0; i32Index < 16; i32Index++) { // System.out.print("0x" + Integer.toHexString(MyKeys[i32Index]) + " "); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java index bdd0721..bd1516a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java @@ -3,7 +3,7 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.parser.sender.DataSubscribeProvider; import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponents; import org.springframework.web.util.UriComponentsBuilder; @@ -12,7 +12,7 @@ import java.util.Collections; import java.util.Map; -@Service("functionCallback") +@Component("functionCallback") public class FunctionCallback implements DataSubscribeProvider { @Resource diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java index 0b44fb9..7526de2 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.Map; -@Service("middleware") +@Component("middleware") public class MiddlewareSubscribe implements DataSubscribeProvider { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java index 5dcee3f..e2f1192 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.Map; -@Service("nosql") +@Component("nosql") public class NoSqlSubscribe implements DataSubscribeProvider { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java b/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java new file mode 100644 index 0000000..81a5324 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java @@ -0,0 +1,86 @@ +package com.casic.missiles.pojo; + +import lombok.Data; + +/** + * 协议 + */ +@Data +public class Msg { + + /** + * 前导码 + */ + private String preamble; + + /** + * 版本号 + */ + private String version; + + /** + * 内容长度 + */ + private int leng; + + /** + * 设备ID + */ + private String deviceId; + + /** + * 通讯方式 + */ + private Integer connType; + + /** + * 加密方式 + */ + private Integer encryType; + + /** + * 目标地址 + */ + private String destAddr; + + /** + * PDUType + */ + private String PDUType; + + /** + * 操作类型 + */ + private Integer operateType; + + /** + * 传输控制位 PDUType.bit7=0时,表示存在后续的访问;当PDUType.bit7=1时,表示无后续的访问。 + */ + private Integer transControlFlag; + + /** + * 设备类型 + */ + private Integer deviceType; + + /** + * 序号 + */ + private Integer seq; + + /** + * tagList + */ + private String tagList; + + /** + * OidList + */ + private String OidList; + + /** + * CRC + */ + private String CRC; + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java index 608af3a..32cc8a4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java @@ -2,48 +2,47 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.delivery.decorator.ByteDecorator; +import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @AllArgsConstructor public class FieldDecoratorManger { - private final RuleDictDao ruleDictDao; + private final RuleConfigRegistry ruleDictDao; // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 // (1)静态的业务字段是字典里面可以配置的 // (2)动态的业务字段是通过规则生成的 public String contentMerge(String ruleJson, String sceneConent, String dynamicContent) { - List ruleDictList = ruleDictDao.getRuleDictConfig(); - Map ruleDictMap = ruleDictList.stream().collect( - Collectors.toMap(RuleDict::getId, e -> e)); - List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); - for (Map ruleMap : ruleMapList) { - String ruleType = String.valueOf(ruleMap.get("ruleType")); - ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); - NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); - byteDecorator.nodeDecoratorRule(nodeDecoratorParm); - } +// List ruleDictList = ruleDictDao.getRuleDictConfig(); +// Map ruleDictMap = ruleDictList.stream().collect( +// Collectors.toMap(RuleDict::getId, e -> e)); +// List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); +// for (Map ruleMap : ruleMapList) { +// String ruleType = String.valueOf(ruleMap.get("ruleType")); +// ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); +// NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); +// byteDecorator.nodeDecoratorRule(nodeDecoratorParm); +// } return null; } - - private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { - NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() - .contents(sceneConent) - .dynamicContent(dynamicContent) - .ruletypeId(ruletypeId) - .ruleDictMap(ruleDictMap) - .build(); - return nodeDecoratorParm; - } +// +// private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { +// NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() +// .contents(sceneConent) +// .dynamicContent(dynamicContent) +// .ruletypeId(ruletypeId) +// .ruleDictMap(ruleDictMap) +// .build(); +// return nodeDecoratorParm; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java index 652970c..b204ac3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java @@ -1,56 +1,56 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@AllArgsConstructor -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", - JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Component; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Component("logicalDecorator") +//@AllArgsConstructor +//@Slf4j +//public class LogicalShiftDecorator implements ByteDecorator { +// +//// private final FieldRuleEngineMapper fieldRuleEngineMapper; +//// +//// //字节位移 +//// @Override +//// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +//// String logicalValue = ""; +//// RuleEvaluator fieldRuleEngine = new RuleEvaluator(); +//// try { +//// Map env2 = new HashMap(); +//// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +//// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +//// for (String contentId : contentIdList) { +//// RuleDict ruleDict = ruleDictMap.get(contentId); +//// if (ruleDict.getCode().contains("#")) { +//// //使用动态的值 +//// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +//// } +//// env2.put(ruleDict.getName(), ruleDict.getCode()); +//// } +//// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +//// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +//// return null; +//// } +//// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +//// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +//// return values; +//// } catch (Exception ex) { +//// log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", +//// JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +//// return null; +//// } +//// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java index 346468f..822fead 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@AllArgsConstructor -@Slf4j -public class OperationDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("optionDecorator") +//@AllArgsConstructor +//@Slf4j +//public class OperationDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //混合运算,有常量或者乘除的缩放 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java index 50fb0a7..7a8bccb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@AllArgsConstructor -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +////精度计算 +//@AllArgsConstructor +//@Registry("precisionDecorator") +//@Slf4j +//public class PrecisionDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java index da39235..27f9cc7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java @@ -1,54 +1,53 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@AllArgsConstructor -@Slf4j -public class RuleDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("ruleDecorator") +//@AllArgsConstructor +//@Slf4j +//public class RuleDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //吃我一套正则表达式 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (Exception ex) { +// log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java index 7f5cbf3..c043f97 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java @@ -2,6 +2,6 @@ import java.util.Map; -public interface ComandeEventService { +public interface ComandeEventService{ Map loadComandeEventConfig(String protocolId,String scene); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java index 476ad84..aaf1837 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java @@ -2,46 +2,46 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.dao.CommandEventDao; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @Slf4j @AllArgsConstructor -public class ComandeEventServiceImpl implements ComandeEventService { +public class ComandeEventServiceImpl implements ComandeEventRegistry { - private final CommandEventDao commandEventDao; + // private final CommandEventDao commandEventDao; // 加密bean 固定字段出现变化的字段解析,业务字段的有序内容 @Override - public Map loadComandeEventConfig(String protocolId,String sceneName) { - CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); - if (ObjectUtil.isEmpty(commandEventConfig)) { - log.error("协议{},没有配置成功接收回复配置,清排查原因"); - return null; - } - String replyJson = commandEventConfig.getReplyContentJson(); - List> replyMapList = JSONArray.parseObject(replyJson, List.class); - List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); - Map fixMap = fixList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); - List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) - .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) - .collect(Collectors.toList()); - Map commandConfigMap = new HashMap<>(); - commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); - commandConfigMap.put("fixContent", fixMap); - commandConfigMap.put("bizContent", contentList); - return commandConfigMap; + public Map loadComandeEventConfig(String protocolId, String sceneName) { +// CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); +// if (ObjectUtil.isEmpty(commandEventConfig)) { +// log.error("协议{},没有配置成功接收回复配置,清排查原因"); +// return null; +// } +// String replyJson = commandEventConfig.getReplyContentJson(); +// List> replyMapList = JSONArray.parseObject(replyJson, List.class); +// List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); +// Map fixMap = fixList.stream() +// .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); +// List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) +// .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) +// .collect(Collectors.toList()); +// Map commandConfigMap = new HashMap<>(); +// commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); +// commandConfigMap.put("fixContent", fixMap); +// commandConfigMap.put("bizContent", contentList); +// return commandConfigMap; + return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 128b09d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java deleted file mode 100644 index 4016b0b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface DatagramEventMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java deleted file mode 100644 index 597c306..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.apache.ibatis.annotations.Mapper; - -public interface FieldConfigMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java deleted file mode 100644 index a31680a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.PreRuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface PreRuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java deleted file mode 100644 index 9060a69..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface ProtocolConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java deleted file mode 100644 index 6fa6936..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java deleted file mode 100644 index 582a705..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleDict; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleDictMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java deleted file mode 100644 index 6e302c8..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.CommandEventMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Optional; - -@Component -public class CommandEventDao { - - @Resource - private CommandEventMapper commandEventMapper; - - public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId) - .eq("scene", sceneName) - .eq("enabled", 1); - List commandEventConfig = commandEventMapper.selectList(queryWrapper); - Optional optionalEventConfig = commandEventConfig.stream().findFirst(); - return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java deleted file mode 100644 index 9137e4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.FieldConfigMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class FieldConfigDao { - - @Resource - private FieldConfigMapper fieldConfigMapper; - - public FieldConfig getFieldConfigById(String fieldId) { - FieldConfig fieldConfig = fieldConfigMapper.selectById(fieldId); - return fieldConfig; - } - - public List getFieldConfigs(String protocolId,Integer isFixed) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",isFixed); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - - public List getStorageFieldConfig(String protocolId) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",1) - .eq("is_storage",1); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java deleted file mode 100644 index 67bff6b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.mapper.PreRuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class PreRuleConfigDao { - - @Resource - private PreRuleConfigMapper preRuleConfigMapper; - - public List getPreRuleList(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return preRuleConfigMapper.selectList(queryWrapper); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java deleted file mode 100644 index d69ea85..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.RuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleConfigDao { - - @Resource - private RuleConfigMapper ruleConfigMapper; - - public RuleConfig getNextRuleConfig(String ruleFields) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("parse_rule_json", ruleFields); - return ruleConfigMapper.selectOne(queryWrapper); - } - - - public List getRuleConfigById(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return ruleConfigMapper.selectList(queryWrapper); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java deleted file mode 100644 index 932c185..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.RuleDictMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleDictDao { - - @Resource - private RuleDictMapper ruleDictMapper; - - public List getRuleDictConfig() { - List ruleDictList = ruleDictMapper.selectList(null); - return ruleDictList; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java index 9f9e279..43bc4d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java @@ -10,20 +10,15 @@ import io.netty.channel.socket.nio.NioServerSocketChannel; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import javax.annotation.PreDestroy; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static cn.hutool.core.util.ClassUtil.getClasses; /** * SensorhubServer netty服务端 */ @Slf4j -@Service +@Component public class SensorhubServer { /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java index 2c79ff5..9a28c36 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java @@ -11,13 +11,13 @@ import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioSocketChannel; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClient 客户端 */ @Slf4j -@Service +@Registry public final class SensorhubClient { public static void main(String[] args) throws Exception { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java index 9774be0..477c3f7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java @@ -6,12 +6,12 @@ import io.netty.channel.socket.SocketChannel; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientChannelInitialHandler */ -@Service +@Registry public class SensorhubClientChannelInitialHandler extends ChannelInitializer { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java index 346f4b3..73560e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java @@ -5,13 +5,13 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientHandler */ @Slf4j -@Service +@Registry public class SensorhubClientHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java index 5c1c6f2..d990af5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java @@ -4,12 +4,12 @@ import com.casic.missiles.pojo.Msg; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** * SensorhubServerHandler */ -@Service +@Component public class SensorhubServerHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 67283ae..af3172c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,41 +1,37 @@ package com.casic.missiles.parser; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultProtocolConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.*; +import com.casic.missiles.registry.FieldConfigRegistry; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; -import java.nio.charset.Charset; import java.util.HashMap; import java.util.List; import java.util.Map; -@Service("genericProtocolParser") +/** + * @author + */ +@Component("genericProtocolParser") @Slf4j -@AllArgsConstructor +@RequiredArgsConstructor public class GenericProtocolParser implements ProtocolParser { - private final LeadingCodeMatcher leadingCodeMatcher; private final List frameStructDispenserList; - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorInstanceSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; // 匹配首字母前导码=> 帧结构匹配前导码=> // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 @@ -44,18 +40,19 @@ public Boolean doParseProtocol(ByteBuf byteBuf) { String protocolContent = ByteBufUtil.hexDump(byteBuf); //匹配前导码 - List preCodeConfigs = leadingCodeMatcher.matchLeadingCode(protocolContent); + List preCodeConfigs = LeadingCodeMatcher.matchFrameLeadingCode(protocolContent); //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 if (preCodeConfigs.size() == 0) { - return rematch(byteBuf,protocolContent); + return rematch(byteBuf, protocolContent); } - //暂时先取第一个 + //暂时先取第一个,提升速度,使用享元模式, 减少类的创建销毁与构建 ProtocolConfig protocolConfig = preCodeConfigs.get(0); + AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); ByteBuf wholeDatagramByte = null; //通过匹配帧结构获取完整的数据包 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, preCodeConfigs.get(0))) != null) { + if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, protocolFactory)) != null) { break; } } @@ -68,76 +65,78 @@ * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 */ - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId, wholeDatagramByte); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap, protocolId); - //选取规则对应的流程实例 - DatagramEventConfig datagramEventConfig = processorInstanceSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); + //进行规则字段解析,进行匹配规则 + RuleConfig ruleConfig = getRuleConfig(protocolFactory, wholeDatagramByte); + if (ruleConfig == null) { + return false; + } //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, wholeDatagramByte); + ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte); + //以下进行业务的规则解析,同时选定流程实例 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); + DatagramEventProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain, + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText, protocolId); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain); //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); + datagramEventProvider.storeData(bizDataMap); return true; } - private Boolean rematch(ByteBuf byteBuf,String protocolContent) { + /** + * 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 + */ + private Boolean rematch(ByteBuf byteBuf, String protocolContent) { //重置位判断 byteBuf.resetReaderIndex(); //判断重置是否前移,如果没有前移,则直接判为匹配失败 if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { return false; } else { + //递归执行 return doParseProtocol(byteBuf); } } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; + //获取匹配规则->匹配规则 + private RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + //取出其中参与逻辑provider并判空 + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); + String rulePrepareFields = protocolConfig.getRulePrepareFields(); + //固定字段 + if (StringUtils.isNotEmpty(rulePrepareFields)) { + //获取统一固定字段解析 + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + //获取该协议的字段配置,用于协议规则匹配 + List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); + //获取规则 + RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, + rulePrepareFields, protocolFieldConfigs); + return ruleConfig; + } + return null; } - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + //数据构建,获取固定字段的store和业务字段store + private Map buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + Map bizDataMap = new HashMap<>(); + Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); + Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); + bizDataMap.putAll(ruleStoreObjectMap); + bizDataMap.putAll(protocolStoreObjectMap); return bizDataMap; } - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java index 8a46e32..16ce2e5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java @@ -3,6 +3,7 @@ import io.netty.buffer.ByteBuf; public interface ProtocolParser { + Boolean doParseProtocol(ByteBuf byteBuf); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java new file mode 100644 index 0000000..f7814af --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java @@ -0,0 +1,35 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.ProtocolConfigProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.ProtocolConfig; + +/** + * 存放基本协议的的加载信息 + */ +public class AbstractProtocolConfigFactory { + private final ProtocolConfigProvider protocolConfigProvider; + private final ProtocolFieldConfigProvider protocolFieldConfigProvider; + private final RuleConfigProvider ruleConfigProvider; + + public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { + this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); + this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); + this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); + } + + public ProtocolConfigProvider getProtocolConfigProvider() { + return protocolConfigProvider; + } + + public ProtocolFieldConfigProvider getProtocolFieldConfigProvider() { + return protocolFieldConfigProvider; + } + + public RuleConfigProvider getRuleConfigProvider() { + return ruleConfigProvider; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java new file mode 100644 index 0000000..6e36147 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java @@ -0,0 +1,57 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.CombinedFieldConfigProvider; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.FieldConfigProvider; +import com.casic.missiles.parser.provider.FieldRuleConfigProvider; + +/** + * 存放规则相关的的的加载信息 + */ +public class AbstractRuleConfigFactory { + + /** + * 处理字节 + */ + private final FieldConfigProvider fieldConfigProvider; + /** + * 处理组合字节解析的解码器 + */ + private final CombinedFieldConfigProvider combinedFieldConfigProvider; + /** + * 处理负责字节解析的规则配置 + */ + private final FieldRuleConfigProvider fieldRuleConfigProvider; + /** + * 处理实例流程 + */ + private final DatagramEventProvider datagramEventProvider; + + + public AbstractRuleConfigFactory(Long ruleId) { + this.fieldConfigProvider = new FieldConfigProvider(ruleId); + this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); + this.fieldRuleConfigProvider = new FieldRuleConfigProvider(ruleId); + this.datagramEventProvider = new DatagramEventProvider(ruleId); + } + + public FieldConfigProvider getFieldConfigProvider() { + return fieldConfigProvider; + } + + public CombinedFieldConfigProvider getCombinedFieldConfigProvider() { + return combinedFieldConfigProvider; + } + + public FieldRuleConfigProvider getFieldRuleConfigProvider() { + return fieldRuleConfigProvider; + } + + public DatagramEventProvider getDatagramEventProvider() { + return datagramEventProvider; + } + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java deleted file mode 100644 index 6e1719a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.factory; - - -import com.casic.missiles.pojo.ProtocolConfig; - -import java.util.List; - -/** - * 数据库访问优化(暂时未做) - *

- * 1、初始化协议解析配置,并存放到处存放缓存,对协议基本配置进行管理 - * 2、其中流程中所有的配置都经过此类进行管理,进行调用获取,增强解析速度 - */ -public interface DatagramFactory { - - /** - * 初始化 - */ - List datagramInit(); - - /** - * 根据前导码配置匹配,模糊匹配获取所有的报文项 - */ - List match(); - - /** - * 根据前导码匹配,返回报文项 - */ - List filer(); - - /** - * 保证数据的唯一性选择器 - */ - List selectOne(); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java new file mode 100644 index 0000000..87444a0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java @@ -0,0 +1,18 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +import java.util.List; + +/** + * 直接用,还是边用边创建 + */ +public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { + + + public DefaultProtocolConfigFactory(ProtocolConfig protocolConfig) { + super(protocolConfig); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java new file mode 100644 index 0000000..cce0c7c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java @@ -0,0 +1,12 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; + +public class DefaultRuleFactory extends AbstractRuleConfigFactory { + + public DefaultRuleFactory(Long ruleId) { + super(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java deleted file mode 100644 index 9ee97e0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.casic.missiles.parser.instance; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service -@Slf4j -@AllArgsConstructor -public class GeneralProcessor { - - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; - - /** - * 统一固定字段解析=>进行规则的查询的判断 - * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 - * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 - */ - @Deprecated - public boolean parseWholeDatagram(ByteBuf buffer, ProtocolConfig protocolConfig) { - try { - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap,protocolId); - //选取规则对应的流程= - DatagramEventConfig datagramEventConfig = processorSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); - //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); - //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); - //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); - //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); - //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); - return true; - } catch (Exception ex) { - log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", - ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); - return false; - } - } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; - } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); - } - - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); - return bizDataMap; - } - - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java index 25e7ad8..6a5777e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java @@ -1,23 +1,31 @@ package com.casic.missiles.parser.instance.impl; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.mapper.DatagramEventMapper; import com.casic.missiles.pojo.DatagramEventConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.SpringContextUtil; -@Service -@AllArgsConstructor +import java.util.List; +import java.util.Optional; + +/** + * @author cz + * + */ public class DefaultProcessorInstanceSelector implements ProcessorInstanceSelector { - private final DatagramEventMapper datagramEventMapper; + private static List datagramEventConfigs; + + static { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + datagramEventConfigs = datagramEventRegistry.getDatagramEventList(); + } @Override public DatagramEventConfig getProcessorInstance(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("rule_id", protocolId); - return datagramEventMapper.selectOne(queryWrapper); + Optional optionalSelectInstance = datagramEventConfigs.stream() + .filter(e -> e.getId().equals(protocolId)).limit(1).findFirst(); + return optionalSelectInstance.isPresent() ? optionalSelectInstance.get() : null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a778671..7b56a43 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,16 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import io.netty.buffer.ByteBuf; /** - * 分析匹配情况 - * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 - * 2、匹配不成功,有后续帧,可以进行下次匹配。 - * 3、匹配不成功,无后续帧,可以进行丢弃。 + * 分析匹配情况 + * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 + * 2、匹配不成功,有后续帧,可以进行下次匹配。 + * 3、匹配不成功,无后续帧,可以进行丢弃。 */ -public interface FrameStructMatcher{ +public interface FrameStructMatcher { - ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig); + ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 05320ab..8ebea78 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,23 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.ProtocolConfigMapper; +import com.casic.missiles.parser.provider.ProtocolConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Component; import java.util.List; import java.util.stream.Collectors; -@Component -@AllArgsConstructor public class LeadingCodeMatcher { - private final ProtocolConfigMapper protocolMapper; - //** 1、首字母匹配前导码, // 2、以匹配出的前导码是否在报文中条件进行前导码的匹配二次筛选 - public List matchLeadingCode(String protocolContent){ + public static List matchFrameLeadingCode(String protocolContent){ List initialConfigs = initialMatch(protocolContent); List preCodeConfigs = initialConfigs.stream() .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) @@ -26,13 +19,16 @@ } //初始化匹配前导码内容 - private List initialMatch(String protocolContent) { - String protocolStr = protocolContent.charAt(0) + ""; - QueryWrapper queryWrapper = new QueryWrapper() - .likeRight("pre_fix", protocolStr); - List protocolConfigList = protocolMapper.selectList(queryWrapper); - return protocolConfigList; + private static List initialMatch(String protocolContent) { + String firstFrameChar = protocolContent.charAt(0) + ""; + ProtocolConfigProvider protocolConfigProvider=new ProtocolConfigProvider(firstFrameChar); + return protocolConfigProvider.getMatchList(); } + + + + + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index cf2113d..e915877 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -1,32 +1,35 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(0) -@Service +@Component public class FrameLengthMatcher implements FrameStructMatcher { - @Autowired - private FieldParser fieldParser; - //超过长度 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { String dataGramContent = ByteBufUtil.hexDump(byteBuf); - if (StringUtils.isEmpty(protocolConfig.getUnpackId()) && StringUtils.isEmpty(protocolConfig.getTailStr())) { - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + //当不存在结尾标志和拆包标志,可以直接使用长度进行匹配 + if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { if (dataGramContent.length() >= totalLength) {//等于长度返回true,超出长度,切断 - ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, protocolConfig, totalLength); + ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, totalLength); return wholeDatagramByte; } else { //读的标志位前移舍弃 @@ -38,7 +41,7 @@ return null; } - private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, Integer totalLength) { byteBuf.readBytes(totalLength); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, totalLength - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 2bfc213..d527ad0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; @@ -13,7 +13,7 @@ import lombok.AllArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.nio.charset.Charset; import java.util.Map; @@ -22,32 +22,30 @@ * 后续标志验证 */ @Order(1) -@Service +@Component @AllArgsConstructor -public class FrameMarkMatcher implements FrameStructMatcher { - - private final FieldConfigDao fieldConfigDao; - private final FieldParser fieldParser; - private final FieldResolver fieldResolverManger; +public class FrameMarkMatcher implements FrameStructMatcher, FixedPropertyEnum { //帧后续标志=>结束,进行帧的重组=>有后续,1、帧移位判别 2、继续接收帧 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig UnpackConfig = StringUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getUnpackId()); - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); - Integer upback = 0; + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); ByteBuf mergeWholeFrameByte = null; - if (!ObjectUtil.isEmpty(UnpackConfig)) { - while (hasNextFullFrame(byteBuf, protocolConfig)) { - upback = (Integer) fieldResolverManger.filedParserManger(byteBuf, UnpackConfig, null); + if (!ObjectUtil.isEmpty(unpackFlag)) { + while (hasNextFullFrame(byteBuf, protocolConfig, protocolFieldConfigProvider)) { //是否存在后续位 - if (upback == 1) {//使用esayRule + if (unpackFlag == 1) {//使用esayRule //表示可以截取 - mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolConfig, totalLength); + mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolFieldConfigProvider, protocolConfig); return mergeWholeFrameByte; } else { - byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig)); + byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig, protocolFieldConfigProvider)); } } } @@ -56,7 +54,8 @@ //选取第一个帧,将业务内容和后面部分分开 //计算数据报文-业务内容 - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolFieldConfigProvider protocolFieldConfigProvider, ProtocolConfig protocolConfig) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); //截取完整报文 byteBuf.readBytes(totalLength); ByteBuf byteBufContent = byteBuf.slice(0, byteBuf.readerIndex()); @@ -68,15 +67,15 @@ String tail = ""; System.out.println(ByteBufUtil.hexDump(byteBufContent)); //会存在多个帧拼接在一起的的情况,进行合并处理 - while (hasNextFullFrame(byteBufContent, protocolConfig)) { - Integer currentFrameLength = fieldParser.getTotalLength(protocolConfig, byteBufContent); + while (hasNextFullFrame(byteBufContent, protocolConfig, protocolFieldConfigProvider)) { + Integer currentFrameLength = protocolFieldConfigProvider.getTotalLength(byteBufContent, protocolConfig); byteBufContent.readBytes(currentFrameLength); ByteBuf currentbyteBuf = byteBufContent.slice(0, byteBufContent.readerIndex()); byteBufContent.markReaderIndex();//读的标志位前移 System.out.println(ByteBufUtil.hexDump(byteBufContent)); String hexDump = currentbyteBuf.toString(Charset.forName("ISO-8859-1")); //获取当前固定帧结构的关系map - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, currentbyteBuf); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(currentbyteBuf, protocolConfig); if (StringUtils.isEmpty(mergeFrameStr)) { //首次获取业务数据报文 mergeFrameStr += hexDump.substring(0, currentFrameFixedProperty.get("tailPosition")); @@ -95,22 +94,22 @@ /** * 获取平移到下一帧起始位置 */ - public int getNextFrameOffset(ByteBuf buffer, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, buffer); - return currentFrameFixedProperty.get("totalLength"); + public int getNextFrameOffset(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + return currentFrameFixedProperty.get(TOTAL_LENGTH); } /** * 判断是否出错进行整个帧的 */ - public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, byteBuf); + public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); //保证读取位置不在固定位置,是可变的业务内容 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("fixedPosition")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(FIXED_POSITION)) { return false; } //判断读取是否操作帧长度 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("totalLength")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(TOTAL_LENGTH)) { return false; } return true; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 76a3784..c3a1bab 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -1,50 +1,50 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.parser.instance.GeneralProcessor; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; +import io.netty.buffer.ByteBufUtil;; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(2) -@Service +@Component public class FrameTailMatcher implements FrameStructMatcher { - @Resource - private FieldConfigDao fieldConfigDao; - @Autowired - private GeneralProcessor generalProcessor; - //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig tailFieldConfig = StringUtils.isEmpty(protocolConfig.getTailStr()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getTailStr()); - if (!ObjectUtil.isEmpty(tailFieldConfig)) { - String tailStr = tailFieldConfig.getFieldName(); + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfig protocolFieldConfig = ObjectUtils.isEmpty(protocolConfig.getTailStr()) ? null : + fieldConfigProvider.getFieldConfigById(protocolConfig.getTailStr()); + if (!ObjectUtil.isEmpty(protocolFieldConfig)) { + String tailStr = protocolFieldConfig.getFieldName(); String dataGramContent = ByteBufUtil.hexDump(byteBuf); Boolean tailFlag = ByteBufUtil.hexDump(byteBuf).contains(tailStr); if (!tailFlag) { //使用esayRule return null; } else if (dataGramContent.indexOf(tailStr) < dataGramContent.length() - tailStr.length()) { Integer length = dataGramContent.indexOf(tailStr) + tailStr.length(); - ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, protocolConfig, length); + ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, length); return wholeDatagramByte; //存在粘包 } } return null; } - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer length) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, Integer length) { byteBuf.readBytes(length); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, length - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java new file mode 100644 index 0000000..5f1c177 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java @@ -0,0 +1,73 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.combined.GenericCombinedFieldResolver; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.CombinedFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class CombinedFieldConfigProvider { + + + /** + * 作为临时配置列表缓存使用 + */ + private final List combinedFieldConfigList; + private Map storeObjectMap = new HashMap<>(); + + public CombinedFieldConfigProvider(Long ruleId) { + CombinedFieldConfigRegistry combinedFieldConfigRegistry = SpringContextUtil.getBean(CombinedFieldConfigRegistry.class); + combinedFieldConfigList = combinedFieldConfigRegistry.getCombinedFieldConfigList(ruleId); + } + + public void parseDataField(RuleConfig ruleConfig, String clearZeroPlain,Map fieldConfigsMap ) { + if (showSkip()) { + return; + } + //匹配对应的数据,然后进行相关的字段解析 + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver(); + combinedFieldResolver.parseDataField(combinedFieldConfigList, byteBuf, storeObjectMap,fieldConfigsMap); + } + + + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getCombinedFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return combinedFieldConfigList.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public List getCombinedFieldConfigList() { + return combinedFieldConfigList; + } + + /* 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(combinedFieldConfigList) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java new file mode 100644 index 0000000..f3cfedc --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java @@ -0,0 +1,11 @@ +package com.casic.missiles.parser.provider; + +/** + * @author cz + * @date 2023-6-12 + */ +public class CommandEventProvider{ + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java new file mode 100644 index 0000000..70eec5e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java @@ -0,0 +1,77 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.safe.SafeStrategy; +import com.casic.missiles.parser.sender.DataSubscribeProvider; +import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class DatagramEventProvider { + + private final DatagramEventConfig processorInstance; + + public DatagramEventProvider(Long ruleId) { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + List datagramEventConfigList = + datagramEventRegistry.getDatagramEventList(ruleId); + processorInstance = this.getProcessorInstance(datagramEventConfigList); + } + + public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { + if (showSkip()) { + return null; + } + return datagramEventConfigList.get(0); + } + + // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 + public String getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap) { + String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? + processorInstance.getSafeBean() : + fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); + if (!StringUtils.isEmpty(safeName)) { + //需要加密 + SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); + String plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); + return clearComplementZero(plain); + } + return ByteBufUtil.hexDump(bizDataContent); + } + + //解密清零操作 + private String clearComplementZero(String plain) { + plain = plain.substring(0, plain.lastIndexOf("00")); + return plain; + } + + //数据发送,数据发送者暂未构建 + public void storeData(Map bizDataMap) { + DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); +// dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return ObjectUtils.isNotEmpty(processorInstance) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java new file mode 100644 index 0000000..7e1fe0a --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java @@ -0,0 +1,97 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.FieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class FieldConfigProvider { + + + private final List fieldConfigs; + private Map storeObjectMap = new HashMap<>(); +// private Map singleObjects = new ConcurrentHashMap<>(); + + public FieldConfigProvider(Long ruleId) { + FieldConfigRegistry fieldConfigRegistry = SpringContextUtil.getBean(FieldConfigRegistry.class); + fieldConfigs = fieldConfigRegistry.getFieldConfigList(ruleId); + } + + public List getFieldConfigs() { + return fieldConfigs; + } + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public Map parseDataField(RuleConfig ruleConfig, String clearZeroPlain) { + if (showSkip()) { + return null; + } + List prepareFieldConfig = prepareParseField(ruleConfig); + if (CollectionUtils.isNotEmpty(prepareFieldConfig)) { + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(fieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + return fixDataMap; + } + } + return null; + } + + /** + * 得到需要处理的业务内容 + * + * @return + */ + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return fieldConfigs.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public Map getFieldConfigsMap() { + return fieldConfigs.stream().collect( + Collectors.toMap(FieldConfig::getId, e -> e) + ); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(fieldConfigs) ? false : true; + } + + +} + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java new file mode 100644 index 0000000..817bfaf --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java @@ -0,0 +1,19 @@ +package com.casic.missiles.parser.provider; + +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.registry.FieldRuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; + +public class FieldRuleConfigProvider { + + private final List fieldRuleConfigList; + + public FieldRuleConfigProvider(Long ruleId) { + FieldRuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(FieldRuleConfigRegistry.class); + fieldRuleConfigList = ruleConfigRegistry.getFieldRuleConfigList(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java new file mode 100644 index 0000000..99a1b06 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java @@ -0,0 +1,53 @@ +package com.casic.missiles.parser.provider; + + +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.registry.ProtocolConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolConfigProvider { + + private final List protocolConfigList; + + public ProtocolConfigProvider(String firstChar) { + ProtocolConfigRegistry registry = SpringContextUtil.getBean(ProtocolConfigRegistry.class); + protocolConfigList = registry.getProtocolConfigList(firstChar); + } + + public List getMatchList() { + return protocolConfigList; + } + + /** + * 设置当前协议 + * + * @param protocolConfig + */ + public ProtocolConfigProvider(ProtocolConfig protocolConfig) { + List protocolConfigs = new ArrayList<>(); + protocolConfigs.add(protocolConfig); + protocolConfigList = protocolConfigs; + } + + /** + * 获取当前协议 + * + * @return + */ + public ProtocolConfig getCurrentProtocolConfig() { + if (this.protocolConfigList == null) { + return null; + } else { + return protocolConfigList.get(0); + } + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java new file mode 100644 index 0000000..043927d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java @@ -0,0 +1,213 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.registry.ProtocolFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolFieldConfigProvider { + + private static final String FIXED_FIELD_DS = "fixedFieldDs"; + private static final String CONTENT_FIELD_DS = "contentFieldDs"; + private static final String PROTOCOL_LENGTH = "protocolLength"; + private static final String PROTOCOL_FIELD_ID = "protocolFieldId"; + private static final String PROTOCOL_POSITION = "protocolPosition"; + + private final List protocolFieldConfigs; + private Map singleObjects = new ConcurrentHashMap<>(); + private Map storeObjectMap = new HashMap<>(); + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public ProtocolFieldConfigProvider(Long protocolId) { + ProtocolFieldConfigRegistry protocolFieldConfigRegistry = SpringContextUtil.getBean(ProtocolFieldConfigRegistry.class); + protocolFieldConfigs = protocolFieldConfigRegistry.getProtocolFieldConfigList(protocolId); + } + + public List getProtocolFieldConfigs() { + return protocolFieldConfigs; + } + + public ProtocolFieldConfig getFieldConfigById(Long fieldId) { + Optional optionalConfig = protocolFieldConfigs.stream().filter( + e -> e.getId().equals(fieldId) + ).findFirst(); + return optionalConfig.isPresent() ? optionalConfig.get() : null; + } + + public Integer getProtocolFieldValue(Long protocolFieldId, ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_FIELD_ID + protocolFieldId + ByteBufUtil.hexDump(byteBuf); + //获取缓存 + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + //加载固定长度数据集合 + Map fixDataMap = this.getProtocolDataMap(byteBuf); + ProtocolFieldConfig protocolFieldConfig = selectFieldConfig(protocolFieldId); + Integer protocolFieldValue = 0; + //获取约定字段的总长度 + if (fixDataMap.containsKey(protocolFieldConfig.getFieldName())) { + Object appointUnpackObject = fixDataMap.get(protocolFieldConfig.getFieldName()); + if (ObjectUtils.isNotEmpty(appointUnpackObject)) { + protocolFieldValue = (Integer) appointUnpackObject; + } + } + if (protocolFieldValue != null) { + //加入缓存 + if (ObjectUtils.isNotEmpty(protocolFieldValue)) { + this.singleObjects.put(catchKey, protocolFieldValue); + return protocolFieldValue; + } + } + return null; + } + + /** + * 获取帧固定位置信息 + * + * @param byteBuf + * @param protocolConfig + * @return + */ + public Map getFixedProperty(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_POSITION + protocolConfig.getId(); + if (this.singleObjects.containsKey(catchKey)) { + return (Map) singleObjects.get(catchKey); + } + Map fixedPropertyMap = new HashMap<>(); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + fixedPropertyMap = fieldParser.doGetFixedProperty(protocolFieldConfigs, this.getTotalLength(byteBuf,protocolConfig)); + if (CollectionUtils.isNotEmpty(fixedPropertyMap)) { + this.singleObjects.put(catchKey, fixedPropertyMap); + return fixedPropertyMap; + } + return fixedPropertyMap; + } + + /** + * 获取帧结构应有的总长度 + */ + public Integer getTotalLength(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_LENGTH + ByteBufUtil.hexDump(byteBuf); + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + Integer appointFrameLength = getProtocolFieldValue(protocolConfig.getTotalLengthId(), byteBuf); + if (appointFrameLength != null) { + //获取过滤的字段集合总长度 + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Integer totalFilterLength = fieldParser.getTotalFilterLength(protocolConfig, byteBuf, getFixFieldConfigMap()); + //计算总长度 + Integer totalLength = appointFrameLength + totalFilterLength; + //加入缓存 + if (ObjectUtils.isNotEmpty(totalLength)) { + this.singleObjects.put(catchKey, totalLength); + return totalLength; + } + } + return null; + } + + /** + * 获取协议有关字段解析内容 + * storeObjectMap存储代转存的数据 + * + * @return + */ + public Map getProtocolDataMap(ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(FIXED_FIELD_DS)) { + return (Map) singleObjects.get(FIXED_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(protocolFieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + this.singleObjects.put(FIXED_FIELD_DS, fixDataMap); + return fixDataMap; + } + return null; + } + + /** + * 获取业务报文内容的content字节 + * + * @param wholeDatagramByte + * @return + */ + public ByteBuf getDataContentBuf(ByteBuf wholeDatagramByte) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(CONTENT_FIELD_DS)) { + return (ByteBuf) singleObjects.get(CONTENT_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + ByteBuf bizDataByteBuf = fieldParser.getDataContentBuf(protocolFieldConfigs, wholeDatagramByte); + if (bizDataByteBuf != null) { + this.singleObjects.put(CONTENT_FIELD_DS, bizDataByteBuf); + return bizDataByteBuf; + } + return null; + } + + + private ProtocolFieldConfig selectFieldConfig(Long id) { + Optional optionalProtocolFieldConfig = this.protocolFieldConfigs.stream().filter( + e -> e.getId().equals(id) + ).findFirst(); + return optionalProtocolFieldConfig.isPresent() ? optionalProtocolFieldConfig.get() : null; + } + + + private Map getFixFieldConfigMap() { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, e -> e) + ); + return fixDataFieldMap; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(protocolFieldConfigs) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java new file mode 100644 index 0000000..dafba1c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java @@ -0,0 +1,56 @@ +package com.casic.missiles.parser.provider; + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.rule.GenericRuleResolver; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.RuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleConfigProvider { + + private final List ruleConfigs; + + public List getRuleConfigs() { + return ruleConfigs; + } + + public RuleConfigProvider(Long protocolId) { + RuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(RuleConfigRegistry.class); + ruleConfigs = ruleConfigRegistry.getRuleConfigById(protocolId); + } + + /** + * 获取规则匹配结果 + * + * @param parseFixedDataMap + * @param protocolFieldConfigs + * @return + */ + public RuleConfig doGetRule(Map parseFixedDataMap, + String ids, + List protocolFieldConfigs) { + if (showSkip()) { + return null; + } + RuleConfig ruleConfig = GenericRuleResolver.machRule(parseFixedDataMap, ids, protocolFieldConfigs, ruleConfigs); + return ruleConfig; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(ruleConfigs) ? false : true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java index 3c05891..856b399 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java @@ -1,18 +1,11 @@ package com.casic.missiles.parser.resolver; -import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.springframework.web.bind.annotation.RequestBody; -import javax.annotation.Resource; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -20,19 +13,17 @@ @Slf4j public class ByteMergeProvider { - @Resource - private FieldRuleEngineMapper fieldRuleEngineMapper; - //拿到所有的值合并到一个值 - public String resolveByteMerge(List valueList, String ruletypeId, String vaildRange) { + public static String resolveByteMerge(List valueList, String ruleTypeId, String vaildRange) { String values = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Map vaildMap = getValidRangeMap(vaildRange); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(ruletypeId); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } + //暂时不处理 +// fieldRuleEngine = fieldRuleConfigMapper.selectById(ruleTypeId); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } Map env2 = new HashMap(); for (int i = 0; i < valueList.size(); i++) { if (vaildMap.containsKey(i)) { @@ -47,7 +38,7 @@ } } - private Map getValidRangeMap(String vaildRange) { + private static Map getValidRangeMap(String vaildRange) { String[] range = vaildRange.split(","); Map vaildMap = new HashMap(); for (int i = 0; i < range.length; i++) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 8d821cd..85d6bbf 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -1,9 +1,12 @@ package com.casic.missiles.parser.resolver; +import com.casic.missiles.pojo.AbstractFieldConfig; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; import io.netty.buffer.ByteBuf; +import java.util.List; import java.util.Map; /** @@ -11,18 +14,14 @@ */ public interface FieldParser { -// Map fieldProcess(String protocolContent,); - Map dataParser(RuleConfig ruleConfig, String lightText,String protocolId); + Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength); - Map fixDataParser(String protocolId, ByteBuf buffer); + Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap); - Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf); + ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer); - ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer); - - ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer); - - Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer); + Integer getTotalFilterLength(ProtocolConfig protocolConfig, ByteBuf byteBuf, Map protocolFieldConfigMap); } + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java new file mode 100644 index 0000000..9e0c00e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java @@ -0,0 +1,52 @@ +package com.casic.missiles.parser.resolver; + +import com.casic.missiles.pojo.AbstractFieldConfig; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.util.List; + +public class FieldParserSupport { + + //分别计算bit和byte长度=> 合并长度 + protected Integer calculateLength(List fieldConfigList) { + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + Integer fixedLength = bytefixedLength + bitfixedLength / 8; + return fixedLength; + } + + //找到最大值=> 根据最大值计算业务数据下标 + protected Integer calculatePosition(List fieldConfigList) { + String rex = "[0-9]+"; + Integer max = -1; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) + && Integer.valueOf(fieldConfig.getOriginPositionByte()) > max) { + max = Integer.valueOf(fieldConfig.getOriginPositionByte()); + } + } + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) && fieldConfig.getOriginPositionByte().equals(max)) { + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + } + } + Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; + return maxFixedPosition; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java deleted file mode 100644 index dd3a6cd..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java +++ /dev/null @@ -1,170 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.ByteResolverParam; -import io.netty.buffer.ByteBuf; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -/** - * 字段解析管理总类 - */ -@Service -@Slf4j -@AllArgsConstructor -public class FieldResolver extends ByteMergeProvider { - - //1、字段截取 => 2、简单的字节解析和复杂的字节解析 - public Object filedParserManger(ByteBuf byteBuf, FieldConfig fieldConfig, Integer maxFixedPosition) { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - //最大固定位置不为空, - if (!ObjectUtil.isEmpty(maxFixedPosition)) { - orignPosition -= maxFixedPosition; - } - Object fieldValue = 0; - //待优化 - if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { - fieldValue = bitToResolver(byteBuf, fieldConfig); - } else { - ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); - fieldValue = parsingFields(fieldBytes, fieldConfig.getRuleJson()); - } - return fieldValue; - } - - //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, - //目前默认配置的规则设置暂不支持配置化,由实现完成 - private Object parsingFields(ByteBuf byteBuf, String ruleJson) { - Object fieldsResolveValue = null; - List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); - if (ObjectUtil.isEmpty(ruleMapList)) { - fieldsResolveValue = defaultResolveBuilder(byteBuf); - } else { - fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); - } - return fieldsResolveValue; - } - - private Object defaultResolveBuilder(ByteBuf byteBuf) { - Integer defaultResolveValue = 0; - for (int i = 0; i < byteBuf.writerIndex(); i++) { - defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; - } - return defaultResolveValue; - } - - //字段解析构建器(针对字节单位的) - //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 - // 字节归并结束或者规则结束=>继续根据规则进行判断 - private Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { - Object customizeResolveValue = null; - try { - List bytStrList = new ArrayList<>(); - //存放到数组里面 - for (int i = 0; i < byteBuf.writerIndex(); i++) { - bytStrList.add(byteBuf.readByte()); - } - int i = 0; - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - customizeResolveValue = this.resolveByteMerge(bytStrList, ruletypeId,vaildRange); - break; - } else { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - List tempBytStr = new ArrayList<>(); - for (int k = 0; i < bytStrList.size(); i++) { - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(k) - .value(bytStrList.get(k)) - .ruletypeId(ruletypeId).build(); - tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); - } - bytStrList = tempBytStr; - } - i++; - } - //字节归并到一起=>继续根据规则进行判断 - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(customizeResolveValue) - .ruletypeId(ruletypeId).build(); - customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(customizeResolveValue)); - return customizeResolveValue; - } catch (RuntimeException ex) { - log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); - return null; - } - } - - /** - * 1、单个字节情况表示字段 - * 2、多字节情况表示字段(暂未处理) - */ - private Object bitToResolver(ByteBuf byteBuf, FieldConfig fieldConfig) { - Object fieldValue = new Object(); - try { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - byte fields = 0x00; - if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); - } else { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); - } - - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { - if (!StringUtils.isEmpty(fieldConfig.getExactOrignPosition())) { - fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getExactOrignPosition())).byteValue() - >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); - } else { - fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); - } - } else { - fieldValue = Integer.valueOf(fields & 0xff); - } - if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { - return fieldValue; - } - List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); - int i = 0; - //字节归并到一起=>继续根据规则进行判断 - while (i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(fieldValue) - .ruletypeId(ruletypeId).build(); - fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(fieldValue)); - return fieldValue; - } catch (RuntimeException ex) { - log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); - return null; - } - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java new file mode 100644 index 0000000..1d2aeab --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java @@ -0,0 +1,36 @@ +package com.casic.missiles.parser.resolver.bytes; + +import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.mapper.FieldRuleConfigMapper; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.pojo.ByteResolverParam; +import com.googlecode.aviator.AviatorEvaluator; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; +//转换规则 +@Component("convert") +@AllArgsConstructor +@Slf4j +public class ByteRuleResolver implements ByteResolver { + + private final FieldRuleConfigMapper fieldRuleConfigMapper; + + @Override + public Object resolveOperationRule(ByteResolverParam byteResolverParam){ + FieldRuleConfig fieldRuleEngine=fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); + if(ObjectUtil.isEmpty(fieldRuleEngine)){ + return byteResolverParam.getValue(); + } + String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); + Map env2 = new HashMap(); + env2.put("value", (byte) byteResolverParam.getValue()); + String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); + return values; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java index 103821c..786b71c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java @@ -2,34 +2,34 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("logicalShift") +@Component("logicalShift") @AllArgsConstructor @Slf4j public class LogicalShiftResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //字节位移 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { Integer index = byteResolverParam.getIndex(); - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return byteResolverParam.getValue(); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java index 476747d..01149bd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("operation") +@Component("operation") @AllArgsConstructor @Slf4j public class OperationResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //混合运算,有常量或者乘除的缩放 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java index 0b82cf4..79abcce 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.casic.missiles.pojo.ByteResolverParam; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; //精度计算 -@Service("precision") +@Component("precision") @AllArgsConstructor @Slf4j public class PrecisionResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java deleted file mode 100644 index 5c3f332..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; -//转换规则 -@Service("convert") -@AllArgsConstructor -@Slf4j -public class RuleResolver implements ByteResolver { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam){ - RuleEvaluator fieldRuleEngine=fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); - if(ObjectUtil.isEmpty(fieldRuleEngine)){ - return byteResolverParam.getValue(); - } - String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); - Map env2 = new HashMap(); - env2.put("value", (byte) byteResolverParam.getValue()); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java new file mode 100644 index 0000000..d3bbd91 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java @@ -0,0 +1,15 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; + +import java.util.List; +import java.util.Map; +// 前导码匹配->长度字段 +public interface AbstractCombinedFieldProcessor { + + Map invoke(Map map, ByteBuf byteBuf, List combinedFieldConfigList, + Map fieldConfigsMap, Map storeObjectMap); + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java new file mode 100644 index 0000000..03c8480 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java @@ -0,0 +1,59 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-13 + */ +//依次递增进行数据的解析, +public class GenericCombinedFieldResolver { + + + //通过查询,字段长度长度随机 + public void parseDataField(List combinedFieldConfigList, ByteBuf byteBuf, + Map storeObjectMap, Map fieldConfigsMap) { + Integer frameLength = Integer.valueOf(ByteBufUtil.hexDump(byteBuf)); + //添加前置处理器 + com.casic.missiles.util.ClassUtil classUtil = new com.casic.missiles.util.ClassUtil(); + List abstractCombinedProcessors = classUtil.getSubClassList(AbstractCombinedFieldProcessor.class); + + Map fieldFixedMap = combinedFieldLeadCodeMap(combinedFieldConfigList); + //frameLength + Map combinedProcessorFields = null; + while (byteBuf.readableBytes() < frameLength) { + //一直处理 + for (AbstractCombinedFieldProcessor abstractCombinedProcessor : abstractCombinedProcessors) { + combinedProcessorFields = abstractCombinedProcessor.invoke(combinedProcessorFields, byteBuf, + combinedFieldConfigList, + fieldConfigsMap, storeObjectMap); + if (combinedProcessorFields == null || byteBuf.readableBytes() < frameLength) { + return; + } + } + + } + } + + /** + * 取出前导码匹配集合 + */ + private Map combinedFieldLeadCodeMap(List combinedFieldConfigList) { + Map fieldFixedMap = combinedFieldConfigList + .stream() + .collect(Collectors.toMap(CombinedFieldConfig::getPrefixCode, e -> e)); + return fieldFixedMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java new file mode 100644 index 0000000..643a934 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java @@ -0,0 +1,100 @@ +package com.casic.missiles.parser.resolver.fields; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.FieldParserSupport; +import com.casic.missiles.pojo.*; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 保存使用时最基本的信息,并且使用原型模式 + */ +@Slf4j +public class DefaultProtocolFieldParser extends FieldParserSupport implements FieldParser, FixedPropertyEnum { + + //通过传入的配置和报文进行字段解析 + @Override + public Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap) { + Map dataMap = new HashMap<>(); + for (AbstractFieldConfig protocolFieldConfig : protocolFieldConfigs) { + if (!ObjectUtils.isEmpty(protocolFieldConfig.getOriginPositionByte())) { + Object fieldValue = FieldResolver.parseField(buffer, protocolFieldConfig, null); + if (protocolFieldConfig.getIsStorage() == 1) { + storeObjectMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + dataMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + } + return dataMap; + } + + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength) { + Map fixedPropertyMap = new HashMap<>(); + Integer fixedLength = calculateLength(protocolFieldConfigs); + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + fixedPropertyMap.put(FIXED_POSITION, maxFixedPosition); + fixedPropertyMap.put(TOTAL_LENGTH, totalLength); + fixedPropertyMap.put(TAIL_POSITION, totalLength - fixedLength + maxFixedPosition); + return fixedPropertyMap; + } + + //** 获取业务内容的byteBuf + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer) { + //计算固定长度 + Integer fixedLength = calculateLength(protocolFieldConfigs); + //总长度获取 + String lightText = buffer.toString(Charset.forName("ISO-8859-1")); + Integer totalLength = lightText.length(); + //计算固定长度最大长度 + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + //计算数据报文内容 + ByteBuf bizDataFields = buffer.slice(maxFixedPosition - 1, (totalLength - fixedLength)); + return bizDataFields; + } + + /** + * 获取过滤字段的长度 + */ + @Override + public Integer getTotalFilterLength(ProtocolConfig protocolConfig, + ByteBuf byteBuf, + Map protocolFieldConfigMap) { + if (ByteBufUtil.hexDump(byteBuf).equals("")) { + return 0; + } + int totalFilterLength = 0; + String filterFields = protocolConfig.getTotalLengthFilterFields(); + try { + if (!StringUtils.isEmpty(filterFields)) { + String[] filterFieldList = filterFields.split(","); + for (String filterFieldId : filterFieldList) { + if (StringUtils.isNotEmpty(filterFieldId)) { + ProtocolFieldConfig fieldConfig = protocolFieldConfigMap.get(Long.valueOf(filterFieldId)); + //这里都是按字节计算,没有对位进行区分,可能会出现错误 + // 如果对位有需求,需要进一步跟进 + totalFilterLength += fieldConfig.getOffsetLength(); + } + } + } + return totalFilterLength; + } catch (Exception ex) { + log.error("报文确认分发阶段,获取报文总长度过滤长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); + } + return totalFilterLength; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java new file mode 100644 index 0000000..d51e887 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java @@ -0,0 +1,169 @@ +package com.casic.missiles.parser.resolver.fields; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.parser.resolver.ByteMergeProvider; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.AbstractFieldConfig; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.pojo.ByteResolverParam; +import io.netty.buffer.ByteBuf; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * 字段解析管理总类 + */ +@Slf4j +public class FieldResolver extends ByteMergeProvider { + + //1、字段截取 => 2、简单的字节解析和复杂的字节解析 + public static Object parseField(ByteBuf byteBuf,AbstractFieldConfig fieldConfig, Integer maxFixedPosition) { + Integer orignPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + //最大固定位置不为空, + if (!ObjectUtil.isEmpty(maxFixedPosition)) { + orignPosition -= maxFixedPosition; + } + Object fieldValue = 0; + //待优化 + if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { + fieldValue = doParseBitField(byteBuf, fieldConfig); + } else { + ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); + fieldValue = doParseByteField(fieldBytes, fieldConfig.getRuleJson()); + } + return fieldValue; + } + + //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, + //目前默认配置的规则设置暂不支持配置化,由实现完成 + private static Object doParseByteField(ByteBuf byteBuf, String ruleJson) { + Object fieldsResolveValue = null; + List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); + if (ObjectUtil.isEmpty(ruleMapList)) { + fieldsResolveValue = defaultResolveBuilder(byteBuf); + } else { + fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); + } + return fieldsResolveValue; + } + + private static Object defaultResolveBuilder(ByteBuf byteBuf) { + Integer defaultResolveValue = 0; + for (int i = 0; i < byteBuf.writerIndex(); i++) { + defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; + } + return defaultResolveValue; + } + + //字段解析构建器(针对字节单位的) + //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 + // 字节归并结束或者规则结束=>继续根据规则进行判断 + private static Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { + Object customizeResolveValue = null; + try { + List bytStrList = new ArrayList<>(); + //存放到数组里面 + for (int i = 0; i < byteBuf.writerIndex(); i++) { + bytStrList.add(byteBuf.readByte()); + } + int i = 0; + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { + if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + customizeResolveValue = resolveByteMerge(bytStrList, ruletypeId, vaildRange); + break; + } else { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + List tempBytStr = new ArrayList<>(); + for (int k = 0; i < bytStrList.size(); i++) { + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(k) + .value(bytStrList.get(k)) + .ruletypeId(ruletypeId).build(); + tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); + } + bytStrList = tempBytStr; + } + i++; + } + //字节归并到一起=>继续根据规则进行判断 + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(null) + .value(customizeResolveValue) + .ruletypeId(ruletypeId).build(); + customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); + i++; + } + System.out.println(JSON.toJSON(customizeResolveValue)); + return customizeResolveValue; + } catch (RuntimeException ex) { + log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); + return null; + } + } + + /** + * 1、单个字节情况表示字段 + * 2、多字节情况表示字段(暂未处理) + */ + private static Object doParseBitField(ByteBuf byteBuf,AbstractFieldConfig fieldConfig) { + Object fieldValue = new Object(); + try { + Integer orignPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + byte fields = 0x00; + if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { + fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); + } else { + fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); + } + + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { + if (!StringUtils.isEmpty(fieldConfig.getOriginPositionBit())) { + fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getOriginPositionBit())).byteValue() + >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); + } else { + fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); + } + } else { + fieldValue = Integer.valueOf(fields & 0xff); + } + if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { + return fieldValue; + } + List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); + int i = 0; + //字节归并到一起=>继续根据规则进行判断 + while (i < ruleMapList.size()) { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(null) + .value(fieldValue) + .ruletypeId(ruletypeId).build(); + fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); + i++; + } + System.out.println(JSON.toJSON(fieldValue)); + return fieldValue; + } catch (RuntimeException ex) { + log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); + return null; + } + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java deleted file mode 100644 index 35ae3d0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java +++ /dev/null @@ -1,183 +0,0 @@ -package com.casic.missiles.parser.resolver.fields; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufAllocator; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; -import org.springframework.util.ObjectUtils; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service("standard") -@AllArgsConstructor -@Slf4j -public class StandardFieldParser implements FieldParser { - - private final FieldConfigDao fieldConfigDao; - private final FieldResolver fieldResolver; - - //数据解析 - @Override - public Map dataParser(RuleConfig ruleConfig, String lightText, String protocolId) { - String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); - ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); - bufferContent.writeBytes(lightText.getBytes(Charset.forName("ISO-8859-1"))); - Map dataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - for (String dataFieldId : dataFieldIds) { - FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(dataFieldId); - if (!ObjectUtils.isEmpty(fieldConfig)) { - dataMap.put(fieldConfig.getFieldName(), String.valueOf(fieldResolver.filedParserManger(bufferContent, fieldConfig, maxFixedPosition))); - } - } - return dataMap; - } - - //数据解析 - @Override - public Map fixDataParser(String protocolId, ByteBuf buffer) { - List dataFieldIdList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Map dataMap = new HashMap<>(); - for (FieldConfig dataField : dataFieldIdList) { - if (!ObjectUtils.isEmpty(dataField.getOrignPosition())) { - Object fieldValue = (Integer) fieldResolver.filedParserManger(buffer, dataField, null); - dataMap.put(dataField.getFieldName(), fieldValue); - } - } - return dataMap; - } - - @Override - public Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf) { - if (ByteBufUtil.hexDump(byteBuf).equals("")) { - return 0; - } - String filterFields = protocolConfig.getTotalLengthFilterField(); - Integer totalLength = 0; - try { - FieldConfig totalFieldConfig = fieldConfigDao.getFieldConfigById(protocolConfig.getTotalLengthId()); - int totalFilterLength = 0; - if (!StringUtils.isEmpty(filterFields)) { - String[] filterFieldList = filterFields.split(","); - for (String filterField : filterFieldList) { - FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(filterField); - //这里都是按字节计算,没有对位进行区分,可能会出现错误 - - // 如果对位有需求,需要进一步跟进 - totalFilterLength += fieldConfig.getOffsetLength(); - } - } - totalLength = (Integer) fieldResolver.filedParserManger(byteBuf, totalFieldConfig, null) + totalFilterLength; - } catch (Exception ex) { - log.error("报文确认分发阶段,获取报文总长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); - } - return totalLength; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer) { - //业务内容 - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - String protocolId = String.valueOf(protocolConfig.getId()); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - //计算固定长度 - Integer fixedLength = calculateLength(fieldConfigList); -// Integer totalLength = this.getTotalLength(protocolConfig, buffer); - //总长度获取 - Integer totalLength = lightText.length(); - //计算固定长度最大长度 - Integer maxFixedPosition = calculatePosition(fieldConfigList); -// buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - //计算数据报文内容 - ByteBuf bizDataFields = buffer.slice(maxFixedPosition-1, (totalLength - fixedLength)); - return bizDataFields; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer) { - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - String protocolId = String.valueOf(protocolConfig.getId()); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer fixedLength = calculateLength(fieldConfigList); -// Integer totalLength = this.getTotalLength(protocolConfig, buffer); - Integer totalLength = lightText.length(); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - ByteBuf fixDataFields = buffer.slice(0, maxFixedPosition); - return fixDataFields; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer) { - String protocolId = String.valueOf(protocolConfig.getId()); - Map fixedPropertyMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer fixedLength = calculateLength(fieldConfigList); - Integer totalLength = this.getTotalLength(protocolConfig, buffer); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - fixedPropertyMap.put("fixedPosition", maxFixedPosition); - fixedPropertyMap.put("totalLength", totalLength); - fixedPropertyMap.put("tailPosition", totalLength - fixedLength + maxFixedPosition); - return fixedPropertyMap; - } - - //分别计算bit和byte长度=> 合并长度 - private Integer calculateLength(List fieldConfigList) { - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (FieldConfig fieldConfig : fieldConfigList) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - Integer fixedLength = bytefixedLength + bitfixedLength / 8; - return fixedLength; - } - - //找到最大值=> 根据最大值计算业务数据下标 - private Integer calculatePosition(List fieldConfigList) { - String rex = "[0-9]+"; - Integer max = -1; - for (FieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOrignPosition()) - && Integer.valueOf(fieldConfig.getOrignPosition()) > max) { - max = Integer.valueOf(fieldConfig.getOrignPosition()); - } - } - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (FieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOrignPosition()) && fieldConfig.getOrignPosition().equals(max)) { - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - } - } - Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; - return maxFixedPosition; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java new file mode 100644 index 0000000..d4ec6c7 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java @@ -0,0 +1,76 @@ +package com.casic.missiles.parser.rule; + +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import org.apache.commons.lang3.StringUtils; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class GenericRuleResolver { + + //根据前置字段的值,找到指定的规则 + //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 + //=>循环判断=>通过规则得到业务字段 + public static RuleConfig machRule(Map fixDataMap, + String ids, + List protocolFieldConfigs, + List ruleConfigs) { + List preRuleConfigList = getPreRuleList(ids, protocolFieldConfigs); + //获取前置规则字段 + final Map metaDataMap = getPreRuleFields(preRuleConfigList, fixDataMap); + //准备固定的字段集合 + Map fixDataFieldMap = getFixDataFieldMap(protocolFieldConfigs); + return RuleResolverCore.doMachRule(ruleConfigs, metaDataMap, fixDataMap, fixDataFieldMap); + } + + private static Map getFixDataFieldMap(List protocolFieldConfigs) { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, ProtocolFieldConfig::getFieldName) + ); + return fixDataFieldMap; + } + + + /** + * 查询前置规则的字段配置 + * + * @param ids + * @return + */ + private static List getPreRuleList(String ids, List protocolFieldConfigs) { + String[] idList = ids.split(","); + Map prepareMaps = new HashMap<>(); + for (String id : idList) { + if (StringUtils.isNotEmpty(id)) { + prepareMaps.put(Long.valueOf(id), ""); + } + } + List preRuleConfigList = protocolFieldConfigs + .stream() + .filter(e -> prepareMaps.containsKey(e.getId())) + .collect(Collectors.toList()); + return preRuleConfigList; + } + + /** + * 获取前置规则解析字段 + */ + private static Map getPreRuleFields(List preRuleFieldConfigList, Map fixDataMap) { + Map ruleFieldMap = new HashMap<>(); + preRuleFieldConfigList.stream() + .forEach( + preRuleFieldConfig -> { + String fieldName = preRuleFieldConfig.getFieldName(); + if (fixDataMap.containsKey(fieldName)) { + ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); + } + } + ); + return ruleFieldMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java new file mode 100644 index 0000000..baae7e8 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -0,0 +1,68 @@ +package com.casic.missiles.parser.rule; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.casic.missiles.pojo.RuleConfig; + +import java.util.*; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleResolverCore { + + + public static RuleConfig doMachRule(List ruleConfigList, Map metaDataMap, + Map fixDataMap, + Map fixDataFieldMap) { + Optional ruleConfigOptional = ruleConfigList.stream() + .filter(ruleConfig -> machRuleConfig( + JSON.parseObject(ruleConfig.getMatchRuleJson(), Map.class), metaDataMap)) + .findFirst(); + if (ObjectUtil.isEmpty(ruleConfigOptional)) { + return null; + } + String[] ruleFields = ruleConfigOptional.get().getDataFieldIds().split(","); + Map ruleMetaDataMap = getRuleFields(ruleFields, fixDataMap, fixDataFieldMap); + //递归选定解析规则,进行规则解析 + if (!ruleConfigOptional.get().getIsFinishMatch().equals("1")) { + //递归选定规则 + doMachRule(ruleConfigList, ruleMetaDataMap, fixDataMap, fixDataFieldMap); + } + return ruleConfigOptional.get(); + } + + + private static Map getRuleFields(String[] preRuleConfigList, Map fixedDataMap, + Map fixedFieldMap) { + Map ruleFieldMap = new HashMap<>(); + for (String preRuleConfigId : preRuleConfigList) { + String fieldName = fixedFieldMap.get(preRuleConfigId); + if (fixedDataMap.containsKey(fieldName)) { + ruleFieldMap.put(fieldName, String.valueOf(fixedDataMap.get(fieldName))); + } + } + return ruleFieldMap; + } + + + //匹配规则配置 + private static Boolean machRuleConfig(Map ruleMap, Map metaDataMap) { + if (ruleMap == null || metaDataMap == null) { + return null; + } + //所有的字段在规则里面必须有有配置 + for (String key : metaDataMap.keySet()) { + if (ruleMap.containsKey(key)) { + if (!ruleMap.get(key).equals(metaDataMap.get(key))) { + return false; + } + } else { + return false; + } + } + return true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java deleted file mode 100644 index 664088d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java +++ /dev/null @@ -1,92 +0,0 @@ -package com.casic.missiles.parser.rule; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.mapper.dao.PreRuleConfigDao; -import com.casic.missiles.mapper.dao.RuleConfigDao; -import lombok.AllArgsConstructor; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.*; -import java.util.stream.Collectors; - -@Service -@AllArgsConstructor -public class RulerProvider { - - private final FieldConfigDao fieldConfigDao; - private final PreRuleConfigDao preRuleConfigDao; - private final RuleConfigDao ruleConfigDao; - - //根据前置字段的值,找到指定的规则 - //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 - //=>循环判断=>通过规则得到业务字段 - public RuleConfig ruleConfig(Map fixDataMap, String protocolId) { - //批量获取规则 - List preRuleConfigList = preRuleConfigDao.getPreRuleList(protocolId); - //获取固定字段 - Map fixFieldMap = getAllFieldMap(protocolId); - //获取前置规则字段 - final String preRuleFields = getPreRuleFields(preRuleConfigList, fixDataMap, fixFieldMap); - List ruleConfigList = ruleConfigDao.getRuleConfigById(protocolId); - Optional ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig ->preRuleFields.equals( ruleConfig.getParseRuleJson())).findFirst(); - //递归选定解析规则,进行规则解析 - while (!ObjectUtil.isEmpty(ruleConfigOptional) && !ruleConfigOptional.get().getIsBizField().equals("1")) { - String ruleFields = getRuleFields(ruleConfigOptional.get().getDataFieldIds().split(","), fixDataMap, fixFieldMap); - ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig -> ruleConfig.getParseRuleJson().equals(ruleFields)).findFirst(); - } - return ruleConfigOptional.get(); - } - - /** - * 获取前置规则解析字段 - */ - private String getPreRuleFields(List preRuleConfigList, Map fixDataMap, Map fixFieldMap) { - Map ruleFieldMap= new HashMap<>(); - preRuleConfigList.stream() - .forEach( - preRuleConfig -> { - String fieldName = fixFieldMap.get(Long.valueOf(preRuleConfig.getRuleFieldId())); - if (fixDataMap.containsKey(fieldName)) { - ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); - } - } - ); - return JSONObject.toJSONString(ruleFieldMap); - } - - private Map getAllFieldMap(String protocolId) { - List fieldList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Map fixFieldMap = fieldList.stream().collect( - Collectors.toMap(FieldConfig::getId, FieldConfig::getFieldName) - ); - return fixFieldMap; - } - - private String getRuleFields(String[] preRuleConfigList, Map fixDataMap, Map fixFieldMap) { - Map ruleFieldMap= new HashMap<>(); - for (String preRuleConfigId : preRuleConfigList) { - String fieldName = fixFieldMap.get(preRuleConfigId); - if (fixDataMap.containsKey(fieldName)) { - ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); - } - } - return JSONObject.toJSONString(ruleFieldMap); - } - - //弃置 - private String ListToString(List ruleFieldList) { - String ruleFields = ""; - for (String ruleField : ruleFieldList) { - ruleFields += ruleField + ","; - } - ruleFields = StringUtils.isEmpty(ruleFields) ? ruleFields : ruleFields.substring(0, ruleFields.length() - 1); - return ruleFields; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java index 6177e10..bfa87a5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java @@ -2,7 +2,7 @@ public interface SafeStrategy { - String decryption(byte[] bytes); + String decryption(String cipher); String encryption(String lightText); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java index 618716c..6236302 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java @@ -9,9 +9,9 @@ //十六进制的字符串转换成字节数组 byte[] bytes = hexStrToBinaryStr(msg); //计算CRC8 - byte crc8 = CRC8(bytes, 0, bytes.length); - String crc8ToStr = "" + Integer.toHexString(0xff & crc8); - return crc8ToStr; +// String crc8ToStr = "" + Integer.toHexString(0xff & crc8); +// return crc8ToStr; + return null; } /** @@ -33,50 +33,5 @@ return bytes; } - /** - * CRC8 校验 多项式 x8+x2+x+1 - * - * @param b - * @param off - * @param len - * @return - */ - public static byte CRC8(final byte[] b, final int off, final int len) { - byte result = 0x00; - for (int i = 0; i < len; i++) { - result = CHECKSUM_TABLE[(result ^ (b[i + off] & 0xFF)) & 0xFF]; - } - return (byte) (result & 0xFFL); - } - - private final static byte[] CHECKSUM_TABLE = {(byte) 0x00, (byte) 0x07, (byte) 0x0e, (byte) 0x09, (byte) 0x1c, (byte) 0x1b, - (byte) 0x12, (byte) 0x15, (byte) 0x38, (byte) 0x3f, (byte) 0x36, (byte) 0x31, (byte) 0x24, (byte) 0x23, (byte) 0x2a, - (byte) 0x2d, (byte) 0x70, (byte) 0x77, (byte) 0x7e, (byte) 0x79, (byte) 0x6c, (byte) 0x6b, (byte) 0x62, (byte) 0x65, - (byte) 0x48, (byte) 0x4f, (byte) 0x46, (byte) 0x41, (byte) 0x54, (byte) 0x53, (byte) 0x5a, (byte) 0x5d, (byte) 0xe0, - (byte) 0xe7, (byte) 0xee, (byte) 0xe9, (byte) 0xfc, (byte) 0xfb, (byte) 0xf2, (byte) 0xf5, (byte) 0xd8, (byte) 0xdf, - (byte) 0xd6, (byte) 0xd1, (byte) 0xc4, (byte) 0xc3, (byte) 0xca, (byte) 0xcd, (byte) 0x90, (byte) 0x97, (byte) 0x9e, - (byte) 0x99, (byte) 0x8c, (byte) 0x8b, (byte) 0x82, (byte) 0x85, (byte) 0xa8, (byte) 0xaf, (byte) 0xa6, (byte) 0xa1, - (byte) 0xb4, (byte) 0xb3, (byte) 0xba, (byte) 0xbd, (byte) 0xc7, (byte) 0xc0, (byte) 0xc9, (byte) 0xce, (byte) 0xdb, - (byte) 0xdc, (byte) 0xd5, (byte) 0xd2, (byte) 0xff, (byte) 0xf8, (byte) 0xf1, (byte) 0xf6, (byte) 0xe3, (byte) 0xe4, - (byte) 0xed, (byte) 0xea, (byte) 0xb7, (byte) 0xb0, (byte) 0xb9, (byte) 0xbe, (byte) 0xab, (byte) 0xac, (byte) 0xa5, - (byte) 0xa2, (byte) 0x8f, (byte) 0x88, (byte) 0x81, (byte) 0x86, (byte) 0x93, (byte) 0x94, (byte) 0x9d, (byte) 0x9a, - (byte) 0x27, (byte) 0x20, (byte) 0x29, (byte) 0x2e, (byte) 0x3b, (byte) 0x3c, (byte) 0x35, (byte) 0x32, (byte) 0x1f, - (byte) 0x18, (byte) 0x11, (byte) 0x16, (byte) 0x03, (byte) 0x04, (byte) 0x0d, (byte) 0x0a, (byte) 0x57, (byte) 0x50, - (byte) 0x59, (byte) 0x5e, (byte) 0x4b, (byte) 0x4c, (byte) 0x45, (byte) 0x42, (byte) 0x6f, (byte) 0x68, (byte) 0x61, - (byte) 0x66, (byte) 0x73, (byte) 0x74, (byte) 0x7d, (byte) 0x7a, (byte) 0x89, (byte) 0x8e, (byte) 0x87, (byte) 0x80, - (byte) 0x95, (byte) 0x92, (byte) 0x9b, (byte) 0x9c, (byte) 0xb1, (byte) 0xb6, (byte) 0xbf, (byte) 0xb8, (byte) 0xad, - (byte) 0xaa, (byte) 0xa3, (byte) 0xa4, (byte) 0xf9, (byte) 0xfe, (byte) 0xf7, (byte) 0xf0, (byte) 0xe5, (byte) 0xe2, - (byte) 0xeb, (byte) 0xec, (byte) 0xc1, (byte) 0xc6, (byte) 0xcf, (byte) 0xc8, (byte) 0xdd, (byte) 0xda, (byte) 0xd3, - (byte) 0xd4, (byte) 0x69, (byte) 0x6e, (byte) 0x67, (byte) 0x60, (byte) 0x75, (byte) 0x72, (byte) 0x7b, (byte) 0x7c, - (byte) 0x51, (byte) 0x56, (byte) 0x5f, (byte) 0x58, (byte) 0x4d, (byte) 0x4a, (byte) 0x43, (byte) 0x44, (byte) 0x19, - (byte) 0x1e, (byte) 0x17, (byte) 0x10, (byte) 0x05, (byte) 0x02, (byte) 0x0b, (byte) 0x0c, (byte) 0x21, (byte) 0x26, - (byte) 0x2f, (byte) 0x28, (byte) 0x3d, (byte) 0x3a, (byte) 0x33, (byte) 0x34, (byte) 0x4e, (byte) 0x49, (byte) 0x40, - (byte) 0x47, (byte) 0x52, (byte) 0x55, (byte) 0x5c, (byte) 0x5b, (byte) 0x76, (byte) 0x71, (byte) 0x78, (byte) 0x7f, - (byte) 0x6a, (byte) 0x6d, (byte) 0x64, (byte) 0x63, (byte) 0x3e, (byte) 0x39, (byte) 0x30, (byte) 0x37, (byte) 0x22, - (byte) 0x25, (byte) 0x2c, (byte) 0x2b, (byte) 0x06, (byte) 0x01, (byte) 0x08, (byte) 0x0f, (byte) 0x1a, (byte) 0x1d, - (byte) 0x14, (byte) 0x13, (byte) 0xae, (byte) 0xa9, (byte) 0xa0, (byte) 0xa7, (byte) 0xb2, (byte) 0xb5, (byte) 0xbc, - (byte) 0xbb, (byte) 0x96, (byte) 0x91, (byte) 0x98, (byte) 0x9f, (byte) 0x8a, (byte) 0x8d, (byte) 0x84, (byte) 0x83, - (byte) 0xde, (byte) 0xd9, (byte) 0xd0, (byte) 0xd7, (byte) 0xc2, (byte) 0xc5, (byte) 0xcc, (byte) 0xcb, (byte) 0xe6, - (byte) 0xe1, (byte) 0xe8, (byte) 0xef, (byte) 0xfa, (byte) 0xfd, (byte) 0xf4, (byte) 0xf3}; } \ No newline at end of file diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java index 27c2838..6e078a3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java @@ -1,9 +1,6 @@ package com.casic.missiles.parser.safe.impl; -import cn.hutool.core.util.CharsetUtil; -import cn.hutool.crypto.symmetric.SM4; -import cn.hutool.crypto.symmetric.SymmetricCrypto; - +import com.casic.missiles.parser.safe.SafeStrategy; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; @@ -11,19 +8,44 @@ import org.bouncycastle.crypto.engines.SM4Engine; import org.bouncycastle.crypto.params.KeyParameter; import org.bouncycastle.util.encoders.Hex; - -import static cn.hutool.crypto.Mode.ECB; -import static cn.hutool.crypto.Padding.NoPadding; +import org.springframework.stereotype.Component; /** * SM4算法工具类 */ @Slf4j -public class Sm4 { +@Component("sm4") +public class Sm4 implements SafeStrategy { //加解密的字节快大小 public static final int BlockSize = 16; + @Override + public String decryption(String cipher) { + byte[] keyByte = { + 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 + }; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(keyByte); + byte[] in = Hex.decode(cipher); + byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); + String plain = EcbDecrypt(in, keyBytes); + return plain; + } + + @Override + public String encryption(String cipher) { + byte[] keyByte = { + 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 + }; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(keyByte); + byte[] in = Hex.decode(cipher); + byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); + String plain = EcbDecrypt(in, keyBytes); + return plain; + } + /** * SM4ECB加密算法,对内 * @@ -32,8 +54,6 @@ * @return */ private static byte[] ecb_encrypt(byte[] in, byte[] keyBytes) { - - SM4Engine sm4Engine = new SM4Engine(); sm4Engine.init(true, new KeyParameter(keyBytes)); byte[] out = new byte[in.length]; @@ -58,27 +78,6 @@ return cipher; } - - /** - * hutool 解密SM4 - * - * @param encodeContent - * @return - */ - public static String decode(String encodeContent) { - String key = "24ad182507479a5da3ad94d9d78ea203"; - try { - SymmetricCrypto sm4 = new SM4(ECB, NoPadding, key.getBytes()); - String decryptStr = sm4.decryptStr(encodeContent, CharsetUtil.CHARSET_UTF_8); - return decryptStr; - } catch (Exception e) { - e.printStackTrace(); - log.error("SM4解密失败"); - } - return null; - } - - /** * SM4的ECB加密算法 * @@ -129,20 +128,6 @@ return plain; } - /** - * SM4的ECB解密算法 - * - * @param cipher 输入的密文字符串 - * @param key 密钥 - * @return - */ - public static String EcbDecrypt(String cipher, String key) { - byte[] in = Hex.decode(cipher); - byte[] keyBytes = Hex.decode(key); - - String plain = EcbDecrypt(in, keyBytes); - return plain; - } /** * 主函数 @@ -151,28 +136,24 @@ */ public static void main(String[] args) { byte[] ciphertext = { + 0x4B, (byte) 0x8C, (byte) 0x9D, 0x08, (byte) 0xE4, (byte) 0xD3, 0x64, 0x42, (byte) 0xB9, (byte) 0xA5, (byte) 0xFE, (byte) 0xCD, (byte) 0x91, 0x1B, 0x38, (byte) 0xAC, (byte) 0xE9, 0x1C, (byte) 0xCD, 0x53, 0x02, (byte) 0xD7, 0x0C, (byte) 0x9B, (byte) 0x96, 0x30, 0x62, (byte) 0xE8, (byte) 0xFB, (byte) 0xEF, (byte) 0xB9, (byte) 0xFF, (byte) 0xDE, 0x19, (byte) 0x80, 0x35, 0x3E, (byte) 0x90, 0x4F, 0x2F, 0x12, 0x2B, 0x19, (byte) 0x8B, 0x6C, 0x7A, (byte) 0x85, (byte) 0xA1, (byte) 0xB1, (byte) 0x86, (byte) 0xA3, 0x7A, 0x46, 0x0C, 0x2F, (byte) 0x94, 0x4F, 0x7F, 0x2C, 0x56, 0x14, (byte) 0xF3, (byte) 0x89, (byte) 0xC3, - 0x3F, 0x20, (byte) 0xF9, (byte) 0x87, (byte) 0xA1, 0x60, (byte) 0xD9, (byte) 0xA8, (byte) 0xFD, (byte) 0xD7, (byte) 0x9B, 0x4B, 0x26, 0x06, 0x30, 0x44}; + 0x3F, 0x20, (byte) 0xF9, (byte) 0x87, (byte) 0xA1, 0x60, (byte) 0xD9, (byte) 0xA8, (byte) 0xFD, (byte) 0xD7, (byte) 0x9B, 0x4B, 0x26, 0x06, 0x30, 0x44 + }; ByteBuf in = ByteBufAllocator.DEFAULT.heapBuffer(); in.writeBytes(ciphertext); - byte[] keyByte = { 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 }; ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); - key.writeBytes(ciphertext); - String resCipherData = decode(ByteBufUtil.hexDump(in)); - ByteBuf out = ByteBufAllocator.DEFAULT.heapBuffer(); -// out.writeBytes(resCipherData); -// System.out.println(hexBytes); - System.out.println(resCipherData.toString()); -// String resPlainData = EcbDecrypt(resCipherData, key); -// System.out.println("原始明文:" + data); -// System.out.println("解密后明文:" + resPlainData); + key.writeBytes(keyByte); +// String resCipherData = EcbDecrypt(ByteBufUtil.hexDump(in), ByteBufUtil.hexDump(key)); +// System.out.println(resCipherData); } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java index 1395a51..ac5f957 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java @@ -1,7 +1,7 @@ package com.casic.missiles.parser.safe.impl; import io.netty.buffer.ByteBufUtil; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** *

@@ -14,9 +14,8 @@ * @author hyl * @version v1.0: Tea.java, v 0.1 2021/3/12 13:48 $ */ -@Service("tea") -///tea算法类 - +//tea算法类 +@Component("tea") public class Tea { public static byte[] MyTea_Encrypt(byte[] MyTeaContent, int ByteLen, byte[] MyTeakey) { @@ -99,7 +98,6 @@ // for(int i32Index = 0; i32Index < 8; i32Index++) { // System.out.print("0x" + Integer.toHexString(MyContent[i32Index]) + " "); // } - // System.out.println("密钥为:"); // for(int i32Index = 0; i32Index < 16; i32Index++) { // System.out.print("0x" + Integer.toHexString(MyKeys[i32Index]) + " "); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java index bdd0721..bd1516a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java @@ -3,7 +3,7 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.parser.sender.DataSubscribeProvider; import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponents; import org.springframework.web.util.UriComponentsBuilder; @@ -12,7 +12,7 @@ import java.util.Collections; import java.util.Map; -@Service("functionCallback") +@Component("functionCallback") public class FunctionCallback implements DataSubscribeProvider { @Resource diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java index 0b44fb9..7526de2 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.Map; -@Service("middleware") +@Component("middleware") public class MiddlewareSubscribe implements DataSubscribeProvider { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java index 5dcee3f..e2f1192 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.Map; -@Service("nosql") +@Component("nosql") public class NoSqlSubscribe implements DataSubscribeProvider { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java b/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java new file mode 100644 index 0000000..81a5324 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java @@ -0,0 +1,86 @@ +package com.casic.missiles.pojo; + +import lombok.Data; + +/** + * 协议 + */ +@Data +public class Msg { + + /** + * 前导码 + */ + private String preamble; + + /** + * 版本号 + */ + private String version; + + /** + * 内容长度 + */ + private int leng; + + /** + * 设备ID + */ + private String deviceId; + + /** + * 通讯方式 + */ + private Integer connType; + + /** + * 加密方式 + */ + private Integer encryType; + + /** + * 目标地址 + */ + private String destAddr; + + /** + * PDUType + */ + private String PDUType; + + /** + * 操作类型 + */ + private Integer operateType; + + /** + * 传输控制位 PDUType.bit7=0时,表示存在后续的访问;当PDUType.bit7=1时,表示无后续的访问。 + */ + private Integer transControlFlag; + + /** + * 设备类型 + */ + private Integer deviceType; + + /** + * 序号 + */ + private Integer seq; + + /** + * tagList + */ + private String tagList; + + /** + * OidList + */ + private String OidList; + + /** + * CRC + */ + private String CRC; + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java index 40a5265..97cc984 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java @@ -40,7 +40,7 @@ String httpContent = msg.toString(Charset.defaultCharset()); log.info(" String : " + msg.toString(Charset.defaultCharset())); String majorContent = httpContent.substring(httpContent.indexOf("{"), httpContent.lastIndexOf("}") + 1); - String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("serviceData")).get("Value")); + String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("RegistryData")).get("Value")); log.info("----------------------------------" + values); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); bufferContent.writeBytes(values.getBytes(Charset.forName("ISO-8859-1"))); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java index 608af3a..32cc8a4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java @@ -2,48 +2,47 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.delivery.decorator.ByteDecorator; +import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @AllArgsConstructor public class FieldDecoratorManger { - private final RuleDictDao ruleDictDao; + private final RuleConfigRegistry ruleDictDao; // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 // (1)静态的业务字段是字典里面可以配置的 // (2)动态的业务字段是通过规则生成的 public String contentMerge(String ruleJson, String sceneConent, String dynamicContent) { - List ruleDictList = ruleDictDao.getRuleDictConfig(); - Map ruleDictMap = ruleDictList.stream().collect( - Collectors.toMap(RuleDict::getId, e -> e)); - List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); - for (Map ruleMap : ruleMapList) { - String ruleType = String.valueOf(ruleMap.get("ruleType")); - ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); - NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); - byteDecorator.nodeDecoratorRule(nodeDecoratorParm); - } +// List ruleDictList = ruleDictDao.getRuleDictConfig(); +// Map ruleDictMap = ruleDictList.stream().collect( +// Collectors.toMap(RuleDict::getId, e -> e)); +// List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); +// for (Map ruleMap : ruleMapList) { +// String ruleType = String.valueOf(ruleMap.get("ruleType")); +// ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); +// NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); +// byteDecorator.nodeDecoratorRule(nodeDecoratorParm); +// } return null; } - - private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { - NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() - .contents(sceneConent) - .dynamicContent(dynamicContent) - .ruletypeId(ruletypeId) - .ruleDictMap(ruleDictMap) - .build(); - return nodeDecoratorParm; - } +// +// private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { +// NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() +// .contents(sceneConent) +// .dynamicContent(dynamicContent) +// .ruletypeId(ruletypeId) +// .ruleDictMap(ruleDictMap) +// .build(); +// return nodeDecoratorParm; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java index 652970c..b204ac3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java @@ -1,56 +1,56 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@AllArgsConstructor -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", - JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Component; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Component("logicalDecorator") +//@AllArgsConstructor +//@Slf4j +//public class LogicalShiftDecorator implements ByteDecorator { +// +//// private final FieldRuleEngineMapper fieldRuleEngineMapper; +//// +//// //字节位移 +//// @Override +//// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +//// String logicalValue = ""; +//// RuleEvaluator fieldRuleEngine = new RuleEvaluator(); +//// try { +//// Map env2 = new HashMap(); +//// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +//// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +//// for (String contentId : contentIdList) { +//// RuleDict ruleDict = ruleDictMap.get(contentId); +//// if (ruleDict.getCode().contains("#")) { +//// //使用动态的值 +//// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +//// } +//// env2.put(ruleDict.getName(), ruleDict.getCode()); +//// } +//// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +//// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +//// return null; +//// } +//// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +//// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +//// return values; +//// } catch (Exception ex) { +//// log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", +//// JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +//// return null; +//// } +//// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java index 346468f..822fead 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@AllArgsConstructor -@Slf4j -public class OperationDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("optionDecorator") +//@AllArgsConstructor +//@Slf4j +//public class OperationDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //混合运算,有常量或者乘除的缩放 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java index 50fb0a7..7a8bccb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@AllArgsConstructor -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +////精度计算 +//@AllArgsConstructor +//@Registry("precisionDecorator") +//@Slf4j +//public class PrecisionDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java index da39235..27f9cc7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java @@ -1,54 +1,53 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@AllArgsConstructor -@Slf4j -public class RuleDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("ruleDecorator") +//@AllArgsConstructor +//@Slf4j +//public class RuleDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //吃我一套正则表达式 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (Exception ex) { +// log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java index 7f5cbf3..c043f97 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java @@ -2,6 +2,6 @@ import java.util.Map; -public interface ComandeEventService { +public interface ComandeEventService{ Map loadComandeEventConfig(String protocolId,String scene); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java index 476ad84..aaf1837 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java @@ -2,46 +2,46 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.dao.CommandEventDao; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @Slf4j @AllArgsConstructor -public class ComandeEventServiceImpl implements ComandeEventService { +public class ComandeEventServiceImpl implements ComandeEventRegistry { - private final CommandEventDao commandEventDao; + // private final CommandEventDao commandEventDao; // 加密bean 固定字段出现变化的字段解析,业务字段的有序内容 @Override - public Map loadComandeEventConfig(String protocolId,String sceneName) { - CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); - if (ObjectUtil.isEmpty(commandEventConfig)) { - log.error("协议{},没有配置成功接收回复配置,清排查原因"); - return null; - } - String replyJson = commandEventConfig.getReplyContentJson(); - List> replyMapList = JSONArray.parseObject(replyJson, List.class); - List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); - Map fixMap = fixList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); - List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) - .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) - .collect(Collectors.toList()); - Map commandConfigMap = new HashMap<>(); - commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); - commandConfigMap.put("fixContent", fixMap); - commandConfigMap.put("bizContent", contentList); - return commandConfigMap; + public Map loadComandeEventConfig(String protocolId, String sceneName) { +// CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); +// if (ObjectUtil.isEmpty(commandEventConfig)) { +// log.error("协议{},没有配置成功接收回复配置,清排查原因"); +// return null; +// } +// String replyJson = commandEventConfig.getReplyContentJson(); +// List> replyMapList = JSONArray.parseObject(replyJson, List.class); +// List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); +// Map fixMap = fixList.stream() +// .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); +// List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) +// .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) +// .collect(Collectors.toList()); +// Map commandConfigMap = new HashMap<>(); +// commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); +// commandConfigMap.put("fixContent", fixMap); +// commandConfigMap.put("bizContent", contentList); +// return commandConfigMap; + return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 128b09d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java deleted file mode 100644 index 4016b0b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface DatagramEventMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java deleted file mode 100644 index 597c306..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.apache.ibatis.annotations.Mapper; - -public interface FieldConfigMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java deleted file mode 100644 index a31680a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.PreRuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface PreRuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java deleted file mode 100644 index 9060a69..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface ProtocolConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java deleted file mode 100644 index 6fa6936..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java deleted file mode 100644 index 582a705..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleDict; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleDictMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java deleted file mode 100644 index 6e302c8..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.CommandEventMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Optional; - -@Component -public class CommandEventDao { - - @Resource - private CommandEventMapper commandEventMapper; - - public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId) - .eq("scene", sceneName) - .eq("enabled", 1); - List commandEventConfig = commandEventMapper.selectList(queryWrapper); - Optional optionalEventConfig = commandEventConfig.stream().findFirst(); - return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java deleted file mode 100644 index 9137e4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.FieldConfigMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class FieldConfigDao { - - @Resource - private FieldConfigMapper fieldConfigMapper; - - public FieldConfig getFieldConfigById(String fieldId) { - FieldConfig fieldConfig = fieldConfigMapper.selectById(fieldId); - return fieldConfig; - } - - public List getFieldConfigs(String protocolId,Integer isFixed) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",isFixed); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - - public List getStorageFieldConfig(String protocolId) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",1) - .eq("is_storage",1); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java deleted file mode 100644 index 67bff6b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.mapper.PreRuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class PreRuleConfigDao { - - @Resource - private PreRuleConfigMapper preRuleConfigMapper; - - public List getPreRuleList(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return preRuleConfigMapper.selectList(queryWrapper); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java deleted file mode 100644 index d69ea85..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.RuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleConfigDao { - - @Resource - private RuleConfigMapper ruleConfigMapper; - - public RuleConfig getNextRuleConfig(String ruleFields) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("parse_rule_json", ruleFields); - return ruleConfigMapper.selectOne(queryWrapper); - } - - - public List getRuleConfigById(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return ruleConfigMapper.selectList(queryWrapper); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java deleted file mode 100644 index 932c185..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.RuleDictMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleDictDao { - - @Resource - private RuleDictMapper ruleDictMapper; - - public List getRuleDictConfig() { - List ruleDictList = ruleDictMapper.selectList(null); - return ruleDictList; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java index 9f9e279..43bc4d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java @@ -10,20 +10,15 @@ import io.netty.channel.socket.nio.NioServerSocketChannel; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import javax.annotation.PreDestroy; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static cn.hutool.core.util.ClassUtil.getClasses; /** * SensorhubServer netty服务端 */ @Slf4j -@Service +@Component public class SensorhubServer { /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java index 2c79ff5..9a28c36 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java @@ -11,13 +11,13 @@ import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioSocketChannel; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClient 客户端 */ @Slf4j -@Service +@Registry public final class SensorhubClient { public static void main(String[] args) throws Exception { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java index 9774be0..477c3f7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java @@ -6,12 +6,12 @@ import io.netty.channel.socket.SocketChannel; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientChannelInitialHandler */ -@Service +@Registry public class SensorhubClientChannelInitialHandler extends ChannelInitializer { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java index 346f4b3..73560e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java @@ -5,13 +5,13 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientHandler */ @Slf4j -@Service +@Registry public class SensorhubClientHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java index 5c1c6f2..d990af5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java @@ -4,12 +4,12 @@ import com.casic.missiles.pojo.Msg; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** * SensorhubServerHandler */ -@Service +@Component public class SensorhubServerHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 67283ae..af3172c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,41 +1,37 @@ package com.casic.missiles.parser; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultProtocolConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.*; +import com.casic.missiles.registry.FieldConfigRegistry; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; -import java.nio.charset.Charset; import java.util.HashMap; import java.util.List; import java.util.Map; -@Service("genericProtocolParser") +/** + * @author + */ +@Component("genericProtocolParser") @Slf4j -@AllArgsConstructor +@RequiredArgsConstructor public class GenericProtocolParser implements ProtocolParser { - private final LeadingCodeMatcher leadingCodeMatcher; private final List frameStructDispenserList; - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorInstanceSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; // 匹配首字母前导码=> 帧结构匹配前导码=> // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 @@ -44,18 +40,19 @@ public Boolean doParseProtocol(ByteBuf byteBuf) { String protocolContent = ByteBufUtil.hexDump(byteBuf); //匹配前导码 - List preCodeConfigs = leadingCodeMatcher.matchLeadingCode(protocolContent); + List preCodeConfigs = LeadingCodeMatcher.matchFrameLeadingCode(protocolContent); //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 if (preCodeConfigs.size() == 0) { - return rematch(byteBuf,protocolContent); + return rematch(byteBuf, protocolContent); } - //暂时先取第一个 + //暂时先取第一个,提升速度,使用享元模式, 减少类的创建销毁与构建 ProtocolConfig protocolConfig = preCodeConfigs.get(0); + AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); ByteBuf wholeDatagramByte = null; //通过匹配帧结构获取完整的数据包 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, preCodeConfigs.get(0))) != null) { + if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, protocolFactory)) != null) { break; } } @@ -68,76 +65,78 @@ * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 */ - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId, wholeDatagramByte); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap, protocolId); - //选取规则对应的流程实例 - DatagramEventConfig datagramEventConfig = processorInstanceSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); + //进行规则字段解析,进行匹配规则 + RuleConfig ruleConfig = getRuleConfig(protocolFactory, wholeDatagramByte); + if (ruleConfig == null) { + return false; + } //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, wholeDatagramByte); + ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte); + //以下进行业务的规则解析,同时选定流程实例 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); + DatagramEventProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain, + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText, protocolId); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain); //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); + datagramEventProvider.storeData(bizDataMap); return true; } - private Boolean rematch(ByteBuf byteBuf,String protocolContent) { + /** + * 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 + */ + private Boolean rematch(ByteBuf byteBuf, String protocolContent) { //重置位判断 byteBuf.resetReaderIndex(); //判断重置是否前移,如果没有前移,则直接判为匹配失败 if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { return false; } else { + //递归执行 return doParseProtocol(byteBuf); } } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; + //获取匹配规则->匹配规则 + private RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + //取出其中参与逻辑provider并判空 + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); + String rulePrepareFields = protocolConfig.getRulePrepareFields(); + //固定字段 + if (StringUtils.isNotEmpty(rulePrepareFields)) { + //获取统一固定字段解析 + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + //获取该协议的字段配置,用于协议规则匹配 + List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); + //获取规则 + RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, + rulePrepareFields, protocolFieldConfigs); + return ruleConfig; + } + return null; } - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + //数据构建,获取固定字段的store和业务字段store + private Map buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + Map bizDataMap = new HashMap<>(); + Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); + Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); + bizDataMap.putAll(ruleStoreObjectMap); + bizDataMap.putAll(protocolStoreObjectMap); return bizDataMap; } - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java index 8a46e32..16ce2e5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java @@ -3,6 +3,7 @@ import io.netty.buffer.ByteBuf; public interface ProtocolParser { + Boolean doParseProtocol(ByteBuf byteBuf); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java new file mode 100644 index 0000000..f7814af --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java @@ -0,0 +1,35 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.ProtocolConfigProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.ProtocolConfig; + +/** + * 存放基本协议的的加载信息 + */ +public class AbstractProtocolConfigFactory { + private final ProtocolConfigProvider protocolConfigProvider; + private final ProtocolFieldConfigProvider protocolFieldConfigProvider; + private final RuleConfigProvider ruleConfigProvider; + + public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { + this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); + this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); + this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); + } + + public ProtocolConfigProvider getProtocolConfigProvider() { + return protocolConfigProvider; + } + + public ProtocolFieldConfigProvider getProtocolFieldConfigProvider() { + return protocolFieldConfigProvider; + } + + public RuleConfigProvider getRuleConfigProvider() { + return ruleConfigProvider; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java new file mode 100644 index 0000000..6e36147 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java @@ -0,0 +1,57 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.CombinedFieldConfigProvider; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.FieldConfigProvider; +import com.casic.missiles.parser.provider.FieldRuleConfigProvider; + +/** + * 存放规则相关的的的加载信息 + */ +public class AbstractRuleConfigFactory { + + /** + * 处理字节 + */ + private final FieldConfigProvider fieldConfigProvider; + /** + * 处理组合字节解析的解码器 + */ + private final CombinedFieldConfigProvider combinedFieldConfigProvider; + /** + * 处理负责字节解析的规则配置 + */ + private final FieldRuleConfigProvider fieldRuleConfigProvider; + /** + * 处理实例流程 + */ + private final DatagramEventProvider datagramEventProvider; + + + public AbstractRuleConfigFactory(Long ruleId) { + this.fieldConfigProvider = new FieldConfigProvider(ruleId); + this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); + this.fieldRuleConfigProvider = new FieldRuleConfigProvider(ruleId); + this.datagramEventProvider = new DatagramEventProvider(ruleId); + } + + public FieldConfigProvider getFieldConfigProvider() { + return fieldConfigProvider; + } + + public CombinedFieldConfigProvider getCombinedFieldConfigProvider() { + return combinedFieldConfigProvider; + } + + public FieldRuleConfigProvider getFieldRuleConfigProvider() { + return fieldRuleConfigProvider; + } + + public DatagramEventProvider getDatagramEventProvider() { + return datagramEventProvider; + } + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java deleted file mode 100644 index 6e1719a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.factory; - - -import com.casic.missiles.pojo.ProtocolConfig; - -import java.util.List; - -/** - * 数据库访问优化(暂时未做) - *

- * 1、初始化协议解析配置,并存放到处存放缓存,对协议基本配置进行管理 - * 2、其中流程中所有的配置都经过此类进行管理,进行调用获取,增强解析速度 - */ -public interface DatagramFactory { - - /** - * 初始化 - */ - List datagramInit(); - - /** - * 根据前导码配置匹配,模糊匹配获取所有的报文项 - */ - List match(); - - /** - * 根据前导码匹配,返回报文项 - */ - List filer(); - - /** - * 保证数据的唯一性选择器 - */ - List selectOne(); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java new file mode 100644 index 0000000..87444a0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java @@ -0,0 +1,18 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +import java.util.List; + +/** + * 直接用,还是边用边创建 + */ +public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { + + + public DefaultProtocolConfigFactory(ProtocolConfig protocolConfig) { + super(protocolConfig); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java new file mode 100644 index 0000000..cce0c7c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java @@ -0,0 +1,12 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; + +public class DefaultRuleFactory extends AbstractRuleConfigFactory { + + public DefaultRuleFactory(Long ruleId) { + super(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java deleted file mode 100644 index 9ee97e0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.casic.missiles.parser.instance; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service -@Slf4j -@AllArgsConstructor -public class GeneralProcessor { - - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; - - /** - * 统一固定字段解析=>进行规则的查询的判断 - * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 - * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 - */ - @Deprecated - public boolean parseWholeDatagram(ByteBuf buffer, ProtocolConfig protocolConfig) { - try { - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap,protocolId); - //选取规则对应的流程= - DatagramEventConfig datagramEventConfig = processorSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); - //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); - //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); - //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); - //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); - //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); - return true; - } catch (Exception ex) { - log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", - ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); - return false; - } - } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; - } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); - } - - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); - return bizDataMap; - } - - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java index 25e7ad8..6a5777e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java @@ -1,23 +1,31 @@ package com.casic.missiles.parser.instance.impl; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.mapper.DatagramEventMapper; import com.casic.missiles.pojo.DatagramEventConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.SpringContextUtil; -@Service -@AllArgsConstructor +import java.util.List; +import java.util.Optional; + +/** + * @author cz + * + */ public class DefaultProcessorInstanceSelector implements ProcessorInstanceSelector { - private final DatagramEventMapper datagramEventMapper; + private static List datagramEventConfigs; + + static { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + datagramEventConfigs = datagramEventRegistry.getDatagramEventList(); + } @Override public DatagramEventConfig getProcessorInstance(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("rule_id", protocolId); - return datagramEventMapper.selectOne(queryWrapper); + Optional optionalSelectInstance = datagramEventConfigs.stream() + .filter(e -> e.getId().equals(protocolId)).limit(1).findFirst(); + return optionalSelectInstance.isPresent() ? optionalSelectInstance.get() : null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a778671..7b56a43 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,16 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import io.netty.buffer.ByteBuf; /** - * 分析匹配情况 - * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 - * 2、匹配不成功,有后续帧,可以进行下次匹配。 - * 3、匹配不成功,无后续帧,可以进行丢弃。 + * 分析匹配情况 + * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 + * 2、匹配不成功,有后续帧,可以进行下次匹配。 + * 3、匹配不成功,无后续帧,可以进行丢弃。 */ -public interface FrameStructMatcher{ +public interface FrameStructMatcher { - ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig); + ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 05320ab..8ebea78 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,23 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.ProtocolConfigMapper; +import com.casic.missiles.parser.provider.ProtocolConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Component; import java.util.List; import java.util.stream.Collectors; -@Component -@AllArgsConstructor public class LeadingCodeMatcher { - private final ProtocolConfigMapper protocolMapper; - //** 1、首字母匹配前导码, // 2、以匹配出的前导码是否在报文中条件进行前导码的匹配二次筛选 - public List matchLeadingCode(String protocolContent){ + public static List matchFrameLeadingCode(String protocolContent){ List initialConfigs = initialMatch(protocolContent); List preCodeConfigs = initialConfigs.stream() .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) @@ -26,13 +19,16 @@ } //初始化匹配前导码内容 - private List initialMatch(String protocolContent) { - String protocolStr = protocolContent.charAt(0) + ""; - QueryWrapper queryWrapper = new QueryWrapper() - .likeRight("pre_fix", protocolStr); - List protocolConfigList = protocolMapper.selectList(queryWrapper); - return protocolConfigList; + private static List initialMatch(String protocolContent) { + String firstFrameChar = protocolContent.charAt(0) + ""; + ProtocolConfigProvider protocolConfigProvider=new ProtocolConfigProvider(firstFrameChar); + return protocolConfigProvider.getMatchList(); } + + + + + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index cf2113d..e915877 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -1,32 +1,35 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(0) -@Service +@Component public class FrameLengthMatcher implements FrameStructMatcher { - @Autowired - private FieldParser fieldParser; - //超过长度 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { String dataGramContent = ByteBufUtil.hexDump(byteBuf); - if (StringUtils.isEmpty(protocolConfig.getUnpackId()) && StringUtils.isEmpty(protocolConfig.getTailStr())) { - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + //当不存在结尾标志和拆包标志,可以直接使用长度进行匹配 + if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { if (dataGramContent.length() >= totalLength) {//等于长度返回true,超出长度,切断 - ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, protocolConfig, totalLength); + ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, totalLength); return wholeDatagramByte; } else { //读的标志位前移舍弃 @@ -38,7 +41,7 @@ return null; } - private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, Integer totalLength) { byteBuf.readBytes(totalLength); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, totalLength - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 2bfc213..d527ad0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; @@ -13,7 +13,7 @@ import lombok.AllArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.nio.charset.Charset; import java.util.Map; @@ -22,32 +22,30 @@ * 后续标志验证 */ @Order(1) -@Service +@Component @AllArgsConstructor -public class FrameMarkMatcher implements FrameStructMatcher { - - private final FieldConfigDao fieldConfigDao; - private final FieldParser fieldParser; - private final FieldResolver fieldResolverManger; +public class FrameMarkMatcher implements FrameStructMatcher, FixedPropertyEnum { //帧后续标志=>结束,进行帧的重组=>有后续,1、帧移位判别 2、继续接收帧 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig UnpackConfig = StringUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getUnpackId()); - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); - Integer upback = 0; + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); ByteBuf mergeWholeFrameByte = null; - if (!ObjectUtil.isEmpty(UnpackConfig)) { - while (hasNextFullFrame(byteBuf, protocolConfig)) { - upback = (Integer) fieldResolverManger.filedParserManger(byteBuf, UnpackConfig, null); + if (!ObjectUtil.isEmpty(unpackFlag)) { + while (hasNextFullFrame(byteBuf, protocolConfig, protocolFieldConfigProvider)) { //是否存在后续位 - if (upback == 1) {//使用esayRule + if (unpackFlag == 1) {//使用esayRule //表示可以截取 - mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolConfig, totalLength); + mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolFieldConfigProvider, protocolConfig); return mergeWholeFrameByte; } else { - byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig)); + byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig, protocolFieldConfigProvider)); } } } @@ -56,7 +54,8 @@ //选取第一个帧,将业务内容和后面部分分开 //计算数据报文-业务内容 - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolFieldConfigProvider protocolFieldConfigProvider, ProtocolConfig protocolConfig) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); //截取完整报文 byteBuf.readBytes(totalLength); ByteBuf byteBufContent = byteBuf.slice(0, byteBuf.readerIndex()); @@ -68,15 +67,15 @@ String tail = ""; System.out.println(ByteBufUtil.hexDump(byteBufContent)); //会存在多个帧拼接在一起的的情况,进行合并处理 - while (hasNextFullFrame(byteBufContent, protocolConfig)) { - Integer currentFrameLength = fieldParser.getTotalLength(protocolConfig, byteBufContent); + while (hasNextFullFrame(byteBufContent, protocolConfig, protocolFieldConfigProvider)) { + Integer currentFrameLength = protocolFieldConfigProvider.getTotalLength(byteBufContent, protocolConfig); byteBufContent.readBytes(currentFrameLength); ByteBuf currentbyteBuf = byteBufContent.slice(0, byteBufContent.readerIndex()); byteBufContent.markReaderIndex();//读的标志位前移 System.out.println(ByteBufUtil.hexDump(byteBufContent)); String hexDump = currentbyteBuf.toString(Charset.forName("ISO-8859-1")); //获取当前固定帧结构的关系map - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, currentbyteBuf); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(currentbyteBuf, protocolConfig); if (StringUtils.isEmpty(mergeFrameStr)) { //首次获取业务数据报文 mergeFrameStr += hexDump.substring(0, currentFrameFixedProperty.get("tailPosition")); @@ -95,22 +94,22 @@ /** * 获取平移到下一帧起始位置 */ - public int getNextFrameOffset(ByteBuf buffer, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, buffer); - return currentFrameFixedProperty.get("totalLength"); + public int getNextFrameOffset(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + return currentFrameFixedProperty.get(TOTAL_LENGTH); } /** * 判断是否出错进行整个帧的 */ - public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, byteBuf); + public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); //保证读取位置不在固定位置,是可变的业务内容 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("fixedPosition")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(FIXED_POSITION)) { return false; } //判断读取是否操作帧长度 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("totalLength")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(TOTAL_LENGTH)) { return false; } return true; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 76a3784..c3a1bab 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -1,50 +1,50 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.parser.instance.GeneralProcessor; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; +import io.netty.buffer.ByteBufUtil;; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(2) -@Service +@Component public class FrameTailMatcher implements FrameStructMatcher { - @Resource - private FieldConfigDao fieldConfigDao; - @Autowired - private GeneralProcessor generalProcessor; - //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig tailFieldConfig = StringUtils.isEmpty(protocolConfig.getTailStr()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getTailStr()); - if (!ObjectUtil.isEmpty(tailFieldConfig)) { - String tailStr = tailFieldConfig.getFieldName(); + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfig protocolFieldConfig = ObjectUtils.isEmpty(protocolConfig.getTailStr()) ? null : + fieldConfigProvider.getFieldConfigById(protocolConfig.getTailStr()); + if (!ObjectUtil.isEmpty(protocolFieldConfig)) { + String tailStr = protocolFieldConfig.getFieldName(); String dataGramContent = ByteBufUtil.hexDump(byteBuf); Boolean tailFlag = ByteBufUtil.hexDump(byteBuf).contains(tailStr); if (!tailFlag) { //使用esayRule return null; } else if (dataGramContent.indexOf(tailStr) < dataGramContent.length() - tailStr.length()) { Integer length = dataGramContent.indexOf(tailStr) + tailStr.length(); - ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, protocolConfig, length); + ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, length); return wholeDatagramByte; //存在粘包 } } return null; } - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer length) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, Integer length) { byteBuf.readBytes(length); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, length - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java new file mode 100644 index 0000000..5f1c177 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java @@ -0,0 +1,73 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.combined.GenericCombinedFieldResolver; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.CombinedFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class CombinedFieldConfigProvider { + + + /** + * 作为临时配置列表缓存使用 + */ + private final List combinedFieldConfigList; + private Map storeObjectMap = new HashMap<>(); + + public CombinedFieldConfigProvider(Long ruleId) { + CombinedFieldConfigRegistry combinedFieldConfigRegistry = SpringContextUtil.getBean(CombinedFieldConfigRegistry.class); + combinedFieldConfigList = combinedFieldConfigRegistry.getCombinedFieldConfigList(ruleId); + } + + public void parseDataField(RuleConfig ruleConfig, String clearZeroPlain,Map fieldConfigsMap ) { + if (showSkip()) { + return; + } + //匹配对应的数据,然后进行相关的字段解析 + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver(); + combinedFieldResolver.parseDataField(combinedFieldConfigList, byteBuf, storeObjectMap,fieldConfigsMap); + } + + + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getCombinedFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return combinedFieldConfigList.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public List getCombinedFieldConfigList() { + return combinedFieldConfigList; + } + + /* 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(combinedFieldConfigList) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java new file mode 100644 index 0000000..f3cfedc --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java @@ -0,0 +1,11 @@ +package com.casic.missiles.parser.provider; + +/** + * @author cz + * @date 2023-6-12 + */ +public class CommandEventProvider{ + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java new file mode 100644 index 0000000..70eec5e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java @@ -0,0 +1,77 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.safe.SafeStrategy; +import com.casic.missiles.parser.sender.DataSubscribeProvider; +import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class DatagramEventProvider { + + private final DatagramEventConfig processorInstance; + + public DatagramEventProvider(Long ruleId) { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + List datagramEventConfigList = + datagramEventRegistry.getDatagramEventList(ruleId); + processorInstance = this.getProcessorInstance(datagramEventConfigList); + } + + public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { + if (showSkip()) { + return null; + } + return datagramEventConfigList.get(0); + } + + // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 + public String getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap) { + String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? + processorInstance.getSafeBean() : + fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); + if (!StringUtils.isEmpty(safeName)) { + //需要加密 + SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); + String plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); + return clearComplementZero(plain); + } + return ByteBufUtil.hexDump(bizDataContent); + } + + //解密清零操作 + private String clearComplementZero(String plain) { + plain = plain.substring(0, plain.lastIndexOf("00")); + return plain; + } + + //数据发送,数据发送者暂未构建 + public void storeData(Map bizDataMap) { + DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); +// dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return ObjectUtils.isNotEmpty(processorInstance) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java new file mode 100644 index 0000000..7e1fe0a --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java @@ -0,0 +1,97 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.FieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class FieldConfigProvider { + + + private final List fieldConfigs; + private Map storeObjectMap = new HashMap<>(); +// private Map singleObjects = new ConcurrentHashMap<>(); + + public FieldConfigProvider(Long ruleId) { + FieldConfigRegistry fieldConfigRegistry = SpringContextUtil.getBean(FieldConfigRegistry.class); + fieldConfigs = fieldConfigRegistry.getFieldConfigList(ruleId); + } + + public List getFieldConfigs() { + return fieldConfigs; + } + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public Map parseDataField(RuleConfig ruleConfig, String clearZeroPlain) { + if (showSkip()) { + return null; + } + List prepareFieldConfig = prepareParseField(ruleConfig); + if (CollectionUtils.isNotEmpty(prepareFieldConfig)) { + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(fieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + return fixDataMap; + } + } + return null; + } + + /** + * 得到需要处理的业务内容 + * + * @return + */ + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return fieldConfigs.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public Map getFieldConfigsMap() { + return fieldConfigs.stream().collect( + Collectors.toMap(FieldConfig::getId, e -> e) + ); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(fieldConfigs) ? false : true; + } + + +} + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java new file mode 100644 index 0000000..817bfaf --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java @@ -0,0 +1,19 @@ +package com.casic.missiles.parser.provider; + +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.registry.FieldRuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; + +public class FieldRuleConfigProvider { + + private final List fieldRuleConfigList; + + public FieldRuleConfigProvider(Long ruleId) { + FieldRuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(FieldRuleConfigRegistry.class); + fieldRuleConfigList = ruleConfigRegistry.getFieldRuleConfigList(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java new file mode 100644 index 0000000..99a1b06 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java @@ -0,0 +1,53 @@ +package com.casic.missiles.parser.provider; + + +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.registry.ProtocolConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolConfigProvider { + + private final List protocolConfigList; + + public ProtocolConfigProvider(String firstChar) { + ProtocolConfigRegistry registry = SpringContextUtil.getBean(ProtocolConfigRegistry.class); + protocolConfigList = registry.getProtocolConfigList(firstChar); + } + + public List getMatchList() { + return protocolConfigList; + } + + /** + * 设置当前协议 + * + * @param protocolConfig + */ + public ProtocolConfigProvider(ProtocolConfig protocolConfig) { + List protocolConfigs = new ArrayList<>(); + protocolConfigs.add(protocolConfig); + protocolConfigList = protocolConfigs; + } + + /** + * 获取当前协议 + * + * @return + */ + public ProtocolConfig getCurrentProtocolConfig() { + if (this.protocolConfigList == null) { + return null; + } else { + return protocolConfigList.get(0); + } + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java new file mode 100644 index 0000000..043927d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java @@ -0,0 +1,213 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.registry.ProtocolFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolFieldConfigProvider { + + private static final String FIXED_FIELD_DS = "fixedFieldDs"; + private static final String CONTENT_FIELD_DS = "contentFieldDs"; + private static final String PROTOCOL_LENGTH = "protocolLength"; + private static final String PROTOCOL_FIELD_ID = "protocolFieldId"; + private static final String PROTOCOL_POSITION = "protocolPosition"; + + private final List protocolFieldConfigs; + private Map singleObjects = new ConcurrentHashMap<>(); + private Map storeObjectMap = new HashMap<>(); + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public ProtocolFieldConfigProvider(Long protocolId) { + ProtocolFieldConfigRegistry protocolFieldConfigRegistry = SpringContextUtil.getBean(ProtocolFieldConfigRegistry.class); + protocolFieldConfigs = protocolFieldConfigRegistry.getProtocolFieldConfigList(protocolId); + } + + public List getProtocolFieldConfigs() { + return protocolFieldConfigs; + } + + public ProtocolFieldConfig getFieldConfigById(Long fieldId) { + Optional optionalConfig = protocolFieldConfigs.stream().filter( + e -> e.getId().equals(fieldId) + ).findFirst(); + return optionalConfig.isPresent() ? optionalConfig.get() : null; + } + + public Integer getProtocolFieldValue(Long protocolFieldId, ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_FIELD_ID + protocolFieldId + ByteBufUtil.hexDump(byteBuf); + //获取缓存 + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + //加载固定长度数据集合 + Map fixDataMap = this.getProtocolDataMap(byteBuf); + ProtocolFieldConfig protocolFieldConfig = selectFieldConfig(protocolFieldId); + Integer protocolFieldValue = 0; + //获取约定字段的总长度 + if (fixDataMap.containsKey(protocolFieldConfig.getFieldName())) { + Object appointUnpackObject = fixDataMap.get(protocolFieldConfig.getFieldName()); + if (ObjectUtils.isNotEmpty(appointUnpackObject)) { + protocolFieldValue = (Integer) appointUnpackObject; + } + } + if (protocolFieldValue != null) { + //加入缓存 + if (ObjectUtils.isNotEmpty(protocolFieldValue)) { + this.singleObjects.put(catchKey, protocolFieldValue); + return protocolFieldValue; + } + } + return null; + } + + /** + * 获取帧固定位置信息 + * + * @param byteBuf + * @param protocolConfig + * @return + */ + public Map getFixedProperty(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_POSITION + protocolConfig.getId(); + if (this.singleObjects.containsKey(catchKey)) { + return (Map) singleObjects.get(catchKey); + } + Map fixedPropertyMap = new HashMap<>(); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + fixedPropertyMap = fieldParser.doGetFixedProperty(protocolFieldConfigs, this.getTotalLength(byteBuf,protocolConfig)); + if (CollectionUtils.isNotEmpty(fixedPropertyMap)) { + this.singleObjects.put(catchKey, fixedPropertyMap); + return fixedPropertyMap; + } + return fixedPropertyMap; + } + + /** + * 获取帧结构应有的总长度 + */ + public Integer getTotalLength(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_LENGTH + ByteBufUtil.hexDump(byteBuf); + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + Integer appointFrameLength = getProtocolFieldValue(protocolConfig.getTotalLengthId(), byteBuf); + if (appointFrameLength != null) { + //获取过滤的字段集合总长度 + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Integer totalFilterLength = fieldParser.getTotalFilterLength(protocolConfig, byteBuf, getFixFieldConfigMap()); + //计算总长度 + Integer totalLength = appointFrameLength + totalFilterLength; + //加入缓存 + if (ObjectUtils.isNotEmpty(totalLength)) { + this.singleObjects.put(catchKey, totalLength); + return totalLength; + } + } + return null; + } + + /** + * 获取协议有关字段解析内容 + * storeObjectMap存储代转存的数据 + * + * @return + */ + public Map getProtocolDataMap(ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(FIXED_FIELD_DS)) { + return (Map) singleObjects.get(FIXED_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(protocolFieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + this.singleObjects.put(FIXED_FIELD_DS, fixDataMap); + return fixDataMap; + } + return null; + } + + /** + * 获取业务报文内容的content字节 + * + * @param wholeDatagramByte + * @return + */ + public ByteBuf getDataContentBuf(ByteBuf wholeDatagramByte) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(CONTENT_FIELD_DS)) { + return (ByteBuf) singleObjects.get(CONTENT_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + ByteBuf bizDataByteBuf = fieldParser.getDataContentBuf(protocolFieldConfigs, wholeDatagramByte); + if (bizDataByteBuf != null) { + this.singleObjects.put(CONTENT_FIELD_DS, bizDataByteBuf); + return bizDataByteBuf; + } + return null; + } + + + private ProtocolFieldConfig selectFieldConfig(Long id) { + Optional optionalProtocolFieldConfig = this.protocolFieldConfigs.stream().filter( + e -> e.getId().equals(id) + ).findFirst(); + return optionalProtocolFieldConfig.isPresent() ? optionalProtocolFieldConfig.get() : null; + } + + + private Map getFixFieldConfigMap() { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, e -> e) + ); + return fixDataFieldMap; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(protocolFieldConfigs) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java new file mode 100644 index 0000000..dafba1c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java @@ -0,0 +1,56 @@ +package com.casic.missiles.parser.provider; + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.rule.GenericRuleResolver; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.RuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleConfigProvider { + + private final List ruleConfigs; + + public List getRuleConfigs() { + return ruleConfigs; + } + + public RuleConfigProvider(Long protocolId) { + RuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(RuleConfigRegistry.class); + ruleConfigs = ruleConfigRegistry.getRuleConfigById(protocolId); + } + + /** + * 获取规则匹配结果 + * + * @param parseFixedDataMap + * @param protocolFieldConfigs + * @return + */ + public RuleConfig doGetRule(Map parseFixedDataMap, + String ids, + List protocolFieldConfigs) { + if (showSkip()) { + return null; + } + RuleConfig ruleConfig = GenericRuleResolver.machRule(parseFixedDataMap, ids, protocolFieldConfigs, ruleConfigs); + return ruleConfig; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(ruleConfigs) ? false : true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java index 3c05891..856b399 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java @@ -1,18 +1,11 @@ package com.casic.missiles.parser.resolver; -import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.springframework.web.bind.annotation.RequestBody; -import javax.annotation.Resource; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -20,19 +13,17 @@ @Slf4j public class ByteMergeProvider { - @Resource - private FieldRuleEngineMapper fieldRuleEngineMapper; - //拿到所有的值合并到一个值 - public String resolveByteMerge(List valueList, String ruletypeId, String vaildRange) { + public static String resolveByteMerge(List valueList, String ruleTypeId, String vaildRange) { String values = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Map vaildMap = getValidRangeMap(vaildRange); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(ruletypeId); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } + //暂时不处理 +// fieldRuleEngine = fieldRuleConfigMapper.selectById(ruleTypeId); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } Map env2 = new HashMap(); for (int i = 0; i < valueList.size(); i++) { if (vaildMap.containsKey(i)) { @@ -47,7 +38,7 @@ } } - private Map getValidRangeMap(String vaildRange) { + private static Map getValidRangeMap(String vaildRange) { String[] range = vaildRange.split(","); Map vaildMap = new HashMap(); for (int i = 0; i < range.length; i++) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 8d821cd..85d6bbf 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -1,9 +1,12 @@ package com.casic.missiles.parser.resolver; +import com.casic.missiles.pojo.AbstractFieldConfig; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; import io.netty.buffer.ByteBuf; +import java.util.List; import java.util.Map; /** @@ -11,18 +14,14 @@ */ public interface FieldParser { -// Map fieldProcess(String protocolContent,); - Map dataParser(RuleConfig ruleConfig, String lightText,String protocolId); + Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength); - Map fixDataParser(String protocolId, ByteBuf buffer); + Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap); - Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf); + ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer); - ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer); - - ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer); - - Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer); + Integer getTotalFilterLength(ProtocolConfig protocolConfig, ByteBuf byteBuf, Map protocolFieldConfigMap); } + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java new file mode 100644 index 0000000..9e0c00e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java @@ -0,0 +1,52 @@ +package com.casic.missiles.parser.resolver; + +import com.casic.missiles.pojo.AbstractFieldConfig; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.util.List; + +public class FieldParserSupport { + + //分别计算bit和byte长度=> 合并长度 + protected Integer calculateLength(List fieldConfigList) { + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + Integer fixedLength = bytefixedLength + bitfixedLength / 8; + return fixedLength; + } + + //找到最大值=> 根据最大值计算业务数据下标 + protected Integer calculatePosition(List fieldConfigList) { + String rex = "[0-9]+"; + Integer max = -1; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) + && Integer.valueOf(fieldConfig.getOriginPositionByte()) > max) { + max = Integer.valueOf(fieldConfig.getOriginPositionByte()); + } + } + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) && fieldConfig.getOriginPositionByte().equals(max)) { + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + } + } + Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; + return maxFixedPosition; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java deleted file mode 100644 index dd3a6cd..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java +++ /dev/null @@ -1,170 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.ByteResolverParam; -import io.netty.buffer.ByteBuf; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -/** - * 字段解析管理总类 - */ -@Service -@Slf4j -@AllArgsConstructor -public class FieldResolver extends ByteMergeProvider { - - //1、字段截取 => 2、简单的字节解析和复杂的字节解析 - public Object filedParserManger(ByteBuf byteBuf, FieldConfig fieldConfig, Integer maxFixedPosition) { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - //最大固定位置不为空, - if (!ObjectUtil.isEmpty(maxFixedPosition)) { - orignPosition -= maxFixedPosition; - } - Object fieldValue = 0; - //待优化 - if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { - fieldValue = bitToResolver(byteBuf, fieldConfig); - } else { - ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); - fieldValue = parsingFields(fieldBytes, fieldConfig.getRuleJson()); - } - return fieldValue; - } - - //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, - //目前默认配置的规则设置暂不支持配置化,由实现完成 - private Object parsingFields(ByteBuf byteBuf, String ruleJson) { - Object fieldsResolveValue = null; - List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); - if (ObjectUtil.isEmpty(ruleMapList)) { - fieldsResolveValue = defaultResolveBuilder(byteBuf); - } else { - fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); - } - return fieldsResolveValue; - } - - private Object defaultResolveBuilder(ByteBuf byteBuf) { - Integer defaultResolveValue = 0; - for (int i = 0; i < byteBuf.writerIndex(); i++) { - defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; - } - return defaultResolveValue; - } - - //字段解析构建器(针对字节单位的) - //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 - // 字节归并结束或者规则结束=>继续根据规则进行判断 - private Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { - Object customizeResolveValue = null; - try { - List bytStrList = new ArrayList<>(); - //存放到数组里面 - for (int i = 0; i < byteBuf.writerIndex(); i++) { - bytStrList.add(byteBuf.readByte()); - } - int i = 0; - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - customizeResolveValue = this.resolveByteMerge(bytStrList, ruletypeId,vaildRange); - break; - } else { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - List tempBytStr = new ArrayList<>(); - for (int k = 0; i < bytStrList.size(); i++) { - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(k) - .value(bytStrList.get(k)) - .ruletypeId(ruletypeId).build(); - tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); - } - bytStrList = tempBytStr; - } - i++; - } - //字节归并到一起=>继续根据规则进行判断 - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(customizeResolveValue) - .ruletypeId(ruletypeId).build(); - customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(customizeResolveValue)); - return customizeResolveValue; - } catch (RuntimeException ex) { - log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); - return null; - } - } - - /** - * 1、单个字节情况表示字段 - * 2、多字节情况表示字段(暂未处理) - */ - private Object bitToResolver(ByteBuf byteBuf, FieldConfig fieldConfig) { - Object fieldValue = new Object(); - try { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - byte fields = 0x00; - if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); - } else { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); - } - - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { - if (!StringUtils.isEmpty(fieldConfig.getExactOrignPosition())) { - fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getExactOrignPosition())).byteValue() - >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); - } else { - fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); - } - } else { - fieldValue = Integer.valueOf(fields & 0xff); - } - if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { - return fieldValue; - } - List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); - int i = 0; - //字节归并到一起=>继续根据规则进行判断 - while (i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(fieldValue) - .ruletypeId(ruletypeId).build(); - fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(fieldValue)); - return fieldValue; - } catch (RuntimeException ex) { - log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); - return null; - } - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java new file mode 100644 index 0000000..1d2aeab --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java @@ -0,0 +1,36 @@ +package com.casic.missiles.parser.resolver.bytes; + +import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.mapper.FieldRuleConfigMapper; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.pojo.ByteResolverParam; +import com.googlecode.aviator.AviatorEvaluator; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; +//转换规则 +@Component("convert") +@AllArgsConstructor +@Slf4j +public class ByteRuleResolver implements ByteResolver { + + private final FieldRuleConfigMapper fieldRuleConfigMapper; + + @Override + public Object resolveOperationRule(ByteResolverParam byteResolverParam){ + FieldRuleConfig fieldRuleEngine=fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); + if(ObjectUtil.isEmpty(fieldRuleEngine)){ + return byteResolverParam.getValue(); + } + String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); + Map env2 = new HashMap(); + env2.put("value", (byte) byteResolverParam.getValue()); + String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); + return values; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java index 103821c..786b71c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java @@ -2,34 +2,34 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("logicalShift") +@Component("logicalShift") @AllArgsConstructor @Slf4j public class LogicalShiftResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //字节位移 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { Integer index = byteResolverParam.getIndex(); - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return byteResolverParam.getValue(); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java index 476747d..01149bd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("operation") +@Component("operation") @AllArgsConstructor @Slf4j public class OperationResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //混合运算,有常量或者乘除的缩放 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java index 0b82cf4..79abcce 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.casic.missiles.pojo.ByteResolverParam; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; //精度计算 -@Service("precision") +@Component("precision") @AllArgsConstructor @Slf4j public class PrecisionResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java deleted file mode 100644 index 5c3f332..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; -//转换规则 -@Service("convert") -@AllArgsConstructor -@Slf4j -public class RuleResolver implements ByteResolver { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam){ - RuleEvaluator fieldRuleEngine=fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); - if(ObjectUtil.isEmpty(fieldRuleEngine)){ - return byteResolverParam.getValue(); - } - String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); - Map env2 = new HashMap(); - env2.put("value", (byte) byteResolverParam.getValue()); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java new file mode 100644 index 0000000..d3bbd91 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java @@ -0,0 +1,15 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; + +import java.util.List; +import java.util.Map; +// 前导码匹配->长度字段 +public interface AbstractCombinedFieldProcessor { + + Map invoke(Map map, ByteBuf byteBuf, List combinedFieldConfigList, + Map fieldConfigsMap, Map storeObjectMap); + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java new file mode 100644 index 0000000..03c8480 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java @@ -0,0 +1,59 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-13 + */ +//依次递增进行数据的解析, +public class GenericCombinedFieldResolver { + + + //通过查询,字段长度长度随机 + public void parseDataField(List combinedFieldConfigList, ByteBuf byteBuf, + Map storeObjectMap, Map fieldConfigsMap) { + Integer frameLength = Integer.valueOf(ByteBufUtil.hexDump(byteBuf)); + //添加前置处理器 + com.casic.missiles.util.ClassUtil classUtil = new com.casic.missiles.util.ClassUtil(); + List abstractCombinedProcessors = classUtil.getSubClassList(AbstractCombinedFieldProcessor.class); + + Map fieldFixedMap = combinedFieldLeadCodeMap(combinedFieldConfigList); + //frameLength + Map combinedProcessorFields = null; + while (byteBuf.readableBytes() < frameLength) { + //一直处理 + for (AbstractCombinedFieldProcessor abstractCombinedProcessor : abstractCombinedProcessors) { + combinedProcessorFields = abstractCombinedProcessor.invoke(combinedProcessorFields, byteBuf, + combinedFieldConfigList, + fieldConfigsMap, storeObjectMap); + if (combinedProcessorFields == null || byteBuf.readableBytes() < frameLength) { + return; + } + } + + } + } + + /** + * 取出前导码匹配集合 + */ + private Map combinedFieldLeadCodeMap(List combinedFieldConfigList) { + Map fieldFixedMap = combinedFieldConfigList + .stream() + .collect(Collectors.toMap(CombinedFieldConfig::getPrefixCode, e -> e)); + return fieldFixedMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java new file mode 100644 index 0000000..643a934 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java @@ -0,0 +1,100 @@ +package com.casic.missiles.parser.resolver.fields; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.FieldParserSupport; +import com.casic.missiles.pojo.*; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 保存使用时最基本的信息,并且使用原型模式 + */ +@Slf4j +public class DefaultProtocolFieldParser extends FieldParserSupport implements FieldParser, FixedPropertyEnum { + + //通过传入的配置和报文进行字段解析 + @Override + public Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap) { + Map dataMap = new HashMap<>(); + for (AbstractFieldConfig protocolFieldConfig : protocolFieldConfigs) { + if (!ObjectUtils.isEmpty(protocolFieldConfig.getOriginPositionByte())) { + Object fieldValue = FieldResolver.parseField(buffer, protocolFieldConfig, null); + if (protocolFieldConfig.getIsStorage() == 1) { + storeObjectMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + dataMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + } + return dataMap; + } + + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength) { + Map fixedPropertyMap = new HashMap<>(); + Integer fixedLength = calculateLength(protocolFieldConfigs); + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + fixedPropertyMap.put(FIXED_POSITION, maxFixedPosition); + fixedPropertyMap.put(TOTAL_LENGTH, totalLength); + fixedPropertyMap.put(TAIL_POSITION, totalLength - fixedLength + maxFixedPosition); + return fixedPropertyMap; + } + + //** 获取业务内容的byteBuf + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer) { + //计算固定长度 + Integer fixedLength = calculateLength(protocolFieldConfigs); + //总长度获取 + String lightText = buffer.toString(Charset.forName("ISO-8859-1")); + Integer totalLength = lightText.length(); + //计算固定长度最大长度 + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + //计算数据报文内容 + ByteBuf bizDataFields = buffer.slice(maxFixedPosition - 1, (totalLength - fixedLength)); + return bizDataFields; + } + + /** + * 获取过滤字段的长度 + */ + @Override + public Integer getTotalFilterLength(ProtocolConfig protocolConfig, + ByteBuf byteBuf, + Map protocolFieldConfigMap) { + if (ByteBufUtil.hexDump(byteBuf).equals("")) { + return 0; + } + int totalFilterLength = 0; + String filterFields = protocolConfig.getTotalLengthFilterFields(); + try { + if (!StringUtils.isEmpty(filterFields)) { + String[] filterFieldList = filterFields.split(","); + for (String filterFieldId : filterFieldList) { + if (StringUtils.isNotEmpty(filterFieldId)) { + ProtocolFieldConfig fieldConfig = protocolFieldConfigMap.get(Long.valueOf(filterFieldId)); + //这里都是按字节计算,没有对位进行区分,可能会出现错误 + // 如果对位有需求,需要进一步跟进 + totalFilterLength += fieldConfig.getOffsetLength(); + } + } + } + return totalFilterLength; + } catch (Exception ex) { + log.error("报文确认分发阶段,获取报文总长度过滤长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); + } + return totalFilterLength; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java new file mode 100644 index 0000000..d51e887 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java @@ -0,0 +1,169 @@ +package com.casic.missiles.parser.resolver.fields; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.parser.resolver.ByteMergeProvider; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.AbstractFieldConfig; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.pojo.ByteResolverParam; +import io.netty.buffer.ByteBuf; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * 字段解析管理总类 + */ +@Slf4j +public class FieldResolver extends ByteMergeProvider { + + //1、字段截取 => 2、简单的字节解析和复杂的字节解析 + public static Object parseField(ByteBuf byteBuf,AbstractFieldConfig fieldConfig, Integer maxFixedPosition) { + Integer orignPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + //最大固定位置不为空, + if (!ObjectUtil.isEmpty(maxFixedPosition)) { + orignPosition -= maxFixedPosition; + } + Object fieldValue = 0; + //待优化 + if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { + fieldValue = doParseBitField(byteBuf, fieldConfig); + } else { + ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); + fieldValue = doParseByteField(fieldBytes, fieldConfig.getRuleJson()); + } + return fieldValue; + } + + //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, + //目前默认配置的规则设置暂不支持配置化,由实现完成 + private static Object doParseByteField(ByteBuf byteBuf, String ruleJson) { + Object fieldsResolveValue = null; + List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); + if (ObjectUtil.isEmpty(ruleMapList)) { + fieldsResolveValue = defaultResolveBuilder(byteBuf); + } else { + fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); + } + return fieldsResolveValue; + } + + private static Object defaultResolveBuilder(ByteBuf byteBuf) { + Integer defaultResolveValue = 0; + for (int i = 0; i < byteBuf.writerIndex(); i++) { + defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; + } + return defaultResolveValue; + } + + //字段解析构建器(针对字节单位的) + //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 + // 字节归并结束或者规则结束=>继续根据规则进行判断 + private static Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { + Object customizeResolveValue = null; + try { + List bytStrList = new ArrayList<>(); + //存放到数组里面 + for (int i = 0; i < byteBuf.writerIndex(); i++) { + bytStrList.add(byteBuf.readByte()); + } + int i = 0; + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { + if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + customizeResolveValue = resolveByteMerge(bytStrList, ruletypeId, vaildRange); + break; + } else { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + List tempBytStr = new ArrayList<>(); + for (int k = 0; i < bytStrList.size(); i++) { + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(k) + .value(bytStrList.get(k)) + .ruletypeId(ruletypeId).build(); + tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); + } + bytStrList = tempBytStr; + } + i++; + } + //字节归并到一起=>继续根据规则进行判断 + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(null) + .value(customizeResolveValue) + .ruletypeId(ruletypeId).build(); + customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); + i++; + } + System.out.println(JSON.toJSON(customizeResolveValue)); + return customizeResolveValue; + } catch (RuntimeException ex) { + log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); + return null; + } + } + + /** + * 1、单个字节情况表示字段 + * 2、多字节情况表示字段(暂未处理) + */ + private static Object doParseBitField(ByteBuf byteBuf,AbstractFieldConfig fieldConfig) { + Object fieldValue = new Object(); + try { + Integer orignPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + byte fields = 0x00; + if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { + fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); + } else { + fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); + } + + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { + if (!StringUtils.isEmpty(fieldConfig.getOriginPositionBit())) { + fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getOriginPositionBit())).byteValue() + >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); + } else { + fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); + } + } else { + fieldValue = Integer.valueOf(fields & 0xff); + } + if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { + return fieldValue; + } + List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); + int i = 0; + //字节归并到一起=>继续根据规则进行判断 + while (i < ruleMapList.size()) { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(null) + .value(fieldValue) + .ruletypeId(ruletypeId).build(); + fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); + i++; + } + System.out.println(JSON.toJSON(fieldValue)); + return fieldValue; + } catch (RuntimeException ex) { + log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); + return null; + } + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java deleted file mode 100644 index 35ae3d0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java +++ /dev/null @@ -1,183 +0,0 @@ -package com.casic.missiles.parser.resolver.fields; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufAllocator; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; -import org.springframework.util.ObjectUtils; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service("standard") -@AllArgsConstructor -@Slf4j -public class StandardFieldParser implements FieldParser { - - private final FieldConfigDao fieldConfigDao; - private final FieldResolver fieldResolver; - - //数据解析 - @Override - public Map dataParser(RuleConfig ruleConfig, String lightText, String protocolId) { - String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); - ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); - bufferContent.writeBytes(lightText.getBytes(Charset.forName("ISO-8859-1"))); - Map dataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - for (String dataFieldId : dataFieldIds) { - FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(dataFieldId); - if (!ObjectUtils.isEmpty(fieldConfig)) { - dataMap.put(fieldConfig.getFieldName(), String.valueOf(fieldResolver.filedParserManger(bufferContent, fieldConfig, maxFixedPosition))); - } - } - return dataMap; - } - - //数据解析 - @Override - public Map fixDataParser(String protocolId, ByteBuf buffer) { - List dataFieldIdList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Map dataMap = new HashMap<>(); - for (FieldConfig dataField : dataFieldIdList) { - if (!ObjectUtils.isEmpty(dataField.getOrignPosition())) { - Object fieldValue = (Integer) fieldResolver.filedParserManger(buffer, dataField, null); - dataMap.put(dataField.getFieldName(), fieldValue); - } - } - return dataMap; - } - - @Override - public Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf) { - if (ByteBufUtil.hexDump(byteBuf).equals("")) { - return 0; - } - String filterFields = protocolConfig.getTotalLengthFilterField(); - Integer totalLength = 0; - try { - FieldConfig totalFieldConfig = fieldConfigDao.getFieldConfigById(protocolConfig.getTotalLengthId()); - int totalFilterLength = 0; - if (!StringUtils.isEmpty(filterFields)) { - String[] filterFieldList = filterFields.split(","); - for (String filterField : filterFieldList) { - FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(filterField); - //这里都是按字节计算,没有对位进行区分,可能会出现错误 - - // 如果对位有需求,需要进一步跟进 - totalFilterLength += fieldConfig.getOffsetLength(); - } - } - totalLength = (Integer) fieldResolver.filedParserManger(byteBuf, totalFieldConfig, null) + totalFilterLength; - } catch (Exception ex) { - log.error("报文确认分发阶段,获取报文总长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); - } - return totalLength; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer) { - //业务内容 - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - String protocolId = String.valueOf(protocolConfig.getId()); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - //计算固定长度 - Integer fixedLength = calculateLength(fieldConfigList); -// Integer totalLength = this.getTotalLength(protocolConfig, buffer); - //总长度获取 - Integer totalLength = lightText.length(); - //计算固定长度最大长度 - Integer maxFixedPosition = calculatePosition(fieldConfigList); -// buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - //计算数据报文内容 - ByteBuf bizDataFields = buffer.slice(maxFixedPosition-1, (totalLength - fixedLength)); - return bizDataFields; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer) { - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - String protocolId = String.valueOf(protocolConfig.getId()); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer fixedLength = calculateLength(fieldConfigList); -// Integer totalLength = this.getTotalLength(protocolConfig, buffer); - Integer totalLength = lightText.length(); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - ByteBuf fixDataFields = buffer.slice(0, maxFixedPosition); - return fixDataFields; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer) { - String protocolId = String.valueOf(protocolConfig.getId()); - Map fixedPropertyMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer fixedLength = calculateLength(fieldConfigList); - Integer totalLength = this.getTotalLength(protocolConfig, buffer); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - fixedPropertyMap.put("fixedPosition", maxFixedPosition); - fixedPropertyMap.put("totalLength", totalLength); - fixedPropertyMap.put("tailPosition", totalLength - fixedLength + maxFixedPosition); - return fixedPropertyMap; - } - - //分别计算bit和byte长度=> 合并长度 - private Integer calculateLength(List fieldConfigList) { - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (FieldConfig fieldConfig : fieldConfigList) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - Integer fixedLength = bytefixedLength + bitfixedLength / 8; - return fixedLength; - } - - //找到最大值=> 根据最大值计算业务数据下标 - private Integer calculatePosition(List fieldConfigList) { - String rex = "[0-9]+"; - Integer max = -1; - for (FieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOrignPosition()) - && Integer.valueOf(fieldConfig.getOrignPosition()) > max) { - max = Integer.valueOf(fieldConfig.getOrignPosition()); - } - } - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (FieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOrignPosition()) && fieldConfig.getOrignPosition().equals(max)) { - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - } - } - Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; - return maxFixedPosition; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java new file mode 100644 index 0000000..d4ec6c7 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java @@ -0,0 +1,76 @@ +package com.casic.missiles.parser.rule; + +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import org.apache.commons.lang3.StringUtils; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class GenericRuleResolver { + + //根据前置字段的值,找到指定的规则 + //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 + //=>循环判断=>通过规则得到业务字段 + public static RuleConfig machRule(Map fixDataMap, + String ids, + List protocolFieldConfigs, + List ruleConfigs) { + List preRuleConfigList = getPreRuleList(ids, protocolFieldConfigs); + //获取前置规则字段 + final Map metaDataMap = getPreRuleFields(preRuleConfigList, fixDataMap); + //准备固定的字段集合 + Map fixDataFieldMap = getFixDataFieldMap(protocolFieldConfigs); + return RuleResolverCore.doMachRule(ruleConfigs, metaDataMap, fixDataMap, fixDataFieldMap); + } + + private static Map getFixDataFieldMap(List protocolFieldConfigs) { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, ProtocolFieldConfig::getFieldName) + ); + return fixDataFieldMap; + } + + + /** + * 查询前置规则的字段配置 + * + * @param ids + * @return + */ + private static List getPreRuleList(String ids, List protocolFieldConfigs) { + String[] idList = ids.split(","); + Map prepareMaps = new HashMap<>(); + for (String id : idList) { + if (StringUtils.isNotEmpty(id)) { + prepareMaps.put(Long.valueOf(id), ""); + } + } + List preRuleConfigList = protocolFieldConfigs + .stream() + .filter(e -> prepareMaps.containsKey(e.getId())) + .collect(Collectors.toList()); + return preRuleConfigList; + } + + /** + * 获取前置规则解析字段 + */ + private static Map getPreRuleFields(List preRuleFieldConfigList, Map fixDataMap) { + Map ruleFieldMap = new HashMap<>(); + preRuleFieldConfigList.stream() + .forEach( + preRuleFieldConfig -> { + String fieldName = preRuleFieldConfig.getFieldName(); + if (fixDataMap.containsKey(fieldName)) { + ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); + } + } + ); + return ruleFieldMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java new file mode 100644 index 0000000..baae7e8 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -0,0 +1,68 @@ +package com.casic.missiles.parser.rule; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.casic.missiles.pojo.RuleConfig; + +import java.util.*; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleResolverCore { + + + public static RuleConfig doMachRule(List ruleConfigList, Map metaDataMap, + Map fixDataMap, + Map fixDataFieldMap) { + Optional ruleConfigOptional = ruleConfigList.stream() + .filter(ruleConfig -> machRuleConfig( + JSON.parseObject(ruleConfig.getMatchRuleJson(), Map.class), metaDataMap)) + .findFirst(); + if (ObjectUtil.isEmpty(ruleConfigOptional)) { + return null; + } + String[] ruleFields = ruleConfigOptional.get().getDataFieldIds().split(","); + Map ruleMetaDataMap = getRuleFields(ruleFields, fixDataMap, fixDataFieldMap); + //递归选定解析规则,进行规则解析 + if (!ruleConfigOptional.get().getIsFinishMatch().equals("1")) { + //递归选定规则 + doMachRule(ruleConfigList, ruleMetaDataMap, fixDataMap, fixDataFieldMap); + } + return ruleConfigOptional.get(); + } + + + private static Map getRuleFields(String[] preRuleConfigList, Map fixedDataMap, + Map fixedFieldMap) { + Map ruleFieldMap = new HashMap<>(); + for (String preRuleConfigId : preRuleConfigList) { + String fieldName = fixedFieldMap.get(preRuleConfigId); + if (fixedDataMap.containsKey(fieldName)) { + ruleFieldMap.put(fieldName, String.valueOf(fixedDataMap.get(fieldName))); + } + } + return ruleFieldMap; + } + + + //匹配规则配置 + private static Boolean machRuleConfig(Map ruleMap, Map metaDataMap) { + if (ruleMap == null || metaDataMap == null) { + return null; + } + //所有的字段在规则里面必须有有配置 + for (String key : metaDataMap.keySet()) { + if (ruleMap.containsKey(key)) { + if (!ruleMap.get(key).equals(metaDataMap.get(key))) { + return false; + } + } else { + return false; + } + } + return true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java deleted file mode 100644 index 664088d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java +++ /dev/null @@ -1,92 +0,0 @@ -package com.casic.missiles.parser.rule; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.mapper.dao.PreRuleConfigDao; -import com.casic.missiles.mapper.dao.RuleConfigDao; -import lombok.AllArgsConstructor; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.*; -import java.util.stream.Collectors; - -@Service -@AllArgsConstructor -public class RulerProvider { - - private final FieldConfigDao fieldConfigDao; - private final PreRuleConfigDao preRuleConfigDao; - private final RuleConfigDao ruleConfigDao; - - //根据前置字段的值,找到指定的规则 - //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 - //=>循环判断=>通过规则得到业务字段 - public RuleConfig ruleConfig(Map fixDataMap, String protocolId) { - //批量获取规则 - List preRuleConfigList = preRuleConfigDao.getPreRuleList(protocolId); - //获取固定字段 - Map fixFieldMap = getAllFieldMap(protocolId); - //获取前置规则字段 - final String preRuleFields = getPreRuleFields(preRuleConfigList, fixDataMap, fixFieldMap); - List ruleConfigList = ruleConfigDao.getRuleConfigById(protocolId); - Optional ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig ->preRuleFields.equals( ruleConfig.getParseRuleJson())).findFirst(); - //递归选定解析规则,进行规则解析 - while (!ObjectUtil.isEmpty(ruleConfigOptional) && !ruleConfigOptional.get().getIsBizField().equals("1")) { - String ruleFields = getRuleFields(ruleConfigOptional.get().getDataFieldIds().split(","), fixDataMap, fixFieldMap); - ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig -> ruleConfig.getParseRuleJson().equals(ruleFields)).findFirst(); - } - return ruleConfigOptional.get(); - } - - /** - * 获取前置规则解析字段 - */ - private String getPreRuleFields(List preRuleConfigList, Map fixDataMap, Map fixFieldMap) { - Map ruleFieldMap= new HashMap<>(); - preRuleConfigList.stream() - .forEach( - preRuleConfig -> { - String fieldName = fixFieldMap.get(Long.valueOf(preRuleConfig.getRuleFieldId())); - if (fixDataMap.containsKey(fieldName)) { - ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); - } - } - ); - return JSONObject.toJSONString(ruleFieldMap); - } - - private Map getAllFieldMap(String protocolId) { - List fieldList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Map fixFieldMap = fieldList.stream().collect( - Collectors.toMap(FieldConfig::getId, FieldConfig::getFieldName) - ); - return fixFieldMap; - } - - private String getRuleFields(String[] preRuleConfigList, Map fixDataMap, Map fixFieldMap) { - Map ruleFieldMap= new HashMap<>(); - for (String preRuleConfigId : preRuleConfigList) { - String fieldName = fixFieldMap.get(preRuleConfigId); - if (fixDataMap.containsKey(fieldName)) { - ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); - } - } - return JSONObject.toJSONString(ruleFieldMap); - } - - //弃置 - private String ListToString(List ruleFieldList) { - String ruleFields = ""; - for (String ruleField : ruleFieldList) { - ruleFields += ruleField + ","; - } - ruleFields = StringUtils.isEmpty(ruleFields) ? ruleFields : ruleFields.substring(0, ruleFields.length() - 1); - return ruleFields; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java index 6177e10..bfa87a5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java @@ -2,7 +2,7 @@ public interface SafeStrategy { - String decryption(byte[] bytes); + String decryption(String cipher); String encryption(String lightText); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java index 618716c..6236302 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java @@ -9,9 +9,9 @@ //十六进制的字符串转换成字节数组 byte[] bytes = hexStrToBinaryStr(msg); //计算CRC8 - byte crc8 = CRC8(bytes, 0, bytes.length); - String crc8ToStr = "" + Integer.toHexString(0xff & crc8); - return crc8ToStr; +// String crc8ToStr = "" + Integer.toHexString(0xff & crc8); +// return crc8ToStr; + return null; } /** @@ -33,50 +33,5 @@ return bytes; } - /** - * CRC8 校验 多项式 x8+x2+x+1 - * - * @param b - * @param off - * @param len - * @return - */ - public static byte CRC8(final byte[] b, final int off, final int len) { - byte result = 0x00; - for (int i = 0; i < len; i++) { - result = CHECKSUM_TABLE[(result ^ (b[i + off] & 0xFF)) & 0xFF]; - } - return (byte) (result & 0xFFL); - } - - private final static byte[] CHECKSUM_TABLE = {(byte) 0x00, (byte) 0x07, (byte) 0x0e, (byte) 0x09, (byte) 0x1c, (byte) 0x1b, - (byte) 0x12, (byte) 0x15, (byte) 0x38, (byte) 0x3f, (byte) 0x36, (byte) 0x31, (byte) 0x24, (byte) 0x23, (byte) 0x2a, - (byte) 0x2d, (byte) 0x70, (byte) 0x77, (byte) 0x7e, (byte) 0x79, (byte) 0x6c, (byte) 0x6b, (byte) 0x62, (byte) 0x65, - (byte) 0x48, (byte) 0x4f, (byte) 0x46, (byte) 0x41, (byte) 0x54, (byte) 0x53, (byte) 0x5a, (byte) 0x5d, (byte) 0xe0, - (byte) 0xe7, (byte) 0xee, (byte) 0xe9, (byte) 0xfc, (byte) 0xfb, (byte) 0xf2, (byte) 0xf5, (byte) 0xd8, (byte) 0xdf, - (byte) 0xd6, (byte) 0xd1, (byte) 0xc4, (byte) 0xc3, (byte) 0xca, (byte) 0xcd, (byte) 0x90, (byte) 0x97, (byte) 0x9e, - (byte) 0x99, (byte) 0x8c, (byte) 0x8b, (byte) 0x82, (byte) 0x85, (byte) 0xa8, (byte) 0xaf, (byte) 0xa6, (byte) 0xa1, - (byte) 0xb4, (byte) 0xb3, (byte) 0xba, (byte) 0xbd, (byte) 0xc7, (byte) 0xc0, (byte) 0xc9, (byte) 0xce, (byte) 0xdb, - (byte) 0xdc, (byte) 0xd5, (byte) 0xd2, (byte) 0xff, (byte) 0xf8, (byte) 0xf1, (byte) 0xf6, (byte) 0xe3, (byte) 0xe4, - (byte) 0xed, (byte) 0xea, (byte) 0xb7, (byte) 0xb0, (byte) 0xb9, (byte) 0xbe, (byte) 0xab, (byte) 0xac, (byte) 0xa5, - (byte) 0xa2, (byte) 0x8f, (byte) 0x88, (byte) 0x81, (byte) 0x86, (byte) 0x93, (byte) 0x94, (byte) 0x9d, (byte) 0x9a, - (byte) 0x27, (byte) 0x20, (byte) 0x29, (byte) 0x2e, (byte) 0x3b, (byte) 0x3c, (byte) 0x35, (byte) 0x32, (byte) 0x1f, - (byte) 0x18, (byte) 0x11, (byte) 0x16, (byte) 0x03, (byte) 0x04, (byte) 0x0d, (byte) 0x0a, (byte) 0x57, (byte) 0x50, - (byte) 0x59, (byte) 0x5e, (byte) 0x4b, (byte) 0x4c, (byte) 0x45, (byte) 0x42, (byte) 0x6f, (byte) 0x68, (byte) 0x61, - (byte) 0x66, (byte) 0x73, (byte) 0x74, (byte) 0x7d, (byte) 0x7a, (byte) 0x89, (byte) 0x8e, (byte) 0x87, (byte) 0x80, - (byte) 0x95, (byte) 0x92, (byte) 0x9b, (byte) 0x9c, (byte) 0xb1, (byte) 0xb6, (byte) 0xbf, (byte) 0xb8, (byte) 0xad, - (byte) 0xaa, (byte) 0xa3, (byte) 0xa4, (byte) 0xf9, (byte) 0xfe, (byte) 0xf7, (byte) 0xf0, (byte) 0xe5, (byte) 0xe2, - (byte) 0xeb, (byte) 0xec, (byte) 0xc1, (byte) 0xc6, (byte) 0xcf, (byte) 0xc8, (byte) 0xdd, (byte) 0xda, (byte) 0xd3, - (byte) 0xd4, (byte) 0x69, (byte) 0x6e, (byte) 0x67, (byte) 0x60, (byte) 0x75, (byte) 0x72, (byte) 0x7b, (byte) 0x7c, - (byte) 0x51, (byte) 0x56, (byte) 0x5f, (byte) 0x58, (byte) 0x4d, (byte) 0x4a, (byte) 0x43, (byte) 0x44, (byte) 0x19, - (byte) 0x1e, (byte) 0x17, (byte) 0x10, (byte) 0x05, (byte) 0x02, (byte) 0x0b, (byte) 0x0c, (byte) 0x21, (byte) 0x26, - (byte) 0x2f, (byte) 0x28, (byte) 0x3d, (byte) 0x3a, (byte) 0x33, (byte) 0x34, (byte) 0x4e, (byte) 0x49, (byte) 0x40, - (byte) 0x47, (byte) 0x52, (byte) 0x55, (byte) 0x5c, (byte) 0x5b, (byte) 0x76, (byte) 0x71, (byte) 0x78, (byte) 0x7f, - (byte) 0x6a, (byte) 0x6d, (byte) 0x64, (byte) 0x63, (byte) 0x3e, (byte) 0x39, (byte) 0x30, (byte) 0x37, (byte) 0x22, - (byte) 0x25, (byte) 0x2c, (byte) 0x2b, (byte) 0x06, (byte) 0x01, (byte) 0x08, (byte) 0x0f, (byte) 0x1a, (byte) 0x1d, - (byte) 0x14, (byte) 0x13, (byte) 0xae, (byte) 0xa9, (byte) 0xa0, (byte) 0xa7, (byte) 0xb2, (byte) 0xb5, (byte) 0xbc, - (byte) 0xbb, (byte) 0x96, (byte) 0x91, (byte) 0x98, (byte) 0x9f, (byte) 0x8a, (byte) 0x8d, (byte) 0x84, (byte) 0x83, - (byte) 0xde, (byte) 0xd9, (byte) 0xd0, (byte) 0xd7, (byte) 0xc2, (byte) 0xc5, (byte) 0xcc, (byte) 0xcb, (byte) 0xe6, - (byte) 0xe1, (byte) 0xe8, (byte) 0xef, (byte) 0xfa, (byte) 0xfd, (byte) 0xf4, (byte) 0xf3}; } \ No newline at end of file diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java index 27c2838..6e078a3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java @@ -1,9 +1,6 @@ package com.casic.missiles.parser.safe.impl; -import cn.hutool.core.util.CharsetUtil; -import cn.hutool.crypto.symmetric.SM4; -import cn.hutool.crypto.symmetric.SymmetricCrypto; - +import com.casic.missiles.parser.safe.SafeStrategy; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; @@ -11,19 +8,44 @@ import org.bouncycastle.crypto.engines.SM4Engine; import org.bouncycastle.crypto.params.KeyParameter; import org.bouncycastle.util.encoders.Hex; - -import static cn.hutool.crypto.Mode.ECB; -import static cn.hutool.crypto.Padding.NoPadding; +import org.springframework.stereotype.Component; /** * SM4算法工具类 */ @Slf4j -public class Sm4 { +@Component("sm4") +public class Sm4 implements SafeStrategy { //加解密的字节快大小 public static final int BlockSize = 16; + @Override + public String decryption(String cipher) { + byte[] keyByte = { + 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 + }; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(keyByte); + byte[] in = Hex.decode(cipher); + byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); + String plain = EcbDecrypt(in, keyBytes); + return plain; + } + + @Override + public String encryption(String cipher) { + byte[] keyByte = { + 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 + }; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(keyByte); + byte[] in = Hex.decode(cipher); + byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); + String plain = EcbDecrypt(in, keyBytes); + return plain; + } + /** * SM4ECB加密算法,对内 * @@ -32,8 +54,6 @@ * @return */ private static byte[] ecb_encrypt(byte[] in, byte[] keyBytes) { - - SM4Engine sm4Engine = new SM4Engine(); sm4Engine.init(true, new KeyParameter(keyBytes)); byte[] out = new byte[in.length]; @@ -58,27 +78,6 @@ return cipher; } - - /** - * hutool 解密SM4 - * - * @param encodeContent - * @return - */ - public static String decode(String encodeContent) { - String key = "24ad182507479a5da3ad94d9d78ea203"; - try { - SymmetricCrypto sm4 = new SM4(ECB, NoPadding, key.getBytes()); - String decryptStr = sm4.decryptStr(encodeContent, CharsetUtil.CHARSET_UTF_8); - return decryptStr; - } catch (Exception e) { - e.printStackTrace(); - log.error("SM4解密失败"); - } - return null; - } - - /** * SM4的ECB加密算法 * @@ -129,20 +128,6 @@ return plain; } - /** - * SM4的ECB解密算法 - * - * @param cipher 输入的密文字符串 - * @param key 密钥 - * @return - */ - public static String EcbDecrypt(String cipher, String key) { - byte[] in = Hex.decode(cipher); - byte[] keyBytes = Hex.decode(key); - - String plain = EcbDecrypt(in, keyBytes); - return plain; - } /** * 主函数 @@ -151,28 +136,24 @@ */ public static void main(String[] args) { byte[] ciphertext = { + 0x4B, (byte) 0x8C, (byte) 0x9D, 0x08, (byte) 0xE4, (byte) 0xD3, 0x64, 0x42, (byte) 0xB9, (byte) 0xA5, (byte) 0xFE, (byte) 0xCD, (byte) 0x91, 0x1B, 0x38, (byte) 0xAC, (byte) 0xE9, 0x1C, (byte) 0xCD, 0x53, 0x02, (byte) 0xD7, 0x0C, (byte) 0x9B, (byte) 0x96, 0x30, 0x62, (byte) 0xE8, (byte) 0xFB, (byte) 0xEF, (byte) 0xB9, (byte) 0xFF, (byte) 0xDE, 0x19, (byte) 0x80, 0x35, 0x3E, (byte) 0x90, 0x4F, 0x2F, 0x12, 0x2B, 0x19, (byte) 0x8B, 0x6C, 0x7A, (byte) 0x85, (byte) 0xA1, (byte) 0xB1, (byte) 0x86, (byte) 0xA3, 0x7A, 0x46, 0x0C, 0x2F, (byte) 0x94, 0x4F, 0x7F, 0x2C, 0x56, 0x14, (byte) 0xF3, (byte) 0x89, (byte) 0xC3, - 0x3F, 0x20, (byte) 0xF9, (byte) 0x87, (byte) 0xA1, 0x60, (byte) 0xD9, (byte) 0xA8, (byte) 0xFD, (byte) 0xD7, (byte) 0x9B, 0x4B, 0x26, 0x06, 0x30, 0x44}; + 0x3F, 0x20, (byte) 0xF9, (byte) 0x87, (byte) 0xA1, 0x60, (byte) 0xD9, (byte) 0xA8, (byte) 0xFD, (byte) 0xD7, (byte) 0x9B, 0x4B, 0x26, 0x06, 0x30, 0x44 + }; ByteBuf in = ByteBufAllocator.DEFAULT.heapBuffer(); in.writeBytes(ciphertext); - byte[] keyByte = { 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 }; ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); - key.writeBytes(ciphertext); - String resCipherData = decode(ByteBufUtil.hexDump(in)); - ByteBuf out = ByteBufAllocator.DEFAULT.heapBuffer(); -// out.writeBytes(resCipherData); -// System.out.println(hexBytes); - System.out.println(resCipherData.toString()); -// String resPlainData = EcbDecrypt(resCipherData, key); -// System.out.println("原始明文:" + data); -// System.out.println("解密后明文:" + resPlainData); + key.writeBytes(keyByte); +// String resCipherData = EcbDecrypt(ByteBufUtil.hexDump(in), ByteBufUtil.hexDump(key)); +// System.out.println(resCipherData); } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java index 1395a51..ac5f957 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java @@ -1,7 +1,7 @@ package com.casic.missiles.parser.safe.impl; import io.netty.buffer.ByteBufUtil; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** *

@@ -14,9 +14,8 @@ * @author hyl * @version v1.0: Tea.java, v 0.1 2021/3/12 13:48 $ */ -@Service("tea") -///tea算法类 - +//tea算法类 +@Component("tea") public class Tea { public static byte[] MyTea_Encrypt(byte[] MyTeaContent, int ByteLen, byte[] MyTeakey) { @@ -99,7 +98,6 @@ // for(int i32Index = 0; i32Index < 8; i32Index++) { // System.out.print("0x" + Integer.toHexString(MyContent[i32Index]) + " "); // } - // System.out.println("密钥为:"); // for(int i32Index = 0; i32Index < 16; i32Index++) { // System.out.print("0x" + Integer.toHexString(MyKeys[i32Index]) + " "); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java index bdd0721..bd1516a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java @@ -3,7 +3,7 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.parser.sender.DataSubscribeProvider; import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponents; import org.springframework.web.util.UriComponentsBuilder; @@ -12,7 +12,7 @@ import java.util.Collections; import java.util.Map; -@Service("functionCallback") +@Component("functionCallback") public class FunctionCallback implements DataSubscribeProvider { @Resource diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java index 0b44fb9..7526de2 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.Map; -@Service("middleware") +@Component("middleware") public class MiddlewareSubscribe implements DataSubscribeProvider { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java index 5dcee3f..e2f1192 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.Map; -@Service("nosql") +@Component("nosql") public class NoSqlSubscribe implements DataSubscribeProvider { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java b/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java new file mode 100644 index 0000000..81a5324 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java @@ -0,0 +1,86 @@ +package com.casic.missiles.pojo; + +import lombok.Data; + +/** + * 协议 + */ +@Data +public class Msg { + + /** + * 前导码 + */ + private String preamble; + + /** + * 版本号 + */ + private String version; + + /** + * 内容长度 + */ + private int leng; + + /** + * 设备ID + */ + private String deviceId; + + /** + * 通讯方式 + */ + private Integer connType; + + /** + * 加密方式 + */ + private Integer encryType; + + /** + * 目标地址 + */ + private String destAddr; + + /** + * PDUType + */ + private String PDUType; + + /** + * 操作类型 + */ + private Integer operateType; + + /** + * 传输控制位 PDUType.bit7=0时,表示存在后续的访问;当PDUType.bit7=1时,表示无后续的访问。 + */ + private Integer transControlFlag; + + /** + * 设备类型 + */ + private Integer deviceType; + + /** + * 序号 + */ + private Integer seq; + + /** + * tagList + */ + private String tagList; + + /** + * OidList + */ + private String OidList; + + /** + * CRC + */ + private String CRC; + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java index 40a5265..97cc984 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java @@ -40,7 +40,7 @@ String httpContent = msg.toString(Charset.defaultCharset()); log.info(" String : " + msg.toString(Charset.defaultCharset())); String majorContent = httpContent.substring(httpContent.indexOf("{"), httpContent.lastIndexOf("}") + 1); - String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("serviceData")).get("Value")); + String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("RegistryData")).get("Value")); log.info("----------------------------------" + values); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); bufferContent.writeBytes(values.getBytes(Charset.forName("ISO-8859-1"))); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java index 1b132a7..e3ced4b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java @@ -35,7 +35,7 @@ String httpContent = msg.toString(Charset.defaultCharset()); log.info(" String : " + msg.toString(Charset.defaultCharset())); String majorContent = httpContent.substring(httpContent.indexOf("{"), httpContent.lastIndexOf("}") + 1); - String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("serviceData")).get("Value")); + String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("RegistryData")).get("Value")); log.info("----------------------------------" + values); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); bufferContent.writeBytes(values.getBytes(Charset.forName("ISO-8859-1"))); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java index 608af3a..32cc8a4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java @@ -2,48 +2,47 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.delivery.decorator.ByteDecorator; +import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @AllArgsConstructor public class FieldDecoratorManger { - private final RuleDictDao ruleDictDao; + private final RuleConfigRegistry ruleDictDao; // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 // (1)静态的业务字段是字典里面可以配置的 // (2)动态的业务字段是通过规则生成的 public String contentMerge(String ruleJson, String sceneConent, String dynamicContent) { - List ruleDictList = ruleDictDao.getRuleDictConfig(); - Map ruleDictMap = ruleDictList.stream().collect( - Collectors.toMap(RuleDict::getId, e -> e)); - List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); - for (Map ruleMap : ruleMapList) { - String ruleType = String.valueOf(ruleMap.get("ruleType")); - ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); - NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); - byteDecorator.nodeDecoratorRule(nodeDecoratorParm); - } +// List ruleDictList = ruleDictDao.getRuleDictConfig(); +// Map ruleDictMap = ruleDictList.stream().collect( +// Collectors.toMap(RuleDict::getId, e -> e)); +// List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); +// for (Map ruleMap : ruleMapList) { +// String ruleType = String.valueOf(ruleMap.get("ruleType")); +// ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); +// NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); +// byteDecorator.nodeDecoratorRule(nodeDecoratorParm); +// } return null; } - - private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { - NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() - .contents(sceneConent) - .dynamicContent(dynamicContent) - .ruletypeId(ruletypeId) - .ruleDictMap(ruleDictMap) - .build(); - return nodeDecoratorParm; - } +// +// private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { +// NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() +// .contents(sceneConent) +// .dynamicContent(dynamicContent) +// .ruletypeId(ruletypeId) +// .ruleDictMap(ruleDictMap) +// .build(); +// return nodeDecoratorParm; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java index 652970c..b204ac3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java @@ -1,56 +1,56 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@AllArgsConstructor -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", - JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Component; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Component("logicalDecorator") +//@AllArgsConstructor +//@Slf4j +//public class LogicalShiftDecorator implements ByteDecorator { +// +//// private final FieldRuleEngineMapper fieldRuleEngineMapper; +//// +//// //字节位移 +//// @Override +//// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +//// String logicalValue = ""; +//// RuleEvaluator fieldRuleEngine = new RuleEvaluator(); +//// try { +//// Map env2 = new HashMap(); +//// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +//// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +//// for (String contentId : contentIdList) { +//// RuleDict ruleDict = ruleDictMap.get(contentId); +//// if (ruleDict.getCode().contains("#")) { +//// //使用动态的值 +//// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +//// } +//// env2.put(ruleDict.getName(), ruleDict.getCode()); +//// } +//// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +//// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +//// return null; +//// } +//// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +//// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +//// return values; +//// } catch (Exception ex) { +//// log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", +//// JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +//// return null; +//// } +//// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java index 346468f..822fead 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@AllArgsConstructor -@Slf4j -public class OperationDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("optionDecorator") +//@AllArgsConstructor +//@Slf4j +//public class OperationDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //混合运算,有常量或者乘除的缩放 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java index 50fb0a7..7a8bccb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@AllArgsConstructor -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +////精度计算 +//@AllArgsConstructor +//@Registry("precisionDecorator") +//@Slf4j +//public class PrecisionDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java index da39235..27f9cc7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java @@ -1,54 +1,53 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@AllArgsConstructor -@Slf4j -public class RuleDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("ruleDecorator") +//@AllArgsConstructor +//@Slf4j +//public class RuleDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //吃我一套正则表达式 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (Exception ex) { +// log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java index 7f5cbf3..c043f97 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java @@ -2,6 +2,6 @@ import java.util.Map; -public interface ComandeEventService { +public interface ComandeEventService{ Map loadComandeEventConfig(String protocolId,String scene); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java index 476ad84..aaf1837 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java @@ -2,46 +2,46 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.dao.CommandEventDao; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @Slf4j @AllArgsConstructor -public class ComandeEventServiceImpl implements ComandeEventService { +public class ComandeEventServiceImpl implements ComandeEventRegistry { - private final CommandEventDao commandEventDao; + // private final CommandEventDao commandEventDao; // 加密bean 固定字段出现变化的字段解析,业务字段的有序内容 @Override - public Map loadComandeEventConfig(String protocolId,String sceneName) { - CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); - if (ObjectUtil.isEmpty(commandEventConfig)) { - log.error("协议{},没有配置成功接收回复配置,清排查原因"); - return null; - } - String replyJson = commandEventConfig.getReplyContentJson(); - List> replyMapList = JSONArray.parseObject(replyJson, List.class); - List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); - Map fixMap = fixList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); - List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) - .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) - .collect(Collectors.toList()); - Map commandConfigMap = new HashMap<>(); - commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); - commandConfigMap.put("fixContent", fixMap); - commandConfigMap.put("bizContent", contentList); - return commandConfigMap; + public Map loadComandeEventConfig(String protocolId, String sceneName) { +// CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); +// if (ObjectUtil.isEmpty(commandEventConfig)) { +// log.error("协议{},没有配置成功接收回复配置,清排查原因"); +// return null; +// } +// String replyJson = commandEventConfig.getReplyContentJson(); +// List> replyMapList = JSONArray.parseObject(replyJson, List.class); +// List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); +// Map fixMap = fixList.stream() +// .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); +// List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) +// .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) +// .collect(Collectors.toList()); +// Map commandConfigMap = new HashMap<>(); +// commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); +// commandConfigMap.put("fixContent", fixMap); +// commandConfigMap.put("bizContent", contentList); +// return commandConfigMap; + return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 128b09d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java deleted file mode 100644 index 4016b0b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface DatagramEventMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java deleted file mode 100644 index 597c306..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.apache.ibatis.annotations.Mapper; - -public interface FieldConfigMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java deleted file mode 100644 index a31680a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.PreRuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface PreRuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java deleted file mode 100644 index 9060a69..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface ProtocolConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java deleted file mode 100644 index 6fa6936..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java deleted file mode 100644 index 582a705..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleDict; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleDictMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java deleted file mode 100644 index 6e302c8..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.CommandEventMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Optional; - -@Component -public class CommandEventDao { - - @Resource - private CommandEventMapper commandEventMapper; - - public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId) - .eq("scene", sceneName) - .eq("enabled", 1); - List commandEventConfig = commandEventMapper.selectList(queryWrapper); - Optional optionalEventConfig = commandEventConfig.stream().findFirst(); - return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java deleted file mode 100644 index 9137e4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.FieldConfigMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class FieldConfigDao { - - @Resource - private FieldConfigMapper fieldConfigMapper; - - public FieldConfig getFieldConfigById(String fieldId) { - FieldConfig fieldConfig = fieldConfigMapper.selectById(fieldId); - return fieldConfig; - } - - public List getFieldConfigs(String protocolId,Integer isFixed) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",isFixed); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - - public List getStorageFieldConfig(String protocolId) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",1) - .eq("is_storage",1); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java deleted file mode 100644 index 67bff6b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.mapper.PreRuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class PreRuleConfigDao { - - @Resource - private PreRuleConfigMapper preRuleConfigMapper; - - public List getPreRuleList(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return preRuleConfigMapper.selectList(queryWrapper); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java deleted file mode 100644 index d69ea85..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.RuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleConfigDao { - - @Resource - private RuleConfigMapper ruleConfigMapper; - - public RuleConfig getNextRuleConfig(String ruleFields) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("parse_rule_json", ruleFields); - return ruleConfigMapper.selectOne(queryWrapper); - } - - - public List getRuleConfigById(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return ruleConfigMapper.selectList(queryWrapper); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java deleted file mode 100644 index 932c185..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.RuleDictMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleDictDao { - - @Resource - private RuleDictMapper ruleDictMapper; - - public List getRuleDictConfig() { - List ruleDictList = ruleDictMapper.selectList(null); - return ruleDictList; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java index 9f9e279..43bc4d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java @@ -10,20 +10,15 @@ import io.netty.channel.socket.nio.NioServerSocketChannel; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import javax.annotation.PreDestroy; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static cn.hutool.core.util.ClassUtil.getClasses; /** * SensorhubServer netty服务端 */ @Slf4j -@Service +@Component public class SensorhubServer { /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java index 2c79ff5..9a28c36 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java @@ -11,13 +11,13 @@ import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioSocketChannel; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClient 客户端 */ @Slf4j -@Service +@Registry public final class SensorhubClient { public static void main(String[] args) throws Exception { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java index 9774be0..477c3f7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java @@ -6,12 +6,12 @@ import io.netty.channel.socket.SocketChannel; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientChannelInitialHandler */ -@Service +@Registry public class SensorhubClientChannelInitialHandler extends ChannelInitializer { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java index 346f4b3..73560e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java @@ -5,13 +5,13 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientHandler */ @Slf4j -@Service +@Registry public class SensorhubClientHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java index 5c1c6f2..d990af5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java @@ -4,12 +4,12 @@ import com.casic.missiles.pojo.Msg; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** * SensorhubServerHandler */ -@Service +@Component public class SensorhubServerHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 67283ae..af3172c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,41 +1,37 @@ package com.casic.missiles.parser; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultProtocolConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.*; +import com.casic.missiles.registry.FieldConfigRegistry; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; -import java.nio.charset.Charset; import java.util.HashMap; import java.util.List; import java.util.Map; -@Service("genericProtocolParser") +/** + * @author + */ +@Component("genericProtocolParser") @Slf4j -@AllArgsConstructor +@RequiredArgsConstructor public class GenericProtocolParser implements ProtocolParser { - private final LeadingCodeMatcher leadingCodeMatcher; private final List frameStructDispenserList; - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorInstanceSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; // 匹配首字母前导码=> 帧结构匹配前导码=> // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 @@ -44,18 +40,19 @@ public Boolean doParseProtocol(ByteBuf byteBuf) { String protocolContent = ByteBufUtil.hexDump(byteBuf); //匹配前导码 - List preCodeConfigs = leadingCodeMatcher.matchLeadingCode(protocolContent); + List preCodeConfigs = LeadingCodeMatcher.matchFrameLeadingCode(protocolContent); //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 if (preCodeConfigs.size() == 0) { - return rematch(byteBuf,protocolContent); + return rematch(byteBuf, protocolContent); } - //暂时先取第一个 + //暂时先取第一个,提升速度,使用享元模式, 减少类的创建销毁与构建 ProtocolConfig protocolConfig = preCodeConfigs.get(0); + AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); ByteBuf wholeDatagramByte = null; //通过匹配帧结构获取完整的数据包 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, preCodeConfigs.get(0))) != null) { + if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, protocolFactory)) != null) { break; } } @@ -68,76 +65,78 @@ * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 */ - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId, wholeDatagramByte); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap, protocolId); - //选取规则对应的流程实例 - DatagramEventConfig datagramEventConfig = processorInstanceSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); + //进行规则字段解析,进行匹配规则 + RuleConfig ruleConfig = getRuleConfig(protocolFactory, wholeDatagramByte); + if (ruleConfig == null) { + return false; + } //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, wholeDatagramByte); + ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte); + //以下进行业务的规则解析,同时选定流程实例 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); + DatagramEventProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain, + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText, protocolId); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain); //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); + datagramEventProvider.storeData(bizDataMap); return true; } - private Boolean rematch(ByteBuf byteBuf,String protocolContent) { + /** + * 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 + */ + private Boolean rematch(ByteBuf byteBuf, String protocolContent) { //重置位判断 byteBuf.resetReaderIndex(); //判断重置是否前移,如果没有前移,则直接判为匹配失败 if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { return false; } else { + //递归执行 return doParseProtocol(byteBuf); } } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; + //获取匹配规则->匹配规则 + private RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + //取出其中参与逻辑provider并判空 + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); + String rulePrepareFields = protocolConfig.getRulePrepareFields(); + //固定字段 + if (StringUtils.isNotEmpty(rulePrepareFields)) { + //获取统一固定字段解析 + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + //获取该协议的字段配置,用于协议规则匹配 + List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); + //获取规则 + RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, + rulePrepareFields, protocolFieldConfigs); + return ruleConfig; + } + return null; } - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + //数据构建,获取固定字段的store和业务字段store + private Map buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + Map bizDataMap = new HashMap<>(); + Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); + Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); + bizDataMap.putAll(ruleStoreObjectMap); + bizDataMap.putAll(protocolStoreObjectMap); return bizDataMap; } - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java index 8a46e32..16ce2e5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java @@ -3,6 +3,7 @@ import io.netty.buffer.ByteBuf; public interface ProtocolParser { + Boolean doParseProtocol(ByteBuf byteBuf); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java new file mode 100644 index 0000000..f7814af --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java @@ -0,0 +1,35 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.ProtocolConfigProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.ProtocolConfig; + +/** + * 存放基本协议的的加载信息 + */ +public class AbstractProtocolConfigFactory { + private final ProtocolConfigProvider protocolConfigProvider; + private final ProtocolFieldConfigProvider protocolFieldConfigProvider; + private final RuleConfigProvider ruleConfigProvider; + + public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { + this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); + this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); + this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); + } + + public ProtocolConfigProvider getProtocolConfigProvider() { + return protocolConfigProvider; + } + + public ProtocolFieldConfigProvider getProtocolFieldConfigProvider() { + return protocolFieldConfigProvider; + } + + public RuleConfigProvider getRuleConfigProvider() { + return ruleConfigProvider; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java new file mode 100644 index 0000000..6e36147 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java @@ -0,0 +1,57 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.CombinedFieldConfigProvider; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.FieldConfigProvider; +import com.casic.missiles.parser.provider.FieldRuleConfigProvider; + +/** + * 存放规则相关的的的加载信息 + */ +public class AbstractRuleConfigFactory { + + /** + * 处理字节 + */ + private final FieldConfigProvider fieldConfigProvider; + /** + * 处理组合字节解析的解码器 + */ + private final CombinedFieldConfigProvider combinedFieldConfigProvider; + /** + * 处理负责字节解析的规则配置 + */ + private final FieldRuleConfigProvider fieldRuleConfigProvider; + /** + * 处理实例流程 + */ + private final DatagramEventProvider datagramEventProvider; + + + public AbstractRuleConfigFactory(Long ruleId) { + this.fieldConfigProvider = new FieldConfigProvider(ruleId); + this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); + this.fieldRuleConfigProvider = new FieldRuleConfigProvider(ruleId); + this.datagramEventProvider = new DatagramEventProvider(ruleId); + } + + public FieldConfigProvider getFieldConfigProvider() { + return fieldConfigProvider; + } + + public CombinedFieldConfigProvider getCombinedFieldConfigProvider() { + return combinedFieldConfigProvider; + } + + public FieldRuleConfigProvider getFieldRuleConfigProvider() { + return fieldRuleConfigProvider; + } + + public DatagramEventProvider getDatagramEventProvider() { + return datagramEventProvider; + } + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java deleted file mode 100644 index 6e1719a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.factory; - - -import com.casic.missiles.pojo.ProtocolConfig; - -import java.util.List; - -/** - * 数据库访问优化(暂时未做) - *

- * 1、初始化协议解析配置,并存放到处存放缓存,对协议基本配置进行管理 - * 2、其中流程中所有的配置都经过此类进行管理,进行调用获取,增强解析速度 - */ -public interface DatagramFactory { - - /** - * 初始化 - */ - List datagramInit(); - - /** - * 根据前导码配置匹配,模糊匹配获取所有的报文项 - */ - List match(); - - /** - * 根据前导码匹配,返回报文项 - */ - List filer(); - - /** - * 保证数据的唯一性选择器 - */ - List selectOne(); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java new file mode 100644 index 0000000..87444a0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java @@ -0,0 +1,18 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +import java.util.List; + +/** + * 直接用,还是边用边创建 + */ +public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { + + + public DefaultProtocolConfigFactory(ProtocolConfig protocolConfig) { + super(protocolConfig); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java new file mode 100644 index 0000000..cce0c7c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java @@ -0,0 +1,12 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; + +public class DefaultRuleFactory extends AbstractRuleConfigFactory { + + public DefaultRuleFactory(Long ruleId) { + super(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java deleted file mode 100644 index 9ee97e0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.casic.missiles.parser.instance; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service -@Slf4j -@AllArgsConstructor -public class GeneralProcessor { - - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; - - /** - * 统一固定字段解析=>进行规则的查询的判断 - * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 - * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 - */ - @Deprecated - public boolean parseWholeDatagram(ByteBuf buffer, ProtocolConfig protocolConfig) { - try { - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap,protocolId); - //选取规则对应的流程= - DatagramEventConfig datagramEventConfig = processorSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); - //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); - //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); - //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); - //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); - //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); - return true; - } catch (Exception ex) { - log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", - ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); - return false; - } - } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; - } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); - } - - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); - return bizDataMap; - } - - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java index 25e7ad8..6a5777e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java @@ -1,23 +1,31 @@ package com.casic.missiles.parser.instance.impl; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.mapper.DatagramEventMapper; import com.casic.missiles.pojo.DatagramEventConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.SpringContextUtil; -@Service -@AllArgsConstructor +import java.util.List; +import java.util.Optional; + +/** + * @author cz + * + */ public class DefaultProcessorInstanceSelector implements ProcessorInstanceSelector { - private final DatagramEventMapper datagramEventMapper; + private static List datagramEventConfigs; + + static { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + datagramEventConfigs = datagramEventRegistry.getDatagramEventList(); + } @Override public DatagramEventConfig getProcessorInstance(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("rule_id", protocolId); - return datagramEventMapper.selectOne(queryWrapper); + Optional optionalSelectInstance = datagramEventConfigs.stream() + .filter(e -> e.getId().equals(protocolId)).limit(1).findFirst(); + return optionalSelectInstance.isPresent() ? optionalSelectInstance.get() : null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a778671..7b56a43 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,16 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import io.netty.buffer.ByteBuf; /** - * 分析匹配情况 - * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 - * 2、匹配不成功,有后续帧,可以进行下次匹配。 - * 3、匹配不成功,无后续帧,可以进行丢弃。 + * 分析匹配情况 + * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 + * 2、匹配不成功,有后续帧,可以进行下次匹配。 + * 3、匹配不成功,无后续帧,可以进行丢弃。 */ -public interface FrameStructMatcher{ +public interface FrameStructMatcher { - ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig); + ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 05320ab..8ebea78 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,23 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.ProtocolConfigMapper; +import com.casic.missiles.parser.provider.ProtocolConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Component; import java.util.List; import java.util.stream.Collectors; -@Component -@AllArgsConstructor public class LeadingCodeMatcher { - private final ProtocolConfigMapper protocolMapper; - //** 1、首字母匹配前导码, // 2、以匹配出的前导码是否在报文中条件进行前导码的匹配二次筛选 - public List matchLeadingCode(String protocolContent){ + public static List matchFrameLeadingCode(String protocolContent){ List initialConfigs = initialMatch(protocolContent); List preCodeConfigs = initialConfigs.stream() .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) @@ -26,13 +19,16 @@ } //初始化匹配前导码内容 - private List initialMatch(String protocolContent) { - String protocolStr = protocolContent.charAt(0) + ""; - QueryWrapper queryWrapper = new QueryWrapper() - .likeRight("pre_fix", protocolStr); - List protocolConfigList = protocolMapper.selectList(queryWrapper); - return protocolConfigList; + private static List initialMatch(String protocolContent) { + String firstFrameChar = protocolContent.charAt(0) + ""; + ProtocolConfigProvider protocolConfigProvider=new ProtocolConfigProvider(firstFrameChar); + return protocolConfigProvider.getMatchList(); } + + + + + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index cf2113d..e915877 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -1,32 +1,35 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(0) -@Service +@Component public class FrameLengthMatcher implements FrameStructMatcher { - @Autowired - private FieldParser fieldParser; - //超过长度 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { String dataGramContent = ByteBufUtil.hexDump(byteBuf); - if (StringUtils.isEmpty(protocolConfig.getUnpackId()) && StringUtils.isEmpty(protocolConfig.getTailStr())) { - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + //当不存在结尾标志和拆包标志,可以直接使用长度进行匹配 + if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { if (dataGramContent.length() >= totalLength) {//等于长度返回true,超出长度,切断 - ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, protocolConfig, totalLength); + ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, totalLength); return wholeDatagramByte; } else { //读的标志位前移舍弃 @@ -38,7 +41,7 @@ return null; } - private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, Integer totalLength) { byteBuf.readBytes(totalLength); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, totalLength - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 2bfc213..d527ad0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; @@ -13,7 +13,7 @@ import lombok.AllArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.nio.charset.Charset; import java.util.Map; @@ -22,32 +22,30 @@ * 后续标志验证 */ @Order(1) -@Service +@Component @AllArgsConstructor -public class FrameMarkMatcher implements FrameStructMatcher { - - private final FieldConfigDao fieldConfigDao; - private final FieldParser fieldParser; - private final FieldResolver fieldResolverManger; +public class FrameMarkMatcher implements FrameStructMatcher, FixedPropertyEnum { //帧后续标志=>结束,进行帧的重组=>有后续,1、帧移位判别 2、继续接收帧 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig UnpackConfig = StringUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getUnpackId()); - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); - Integer upback = 0; + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); ByteBuf mergeWholeFrameByte = null; - if (!ObjectUtil.isEmpty(UnpackConfig)) { - while (hasNextFullFrame(byteBuf, protocolConfig)) { - upback = (Integer) fieldResolverManger.filedParserManger(byteBuf, UnpackConfig, null); + if (!ObjectUtil.isEmpty(unpackFlag)) { + while (hasNextFullFrame(byteBuf, protocolConfig, protocolFieldConfigProvider)) { //是否存在后续位 - if (upback == 1) {//使用esayRule + if (unpackFlag == 1) {//使用esayRule //表示可以截取 - mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolConfig, totalLength); + mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolFieldConfigProvider, protocolConfig); return mergeWholeFrameByte; } else { - byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig)); + byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig, protocolFieldConfigProvider)); } } } @@ -56,7 +54,8 @@ //选取第一个帧,将业务内容和后面部分分开 //计算数据报文-业务内容 - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolFieldConfigProvider protocolFieldConfigProvider, ProtocolConfig protocolConfig) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); //截取完整报文 byteBuf.readBytes(totalLength); ByteBuf byteBufContent = byteBuf.slice(0, byteBuf.readerIndex()); @@ -68,15 +67,15 @@ String tail = ""; System.out.println(ByteBufUtil.hexDump(byteBufContent)); //会存在多个帧拼接在一起的的情况,进行合并处理 - while (hasNextFullFrame(byteBufContent, protocolConfig)) { - Integer currentFrameLength = fieldParser.getTotalLength(protocolConfig, byteBufContent); + while (hasNextFullFrame(byteBufContent, protocolConfig, protocolFieldConfigProvider)) { + Integer currentFrameLength = protocolFieldConfigProvider.getTotalLength(byteBufContent, protocolConfig); byteBufContent.readBytes(currentFrameLength); ByteBuf currentbyteBuf = byteBufContent.slice(0, byteBufContent.readerIndex()); byteBufContent.markReaderIndex();//读的标志位前移 System.out.println(ByteBufUtil.hexDump(byteBufContent)); String hexDump = currentbyteBuf.toString(Charset.forName("ISO-8859-1")); //获取当前固定帧结构的关系map - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, currentbyteBuf); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(currentbyteBuf, protocolConfig); if (StringUtils.isEmpty(mergeFrameStr)) { //首次获取业务数据报文 mergeFrameStr += hexDump.substring(0, currentFrameFixedProperty.get("tailPosition")); @@ -95,22 +94,22 @@ /** * 获取平移到下一帧起始位置 */ - public int getNextFrameOffset(ByteBuf buffer, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, buffer); - return currentFrameFixedProperty.get("totalLength"); + public int getNextFrameOffset(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + return currentFrameFixedProperty.get(TOTAL_LENGTH); } /** * 判断是否出错进行整个帧的 */ - public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, byteBuf); + public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); //保证读取位置不在固定位置,是可变的业务内容 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("fixedPosition")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(FIXED_POSITION)) { return false; } //判断读取是否操作帧长度 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("totalLength")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(TOTAL_LENGTH)) { return false; } return true; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 76a3784..c3a1bab 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -1,50 +1,50 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.parser.instance.GeneralProcessor; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; +import io.netty.buffer.ByteBufUtil;; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(2) -@Service +@Component public class FrameTailMatcher implements FrameStructMatcher { - @Resource - private FieldConfigDao fieldConfigDao; - @Autowired - private GeneralProcessor generalProcessor; - //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig tailFieldConfig = StringUtils.isEmpty(protocolConfig.getTailStr()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getTailStr()); - if (!ObjectUtil.isEmpty(tailFieldConfig)) { - String tailStr = tailFieldConfig.getFieldName(); + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfig protocolFieldConfig = ObjectUtils.isEmpty(protocolConfig.getTailStr()) ? null : + fieldConfigProvider.getFieldConfigById(protocolConfig.getTailStr()); + if (!ObjectUtil.isEmpty(protocolFieldConfig)) { + String tailStr = protocolFieldConfig.getFieldName(); String dataGramContent = ByteBufUtil.hexDump(byteBuf); Boolean tailFlag = ByteBufUtil.hexDump(byteBuf).contains(tailStr); if (!tailFlag) { //使用esayRule return null; } else if (dataGramContent.indexOf(tailStr) < dataGramContent.length() - tailStr.length()) { Integer length = dataGramContent.indexOf(tailStr) + tailStr.length(); - ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, protocolConfig, length); + ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, length); return wholeDatagramByte; //存在粘包 } } return null; } - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer length) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, Integer length) { byteBuf.readBytes(length); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, length - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java new file mode 100644 index 0000000..5f1c177 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java @@ -0,0 +1,73 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.combined.GenericCombinedFieldResolver; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.CombinedFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class CombinedFieldConfigProvider { + + + /** + * 作为临时配置列表缓存使用 + */ + private final List combinedFieldConfigList; + private Map storeObjectMap = new HashMap<>(); + + public CombinedFieldConfigProvider(Long ruleId) { + CombinedFieldConfigRegistry combinedFieldConfigRegistry = SpringContextUtil.getBean(CombinedFieldConfigRegistry.class); + combinedFieldConfigList = combinedFieldConfigRegistry.getCombinedFieldConfigList(ruleId); + } + + public void parseDataField(RuleConfig ruleConfig, String clearZeroPlain,Map fieldConfigsMap ) { + if (showSkip()) { + return; + } + //匹配对应的数据,然后进行相关的字段解析 + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver(); + combinedFieldResolver.parseDataField(combinedFieldConfigList, byteBuf, storeObjectMap,fieldConfigsMap); + } + + + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getCombinedFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return combinedFieldConfigList.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public List getCombinedFieldConfigList() { + return combinedFieldConfigList; + } + + /* 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(combinedFieldConfigList) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java new file mode 100644 index 0000000..f3cfedc --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java @@ -0,0 +1,11 @@ +package com.casic.missiles.parser.provider; + +/** + * @author cz + * @date 2023-6-12 + */ +public class CommandEventProvider{ + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java new file mode 100644 index 0000000..70eec5e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java @@ -0,0 +1,77 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.safe.SafeStrategy; +import com.casic.missiles.parser.sender.DataSubscribeProvider; +import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class DatagramEventProvider { + + private final DatagramEventConfig processorInstance; + + public DatagramEventProvider(Long ruleId) { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + List datagramEventConfigList = + datagramEventRegistry.getDatagramEventList(ruleId); + processorInstance = this.getProcessorInstance(datagramEventConfigList); + } + + public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { + if (showSkip()) { + return null; + } + return datagramEventConfigList.get(0); + } + + // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 + public String getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap) { + String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? + processorInstance.getSafeBean() : + fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); + if (!StringUtils.isEmpty(safeName)) { + //需要加密 + SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); + String plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); + return clearComplementZero(plain); + } + return ByteBufUtil.hexDump(bizDataContent); + } + + //解密清零操作 + private String clearComplementZero(String plain) { + plain = plain.substring(0, plain.lastIndexOf("00")); + return plain; + } + + //数据发送,数据发送者暂未构建 + public void storeData(Map bizDataMap) { + DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); +// dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return ObjectUtils.isNotEmpty(processorInstance) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java new file mode 100644 index 0000000..7e1fe0a --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java @@ -0,0 +1,97 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.FieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class FieldConfigProvider { + + + private final List fieldConfigs; + private Map storeObjectMap = new HashMap<>(); +// private Map singleObjects = new ConcurrentHashMap<>(); + + public FieldConfigProvider(Long ruleId) { + FieldConfigRegistry fieldConfigRegistry = SpringContextUtil.getBean(FieldConfigRegistry.class); + fieldConfigs = fieldConfigRegistry.getFieldConfigList(ruleId); + } + + public List getFieldConfigs() { + return fieldConfigs; + } + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public Map parseDataField(RuleConfig ruleConfig, String clearZeroPlain) { + if (showSkip()) { + return null; + } + List prepareFieldConfig = prepareParseField(ruleConfig); + if (CollectionUtils.isNotEmpty(prepareFieldConfig)) { + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(fieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + return fixDataMap; + } + } + return null; + } + + /** + * 得到需要处理的业务内容 + * + * @return + */ + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return fieldConfigs.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public Map getFieldConfigsMap() { + return fieldConfigs.stream().collect( + Collectors.toMap(FieldConfig::getId, e -> e) + ); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(fieldConfigs) ? false : true; + } + + +} + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java new file mode 100644 index 0000000..817bfaf --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java @@ -0,0 +1,19 @@ +package com.casic.missiles.parser.provider; + +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.registry.FieldRuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; + +public class FieldRuleConfigProvider { + + private final List fieldRuleConfigList; + + public FieldRuleConfigProvider(Long ruleId) { + FieldRuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(FieldRuleConfigRegistry.class); + fieldRuleConfigList = ruleConfigRegistry.getFieldRuleConfigList(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java new file mode 100644 index 0000000..99a1b06 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java @@ -0,0 +1,53 @@ +package com.casic.missiles.parser.provider; + + +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.registry.ProtocolConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolConfigProvider { + + private final List protocolConfigList; + + public ProtocolConfigProvider(String firstChar) { + ProtocolConfigRegistry registry = SpringContextUtil.getBean(ProtocolConfigRegistry.class); + protocolConfigList = registry.getProtocolConfigList(firstChar); + } + + public List getMatchList() { + return protocolConfigList; + } + + /** + * 设置当前协议 + * + * @param protocolConfig + */ + public ProtocolConfigProvider(ProtocolConfig protocolConfig) { + List protocolConfigs = new ArrayList<>(); + protocolConfigs.add(protocolConfig); + protocolConfigList = protocolConfigs; + } + + /** + * 获取当前协议 + * + * @return + */ + public ProtocolConfig getCurrentProtocolConfig() { + if (this.protocolConfigList == null) { + return null; + } else { + return protocolConfigList.get(0); + } + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java new file mode 100644 index 0000000..043927d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java @@ -0,0 +1,213 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.registry.ProtocolFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolFieldConfigProvider { + + private static final String FIXED_FIELD_DS = "fixedFieldDs"; + private static final String CONTENT_FIELD_DS = "contentFieldDs"; + private static final String PROTOCOL_LENGTH = "protocolLength"; + private static final String PROTOCOL_FIELD_ID = "protocolFieldId"; + private static final String PROTOCOL_POSITION = "protocolPosition"; + + private final List protocolFieldConfigs; + private Map singleObjects = new ConcurrentHashMap<>(); + private Map storeObjectMap = new HashMap<>(); + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public ProtocolFieldConfigProvider(Long protocolId) { + ProtocolFieldConfigRegistry protocolFieldConfigRegistry = SpringContextUtil.getBean(ProtocolFieldConfigRegistry.class); + protocolFieldConfigs = protocolFieldConfigRegistry.getProtocolFieldConfigList(protocolId); + } + + public List getProtocolFieldConfigs() { + return protocolFieldConfigs; + } + + public ProtocolFieldConfig getFieldConfigById(Long fieldId) { + Optional optionalConfig = protocolFieldConfigs.stream().filter( + e -> e.getId().equals(fieldId) + ).findFirst(); + return optionalConfig.isPresent() ? optionalConfig.get() : null; + } + + public Integer getProtocolFieldValue(Long protocolFieldId, ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_FIELD_ID + protocolFieldId + ByteBufUtil.hexDump(byteBuf); + //获取缓存 + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + //加载固定长度数据集合 + Map fixDataMap = this.getProtocolDataMap(byteBuf); + ProtocolFieldConfig protocolFieldConfig = selectFieldConfig(protocolFieldId); + Integer protocolFieldValue = 0; + //获取约定字段的总长度 + if (fixDataMap.containsKey(protocolFieldConfig.getFieldName())) { + Object appointUnpackObject = fixDataMap.get(protocolFieldConfig.getFieldName()); + if (ObjectUtils.isNotEmpty(appointUnpackObject)) { + protocolFieldValue = (Integer) appointUnpackObject; + } + } + if (protocolFieldValue != null) { + //加入缓存 + if (ObjectUtils.isNotEmpty(protocolFieldValue)) { + this.singleObjects.put(catchKey, protocolFieldValue); + return protocolFieldValue; + } + } + return null; + } + + /** + * 获取帧固定位置信息 + * + * @param byteBuf + * @param protocolConfig + * @return + */ + public Map getFixedProperty(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_POSITION + protocolConfig.getId(); + if (this.singleObjects.containsKey(catchKey)) { + return (Map) singleObjects.get(catchKey); + } + Map fixedPropertyMap = new HashMap<>(); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + fixedPropertyMap = fieldParser.doGetFixedProperty(protocolFieldConfigs, this.getTotalLength(byteBuf,protocolConfig)); + if (CollectionUtils.isNotEmpty(fixedPropertyMap)) { + this.singleObjects.put(catchKey, fixedPropertyMap); + return fixedPropertyMap; + } + return fixedPropertyMap; + } + + /** + * 获取帧结构应有的总长度 + */ + public Integer getTotalLength(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_LENGTH + ByteBufUtil.hexDump(byteBuf); + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + Integer appointFrameLength = getProtocolFieldValue(protocolConfig.getTotalLengthId(), byteBuf); + if (appointFrameLength != null) { + //获取过滤的字段集合总长度 + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Integer totalFilterLength = fieldParser.getTotalFilterLength(protocolConfig, byteBuf, getFixFieldConfigMap()); + //计算总长度 + Integer totalLength = appointFrameLength + totalFilterLength; + //加入缓存 + if (ObjectUtils.isNotEmpty(totalLength)) { + this.singleObjects.put(catchKey, totalLength); + return totalLength; + } + } + return null; + } + + /** + * 获取协议有关字段解析内容 + * storeObjectMap存储代转存的数据 + * + * @return + */ + public Map getProtocolDataMap(ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(FIXED_FIELD_DS)) { + return (Map) singleObjects.get(FIXED_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(protocolFieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + this.singleObjects.put(FIXED_FIELD_DS, fixDataMap); + return fixDataMap; + } + return null; + } + + /** + * 获取业务报文内容的content字节 + * + * @param wholeDatagramByte + * @return + */ + public ByteBuf getDataContentBuf(ByteBuf wholeDatagramByte) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(CONTENT_FIELD_DS)) { + return (ByteBuf) singleObjects.get(CONTENT_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + ByteBuf bizDataByteBuf = fieldParser.getDataContentBuf(protocolFieldConfigs, wholeDatagramByte); + if (bizDataByteBuf != null) { + this.singleObjects.put(CONTENT_FIELD_DS, bizDataByteBuf); + return bizDataByteBuf; + } + return null; + } + + + private ProtocolFieldConfig selectFieldConfig(Long id) { + Optional optionalProtocolFieldConfig = this.protocolFieldConfigs.stream().filter( + e -> e.getId().equals(id) + ).findFirst(); + return optionalProtocolFieldConfig.isPresent() ? optionalProtocolFieldConfig.get() : null; + } + + + private Map getFixFieldConfigMap() { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, e -> e) + ); + return fixDataFieldMap; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(protocolFieldConfigs) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java new file mode 100644 index 0000000..dafba1c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java @@ -0,0 +1,56 @@ +package com.casic.missiles.parser.provider; + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.rule.GenericRuleResolver; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.RuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleConfigProvider { + + private final List ruleConfigs; + + public List getRuleConfigs() { + return ruleConfigs; + } + + public RuleConfigProvider(Long protocolId) { + RuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(RuleConfigRegistry.class); + ruleConfigs = ruleConfigRegistry.getRuleConfigById(protocolId); + } + + /** + * 获取规则匹配结果 + * + * @param parseFixedDataMap + * @param protocolFieldConfigs + * @return + */ + public RuleConfig doGetRule(Map parseFixedDataMap, + String ids, + List protocolFieldConfigs) { + if (showSkip()) { + return null; + } + RuleConfig ruleConfig = GenericRuleResolver.machRule(parseFixedDataMap, ids, protocolFieldConfigs, ruleConfigs); + return ruleConfig; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(ruleConfigs) ? false : true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java index 3c05891..856b399 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java @@ -1,18 +1,11 @@ package com.casic.missiles.parser.resolver; -import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.springframework.web.bind.annotation.RequestBody; -import javax.annotation.Resource; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -20,19 +13,17 @@ @Slf4j public class ByteMergeProvider { - @Resource - private FieldRuleEngineMapper fieldRuleEngineMapper; - //拿到所有的值合并到一个值 - public String resolveByteMerge(List valueList, String ruletypeId, String vaildRange) { + public static String resolveByteMerge(List valueList, String ruleTypeId, String vaildRange) { String values = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Map vaildMap = getValidRangeMap(vaildRange); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(ruletypeId); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } + //暂时不处理 +// fieldRuleEngine = fieldRuleConfigMapper.selectById(ruleTypeId); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } Map env2 = new HashMap(); for (int i = 0; i < valueList.size(); i++) { if (vaildMap.containsKey(i)) { @@ -47,7 +38,7 @@ } } - private Map getValidRangeMap(String vaildRange) { + private static Map getValidRangeMap(String vaildRange) { String[] range = vaildRange.split(","); Map vaildMap = new HashMap(); for (int i = 0; i < range.length; i++) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 8d821cd..85d6bbf 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -1,9 +1,12 @@ package com.casic.missiles.parser.resolver; +import com.casic.missiles.pojo.AbstractFieldConfig; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; import io.netty.buffer.ByteBuf; +import java.util.List; import java.util.Map; /** @@ -11,18 +14,14 @@ */ public interface FieldParser { -// Map fieldProcess(String protocolContent,); - Map dataParser(RuleConfig ruleConfig, String lightText,String protocolId); + Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength); - Map fixDataParser(String protocolId, ByteBuf buffer); + Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap); - Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf); + ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer); - ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer); - - ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer); - - Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer); + Integer getTotalFilterLength(ProtocolConfig protocolConfig, ByteBuf byteBuf, Map protocolFieldConfigMap); } + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java new file mode 100644 index 0000000..9e0c00e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java @@ -0,0 +1,52 @@ +package com.casic.missiles.parser.resolver; + +import com.casic.missiles.pojo.AbstractFieldConfig; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.util.List; + +public class FieldParserSupport { + + //分别计算bit和byte长度=> 合并长度 + protected Integer calculateLength(List fieldConfigList) { + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + Integer fixedLength = bytefixedLength + bitfixedLength / 8; + return fixedLength; + } + + //找到最大值=> 根据最大值计算业务数据下标 + protected Integer calculatePosition(List fieldConfigList) { + String rex = "[0-9]+"; + Integer max = -1; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) + && Integer.valueOf(fieldConfig.getOriginPositionByte()) > max) { + max = Integer.valueOf(fieldConfig.getOriginPositionByte()); + } + } + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) && fieldConfig.getOriginPositionByte().equals(max)) { + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + } + } + Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; + return maxFixedPosition; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java deleted file mode 100644 index dd3a6cd..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java +++ /dev/null @@ -1,170 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.ByteResolverParam; -import io.netty.buffer.ByteBuf; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -/** - * 字段解析管理总类 - */ -@Service -@Slf4j -@AllArgsConstructor -public class FieldResolver extends ByteMergeProvider { - - //1、字段截取 => 2、简单的字节解析和复杂的字节解析 - public Object filedParserManger(ByteBuf byteBuf, FieldConfig fieldConfig, Integer maxFixedPosition) { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - //最大固定位置不为空, - if (!ObjectUtil.isEmpty(maxFixedPosition)) { - orignPosition -= maxFixedPosition; - } - Object fieldValue = 0; - //待优化 - if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { - fieldValue = bitToResolver(byteBuf, fieldConfig); - } else { - ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); - fieldValue = parsingFields(fieldBytes, fieldConfig.getRuleJson()); - } - return fieldValue; - } - - //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, - //目前默认配置的规则设置暂不支持配置化,由实现完成 - private Object parsingFields(ByteBuf byteBuf, String ruleJson) { - Object fieldsResolveValue = null; - List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); - if (ObjectUtil.isEmpty(ruleMapList)) { - fieldsResolveValue = defaultResolveBuilder(byteBuf); - } else { - fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); - } - return fieldsResolveValue; - } - - private Object defaultResolveBuilder(ByteBuf byteBuf) { - Integer defaultResolveValue = 0; - for (int i = 0; i < byteBuf.writerIndex(); i++) { - defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; - } - return defaultResolveValue; - } - - //字段解析构建器(针对字节单位的) - //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 - // 字节归并结束或者规则结束=>继续根据规则进行判断 - private Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { - Object customizeResolveValue = null; - try { - List bytStrList = new ArrayList<>(); - //存放到数组里面 - for (int i = 0; i < byteBuf.writerIndex(); i++) { - bytStrList.add(byteBuf.readByte()); - } - int i = 0; - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - customizeResolveValue = this.resolveByteMerge(bytStrList, ruletypeId,vaildRange); - break; - } else { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - List tempBytStr = new ArrayList<>(); - for (int k = 0; i < bytStrList.size(); i++) { - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(k) - .value(bytStrList.get(k)) - .ruletypeId(ruletypeId).build(); - tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); - } - bytStrList = tempBytStr; - } - i++; - } - //字节归并到一起=>继续根据规则进行判断 - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(customizeResolveValue) - .ruletypeId(ruletypeId).build(); - customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(customizeResolveValue)); - return customizeResolveValue; - } catch (RuntimeException ex) { - log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); - return null; - } - } - - /** - * 1、单个字节情况表示字段 - * 2、多字节情况表示字段(暂未处理) - */ - private Object bitToResolver(ByteBuf byteBuf, FieldConfig fieldConfig) { - Object fieldValue = new Object(); - try { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - byte fields = 0x00; - if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); - } else { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); - } - - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { - if (!StringUtils.isEmpty(fieldConfig.getExactOrignPosition())) { - fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getExactOrignPosition())).byteValue() - >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); - } else { - fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); - } - } else { - fieldValue = Integer.valueOf(fields & 0xff); - } - if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { - return fieldValue; - } - List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); - int i = 0; - //字节归并到一起=>继续根据规则进行判断 - while (i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(fieldValue) - .ruletypeId(ruletypeId).build(); - fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(fieldValue)); - return fieldValue; - } catch (RuntimeException ex) { - log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); - return null; - } - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java new file mode 100644 index 0000000..1d2aeab --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java @@ -0,0 +1,36 @@ +package com.casic.missiles.parser.resolver.bytes; + +import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.mapper.FieldRuleConfigMapper; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.pojo.ByteResolverParam; +import com.googlecode.aviator.AviatorEvaluator; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; +//转换规则 +@Component("convert") +@AllArgsConstructor +@Slf4j +public class ByteRuleResolver implements ByteResolver { + + private final FieldRuleConfigMapper fieldRuleConfigMapper; + + @Override + public Object resolveOperationRule(ByteResolverParam byteResolverParam){ + FieldRuleConfig fieldRuleEngine=fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); + if(ObjectUtil.isEmpty(fieldRuleEngine)){ + return byteResolverParam.getValue(); + } + String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); + Map env2 = new HashMap(); + env2.put("value", (byte) byteResolverParam.getValue()); + String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); + return values; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java index 103821c..786b71c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java @@ -2,34 +2,34 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("logicalShift") +@Component("logicalShift") @AllArgsConstructor @Slf4j public class LogicalShiftResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //字节位移 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { Integer index = byteResolverParam.getIndex(); - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return byteResolverParam.getValue(); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java index 476747d..01149bd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("operation") +@Component("operation") @AllArgsConstructor @Slf4j public class OperationResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //混合运算,有常量或者乘除的缩放 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java index 0b82cf4..79abcce 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.casic.missiles.pojo.ByteResolverParam; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; //精度计算 -@Service("precision") +@Component("precision") @AllArgsConstructor @Slf4j public class PrecisionResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java deleted file mode 100644 index 5c3f332..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; -//转换规则 -@Service("convert") -@AllArgsConstructor -@Slf4j -public class RuleResolver implements ByteResolver { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam){ - RuleEvaluator fieldRuleEngine=fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); - if(ObjectUtil.isEmpty(fieldRuleEngine)){ - return byteResolverParam.getValue(); - } - String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); - Map env2 = new HashMap(); - env2.put("value", (byte) byteResolverParam.getValue()); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java new file mode 100644 index 0000000..d3bbd91 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java @@ -0,0 +1,15 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; + +import java.util.List; +import java.util.Map; +// 前导码匹配->长度字段 +public interface AbstractCombinedFieldProcessor { + + Map invoke(Map map, ByteBuf byteBuf, List combinedFieldConfigList, + Map fieldConfigsMap, Map storeObjectMap); + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java new file mode 100644 index 0000000..03c8480 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java @@ -0,0 +1,59 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-13 + */ +//依次递增进行数据的解析, +public class GenericCombinedFieldResolver { + + + //通过查询,字段长度长度随机 + public void parseDataField(List combinedFieldConfigList, ByteBuf byteBuf, + Map storeObjectMap, Map fieldConfigsMap) { + Integer frameLength = Integer.valueOf(ByteBufUtil.hexDump(byteBuf)); + //添加前置处理器 + com.casic.missiles.util.ClassUtil classUtil = new com.casic.missiles.util.ClassUtil(); + List abstractCombinedProcessors = classUtil.getSubClassList(AbstractCombinedFieldProcessor.class); + + Map fieldFixedMap = combinedFieldLeadCodeMap(combinedFieldConfigList); + //frameLength + Map combinedProcessorFields = null; + while (byteBuf.readableBytes() < frameLength) { + //一直处理 + for (AbstractCombinedFieldProcessor abstractCombinedProcessor : abstractCombinedProcessors) { + combinedProcessorFields = abstractCombinedProcessor.invoke(combinedProcessorFields, byteBuf, + combinedFieldConfigList, + fieldConfigsMap, storeObjectMap); + if (combinedProcessorFields == null || byteBuf.readableBytes() < frameLength) { + return; + } + } + + } + } + + /** + * 取出前导码匹配集合 + */ + private Map combinedFieldLeadCodeMap(List combinedFieldConfigList) { + Map fieldFixedMap = combinedFieldConfigList + .stream() + .collect(Collectors.toMap(CombinedFieldConfig::getPrefixCode, e -> e)); + return fieldFixedMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java new file mode 100644 index 0000000..643a934 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java @@ -0,0 +1,100 @@ +package com.casic.missiles.parser.resolver.fields; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.FieldParserSupport; +import com.casic.missiles.pojo.*; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 保存使用时最基本的信息,并且使用原型模式 + */ +@Slf4j +public class DefaultProtocolFieldParser extends FieldParserSupport implements FieldParser, FixedPropertyEnum { + + //通过传入的配置和报文进行字段解析 + @Override + public Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap) { + Map dataMap = new HashMap<>(); + for (AbstractFieldConfig protocolFieldConfig : protocolFieldConfigs) { + if (!ObjectUtils.isEmpty(protocolFieldConfig.getOriginPositionByte())) { + Object fieldValue = FieldResolver.parseField(buffer, protocolFieldConfig, null); + if (protocolFieldConfig.getIsStorage() == 1) { + storeObjectMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + dataMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + } + return dataMap; + } + + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength) { + Map fixedPropertyMap = new HashMap<>(); + Integer fixedLength = calculateLength(protocolFieldConfigs); + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + fixedPropertyMap.put(FIXED_POSITION, maxFixedPosition); + fixedPropertyMap.put(TOTAL_LENGTH, totalLength); + fixedPropertyMap.put(TAIL_POSITION, totalLength - fixedLength + maxFixedPosition); + return fixedPropertyMap; + } + + //** 获取业务内容的byteBuf + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer) { + //计算固定长度 + Integer fixedLength = calculateLength(protocolFieldConfigs); + //总长度获取 + String lightText = buffer.toString(Charset.forName("ISO-8859-1")); + Integer totalLength = lightText.length(); + //计算固定长度最大长度 + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + //计算数据报文内容 + ByteBuf bizDataFields = buffer.slice(maxFixedPosition - 1, (totalLength - fixedLength)); + return bizDataFields; + } + + /** + * 获取过滤字段的长度 + */ + @Override + public Integer getTotalFilterLength(ProtocolConfig protocolConfig, + ByteBuf byteBuf, + Map protocolFieldConfigMap) { + if (ByteBufUtil.hexDump(byteBuf).equals("")) { + return 0; + } + int totalFilterLength = 0; + String filterFields = protocolConfig.getTotalLengthFilterFields(); + try { + if (!StringUtils.isEmpty(filterFields)) { + String[] filterFieldList = filterFields.split(","); + for (String filterFieldId : filterFieldList) { + if (StringUtils.isNotEmpty(filterFieldId)) { + ProtocolFieldConfig fieldConfig = protocolFieldConfigMap.get(Long.valueOf(filterFieldId)); + //这里都是按字节计算,没有对位进行区分,可能会出现错误 + // 如果对位有需求,需要进一步跟进 + totalFilterLength += fieldConfig.getOffsetLength(); + } + } + } + return totalFilterLength; + } catch (Exception ex) { + log.error("报文确认分发阶段,获取报文总长度过滤长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); + } + return totalFilterLength; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java new file mode 100644 index 0000000..d51e887 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java @@ -0,0 +1,169 @@ +package com.casic.missiles.parser.resolver.fields; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.parser.resolver.ByteMergeProvider; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.AbstractFieldConfig; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.pojo.ByteResolverParam; +import io.netty.buffer.ByteBuf; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * 字段解析管理总类 + */ +@Slf4j +public class FieldResolver extends ByteMergeProvider { + + //1、字段截取 => 2、简单的字节解析和复杂的字节解析 + public static Object parseField(ByteBuf byteBuf,AbstractFieldConfig fieldConfig, Integer maxFixedPosition) { + Integer orignPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + //最大固定位置不为空, + if (!ObjectUtil.isEmpty(maxFixedPosition)) { + orignPosition -= maxFixedPosition; + } + Object fieldValue = 0; + //待优化 + if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { + fieldValue = doParseBitField(byteBuf, fieldConfig); + } else { + ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); + fieldValue = doParseByteField(fieldBytes, fieldConfig.getRuleJson()); + } + return fieldValue; + } + + //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, + //目前默认配置的规则设置暂不支持配置化,由实现完成 + private static Object doParseByteField(ByteBuf byteBuf, String ruleJson) { + Object fieldsResolveValue = null; + List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); + if (ObjectUtil.isEmpty(ruleMapList)) { + fieldsResolveValue = defaultResolveBuilder(byteBuf); + } else { + fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); + } + return fieldsResolveValue; + } + + private static Object defaultResolveBuilder(ByteBuf byteBuf) { + Integer defaultResolveValue = 0; + for (int i = 0; i < byteBuf.writerIndex(); i++) { + defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; + } + return defaultResolveValue; + } + + //字段解析构建器(针对字节单位的) + //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 + // 字节归并结束或者规则结束=>继续根据规则进行判断 + private static Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { + Object customizeResolveValue = null; + try { + List bytStrList = new ArrayList<>(); + //存放到数组里面 + for (int i = 0; i < byteBuf.writerIndex(); i++) { + bytStrList.add(byteBuf.readByte()); + } + int i = 0; + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { + if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + customizeResolveValue = resolveByteMerge(bytStrList, ruletypeId, vaildRange); + break; + } else { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + List tempBytStr = new ArrayList<>(); + for (int k = 0; i < bytStrList.size(); i++) { + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(k) + .value(bytStrList.get(k)) + .ruletypeId(ruletypeId).build(); + tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); + } + bytStrList = tempBytStr; + } + i++; + } + //字节归并到一起=>继续根据规则进行判断 + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(null) + .value(customizeResolveValue) + .ruletypeId(ruletypeId).build(); + customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); + i++; + } + System.out.println(JSON.toJSON(customizeResolveValue)); + return customizeResolveValue; + } catch (RuntimeException ex) { + log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); + return null; + } + } + + /** + * 1、单个字节情况表示字段 + * 2、多字节情况表示字段(暂未处理) + */ + private static Object doParseBitField(ByteBuf byteBuf,AbstractFieldConfig fieldConfig) { + Object fieldValue = new Object(); + try { + Integer orignPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + byte fields = 0x00; + if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { + fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); + } else { + fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); + } + + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { + if (!StringUtils.isEmpty(fieldConfig.getOriginPositionBit())) { + fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getOriginPositionBit())).byteValue() + >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); + } else { + fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); + } + } else { + fieldValue = Integer.valueOf(fields & 0xff); + } + if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { + return fieldValue; + } + List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); + int i = 0; + //字节归并到一起=>继续根据规则进行判断 + while (i < ruleMapList.size()) { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(null) + .value(fieldValue) + .ruletypeId(ruletypeId).build(); + fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); + i++; + } + System.out.println(JSON.toJSON(fieldValue)); + return fieldValue; + } catch (RuntimeException ex) { + log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); + return null; + } + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java deleted file mode 100644 index 35ae3d0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java +++ /dev/null @@ -1,183 +0,0 @@ -package com.casic.missiles.parser.resolver.fields; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufAllocator; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; -import org.springframework.util.ObjectUtils; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service("standard") -@AllArgsConstructor -@Slf4j -public class StandardFieldParser implements FieldParser { - - private final FieldConfigDao fieldConfigDao; - private final FieldResolver fieldResolver; - - //数据解析 - @Override - public Map dataParser(RuleConfig ruleConfig, String lightText, String protocolId) { - String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); - ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); - bufferContent.writeBytes(lightText.getBytes(Charset.forName("ISO-8859-1"))); - Map dataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - for (String dataFieldId : dataFieldIds) { - FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(dataFieldId); - if (!ObjectUtils.isEmpty(fieldConfig)) { - dataMap.put(fieldConfig.getFieldName(), String.valueOf(fieldResolver.filedParserManger(bufferContent, fieldConfig, maxFixedPosition))); - } - } - return dataMap; - } - - //数据解析 - @Override - public Map fixDataParser(String protocolId, ByteBuf buffer) { - List dataFieldIdList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Map dataMap = new HashMap<>(); - for (FieldConfig dataField : dataFieldIdList) { - if (!ObjectUtils.isEmpty(dataField.getOrignPosition())) { - Object fieldValue = (Integer) fieldResolver.filedParserManger(buffer, dataField, null); - dataMap.put(dataField.getFieldName(), fieldValue); - } - } - return dataMap; - } - - @Override - public Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf) { - if (ByteBufUtil.hexDump(byteBuf).equals("")) { - return 0; - } - String filterFields = protocolConfig.getTotalLengthFilterField(); - Integer totalLength = 0; - try { - FieldConfig totalFieldConfig = fieldConfigDao.getFieldConfigById(protocolConfig.getTotalLengthId()); - int totalFilterLength = 0; - if (!StringUtils.isEmpty(filterFields)) { - String[] filterFieldList = filterFields.split(","); - for (String filterField : filterFieldList) { - FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(filterField); - //这里都是按字节计算,没有对位进行区分,可能会出现错误 - - // 如果对位有需求,需要进一步跟进 - totalFilterLength += fieldConfig.getOffsetLength(); - } - } - totalLength = (Integer) fieldResolver.filedParserManger(byteBuf, totalFieldConfig, null) + totalFilterLength; - } catch (Exception ex) { - log.error("报文确认分发阶段,获取报文总长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); - } - return totalLength; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer) { - //业务内容 - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - String protocolId = String.valueOf(protocolConfig.getId()); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - //计算固定长度 - Integer fixedLength = calculateLength(fieldConfigList); -// Integer totalLength = this.getTotalLength(protocolConfig, buffer); - //总长度获取 - Integer totalLength = lightText.length(); - //计算固定长度最大长度 - Integer maxFixedPosition = calculatePosition(fieldConfigList); -// buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - //计算数据报文内容 - ByteBuf bizDataFields = buffer.slice(maxFixedPosition-1, (totalLength - fixedLength)); - return bizDataFields; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer) { - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - String protocolId = String.valueOf(protocolConfig.getId()); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer fixedLength = calculateLength(fieldConfigList); -// Integer totalLength = this.getTotalLength(protocolConfig, buffer); - Integer totalLength = lightText.length(); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - ByteBuf fixDataFields = buffer.slice(0, maxFixedPosition); - return fixDataFields; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer) { - String protocolId = String.valueOf(protocolConfig.getId()); - Map fixedPropertyMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer fixedLength = calculateLength(fieldConfigList); - Integer totalLength = this.getTotalLength(protocolConfig, buffer); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - fixedPropertyMap.put("fixedPosition", maxFixedPosition); - fixedPropertyMap.put("totalLength", totalLength); - fixedPropertyMap.put("tailPosition", totalLength - fixedLength + maxFixedPosition); - return fixedPropertyMap; - } - - //分别计算bit和byte长度=> 合并长度 - private Integer calculateLength(List fieldConfigList) { - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (FieldConfig fieldConfig : fieldConfigList) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - Integer fixedLength = bytefixedLength + bitfixedLength / 8; - return fixedLength; - } - - //找到最大值=> 根据最大值计算业务数据下标 - private Integer calculatePosition(List fieldConfigList) { - String rex = "[0-9]+"; - Integer max = -1; - for (FieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOrignPosition()) - && Integer.valueOf(fieldConfig.getOrignPosition()) > max) { - max = Integer.valueOf(fieldConfig.getOrignPosition()); - } - } - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (FieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOrignPosition()) && fieldConfig.getOrignPosition().equals(max)) { - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - } - } - Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; - return maxFixedPosition; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java new file mode 100644 index 0000000..d4ec6c7 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java @@ -0,0 +1,76 @@ +package com.casic.missiles.parser.rule; + +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import org.apache.commons.lang3.StringUtils; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class GenericRuleResolver { + + //根据前置字段的值,找到指定的规则 + //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 + //=>循环判断=>通过规则得到业务字段 + public static RuleConfig machRule(Map fixDataMap, + String ids, + List protocolFieldConfigs, + List ruleConfigs) { + List preRuleConfigList = getPreRuleList(ids, protocolFieldConfigs); + //获取前置规则字段 + final Map metaDataMap = getPreRuleFields(preRuleConfigList, fixDataMap); + //准备固定的字段集合 + Map fixDataFieldMap = getFixDataFieldMap(protocolFieldConfigs); + return RuleResolverCore.doMachRule(ruleConfigs, metaDataMap, fixDataMap, fixDataFieldMap); + } + + private static Map getFixDataFieldMap(List protocolFieldConfigs) { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, ProtocolFieldConfig::getFieldName) + ); + return fixDataFieldMap; + } + + + /** + * 查询前置规则的字段配置 + * + * @param ids + * @return + */ + private static List getPreRuleList(String ids, List protocolFieldConfigs) { + String[] idList = ids.split(","); + Map prepareMaps = new HashMap<>(); + for (String id : idList) { + if (StringUtils.isNotEmpty(id)) { + prepareMaps.put(Long.valueOf(id), ""); + } + } + List preRuleConfigList = protocolFieldConfigs + .stream() + .filter(e -> prepareMaps.containsKey(e.getId())) + .collect(Collectors.toList()); + return preRuleConfigList; + } + + /** + * 获取前置规则解析字段 + */ + private static Map getPreRuleFields(List preRuleFieldConfigList, Map fixDataMap) { + Map ruleFieldMap = new HashMap<>(); + preRuleFieldConfigList.stream() + .forEach( + preRuleFieldConfig -> { + String fieldName = preRuleFieldConfig.getFieldName(); + if (fixDataMap.containsKey(fieldName)) { + ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); + } + } + ); + return ruleFieldMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java new file mode 100644 index 0000000..baae7e8 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -0,0 +1,68 @@ +package com.casic.missiles.parser.rule; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.casic.missiles.pojo.RuleConfig; + +import java.util.*; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleResolverCore { + + + public static RuleConfig doMachRule(List ruleConfigList, Map metaDataMap, + Map fixDataMap, + Map fixDataFieldMap) { + Optional ruleConfigOptional = ruleConfigList.stream() + .filter(ruleConfig -> machRuleConfig( + JSON.parseObject(ruleConfig.getMatchRuleJson(), Map.class), metaDataMap)) + .findFirst(); + if (ObjectUtil.isEmpty(ruleConfigOptional)) { + return null; + } + String[] ruleFields = ruleConfigOptional.get().getDataFieldIds().split(","); + Map ruleMetaDataMap = getRuleFields(ruleFields, fixDataMap, fixDataFieldMap); + //递归选定解析规则,进行规则解析 + if (!ruleConfigOptional.get().getIsFinishMatch().equals("1")) { + //递归选定规则 + doMachRule(ruleConfigList, ruleMetaDataMap, fixDataMap, fixDataFieldMap); + } + return ruleConfigOptional.get(); + } + + + private static Map getRuleFields(String[] preRuleConfigList, Map fixedDataMap, + Map fixedFieldMap) { + Map ruleFieldMap = new HashMap<>(); + for (String preRuleConfigId : preRuleConfigList) { + String fieldName = fixedFieldMap.get(preRuleConfigId); + if (fixedDataMap.containsKey(fieldName)) { + ruleFieldMap.put(fieldName, String.valueOf(fixedDataMap.get(fieldName))); + } + } + return ruleFieldMap; + } + + + //匹配规则配置 + private static Boolean machRuleConfig(Map ruleMap, Map metaDataMap) { + if (ruleMap == null || metaDataMap == null) { + return null; + } + //所有的字段在规则里面必须有有配置 + for (String key : metaDataMap.keySet()) { + if (ruleMap.containsKey(key)) { + if (!ruleMap.get(key).equals(metaDataMap.get(key))) { + return false; + } + } else { + return false; + } + } + return true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java deleted file mode 100644 index 664088d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java +++ /dev/null @@ -1,92 +0,0 @@ -package com.casic.missiles.parser.rule; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.mapper.dao.PreRuleConfigDao; -import com.casic.missiles.mapper.dao.RuleConfigDao; -import lombok.AllArgsConstructor; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.*; -import java.util.stream.Collectors; - -@Service -@AllArgsConstructor -public class RulerProvider { - - private final FieldConfigDao fieldConfigDao; - private final PreRuleConfigDao preRuleConfigDao; - private final RuleConfigDao ruleConfigDao; - - //根据前置字段的值,找到指定的规则 - //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 - //=>循环判断=>通过规则得到业务字段 - public RuleConfig ruleConfig(Map fixDataMap, String protocolId) { - //批量获取规则 - List preRuleConfigList = preRuleConfigDao.getPreRuleList(protocolId); - //获取固定字段 - Map fixFieldMap = getAllFieldMap(protocolId); - //获取前置规则字段 - final String preRuleFields = getPreRuleFields(preRuleConfigList, fixDataMap, fixFieldMap); - List ruleConfigList = ruleConfigDao.getRuleConfigById(protocolId); - Optional ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig ->preRuleFields.equals( ruleConfig.getParseRuleJson())).findFirst(); - //递归选定解析规则,进行规则解析 - while (!ObjectUtil.isEmpty(ruleConfigOptional) && !ruleConfigOptional.get().getIsBizField().equals("1")) { - String ruleFields = getRuleFields(ruleConfigOptional.get().getDataFieldIds().split(","), fixDataMap, fixFieldMap); - ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig -> ruleConfig.getParseRuleJson().equals(ruleFields)).findFirst(); - } - return ruleConfigOptional.get(); - } - - /** - * 获取前置规则解析字段 - */ - private String getPreRuleFields(List preRuleConfigList, Map fixDataMap, Map fixFieldMap) { - Map ruleFieldMap= new HashMap<>(); - preRuleConfigList.stream() - .forEach( - preRuleConfig -> { - String fieldName = fixFieldMap.get(Long.valueOf(preRuleConfig.getRuleFieldId())); - if (fixDataMap.containsKey(fieldName)) { - ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); - } - } - ); - return JSONObject.toJSONString(ruleFieldMap); - } - - private Map getAllFieldMap(String protocolId) { - List fieldList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Map fixFieldMap = fieldList.stream().collect( - Collectors.toMap(FieldConfig::getId, FieldConfig::getFieldName) - ); - return fixFieldMap; - } - - private String getRuleFields(String[] preRuleConfigList, Map fixDataMap, Map fixFieldMap) { - Map ruleFieldMap= new HashMap<>(); - for (String preRuleConfigId : preRuleConfigList) { - String fieldName = fixFieldMap.get(preRuleConfigId); - if (fixDataMap.containsKey(fieldName)) { - ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); - } - } - return JSONObject.toJSONString(ruleFieldMap); - } - - //弃置 - private String ListToString(List ruleFieldList) { - String ruleFields = ""; - for (String ruleField : ruleFieldList) { - ruleFields += ruleField + ","; - } - ruleFields = StringUtils.isEmpty(ruleFields) ? ruleFields : ruleFields.substring(0, ruleFields.length() - 1); - return ruleFields; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java index 6177e10..bfa87a5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java @@ -2,7 +2,7 @@ public interface SafeStrategy { - String decryption(byte[] bytes); + String decryption(String cipher); String encryption(String lightText); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java index 618716c..6236302 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java @@ -9,9 +9,9 @@ //十六进制的字符串转换成字节数组 byte[] bytes = hexStrToBinaryStr(msg); //计算CRC8 - byte crc8 = CRC8(bytes, 0, bytes.length); - String crc8ToStr = "" + Integer.toHexString(0xff & crc8); - return crc8ToStr; +// String crc8ToStr = "" + Integer.toHexString(0xff & crc8); +// return crc8ToStr; + return null; } /** @@ -33,50 +33,5 @@ return bytes; } - /** - * CRC8 校验 多项式 x8+x2+x+1 - * - * @param b - * @param off - * @param len - * @return - */ - public static byte CRC8(final byte[] b, final int off, final int len) { - byte result = 0x00; - for (int i = 0; i < len; i++) { - result = CHECKSUM_TABLE[(result ^ (b[i + off] & 0xFF)) & 0xFF]; - } - return (byte) (result & 0xFFL); - } - - private final static byte[] CHECKSUM_TABLE = {(byte) 0x00, (byte) 0x07, (byte) 0x0e, (byte) 0x09, (byte) 0x1c, (byte) 0x1b, - (byte) 0x12, (byte) 0x15, (byte) 0x38, (byte) 0x3f, (byte) 0x36, (byte) 0x31, (byte) 0x24, (byte) 0x23, (byte) 0x2a, - (byte) 0x2d, (byte) 0x70, (byte) 0x77, (byte) 0x7e, (byte) 0x79, (byte) 0x6c, (byte) 0x6b, (byte) 0x62, (byte) 0x65, - (byte) 0x48, (byte) 0x4f, (byte) 0x46, (byte) 0x41, (byte) 0x54, (byte) 0x53, (byte) 0x5a, (byte) 0x5d, (byte) 0xe0, - (byte) 0xe7, (byte) 0xee, (byte) 0xe9, (byte) 0xfc, (byte) 0xfb, (byte) 0xf2, (byte) 0xf5, (byte) 0xd8, (byte) 0xdf, - (byte) 0xd6, (byte) 0xd1, (byte) 0xc4, (byte) 0xc3, (byte) 0xca, (byte) 0xcd, (byte) 0x90, (byte) 0x97, (byte) 0x9e, - (byte) 0x99, (byte) 0x8c, (byte) 0x8b, (byte) 0x82, (byte) 0x85, (byte) 0xa8, (byte) 0xaf, (byte) 0xa6, (byte) 0xa1, - (byte) 0xb4, (byte) 0xb3, (byte) 0xba, (byte) 0xbd, (byte) 0xc7, (byte) 0xc0, (byte) 0xc9, (byte) 0xce, (byte) 0xdb, - (byte) 0xdc, (byte) 0xd5, (byte) 0xd2, (byte) 0xff, (byte) 0xf8, (byte) 0xf1, (byte) 0xf6, (byte) 0xe3, (byte) 0xe4, - (byte) 0xed, (byte) 0xea, (byte) 0xb7, (byte) 0xb0, (byte) 0xb9, (byte) 0xbe, (byte) 0xab, (byte) 0xac, (byte) 0xa5, - (byte) 0xa2, (byte) 0x8f, (byte) 0x88, (byte) 0x81, (byte) 0x86, (byte) 0x93, (byte) 0x94, (byte) 0x9d, (byte) 0x9a, - (byte) 0x27, (byte) 0x20, (byte) 0x29, (byte) 0x2e, (byte) 0x3b, (byte) 0x3c, (byte) 0x35, (byte) 0x32, (byte) 0x1f, - (byte) 0x18, (byte) 0x11, (byte) 0x16, (byte) 0x03, (byte) 0x04, (byte) 0x0d, (byte) 0x0a, (byte) 0x57, (byte) 0x50, - (byte) 0x59, (byte) 0x5e, (byte) 0x4b, (byte) 0x4c, (byte) 0x45, (byte) 0x42, (byte) 0x6f, (byte) 0x68, (byte) 0x61, - (byte) 0x66, (byte) 0x73, (byte) 0x74, (byte) 0x7d, (byte) 0x7a, (byte) 0x89, (byte) 0x8e, (byte) 0x87, (byte) 0x80, - (byte) 0x95, (byte) 0x92, (byte) 0x9b, (byte) 0x9c, (byte) 0xb1, (byte) 0xb6, (byte) 0xbf, (byte) 0xb8, (byte) 0xad, - (byte) 0xaa, (byte) 0xa3, (byte) 0xa4, (byte) 0xf9, (byte) 0xfe, (byte) 0xf7, (byte) 0xf0, (byte) 0xe5, (byte) 0xe2, - (byte) 0xeb, (byte) 0xec, (byte) 0xc1, (byte) 0xc6, (byte) 0xcf, (byte) 0xc8, (byte) 0xdd, (byte) 0xda, (byte) 0xd3, - (byte) 0xd4, (byte) 0x69, (byte) 0x6e, (byte) 0x67, (byte) 0x60, (byte) 0x75, (byte) 0x72, (byte) 0x7b, (byte) 0x7c, - (byte) 0x51, (byte) 0x56, (byte) 0x5f, (byte) 0x58, (byte) 0x4d, (byte) 0x4a, (byte) 0x43, (byte) 0x44, (byte) 0x19, - (byte) 0x1e, (byte) 0x17, (byte) 0x10, (byte) 0x05, (byte) 0x02, (byte) 0x0b, (byte) 0x0c, (byte) 0x21, (byte) 0x26, - (byte) 0x2f, (byte) 0x28, (byte) 0x3d, (byte) 0x3a, (byte) 0x33, (byte) 0x34, (byte) 0x4e, (byte) 0x49, (byte) 0x40, - (byte) 0x47, (byte) 0x52, (byte) 0x55, (byte) 0x5c, (byte) 0x5b, (byte) 0x76, (byte) 0x71, (byte) 0x78, (byte) 0x7f, - (byte) 0x6a, (byte) 0x6d, (byte) 0x64, (byte) 0x63, (byte) 0x3e, (byte) 0x39, (byte) 0x30, (byte) 0x37, (byte) 0x22, - (byte) 0x25, (byte) 0x2c, (byte) 0x2b, (byte) 0x06, (byte) 0x01, (byte) 0x08, (byte) 0x0f, (byte) 0x1a, (byte) 0x1d, - (byte) 0x14, (byte) 0x13, (byte) 0xae, (byte) 0xa9, (byte) 0xa0, (byte) 0xa7, (byte) 0xb2, (byte) 0xb5, (byte) 0xbc, - (byte) 0xbb, (byte) 0x96, (byte) 0x91, (byte) 0x98, (byte) 0x9f, (byte) 0x8a, (byte) 0x8d, (byte) 0x84, (byte) 0x83, - (byte) 0xde, (byte) 0xd9, (byte) 0xd0, (byte) 0xd7, (byte) 0xc2, (byte) 0xc5, (byte) 0xcc, (byte) 0xcb, (byte) 0xe6, - (byte) 0xe1, (byte) 0xe8, (byte) 0xef, (byte) 0xfa, (byte) 0xfd, (byte) 0xf4, (byte) 0xf3}; } \ No newline at end of file diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java index 27c2838..6e078a3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java @@ -1,9 +1,6 @@ package com.casic.missiles.parser.safe.impl; -import cn.hutool.core.util.CharsetUtil; -import cn.hutool.crypto.symmetric.SM4; -import cn.hutool.crypto.symmetric.SymmetricCrypto; - +import com.casic.missiles.parser.safe.SafeStrategy; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; @@ -11,19 +8,44 @@ import org.bouncycastle.crypto.engines.SM4Engine; import org.bouncycastle.crypto.params.KeyParameter; import org.bouncycastle.util.encoders.Hex; - -import static cn.hutool.crypto.Mode.ECB; -import static cn.hutool.crypto.Padding.NoPadding; +import org.springframework.stereotype.Component; /** * SM4算法工具类 */ @Slf4j -public class Sm4 { +@Component("sm4") +public class Sm4 implements SafeStrategy { //加解密的字节快大小 public static final int BlockSize = 16; + @Override + public String decryption(String cipher) { + byte[] keyByte = { + 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 + }; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(keyByte); + byte[] in = Hex.decode(cipher); + byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); + String plain = EcbDecrypt(in, keyBytes); + return plain; + } + + @Override + public String encryption(String cipher) { + byte[] keyByte = { + 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 + }; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(keyByte); + byte[] in = Hex.decode(cipher); + byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); + String plain = EcbDecrypt(in, keyBytes); + return plain; + } + /** * SM4ECB加密算法,对内 * @@ -32,8 +54,6 @@ * @return */ private static byte[] ecb_encrypt(byte[] in, byte[] keyBytes) { - - SM4Engine sm4Engine = new SM4Engine(); sm4Engine.init(true, new KeyParameter(keyBytes)); byte[] out = new byte[in.length]; @@ -58,27 +78,6 @@ return cipher; } - - /** - * hutool 解密SM4 - * - * @param encodeContent - * @return - */ - public static String decode(String encodeContent) { - String key = "24ad182507479a5da3ad94d9d78ea203"; - try { - SymmetricCrypto sm4 = new SM4(ECB, NoPadding, key.getBytes()); - String decryptStr = sm4.decryptStr(encodeContent, CharsetUtil.CHARSET_UTF_8); - return decryptStr; - } catch (Exception e) { - e.printStackTrace(); - log.error("SM4解密失败"); - } - return null; - } - - /** * SM4的ECB加密算法 * @@ -129,20 +128,6 @@ return plain; } - /** - * SM4的ECB解密算法 - * - * @param cipher 输入的密文字符串 - * @param key 密钥 - * @return - */ - public static String EcbDecrypt(String cipher, String key) { - byte[] in = Hex.decode(cipher); - byte[] keyBytes = Hex.decode(key); - - String plain = EcbDecrypt(in, keyBytes); - return plain; - } /** * 主函数 @@ -151,28 +136,24 @@ */ public static void main(String[] args) { byte[] ciphertext = { + 0x4B, (byte) 0x8C, (byte) 0x9D, 0x08, (byte) 0xE4, (byte) 0xD3, 0x64, 0x42, (byte) 0xB9, (byte) 0xA5, (byte) 0xFE, (byte) 0xCD, (byte) 0x91, 0x1B, 0x38, (byte) 0xAC, (byte) 0xE9, 0x1C, (byte) 0xCD, 0x53, 0x02, (byte) 0xD7, 0x0C, (byte) 0x9B, (byte) 0x96, 0x30, 0x62, (byte) 0xE8, (byte) 0xFB, (byte) 0xEF, (byte) 0xB9, (byte) 0xFF, (byte) 0xDE, 0x19, (byte) 0x80, 0x35, 0x3E, (byte) 0x90, 0x4F, 0x2F, 0x12, 0x2B, 0x19, (byte) 0x8B, 0x6C, 0x7A, (byte) 0x85, (byte) 0xA1, (byte) 0xB1, (byte) 0x86, (byte) 0xA3, 0x7A, 0x46, 0x0C, 0x2F, (byte) 0x94, 0x4F, 0x7F, 0x2C, 0x56, 0x14, (byte) 0xF3, (byte) 0x89, (byte) 0xC3, - 0x3F, 0x20, (byte) 0xF9, (byte) 0x87, (byte) 0xA1, 0x60, (byte) 0xD9, (byte) 0xA8, (byte) 0xFD, (byte) 0xD7, (byte) 0x9B, 0x4B, 0x26, 0x06, 0x30, 0x44}; + 0x3F, 0x20, (byte) 0xF9, (byte) 0x87, (byte) 0xA1, 0x60, (byte) 0xD9, (byte) 0xA8, (byte) 0xFD, (byte) 0xD7, (byte) 0x9B, 0x4B, 0x26, 0x06, 0x30, 0x44 + }; ByteBuf in = ByteBufAllocator.DEFAULT.heapBuffer(); in.writeBytes(ciphertext); - byte[] keyByte = { 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 }; ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); - key.writeBytes(ciphertext); - String resCipherData = decode(ByteBufUtil.hexDump(in)); - ByteBuf out = ByteBufAllocator.DEFAULT.heapBuffer(); -// out.writeBytes(resCipherData); -// System.out.println(hexBytes); - System.out.println(resCipherData.toString()); -// String resPlainData = EcbDecrypt(resCipherData, key); -// System.out.println("原始明文:" + data); -// System.out.println("解密后明文:" + resPlainData); + key.writeBytes(keyByte); +// String resCipherData = EcbDecrypt(ByteBufUtil.hexDump(in), ByteBufUtil.hexDump(key)); +// System.out.println(resCipherData); } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java index 1395a51..ac5f957 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java @@ -1,7 +1,7 @@ package com.casic.missiles.parser.safe.impl; import io.netty.buffer.ByteBufUtil; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** *

@@ -14,9 +14,8 @@ * @author hyl * @version v1.0: Tea.java, v 0.1 2021/3/12 13:48 $ */ -@Service("tea") -///tea算法类 - +//tea算法类 +@Component("tea") public class Tea { public static byte[] MyTea_Encrypt(byte[] MyTeaContent, int ByteLen, byte[] MyTeakey) { @@ -99,7 +98,6 @@ // for(int i32Index = 0; i32Index < 8; i32Index++) { // System.out.print("0x" + Integer.toHexString(MyContent[i32Index]) + " "); // } - // System.out.println("密钥为:"); // for(int i32Index = 0; i32Index < 16; i32Index++) { // System.out.print("0x" + Integer.toHexString(MyKeys[i32Index]) + " "); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java index bdd0721..bd1516a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java @@ -3,7 +3,7 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.parser.sender.DataSubscribeProvider; import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponents; import org.springframework.web.util.UriComponentsBuilder; @@ -12,7 +12,7 @@ import java.util.Collections; import java.util.Map; -@Service("functionCallback") +@Component("functionCallback") public class FunctionCallback implements DataSubscribeProvider { @Resource diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java index 0b44fb9..7526de2 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.Map; -@Service("middleware") +@Component("middleware") public class MiddlewareSubscribe implements DataSubscribeProvider { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java index 5dcee3f..e2f1192 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.Map; -@Service("nosql") +@Component("nosql") public class NoSqlSubscribe implements DataSubscribeProvider { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java b/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java new file mode 100644 index 0000000..81a5324 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java @@ -0,0 +1,86 @@ +package com.casic.missiles.pojo; + +import lombok.Data; + +/** + * 协议 + */ +@Data +public class Msg { + + /** + * 前导码 + */ + private String preamble; + + /** + * 版本号 + */ + private String version; + + /** + * 内容长度 + */ + private int leng; + + /** + * 设备ID + */ + private String deviceId; + + /** + * 通讯方式 + */ + private Integer connType; + + /** + * 加密方式 + */ + private Integer encryType; + + /** + * 目标地址 + */ + private String destAddr; + + /** + * PDUType + */ + private String PDUType; + + /** + * 操作类型 + */ + private Integer operateType; + + /** + * 传输控制位 PDUType.bit7=0时,表示存在后续的访问;当PDUType.bit7=1时,表示无后续的访问。 + */ + private Integer transControlFlag; + + /** + * 设备类型 + */ + private Integer deviceType; + + /** + * 序号 + */ + private Integer seq; + + /** + * tagList + */ + private String tagList; + + /** + * OidList + */ + private String OidList; + + /** + * CRC + */ + private String CRC; + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java index 40a5265..97cc984 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java @@ -40,7 +40,7 @@ String httpContent = msg.toString(Charset.defaultCharset()); log.info(" String : " + msg.toString(Charset.defaultCharset())); String majorContent = httpContent.substring(httpContent.indexOf("{"), httpContent.lastIndexOf("}") + 1); - String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("serviceData")).get("Value")); + String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("RegistryData")).get("Value")); log.info("----------------------------------" + values); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); bufferContent.writeBytes(values.getBytes(Charset.forName("ISO-8859-1"))); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java index 1b132a7..e3ced4b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java @@ -35,7 +35,7 @@ String httpContent = msg.toString(Charset.defaultCharset()); log.info(" String : " + msg.toString(Charset.defaultCharset())); String majorContent = httpContent.substring(httpContent.indexOf("{"), httpContent.lastIndexOf("}") + 1); - String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("serviceData")).get("Value")); + String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("RegistryData")).get("Value")); log.info("----------------------------------" + values); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); bufferContent.writeBytes(values.getBytes(Charset.forName("ISO-8859-1"))); diff --git a/sensorhub-core/src/main/resources/application.properties b/sensorhub-core/src/main/resources/application.properties deleted file mode 100644 index 8b13789..0000000 --- a/sensorhub-core/src/main/resources/application.properties +++ /dev/null @@ -1 +0,0 @@ - diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java index 608af3a..32cc8a4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java @@ -2,48 +2,47 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.delivery.decorator.ByteDecorator; +import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @AllArgsConstructor public class FieldDecoratorManger { - private final RuleDictDao ruleDictDao; + private final RuleConfigRegistry ruleDictDao; // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 // (1)静态的业务字段是字典里面可以配置的 // (2)动态的业务字段是通过规则生成的 public String contentMerge(String ruleJson, String sceneConent, String dynamicContent) { - List ruleDictList = ruleDictDao.getRuleDictConfig(); - Map ruleDictMap = ruleDictList.stream().collect( - Collectors.toMap(RuleDict::getId, e -> e)); - List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); - for (Map ruleMap : ruleMapList) { - String ruleType = String.valueOf(ruleMap.get("ruleType")); - ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); - NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); - byteDecorator.nodeDecoratorRule(nodeDecoratorParm); - } +// List ruleDictList = ruleDictDao.getRuleDictConfig(); +// Map ruleDictMap = ruleDictList.stream().collect( +// Collectors.toMap(RuleDict::getId, e -> e)); +// List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); +// for (Map ruleMap : ruleMapList) { +// String ruleType = String.valueOf(ruleMap.get("ruleType")); +// ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); +// NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); +// byteDecorator.nodeDecoratorRule(nodeDecoratorParm); +// } return null; } - - private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { - NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() - .contents(sceneConent) - .dynamicContent(dynamicContent) - .ruletypeId(ruletypeId) - .ruleDictMap(ruleDictMap) - .build(); - return nodeDecoratorParm; - } +// +// private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { +// NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() +// .contents(sceneConent) +// .dynamicContent(dynamicContent) +// .ruletypeId(ruletypeId) +// .ruleDictMap(ruleDictMap) +// .build(); +// return nodeDecoratorParm; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java index 652970c..b204ac3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java @@ -1,56 +1,56 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@AllArgsConstructor -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", - JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Component; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Component("logicalDecorator") +//@AllArgsConstructor +//@Slf4j +//public class LogicalShiftDecorator implements ByteDecorator { +// +//// private final FieldRuleEngineMapper fieldRuleEngineMapper; +//// +//// //字节位移 +//// @Override +//// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +//// String logicalValue = ""; +//// RuleEvaluator fieldRuleEngine = new RuleEvaluator(); +//// try { +//// Map env2 = new HashMap(); +//// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +//// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +//// for (String contentId : contentIdList) { +//// RuleDict ruleDict = ruleDictMap.get(contentId); +//// if (ruleDict.getCode().contains("#")) { +//// //使用动态的值 +//// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +//// } +//// env2.put(ruleDict.getName(), ruleDict.getCode()); +//// } +//// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +//// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +//// return null; +//// } +//// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +//// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +//// return values; +//// } catch (Exception ex) { +//// log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", +//// JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +//// return null; +//// } +//// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java index 346468f..822fead 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@AllArgsConstructor -@Slf4j -public class OperationDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("optionDecorator") +//@AllArgsConstructor +//@Slf4j +//public class OperationDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //混合运算,有常量或者乘除的缩放 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java index 50fb0a7..7a8bccb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@AllArgsConstructor -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +////精度计算 +//@AllArgsConstructor +//@Registry("precisionDecorator") +//@Slf4j +//public class PrecisionDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java index da39235..27f9cc7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java @@ -1,54 +1,53 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@AllArgsConstructor -@Slf4j -public class RuleDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("ruleDecorator") +//@AllArgsConstructor +//@Slf4j +//public class RuleDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //吃我一套正则表达式 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (Exception ex) { +// log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java index 7f5cbf3..c043f97 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java @@ -2,6 +2,6 @@ import java.util.Map; -public interface ComandeEventService { +public interface ComandeEventService{ Map loadComandeEventConfig(String protocolId,String scene); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java index 476ad84..aaf1837 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java @@ -2,46 +2,46 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.dao.CommandEventDao; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @Slf4j @AllArgsConstructor -public class ComandeEventServiceImpl implements ComandeEventService { +public class ComandeEventServiceImpl implements ComandeEventRegistry { - private final CommandEventDao commandEventDao; + // private final CommandEventDao commandEventDao; // 加密bean 固定字段出现变化的字段解析,业务字段的有序内容 @Override - public Map loadComandeEventConfig(String protocolId,String sceneName) { - CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); - if (ObjectUtil.isEmpty(commandEventConfig)) { - log.error("协议{},没有配置成功接收回复配置,清排查原因"); - return null; - } - String replyJson = commandEventConfig.getReplyContentJson(); - List> replyMapList = JSONArray.parseObject(replyJson, List.class); - List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); - Map fixMap = fixList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); - List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) - .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) - .collect(Collectors.toList()); - Map commandConfigMap = new HashMap<>(); - commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); - commandConfigMap.put("fixContent", fixMap); - commandConfigMap.put("bizContent", contentList); - return commandConfigMap; + public Map loadComandeEventConfig(String protocolId, String sceneName) { +// CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); +// if (ObjectUtil.isEmpty(commandEventConfig)) { +// log.error("协议{},没有配置成功接收回复配置,清排查原因"); +// return null; +// } +// String replyJson = commandEventConfig.getReplyContentJson(); +// List> replyMapList = JSONArray.parseObject(replyJson, List.class); +// List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); +// Map fixMap = fixList.stream() +// .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); +// List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) +// .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) +// .collect(Collectors.toList()); +// Map commandConfigMap = new HashMap<>(); +// commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); +// commandConfigMap.put("fixContent", fixMap); +// commandConfigMap.put("bizContent", contentList); +// return commandConfigMap; + return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 128b09d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java deleted file mode 100644 index 4016b0b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface DatagramEventMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java deleted file mode 100644 index 597c306..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.apache.ibatis.annotations.Mapper; - -public interface FieldConfigMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java deleted file mode 100644 index a31680a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.PreRuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface PreRuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java deleted file mode 100644 index 9060a69..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface ProtocolConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java deleted file mode 100644 index 6fa6936..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java deleted file mode 100644 index 582a705..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleDict; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleDictMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java deleted file mode 100644 index 6e302c8..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.CommandEventMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Optional; - -@Component -public class CommandEventDao { - - @Resource - private CommandEventMapper commandEventMapper; - - public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId) - .eq("scene", sceneName) - .eq("enabled", 1); - List commandEventConfig = commandEventMapper.selectList(queryWrapper); - Optional optionalEventConfig = commandEventConfig.stream().findFirst(); - return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java deleted file mode 100644 index 9137e4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.FieldConfigMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class FieldConfigDao { - - @Resource - private FieldConfigMapper fieldConfigMapper; - - public FieldConfig getFieldConfigById(String fieldId) { - FieldConfig fieldConfig = fieldConfigMapper.selectById(fieldId); - return fieldConfig; - } - - public List getFieldConfigs(String protocolId,Integer isFixed) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",isFixed); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - - public List getStorageFieldConfig(String protocolId) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",1) - .eq("is_storage",1); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java deleted file mode 100644 index 67bff6b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.mapper.PreRuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class PreRuleConfigDao { - - @Resource - private PreRuleConfigMapper preRuleConfigMapper; - - public List getPreRuleList(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return preRuleConfigMapper.selectList(queryWrapper); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java deleted file mode 100644 index d69ea85..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.RuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleConfigDao { - - @Resource - private RuleConfigMapper ruleConfigMapper; - - public RuleConfig getNextRuleConfig(String ruleFields) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("parse_rule_json", ruleFields); - return ruleConfigMapper.selectOne(queryWrapper); - } - - - public List getRuleConfigById(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return ruleConfigMapper.selectList(queryWrapper); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java deleted file mode 100644 index 932c185..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.RuleDictMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleDictDao { - - @Resource - private RuleDictMapper ruleDictMapper; - - public List getRuleDictConfig() { - List ruleDictList = ruleDictMapper.selectList(null); - return ruleDictList; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java index 9f9e279..43bc4d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java @@ -10,20 +10,15 @@ import io.netty.channel.socket.nio.NioServerSocketChannel; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import javax.annotation.PreDestroy; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static cn.hutool.core.util.ClassUtil.getClasses; /** * SensorhubServer netty服务端 */ @Slf4j -@Service +@Component public class SensorhubServer { /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java index 2c79ff5..9a28c36 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java @@ -11,13 +11,13 @@ import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioSocketChannel; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClient 客户端 */ @Slf4j -@Service +@Registry public final class SensorhubClient { public static void main(String[] args) throws Exception { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java index 9774be0..477c3f7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java @@ -6,12 +6,12 @@ import io.netty.channel.socket.SocketChannel; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientChannelInitialHandler */ -@Service +@Registry public class SensorhubClientChannelInitialHandler extends ChannelInitializer { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java index 346f4b3..73560e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java @@ -5,13 +5,13 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientHandler */ @Slf4j -@Service +@Registry public class SensorhubClientHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java index 5c1c6f2..d990af5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java @@ -4,12 +4,12 @@ import com.casic.missiles.pojo.Msg; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** * SensorhubServerHandler */ -@Service +@Component public class SensorhubServerHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 67283ae..af3172c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,41 +1,37 @@ package com.casic.missiles.parser; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultProtocolConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.*; +import com.casic.missiles.registry.FieldConfigRegistry; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; -import java.nio.charset.Charset; import java.util.HashMap; import java.util.List; import java.util.Map; -@Service("genericProtocolParser") +/** + * @author + */ +@Component("genericProtocolParser") @Slf4j -@AllArgsConstructor +@RequiredArgsConstructor public class GenericProtocolParser implements ProtocolParser { - private final LeadingCodeMatcher leadingCodeMatcher; private final List frameStructDispenserList; - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorInstanceSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; // 匹配首字母前导码=> 帧结构匹配前导码=> // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 @@ -44,18 +40,19 @@ public Boolean doParseProtocol(ByteBuf byteBuf) { String protocolContent = ByteBufUtil.hexDump(byteBuf); //匹配前导码 - List preCodeConfigs = leadingCodeMatcher.matchLeadingCode(protocolContent); + List preCodeConfigs = LeadingCodeMatcher.matchFrameLeadingCode(protocolContent); //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 if (preCodeConfigs.size() == 0) { - return rematch(byteBuf,protocolContent); + return rematch(byteBuf, protocolContent); } - //暂时先取第一个 + //暂时先取第一个,提升速度,使用享元模式, 减少类的创建销毁与构建 ProtocolConfig protocolConfig = preCodeConfigs.get(0); + AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); ByteBuf wholeDatagramByte = null; //通过匹配帧结构获取完整的数据包 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, preCodeConfigs.get(0))) != null) { + if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, protocolFactory)) != null) { break; } } @@ -68,76 +65,78 @@ * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 */ - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId, wholeDatagramByte); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap, protocolId); - //选取规则对应的流程实例 - DatagramEventConfig datagramEventConfig = processorInstanceSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); + //进行规则字段解析,进行匹配规则 + RuleConfig ruleConfig = getRuleConfig(protocolFactory, wholeDatagramByte); + if (ruleConfig == null) { + return false; + } //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, wholeDatagramByte); + ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte); + //以下进行业务的规则解析,同时选定流程实例 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); + DatagramEventProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain, + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText, protocolId); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain); //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); + datagramEventProvider.storeData(bizDataMap); return true; } - private Boolean rematch(ByteBuf byteBuf,String protocolContent) { + /** + * 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 + */ + private Boolean rematch(ByteBuf byteBuf, String protocolContent) { //重置位判断 byteBuf.resetReaderIndex(); //判断重置是否前移,如果没有前移,则直接判为匹配失败 if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { return false; } else { + //递归执行 return doParseProtocol(byteBuf); } } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; + //获取匹配规则->匹配规则 + private RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + //取出其中参与逻辑provider并判空 + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); + String rulePrepareFields = protocolConfig.getRulePrepareFields(); + //固定字段 + if (StringUtils.isNotEmpty(rulePrepareFields)) { + //获取统一固定字段解析 + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + //获取该协议的字段配置,用于协议规则匹配 + List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); + //获取规则 + RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, + rulePrepareFields, protocolFieldConfigs); + return ruleConfig; + } + return null; } - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + //数据构建,获取固定字段的store和业务字段store + private Map buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + Map bizDataMap = new HashMap<>(); + Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); + Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); + bizDataMap.putAll(ruleStoreObjectMap); + bizDataMap.putAll(protocolStoreObjectMap); return bizDataMap; } - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java index 8a46e32..16ce2e5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java @@ -3,6 +3,7 @@ import io.netty.buffer.ByteBuf; public interface ProtocolParser { + Boolean doParseProtocol(ByteBuf byteBuf); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java new file mode 100644 index 0000000..f7814af --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java @@ -0,0 +1,35 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.ProtocolConfigProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.ProtocolConfig; + +/** + * 存放基本协议的的加载信息 + */ +public class AbstractProtocolConfigFactory { + private final ProtocolConfigProvider protocolConfigProvider; + private final ProtocolFieldConfigProvider protocolFieldConfigProvider; + private final RuleConfigProvider ruleConfigProvider; + + public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { + this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); + this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); + this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); + } + + public ProtocolConfigProvider getProtocolConfigProvider() { + return protocolConfigProvider; + } + + public ProtocolFieldConfigProvider getProtocolFieldConfigProvider() { + return protocolFieldConfigProvider; + } + + public RuleConfigProvider getRuleConfigProvider() { + return ruleConfigProvider; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java new file mode 100644 index 0000000..6e36147 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java @@ -0,0 +1,57 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.CombinedFieldConfigProvider; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.FieldConfigProvider; +import com.casic.missiles.parser.provider.FieldRuleConfigProvider; + +/** + * 存放规则相关的的的加载信息 + */ +public class AbstractRuleConfigFactory { + + /** + * 处理字节 + */ + private final FieldConfigProvider fieldConfigProvider; + /** + * 处理组合字节解析的解码器 + */ + private final CombinedFieldConfigProvider combinedFieldConfigProvider; + /** + * 处理负责字节解析的规则配置 + */ + private final FieldRuleConfigProvider fieldRuleConfigProvider; + /** + * 处理实例流程 + */ + private final DatagramEventProvider datagramEventProvider; + + + public AbstractRuleConfigFactory(Long ruleId) { + this.fieldConfigProvider = new FieldConfigProvider(ruleId); + this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); + this.fieldRuleConfigProvider = new FieldRuleConfigProvider(ruleId); + this.datagramEventProvider = new DatagramEventProvider(ruleId); + } + + public FieldConfigProvider getFieldConfigProvider() { + return fieldConfigProvider; + } + + public CombinedFieldConfigProvider getCombinedFieldConfigProvider() { + return combinedFieldConfigProvider; + } + + public FieldRuleConfigProvider getFieldRuleConfigProvider() { + return fieldRuleConfigProvider; + } + + public DatagramEventProvider getDatagramEventProvider() { + return datagramEventProvider; + } + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java deleted file mode 100644 index 6e1719a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.factory; - - -import com.casic.missiles.pojo.ProtocolConfig; - -import java.util.List; - -/** - * 数据库访问优化(暂时未做) - *

- * 1、初始化协议解析配置,并存放到处存放缓存,对协议基本配置进行管理 - * 2、其中流程中所有的配置都经过此类进行管理,进行调用获取,增强解析速度 - */ -public interface DatagramFactory { - - /** - * 初始化 - */ - List datagramInit(); - - /** - * 根据前导码配置匹配,模糊匹配获取所有的报文项 - */ - List match(); - - /** - * 根据前导码匹配,返回报文项 - */ - List filer(); - - /** - * 保证数据的唯一性选择器 - */ - List selectOne(); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java new file mode 100644 index 0000000..87444a0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java @@ -0,0 +1,18 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +import java.util.List; + +/** + * 直接用,还是边用边创建 + */ +public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { + + + public DefaultProtocolConfigFactory(ProtocolConfig protocolConfig) { + super(protocolConfig); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java new file mode 100644 index 0000000..cce0c7c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java @@ -0,0 +1,12 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; + +public class DefaultRuleFactory extends AbstractRuleConfigFactory { + + public DefaultRuleFactory(Long ruleId) { + super(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java deleted file mode 100644 index 9ee97e0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.casic.missiles.parser.instance; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service -@Slf4j -@AllArgsConstructor -public class GeneralProcessor { - - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; - - /** - * 统一固定字段解析=>进行规则的查询的判断 - * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 - * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 - */ - @Deprecated - public boolean parseWholeDatagram(ByteBuf buffer, ProtocolConfig protocolConfig) { - try { - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap,protocolId); - //选取规则对应的流程= - DatagramEventConfig datagramEventConfig = processorSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); - //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); - //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); - //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); - //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); - //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); - return true; - } catch (Exception ex) { - log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", - ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); - return false; - } - } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; - } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); - } - - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); - return bizDataMap; - } - - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java index 25e7ad8..6a5777e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java @@ -1,23 +1,31 @@ package com.casic.missiles.parser.instance.impl; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.mapper.DatagramEventMapper; import com.casic.missiles.pojo.DatagramEventConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.SpringContextUtil; -@Service -@AllArgsConstructor +import java.util.List; +import java.util.Optional; + +/** + * @author cz + * + */ public class DefaultProcessorInstanceSelector implements ProcessorInstanceSelector { - private final DatagramEventMapper datagramEventMapper; + private static List datagramEventConfigs; + + static { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + datagramEventConfigs = datagramEventRegistry.getDatagramEventList(); + } @Override public DatagramEventConfig getProcessorInstance(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("rule_id", protocolId); - return datagramEventMapper.selectOne(queryWrapper); + Optional optionalSelectInstance = datagramEventConfigs.stream() + .filter(e -> e.getId().equals(protocolId)).limit(1).findFirst(); + return optionalSelectInstance.isPresent() ? optionalSelectInstance.get() : null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a778671..7b56a43 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,16 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import io.netty.buffer.ByteBuf; /** - * 分析匹配情况 - * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 - * 2、匹配不成功,有后续帧,可以进行下次匹配。 - * 3、匹配不成功,无后续帧,可以进行丢弃。 + * 分析匹配情况 + * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 + * 2、匹配不成功,有后续帧,可以进行下次匹配。 + * 3、匹配不成功,无后续帧,可以进行丢弃。 */ -public interface FrameStructMatcher{ +public interface FrameStructMatcher { - ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig); + ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 05320ab..8ebea78 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,23 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.ProtocolConfigMapper; +import com.casic.missiles.parser.provider.ProtocolConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Component; import java.util.List; import java.util.stream.Collectors; -@Component -@AllArgsConstructor public class LeadingCodeMatcher { - private final ProtocolConfigMapper protocolMapper; - //** 1、首字母匹配前导码, // 2、以匹配出的前导码是否在报文中条件进行前导码的匹配二次筛选 - public List matchLeadingCode(String protocolContent){ + public static List matchFrameLeadingCode(String protocolContent){ List initialConfigs = initialMatch(protocolContent); List preCodeConfigs = initialConfigs.stream() .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) @@ -26,13 +19,16 @@ } //初始化匹配前导码内容 - private List initialMatch(String protocolContent) { - String protocolStr = protocolContent.charAt(0) + ""; - QueryWrapper queryWrapper = new QueryWrapper() - .likeRight("pre_fix", protocolStr); - List protocolConfigList = protocolMapper.selectList(queryWrapper); - return protocolConfigList; + private static List initialMatch(String protocolContent) { + String firstFrameChar = protocolContent.charAt(0) + ""; + ProtocolConfigProvider protocolConfigProvider=new ProtocolConfigProvider(firstFrameChar); + return protocolConfigProvider.getMatchList(); } + + + + + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index cf2113d..e915877 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -1,32 +1,35 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(0) -@Service +@Component public class FrameLengthMatcher implements FrameStructMatcher { - @Autowired - private FieldParser fieldParser; - //超过长度 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { String dataGramContent = ByteBufUtil.hexDump(byteBuf); - if (StringUtils.isEmpty(protocolConfig.getUnpackId()) && StringUtils.isEmpty(protocolConfig.getTailStr())) { - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + //当不存在结尾标志和拆包标志,可以直接使用长度进行匹配 + if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { if (dataGramContent.length() >= totalLength) {//等于长度返回true,超出长度,切断 - ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, protocolConfig, totalLength); + ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, totalLength); return wholeDatagramByte; } else { //读的标志位前移舍弃 @@ -38,7 +41,7 @@ return null; } - private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, Integer totalLength) { byteBuf.readBytes(totalLength); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, totalLength - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 2bfc213..d527ad0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; @@ -13,7 +13,7 @@ import lombok.AllArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.nio.charset.Charset; import java.util.Map; @@ -22,32 +22,30 @@ * 后续标志验证 */ @Order(1) -@Service +@Component @AllArgsConstructor -public class FrameMarkMatcher implements FrameStructMatcher { - - private final FieldConfigDao fieldConfigDao; - private final FieldParser fieldParser; - private final FieldResolver fieldResolverManger; +public class FrameMarkMatcher implements FrameStructMatcher, FixedPropertyEnum { //帧后续标志=>结束,进行帧的重组=>有后续,1、帧移位判别 2、继续接收帧 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig UnpackConfig = StringUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getUnpackId()); - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); - Integer upback = 0; + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); ByteBuf mergeWholeFrameByte = null; - if (!ObjectUtil.isEmpty(UnpackConfig)) { - while (hasNextFullFrame(byteBuf, protocolConfig)) { - upback = (Integer) fieldResolverManger.filedParserManger(byteBuf, UnpackConfig, null); + if (!ObjectUtil.isEmpty(unpackFlag)) { + while (hasNextFullFrame(byteBuf, protocolConfig, protocolFieldConfigProvider)) { //是否存在后续位 - if (upback == 1) {//使用esayRule + if (unpackFlag == 1) {//使用esayRule //表示可以截取 - mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolConfig, totalLength); + mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolFieldConfigProvider, protocolConfig); return mergeWholeFrameByte; } else { - byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig)); + byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig, protocolFieldConfigProvider)); } } } @@ -56,7 +54,8 @@ //选取第一个帧,将业务内容和后面部分分开 //计算数据报文-业务内容 - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolFieldConfigProvider protocolFieldConfigProvider, ProtocolConfig protocolConfig) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); //截取完整报文 byteBuf.readBytes(totalLength); ByteBuf byteBufContent = byteBuf.slice(0, byteBuf.readerIndex()); @@ -68,15 +67,15 @@ String tail = ""; System.out.println(ByteBufUtil.hexDump(byteBufContent)); //会存在多个帧拼接在一起的的情况,进行合并处理 - while (hasNextFullFrame(byteBufContent, protocolConfig)) { - Integer currentFrameLength = fieldParser.getTotalLength(protocolConfig, byteBufContent); + while (hasNextFullFrame(byteBufContent, protocolConfig, protocolFieldConfigProvider)) { + Integer currentFrameLength = protocolFieldConfigProvider.getTotalLength(byteBufContent, protocolConfig); byteBufContent.readBytes(currentFrameLength); ByteBuf currentbyteBuf = byteBufContent.slice(0, byteBufContent.readerIndex()); byteBufContent.markReaderIndex();//读的标志位前移 System.out.println(ByteBufUtil.hexDump(byteBufContent)); String hexDump = currentbyteBuf.toString(Charset.forName("ISO-8859-1")); //获取当前固定帧结构的关系map - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, currentbyteBuf); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(currentbyteBuf, protocolConfig); if (StringUtils.isEmpty(mergeFrameStr)) { //首次获取业务数据报文 mergeFrameStr += hexDump.substring(0, currentFrameFixedProperty.get("tailPosition")); @@ -95,22 +94,22 @@ /** * 获取平移到下一帧起始位置 */ - public int getNextFrameOffset(ByteBuf buffer, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, buffer); - return currentFrameFixedProperty.get("totalLength"); + public int getNextFrameOffset(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + return currentFrameFixedProperty.get(TOTAL_LENGTH); } /** * 判断是否出错进行整个帧的 */ - public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, byteBuf); + public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); //保证读取位置不在固定位置,是可变的业务内容 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("fixedPosition")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(FIXED_POSITION)) { return false; } //判断读取是否操作帧长度 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("totalLength")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(TOTAL_LENGTH)) { return false; } return true; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 76a3784..c3a1bab 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -1,50 +1,50 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.parser.instance.GeneralProcessor; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; +import io.netty.buffer.ByteBufUtil;; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(2) -@Service +@Component public class FrameTailMatcher implements FrameStructMatcher { - @Resource - private FieldConfigDao fieldConfigDao; - @Autowired - private GeneralProcessor generalProcessor; - //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig tailFieldConfig = StringUtils.isEmpty(protocolConfig.getTailStr()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getTailStr()); - if (!ObjectUtil.isEmpty(tailFieldConfig)) { - String tailStr = tailFieldConfig.getFieldName(); + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfig protocolFieldConfig = ObjectUtils.isEmpty(protocolConfig.getTailStr()) ? null : + fieldConfigProvider.getFieldConfigById(protocolConfig.getTailStr()); + if (!ObjectUtil.isEmpty(protocolFieldConfig)) { + String tailStr = protocolFieldConfig.getFieldName(); String dataGramContent = ByteBufUtil.hexDump(byteBuf); Boolean tailFlag = ByteBufUtil.hexDump(byteBuf).contains(tailStr); if (!tailFlag) { //使用esayRule return null; } else if (dataGramContent.indexOf(tailStr) < dataGramContent.length() - tailStr.length()) { Integer length = dataGramContent.indexOf(tailStr) + tailStr.length(); - ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, protocolConfig, length); + ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, length); return wholeDatagramByte; //存在粘包 } } return null; } - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer length) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, Integer length) { byteBuf.readBytes(length); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, length - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java new file mode 100644 index 0000000..5f1c177 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java @@ -0,0 +1,73 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.combined.GenericCombinedFieldResolver; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.CombinedFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class CombinedFieldConfigProvider { + + + /** + * 作为临时配置列表缓存使用 + */ + private final List combinedFieldConfigList; + private Map storeObjectMap = new HashMap<>(); + + public CombinedFieldConfigProvider(Long ruleId) { + CombinedFieldConfigRegistry combinedFieldConfigRegistry = SpringContextUtil.getBean(CombinedFieldConfigRegistry.class); + combinedFieldConfigList = combinedFieldConfigRegistry.getCombinedFieldConfigList(ruleId); + } + + public void parseDataField(RuleConfig ruleConfig, String clearZeroPlain,Map fieldConfigsMap ) { + if (showSkip()) { + return; + } + //匹配对应的数据,然后进行相关的字段解析 + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver(); + combinedFieldResolver.parseDataField(combinedFieldConfigList, byteBuf, storeObjectMap,fieldConfigsMap); + } + + + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getCombinedFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return combinedFieldConfigList.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public List getCombinedFieldConfigList() { + return combinedFieldConfigList; + } + + /* 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(combinedFieldConfigList) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java new file mode 100644 index 0000000..f3cfedc --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java @@ -0,0 +1,11 @@ +package com.casic.missiles.parser.provider; + +/** + * @author cz + * @date 2023-6-12 + */ +public class CommandEventProvider{ + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java new file mode 100644 index 0000000..70eec5e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java @@ -0,0 +1,77 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.safe.SafeStrategy; +import com.casic.missiles.parser.sender.DataSubscribeProvider; +import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class DatagramEventProvider { + + private final DatagramEventConfig processorInstance; + + public DatagramEventProvider(Long ruleId) { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + List datagramEventConfigList = + datagramEventRegistry.getDatagramEventList(ruleId); + processorInstance = this.getProcessorInstance(datagramEventConfigList); + } + + public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { + if (showSkip()) { + return null; + } + return datagramEventConfigList.get(0); + } + + // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 + public String getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap) { + String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? + processorInstance.getSafeBean() : + fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); + if (!StringUtils.isEmpty(safeName)) { + //需要加密 + SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); + String plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); + return clearComplementZero(plain); + } + return ByteBufUtil.hexDump(bizDataContent); + } + + //解密清零操作 + private String clearComplementZero(String plain) { + plain = plain.substring(0, plain.lastIndexOf("00")); + return plain; + } + + //数据发送,数据发送者暂未构建 + public void storeData(Map bizDataMap) { + DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); +// dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return ObjectUtils.isNotEmpty(processorInstance) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java new file mode 100644 index 0000000..7e1fe0a --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java @@ -0,0 +1,97 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.FieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class FieldConfigProvider { + + + private final List fieldConfigs; + private Map storeObjectMap = new HashMap<>(); +// private Map singleObjects = new ConcurrentHashMap<>(); + + public FieldConfigProvider(Long ruleId) { + FieldConfigRegistry fieldConfigRegistry = SpringContextUtil.getBean(FieldConfigRegistry.class); + fieldConfigs = fieldConfigRegistry.getFieldConfigList(ruleId); + } + + public List getFieldConfigs() { + return fieldConfigs; + } + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public Map parseDataField(RuleConfig ruleConfig, String clearZeroPlain) { + if (showSkip()) { + return null; + } + List prepareFieldConfig = prepareParseField(ruleConfig); + if (CollectionUtils.isNotEmpty(prepareFieldConfig)) { + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(fieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + return fixDataMap; + } + } + return null; + } + + /** + * 得到需要处理的业务内容 + * + * @return + */ + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return fieldConfigs.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public Map getFieldConfigsMap() { + return fieldConfigs.stream().collect( + Collectors.toMap(FieldConfig::getId, e -> e) + ); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(fieldConfigs) ? false : true; + } + + +} + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java new file mode 100644 index 0000000..817bfaf --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java @@ -0,0 +1,19 @@ +package com.casic.missiles.parser.provider; + +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.registry.FieldRuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; + +public class FieldRuleConfigProvider { + + private final List fieldRuleConfigList; + + public FieldRuleConfigProvider(Long ruleId) { + FieldRuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(FieldRuleConfigRegistry.class); + fieldRuleConfigList = ruleConfigRegistry.getFieldRuleConfigList(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java new file mode 100644 index 0000000..99a1b06 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java @@ -0,0 +1,53 @@ +package com.casic.missiles.parser.provider; + + +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.registry.ProtocolConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolConfigProvider { + + private final List protocolConfigList; + + public ProtocolConfigProvider(String firstChar) { + ProtocolConfigRegistry registry = SpringContextUtil.getBean(ProtocolConfigRegistry.class); + protocolConfigList = registry.getProtocolConfigList(firstChar); + } + + public List getMatchList() { + return protocolConfigList; + } + + /** + * 设置当前协议 + * + * @param protocolConfig + */ + public ProtocolConfigProvider(ProtocolConfig protocolConfig) { + List protocolConfigs = new ArrayList<>(); + protocolConfigs.add(protocolConfig); + protocolConfigList = protocolConfigs; + } + + /** + * 获取当前协议 + * + * @return + */ + public ProtocolConfig getCurrentProtocolConfig() { + if (this.protocolConfigList == null) { + return null; + } else { + return protocolConfigList.get(0); + } + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java new file mode 100644 index 0000000..043927d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java @@ -0,0 +1,213 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.registry.ProtocolFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolFieldConfigProvider { + + private static final String FIXED_FIELD_DS = "fixedFieldDs"; + private static final String CONTENT_FIELD_DS = "contentFieldDs"; + private static final String PROTOCOL_LENGTH = "protocolLength"; + private static final String PROTOCOL_FIELD_ID = "protocolFieldId"; + private static final String PROTOCOL_POSITION = "protocolPosition"; + + private final List protocolFieldConfigs; + private Map singleObjects = new ConcurrentHashMap<>(); + private Map storeObjectMap = new HashMap<>(); + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public ProtocolFieldConfigProvider(Long protocolId) { + ProtocolFieldConfigRegistry protocolFieldConfigRegistry = SpringContextUtil.getBean(ProtocolFieldConfigRegistry.class); + protocolFieldConfigs = protocolFieldConfigRegistry.getProtocolFieldConfigList(protocolId); + } + + public List getProtocolFieldConfigs() { + return protocolFieldConfigs; + } + + public ProtocolFieldConfig getFieldConfigById(Long fieldId) { + Optional optionalConfig = protocolFieldConfigs.stream().filter( + e -> e.getId().equals(fieldId) + ).findFirst(); + return optionalConfig.isPresent() ? optionalConfig.get() : null; + } + + public Integer getProtocolFieldValue(Long protocolFieldId, ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_FIELD_ID + protocolFieldId + ByteBufUtil.hexDump(byteBuf); + //获取缓存 + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + //加载固定长度数据集合 + Map fixDataMap = this.getProtocolDataMap(byteBuf); + ProtocolFieldConfig protocolFieldConfig = selectFieldConfig(protocolFieldId); + Integer protocolFieldValue = 0; + //获取约定字段的总长度 + if (fixDataMap.containsKey(protocolFieldConfig.getFieldName())) { + Object appointUnpackObject = fixDataMap.get(protocolFieldConfig.getFieldName()); + if (ObjectUtils.isNotEmpty(appointUnpackObject)) { + protocolFieldValue = (Integer) appointUnpackObject; + } + } + if (protocolFieldValue != null) { + //加入缓存 + if (ObjectUtils.isNotEmpty(protocolFieldValue)) { + this.singleObjects.put(catchKey, protocolFieldValue); + return protocolFieldValue; + } + } + return null; + } + + /** + * 获取帧固定位置信息 + * + * @param byteBuf + * @param protocolConfig + * @return + */ + public Map getFixedProperty(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_POSITION + protocolConfig.getId(); + if (this.singleObjects.containsKey(catchKey)) { + return (Map) singleObjects.get(catchKey); + } + Map fixedPropertyMap = new HashMap<>(); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + fixedPropertyMap = fieldParser.doGetFixedProperty(protocolFieldConfigs, this.getTotalLength(byteBuf,protocolConfig)); + if (CollectionUtils.isNotEmpty(fixedPropertyMap)) { + this.singleObjects.put(catchKey, fixedPropertyMap); + return fixedPropertyMap; + } + return fixedPropertyMap; + } + + /** + * 获取帧结构应有的总长度 + */ + public Integer getTotalLength(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_LENGTH + ByteBufUtil.hexDump(byteBuf); + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + Integer appointFrameLength = getProtocolFieldValue(protocolConfig.getTotalLengthId(), byteBuf); + if (appointFrameLength != null) { + //获取过滤的字段集合总长度 + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Integer totalFilterLength = fieldParser.getTotalFilterLength(protocolConfig, byteBuf, getFixFieldConfigMap()); + //计算总长度 + Integer totalLength = appointFrameLength + totalFilterLength; + //加入缓存 + if (ObjectUtils.isNotEmpty(totalLength)) { + this.singleObjects.put(catchKey, totalLength); + return totalLength; + } + } + return null; + } + + /** + * 获取协议有关字段解析内容 + * storeObjectMap存储代转存的数据 + * + * @return + */ + public Map getProtocolDataMap(ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(FIXED_FIELD_DS)) { + return (Map) singleObjects.get(FIXED_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(protocolFieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + this.singleObjects.put(FIXED_FIELD_DS, fixDataMap); + return fixDataMap; + } + return null; + } + + /** + * 获取业务报文内容的content字节 + * + * @param wholeDatagramByte + * @return + */ + public ByteBuf getDataContentBuf(ByteBuf wholeDatagramByte) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(CONTENT_FIELD_DS)) { + return (ByteBuf) singleObjects.get(CONTENT_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + ByteBuf bizDataByteBuf = fieldParser.getDataContentBuf(protocolFieldConfigs, wholeDatagramByte); + if (bizDataByteBuf != null) { + this.singleObjects.put(CONTENT_FIELD_DS, bizDataByteBuf); + return bizDataByteBuf; + } + return null; + } + + + private ProtocolFieldConfig selectFieldConfig(Long id) { + Optional optionalProtocolFieldConfig = this.protocolFieldConfigs.stream().filter( + e -> e.getId().equals(id) + ).findFirst(); + return optionalProtocolFieldConfig.isPresent() ? optionalProtocolFieldConfig.get() : null; + } + + + private Map getFixFieldConfigMap() { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, e -> e) + ); + return fixDataFieldMap; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(protocolFieldConfigs) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java new file mode 100644 index 0000000..dafba1c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java @@ -0,0 +1,56 @@ +package com.casic.missiles.parser.provider; + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.rule.GenericRuleResolver; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.RuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleConfigProvider { + + private final List ruleConfigs; + + public List getRuleConfigs() { + return ruleConfigs; + } + + public RuleConfigProvider(Long protocolId) { + RuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(RuleConfigRegistry.class); + ruleConfigs = ruleConfigRegistry.getRuleConfigById(protocolId); + } + + /** + * 获取规则匹配结果 + * + * @param parseFixedDataMap + * @param protocolFieldConfigs + * @return + */ + public RuleConfig doGetRule(Map parseFixedDataMap, + String ids, + List protocolFieldConfigs) { + if (showSkip()) { + return null; + } + RuleConfig ruleConfig = GenericRuleResolver.machRule(parseFixedDataMap, ids, protocolFieldConfigs, ruleConfigs); + return ruleConfig; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(ruleConfigs) ? false : true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java index 3c05891..856b399 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java @@ -1,18 +1,11 @@ package com.casic.missiles.parser.resolver; -import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.springframework.web.bind.annotation.RequestBody; -import javax.annotation.Resource; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -20,19 +13,17 @@ @Slf4j public class ByteMergeProvider { - @Resource - private FieldRuleEngineMapper fieldRuleEngineMapper; - //拿到所有的值合并到一个值 - public String resolveByteMerge(List valueList, String ruletypeId, String vaildRange) { + public static String resolveByteMerge(List valueList, String ruleTypeId, String vaildRange) { String values = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Map vaildMap = getValidRangeMap(vaildRange); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(ruletypeId); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } + //暂时不处理 +// fieldRuleEngine = fieldRuleConfigMapper.selectById(ruleTypeId); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } Map env2 = new HashMap(); for (int i = 0; i < valueList.size(); i++) { if (vaildMap.containsKey(i)) { @@ -47,7 +38,7 @@ } } - private Map getValidRangeMap(String vaildRange) { + private static Map getValidRangeMap(String vaildRange) { String[] range = vaildRange.split(","); Map vaildMap = new HashMap(); for (int i = 0; i < range.length; i++) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 8d821cd..85d6bbf 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -1,9 +1,12 @@ package com.casic.missiles.parser.resolver; +import com.casic.missiles.pojo.AbstractFieldConfig; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; import io.netty.buffer.ByteBuf; +import java.util.List; import java.util.Map; /** @@ -11,18 +14,14 @@ */ public interface FieldParser { -// Map fieldProcess(String protocolContent,); - Map dataParser(RuleConfig ruleConfig, String lightText,String protocolId); + Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength); - Map fixDataParser(String protocolId, ByteBuf buffer); + Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap); - Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf); + ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer); - ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer); - - ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer); - - Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer); + Integer getTotalFilterLength(ProtocolConfig protocolConfig, ByteBuf byteBuf, Map protocolFieldConfigMap); } + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java new file mode 100644 index 0000000..9e0c00e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java @@ -0,0 +1,52 @@ +package com.casic.missiles.parser.resolver; + +import com.casic.missiles.pojo.AbstractFieldConfig; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.util.List; + +public class FieldParserSupport { + + //分别计算bit和byte长度=> 合并长度 + protected Integer calculateLength(List fieldConfigList) { + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + Integer fixedLength = bytefixedLength + bitfixedLength / 8; + return fixedLength; + } + + //找到最大值=> 根据最大值计算业务数据下标 + protected Integer calculatePosition(List fieldConfigList) { + String rex = "[0-9]+"; + Integer max = -1; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) + && Integer.valueOf(fieldConfig.getOriginPositionByte()) > max) { + max = Integer.valueOf(fieldConfig.getOriginPositionByte()); + } + } + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) && fieldConfig.getOriginPositionByte().equals(max)) { + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + } + } + Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; + return maxFixedPosition; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java deleted file mode 100644 index dd3a6cd..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java +++ /dev/null @@ -1,170 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.ByteResolverParam; -import io.netty.buffer.ByteBuf; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -/** - * 字段解析管理总类 - */ -@Service -@Slf4j -@AllArgsConstructor -public class FieldResolver extends ByteMergeProvider { - - //1、字段截取 => 2、简单的字节解析和复杂的字节解析 - public Object filedParserManger(ByteBuf byteBuf, FieldConfig fieldConfig, Integer maxFixedPosition) { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - //最大固定位置不为空, - if (!ObjectUtil.isEmpty(maxFixedPosition)) { - orignPosition -= maxFixedPosition; - } - Object fieldValue = 0; - //待优化 - if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { - fieldValue = bitToResolver(byteBuf, fieldConfig); - } else { - ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); - fieldValue = parsingFields(fieldBytes, fieldConfig.getRuleJson()); - } - return fieldValue; - } - - //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, - //目前默认配置的规则设置暂不支持配置化,由实现完成 - private Object parsingFields(ByteBuf byteBuf, String ruleJson) { - Object fieldsResolveValue = null; - List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); - if (ObjectUtil.isEmpty(ruleMapList)) { - fieldsResolveValue = defaultResolveBuilder(byteBuf); - } else { - fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); - } - return fieldsResolveValue; - } - - private Object defaultResolveBuilder(ByteBuf byteBuf) { - Integer defaultResolveValue = 0; - for (int i = 0; i < byteBuf.writerIndex(); i++) { - defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; - } - return defaultResolveValue; - } - - //字段解析构建器(针对字节单位的) - //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 - // 字节归并结束或者规则结束=>继续根据规则进行判断 - private Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { - Object customizeResolveValue = null; - try { - List bytStrList = new ArrayList<>(); - //存放到数组里面 - for (int i = 0; i < byteBuf.writerIndex(); i++) { - bytStrList.add(byteBuf.readByte()); - } - int i = 0; - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - customizeResolveValue = this.resolveByteMerge(bytStrList, ruletypeId,vaildRange); - break; - } else { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - List tempBytStr = new ArrayList<>(); - for (int k = 0; i < bytStrList.size(); i++) { - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(k) - .value(bytStrList.get(k)) - .ruletypeId(ruletypeId).build(); - tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); - } - bytStrList = tempBytStr; - } - i++; - } - //字节归并到一起=>继续根据规则进行判断 - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(customizeResolveValue) - .ruletypeId(ruletypeId).build(); - customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(customizeResolveValue)); - return customizeResolveValue; - } catch (RuntimeException ex) { - log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); - return null; - } - } - - /** - * 1、单个字节情况表示字段 - * 2、多字节情况表示字段(暂未处理) - */ - private Object bitToResolver(ByteBuf byteBuf, FieldConfig fieldConfig) { - Object fieldValue = new Object(); - try { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - byte fields = 0x00; - if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); - } else { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); - } - - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { - if (!StringUtils.isEmpty(fieldConfig.getExactOrignPosition())) { - fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getExactOrignPosition())).byteValue() - >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); - } else { - fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); - } - } else { - fieldValue = Integer.valueOf(fields & 0xff); - } - if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { - return fieldValue; - } - List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); - int i = 0; - //字节归并到一起=>继续根据规则进行判断 - while (i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(fieldValue) - .ruletypeId(ruletypeId).build(); - fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(fieldValue)); - return fieldValue; - } catch (RuntimeException ex) { - log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); - return null; - } - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java new file mode 100644 index 0000000..1d2aeab --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java @@ -0,0 +1,36 @@ +package com.casic.missiles.parser.resolver.bytes; + +import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.mapper.FieldRuleConfigMapper; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.pojo.ByteResolverParam; +import com.googlecode.aviator.AviatorEvaluator; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; +//转换规则 +@Component("convert") +@AllArgsConstructor +@Slf4j +public class ByteRuleResolver implements ByteResolver { + + private final FieldRuleConfigMapper fieldRuleConfigMapper; + + @Override + public Object resolveOperationRule(ByteResolverParam byteResolverParam){ + FieldRuleConfig fieldRuleEngine=fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); + if(ObjectUtil.isEmpty(fieldRuleEngine)){ + return byteResolverParam.getValue(); + } + String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); + Map env2 = new HashMap(); + env2.put("value", (byte) byteResolverParam.getValue()); + String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); + return values; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java index 103821c..786b71c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java @@ -2,34 +2,34 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("logicalShift") +@Component("logicalShift") @AllArgsConstructor @Slf4j public class LogicalShiftResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //字节位移 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { Integer index = byteResolverParam.getIndex(); - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return byteResolverParam.getValue(); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java index 476747d..01149bd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("operation") +@Component("operation") @AllArgsConstructor @Slf4j public class OperationResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //混合运算,有常量或者乘除的缩放 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java index 0b82cf4..79abcce 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.casic.missiles.pojo.ByteResolverParam; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; //精度计算 -@Service("precision") +@Component("precision") @AllArgsConstructor @Slf4j public class PrecisionResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java deleted file mode 100644 index 5c3f332..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; -//转换规则 -@Service("convert") -@AllArgsConstructor -@Slf4j -public class RuleResolver implements ByteResolver { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam){ - RuleEvaluator fieldRuleEngine=fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); - if(ObjectUtil.isEmpty(fieldRuleEngine)){ - return byteResolverParam.getValue(); - } - String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); - Map env2 = new HashMap(); - env2.put("value", (byte) byteResolverParam.getValue()); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java new file mode 100644 index 0000000..d3bbd91 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java @@ -0,0 +1,15 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; + +import java.util.List; +import java.util.Map; +// 前导码匹配->长度字段 +public interface AbstractCombinedFieldProcessor { + + Map invoke(Map map, ByteBuf byteBuf, List combinedFieldConfigList, + Map fieldConfigsMap, Map storeObjectMap); + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java new file mode 100644 index 0000000..03c8480 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java @@ -0,0 +1,59 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-13 + */ +//依次递增进行数据的解析, +public class GenericCombinedFieldResolver { + + + //通过查询,字段长度长度随机 + public void parseDataField(List combinedFieldConfigList, ByteBuf byteBuf, + Map storeObjectMap, Map fieldConfigsMap) { + Integer frameLength = Integer.valueOf(ByteBufUtil.hexDump(byteBuf)); + //添加前置处理器 + com.casic.missiles.util.ClassUtil classUtil = new com.casic.missiles.util.ClassUtil(); + List abstractCombinedProcessors = classUtil.getSubClassList(AbstractCombinedFieldProcessor.class); + + Map fieldFixedMap = combinedFieldLeadCodeMap(combinedFieldConfigList); + //frameLength + Map combinedProcessorFields = null; + while (byteBuf.readableBytes() < frameLength) { + //一直处理 + for (AbstractCombinedFieldProcessor abstractCombinedProcessor : abstractCombinedProcessors) { + combinedProcessorFields = abstractCombinedProcessor.invoke(combinedProcessorFields, byteBuf, + combinedFieldConfigList, + fieldConfigsMap, storeObjectMap); + if (combinedProcessorFields == null || byteBuf.readableBytes() < frameLength) { + return; + } + } + + } + } + + /** + * 取出前导码匹配集合 + */ + private Map combinedFieldLeadCodeMap(List combinedFieldConfigList) { + Map fieldFixedMap = combinedFieldConfigList + .stream() + .collect(Collectors.toMap(CombinedFieldConfig::getPrefixCode, e -> e)); + return fieldFixedMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java new file mode 100644 index 0000000..643a934 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java @@ -0,0 +1,100 @@ +package com.casic.missiles.parser.resolver.fields; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.FieldParserSupport; +import com.casic.missiles.pojo.*; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 保存使用时最基本的信息,并且使用原型模式 + */ +@Slf4j +public class DefaultProtocolFieldParser extends FieldParserSupport implements FieldParser, FixedPropertyEnum { + + //通过传入的配置和报文进行字段解析 + @Override + public Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap) { + Map dataMap = new HashMap<>(); + for (AbstractFieldConfig protocolFieldConfig : protocolFieldConfigs) { + if (!ObjectUtils.isEmpty(protocolFieldConfig.getOriginPositionByte())) { + Object fieldValue = FieldResolver.parseField(buffer, protocolFieldConfig, null); + if (protocolFieldConfig.getIsStorage() == 1) { + storeObjectMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + dataMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + } + return dataMap; + } + + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength) { + Map fixedPropertyMap = new HashMap<>(); + Integer fixedLength = calculateLength(protocolFieldConfigs); + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + fixedPropertyMap.put(FIXED_POSITION, maxFixedPosition); + fixedPropertyMap.put(TOTAL_LENGTH, totalLength); + fixedPropertyMap.put(TAIL_POSITION, totalLength - fixedLength + maxFixedPosition); + return fixedPropertyMap; + } + + //** 获取业务内容的byteBuf + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer) { + //计算固定长度 + Integer fixedLength = calculateLength(protocolFieldConfigs); + //总长度获取 + String lightText = buffer.toString(Charset.forName("ISO-8859-1")); + Integer totalLength = lightText.length(); + //计算固定长度最大长度 + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + //计算数据报文内容 + ByteBuf bizDataFields = buffer.slice(maxFixedPosition - 1, (totalLength - fixedLength)); + return bizDataFields; + } + + /** + * 获取过滤字段的长度 + */ + @Override + public Integer getTotalFilterLength(ProtocolConfig protocolConfig, + ByteBuf byteBuf, + Map protocolFieldConfigMap) { + if (ByteBufUtil.hexDump(byteBuf).equals("")) { + return 0; + } + int totalFilterLength = 0; + String filterFields = protocolConfig.getTotalLengthFilterFields(); + try { + if (!StringUtils.isEmpty(filterFields)) { + String[] filterFieldList = filterFields.split(","); + for (String filterFieldId : filterFieldList) { + if (StringUtils.isNotEmpty(filterFieldId)) { + ProtocolFieldConfig fieldConfig = protocolFieldConfigMap.get(Long.valueOf(filterFieldId)); + //这里都是按字节计算,没有对位进行区分,可能会出现错误 + // 如果对位有需求,需要进一步跟进 + totalFilterLength += fieldConfig.getOffsetLength(); + } + } + } + return totalFilterLength; + } catch (Exception ex) { + log.error("报文确认分发阶段,获取报文总长度过滤长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); + } + return totalFilterLength; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java new file mode 100644 index 0000000..d51e887 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java @@ -0,0 +1,169 @@ +package com.casic.missiles.parser.resolver.fields; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.parser.resolver.ByteMergeProvider; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.AbstractFieldConfig; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.pojo.ByteResolverParam; +import io.netty.buffer.ByteBuf; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * 字段解析管理总类 + */ +@Slf4j +public class FieldResolver extends ByteMergeProvider { + + //1、字段截取 => 2、简单的字节解析和复杂的字节解析 + public static Object parseField(ByteBuf byteBuf,AbstractFieldConfig fieldConfig, Integer maxFixedPosition) { + Integer orignPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + //最大固定位置不为空, + if (!ObjectUtil.isEmpty(maxFixedPosition)) { + orignPosition -= maxFixedPosition; + } + Object fieldValue = 0; + //待优化 + if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { + fieldValue = doParseBitField(byteBuf, fieldConfig); + } else { + ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); + fieldValue = doParseByteField(fieldBytes, fieldConfig.getRuleJson()); + } + return fieldValue; + } + + //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, + //目前默认配置的规则设置暂不支持配置化,由实现完成 + private static Object doParseByteField(ByteBuf byteBuf, String ruleJson) { + Object fieldsResolveValue = null; + List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); + if (ObjectUtil.isEmpty(ruleMapList)) { + fieldsResolveValue = defaultResolveBuilder(byteBuf); + } else { + fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); + } + return fieldsResolveValue; + } + + private static Object defaultResolveBuilder(ByteBuf byteBuf) { + Integer defaultResolveValue = 0; + for (int i = 0; i < byteBuf.writerIndex(); i++) { + defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; + } + return defaultResolveValue; + } + + //字段解析构建器(针对字节单位的) + //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 + // 字节归并结束或者规则结束=>继续根据规则进行判断 + private static Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { + Object customizeResolveValue = null; + try { + List bytStrList = new ArrayList<>(); + //存放到数组里面 + for (int i = 0; i < byteBuf.writerIndex(); i++) { + bytStrList.add(byteBuf.readByte()); + } + int i = 0; + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { + if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + customizeResolveValue = resolveByteMerge(bytStrList, ruletypeId, vaildRange); + break; + } else { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + List tempBytStr = new ArrayList<>(); + for (int k = 0; i < bytStrList.size(); i++) { + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(k) + .value(bytStrList.get(k)) + .ruletypeId(ruletypeId).build(); + tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); + } + bytStrList = tempBytStr; + } + i++; + } + //字节归并到一起=>继续根据规则进行判断 + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(null) + .value(customizeResolveValue) + .ruletypeId(ruletypeId).build(); + customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); + i++; + } + System.out.println(JSON.toJSON(customizeResolveValue)); + return customizeResolveValue; + } catch (RuntimeException ex) { + log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); + return null; + } + } + + /** + * 1、单个字节情况表示字段 + * 2、多字节情况表示字段(暂未处理) + */ + private static Object doParseBitField(ByteBuf byteBuf,AbstractFieldConfig fieldConfig) { + Object fieldValue = new Object(); + try { + Integer orignPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + byte fields = 0x00; + if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { + fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); + } else { + fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); + } + + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { + if (!StringUtils.isEmpty(fieldConfig.getOriginPositionBit())) { + fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getOriginPositionBit())).byteValue() + >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); + } else { + fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); + } + } else { + fieldValue = Integer.valueOf(fields & 0xff); + } + if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { + return fieldValue; + } + List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); + int i = 0; + //字节归并到一起=>继续根据规则进行判断 + while (i < ruleMapList.size()) { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(null) + .value(fieldValue) + .ruletypeId(ruletypeId).build(); + fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); + i++; + } + System.out.println(JSON.toJSON(fieldValue)); + return fieldValue; + } catch (RuntimeException ex) { + log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); + return null; + } + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java deleted file mode 100644 index 35ae3d0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java +++ /dev/null @@ -1,183 +0,0 @@ -package com.casic.missiles.parser.resolver.fields; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufAllocator; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; -import org.springframework.util.ObjectUtils; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service("standard") -@AllArgsConstructor -@Slf4j -public class StandardFieldParser implements FieldParser { - - private final FieldConfigDao fieldConfigDao; - private final FieldResolver fieldResolver; - - //数据解析 - @Override - public Map dataParser(RuleConfig ruleConfig, String lightText, String protocolId) { - String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); - ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); - bufferContent.writeBytes(lightText.getBytes(Charset.forName("ISO-8859-1"))); - Map dataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - for (String dataFieldId : dataFieldIds) { - FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(dataFieldId); - if (!ObjectUtils.isEmpty(fieldConfig)) { - dataMap.put(fieldConfig.getFieldName(), String.valueOf(fieldResolver.filedParserManger(bufferContent, fieldConfig, maxFixedPosition))); - } - } - return dataMap; - } - - //数据解析 - @Override - public Map fixDataParser(String protocolId, ByteBuf buffer) { - List dataFieldIdList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Map dataMap = new HashMap<>(); - for (FieldConfig dataField : dataFieldIdList) { - if (!ObjectUtils.isEmpty(dataField.getOrignPosition())) { - Object fieldValue = (Integer) fieldResolver.filedParserManger(buffer, dataField, null); - dataMap.put(dataField.getFieldName(), fieldValue); - } - } - return dataMap; - } - - @Override - public Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf) { - if (ByteBufUtil.hexDump(byteBuf).equals("")) { - return 0; - } - String filterFields = protocolConfig.getTotalLengthFilterField(); - Integer totalLength = 0; - try { - FieldConfig totalFieldConfig = fieldConfigDao.getFieldConfigById(protocolConfig.getTotalLengthId()); - int totalFilterLength = 0; - if (!StringUtils.isEmpty(filterFields)) { - String[] filterFieldList = filterFields.split(","); - for (String filterField : filterFieldList) { - FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(filterField); - //这里都是按字节计算,没有对位进行区分,可能会出现错误 - - // 如果对位有需求,需要进一步跟进 - totalFilterLength += fieldConfig.getOffsetLength(); - } - } - totalLength = (Integer) fieldResolver.filedParserManger(byteBuf, totalFieldConfig, null) + totalFilterLength; - } catch (Exception ex) { - log.error("报文确认分发阶段,获取报文总长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); - } - return totalLength; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer) { - //业务内容 - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - String protocolId = String.valueOf(protocolConfig.getId()); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - //计算固定长度 - Integer fixedLength = calculateLength(fieldConfigList); -// Integer totalLength = this.getTotalLength(protocolConfig, buffer); - //总长度获取 - Integer totalLength = lightText.length(); - //计算固定长度最大长度 - Integer maxFixedPosition = calculatePosition(fieldConfigList); -// buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - //计算数据报文内容 - ByteBuf bizDataFields = buffer.slice(maxFixedPosition-1, (totalLength - fixedLength)); - return bizDataFields; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer) { - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - String protocolId = String.valueOf(protocolConfig.getId()); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer fixedLength = calculateLength(fieldConfigList); -// Integer totalLength = this.getTotalLength(protocolConfig, buffer); - Integer totalLength = lightText.length(); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - ByteBuf fixDataFields = buffer.slice(0, maxFixedPosition); - return fixDataFields; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer) { - String protocolId = String.valueOf(protocolConfig.getId()); - Map fixedPropertyMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer fixedLength = calculateLength(fieldConfigList); - Integer totalLength = this.getTotalLength(protocolConfig, buffer); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - fixedPropertyMap.put("fixedPosition", maxFixedPosition); - fixedPropertyMap.put("totalLength", totalLength); - fixedPropertyMap.put("tailPosition", totalLength - fixedLength + maxFixedPosition); - return fixedPropertyMap; - } - - //分别计算bit和byte长度=> 合并长度 - private Integer calculateLength(List fieldConfigList) { - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (FieldConfig fieldConfig : fieldConfigList) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - Integer fixedLength = bytefixedLength + bitfixedLength / 8; - return fixedLength; - } - - //找到最大值=> 根据最大值计算业务数据下标 - private Integer calculatePosition(List fieldConfigList) { - String rex = "[0-9]+"; - Integer max = -1; - for (FieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOrignPosition()) - && Integer.valueOf(fieldConfig.getOrignPosition()) > max) { - max = Integer.valueOf(fieldConfig.getOrignPosition()); - } - } - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (FieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOrignPosition()) && fieldConfig.getOrignPosition().equals(max)) { - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - } - } - Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; - return maxFixedPosition; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java new file mode 100644 index 0000000..d4ec6c7 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java @@ -0,0 +1,76 @@ +package com.casic.missiles.parser.rule; + +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import org.apache.commons.lang3.StringUtils; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class GenericRuleResolver { + + //根据前置字段的值,找到指定的规则 + //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 + //=>循环判断=>通过规则得到业务字段 + public static RuleConfig machRule(Map fixDataMap, + String ids, + List protocolFieldConfigs, + List ruleConfigs) { + List preRuleConfigList = getPreRuleList(ids, protocolFieldConfigs); + //获取前置规则字段 + final Map metaDataMap = getPreRuleFields(preRuleConfigList, fixDataMap); + //准备固定的字段集合 + Map fixDataFieldMap = getFixDataFieldMap(protocolFieldConfigs); + return RuleResolverCore.doMachRule(ruleConfigs, metaDataMap, fixDataMap, fixDataFieldMap); + } + + private static Map getFixDataFieldMap(List protocolFieldConfigs) { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, ProtocolFieldConfig::getFieldName) + ); + return fixDataFieldMap; + } + + + /** + * 查询前置规则的字段配置 + * + * @param ids + * @return + */ + private static List getPreRuleList(String ids, List protocolFieldConfigs) { + String[] idList = ids.split(","); + Map prepareMaps = new HashMap<>(); + for (String id : idList) { + if (StringUtils.isNotEmpty(id)) { + prepareMaps.put(Long.valueOf(id), ""); + } + } + List preRuleConfigList = protocolFieldConfigs + .stream() + .filter(e -> prepareMaps.containsKey(e.getId())) + .collect(Collectors.toList()); + return preRuleConfigList; + } + + /** + * 获取前置规则解析字段 + */ + private static Map getPreRuleFields(List preRuleFieldConfigList, Map fixDataMap) { + Map ruleFieldMap = new HashMap<>(); + preRuleFieldConfigList.stream() + .forEach( + preRuleFieldConfig -> { + String fieldName = preRuleFieldConfig.getFieldName(); + if (fixDataMap.containsKey(fieldName)) { + ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); + } + } + ); + return ruleFieldMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java new file mode 100644 index 0000000..baae7e8 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -0,0 +1,68 @@ +package com.casic.missiles.parser.rule; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.casic.missiles.pojo.RuleConfig; + +import java.util.*; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleResolverCore { + + + public static RuleConfig doMachRule(List ruleConfigList, Map metaDataMap, + Map fixDataMap, + Map fixDataFieldMap) { + Optional ruleConfigOptional = ruleConfigList.stream() + .filter(ruleConfig -> machRuleConfig( + JSON.parseObject(ruleConfig.getMatchRuleJson(), Map.class), metaDataMap)) + .findFirst(); + if (ObjectUtil.isEmpty(ruleConfigOptional)) { + return null; + } + String[] ruleFields = ruleConfigOptional.get().getDataFieldIds().split(","); + Map ruleMetaDataMap = getRuleFields(ruleFields, fixDataMap, fixDataFieldMap); + //递归选定解析规则,进行规则解析 + if (!ruleConfigOptional.get().getIsFinishMatch().equals("1")) { + //递归选定规则 + doMachRule(ruleConfigList, ruleMetaDataMap, fixDataMap, fixDataFieldMap); + } + return ruleConfigOptional.get(); + } + + + private static Map getRuleFields(String[] preRuleConfigList, Map fixedDataMap, + Map fixedFieldMap) { + Map ruleFieldMap = new HashMap<>(); + for (String preRuleConfigId : preRuleConfigList) { + String fieldName = fixedFieldMap.get(preRuleConfigId); + if (fixedDataMap.containsKey(fieldName)) { + ruleFieldMap.put(fieldName, String.valueOf(fixedDataMap.get(fieldName))); + } + } + return ruleFieldMap; + } + + + //匹配规则配置 + private static Boolean machRuleConfig(Map ruleMap, Map metaDataMap) { + if (ruleMap == null || metaDataMap == null) { + return null; + } + //所有的字段在规则里面必须有有配置 + for (String key : metaDataMap.keySet()) { + if (ruleMap.containsKey(key)) { + if (!ruleMap.get(key).equals(metaDataMap.get(key))) { + return false; + } + } else { + return false; + } + } + return true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java deleted file mode 100644 index 664088d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java +++ /dev/null @@ -1,92 +0,0 @@ -package com.casic.missiles.parser.rule; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.mapper.dao.PreRuleConfigDao; -import com.casic.missiles.mapper.dao.RuleConfigDao; -import lombok.AllArgsConstructor; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.*; -import java.util.stream.Collectors; - -@Service -@AllArgsConstructor -public class RulerProvider { - - private final FieldConfigDao fieldConfigDao; - private final PreRuleConfigDao preRuleConfigDao; - private final RuleConfigDao ruleConfigDao; - - //根据前置字段的值,找到指定的规则 - //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 - //=>循环判断=>通过规则得到业务字段 - public RuleConfig ruleConfig(Map fixDataMap, String protocolId) { - //批量获取规则 - List preRuleConfigList = preRuleConfigDao.getPreRuleList(protocolId); - //获取固定字段 - Map fixFieldMap = getAllFieldMap(protocolId); - //获取前置规则字段 - final String preRuleFields = getPreRuleFields(preRuleConfigList, fixDataMap, fixFieldMap); - List ruleConfigList = ruleConfigDao.getRuleConfigById(protocolId); - Optional ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig ->preRuleFields.equals( ruleConfig.getParseRuleJson())).findFirst(); - //递归选定解析规则,进行规则解析 - while (!ObjectUtil.isEmpty(ruleConfigOptional) && !ruleConfigOptional.get().getIsBizField().equals("1")) { - String ruleFields = getRuleFields(ruleConfigOptional.get().getDataFieldIds().split(","), fixDataMap, fixFieldMap); - ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig -> ruleConfig.getParseRuleJson().equals(ruleFields)).findFirst(); - } - return ruleConfigOptional.get(); - } - - /** - * 获取前置规则解析字段 - */ - private String getPreRuleFields(List preRuleConfigList, Map fixDataMap, Map fixFieldMap) { - Map ruleFieldMap= new HashMap<>(); - preRuleConfigList.stream() - .forEach( - preRuleConfig -> { - String fieldName = fixFieldMap.get(Long.valueOf(preRuleConfig.getRuleFieldId())); - if (fixDataMap.containsKey(fieldName)) { - ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); - } - } - ); - return JSONObject.toJSONString(ruleFieldMap); - } - - private Map getAllFieldMap(String protocolId) { - List fieldList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Map fixFieldMap = fieldList.stream().collect( - Collectors.toMap(FieldConfig::getId, FieldConfig::getFieldName) - ); - return fixFieldMap; - } - - private String getRuleFields(String[] preRuleConfigList, Map fixDataMap, Map fixFieldMap) { - Map ruleFieldMap= new HashMap<>(); - for (String preRuleConfigId : preRuleConfigList) { - String fieldName = fixFieldMap.get(preRuleConfigId); - if (fixDataMap.containsKey(fieldName)) { - ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); - } - } - return JSONObject.toJSONString(ruleFieldMap); - } - - //弃置 - private String ListToString(List ruleFieldList) { - String ruleFields = ""; - for (String ruleField : ruleFieldList) { - ruleFields += ruleField + ","; - } - ruleFields = StringUtils.isEmpty(ruleFields) ? ruleFields : ruleFields.substring(0, ruleFields.length() - 1); - return ruleFields; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java index 6177e10..bfa87a5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java @@ -2,7 +2,7 @@ public interface SafeStrategy { - String decryption(byte[] bytes); + String decryption(String cipher); String encryption(String lightText); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java index 618716c..6236302 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java @@ -9,9 +9,9 @@ //十六进制的字符串转换成字节数组 byte[] bytes = hexStrToBinaryStr(msg); //计算CRC8 - byte crc8 = CRC8(bytes, 0, bytes.length); - String crc8ToStr = "" + Integer.toHexString(0xff & crc8); - return crc8ToStr; +// String crc8ToStr = "" + Integer.toHexString(0xff & crc8); +// return crc8ToStr; + return null; } /** @@ -33,50 +33,5 @@ return bytes; } - /** - * CRC8 校验 多项式 x8+x2+x+1 - * - * @param b - * @param off - * @param len - * @return - */ - public static byte CRC8(final byte[] b, final int off, final int len) { - byte result = 0x00; - for (int i = 0; i < len; i++) { - result = CHECKSUM_TABLE[(result ^ (b[i + off] & 0xFF)) & 0xFF]; - } - return (byte) (result & 0xFFL); - } - - private final static byte[] CHECKSUM_TABLE = {(byte) 0x00, (byte) 0x07, (byte) 0x0e, (byte) 0x09, (byte) 0x1c, (byte) 0x1b, - (byte) 0x12, (byte) 0x15, (byte) 0x38, (byte) 0x3f, (byte) 0x36, (byte) 0x31, (byte) 0x24, (byte) 0x23, (byte) 0x2a, - (byte) 0x2d, (byte) 0x70, (byte) 0x77, (byte) 0x7e, (byte) 0x79, (byte) 0x6c, (byte) 0x6b, (byte) 0x62, (byte) 0x65, - (byte) 0x48, (byte) 0x4f, (byte) 0x46, (byte) 0x41, (byte) 0x54, (byte) 0x53, (byte) 0x5a, (byte) 0x5d, (byte) 0xe0, - (byte) 0xe7, (byte) 0xee, (byte) 0xe9, (byte) 0xfc, (byte) 0xfb, (byte) 0xf2, (byte) 0xf5, (byte) 0xd8, (byte) 0xdf, - (byte) 0xd6, (byte) 0xd1, (byte) 0xc4, (byte) 0xc3, (byte) 0xca, (byte) 0xcd, (byte) 0x90, (byte) 0x97, (byte) 0x9e, - (byte) 0x99, (byte) 0x8c, (byte) 0x8b, (byte) 0x82, (byte) 0x85, (byte) 0xa8, (byte) 0xaf, (byte) 0xa6, (byte) 0xa1, - (byte) 0xb4, (byte) 0xb3, (byte) 0xba, (byte) 0xbd, (byte) 0xc7, (byte) 0xc0, (byte) 0xc9, (byte) 0xce, (byte) 0xdb, - (byte) 0xdc, (byte) 0xd5, (byte) 0xd2, (byte) 0xff, (byte) 0xf8, (byte) 0xf1, (byte) 0xf6, (byte) 0xe3, (byte) 0xe4, - (byte) 0xed, (byte) 0xea, (byte) 0xb7, (byte) 0xb0, (byte) 0xb9, (byte) 0xbe, (byte) 0xab, (byte) 0xac, (byte) 0xa5, - (byte) 0xa2, (byte) 0x8f, (byte) 0x88, (byte) 0x81, (byte) 0x86, (byte) 0x93, (byte) 0x94, (byte) 0x9d, (byte) 0x9a, - (byte) 0x27, (byte) 0x20, (byte) 0x29, (byte) 0x2e, (byte) 0x3b, (byte) 0x3c, (byte) 0x35, (byte) 0x32, (byte) 0x1f, - (byte) 0x18, (byte) 0x11, (byte) 0x16, (byte) 0x03, (byte) 0x04, (byte) 0x0d, (byte) 0x0a, (byte) 0x57, (byte) 0x50, - (byte) 0x59, (byte) 0x5e, (byte) 0x4b, (byte) 0x4c, (byte) 0x45, (byte) 0x42, (byte) 0x6f, (byte) 0x68, (byte) 0x61, - (byte) 0x66, (byte) 0x73, (byte) 0x74, (byte) 0x7d, (byte) 0x7a, (byte) 0x89, (byte) 0x8e, (byte) 0x87, (byte) 0x80, - (byte) 0x95, (byte) 0x92, (byte) 0x9b, (byte) 0x9c, (byte) 0xb1, (byte) 0xb6, (byte) 0xbf, (byte) 0xb8, (byte) 0xad, - (byte) 0xaa, (byte) 0xa3, (byte) 0xa4, (byte) 0xf9, (byte) 0xfe, (byte) 0xf7, (byte) 0xf0, (byte) 0xe5, (byte) 0xe2, - (byte) 0xeb, (byte) 0xec, (byte) 0xc1, (byte) 0xc6, (byte) 0xcf, (byte) 0xc8, (byte) 0xdd, (byte) 0xda, (byte) 0xd3, - (byte) 0xd4, (byte) 0x69, (byte) 0x6e, (byte) 0x67, (byte) 0x60, (byte) 0x75, (byte) 0x72, (byte) 0x7b, (byte) 0x7c, - (byte) 0x51, (byte) 0x56, (byte) 0x5f, (byte) 0x58, (byte) 0x4d, (byte) 0x4a, (byte) 0x43, (byte) 0x44, (byte) 0x19, - (byte) 0x1e, (byte) 0x17, (byte) 0x10, (byte) 0x05, (byte) 0x02, (byte) 0x0b, (byte) 0x0c, (byte) 0x21, (byte) 0x26, - (byte) 0x2f, (byte) 0x28, (byte) 0x3d, (byte) 0x3a, (byte) 0x33, (byte) 0x34, (byte) 0x4e, (byte) 0x49, (byte) 0x40, - (byte) 0x47, (byte) 0x52, (byte) 0x55, (byte) 0x5c, (byte) 0x5b, (byte) 0x76, (byte) 0x71, (byte) 0x78, (byte) 0x7f, - (byte) 0x6a, (byte) 0x6d, (byte) 0x64, (byte) 0x63, (byte) 0x3e, (byte) 0x39, (byte) 0x30, (byte) 0x37, (byte) 0x22, - (byte) 0x25, (byte) 0x2c, (byte) 0x2b, (byte) 0x06, (byte) 0x01, (byte) 0x08, (byte) 0x0f, (byte) 0x1a, (byte) 0x1d, - (byte) 0x14, (byte) 0x13, (byte) 0xae, (byte) 0xa9, (byte) 0xa0, (byte) 0xa7, (byte) 0xb2, (byte) 0xb5, (byte) 0xbc, - (byte) 0xbb, (byte) 0x96, (byte) 0x91, (byte) 0x98, (byte) 0x9f, (byte) 0x8a, (byte) 0x8d, (byte) 0x84, (byte) 0x83, - (byte) 0xde, (byte) 0xd9, (byte) 0xd0, (byte) 0xd7, (byte) 0xc2, (byte) 0xc5, (byte) 0xcc, (byte) 0xcb, (byte) 0xe6, - (byte) 0xe1, (byte) 0xe8, (byte) 0xef, (byte) 0xfa, (byte) 0xfd, (byte) 0xf4, (byte) 0xf3}; } \ No newline at end of file diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java index 27c2838..6e078a3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java @@ -1,9 +1,6 @@ package com.casic.missiles.parser.safe.impl; -import cn.hutool.core.util.CharsetUtil; -import cn.hutool.crypto.symmetric.SM4; -import cn.hutool.crypto.symmetric.SymmetricCrypto; - +import com.casic.missiles.parser.safe.SafeStrategy; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; @@ -11,19 +8,44 @@ import org.bouncycastle.crypto.engines.SM4Engine; import org.bouncycastle.crypto.params.KeyParameter; import org.bouncycastle.util.encoders.Hex; - -import static cn.hutool.crypto.Mode.ECB; -import static cn.hutool.crypto.Padding.NoPadding; +import org.springframework.stereotype.Component; /** * SM4算法工具类 */ @Slf4j -public class Sm4 { +@Component("sm4") +public class Sm4 implements SafeStrategy { //加解密的字节快大小 public static final int BlockSize = 16; + @Override + public String decryption(String cipher) { + byte[] keyByte = { + 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 + }; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(keyByte); + byte[] in = Hex.decode(cipher); + byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); + String plain = EcbDecrypt(in, keyBytes); + return plain; + } + + @Override + public String encryption(String cipher) { + byte[] keyByte = { + 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 + }; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(keyByte); + byte[] in = Hex.decode(cipher); + byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); + String plain = EcbDecrypt(in, keyBytes); + return plain; + } + /** * SM4ECB加密算法,对内 * @@ -32,8 +54,6 @@ * @return */ private static byte[] ecb_encrypt(byte[] in, byte[] keyBytes) { - - SM4Engine sm4Engine = new SM4Engine(); sm4Engine.init(true, new KeyParameter(keyBytes)); byte[] out = new byte[in.length]; @@ -58,27 +78,6 @@ return cipher; } - - /** - * hutool 解密SM4 - * - * @param encodeContent - * @return - */ - public static String decode(String encodeContent) { - String key = "24ad182507479a5da3ad94d9d78ea203"; - try { - SymmetricCrypto sm4 = new SM4(ECB, NoPadding, key.getBytes()); - String decryptStr = sm4.decryptStr(encodeContent, CharsetUtil.CHARSET_UTF_8); - return decryptStr; - } catch (Exception e) { - e.printStackTrace(); - log.error("SM4解密失败"); - } - return null; - } - - /** * SM4的ECB加密算法 * @@ -129,20 +128,6 @@ return plain; } - /** - * SM4的ECB解密算法 - * - * @param cipher 输入的密文字符串 - * @param key 密钥 - * @return - */ - public static String EcbDecrypt(String cipher, String key) { - byte[] in = Hex.decode(cipher); - byte[] keyBytes = Hex.decode(key); - - String plain = EcbDecrypt(in, keyBytes); - return plain; - } /** * 主函数 @@ -151,28 +136,24 @@ */ public static void main(String[] args) { byte[] ciphertext = { + 0x4B, (byte) 0x8C, (byte) 0x9D, 0x08, (byte) 0xE4, (byte) 0xD3, 0x64, 0x42, (byte) 0xB9, (byte) 0xA5, (byte) 0xFE, (byte) 0xCD, (byte) 0x91, 0x1B, 0x38, (byte) 0xAC, (byte) 0xE9, 0x1C, (byte) 0xCD, 0x53, 0x02, (byte) 0xD7, 0x0C, (byte) 0x9B, (byte) 0x96, 0x30, 0x62, (byte) 0xE8, (byte) 0xFB, (byte) 0xEF, (byte) 0xB9, (byte) 0xFF, (byte) 0xDE, 0x19, (byte) 0x80, 0x35, 0x3E, (byte) 0x90, 0x4F, 0x2F, 0x12, 0x2B, 0x19, (byte) 0x8B, 0x6C, 0x7A, (byte) 0x85, (byte) 0xA1, (byte) 0xB1, (byte) 0x86, (byte) 0xA3, 0x7A, 0x46, 0x0C, 0x2F, (byte) 0x94, 0x4F, 0x7F, 0x2C, 0x56, 0x14, (byte) 0xF3, (byte) 0x89, (byte) 0xC3, - 0x3F, 0x20, (byte) 0xF9, (byte) 0x87, (byte) 0xA1, 0x60, (byte) 0xD9, (byte) 0xA8, (byte) 0xFD, (byte) 0xD7, (byte) 0x9B, 0x4B, 0x26, 0x06, 0x30, 0x44}; + 0x3F, 0x20, (byte) 0xF9, (byte) 0x87, (byte) 0xA1, 0x60, (byte) 0xD9, (byte) 0xA8, (byte) 0xFD, (byte) 0xD7, (byte) 0x9B, 0x4B, 0x26, 0x06, 0x30, 0x44 + }; ByteBuf in = ByteBufAllocator.DEFAULT.heapBuffer(); in.writeBytes(ciphertext); - byte[] keyByte = { 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 }; ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); - key.writeBytes(ciphertext); - String resCipherData = decode(ByteBufUtil.hexDump(in)); - ByteBuf out = ByteBufAllocator.DEFAULT.heapBuffer(); -// out.writeBytes(resCipherData); -// System.out.println(hexBytes); - System.out.println(resCipherData.toString()); -// String resPlainData = EcbDecrypt(resCipherData, key); -// System.out.println("原始明文:" + data); -// System.out.println("解密后明文:" + resPlainData); + key.writeBytes(keyByte); +// String resCipherData = EcbDecrypt(ByteBufUtil.hexDump(in), ByteBufUtil.hexDump(key)); +// System.out.println(resCipherData); } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java index 1395a51..ac5f957 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java @@ -1,7 +1,7 @@ package com.casic.missiles.parser.safe.impl; import io.netty.buffer.ByteBufUtil; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** *

@@ -14,9 +14,8 @@ * @author hyl * @version v1.0: Tea.java, v 0.1 2021/3/12 13:48 $ */ -@Service("tea") -///tea算法类 - +//tea算法类 +@Component("tea") public class Tea { public static byte[] MyTea_Encrypt(byte[] MyTeaContent, int ByteLen, byte[] MyTeakey) { @@ -99,7 +98,6 @@ // for(int i32Index = 0; i32Index < 8; i32Index++) { // System.out.print("0x" + Integer.toHexString(MyContent[i32Index]) + " "); // } - // System.out.println("密钥为:"); // for(int i32Index = 0; i32Index < 16; i32Index++) { // System.out.print("0x" + Integer.toHexString(MyKeys[i32Index]) + " "); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java index bdd0721..bd1516a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java @@ -3,7 +3,7 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.parser.sender.DataSubscribeProvider; import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponents; import org.springframework.web.util.UriComponentsBuilder; @@ -12,7 +12,7 @@ import java.util.Collections; import java.util.Map; -@Service("functionCallback") +@Component("functionCallback") public class FunctionCallback implements DataSubscribeProvider { @Resource diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java index 0b44fb9..7526de2 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.Map; -@Service("middleware") +@Component("middleware") public class MiddlewareSubscribe implements DataSubscribeProvider { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java index 5dcee3f..e2f1192 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.Map; -@Service("nosql") +@Component("nosql") public class NoSqlSubscribe implements DataSubscribeProvider { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java b/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java new file mode 100644 index 0000000..81a5324 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java @@ -0,0 +1,86 @@ +package com.casic.missiles.pojo; + +import lombok.Data; + +/** + * 协议 + */ +@Data +public class Msg { + + /** + * 前导码 + */ + private String preamble; + + /** + * 版本号 + */ + private String version; + + /** + * 内容长度 + */ + private int leng; + + /** + * 设备ID + */ + private String deviceId; + + /** + * 通讯方式 + */ + private Integer connType; + + /** + * 加密方式 + */ + private Integer encryType; + + /** + * 目标地址 + */ + private String destAddr; + + /** + * PDUType + */ + private String PDUType; + + /** + * 操作类型 + */ + private Integer operateType; + + /** + * 传输控制位 PDUType.bit7=0时,表示存在后续的访问;当PDUType.bit7=1时,表示无后续的访问。 + */ + private Integer transControlFlag; + + /** + * 设备类型 + */ + private Integer deviceType; + + /** + * 序号 + */ + private Integer seq; + + /** + * tagList + */ + private String tagList; + + /** + * OidList + */ + private String OidList; + + /** + * CRC + */ + private String CRC; + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java index 40a5265..97cc984 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java @@ -40,7 +40,7 @@ String httpContent = msg.toString(Charset.defaultCharset()); log.info(" String : " + msg.toString(Charset.defaultCharset())); String majorContent = httpContent.substring(httpContent.indexOf("{"), httpContent.lastIndexOf("}") + 1); - String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("serviceData")).get("Value")); + String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("RegistryData")).get("Value")); log.info("----------------------------------" + values); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); bufferContent.writeBytes(values.getBytes(Charset.forName("ISO-8859-1"))); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java index 1b132a7..e3ced4b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java @@ -35,7 +35,7 @@ String httpContent = msg.toString(Charset.defaultCharset()); log.info(" String : " + msg.toString(Charset.defaultCharset())); String majorContent = httpContent.substring(httpContent.indexOf("{"), httpContent.lastIndexOf("}") + 1); - String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("serviceData")).get("Value")); + String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("RegistryData")).get("Value")); log.info("----------------------------------" + values); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); bufferContent.writeBytes(values.getBytes(Charset.forName("ISO-8859-1"))); diff --git a/sensorhub-core/src/main/resources/application.properties b/sensorhub-core/src/main/resources/application.properties deleted file mode 100644 index 8b13789..0000000 --- a/sensorhub-core/src/main/resources/application.properties +++ /dev/null @@ -1 +0,0 @@ - diff --git a/sensorhub-core/src/main/resources/config/application-dev.yml b/sensorhub-core/src/main/resources/config/application-dev.yml index 4f897a8..dcc4c2d 100644 --- a/sensorhub-core/src/main/resources/config/application-dev.yml +++ b/sensorhub-core/src/main/resources/config/application-dev.yml @@ -4,9 +4,9 @@ spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true + url: jdbc:mysql://127.0.0.1:3306/sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true username: root - password: Casic203 + password: root session: store-type: redis redis: diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java index 608af3a..32cc8a4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java @@ -2,48 +2,47 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.delivery.decorator.ByteDecorator; +import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @AllArgsConstructor public class FieldDecoratorManger { - private final RuleDictDao ruleDictDao; + private final RuleConfigRegistry ruleDictDao; // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 // (1)静态的业务字段是字典里面可以配置的 // (2)动态的业务字段是通过规则生成的 public String contentMerge(String ruleJson, String sceneConent, String dynamicContent) { - List ruleDictList = ruleDictDao.getRuleDictConfig(); - Map ruleDictMap = ruleDictList.stream().collect( - Collectors.toMap(RuleDict::getId, e -> e)); - List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); - for (Map ruleMap : ruleMapList) { - String ruleType = String.valueOf(ruleMap.get("ruleType")); - ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); - NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); - byteDecorator.nodeDecoratorRule(nodeDecoratorParm); - } +// List ruleDictList = ruleDictDao.getRuleDictConfig(); +// Map ruleDictMap = ruleDictList.stream().collect( +// Collectors.toMap(RuleDict::getId, e -> e)); +// List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); +// for (Map ruleMap : ruleMapList) { +// String ruleType = String.valueOf(ruleMap.get("ruleType")); +// ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); +// NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); +// byteDecorator.nodeDecoratorRule(nodeDecoratorParm); +// } return null; } - - private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { - NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() - .contents(sceneConent) - .dynamicContent(dynamicContent) - .ruletypeId(ruletypeId) - .ruleDictMap(ruleDictMap) - .build(); - return nodeDecoratorParm; - } +// +// private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { +// NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() +// .contents(sceneConent) +// .dynamicContent(dynamicContent) +// .ruletypeId(ruletypeId) +// .ruleDictMap(ruleDictMap) +// .build(); +// return nodeDecoratorParm; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java index 652970c..b204ac3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java @@ -1,56 +1,56 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@AllArgsConstructor -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", - JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Component; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Component("logicalDecorator") +//@AllArgsConstructor +//@Slf4j +//public class LogicalShiftDecorator implements ByteDecorator { +// +//// private final FieldRuleEngineMapper fieldRuleEngineMapper; +//// +//// //字节位移 +//// @Override +//// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +//// String logicalValue = ""; +//// RuleEvaluator fieldRuleEngine = new RuleEvaluator(); +//// try { +//// Map env2 = new HashMap(); +//// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +//// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +//// for (String contentId : contentIdList) { +//// RuleDict ruleDict = ruleDictMap.get(contentId); +//// if (ruleDict.getCode().contains("#")) { +//// //使用动态的值 +//// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +//// } +//// env2.put(ruleDict.getName(), ruleDict.getCode()); +//// } +//// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +//// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +//// return null; +//// } +//// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +//// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +//// return values; +//// } catch (Exception ex) { +//// log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", +//// JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +//// return null; +//// } +//// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java index 346468f..822fead 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@AllArgsConstructor -@Slf4j -public class OperationDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("optionDecorator") +//@AllArgsConstructor +//@Slf4j +//public class OperationDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //混合运算,有常量或者乘除的缩放 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java index 50fb0a7..7a8bccb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@AllArgsConstructor -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +////精度计算 +//@AllArgsConstructor +//@Registry("precisionDecorator") +//@Slf4j +//public class PrecisionDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java index da39235..27f9cc7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java @@ -1,54 +1,53 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@AllArgsConstructor -@Slf4j -public class RuleDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("ruleDecorator") +//@AllArgsConstructor +//@Slf4j +//public class RuleDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //吃我一套正则表达式 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (Exception ex) { +// log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java index 7f5cbf3..c043f97 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java @@ -2,6 +2,6 @@ import java.util.Map; -public interface ComandeEventService { +public interface ComandeEventService{ Map loadComandeEventConfig(String protocolId,String scene); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java index 476ad84..aaf1837 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java @@ -2,46 +2,46 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.dao.CommandEventDao; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @Slf4j @AllArgsConstructor -public class ComandeEventServiceImpl implements ComandeEventService { +public class ComandeEventServiceImpl implements ComandeEventRegistry { - private final CommandEventDao commandEventDao; + // private final CommandEventDao commandEventDao; // 加密bean 固定字段出现变化的字段解析,业务字段的有序内容 @Override - public Map loadComandeEventConfig(String protocolId,String sceneName) { - CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); - if (ObjectUtil.isEmpty(commandEventConfig)) { - log.error("协议{},没有配置成功接收回复配置,清排查原因"); - return null; - } - String replyJson = commandEventConfig.getReplyContentJson(); - List> replyMapList = JSONArray.parseObject(replyJson, List.class); - List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); - Map fixMap = fixList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); - List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) - .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) - .collect(Collectors.toList()); - Map commandConfigMap = new HashMap<>(); - commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); - commandConfigMap.put("fixContent", fixMap); - commandConfigMap.put("bizContent", contentList); - return commandConfigMap; + public Map loadComandeEventConfig(String protocolId, String sceneName) { +// CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); +// if (ObjectUtil.isEmpty(commandEventConfig)) { +// log.error("协议{},没有配置成功接收回复配置,清排查原因"); +// return null; +// } +// String replyJson = commandEventConfig.getReplyContentJson(); +// List> replyMapList = JSONArray.parseObject(replyJson, List.class); +// List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); +// Map fixMap = fixList.stream() +// .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); +// List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) +// .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) +// .collect(Collectors.toList()); +// Map commandConfigMap = new HashMap<>(); +// commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); +// commandConfigMap.put("fixContent", fixMap); +// commandConfigMap.put("bizContent", contentList); +// return commandConfigMap; + return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 128b09d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java deleted file mode 100644 index 4016b0b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface DatagramEventMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java deleted file mode 100644 index 597c306..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.apache.ibatis.annotations.Mapper; - -public interface FieldConfigMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java deleted file mode 100644 index a31680a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.PreRuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface PreRuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java deleted file mode 100644 index 9060a69..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface ProtocolConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java deleted file mode 100644 index 6fa6936..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java deleted file mode 100644 index 582a705..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleDict; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleDictMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java deleted file mode 100644 index 6e302c8..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.CommandEventMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Optional; - -@Component -public class CommandEventDao { - - @Resource - private CommandEventMapper commandEventMapper; - - public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId) - .eq("scene", sceneName) - .eq("enabled", 1); - List commandEventConfig = commandEventMapper.selectList(queryWrapper); - Optional optionalEventConfig = commandEventConfig.stream().findFirst(); - return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java deleted file mode 100644 index 9137e4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.FieldConfigMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class FieldConfigDao { - - @Resource - private FieldConfigMapper fieldConfigMapper; - - public FieldConfig getFieldConfigById(String fieldId) { - FieldConfig fieldConfig = fieldConfigMapper.selectById(fieldId); - return fieldConfig; - } - - public List getFieldConfigs(String protocolId,Integer isFixed) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",isFixed); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - - public List getStorageFieldConfig(String protocolId) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",1) - .eq("is_storage",1); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java deleted file mode 100644 index 67bff6b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.mapper.PreRuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class PreRuleConfigDao { - - @Resource - private PreRuleConfigMapper preRuleConfigMapper; - - public List getPreRuleList(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return preRuleConfigMapper.selectList(queryWrapper); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java deleted file mode 100644 index d69ea85..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.RuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleConfigDao { - - @Resource - private RuleConfigMapper ruleConfigMapper; - - public RuleConfig getNextRuleConfig(String ruleFields) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("parse_rule_json", ruleFields); - return ruleConfigMapper.selectOne(queryWrapper); - } - - - public List getRuleConfigById(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return ruleConfigMapper.selectList(queryWrapper); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java deleted file mode 100644 index 932c185..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.RuleDictMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleDictDao { - - @Resource - private RuleDictMapper ruleDictMapper; - - public List getRuleDictConfig() { - List ruleDictList = ruleDictMapper.selectList(null); - return ruleDictList; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java index 9f9e279..43bc4d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java @@ -10,20 +10,15 @@ import io.netty.channel.socket.nio.NioServerSocketChannel; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import javax.annotation.PreDestroy; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static cn.hutool.core.util.ClassUtil.getClasses; /** * SensorhubServer netty服务端 */ @Slf4j -@Service +@Component public class SensorhubServer { /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java index 2c79ff5..9a28c36 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java @@ -11,13 +11,13 @@ import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioSocketChannel; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClient 客户端 */ @Slf4j -@Service +@Registry public final class SensorhubClient { public static void main(String[] args) throws Exception { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java index 9774be0..477c3f7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java @@ -6,12 +6,12 @@ import io.netty.channel.socket.SocketChannel; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientChannelInitialHandler */ -@Service +@Registry public class SensorhubClientChannelInitialHandler extends ChannelInitializer { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java index 346f4b3..73560e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java @@ -5,13 +5,13 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientHandler */ @Slf4j -@Service +@Registry public class SensorhubClientHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java index 5c1c6f2..d990af5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java @@ -4,12 +4,12 @@ import com.casic.missiles.pojo.Msg; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** * SensorhubServerHandler */ -@Service +@Component public class SensorhubServerHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 67283ae..af3172c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,41 +1,37 @@ package com.casic.missiles.parser; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultProtocolConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.*; +import com.casic.missiles.registry.FieldConfigRegistry; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; -import java.nio.charset.Charset; import java.util.HashMap; import java.util.List; import java.util.Map; -@Service("genericProtocolParser") +/** + * @author + */ +@Component("genericProtocolParser") @Slf4j -@AllArgsConstructor +@RequiredArgsConstructor public class GenericProtocolParser implements ProtocolParser { - private final LeadingCodeMatcher leadingCodeMatcher; private final List frameStructDispenserList; - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorInstanceSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; // 匹配首字母前导码=> 帧结构匹配前导码=> // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 @@ -44,18 +40,19 @@ public Boolean doParseProtocol(ByteBuf byteBuf) { String protocolContent = ByteBufUtil.hexDump(byteBuf); //匹配前导码 - List preCodeConfigs = leadingCodeMatcher.matchLeadingCode(protocolContent); + List preCodeConfigs = LeadingCodeMatcher.matchFrameLeadingCode(protocolContent); //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 if (preCodeConfigs.size() == 0) { - return rematch(byteBuf,protocolContent); + return rematch(byteBuf, protocolContent); } - //暂时先取第一个 + //暂时先取第一个,提升速度,使用享元模式, 减少类的创建销毁与构建 ProtocolConfig protocolConfig = preCodeConfigs.get(0); + AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); ByteBuf wholeDatagramByte = null; //通过匹配帧结构获取完整的数据包 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, preCodeConfigs.get(0))) != null) { + if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, protocolFactory)) != null) { break; } } @@ -68,76 +65,78 @@ * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 */ - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId, wholeDatagramByte); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap, protocolId); - //选取规则对应的流程实例 - DatagramEventConfig datagramEventConfig = processorInstanceSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); + //进行规则字段解析,进行匹配规则 + RuleConfig ruleConfig = getRuleConfig(protocolFactory, wholeDatagramByte); + if (ruleConfig == null) { + return false; + } //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, wholeDatagramByte); + ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte); + //以下进行业务的规则解析,同时选定流程实例 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); + DatagramEventProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain, + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText, protocolId); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain); //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); + datagramEventProvider.storeData(bizDataMap); return true; } - private Boolean rematch(ByteBuf byteBuf,String protocolContent) { + /** + * 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 + */ + private Boolean rematch(ByteBuf byteBuf, String protocolContent) { //重置位判断 byteBuf.resetReaderIndex(); //判断重置是否前移,如果没有前移,则直接判为匹配失败 if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { return false; } else { + //递归执行 return doParseProtocol(byteBuf); } } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; + //获取匹配规则->匹配规则 + private RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + //取出其中参与逻辑provider并判空 + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); + String rulePrepareFields = protocolConfig.getRulePrepareFields(); + //固定字段 + if (StringUtils.isNotEmpty(rulePrepareFields)) { + //获取统一固定字段解析 + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + //获取该协议的字段配置,用于协议规则匹配 + List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); + //获取规则 + RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, + rulePrepareFields, protocolFieldConfigs); + return ruleConfig; + } + return null; } - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + //数据构建,获取固定字段的store和业务字段store + private Map buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + Map bizDataMap = new HashMap<>(); + Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); + Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); + bizDataMap.putAll(ruleStoreObjectMap); + bizDataMap.putAll(protocolStoreObjectMap); return bizDataMap; } - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java index 8a46e32..16ce2e5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java @@ -3,6 +3,7 @@ import io.netty.buffer.ByteBuf; public interface ProtocolParser { + Boolean doParseProtocol(ByteBuf byteBuf); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java new file mode 100644 index 0000000..f7814af --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java @@ -0,0 +1,35 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.ProtocolConfigProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.ProtocolConfig; + +/** + * 存放基本协议的的加载信息 + */ +public class AbstractProtocolConfigFactory { + private final ProtocolConfigProvider protocolConfigProvider; + private final ProtocolFieldConfigProvider protocolFieldConfigProvider; + private final RuleConfigProvider ruleConfigProvider; + + public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { + this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); + this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); + this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); + } + + public ProtocolConfigProvider getProtocolConfigProvider() { + return protocolConfigProvider; + } + + public ProtocolFieldConfigProvider getProtocolFieldConfigProvider() { + return protocolFieldConfigProvider; + } + + public RuleConfigProvider getRuleConfigProvider() { + return ruleConfigProvider; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java new file mode 100644 index 0000000..6e36147 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java @@ -0,0 +1,57 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.CombinedFieldConfigProvider; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.FieldConfigProvider; +import com.casic.missiles.parser.provider.FieldRuleConfigProvider; + +/** + * 存放规则相关的的的加载信息 + */ +public class AbstractRuleConfigFactory { + + /** + * 处理字节 + */ + private final FieldConfigProvider fieldConfigProvider; + /** + * 处理组合字节解析的解码器 + */ + private final CombinedFieldConfigProvider combinedFieldConfigProvider; + /** + * 处理负责字节解析的规则配置 + */ + private final FieldRuleConfigProvider fieldRuleConfigProvider; + /** + * 处理实例流程 + */ + private final DatagramEventProvider datagramEventProvider; + + + public AbstractRuleConfigFactory(Long ruleId) { + this.fieldConfigProvider = new FieldConfigProvider(ruleId); + this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); + this.fieldRuleConfigProvider = new FieldRuleConfigProvider(ruleId); + this.datagramEventProvider = new DatagramEventProvider(ruleId); + } + + public FieldConfigProvider getFieldConfigProvider() { + return fieldConfigProvider; + } + + public CombinedFieldConfigProvider getCombinedFieldConfigProvider() { + return combinedFieldConfigProvider; + } + + public FieldRuleConfigProvider getFieldRuleConfigProvider() { + return fieldRuleConfigProvider; + } + + public DatagramEventProvider getDatagramEventProvider() { + return datagramEventProvider; + } + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java deleted file mode 100644 index 6e1719a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.factory; - - -import com.casic.missiles.pojo.ProtocolConfig; - -import java.util.List; - -/** - * 数据库访问优化(暂时未做) - *

- * 1、初始化协议解析配置,并存放到处存放缓存,对协议基本配置进行管理 - * 2、其中流程中所有的配置都经过此类进行管理,进行调用获取,增强解析速度 - */ -public interface DatagramFactory { - - /** - * 初始化 - */ - List datagramInit(); - - /** - * 根据前导码配置匹配,模糊匹配获取所有的报文项 - */ - List match(); - - /** - * 根据前导码匹配,返回报文项 - */ - List filer(); - - /** - * 保证数据的唯一性选择器 - */ - List selectOne(); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java new file mode 100644 index 0000000..87444a0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java @@ -0,0 +1,18 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +import java.util.List; + +/** + * 直接用,还是边用边创建 + */ +public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { + + + public DefaultProtocolConfigFactory(ProtocolConfig protocolConfig) { + super(protocolConfig); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java new file mode 100644 index 0000000..cce0c7c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java @@ -0,0 +1,12 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; + +public class DefaultRuleFactory extends AbstractRuleConfigFactory { + + public DefaultRuleFactory(Long ruleId) { + super(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java deleted file mode 100644 index 9ee97e0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.casic.missiles.parser.instance; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service -@Slf4j -@AllArgsConstructor -public class GeneralProcessor { - - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; - - /** - * 统一固定字段解析=>进行规则的查询的判断 - * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 - * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 - */ - @Deprecated - public boolean parseWholeDatagram(ByteBuf buffer, ProtocolConfig protocolConfig) { - try { - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap,protocolId); - //选取规则对应的流程= - DatagramEventConfig datagramEventConfig = processorSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); - //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); - //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); - //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); - //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); - //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); - return true; - } catch (Exception ex) { - log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", - ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); - return false; - } - } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; - } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); - } - - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); - return bizDataMap; - } - - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java index 25e7ad8..6a5777e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java @@ -1,23 +1,31 @@ package com.casic.missiles.parser.instance.impl; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.mapper.DatagramEventMapper; import com.casic.missiles.pojo.DatagramEventConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.SpringContextUtil; -@Service -@AllArgsConstructor +import java.util.List; +import java.util.Optional; + +/** + * @author cz + * + */ public class DefaultProcessorInstanceSelector implements ProcessorInstanceSelector { - private final DatagramEventMapper datagramEventMapper; + private static List datagramEventConfigs; + + static { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + datagramEventConfigs = datagramEventRegistry.getDatagramEventList(); + } @Override public DatagramEventConfig getProcessorInstance(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("rule_id", protocolId); - return datagramEventMapper.selectOne(queryWrapper); + Optional optionalSelectInstance = datagramEventConfigs.stream() + .filter(e -> e.getId().equals(protocolId)).limit(1).findFirst(); + return optionalSelectInstance.isPresent() ? optionalSelectInstance.get() : null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a778671..7b56a43 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,16 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import io.netty.buffer.ByteBuf; /** - * 分析匹配情况 - * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 - * 2、匹配不成功,有后续帧,可以进行下次匹配。 - * 3、匹配不成功,无后续帧,可以进行丢弃。 + * 分析匹配情况 + * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 + * 2、匹配不成功,有后续帧,可以进行下次匹配。 + * 3、匹配不成功,无后续帧,可以进行丢弃。 */ -public interface FrameStructMatcher{ +public interface FrameStructMatcher { - ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig); + ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 05320ab..8ebea78 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,23 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.ProtocolConfigMapper; +import com.casic.missiles.parser.provider.ProtocolConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Component; import java.util.List; import java.util.stream.Collectors; -@Component -@AllArgsConstructor public class LeadingCodeMatcher { - private final ProtocolConfigMapper protocolMapper; - //** 1、首字母匹配前导码, // 2、以匹配出的前导码是否在报文中条件进行前导码的匹配二次筛选 - public List matchLeadingCode(String protocolContent){ + public static List matchFrameLeadingCode(String protocolContent){ List initialConfigs = initialMatch(protocolContent); List preCodeConfigs = initialConfigs.stream() .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) @@ -26,13 +19,16 @@ } //初始化匹配前导码内容 - private List initialMatch(String protocolContent) { - String protocolStr = protocolContent.charAt(0) + ""; - QueryWrapper queryWrapper = new QueryWrapper() - .likeRight("pre_fix", protocolStr); - List protocolConfigList = protocolMapper.selectList(queryWrapper); - return protocolConfigList; + private static List initialMatch(String protocolContent) { + String firstFrameChar = protocolContent.charAt(0) + ""; + ProtocolConfigProvider protocolConfigProvider=new ProtocolConfigProvider(firstFrameChar); + return protocolConfigProvider.getMatchList(); } + + + + + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index cf2113d..e915877 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -1,32 +1,35 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(0) -@Service +@Component public class FrameLengthMatcher implements FrameStructMatcher { - @Autowired - private FieldParser fieldParser; - //超过长度 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { String dataGramContent = ByteBufUtil.hexDump(byteBuf); - if (StringUtils.isEmpty(protocolConfig.getUnpackId()) && StringUtils.isEmpty(protocolConfig.getTailStr())) { - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + //当不存在结尾标志和拆包标志,可以直接使用长度进行匹配 + if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { if (dataGramContent.length() >= totalLength) {//等于长度返回true,超出长度,切断 - ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, protocolConfig, totalLength); + ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, totalLength); return wholeDatagramByte; } else { //读的标志位前移舍弃 @@ -38,7 +41,7 @@ return null; } - private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, Integer totalLength) { byteBuf.readBytes(totalLength); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, totalLength - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 2bfc213..d527ad0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; @@ -13,7 +13,7 @@ import lombok.AllArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.nio.charset.Charset; import java.util.Map; @@ -22,32 +22,30 @@ * 后续标志验证 */ @Order(1) -@Service +@Component @AllArgsConstructor -public class FrameMarkMatcher implements FrameStructMatcher { - - private final FieldConfigDao fieldConfigDao; - private final FieldParser fieldParser; - private final FieldResolver fieldResolverManger; +public class FrameMarkMatcher implements FrameStructMatcher, FixedPropertyEnum { //帧后续标志=>结束,进行帧的重组=>有后续,1、帧移位判别 2、继续接收帧 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig UnpackConfig = StringUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getUnpackId()); - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); - Integer upback = 0; + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); ByteBuf mergeWholeFrameByte = null; - if (!ObjectUtil.isEmpty(UnpackConfig)) { - while (hasNextFullFrame(byteBuf, protocolConfig)) { - upback = (Integer) fieldResolverManger.filedParserManger(byteBuf, UnpackConfig, null); + if (!ObjectUtil.isEmpty(unpackFlag)) { + while (hasNextFullFrame(byteBuf, protocolConfig, protocolFieldConfigProvider)) { //是否存在后续位 - if (upback == 1) {//使用esayRule + if (unpackFlag == 1) {//使用esayRule //表示可以截取 - mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolConfig, totalLength); + mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolFieldConfigProvider, protocolConfig); return mergeWholeFrameByte; } else { - byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig)); + byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig, protocolFieldConfigProvider)); } } } @@ -56,7 +54,8 @@ //选取第一个帧,将业务内容和后面部分分开 //计算数据报文-业务内容 - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolFieldConfigProvider protocolFieldConfigProvider, ProtocolConfig protocolConfig) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); //截取完整报文 byteBuf.readBytes(totalLength); ByteBuf byteBufContent = byteBuf.slice(0, byteBuf.readerIndex()); @@ -68,15 +67,15 @@ String tail = ""; System.out.println(ByteBufUtil.hexDump(byteBufContent)); //会存在多个帧拼接在一起的的情况,进行合并处理 - while (hasNextFullFrame(byteBufContent, protocolConfig)) { - Integer currentFrameLength = fieldParser.getTotalLength(protocolConfig, byteBufContent); + while (hasNextFullFrame(byteBufContent, protocolConfig, protocolFieldConfigProvider)) { + Integer currentFrameLength = protocolFieldConfigProvider.getTotalLength(byteBufContent, protocolConfig); byteBufContent.readBytes(currentFrameLength); ByteBuf currentbyteBuf = byteBufContent.slice(0, byteBufContent.readerIndex()); byteBufContent.markReaderIndex();//读的标志位前移 System.out.println(ByteBufUtil.hexDump(byteBufContent)); String hexDump = currentbyteBuf.toString(Charset.forName("ISO-8859-1")); //获取当前固定帧结构的关系map - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, currentbyteBuf); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(currentbyteBuf, protocolConfig); if (StringUtils.isEmpty(mergeFrameStr)) { //首次获取业务数据报文 mergeFrameStr += hexDump.substring(0, currentFrameFixedProperty.get("tailPosition")); @@ -95,22 +94,22 @@ /** * 获取平移到下一帧起始位置 */ - public int getNextFrameOffset(ByteBuf buffer, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, buffer); - return currentFrameFixedProperty.get("totalLength"); + public int getNextFrameOffset(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + return currentFrameFixedProperty.get(TOTAL_LENGTH); } /** * 判断是否出错进行整个帧的 */ - public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, byteBuf); + public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); //保证读取位置不在固定位置,是可变的业务内容 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("fixedPosition")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(FIXED_POSITION)) { return false; } //判断读取是否操作帧长度 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("totalLength")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(TOTAL_LENGTH)) { return false; } return true; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 76a3784..c3a1bab 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -1,50 +1,50 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.parser.instance.GeneralProcessor; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; +import io.netty.buffer.ByteBufUtil;; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(2) -@Service +@Component public class FrameTailMatcher implements FrameStructMatcher { - @Resource - private FieldConfigDao fieldConfigDao; - @Autowired - private GeneralProcessor generalProcessor; - //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig tailFieldConfig = StringUtils.isEmpty(protocolConfig.getTailStr()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getTailStr()); - if (!ObjectUtil.isEmpty(tailFieldConfig)) { - String tailStr = tailFieldConfig.getFieldName(); + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfig protocolFieldConfig = ObjectUtils.isEmpty(protocolConfig.getTailStr()) ? null : + fieldConfigProvider.getFieldConfigById(protocolConfig.getTailStr()); + if (!ObjectUtil.isEmpty(protocolFieldConfig)) { + String tailStr = protocolFieldConfig.getFieldName(); String dataGramContent = ByteBufUtil.hexDump(byteBuf); Boolean tailFlag = ByteBufUtil.hexDump(byteBuf).contains(tailStr); if (!tailFlag) { //使用esayRule return null; } else if (dataGramContent.indexOf(tailStr) < dataGramContent.length() - tailStr.length()) { Integer length = dataGramContent.indexOf(tailStr) + tailStr.length(); - ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, protocolConfig, length); + ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, length); return wholeDatagramByte; //存在粘包 } } return null; } - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer length) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, Integer length) { byteBuf.readBytes(length); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, length - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java new file mode 100644 index 0000000..5f1c177 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java @@ -0,0 +1,73 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.combined.GenericCombinedFieldResolver; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.CombinedFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class CombinedFieldConfigProvider { + + + /** + * 作为临时配置列表缓存使用 + */ + private final List combinedFieldConfigList; + private Map storeObjectMap = new HashMap<>(); + + public CombinedFieldConfigProvider(Long ruleId) { + CombinedFieldConfigRegistry combinedFieldConfigRegistry = SpringContextUtil.getBean(CombinedFieldConfigRegistry.class); + combinedFieldConfigList = combinedFieldConfigRegistry.getCombinedFieldConfigList(ruleId); + } + + public void parseDataField(RuleConfig ruleConfig, String clearZeroPlain,Map fieldConfigsMap ) { + if (showSkip()) { + return; + } + //匹配对应的数据,然后进行相关的字段解析 + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver(); + combinedFieldResolver.parseDataField(combinedFieldConfigList, byteBuf, storeObjectMap,fieldConfigsMap); + } + + + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getCombinedFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return combinedFieldConfigList.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public List getCombinedFieldConfigList() { + return combinedFieldConfigList; + } + + /* 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(combinedFieldConfigList) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java new file mode 100644 index 0000000..f3cfedc --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java @@ -0,0 +1,11 @@ +package com.casic.missiles.parser.provider; + +/** + * @author cz + * @date 2023-6-12 + */ +public class CommandEventProvider{ + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java new file mode 100644 index 0000000..70eec5e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java @@ -0,0 +1,77 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.safe.SafeStrategy; +import com.casic.missiles.parser.sender.DataSubscribeProvider; +import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class DatagramEventProvider { + + private final DatagramEventConfig processorInstance; + + public DatagramEventProvider(Long ruleId) { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + List datagramEventConfigList = + datagramEventRegistry.getDatagramEventList(ruleId); + processorInstance = this.getProcessorInstance(datagramEventConfigList); + } + + public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { + if (showSkip()) { + return null; + } + return datagramEventConfigList.get(0); + } + + // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 + public String getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap) { + String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? + processorInstance.getSafeBean() : + fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); + if (!StringUtils.isEmpty(safeName)) { + //需要加密 + SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); + String plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); + return clearComplementZero(plain); + } + return ByteBufUtil.hexDump(bizDataContent); + } + + //解密清零操作 + private String clearComplementZero(String plain) { + plain = plain.substring(0, plain.lastIndexOf("00")); + return plain; + } + + //数据发送,数据发送者暂未构建 + public void storeData(Map bizDataMap) { + DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); +// dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return ObjectUtils.isNotEmpty(processorInstance) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java new file mode 100644 index 0000000..7e1fe0a --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java @@ -0,0 +1,97 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.FieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class FieldConfigProvider { + + + private final List fieldConfigs; + private Map storeObjectMap = new HashMap<>(); +// private Map singleObjects = new ConcurrentHashMap<>(); + + public FieldConfigProvider(Long ruleId) { + FieldConfigRegistry fieldConfigRegistry = SpringContextUtil.getBean(FieldConfigRegistry.class); + fieldConfigs = fieldConfigRegistry.getFieldConfigList(ruleId); + } + + public List getFieldConfigs() { + return fieldConfigs; + } + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public Map parseDataField(RuleConfig ruleConfig, String clearZeroPlain) { + if (showSkip()) { + return null; + } + List prepareFieldConfig = prepareParseField(ruleConfig); + if (CollectionUtils.isNotEmpty(prepareFieldConfig)) { + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(fieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + return fixDataMap; + } + } + return null; + } + + /** + * 得到需要处理的业务内容 + * + * @return + */ + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return fieldConfigs.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public Map getFieldConfigsMap() { + return fieldConfigs.stream().collect( + Collectors.toMap(FieldConfig::getId, e -> e) + ); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(fieldConfigs) ? false : true; + } + + +} + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java new file mode 100644 index 0000000..817bfaf --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java @@ -0,0 +1,19 @@ +package com.casic.missiles.parser.provider; + +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.registry.FieldRuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; + +public class FieldRuleConfigProvider { + + private final List fieldRuleConfigList; + + public FieldRuleConfigProvider(Long ruleId) { + FieldRuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(FieldRuleConfigRegistry.class); + fieldRuleConfigList = ruleConfigRegistry.getFieldRuleConfigList(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java new file mode 100644 index 0000000..99a1b06 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java @@ -0,0 +1,53 @@ +package com.casic.missiles.parser.provider; + + +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.registry.ProtocolConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolConfigProvider { + + private final List protocolConfigList; + + public ProtocolConfigProvider(String firstChar) { + ProtocolConfigRegistry registry = SpringContextUtil.getBean(ProtocolConfigRegistry.class); + protocolConfigList = registry.getProtocolConfigList(firstChar); + } + + public List getMatchList() { + return protocolConfigList; + } + + /** + * 设置当前协议 + * + * @param protocolConfig + */ + public ProtocolConfigProvider(ProtocolConfig protocolConfig) { + List protocolConfigs = new ArrayList<>(); + protocolConfigs.add(protocolConfig); + protocolConfigList = protocolConfigs; + } + + /** + * 获取当前协议 + * + * @return + */ + public ProtocolConfig getCurrentProtocolConfig() { + if (this.protocolConfigList == null) { + return null; + } else { + return protocolConfigList.get(0); + } + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java new file mode 100644 index 0000000..043927d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java @@ -0,0 +1,213 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.registry.ProtocolFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolFieldConfigProvider { + + private static final String FIXED_FIELD_DS = "fixedFieldDs"; + private static final String CONTENT_FIELD_DS = "contentFieldDs"; + private static final String PROTOCOL_LENGTH = "protocolLength"; + private static final String PROTOCOL_FIELD_ID = "protocolFieldId"; + private static final String PROTOCOL_POSITION = "protocolPosition"; + + private final List protocolFieldConfigs; + private Map singleObjects = new ConcurrentHashMap<>(); + private Map storeObjectMap = new HashMap<>(); + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public ProtocolFieldConfigProvider(Long protocolId) { + ProtocolFieldConfigRegistry protocolFieldConfigRegistry = SpringContextUtil.getBean(ProtocolFieldConfigRegistry.class); + protocolFieldConfigs = protocolFieldConfigRegistry.getProtocolFieldConfigList(protocolId); + } + + public List getProtocolFieldConfigs() { + return protocolFieldConfigs; + } + + public ProtocolFieldConfig getFieldConfigById(Long fieldId) { + Optional optionalConfig = protocolFieldConfigs.stream().filter( + e -> e.getId().equals(fieldId) + ).findFirst(); + return optionalConfig.isPresent() ? optionalConfig.get() : null; + } + + public Integer getProtocolFieldValue(Long protocolFieldId, ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_FIELD_ID + protocolFieldId + ByteBufUtil.hexDump(byteBuf); + //获取缓存 + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + //加载固定长度数据集合 + Map fixDataMap = this.getProtocolDataMap(byteBuf); + ProtocolFieldConfig protocolFieldConfig = selectFieldConfig(protocolFieldId); + Integer protocolFieldValue = 0; + //获取约定字段的总长度 + if (fixDataMap.containsKey(protocolFieldConfig.getFieldName())) { + Object appointUnpackObject = fixDataMap.get(protocolFieldConfig.getFieldName()); + if (ObjectUtils.isNotEmpty(appointUnpackObject)) { + protocolFieldValue = (Integer) appointUnpackObject; + } + } + if (protocolFieldValue != null) { + //加入缓存 + if (ObjectUtils.isNotEmpty(protocolFieldValue)) { + this.singleObjects.put(catchKey, protocolFieldValue); + return protocolFieldValue; + } + } + return null; + } + + /** + * 获取帧固定位置信息 + * + * @param byteBuf + * @param protocolConfig + * @return + */ + public Map getFixedProperty(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_POSITION + protocolConfig.getId(); + if (this.singleObjects.containsKey(catchKey)) { + return (Map) singleObjects.get(catchKey); + } + Map fixedPropertyMap = new HashMap<>(); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + fixedPropertyMap = fieldParser.doGetFixedProperty(protocolFieldConfigs, this.getTotalLength(byteBuf,protocolConfig)); + if (CollectionUtils.isNotEmpty(fixedPropertyMap)) { + this.singleObjects.put(catchKey, fixedPropertyMap); + return fixedPropertyMap; + } + return fixedPropertyMap; + } + + /** + * 获取帧结构应有的总长度 + */ + public Integer getTotalLength(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_LENGTH + ByteBufUtil.hexDump(byteBuf); + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + Integer appointFrameLength = getProtocolFieldValue(protocolConfig.getTotalLengthId(), byteBuf); + if (appointFrameLength != null) { + //获取过滤的字段集合总长度 + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Integer totalFilterLength = fieldParser.getTotalFilterLength(protocolConfig, byteBuf, getFixFieldConfigMap()); + //计算总长度 + Integer totalLength = appointFrameLength + totalFilterLength; + //加入缓存 + if (ObjectUtils.isNotEmpty(totalLength)) { + this.singleObjects.put(catchKey, totalLength); + return totalLength; + } + } + return null; + } + + /** + * 获取协议有关字段解析内容 + * storeObjectMap存储代转存的数据 + * + * @return + */ + public Map getProtocolDataMap(ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(FIXED_FIELD_DS)) { + return (Map) singleObjects.get(FIXED_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(protocolFieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + this.singleObjects.put(FIXED_FIELD_DS, fixDataMap); + return fixDataMap; + } + return null; + } + + /** + * 获取业务报文内容的content字节 + * + * @param wholeDatagramByte + * @return + */ + public ByteBuf getDataContentBuf(ByteBuf wholeDatagramByte) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(CONTENT_FIELD_DS)) { + return (ByteBuf) singleObjects.get(CONTENT_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + ByteBuf bizDataByteBuf = fieldParser.getDataContentBuf(protocolFieldConfigs, wholeDatagramByte); + if (bizDataByteBuf != null) { + this.singleObjects.put(CONTENT_FIELD_DS, bizDataByteBuf); + return bizDataByteBuf; + } + return null; + } + + + private ProtocolFieldConfig selectFieldConfig(Long id) { + Optional optionalProtocolFieldConfig = this.protocolFieldConfigs.stream().filter( + e -> e.getId().equals(id) + ).findFirst(); + return optionalProtocolFieldConfig.isPresent() ? optionalProtocolFieldConfig.get() : null; + } + + + private Map getFixFieldConfigMap() { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, e -> e) + ); + return fixDataFieldMap; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(protocolFieldConfigs) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java new file mode 100644 index 0000000..dafba1c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java @@ -0,0 +1,56 @@ +package com.casic.missiles.parser.provider; + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.rule.GenericRuleResolver; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.RuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleConfigProvider { + + private final List ruleConfigs; + + public List getRuleConfigs() { + return ruleConfigs; + } + + public RuleConfigProvider(Long protocolId) { + RuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(RuleConfigRegistry.class); + ruleConfigs = ruleConfigRegistry.getRuleConfigById(protocolId); + } + + /** + * 获取规则匹配结果 + * + * @param parseFixedDataMap + * @param protocolFieldConfigs + * @return + */ + public RuleConfig doGetRule(Map parseFixedDataMap, + String ids, + List protocolFieldConfigs) { + if (showSkip()) { + return null; + } + RuleConfig ruleConfig = GenericRuleResolver.machRule(parseFixedDataMap, ids, protocolFieldConfigs, ruleConfigs); + return ruleConfig; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(ruleConfigs) ? false : true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java index 3c05891..856b399 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java @@ -1,18 +1,11 @@ package com.casic.missiles.parser.resolver; -import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.springframework.web.bind.annotation.RequestBody; -import javax.annotation.Resource; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -20,19 +13,17 @@ @Slf4j public class ByteMergeProvider { - @Resource - private FieldRuleEngineMapper fieldRuleEngineMapper; - //拿到所有的值合并到一个值 - public String resolveByteMerge(List valueList, String ruletypeId, String vaildRange) { + public static String resolveByteMerge(List valueList, String ruleTypeId, String vaildRange) { String values = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Map vaildMap = getValidRangeMap(vaildRange); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(ruletypeId); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } + //暂时不处理 +// fieldRuleEngine = fieldRuleConfigMapper.selectById(ruleTypeId); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } Map env2 = new HashMap(); for (int i = 0; i < valueList.size(); i++) { if (vaildMap.containsKey(i)) { @@ -47,7 +38,7 @@ } } - private Map getValidRangeMap(String vaildRange) { + private static Map getValidRangeMap(String vaildRange) { String[] range = vaildRange.split(","); Map vaildMap = new HashMap(); for (int i = 0; i < range.length; i++) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 8d821cd..85d6bbf 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -1,9 +1,12 @@ package com.casic.missiles.parser.resolver; +import com.casic.missiles.pojo.AbstractFieldConfig; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; import io.netty.buffer.ByteBuf; +import java.util.List; import java.util.Map; /** @@ -11,18 +14,14 @@ */ public interface FieldParser { -// Map fieldProcess(String protocolContent,); - Map dataParser(RuleConfig ruleConfig, String lightText,String protocolId); + Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength); - Map fixDataParser(String protocolId, ByteBuf buffer); + Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap); - Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf); + ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer); - ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer); - - ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer); - - Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer); + Integer getTotalFilterLength(ProtocolConfig protocolConfig, ByteBuf byteBuf, Map protocolFieldConfigMap); } + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java new file mode 100644 index 0000000..9e0c00e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java @@ -0,0 +1,52 @@ +package com.casic.missiles.parser.resolver; + +import com.casic.missiles.pojo.AbstractFieldConfig; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.util.List; + +public class FieldParserSupport { + + //分别计算bit和byte长度=> 合并长度 + protected Integer calculateLength(List fieldConfigList) { + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + Integer fixedLength = bytefixedLength + bitfixedLength / 8; + return fixedLength; + } + + //找到最大值=> 根据最大值计算业务数据下标 + protected Integer calculatePosition(List fieldConfigList) { + String rex = "[0-9]+"; + Integer max = -1; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) + && Integer.valueOf(fieldConfig.getOriginPositionByte()) > max) { + max = Integer.valueOf(fieldConfig.getOriginPositionByte()); + } + } + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) && fieldConfig.getOriginPositionByte().equals(max)) { + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + } + } + Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; + return maxFixedPosition; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java deleted file mode 100644 index dd3a6cd..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java +++ /dev/null @@ -1,170 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.ByteResolverParam; -import io.netty.buffer.ByteBuf; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -/** - * 字段解析管理总类 - */ -@Service -@Slf4j -@AllArgsConstructor -public class FieldResolver extends ByteMergeProvider { - - //1、字段截取 => 2、简单的字节解析和复杂的字节解析 - public Object filedParserManger(ByteBuf byteBuf, FieldConfig fieldConfig, Integer maxFixedPosition) { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - //最大固定位置不为空, - if (!ObjectUtil.isEmpty(maxFixedPosition)) { - orignPosition -= maxFixedPosition; - } - Object fieldValue = 0; - //待优化 - if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { - fieldValue = bitToResolver(byteBuf, fieldConfig); - } else { - ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); - fieldValue = parsingFields(fieldBytes, fieldConfig.getRuleJson()); - } - return fieldValue; - } - - //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, - //目前默认配置的规则设置暂不支持配置化,由实现完成 - private Object parsingFields(ByteBuf byteBuf, String ruleJson) { - Object fieldsResolveValue = null; - List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); - if (ObjectUtil.isEmpty(ruleMapList)) { - fieldsResolveValue = defaultResolveBuilder(byteBuf); - } else { - fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); - } - return fieldsResolveValue; - } - - private Object defaultResolveBuilder(ByteBuf byteBuf) { - Integer defaultResolveValue = 0; - for (int i = 0; i < byteBuf.writerIndex(); i++) { - defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; - } - return defaultResolveValue; - } - - //字段解析构建器(针对字节单位的) - //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 - // 字节归并结束或者规则结束=>继续根据规则进行判断 - private Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { - Object customizeResolveValue = null; - try { - List bytStrList = new ArrayList<>(); - //存放到数组里面 - for (int i = 0; i < byteBuf.writerIndex(); i++) { - bytStrList.add(byteBuf.readByte()); - } - int i = 0; - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - customizeResolveValue = this.resolveByteMerge(bytStrList, ruletypeId,vaildRange); - break; - } else { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - List tempBytStr = new ArrayList<>(); - for (int k = 0; i < bytStrList.size(); i++) { - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(k) - .value(bytStrList.get(k)) - .ruletypeId(ruletypeId).build(); - tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); - } - bytStrList = tempBytStr; - } - i++; - } - //字节归并到一起=>继续根据规则进行判断 - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(customizeResolveValue) - .ruletypeId(ruletypeId).build(); - customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(customizeResolveValue)); - return customizeResolveValue; - } catch (RuntimeException ex) { - log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); - return null; - } - } - - /** - * 1、单个字节情况表示字段 - * 2、多字节情况表示字段(暂未处理) - */ - private Object bitToResolver(ByteBuf byteBuf, FieldConfig fieldConfig) { - Object fieldValue = new Object(); - try { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - byte fields = 0x00; - if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); - } else { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); - } - - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { - if (!StringUtils.isEmpty(fieldConfig.getExactOrignPosition())) { - fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getExactOrignPosition())).byteValue() - >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); - } else { - fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); - } - } else { - fieldValue = Integer.valueOf(fields & 0xff); - } - if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { - return fieldValue; - } - List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); - int i = 0; - //字节归并到一起=>继续根据规则进行判断 - while (i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(fieldValue) - .ruletypeId(ruletypeId).build(); - fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(fieldValue)); - return fieldValue; - } catch (RuntimeException ex) { - log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); - return null; - } - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java new file mode 100644 index 0000000..1d2aeab --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java @@ -0,0 +1,36 @@ +package com.casic.missiles.parser.resolver.bytes; + +import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.mapper.FieldRuleConfigMapper; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.pojo.ByteResolverParam; +import com.googlecode.aviator.AviatorEvaluator; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; +//转换规则 +@Component("convert") +@AllArgsConstructor +@Slf4j +public class ByteRuleResolver implements ByteResolver { + + private final FieldRuleConfigMapper fieldRuleConfigMapper; + + @Override + public Object resolveOperationRule(ByteResolverParam byteResolverParam){ + FieldRuleConfig fieldRuleEngine=fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); + if(ObjectUtil.isEmpty(fieldRuleEngine)){ + return byteResolverParam.getValue(); + } + String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); + Map env2 = new HashMap(); + env2.put("value", (byte) byteResolverParam.getValue()); + String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); + return values; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java index 103821c..786b71c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java @@ -2,34 +2,34 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("logicalShift") +@Component("logicalShift") @AllArgsConstructor @Slf4j public class LogicalShiftResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //字节位移 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { Integer index = byteResolverParam.getIndex(); - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return byteResolverParam.getValue(); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java index 476747d..01149bd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("operation") +@Component("operation") @AllArgsConstructor @Slf4j public class OperationResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //混合运算,有常量或者乘除的缩放 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java index 0b82cf4..79abcce 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.casic.missiles.pojo.ByteResolverParam; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; //精度计算 -@Service("precision") +@Component("precision") @AllArgsConstructor @Slf4j public class PrecisionResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java deleted file mode 100644 index 5c3f332..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; -//转换规则 -@Service("convert") -@AllArgsConstructor -@Slf4j -public class RuleResolver implements ByteResolver { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam){ - RuleEvaluator fieldRuleEngine=fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); - if(ObjectUtil.isEmpty(fieldRuleEngine)){ - return byteResolverParam.getValue(); - } - String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); - Map env2 = new HashMap(); - env2.put("value", (byte) byteResolverParam.getValue()); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java new file mode 100644 index 0000000..d3bbd91 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java @@ -0,0 +1,15 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; + +import java.util.List; +import java.util.Map; +// 前导码匹配->长度字段 +public interface AbstractCombinedFieldProcessor { + + Map invoke(Map map, ByteBuf byteBuf, List combinedFieldConfigList, + Map fieldConfigsMap, Map storeObjectMap); + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java new file mode 100644 index 0000000..03c8480 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java @@ -0,0 +1,59 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-13 + */ +//依次递增进行数据的解析, +public class GenericCombinedFieldResolver { + + + //通过查询,字段长度长度随机 + public void parseDataField(List combinedFieldConfigList, ByteBuf byteBuf, + Map storeObjectMap, Map fieldConfigsMap) { + Integer frameLength = Integer.valueOf(ByteBufUtil.hexDump(byteBuf)); + //添加前置处理器 + com.casic.missiles.util.ClassUtil classUtil = new com.casic.missiles.util.ClassUtil(); + List abstractCombinedProcessors = classUtil.getSubClassList(AbstractCombinedFieldProcessor.class); + + Map fieldFixedMap = combinedFieldLeadCodeMap(combinedFieldConfigList); + //frameLength + Map combinedProcessorFields = null; + while (byteBuf.readableBytes() < frameLength) { + //一直处理 + for (AbstractCombinedFieldProcessor abstractCombinedProcessor : abstractCombinedProcessors) { + combinedProcessorFields = abstractCombinedProcessor.invoke(combinedProcessorFields, byteBuf, + combinedFieldConfigList, + fieldConfigsMap, storeObjectMap); + if (combinedProcessorFields == null || byteBuf.readableBytes() < frameLength) { + return; + } + } + + } + } + + /** + * 取出前导码匹配集合 + */ + private Map combinedFieldLeadCodeMap(List combinedFieldConfigList) { + Map fieldFixedMap = combinedFieldConfigList + .stream() + .collect(Collectors.toMap(CombinedFieldConfig::getPrefixCode, e -> e)); + return fieldFixedMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java new file mode 100644 index 0000000..643a934 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java @@ -0,0 +1,100 @@ +package com.casic.missiles.parser.resolver.fields; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.FieldParserSupport; +import com.casic.missiles.pojo.*; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 保存使用时最基本的信息,并且使用原型模式 + */ +@Slf4j +public class DefaultProtocolFieldParser extends FieldParserSupport implements FieldParser, FixedPropertyEnum { + + //通过传入的配置和报文进行字段解析 + @Override + public Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap) { + Map dataMap = new HashMap<>(); + for (AbstractFieldConfig protocolFieldConfig : protocolFieldConfigs) { + if (!ObjectUtils.isEmpty(protocolFieldConfig.getOriginPositionByte())) { + Object fieldValue = FieldResolver.parseField(buffer, protocolFieldConfig, null); + if (protocolFieldConfig.getIsStorage() == 1) { + storeObjectMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + dataMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + } + return dataMap; + } + + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength) { + Map fixedPropertyMap = new HashMap<>(); + Integer fixedLength = calculateLength(protocolFieldConfigs); + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + fixedPropertyMap.put(FIXED_POSITION, maxFixedPosition); + fixedPropertyMap.put(TOTAL_LENGTH, totalLength); + fixedPropertyMap.put(TAIL_POSITION, totalLength - fixedLength + maxFixedPosition); + return fixedPropertyMap; + } + + //** 获取业务内容的byteBuf + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer) { + //计算固定长度 + Integer fixedLength = calculateLength(protocolFieldConfigs); + //总长度获取 + String lightText = buffer.toString(Charset.forName("ISO-8859-1")); + Integer totalLength = lightText.length(); + //计算固定长度最大长度 + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + //计算数据报文内容 + ByteBuf bizDataFields = buffer.slice(maxFixedPosition - 1, (totalLength - fixedLength)); + return bizDataFields; + } + + /** + * 获取过滤字段的长度 + */ + @Override + public Integer getTotalFilterLength(ProtocolConfig protocolConfig, + ByteBuf byteBuf, + Map protocolFieldConfigMap) { + if (ByteBufUtil.hexDump(byteBuf).equals("")) { + return 0; + } + int totalFilterLength = 0; + String filterFields = protocolConfig.getTotalLengthFilterFields(); + try { + if (!StringUtils.isEmpty(filterFields)) { + String[] filterFieldList = filterFields.split(","); + for (String filterFieldId : filterFieldList) { + if (StringUtils.isNotEmpty(filterFieldId)) { + ProtocolFieldConfig fieldConfig = protocolFieldConfigMap.get(Long.valueOf(filterFieldId)); + //这里都是按字节计算,没有对位进行区分,可能会出现错误 + // 如果对位有需求,需要进一步跟进 + totalFilterLength += fieldConfig.getOffsetLength(); + } + } + } + return totalFilterLength; + } catch (Exception ex) { + log.error("报文确认分发阶段,获取报文总长度过滤长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); + } + return totalFilterLength; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java new file mode 100644 index 0000000..d51e887 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java @@ -0,0 +1,169 @@ +package com.casic.missiles.parser.resolver.fields; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.parser.resolver.ByteMergeProvider; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.AbstractFieldConfig; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.pojo.ByteResolverParam; +import io.netty.buffer.ByteBuf; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * 字段解析管理总类 + */ +@Slf4j +public class FieldResolver extends ByteMergeProvider { + + //1、字段截取 => 2、简单的字节解析和复杂的字节解析 + public static Object parseField(ByteBuf byteBuf,AbstractFieldConfig fieldConfig, Integer maxFixedPosition) { + Integer orignPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + //最大固定位置不为空, + if (!ObjectUtil.isEmpty(maxFixedPosition)) { + orignPosition -= maxFixedPosition; + } + Object fieldValue = 0; + //待优化 + if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { + fieldValue = doParseBitField(byteBuf, fieldConfig); + } else { + ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); + fieldValue = doParseByteField(fieldBytes, fieldConfig.getRuleJson()); + } + return fieldValue; + } + + //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, + //目前默认配置的规则设置暂不支持配置化,由实现完成 + private static Object doParseByteField(ByteBuf byteBuf, String ruleJson) { + Object fieldsResolveValue = null; + List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); + if (ObjectUtil.isEmpty(ruleMapList)) { + fieldsResolveValue = defaultResolveBuilder(byteBuf); + } else { + fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); + } + return fieldsResolveValue; + } + + private static Object defaultResolveBuilder(ByteBuf byteBuf) { + Integer defaultResolveValue = 0; + for (int i = 0; i < byteBuf.writerIndex(); i++) { + defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; + } + return defaultResolveValue; + } + + //字段解析构建器(针对字节单位的) + //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 + // 字节归并结束或者规则结束=>继续根据规则进行判断 + private static Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { + Object customizeResolveValue = null; + try { + List bytStrList = new ArrayList<>(); + //存放到数组里面 + for (int i = 0; i < byteBuf.writerIndex(); i++) { + bytStrList.add(byteBuf.readByte()); + } + int i = 0; + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { + if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + customizeResolveValue = resolveByteMerge(bytStrList, ruletypeId, vaildRange); + break; + } else { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + List tempBytStr = new ArrayList<>(); + for (int k = 0; i < bytStrList.size(); i++) { + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(k) + .value(bytStrList.get(k)) + .ruletypeId(ruletypeId).build(); + tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); + } + bytStrList = tempBytStr; + } + i++; + } + //字节归并到一起=>继续根据规则进行判断 + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(null) + .value(customizeResolveValue) + .ruletypeId(ruletypeId).build(); + customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); + i++; + } + System.out.println(JSON.toJSON(customizeResolveValue)); + return customizeResolveValue; + } catch (RuntimeException ex) { + log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); + return null; + } + } + + /** + * 1、单个字节情况表示字段 + * 2、多字节情况表示字段(暂未处理) + */ + private static Object doParseBitField(ByteBuf byteBuf,AbstractFieldConfig fieldConfig) { + Object fieldValue = new Object(); + try { + Integer orignPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + byte fields = 0x00; + if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { + fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); + } else { + fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); + } + + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { + if (!StringUtils.isEmpty(fieldConfig.getOriginPositionBit())) { + fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getOriginPositionBit())).byteValue() + >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); + } else { + fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); + } + } else { + fieldValue = Integer.valueOf(fields & 0xff); + } + if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { + return fieldValue; + } + List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); + int i = 0; + //字节归并到一起=>继续根据规则进行判断 + while (i < ruleMapList.size()) { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(null) + .value(fieldValue) + .ruletypeId(ruletypeId).build(); + fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); + i++; + } + System.out.println(JSON.toJSON(fieldValue)); + return fieldValue; + } catch (RuntimeException ex) { + log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); + return null; + } + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java deleted file mode 100644 index 35ae3d0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java +++ /dev/null @@ -1,183 +0,0 @@ -package com.casic.missiles.parser.resolver.fields; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufAllocator; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; -import org.springframework.util.ObjectUtils; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service("standard") -@AllArgsConstructor -@Slf4j -public class StandardFieldParser implements FieldParser { - - private final FieldConfigDao fieldConfigDao; - private final FieldResolver fieldResolver; - - //数据解析 - @Override - public Map dataParser(RuleConfig ruleConfig, String lightText, String protocolId) { - String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); - ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); - bufferContent.writeBytes(lightText.getBytes(Charset.forName("ISO-8859-1"))); - Map dataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - for (String dataFieldId : dataFieldIds) { - FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(dataFieldId); - if (!ObjectUtils.isEmpty(fieldConfig)) { - dataMap.put(fieldConfig.getFieldName(), String.valueOf(fieldResolver.filedParserManger(bufferContent, fieldConfig, maxFixedPosition))); - } - } - return dataMap; - } - - //数据解析 - @Override - public Map fixDataParser(String protocolId, ByteBuf buffer) { - List dataFieldIdList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Map dataMap = new HashMap<>(); - for (FieldConfig dataField : dataFieldIdList) { - if (!ObjectUtils.isEmpty(dataField.getOrignPosition())) { - Object fieldValue = (Integer) fieldResolver.filedParserManger(buffer, dataField, null); - dataMap.put(dataField.getFieldName(), fieldValue); - } - } - return dataMap; - } - - @Override - public Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf) { - if (ByteBufUtil.hexDump(byteBuf).equals("")) { - return 0; - } - String filterFields = protocolConfig.getTotalLengthFilterField(); - Integer totalLength = 0; - try { - FieldConfig totalFieldConfig = fieldConfigDao.getFieldConfigById(protocolConfig.getTotalLengthId()); - int totalFilterLength = 0; - if (!StringUtils.isEmpty(filterFields)) { - String[] filterFieldList = filterFields.split(","); - for (String filterField : filterFieldList) { - FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(filterField); - //这里都是按字节计算,没有对位进行区分,可能会出现错误 - - // 如果对位有需求,需要进一步跟进 - totalFilterLength += fieldConfig.getOffsetLength(); - } - } - totalLength = (Integer) fieldResolver.filedParserManger(byteBuf, totalFieldConfig, null) + totalFilterLength; - } catch (Exception ex) { - log.error("报文确认分发阶段,获取报文总长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); - } - return totalLength; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer) { - //业务内容 - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - String protocolId = String.valueOf(protocolConfig.getId()); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - //计算固定长度 - Integer fixedLength = calculateLength(fieldConfigList); -// Integer totalLength = this.getTotalLength(protocolConfig, buffer); - //总长度获取 - Integer totalLength = lightText.length(); - //计算固定长度最大长度 - Integer maxFixedPosition = calculatePosition(fieldConfigList); -// buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - //计算数据报文内容 - ByteBuf bizDataFields = buffer.slice(maxFixedPosition-1, (totalLength - fixedLength)); - return bizDataFields; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer) { - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - String protocolId = String.valueOf(protocolConfig.getId()); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer fixedLength = calculateLength(fieldConfigList); -// Integer totalLength = this.getTotalLength(protocolConfig, buffer); - Integer totalLength = lightText.length(); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - ByteBuf fixDataFields = buffer.slice(0, maxFixedPosition); - return fixDataFields; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer) { - String protocolId = String.valueOf(protocolConfig.getId()); - Map fixedPropertyMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer fixedLength = calculateLength(fieldConfigList); - Integer totalLength = this.getTotalLength(protocolConfig, buffer); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - fixedPropertyMap.put("fixedPosition", maxFixedPosition); - fixedPropertyMap.put("totalLength", totalLength); - fixedPropertyMap.put("tailPosition", totalLength - fixedLength + maxFixedPosition); - return fixedPropertyMap; - } - - //分别计算bit和byte长度=> 合并长度 - private Integer calculateLength(List fieldConfigList) { - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (FieldConfig fieldConfig : fieldConfigList) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - Integer fixedLength = bytefixedLength + bitfixedLength / 8; - return fixedLength; - } - - //找到最大值=> 根据最大值计算业务数据下标 - private Integer calculatePosition(List fieldConfigList) { - String rex = "[0-9]+"; - Integer max = -1; - for (FieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOrignPosition()) - && Integer.valueOf(fieldConfig.getOrignPosition()) > max) { - max = Integer.valueOf(fieldConfig.getOrignPosition()); - } - } - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (FieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOrignPosition()) && fieldConfig.getOrignPosition().equals(max)) { - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - } - } - Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; - return maxFixedPosition; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java new file mode 100644 index 0000000..d4ec6c7 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java @@ -0,0 +1,76 @@ +package com.casic.missiles.parser.rule; + +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import org.apache.commons.lang3.StringUtils; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class GenericRuleResolver { + + //根据前置字段的值,找到指定的规则 + //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 + //=>循环判断=>通过规则得到业务字段 + public static RuleConfig machRule(Map fixDataMap, + String ids, + List protocolFieldConfigs, + List ruleConfigs) { + List preRuleConfigList = getPreRuleList(ids, protocolFieldConfigs); + //获取前置规则字段 + final Map metaDataMap = getPreRuleFields(preRuleConfigList, fixDataMap); + //准备固定的字段集合 + Map fixDataFieldMap = getFixDataFieldMap(protocolFieldConfigs); + return RuleResolverCore.doMachRule(ruleConfigs, metaDataMap, fixDataMap, fixDataFieldMap); + } + + private static Map getFixDataFieldMap(List protocolFieldConfigs) { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, ProtocolFieldConfig::getFieldName) + ); + return fixDataFieldMap; + } + + + /** + * 查询前置规则的字段配置 + * + * @param ids + * @return + */ + private static List getPreRuleList(String ids, List protocolFieldConfigs) { + String[] idList = ids.split(","); + Map prepareMaps = new HashMap<>(); + for (String id : idList) { + if (StringUtils.isNotEmpty(id)) { + prepareMaps.put(Long.valueOf(id), ""); + } + } + List preRuleConfigList = protocolFieldConfigs + .stream() + .filter(e -> prepareMaps.containsKey(e.getId())) + .collect(Collectors.toList()); + return preRuleConfigList; + } + + /** + * 获取前置规则解析字段 + */ + private static Map getPreRuleFields(List preRuleFieldConfigList, Map fixDataMap) { + Map ruleFieldMap = new HashMap<>(); + preRuleFieldConfigList.stream() + .forEach( + preRuleFieldConfig -> { + String fieldName = preRuleFieldConfig.getFieldName(); + if (fixDataMap.containsKey(fieldName)) { + ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); + } + } + ); + return ruleFieldMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java new file mode 100644 index 0000000..baae7e8 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -0,0 +1,68 @@ +package com.casic.missiles.parser.rule; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.casic.missiles.pojo.RuleConfig; + +import java.util.*; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleResolverCore { + + + public static RuleConfig doMachRule(List ruleConfigList, Map metaDataMap, + Map fixDataMap, + Map fixDataFieldMap) { + Optional ruleConfigOptional = ruleConfigList.stream() + .filter(ruleConfig -> machRuleConfig( + JSON.parseObject(ruleConfig.getMatchRuleJson(), Map.class), metaDataMap)) + .findFirst(); + if (ObjectUtil.isEmpty(ruleConfigOptional)) { + return null; + } + String[] ruleFields = ruleConfigOptional.get().getDataFieldIds().split(","); + Map ruleMetaDataMap = getRuleFields(ruleFields, fixDataMap, fixDataFieldMap); + //递归选定解析规则,进行规则解析 + if (!ruleConfigOptional.get().getIsFinishMatch().equals("1")) { + //递归选定规则 + doMachRule(ruleConfigList, ruleMetaDataMap, fixDataMap, fixDataFieldMap); + } + return ruleConfigOptional.get(); + } + + + private static Map getRuleFields(String[] preRuleConfigList, Map fixedDataMap, + Map fixedFieldMap) { + Map ruleFieldMap = new HashMap<>(); + for (String preRuleConfigId : preRuleConfigList) { + String fieldName = fixedFieldMap.get(preRuleConfigId); + if (fixedDataMap.containsKey(fieldName)) { + ruleFieldMap.put(fieldName, String.valueOf(fixedDataMap.get(fieldName))); + } + } + return ruleFieldMap; + } + + + //匹配规则配置 + private static Boolean machRuleConfig(Map ruleMap, Map metaDataMap) { + if (ruleMap == null || metaDataMap == null) { + return null; + } + //所有的字段在规则里面必须有有配置 + for (String key : metaDataMap.keySet()) { + if (ruleMap.containsKey(key)) { + if (!ruleMap.get(key).equals(metaDataMap.get(key))) { + return false; + } + } else { + return false; + } + } + return true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java deleted file mode 100644 index 664088d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java +++ /dev/null @@ -1,92 +0,0 @@ -package com.casic.missiles.parser.rule; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.mapper.dao.PreRuleConfigDao; -import com.casic.missiles.mapper.dao.RuleConfigDao; -import lombok.AllArgsConstructor; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.*; -import java.util.stream.Collectors; - -@Service -@AllArgsConstructor -public class RulerProvider { - - private final FieldConfigDao fieldConfigDao; - private final PreRuleConfigDao preRuleConfigDao; - private final RuleConfigDao ruleConfigDao; - - //根据前置字段的值,找到指定的规则 - //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 - //=>循环判断=>通过规则得到业务字段 - public RuleConfig ruleConfig(Map fixDataMap, String protocolId) { - //批量获取规则 - List preRuleConfigList = preRuleConfigDao.getPreRuleList(protocolId); - //获取固定字段 - Map fixFieldMap = getAllFieldMap(protocolId); - //获取前置规则字段 - final String preRuleFields = getPreRuleFields(preRuleConfigList, fixDataMap, fixFieldMap); - List ruleConfigList = ruleConfigDao.getRuleConfigById(protocolId); - Optional ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig ->preRuleFields.equals( ruleConfig.getParseRuleJson())).findFirst(); - //递归选定解析规则,进行规则解析 - while (!ObjectUtil.isEmpty(ruleConfigOptional) && !ruleConfigOptional.get().getIsBizField().equals("1")) { - String ruleFields = getRuleFields(ruleConfigOptional.get().getDataFieldIds().split(","), fixDataMap, fixFieldMap); - ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig -> ruleConfig.getParseRuleJson().equals(ruleFields)).findFirst(); - } - return ruleConfigOptional.get(); - } - - /** - * 获取前置规则解析字段 - */ - private String getPreRuleFields(List preRuleConfigList, Map fixDataMap, Map fixFieldMap) { - Map ruleFieldMap= new HashMap<>(); - preRuleConfigList.stream() - .forEach( - preRuleConfig -> { - String fieldName = fixFieldMap.get(Long.valueOf(preRuleConfig.getRuleFieldId())); - if (fixDataMap.containsKey(fieldName)) { - ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); - } - } - ); - return JSONObject.toJSONString(ruleFieldMap); - } - - private Map getAllFieldMap(String protocolId) { - List fieldList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Map fixFieldMap = fieldList.stream().collect( - Collectors.toMap(FieldConfig::getId, FieldConfig::getFieldName) - ); - return fixFieldMap; - } - - private String getRuleFields(String[] preRuleConfigList, Map fixDataMap, Map fixFieldMap) { - Map ruleFieldMap= new HashMap<>(); - for (String preRuleConfigId : preRuleConfigList) { - String fieldName = fixFieldMap.get(preRuleConfigId); - if (fixDataMap.containsKey(fieldName)) { - ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); - } - } - return JSONObject.toJSONString(ruleFieldMap); - } - - //弃置 - private String ListToString(List ruleFieldList) { - String ruleFields = ""; - for (String ruleField : ruleFieldList) { - ruleFields += ruleField + ","; - } - ruleFields = StringUtils.isEmpty(ruleFields) ? ruleFields : ruleFields.substring(0, ruleFields.length() - 1); - return ruleFields; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java index 6177e10..bfa87a5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java @@ -2,7 +2,7 @@ public interface SafeStrategy { - String decryption(byte[] bytes); + String decryption(String cipher); String encryption(String lightText); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java index 618716c..6236302 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java @@ -9,9 +9,9 @@ //十六进制的字符串转换成字节数组 byte[] bytes = hexStrToBinaryStr(msg); //计算CRC8 - byte crc8 = CRC8(bytes, 0, bytes.length); - String crc8ToStr = "" + Integer.toHexString(0xff & crc8); - return crc8ToStr; +// String crc8ToStr = "" + Integer.toHexString(0xff & crc8); +// return crc8ToStr; + return null; } /** @@ -33,50 +33,5 @@ return bytes; } - /** - * CRC8 校验 多项式 x8+x2+x+1 - * - * @param b - * @param off - * @param len - * @return - */ - public static byte CRC8(final byte[] b, final int off, final int len) { - byte result = 0x00; - for (int i = 0; i < len; i++) { - result = CHECKSUM_TABLE[(result ^ (b[i + off] & 0xFF)) & 0xFF]; - } - return (byte) (result & 0xFFL); - } - - private final static byte[] CHECKSUM_TABLE = {(byte) 0x00, (byte) 0x07, (byte) 0x0e, (byte) 0x09, (byte) 0x1c, (byte) 0x1b, - (byte) 0x12, (byte) 0x15, (byte) 0x38, (byte) 0x3f, (byte) 0x36, (byte) 0x31, (byte) 0x24, (byte) 0x23, (byte) 0x2a, - (byte) 0x2d, (byte) 0x70, (byte) 0x77, (byte) 0x7e, (byte) 0x79, (byte) 0x6c, (byte) 0x6b, (byte) 0x62, (byte) 0x65, - (byte) 0x48, (byte) 0x4f, (byte) 0x46, (byte) 0x41, (byte) 0x54, (byte) 0x53, (byte) 0x5a, (byte) 0x5d, (byte) 0xe0, - (byte) 0xe7, (byte) 0xee, (byte) 0xe9, (byte) 0xfc, (byte) 0xfb, (byte) 0xf2, (byte) 0xf5, (byte) 0xd8, (byte) 0xdf, - (byte) 0xd6, (byte) 0xd1, (byte) 0xc4, (byte) 0xc3, (byte) 0xca, (byte) 0xcd, (byte) 0x90, (byte) 0x97, (byte) 0x9e, - (byte) 0x99, (byte) 0x8c, (byte) 0x8b, (byte) 0x82, (byte) 0x85, (byte) 0xa8, (byte) 0xaf, (byte) 0xa6, (byte) 0xa1, - (byte) 0xb4, (byte) 0xb3, (byte) 0xba, (byte) 0xbd, (byte) 0xc7, (byte) 0xc0, (byte) 0xc9, (byte) 0xce, (byte) 0xdb, - (byte) 0xdc, (byte) 0xd5, (byte) 0xd2, (byte) 0xff, (byte) 0xf8, (byte) 0xf1, (byte) 0xf6, (byte) 0xe3, (byte) 0xe4, - (byte) 0xed, (byte) 0xea, (byte) 0xb7, (byte) 0xb0, (byte) 0xb9, (byte) 0xbe, (byte) 0xab, (byte) 0xac, (byte) 0xa5, - (byte) 0xa2, (byte) 0x8f, (byte) 0x88, (byte) 0x81, (byte) 0x86, (byte) 0x93, (byte) 0x94, (byte) 0x9d, (byte) 0x9a, - (byte) 0x27, (byte) 0x20, (byte) 0x29, (byte) 0x2e, (byte) 0x3b, (byte) 0x3c, (byte) 0x35, (byte) 0x32, (byte) 0x1f, - (byte) 0x18, (byte) 0x11, (byte) 0x16, (byte) 0x03, (byte) 0x04, (byte) 0x0d, (byte) 0x0a, (byte) 0x57, (byte) 0x50, - (byte) 0x59, (byte) 0x5e, (byte) 0x4b, (byte) 0x4c, (byte) 0x45, (byte) 0x42, (byte) 0x6f, (byte) 0x68, (byte) 0x61, - (byte) 0x66, (byte) 0x73, (byte) 0x74, (byte) 0x7d, (byte) 0x7a, (byte) 0x89, (byte) 0x8e, (byte) 0x87, (byte) 0x80, - (byte) 0x95, (byte) 0x92, (byte) 0x9b, (byte) 0x9c, (byte) 0xb1, (byte) 0xb6, (byte) 0xbf, (byte) 0xb8, (byte) 0xad, - (byte) 0xaa, (byte) 0xa3, (byte) 0xa4, (byte) 0xf9, (byte) 0xfe, (byte) 0xf7, (byte) 0xf0, (byte) 0xe5, (byte) 0xe2, - (byte) 0xeb, (byte) 0xec, (byte) 0xc1, (byte) 0xc6, (byte) 0xcf, (byte) 0xc8, (byte) 0xdd, (byte) 0xda, (byte) 0xd3, - (byte) 0xd4, (byte) 0x69, (byte) 0x6e, (byte) 0x67, (byte) 0x60, (byte) 0x75, (byte) 0x72, (byte) 0x7b, (byte) 0x7c, - (byte) 0x51, (byte) 0x56, (byte) 0x5f, (byte) 0x58, (byte) 0x4d, (byte) 0x4a, (byte) 0x43, (byte) 0x44, (byte) 0x19, - (byte) 0x1e, (byte) 0x17, (byte) 0x10, (byte) 0x05, (byte) 0x02, (byte) 0x0b, (byte) 0x0c, (byte) 0x21, (byte) 0x26, - (byte) 0x2f, (byte) 0x28, (byte) 0x3d, (byte) 0x3a, (byte) 0x33, (byte) 0x34, (byte) 0x4e, (byte) 0x49, (byte) 0x40, - (byte) 0x47, (byte) 0x52, (byte) 0x55, (byte) 0x5c, (byte) 0x5b, (byte) 0x76, (byte) 0x71, (byte) 0x78, (byte) 0x7f, - (byte) 0x6a, (byte) 0x6d, (byte) 0x64, (byte) 0x63, (byte) 0x3e, (byte) 0x39, (byte) 0x30, (byte) 0x37, (byte) 0x22, - (byte) 0x25, (byte) 0x2c, (byte) 0x2b, (byte) 0x06, (byte) 0x01, (byte) 0x08, (byte) 0x0f, (byte) 0x1a, (byte) 0x1d, - (byte) 0x14, (byte) 0x13, (byte) 0xae, (byte) 0xa9, (byte) 0xa0, (byte) 0xa7, (byte) 0xb2, (byte) 0xb5, (byte) 0xbc, - (byte) 0xbb, (byte) 0x96, (byte) 0x91, (byte) 0x98, (byte) 0x9f, (byte) 0x8a, (byte) 0x8d, (byte) 0x84, (byte) 0x83, - (byte) 0xde, (byte) 0xd9, (byte) 0xd0, (byte) 0xd7, (byte) 0xc2, (byte) 0xc5, (byte) 0xcc, (byte) 0xcb, (byte) 0xe6, - (byte) 0xe1, (byte) 0xe8, (byte) 0xef, (byte) 0xfa, (byte) 0xfd, (byte) 0xf4, (byte) 0xf3}; } \ No newline at end of file diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java index 27c2838..6e078a3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java @@ -1,9 +1,6 @@ package com.casic.missiles.parser.safe.impl; -import cn.hutool.core.util.CharsetUtil; -import cn.hutool.crypto.symmetric.SM4; -import cn.hutool.crypto.symmetric.SymmetricCrypto; - +import com.casic.missiles.parser.safe.SafeStrategy; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; @@ -11,19 +8,44 @@ import org.bouncycastle.crypto.engines.SM4Engine; import org.bouncycastle.crypto.params.KeyParameter; import org.bouncycastle.util.encoders.Hex; - -import static cn.hutool.crypto.Mode.ECB; -import static cn.hutool.crypto.Padding.NoPadding; +import org.springframework.stereotype.Component; /** * SM4算法工具类 */ @Slf4j -public class Sm4 { +@Component("sm4") +public class Sm4 implements SafeStrategy { //加解密的字节快大小 public static final int BlockSize = 16; + @Override + public String decryption(String cipher) { + byte[] keyByte = { + 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 + }; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(keyByte); + byte[] in = Hex.decode(cipher); + byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); + String plain = EcbDecrypt(in, keyBytes); + return plain; + } + + @Override + public String encryption(String cipher) { + byte[] keyByte = { + 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 + }; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(keyByte); + byte[] in = Hex.decode(cipher); + byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); + String plain = EcbDecrypt(in, keyBytes); + return plain; + } + /** * SM4ECB加密算法,对内 * @@ -32,8 +54,6 @@ * @return */ private static byte[] ecb_encrypt(byte[] in, byte[] keyBytes) { - - SM4Engine sm4Engine = new SM4Engine(); sm4Engine.init(true, new KeyParameter(keyBytes)); byte[] out = new byte[in.length]; @@ -58,27 +78,6 @@ return cipher; } - - /** - * hutool 解密SM4 - * - * @param encodeContent - * @return - */ - public static String decode(String encodeContent) { - String key = "24ad182507479a5da3ad94d9d78ea203"; - try { - SymmetricCrypto sm4 = new SM4(ECB, NoPadding, key.getBytes()); - String decryptStr = sm4.decryptStr(encodeContent, CharsetUtil.CHARSET_UTF_8); - return decryptStr; - } catch (Exception e) { - e.printStackTrace(); - log.error("SM4解密失败"); - } - return null; - } - - /** * SM4的ECB加密算法 * @@ -129,20 +128,6 @@ return plain; } - /** - * SM4的ECB解密算法 - * - * @param cipher 输入的密文字符串 - * @param key 密钥 - * @return - */ - public static String EcbDecrypt(String cipher, String key) { - byte[] in = Hex.decode(cipher); - byte[] keyBytes = Hex.decode(key); - - String plain = EcbDecrypt(in, keyBytes); - return plain; - } /** * 主函数 @@ -151,28 +136,24 @@ */ public static void main(String[] args) { byte[] ciphertext = { + 0x4B, (byte) 0x8C, (byte) 0x9D, 0x08, (byte) 0xE4, (byte) 0xD3, 0x64, 0x42, (byte) 0xB9, (byte) 0xA5, (byte) 0xFE, (byte) 0xCD, (byte) 0x91, 0x1B, 0x38, (byte) 0xAC, (byte) 0xE9, 0x1C, (byte) 0xCD, 0x53, 0x02, (byte) 0xD7, 0x0C, (byte) 0x9B, (byte) 0x96, 0x30, 0x62, (byte) 0xE8, (byte) 0xFB, (byte) 0xEF, (byte) 0xB9, (byte) 0xFF, (byte) 0xDE, 0x19, (byte) 0x80, 0x35, 0x3E, (byte) 0x90, 0x4F, 0x2F, 0x12, 0x2B, 0x19, (byte) 0x8B, 0x6C, 0x7A, (byte) 0x85, (byte) 0xA1, (byte) 0xB1, (byte) 0x86, (byte) 0xA3, 0x7A, 0x46, 0x0C, 0x2F, (byte) 0x94, 0x4F, 0x7F, 0x2C, 0x56, 0x14, (byte) 0xF3, (byte) 0x89, (byte) 0xC3, - 0x3F, 0x20, (byte) 0xF9, (byte) 0x87, (byte) 0xA1, 0x60, (byte) 0xD9, (byte) 0xA8, (byte) 0xFD, (byte) 0xD7, (byte) 0x9B, 0x4B, 0x26, 0x06, 0x30, 0x44}; + 0x3F, 0x20, (byte) 0xF9, (byte) 0x87, (byte) 0xA1, 0x60, (byte) 0xD9, (byte) 0xA8, (byte) 0xFD, (byte) 0xD7, (byte) 0x9B, 0x4B, 0x26, 0x06, 0x30, 0x44 + }; ByteBuf in = ByteBufAllocator.DEFAULT.heapBuffer(); in.writeBytes(ciphertext); - byte[] keyByte = { 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 }; ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); - key.writeBytes(ciphertext); - String resCipherData = decode(ByteBufUtil.hexDump(in)); - ByteBuf out = ByteBufAllocator.DEFAULT.heapBuffer(); -// out.writeBytes(resCipherData); -// System.out.println(hexBytes); - System.out.println(resCipherData.toString()); -// String resPlainData = EcbDecrypt(resCipherData, key); -// System.out.println("原始明文:" + data); -// System.out.println("解密后明文:" + resPlainData); + key.writeBytes(keyByte); +// String resCipherData = EcbDecrypt(ByteBufUtil.hexDump(in), ByteBufUtil.hexDump(key)); +// System.out.println(resCipherData); } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java index 1395a51..ac5f957 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java @@ -1,7 +1,7 @@ package com.casic.missiles.parser.safe.impl; import io.netty.buffer.ByteBufUtil; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** *

@@ -14,9 +14,8 @@ * @author hyl * @version v1.0: Tea.java, v 0.1 2021/3/12 13:48 $ */ -@Service("tea") -///tea算法类 - +//tea算法类 +@Component("tea") public class Tea { public static byte[] MyTea_Encrypt(byte[] MyTeaContent, int ByteLen, byte[] MyTeakey) { @@ -99,7 +98,6 @@ // for(int i32Index = 0; i32Index < 8; i32Index++) { // System.out.print("0x" + Integer.toHexString(MyContent[i32Index]) + " "); // } - // System.out.println("密钥为:"); // for(int i32Index = 0; i32Index < 16; i32Index++) { // System.out.print("0x" + Integer.toHexString(MyKeys[i32Index]) + " "); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java index bdd0721..bd1516a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java @@ -3,7 +3,7 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.parser.sender.DataSubscribeProvider; import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponents; import org.springframework.web.util.UriComponentsBuilder; @@ -12,7 +12,7 @@ import java.util.Collections; import java.util.Map; -@Service("functionCallback") +@Component("functionCallback") public class FunctionCallback implements DataSubscribeProvider { @Resource diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java index 0b44fb9..7526de2 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.Map; -@Service("middleware") +@Component("middleware") public class MiddlewareSubscribe implements DataSubscribeProvider { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java index 5dcee3f..e2f1192 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.Map; -@Service("nosql") +@Component("nosql") public class NoSqlSubscribe implements DataSubscribeProvider { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java b/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java new file mode 100644 index 0000000..81a5324 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java @@ -0,0 +1,86 @@ +package com.casic.missiles.pojo; + +import lombok.Data; + +/** + * 协议 + */ +@Data +public class Msg { + + /** + * 前导码 + */ + private String preamble; + + /** + * 版本号 + */ + private String version; + + /** + * 内容长度 + */ + private int leng; + + /** + * 设备ID + */ + private String deviceId; + + /** + * 通讯方式 + */ + private Integer connType; + + /** + * 加密方式 + */ + private Integer encryType; + + /** + * 目标地址 + */ + private String destAddr; + + /** + * PDUType + */ + private String PDUType; + + /** + * 操作类型 + */ + private Integer operateType; + + /** + * 传输控制位 PDUType.bit7=0时,表示存在后续的访问;当PDUType.bit7=1时,表示无后续的访问。 + */ + private Integer transControlFlag; + + /** + * 设备类型 + */ + private Integer deviceType; + + /** + * 序号 + */ + private Integer seq; + + /** + * tagList + */ + private String tagList; + + /** + * OidList + */ + private String OidList; + + /** + * CRC + */ + private String CRC; + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java index 40a5265..97cc984 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java @@ -40,7 +40,7 @@ String httpContent = msg.toString(Charset.defaultCharset()); log.info(" String : " + msg.toString(Charset.defaultCharset())); String majorContent = httpContent.substring(httpContent.indexOf("{"), httpContent.lastIndexOf("}") + 1); - String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("serviceData")).get("Value")); + String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("RegistryData")).get("Value")); log.info("----------------------------------" + values); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); bufferContent.writeBytes(values.getBytes(Charset.forName("ISO-8859-1"))); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java index 1b132a7..e3ced4b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java @@ -35,7 +35,7 @@ String httpContent = msg.toString(Charset.defaultCharset()); log.info(" String : " + msg.toString(Charset.defaultCharset())); String majorContent = httpContent.substring(httpContent.indexOf("{"), httpContent.lastIndexOf("}") + 1); - String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("serviceData")).get("Value")); + String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("RegistryData")).get("Value")); log.info("----------------------------------" + values); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); bufferContent.writeBytes(values.getBytes(Charset.forName("ISO-8859-1"))); diff --git a/sensorhub-core/src/main/resources/application.properties b/sensorhub-core/src/main/resources/application.properties deleted file mode 100644 index 8b13789..0000000 --- a/sensorhub-core/src/main/resources/application.properties +++ /dev/null @@ -1 +0,0 @@ - diff --git a/sensorhub-core/src/main/resources/config/application-dev.yml b/sensorhub-core/src/main/resources/config/application-dev.yml index 4f897a8..dcc4c2d 100644 --- a/sensorhub-core/src/main/resources/config/application-dev.yml +++ b/sensorhub-core/src/main/resources/config/application-dev.yml @@ -4,9 +4,9 @@ spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true + url: jdbc:mysql://127.0.0.1:3306/sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true username: root - password: Casic203 + password: root session: store-type: redis redis: diff --git a/sensorhub-core/src/main/resources/config/application.yml b/sensorhub-core/src/main/resources/config/application.yml index ae89f9d..7965da1 100644 --- a/sensorhub-core/src/main/resources/config/application.yml +++ b/sensorhub-core/src/main/resources/config/application.yml @@ -30,6 +30,13 @@ port: 6379 password: ew5T4K3#203lwh config-prefix: 'Casic:' +#代码生成器配置 +code: + generate: + #作者 + author: cz + #待生成对象表名 + table-name: bussiness_field_config,combined_field_config sensorhub: config: port: 7091 diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java index 608af3a..32cc8a4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java @@ -2,48 +2,47 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.delivery.decorator.ByteDecorator; +import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @AllArgsConstructor public class FieldDecoratorManger { - private final RuleDictDao ruleDictDao; + private final RuleConfigRegistry ruleDictDao; // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 // (1)静态的业务字段是字典里面可以配置的 // (2)动态的业务字段是通过规则生成的 public String contentMerge(String ruleJson, String sceneConent, String dynamicContent) { - List ruleDictList = ruleDictDao.getRuleDictConfig(); - Map ruleDictMap = ruleDictList.stream().collect( - Collectors.toMap(RuleDict::getId, e -> e)); - List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); - for (Map ruleMap : ruleMapList) { - String ruleType = String.valueOf(ruleMap.get("ruleType")); - ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); - NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); - byteDecorator.nodeDecoratorRule(nodeDecoratorParm); - } +// List ruleDictList = ruleDictDao.getRuleDictConfig(); +// Map ruleDictMap = ruleDictList.stream().collect( +// Collectors.toMap(RuleDict::getId, e -> e)); +// List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); +// for (Map ruleMap : ruleMapList) { +// String ruleType = String.valueOf(ruleMap.get("ruleType")); +// ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); +// NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); +// byteDecorator.nodeDecoratorRule(nodeDecoratorParm); +// } return null; } - - private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { - NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() - .contents(sceneConent) - .dynamicContent(dynamicContent) - .ruletypeId(ruletypeId) - .ruleDictMap(ruleDictMap) - .build(); - return nodeDecoratorParm; - } +// +// private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { +// NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() +// .contents(sceneConent) +// .dynamicContent(dynamicContent) +// .ruletypeId(ruletypeId) +// .ruleDictMap(ruleDictMap) +// .build(); +// return nodeDecoratorParm; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java index 652970c..b204ac3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java @@ -1,56 +1,56 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@AllArgsConstructor -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", - JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Component; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Component("logicalDecorator") +//@AllArgsConstructor +//@Slf4j +//public class LogicalShiftDecorator implements ByteDecorator { +// +//// private final FieldRuleEngineMapper fieldRuleEngineMapper; +//// +//// //字节位移 +//// @Override +//// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +//// String logicalValue = ""; +//// RuleEvaluator fieldRuleEngine = new RuleEvaluator(); +//// try { +//// Map env2 = new HashMap(); +//// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +//// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +//// for (String contentId : contentIdList) { +//// RuleDict ruleDict = ruleDictMap.get(contentId); +//// if (ruleDict.getCode().contains("#")) { +//// //使用动态的值 +//// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +//// } +//// env2.put(ruleDict.getName(), ruleDict.getCode()); +//// } +//// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +//// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +//// return null; +//// } +//// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +//// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +//// return values; +//// } catch (Exception ex) { +//// log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", +//// JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +//// return null; +//// } +//// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java index 346468f..822fead 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@AllArgsConstructor -@Slf4j -public class OperationDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("optionDecorator") +//@AllArgsConstructor +//@Slf4j +//public class OperationDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //混合运算,有常量或者乘除的缩放 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java index 50fb0a7..7a8bccb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@AllArgsConstructor -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +////精度计算 +//@AllArgsConstructor +//@Registry("precisionDecorator") +//@Slf4j +//public class PrecisionDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java index da39235..27f9cc7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java @@ -1,54 +1,53 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@AllArgsConstructor -@Slf4j -public class RuleDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("ruleDecorator") +//@AllArgsConstructor +//@Slf4j +//public class RuleDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //吃我一套正则表达式 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (Exception ex) { +// log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java index 7f5cbf3..c043f97 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java @@ -2,6 +2,6 @@ import java.util.Map; -public interface ComandeEventService { +public interface ComandeEventService{ Map loadComandeEventConfig(String protocolId,String scene); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java index 476ad84..aaf1837 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java @@ -2,46 +2,46 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.dao.CommandEventDao; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @Slf4j @AllArgsConstructor -public class ComandeEventServiceImpl implements ComandeEventService { +public class ComandeEventServiceImpl implements ComandeEventRegistry { - private final CommandEventDao commandEventDao; + // private final CommandEventDao commandEventDao; // 加密bean 固定字段出现变化的字段解析,业务字段的有序内容 @Override - public Map loadComandeEventConfig(String protocolId,String sceneName) { - CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); - if (ObjectUtil.isEmpty(commandEventConfig)) { - log.error("协议{},没有配置成功接收回复配置,清排查原因"); - return null; - } - String replyJson = commandEventConfig.getReplyContentJson(); - List> replyMapList = JSONArray.parseObject(replyJson, List.class); - List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); - Map fixMap = fixList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); - List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) - .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) - .collect(Collectors.toList()); - Map commandConfigMap = new HashMap<>(); - commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); - commandConfigMap.put("fixContent", fixMap); - commandConfigMap.put("bizContent", contentList); - return commandConfigMap; + public Map loadComandeEventConfig(String protocolId, String sceneName) { +// CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); +// if (ObjectUtil.isEmpty(commandEventConfig)) { +// log.error("协议{},没有配置成功接收回复配置,清排查原因"); +// return null; +// } +// String replyJson = commandEventConfig.getReplyContentJson(); +// List> replyMapList = JSONArray.parseObject(replyJson, List.class); +// List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); +// Map fixMap = fixList.stream() +// .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); +// List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) +// .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) +// .collect(Collectors.toList()); +// Map commandConfigMap = new HashMap<>(); +// commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); +// commandConfigMap.put("fixContent", fixMap); +// commandConfigMap.put("bizContent", contentList); +// return commandConfigMap; + return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 128b09d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java deleted file mode 100644 index 4016b0b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface DatagramEventMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java deleted file mode 100644 index 597c306..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.apache.ibatis.annotations.Mapper; - -public interface FieldConfigMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java deleted file mode 100644 index a31680a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.PreRuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface PreRuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java deleted file mode 100644 index 9060a69..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface ProtocolConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java deleted file mode 100644 index 6fa6936..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java deleted file mode 100644 index 582a705..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleDict; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleDictMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java deleted file mode 100644 index 6e302c8..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.CommandEventMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Optional; - -@Component -public class CommandEventDao { - - @Resource - private CommandEventMapper commandEventMapper; - - public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId) - .eq("scene", sceneName) - .eq("enabled", 1); - List commandEventConfig = commandEventMapper.selectList(queryWrapper); - Optional optionalEventConfig = commandEventConfig.stream().findFirst(); - return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java deleted file mode 100644 index 9137e4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.FieldConfigMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class FieldConfigDao { - - @Resource - private FieldConfigMapper fieldConfigMapper; - - public FieldConfig getFieldConfigById(String fieldId) { - FieldConfig fieldConfig = fieldConfigMapper.selectById(fieldId); - return fieldConfig; - } - - public List getFieldConfigs(String protocolId,Integer isFixed) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",isFixed); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - - public List getStorageFieldConfig(String protocolId) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",1) - .eq("is_storage",1); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java deleted file mode 100644 index 67bff6b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.mapper.PreRuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class PreRuleConfigDao { - - @Resource - private PreRuleConfigMapper preRuleConfigMapper; - - public List getPreRuleList(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return preRuleConfigMapper.selectList(queryWrapper); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java deleted file mode 100644 index d69ea85..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.RuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleConfigDao { - - @Resource - private RuleConfigMapper ruleConfigMapper; - - public RuleConfig getNextRuleConfig(String ruleFields) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("parse_rule_json", ruleFields); - return ruleConfigMapper.selectOne(queryWrapper); - } - - - public List getRuleConfigById(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return ruleConfigMapper.selectList(queryWrapper); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java deleted file mode 100644 index 932c185..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.RuleDictMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleDictDao { - - @Resource - private RuleDictMapper ruleDictMapper; - - public List getRuleDictConfig() { - List ruleDictList = ruleDictMapper.selectList(null); - return ruleDictList; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java index 9f9e279..43bc4d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java @@ -10,20 +10,15 @@ import io.netty.channel.socket.nio.NioServerSocketChannel; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import javax.annotation.PreDestroy; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static cn.hutool.core.util.ClassUtil.getClasses; /** * SensorhubServer netty服务端 */ @Slf4j -@Service +@Component public class SensorhubServer { /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java index 2c79ff5..9a28c36 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java @@ -11,13 +11,13 @@ import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioSocketChannel; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClient 客户端 */ @Slf4j -@Service +@Registry public final class SensorhubClient { public static void main(String[] args) throws Exception { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java index 9774be0..477c3f7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java @@ -6,12 +6,12 @@ import io.netty.channel.socket.SocketChannel; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientChannelInitialHandler */ -@Service +@Registry public class SensorhubClientChannelInitialHandler extends ChannelInitializer { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java index 346f4b3..73560e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java @@ -5,13 +5,13 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientHandler */ @Slf4j -@Service +@Registry public class SensorhubClientHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java index 5c1c6f2..d990af5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java @@ -4,12 +4,12 @@ import com.casic.missiles.pojo.Msg; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** * SensorhubServerHandler */ -@Service +@Component public class SensorhubServerHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 67283ae..af3172c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,41 +1,37 @@ package com.casic.missiles.parser; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultProtocolConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.*; +import com.casic.missiles.registry.FieldConfigRegistry; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; -import java.nio.charset.Charset; import java.util.HashMap; import java.util.List; import java.util.Map; -@Service("genericProtocolParser") +/** + * @author + */ +@Component("genericProtocolParser") @Slf4j -@AllArgsConstructor +@RequiredArgsConstructor public class GenericProtocolParser implements ProtocolParser { - private final LeadingCodeMatcher leadingCodeMatcher; private final List frameStructDispenserList; - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorInstanceSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; // 匹配首字母前导码=> 帧结构匹配前导码=> // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 @@ -44,18 +40,19 @@ public Boolean doParseProtocol(ByteBuf byteBuf) { String protocolContent = ByteBufUtil.hexDump(byteBuf); //匹配前导码 - List preCodeConfigs = leadingCodeMatcher.matchLeadingCode(protocolContent); + List preCodeConfigs = LeadingCodeMatcher.matchFrameLeadingCode(protocolContent); //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 if (preCodeConfigs.size() == 0) { - return rematch(byteBuf,protocolContent); + return rematch(byteBuf, protocolContent); } - //暂时先取第一个 + //暂时先取第一个,提升速度,使用享元模式, 减少类的创建销毁与构建 ProtocolConfig protocolConfig = preCodeConfigs.get(0); + AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); ByteBuf wholeDatagramByte = null; //通过匹配帧结构获取完整的数据包 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, preCodeConfigs.get(0))) != null) { + if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, protocolFactory)) != null) { break; } } @@ -68,76 +65,78 @@ * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 */ - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId, wholeDatagramByte); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap, protocolId); - //选取规则对应的流程实例 - DatagramEventConfig datagramEventConfig = processorInstanceSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); + //进行规则字段解析,进行匹配规则 + RuleConfig ruleConfig = getRuleConfig(protocolFactory, wholeDatagramByte); + if (ruleConfig == null) { + return false; + } //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, wholeDatagramByte); + ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte); + //以下进行业务的规则解析,同时选定流程实例 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); + DatagramEventProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain, + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText, protocolId); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain); //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); + datagramEventProvider.storeData(bizDataMap); return true; } - private Boolean rematch(ByteBuf byteBuf,String protocolContent) { + /** + * 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 + */ + private Boolean rematch(ByteBuf byteBuf, String protocolContent) { //重置位判断 byteBuf.resetReaderIndex(); //判断重置是否前移,如果没有前移,则直接判为匹配失败 if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { return false; } else { + //递归执行 return doParseProtocol(byteBuf); } } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; + //获取匹配规则->匹配规则 + private RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + //取出其中参与逻辑provider并判空 + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); + String rulePrepareFields = protocolConfig.getRulePrepareFields(); + //固定字段 + if (StringUtils.isNotEmpty(rulePrepareFields)) { + //获取统一固定字段解析 + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + //获取该协议的字段配置,用于协议规则匹配 + List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); + //获取规则 + RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, + rulePrepareFields, protocolFieldConfigs); + return ruleConfig; + } + return null; } - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + //数据构建,获取固定字段的store和业务字段store + private Map buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + Map bizDataMap = new HashMap<>(); + Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); + Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); + bizDataMap.putAll(ruleStoreObjectMap); + bizDataMap.putAll(protocolStoreObjectMap); return bizDataMap; } - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java index 8a46e32..16ce2e5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java @@ -3,6 +3,7 @@ import io.netty.buffer.ByteBuf; public interface ProtocolParser { + Boolean doParseProtocol(ByteBuf byteBuf); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java new file mode 100644 index 0000000..f7814af --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java @@ -0,0 +1,35 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.ProtocolConfigProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.ProtocolConfig; + +/** + * 存放基本协议的的加载信息 + */ +public class AbstractProtocolConfigFactory { + private final ProtocolConfigProvider protocolConfigProvider; + private final ProtocolFieldConfigProvider protocolFieldConfigProvider; + private final RuleConfigProvider ruleConfigProvider; + + public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { + this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); + this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); + this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); + } + + public ProtocolConfigProvider getProtocolConfigProvider() { + return protocolConfigProvider; + } + + public ProtocolFieldConfigProvider getProtocolFieldConfigProvider() { + return protocolFieldConfigProvider; + } + + public RuleConfigProvider getRuleConfigProvider() { + return ruleConfigProvider; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java new file mode 100644 index 0000000..6e36147 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java @@ -0,0 +1,57 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.CombinedFieldConfigProvider; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.FieldConfigProvider; +import com.casic.missiles.parser.provider.FieldRuleConfigProvider; + +/** + * 存放规则相关的的的加载信息 + */ +public class AbstractRuleConfigFactory { + + /** + * 处理字节 + */ + private final FieldConfigProvider fieldConfigProvider; + /** + * 处理组合字节解析的解码器 + */ + private final CombinedFieldConfigProvider combinedFieldConfigProvider; + /** + * 处理负责字节解析的规则配置 + */ + private final FieldRuleConfigProvider fieldRuleConfigProvider; + /** + * 处理实例流程 + */ + private final DatagramEventProvider datagramEventProvider; + + + public AbstractRuleConfigFactory(Long ruleId) { + this.fieldConfigProvider = new FieldConfigProvider(ruleId); + this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); + this.fieldRuleConfigProvider = new FieldRuleConfigProvider(ruleId); + this.datagramEventProvider = new DatagramEventProvider(ruleId); + } + + public FieldConfigProvider getFieldConfigProvider() { + return fieldConfigProvider; + } + + public CombinedFieldConfigProvider getCombinedFieldConfigProvider() { + return combinedFieldConfigProvider; + } + + public FieldRuleConfigProvider getFieldRuleConfigProvider() { + return fieldRuleConfigProvider; + } + + public DatagramEventProvider getDatagramEventProvider() { + return datagramEventProvider; + } + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java deleted file mode 100644 index 6e1719a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.factory; - - -import com.casic.missiles.pojo.ProtocolConfig; - -import java.util.List; - -/** - * 数据库访问优化(暂时未做) - *

- * 1、初始化协议解析配置,并存放到处存放缓存,对协议基本配置进行管理 - * 2、其中流程中所有的配置都经过此类进行管理,进行调用获取,增强解析速度 - */ -public interface DatagramFactory { - - /** - * 初始化 - */ - List datagramInit(); - - /** - * 根据前导码配置匹配,模糊匹配获取所有的报文项 - */ - List match(); - - /** - * 根据前导码匹配,返回报文项 - */ - List filer(); - - /** - * 保证数据的唯一性选择器 - */ - List selectOne(); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java new file mode 100644 index 0000000..87444a0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java @@ -0,0 +1,18 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +import java.util.List; + +/** + * 直接用,还是边用边创建 + */ +public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { + + + public DefaultProtocolConfigFactory(ProtocolConfig protocolConfig) { + super(protocolConfig); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java new file mode 100644 index 0000000..cce0c7c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java @@ -0,0 +1,12 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; + +public class DefaultRuleFactory extends AbstractRuleConfigFactory { + + public DefaultRuleFactory(Long ruleId) { + super(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java deleted file mode 100644 index 9ee97e0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.casic.missiles.parser.instance; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service -@Slf4j -@AllArgsConstructor -public class GeneralProcessor { - - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; - - /** - * 统一固定字段解析=>进行规则的查询的判断 - * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 - * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 - */ - @Deprecated - public boolean parseWholeDatagram(ByteBuf buffer, ProtocolConfig protocolConfig) { - try { - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap,protocolId); - //选取规则对应的流程= - DatagramEventConfig datagramEventConfig = processorSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); - //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); - //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); - //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); - //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); - //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); - return true; - } catch (Exception ex) { - log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", - ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); - return false; - } - } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; - } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); - } - - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); - return bizDataMap; - } - - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java index 25e7ad8..6a5777e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java @@ -1,23 +1,31 @@ package com.casic.missiles.parser.instance.impl; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.mapper.DatagramEventMapper; import com.casic.missiles.pojo.DatagramEventConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.SpringContextUtil; -@Service -@AllArgsConstructor +import java.util.List; +import java.util.Optional; + +/** + * @author cz + * + */ public class DefaultProcessorInstanceSelector implements ProcessorInstanceSelector { - private final DatagramEventMapper datagramEventMapper; + private static List datagramEventConfigs; + + static { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + datagramEventConfigs = datagramEventRegistry.getDatagramEventList(); + } @Override public DatagramEventConfig getProcessorInstance(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("rule_id", protocolId); - return datagramEventMapper.selectOne(queryWrapper); + Optional optionalSelectInstance = datagramEventConfigs.stream() + .filter(e -> e.getId().equals(protocolId)).limit(1).findFirst(); + return optionalSelectInstance.isPresent() ? optionalSelectInstance.get() : null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a778671..7b56a43 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,16 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import io.netty.buffer.ByteBuf; /** - * 分析匹配情况 - * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 - * 2、匹配不成功,有后续帧,可以进行下次匹配。 - * 3、匹配不成功,无后续帧,可以进行丢弃。 + * 分析匹配情况 + * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 + * 2、匹配不成功,有后续帧,可以进行下次匹配。 + * 3、匹配不成功,无后续帧,可以进行丢弃。 */ -public interface FrameStructMatcher{ +public interface FrameStructMatcher { - ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig); + ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 05320ab..8ebea78 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,23 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.ProtocolConfigMapper; +import com.casic.missiles.parser.provider.ProtocolConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Component; import java.util.List; import java.util.stream.Collectors; -@Component -@AllArgsConstructor public class LeadingCodeMatcher { - private final ProtocolConfigMapper protocolMapper; - //** 1、首字母匹配前导码, // 2、以匹配出的前导码是否在报文中条件进行前导码的匹配二次筛选 - public List matchLeadingCode(String protocolContent){ + public static List matchFrameLeadingCode(String protocolContent){ List initialConfigs = initialMatch(protocolContent); List preCodeConfigs = initialConfigs.stream() .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) @@ -26,13 +19,16 @@ } //初始化匹配前导码内容 - private List initialMatch(String protocolContent) { - String protocolStr = protocolContent.charAt(0) + ""; - QueryWrapper queryWrapper = new QueryWrapper() - .likeRight("pre_fix", protocolStr); - List protocolConfigList = protocolMapper.selectList(queryWrapper); - return protocolConfigList; + private static List initialMatch(String protocolContent) { + String firstFrameChar = protocolContent.charAt(0) + ""; + ProtocolConfigProvider protocolConfigProvider=new ProtocolConfigProvider(firstFrameChar); + return protocolConfigProvider.getMatchList(); } + + + + + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index cf2113d..e915877 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -1,32 +1,35 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(0) -@Service +@Component public class FrameLengthMatcher implements FrameStructMatcher { - @Autowired - private FieldParser fieldParser; - //超过长度 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { String dataGramContent = ByteBufUtil.hexDump(byteBuf); - if (StringUtils.isEmpty(protocolConfig.getUnpackId()) && StringUtils.isEmpty(protocolConfig.getTailStr())) { - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + //当不存在结尾标志和拆包标志,可以直接使用长度进行匹配 + if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { if (dataGramContent.length() >= totalLength) {//等于长度返回true,超出长度,切断 - ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, protocolConfig, totalLength); + ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, totalLength); return wholeDatagramByte; } else { //读的标志位前移舍弃 @@ -38,7 +41,7 @@ return null; } - private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, Integer totalLength) { byteBuf.readBytes(totalLength); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, totalLength - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 2bfc213..d527ad0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; @@ -13,7 +13,7 @@ import lombok.AllArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.nio.charset.Charset; import java.util.Map; @@ -22,32 +22,30 @@ * 后续标志验证 */ @Order(1) -@Service +@Component @AllArgsConstructor -public class FrameMarkMatcher implements FrameStructMatcher { - - private final FieldConfigDao fieldConfigDao; - private final FieldParser fieldParser; - private final FieldResolver fieldResolverManger; +public class FrameMarkMatcher implements FrameStructMatcher, FixedPropertyEnum { //帧后续标志=>结束,进行帧的重组=>有后续,1、帧移位判别 2、继续接收帧 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig UnpackConfig = StringUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getUnpackId()); - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); - Integer upback = 0; + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); ByteBuf mergeWholeFrameByte = null; - if (!ObjectUtil.isEmpty(UnpackConfig)) { - while (hasNextFullFrame(byteBuf, protocolConfig)) { - upback = (Integer) fieldResolverManger.filedParserManger(byteBuf, UnpackConfig, null); + if (!ObjectUtil.isEmpty(unpackFlag)) { + while (hasNextFullFrame(byteBuf, protocolConfig, protocolFieldConfigProvider)) { //是否存在后续位 - if (upback == 1) {//使用esayRule + if (unpackFlag == 1) {//使用esayRule //表示可以截取 - mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolConfig, totalLength); + mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolFieldConfigProvider, protocolConfig); return mergeWholeFrameByte; } else { - byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig)); + byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig, protocolFieldConfigProvider)); } } } @@ -56,7 +54,8 @@ //选取第一个帧,将业务内容和后面部分分开 //计算数据报文-业务内容 - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolFieldConfigProvider protocolFieldConfigProvider, ProtocolConfig protocolConfig) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); //截取完整报文 byteBuf.readBytes(totalLength); ByteBuf byteBufContent = byteBuf.slice(0, byteBuf.readerIndex()); @@ -68,15 +67,15 @@ String tail = ""; System.out.println(ByteBufUtil.hexDump(byteBufContent)); //会存在多个帧拼接在一起的的情况,进行合并处理 - while (hasNextFullFrame(byteBufContent, protocolConfig)) { - Integer currentFrameLength = fieldParser.getTotalLength(protocolConfig, byteBufContent); + while (hasNextFullFrame(byteBufContent, protocolConfig, protocolFieldConfigProvider)) { + Integer currentFrameLength = protocolFieldConfigProvider.getTotalLength(byteBufContent, protocolConfig); byteBufContent.readBytes(currentFrameLength); ByteBuf currentbyteBuf = byteBufContent.slice(0, byteBufContent.readerIndex()); byteBufContent.markReaderIndex();//读的标志位前移 System.out.println(ByteBufUtil.hexDump(byteBufContent)); String hexDump = currentbyteBuf.toString(Charset.forName("ISO-8859-1")); //获取当前固定帧结构的关系map - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, currentbyteBuf); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(currentbyteBuf, protocolConfig); if (StringUtils.isEmpty(mergeFrameStr)) { //首次获取业务数据报文 mergeFrameStr += hexDump.substring(0, currentFrameFixedProperty.get("tailPosition")); @@ -95,22 +94,22 @@ /** * 获取平移到下一帧起始位置 */ - public int getNextFrameOffset(ByteBuf buffer, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, buffer); - return currentFrameFixedProperty.get("totalLength"); + public int getNextFrameOffset(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + return currentFrameFixedProperty.get(TOTAL_LENGTH); } /** * 判断是否出错进行整个帧的 */ - public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, byteBuf); + public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); //保证读取位置不在固定位置,是可变的业务内容 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("fixedPosition")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(FIXED_POSITION)) { return false; } //判断读取是否操作帧长度 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("totalLength")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(TOTAL_LENGTH)) { return false; } return true; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 76a3784..c3a1bab 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -1,50 +1,50 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.parser.instance.GeneralProcessor; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; +import io.netty.buffer.ByteBufUtil;; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(2) -@Service +@Component public class FrameTailMatcher implements FrameStructMatcher { - @Resource - private FieldConfigDao fieldConfigDao; - @Autowired - private GeneralProcessor generalProcessor; - //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig tailFieldConfig = StringUtils.isEmpty(protocolConfig.getTailStr()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getTailStr()); - if (!ObjectUtil.isEmpty(tailFieldConfig)) { - String tailStr = tailFieldConfig.getFieldName(); + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfig protocolFieldConfig = ObjectUtils.isEmpty(protocolConfig.getTailStr()) ? null : + fieldConfigProvider.getFieldConfigById(protocolConfig.getTailStr()); + if (!ObjectUtil.isEmpty(protocolFieldConfig)) { + String tailStr = protocolFieldConfig.getFieldName(); String dataGramContent = ByteBufUtil.hexDump(byteBuf); Boolean tailFlag = ByteBufUtil.hexDump(byteBuf).contains(tailStr); if (!tailFlag) { //使用esayRule return null; } else if (dataGramContent.indexOf(tailStr) < dataGramContent.length() - tailStr.length()) { Integer length = dataGramContent.indexOf(tailStr) + tailStr.length(); - ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, protocolConfig, length); + ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, length); return wholeDatagramByte; //存在粘包 } } return null; } - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer length) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, Integer length) { byteBuf.readBytes(length); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, length - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java new file mode 100644 index 0000000..5f1c177 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java @@ -0,0 +1,73 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.combined.GenericCombinedFieldResolver; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.CombinedFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class CombinedFieldConfigProvider { + + + /** + * 作为临时配置列表缓存使用 + */ + private final List combinedFieldConfigList; + private Map storeObjectMap = new HashMap<>(); + + public CombinedFieldConfigProvider(Long ruleId) { + CombinedFieldConfigRegistry combinedFieldConfigRegistry = SpringContextUtil.getBean(CombinedFieldConfigRegistry.class); + combinedFieldConfigList = combinedFieldConfigRegistry.getCombinedFieldConfigList(ruleId); + } + + public void parseDataField(RuleConfig ruleConfig, String clearZeroPlain,Map fieldConfigsMap ) { + if (showSkip()) { + return; + } + //匹配对应的数据,然后进行相关的字段解析 + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver(); + combinedFieldResolver.parseDataField(combinedFieldConfigList, byteBuf, storeObjectMap,fieldConfigsMap); + } + + + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getCombinedFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return combinedFieldConfigList.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public List getCombinedFieldConfigList() { + return combinedFieldConfigList; + } + + /* 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(combinedFieldConfigList) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java new file mode 100644 index 0000000..f3cfedc --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java @@ -0,0 +1,11 @@ +package com.casic.missiles.parser.provider; + +/** + * @author cz + * @date 2023-6-12 + */ +public class CommandEventProvider{ + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java new file mode 100644 index 0000000..70eec5e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java @@ -0,0 +1,77 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.safe.SafeStrategy; +import com.casic.missiles.parser.sender.DataSubscribeProvider; +import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class DatagramEventProvider { + + private final DatagramEventConfig processorInstance; + + public DatagramEventProvider(Long ruleId) { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + List datagramEventConfigList = + datagramEventRegistry.getDatagramEventList(ruleId); + processorInstance = this.getProcessorInstance(datagramEventConfigList); + } + + public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { + if (showSkip()) { + return null; + } + return datagramEventConfigList.get(0); + } + + // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 + public String getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap) { + String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? + processorInstance.getSafeBean() : + fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); + if (!StringUtils.isEmpty(safeName)) { + //需要加密 + SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); + String plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); + return clearComplementZero(plain); + } + return ByteBufUtil.hexDump(bizDataContent); + } + + //解密清零操作 + private String clearComplementZero(String plain) { + plain = plain.substring(0, plain.lastIndexOf("00")); + return plain; + } + + //数据发送,数据发送者暂未构建 + public void storeData(Map bizDataMap) { + DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); +// dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return ObjectUtils.isNotEmpty(processorInstance) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java new file mode 100644 index 0000000..7e1fe0a --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java @@ -0,0 +1,97 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.FieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class FieldConfigProvider { + + + private final List fieldConfigs; + private Map storeObjectMap = new HashMap<>(); +// private Map singleObjects = new ConcurrentHashMap<>(); + + public FieldConfigProvider(Long ruleId) { + FieldConfigRegistry fieldConfigRegistry = SpringContextUtil.getBean(FieldConfigRegistry.class); + fieldConfigs = fieldConfigRegistry.getFieldConfigList(ruleId); + } + + public List getFieldConfigs() { + return fieldConfigs; + } + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public Map parseDataField(RuleConfig ruleConfig, String clearZeroPlain) { + if (showSkip()) { + return null; + } + List prepareFieldConfig = prepareParseField(ruleConfig); + if (CollectionUtils.isNotEmpty(prepareFieldConfig)) { + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(fieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + return fixDataMap; + } + } + return null; + } + + /** + * 得到需要处理的业务内容 + * + * @return + */ + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return fieldConfigs.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public Map getFieldConfigsMap() { + return fieldConfigs.stream().collect( + Collectors.toMap(FieldConfig::getId, e -> e) + ); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(fieldConfigs) ? false : true; + } + + +} + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java new file mode 100644 index 0000000..817bfaf --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java @@ -0,0 +1,19 @@ +package com.casic.missiles.parser.provider; + +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.registry.FieldRuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; + +public class FieldRuleConfigProvider { + + private final List fieldRuleConfigList; + + public FieldRuleConfigProvider(Long ruleId) { + FieldRuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(FieldRuleConfigRegistry.class); + fieldRuleConfigList = ruleConfigRegistry.getFieldRuleConfigList(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java new file mode 100644 index 0000000..99a1b06 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java @@ -0,0 +1,53 @@ +package com.casic.missiles.parser.provider; + + +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.registry.ProtocolConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolConfigProvider { + + private final List protocolConfigList; + + public ProtocolConfigProvider(String firstChar) { + ProtocolConfigRegistry registry = SpringContextUtil.getBean(ProtocolConfigRegistry.class); + protocolConfigList = registry.getProtocolConfigList(firstChar); + } + + public List getMatchList() { + return protocolConfigList; + } + + /** + * 设置当前协议 + * + * @param protocolConfig + */ + public ProtocolConfigProvider(ProtocolConfig protocolConfig) { + List protocolConfigs = new ArrayList<>(); + protocolConfigs.add(protocolConfig); + protocolConfigList = protocolConfigs; + } + + /** + * 获取当前协议 + * + * @return + */ + public ProtocolConfig getCurrentProtocolConfig() { + if (this.protocolConfigList == null) { + return null; + } else { + return protocolConfigList.get(0); + } + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java new file mode 100644 index 0000000..043927d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java @@ -0,0 +1,213 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.registry.ProtocolFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolFieldConfigProvider { + + private static final String FIXED_FIELD_DS = "fixedFieldDs"; + private static final String CONTENT_FIELD_DS = "contentFieldDs"; + private static final String PROTOCOL_LENGTH = "protocolLength"; + private static final String PROTOCOL_FIELD_ID = "protocolFieldId"; + private static final String PROTOCOL_POSITION = "protocolPosition"; + + private final List protocolFieldConfigs; + private Map singleObjects = new ConcurrentHashMap<>(); + private Map storeObjectMap = new HashMap<>(); + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public ProtocolFieldConfigProvider(Long protocolId) { + ProtocolFieldConfigRegistry protocolFieldConfigRegistry = SpringContextUtil.getBean(ProtocolFieldConfigRegistry.class); + protocolFieldConfigs = protocolFieldConfigRegistry.getProtocolFieldConfigList(protocolId); + } + + public List getProtocolFieldConfigs() { + return protocolFieldConfigs; + } + + public ProtocolFieldConfig getFieldConfigById(Long fieldId) { + Optional optionalConfig = protocolFieldConfigs.stream().filter( + e -> e.getId().equals(fieldId) + ).findFirst(); + return optionalConfig.isPresent() ? optionalConfig.get() : null; + } + + public Integer getProtocolFieldValue(Long protocolFieldId, ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_FIELD_ID + protocolFieldId + ByteBufUtil.hexDump(byteBuf); + //获取缓存 + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + //加载固定长度数据集合 + Map fixDataMap = this.getProtocolDataMap(byteBuf); + ProtocolFieldConfig protocolFieldConfig = selectFieldConfig(protocolFieldId); + Integer protocolFieldValue = 0; + //获取约定字段的总长度 + if (fixDataMap.containsKey(protocolFieldConfig.getFieldName())) { + Object appointUnpackObject = fixDataMap.get(protocolFieldConfig.getFieldName()); + if (ObjectUtils.isNotEmpty(appointUnpackObject)) { + protocolFieldValue = (Integer) appointUnpackObject; + } + } + if (protocolFieldValue != null) { + //加入缓存 + if (ObjectUtils.isNotEmpty(protocolFieldValue)) { + this.singleObjects.put(catchKey, protocolFieldValue); + return protocolFieldValue; + } + } + return null; + } + + /** + * 获取帧固定位置信息 + * + * @param byteBuf + * @param protocolConfig + * @return + */ + public Map getFixedProperty(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_POSITION + protocolConfig.getId(); + if (this.singleObjects.containsKey(catchKey)) { + return (Map) singleObjects.get(catchKey); + } + Map fixedPropertyMap = new HashMap<>(); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + fixedPropertyMap = fieldParser.doGetFixedProperty(protocolFieldConfigs, this.getTotalLength(byteBuf,protocolConfig)); + if (CollectionUtils.isNotEmpty(fixedPropertyMap)) { + this.singleObjects.put(catchKey, fixedPropertyMap); + return fixedPropertyMap; + } + return fixedPropertyMap; + } + + /** + * 获取帧结构应有的总长度 + */ + public Integer getTotalLength(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_LENGTH + ByteBufUtil.hexDump(byteBuf); + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + Integer appointFrameLength = getProtocolFieldValue(protocolConfig.getTotalLengthId(), byteBuf); + if (appointFrameLength != null) { + //获取过滤的字段集合总长度 + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Integer totalFilterLength = fieldParser.getTotalFilterLength(protocolConfig, byteBuf, getFixFieldConfigMap()); + //计算总长度 + Integer totalLength = appointFrameLength + totalFilterLength; + //加入缓存 + if (ObjectUtils.isNotEmpty(totalLength)) { + this.singleObjects.put(catchKey, totalLength); + return totalLength; + } + } + return null; + } + + /** + * 获取协议有关字段解析内容 + * storeObjectMap存储代转存的数据 + * + * @return + */ + public Map getProtocolDataMap(ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(FIXED_FIELD_DS)) { + return (Map) singleObjects.get(FIXED_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(protocolFieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + this.singleObjects.put(FIXED_FIELD_DS, fixDataMap); + return fixDataMap; + } + return null; + } + + /** + * 获取业务报文内容的content字节 + * + * @param wholeDatagramByte + * @return + */ + public ByteBuf getDataContentBuf(ByteBuf wholeDatagramByte) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(CONTENT_FIELD_DS)) { + return (ByteBuf) singleObjects.get(CONTENT_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + ByteBuf bizDataByteBuf = fieldParser.getDataContentBuf(protocolFieldConfigs, wholeDatagramByte); + if (bizDataByteBuf != null) { + this.singleObjects.put(CONTENT_FIELD_DS, bizDataByteBuf); + return bizDataByteBuf; + } + return null; + } + + + private ProtocolFieldConfig selectFieldConfig(Long id) { + Optional optionalProtocolFieldConfig = this.protocolFieldConfigs.stream().filter( + e -> e.getId().equals(id) + ).findFirst(); + return optionalProtocolFieldConfig.isPresent() ? optionalProtocolFieldConfig.get() : null; + } + + + private Map getFixFieldConfigMap() { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, e -> e) + ); + return fixDataFieldMap; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(protocolFieldConfigs) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java new file mode 100644 index 0000000..dafba1c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java @@ -0,0 +1,56 @@ +package com.casic.missiles.parser.provider; + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.rule.GenericRuleResolver; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.RuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleConfigProvider { + + private final List ruleConfigs; + + public List getRuleConfigs() { + return ruleConfigs; + } + + public RuleConfigProvider(Long protocolId) { + RuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(RuleConfigRegistry.class); + ruleConfigs = ruleConfigRegistry.getRuleConfigById(protocolId); + } + + /** + * 获取规则匹配结果 + * + * @param parseFixedDataMap + * @param protocolFieldConfigs + * @return + */ + public RuleConfig doGetRule(Map parseFixedDataMap, + String ids, + List protocolFieldConfigs) { + if (showSkip()) { + return null; + } + RuleConfig ruleConfig = GenericRuleResolver.machRule(parseFixedDataMap, ids, protocolFieldConfigs, ruleConfigs); + return ruleConfig; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(ruleConfigs) ? false : true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java index 3c05891..856b399 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java @@ -1,18 +1,11 @@ package com.casic.missiles.parser.resolver; -import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.springframework.web.bind.annotation.RequestBody; -import javax.annotation.Resource; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -20,19 +13,17 @@ @Slf4j public class ByteMergeProvider { - @Resource - private FieldRuleEngineMapper fieldRuleEngineMapper; - //拿到所有的值合并到一个值 - public String resolveByteMerge(List valueList, String ruletypeId, String vaildRange) { + public static String resolveByteMerge(List valueList, String ruleTypeId, String vaildRange) { String values = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Map vaildMap = getValidRangeMap(vaildRange); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(ruletypeId); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } + //暂时不处理 +// fieldRuleEngine = fieldRuleConfigMapper.selectById(ruleTypeId); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } Map env2 = new HashMap(); for (int i = 0; i < valueList.size(); i++) { if (vaildMap.containsKey(i)) { @@ -47,7 +38,7 @@ } } - private Map getValidRangeMap(String vaildRange) { + private static Map getValidRangeMap(String vaildRange) { String[] range = vaildRange.split(","); Map vaildMap = new HashMap(); for (int i = 0; i < range.length; i++) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 8d821cd..85d6bbf 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -1,9 +1,12 @@ package com.casic.missiles.parser.resolver; +import com.casic.missiles.pojo.AbstractFieldConfig; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; import io.netty.buffer.ByteBuf; +import java.util.List; import java.util.Map; /** @@ -11,18 +14,14 @@ */ public interface FieldParser { -// Map fieldProcess(String protocolContent,); - Map dataParser(RuleConfig ruleConfig, String lightText,String protocolId); + Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength); - Map fixDataParser(String protocolId, ByteBuf buffer); + Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap); - Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf); + ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer); - ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer); - - ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer); - - Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer); + Integer getTotalFilterLength(ProtocolConfig protocolConfig, ByteBuf byteBuf, Map protocolFieldConfigMap); } + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java new file mode 100644 index 0000000..9e0c00e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java @@ -0,0 +1,52 @@ +package com.casic.missiles.parser.resolver; + +import com.casic.missiles.pojo.AbstractFieldConfig; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.util.List; + +public class FieldParserSupport { + + //分别计算bit和byte长度=> 合并长度 + protected Integer calculateLength(List fieldConfigList) { + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + Integer fixedLength = bytefixedLength + bitfixedLength / 8; + return fixedLength; + } + + //找到最大值=> 根据最大值计算业务数据下标 + protected Integer calculatePosition(List fieldConfigList) { + String rex = "[0-9]+"; + Integer max = -1; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) + && Integer.valueOf(fieldConfig.getOriginPositionByte()) > max) { + max = Integer.valueOf(fieldConfig.getOriginPositionByte()); + } + } + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) && fieldConfig.getOriginPositionByte().equals(max)) { + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + } + } + Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; + return maxFixedPosition; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java deleted file mode 100644 index dd3a6cd..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java +++ /dev/null @@ -1,170 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.ByteResolverParam; -import io.netty.buffer.ByteBuf; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -/** - * 字段解析管理总类 - */ -@Service -@Slf4j -@AllArgsConstructor -public class FieldResolver extends ByteMergeProvider { - - //1、字段截取 => 2、简单的字节解析和复杂的字节解析 - public Object filedParserManger(ByteBuf byteBuf, FieldConfig fieldConfig, Integer maxFixedPosition) { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - //最大固定位置不为空, - if (!ObjectUtil.isEmpty(maxFixedPosition)) { - orignPosition -= maxFixedPosition; - } - Object fieldValue = 0; - //待优化 - if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { - fieldValue = bitToResolver(byteBuf, fieldConfig); - } else { - ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); - fieldValue = parsingFields(fieldBytes, fieldConfig.getRuleJson()); - } - return fieldValue; - } - - //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, - //目前默认配置的规则设置暂不支持配置化,由实现完成 - private Object parsingFields(ByteBuf byteBuf, String ruleJson) { - Object fieldsResolveValue = null; - List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); - if (ObjectUtil.isEmpty(ruleMapList)) { - fieldsResolveValue = defaultResolveBuilder(byteBuf); - } else { - fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); - } - return fieldsResolveValue; - } - - private Object defaultResolveBuilder(ByteBuf byteBuf) { - Integer defaultResolveValue = 0; - for (int i = 0; i < byteBuf.writerIndex(); i++) { - defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; - } - return defaultResolveValue; - } - - //字段解析构建器(针对字节单位的) - //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 - // 字节归并结束或者规则结束=>继续根据规则进行判断 - private Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { - Object customizeResolveValue = null; - try { - List bytStrList = new ArrayList<>(); - //存放到数组里面 - for (int i = 0; i < byteBuf.writerIndex(); i++) { - bytStrList.add(byteBuf.readByte()); - } - int i = 0; - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - customizeResolveValue = this.resolveByteMerge(bytStrList, ruletypeId,vaildRange); - break; - } else { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - List tempBytStr = new ArrayList<>(); - for (int k = 0; i < bytStrList.size(); i++) { - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(k) - .value(bytStrList.get(k)) - .ruletypeId(ruletypeId).build(); - tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); - } - bytStrList = tempBytStr; - } - i++; - } - //字节归并到一起=>继续根据规则进行判断 - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(customizeResolveValue) - .ruletypeId(ruletypeId).build(); - customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(customizeResolveValue)); - return customizeResolveValue; - } catch (RuntimeException ex) { - log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); - return null; - } - } - - /** - * 1、单个字节情况表示字段 - * 2、多字节情况表示字段(暂未处理) - */ - private Object bitToResolver(ByteBuf byteBuf, FieldConfig fieldConfig) { - Object fieldValue = new Object(); - try { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - byte fields = 0x00; - if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); - } else { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); - } - - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { - if (!StringUtils.isEmpty(fieldConfig.getExactOrignPosition())) { - fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getExactOrignPosition())).byteValue() - >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); - } else { - fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); - } - } else { - fieldValue = Integer.valueOf(fields & 0xff); - } - if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { - return fieldValue; - } - List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); - int i = 0; - //字节归并到一起=>继续根据规则进行判断 - while (i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(fieldValue) - .ruletypeId(ruletypeId).build(); - fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(fieldValue)); - return fieldValue; - } catch (RuntimeException ex) { - log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); - return null; - } - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java new file mode 100644 index 0000000..1d2aeab --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java @@ -0,0 +1,36 @@ +package com.casic.missiles.parser.resolver.bytes; + +import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.mapper.FieldRuleConfigMapper; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.pojo.ByteResolverParam; +import com.googlecode.aviator.AviatorEvaluator; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; +//转换规则 +@Component("convert") +@AllArgsConstructor +@Slf4j +public class ByteRuleResolver implements ByteResolver { + + private final FieldRuleConfigMapper fieldRuleConfigMapper; + + @Override + public Object resolveOperationRule(ByteResolverParam byteResolverParam){ + FieldRuleConfig fieldRuleEngine=fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); + if(ObjectUtil.isEmpty(fieldRuleEngine)){ + return byteResolverParam.getValue(); + } + String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); + Map env2 = new HashMap(); + env2.put("value", (byte) byteResolverParam.getValue()); + String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); + return values; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java index 103821c..786b71c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java @@ -2,34 +2,34 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("logicalShift") +@Component("logicalShift") @AllArgsConstructor @Slf4j public class LogicalShiftResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //字节位移 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { Integer index = byteResolverParam.getIndex(); - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return byteResolverParam.getValue(); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java index 476747d..01149bd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("operation") +@Component("operation") @AllArgsConstructor @Slf4j public class OperationResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //混合运算,有常量或者乘除的缩放 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java index 0b82cf4..79abcce 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.casic.missiles.pojo.ByteResolverParam; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; //精度计算 -@Service("precision") +@Component("precision") @AllArgsConstructor @Slf4j public class PrecisionResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java deleted file mode 100644 index 5c3f332..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; -//转换规则 -@Service("convert") -@AllArgsConstructor -@Slf4j -public class RuleResolver implements ByteResolver { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam){ - RuleEvaluator fieldRuleEngine=fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); - if(ObjectUtil.isEmpty(fieldRuleEngine)){ - return byteResolverParam.getValue(); - } - String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); - Map env2 = new HashMap(); - env2.put("value", (byte) byteResolverParam.getValue()); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java new file mode 100644 index 0000000..d3bbd91 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java @@ -0,0 +1,15 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; + +import java.util.List; +import java.util.Map; +// 前导码匹配->长度字段 +public interface AbstractCombinedFieldProcessor { + + Map invoke(Map map, ByteBuf byteBuf, List combinedFieldConfigList, + Map fieldConfigsMap, Map storeObjectMap); + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java new file mode 100644 index 0000000..03c8480 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java @@ -0,0 +1,59 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-13 + */ +//依次递增进行数据的解析, +public class GenericCombinedFieldResolver { + + + //通过查询,字段长度长度随机 + public void parseDataField(List combinedFieldConfigList, ByteBuf byteBuf, + Map storeObjectMap, Map fieldConfigsMap) { + Integer frameLength = Integer.valueOf(ByteBufUtil.hexDump(byteBuf)); + //添加前置处理器 + com.casic.missiles.util.ClassUtil classUtil = new com.casic.missiles.util.ClassUtil(); + List abstractCombinedProcessors = classUtil.getSubClassList(AbstractCombinedFieldProcessor.class); + + Map fieldFixedMap = combinedFieldLeadCodeMap(combinedFieldConfigList); + //frameLength + Map combinedProcessorFields = null; + while (byteBuf.readableBytes() < frameLength) { + //一直处理 + for (AbstractCombinedFieldProcessor abstractCombinedProcessor : abstractCombinedProcessors) { + combinedProcessorFields = abstractCombinedProcessor.invoke(combinedProcessorFields, byteBuf, + combinedFieldConfigList, + fieldConfigsMap, storeObjectMap); + if (combinedProcessorFields == null || byteBuf.readableBytes() < frameLength) { + return; + } + } + + } + } + + /** + * 取出前导码匹配集合 + */ + private Map combinedFieldLeadCodeMap(List combinedFieldConfigList) { + Map fieldFixedMap = combinedFieldConfigList + .stream() + .collect(Collectors.toMap(CombinedFieldConfig::getPrefixCode, e -> e)); + return fieldFixedMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java new file mode 100644 index 0000000..643a934 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java @@ -0,0 +1,100 @@ +package com.casic.missiles.parser.resolver.fields; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.FieldParserSupport; +import com.casic.missiles.pojo.*; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 保存使用时最基本的信息,并且使用原型模式 + */ +@Slf4j +public class DefaultProtocolFieldParser extends FieldParserSupport implements FieldParser, FixedPropertyEnum { + + //通过传入的配置和报文进行字段解析 + @Override + public Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap) { + Map dataMap = new HashMap<>(); + for (AbstractFieldConfig protocolFieldConfig : protocolFieldConfigs) { + if (!ObjectUtils.isEmpty(protocolFieldConfig.getOriginPositionByte())) { + Object fieldValue = FieldResolver.parseField(buffer, protocolFieldConfig, null); + if (protocolFieldConfig.getIsStorage() == 1) { + storeObjectMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + dataMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + } + return dataMap; + } + + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength) { + Map fixedPropertyMap = new HashMap<>(); + Integer fixedLength = calculateLength(protocolFieldConfigs); + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + fixedPropertyMap.put(FIXED_POSITION, maxFixedPosition); + fixedPropertyMap.put(TOTAL_LENGTH, totalLength); + fixedPropertyMap.put(TAIL_POSITION, totalLength - fixedLength + maxFixedPosition); + return fixedPropertyMap; + } + + //** 获取业务内容的byteBuf + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer) { + //计算固定长度 + Integer fixedLength = calculateLength(protocolFieldConfigs); + //总长度获取 + String lightText = buffer.toString(Charset.forName("ISO-8859-1")); + Integer totalLength = lightText.length(); + //计算固定长度最大长度 + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + //计算数据报文内容 + ByteBuf bizDataFields = buffer.slice(maxFixedPosition - 1, (totalLength - fixedLength)); + return bizDataFields; + } + + /** + * 获取过滤字段的长度 + */ + @Override + public Integer getTotalFilterLength(ProtocolConfig protocolConfig, + ByteBuf byteBuf, + Map protocolFieldConfigMap) { + if (ByteBufUtil.hexDump(byteBuf).equals("")) { + return 0; + } + int totalFilterLength = 0; + String filterFields = protocolConfig.getTotalLengthFilterFields(); + try { + if (!StringUtils.isEmpty(filterFields)) { + String[] filterFieldList = filterFields.split(","); + for (String filterFieldId : filterFieldList) { + if (StringUtils.isNotEmpty(filterFieldId)) { + ProtocolFieldConfig fieldConfig = protocolFieldConfigMap.get(Long.valueOf(filterFieldId)); + //这里都是按字节计算,没有对位进行区分,可能会出现错误 + // 如果对位有需求,需要进一步跟进 + totalFilterLength += fieldConfig.getOffsetLength(); + } + } + } + return totalFilterLength; + } catch (Exception ex) { + log.error("报文确认分发阶段,获取报文总长度过滤长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); + } + return totalFilterLength; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java new file mode 100644 index 0000000..d51e887 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java @@ -0,0 +1,169 @@ +package com.casic.missiles.parser.resolver.fields; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.parser.resolver.ByteMergeProvider; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.AbstractFieldConfig; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.pojo.ByteResolverParam; +import io.netty.buffer.ByteBuf; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * 字段解析管理总类 + */ +@Slf4j +public class FieldResolver extends ByteMergeProvider { + + //1、字段截取 => 2、简单的字节解析和复杂的字节解析 + public static Object parseField(ByteBuf byteBuf,AbstractFieldConfig fieldConfig, Integer maxFixedPosition) { + Integer orignPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + //最大固定位置不为空, + if (!ObjectUtil.isEmpty(maxFixedPosition)) { + orignPosition -= maxFixedPosition; + } + Object fieldValue = 0; + //待优化 + if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { + fieldValue = doParseBitField(byteBuf, fieldConfig); + } else { + ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); + fieldValue = doParseByteField(fieldBytes, fieldConfig.getRuleJson()); + } + return fieldValue; + } + + //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, + //目前默认配置的规则设置暂不支持配置化,由实现完成 + private static Object doParseByteField(ByteBuf byteBuf, String ruleJson) { + Object fieldsResolveValue = null; + List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); + if (ObjectUtil.isEmpty(ruleMapList)) { + fieldsResolveValue = defaultResolveBuilder(byteBuf); + } else { + fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); + } + return fieldsResolveValue; + } + + private static Object defaultResolveBuilder(ByteBuf byteBuf) { + Integer defaultResolveValue = 0; + for (int i = 0; i < byteBuf.writerIndex(); i++) { + defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; + } + return defaultResolveValue; + } + + //字段解析构建器(针对字节单位的) + //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 + // 字节归并结束或者规则结束=>继续根据规则进行判断 + private static Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { + Object customizeResolveValue = null; + try { + List bytStrList = new ArrayList<>(); + //存放到数组里面 + for (int i = 0; i < byteBuf.writerIndex(); i++) { + bytStrList.add(byteBuf.readByte()); + } + int i = 0; + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { + if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + customizeResolveValue = resolveByteMerge(bytStrList, ruletypeId, vaildRange); + break; + } else { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + List tempBytStr = new ArrayList<>(); + for (int k = 0; i < bytStrList.size(); i++) { + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(k) + .value(bytStrList.get(k)) + .ruletypeId(ruletypeId).build(); + tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); + } + bytStrList = tempBytStr; + } + i++; + } + //字节归并到一起=>继续根据规则进行判断 + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(null) + .value(customizeResolveValue) + .ruletypeId(ruletypeId).build(); + customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); + i++; + } + System.out.println(JSON.toJSON(customizeResolveValue)); + return customizeResolveValue; + } catch (RuntimeException ex) { + log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); + return null; + } + } + + /** + * 1、单个字节情况表示字段 + * 2、多字节情况表示字段(暂未处理) + */ + private static Object doParseBitField(ByteBuf byteBuf,AbstractFieldConfig fieldConfig) { + Object fieldValue = new Object(); + try { + Integer orignPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + byte fields = 0x00; + if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { + fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); + } else { + fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); + } + + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { + if (!StringUtils.isEmpty(fieldConfig.getOriginPositionBit())) { + fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getOriginPositionBit())).byteValue() + >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); + } else { + fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); + } + } else { + fieldValue = Integer.valueOf(fields & 0xff); + } + if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { + return fieldValue; + } + List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); + int i = 0; + //字节归并到一起=>继续根据规则进行判断 + while (i < ruleMapList.size()) { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(null) + .value(fieldValue) + .ruletypeId(ruletypeId).build(); + fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); + i++; + } + System.out.println(JSON.toJSON(fieldValue)); + return fieldValue; + } catch (RuntimeException ex) { + log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); + return null; + } + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java deleted file mode 100644 index 35ae3d0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java +++ /dev/null @@ -1,183 +0,0 @@ -package com.casic.missiles.parser.resolver.fields; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufAllocator; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; -import org.springframework.util.ObjectUtils; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service("standard") -@AllArgsConstructor -@Slf4j -public class StandardFieldParser implements FieldParser { - - private final FieldConfigDao fieldConfigDao; - private final FieldResolver fieldResolver; - - //数据解析 - @Override - public Map dataParser(RuleConfig ruleConfig, String lightText, String protocolId) { - String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); - ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); - bufferContent.writeBytes(lightText.getBytes(Charset.forName("ISO-8859-1"))); - Map dataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - for (String dataFieldId : dataFieldIds) { - FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(dataFieldId); - if (!ObjectUtils.isEmpty(fieldConfig)) { - dataMap.put(fieldConfig.getFieldName(), String.valueOf(fieldResolver.filedParserManger(bufferContent, fieldConfig, maxFixedPosition))); - } - } - return dataMap; - } - - //数据解析 - @Override - public Map fixDataParser(String protocolId, ByteBuf buffer) { - List dataFieldIdList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Map dataMap = new HashMap<>(); - for (FieldConfig dataField : dataFieldIdList) { - if (!ObjectUtils.isEmpty(dataField.getOrignPosition())) { - Object fieldValue = (Integer) fieldResolver.filedParserManger(buffer, dataField, null); - dataMap.put(dataField.getFieldName(), fieldValue); - } - } - return dataMap; - } - - @Override - public Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf) { - if (ByteBufUtil.hexDump(byteBuf).equals("")) { - return 0; - } - String filterFields = protocolConfig.getTotalLengthFilterField(); - Integer totalLength = 0; - try { - FieldConfig totalFieldConfig = fieldConfigDao.getFieldConfigById(protocolConfig.getTotalLengthId()); - int totalFilterLength = 0; - if (!StringUtils.isEmpty(filterFields)) { - String[] filterFieldList = filterFields.split(","); - for (String filterField : filterFieldList) { - FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(filterField); - //这里都是按字节计算,没有对位进行区分,可能会出现错误 - - // 如果对位有需求,需要进一步跟进 - totalFilterLength += fieldConfig.getOffsetLength(); - } - } - totalLength = (Integer) fieldResolver.filedParserManger(byteBuf, totalFieldConfig, null) + totalFilterLength; - } catch (Exception ex) { - log.error("报文确认分发阶段,获取报文总长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); - } - return totalLength; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer) { - //业务内容 - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - String protocolId = String.valueOf(protocolConfig.getId()); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - //计算固定长度 - Integer fixedLength = calculateLength(fieldConfigList); -// Integer totalLength = this.getTotalLength(protocolConfig, buffer); - //总长度获取 - Integer totalLength = lightText.length(); - //计算固定长度最大长度 - Integer maxFixedPosition = calculatePosition(fieldConfigList); -// buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - //计算数据报文内容 - ByteBuf bizDataFields = buffer.slice(maxFixedPosition-1, (totalLength - fixedLength)); - return bizDataFields; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer) { - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - String protocolId = String.valueOf(protocolConfig.getId()); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer fixedLength = calculateLength(fieldConfigList); -// Integer totalLength = this.getTotalLength(protocolConfig, buffer); - Integer totalLength = lightText.length(); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - ByteBuf fixDataFields = buffer.slice(0, maxFixedPosition); - return fixDataFields; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer) { - String protocolId = String.valueOf(protocolConfig.getId()); - Map fixedPropertyMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer fixedLength = calculateLength(fieldConfigList); - Integer totalLength = this.getTotalLength(protocolConfig, buffer); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - fixedPropertyMap.put("fixedPosition", maxFixedPosition); - fixedPropertyMap.put("totalLength", totalLength); - fixedPropertyMap.put("tailPosition", totalLength - fixedLength + maxFixedPosition); - return fixedPropertyMap; - } - - //分别计算bit和byte长度=> 合并长度 - private Integer calculateLength(List fieldConfigList) { - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (FieldConfig fieldConfig : fieldConfigList) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - Integer fixedLength = bytefixedLength + bitfixedLength / 8; - return fixedLength; - } - - //找到最大值=> 根据最大值计算业务数据下标 - private Integer calculatePosition(List fieldConfigList) { - String rex = "[0-9]+"; - Integer max = -1; - for (FieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOrignPosition()) - && Integer.valueOf(fieldConfig.getOrignPosition()) > max) { - max = Integer.valueOf(fieldConfig.getOrignPosition()); - } - } - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (FieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOrignPosition()) && fieldConfig.getOrignPosition().equals(max)) { - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - } - } - Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; - return maxFixedPosition; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java new file mode 100644 index 0000000..d4ec6c7 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java @@ -0,0 +1,76 @@ +package com.casic.missiles.parser.rule; + +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import org.apache.commons.lang3.StringUtils; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class GenericRuleResolver { + + //根据前置字段的值,找到指定的规则 + //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 + //=>循环判断=>通过规则得到业务字段 + public static RuleConfig machRule(Map fixDataMap, + String ids, + List protocolFieldConfigs, + List ruleConfigs) { + List preRuleConfigList = getPreRuleList(ids, protocolFieldConfigs); + //获取前置规则字段 + final Map metaDataMap = getPreRuleFields(preRuleConfigList, fixDataMap); + //准备固定的字段集合 + Map fixDataFieldMap = getFixDataFieldMap(protocolFieldConfigs); + return RuleResolverCore.doMachRule(ruleConfigs, metaDataMap, fixDataMap, fixDataFieldMap); + } + + private static Map getFixDataFieldMap(List protocolFieldConfigs) { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, ProtocolFieldConfig::getFieldName) + ); + return fixDataFieldMap; + } + + + /** + * 查询前置规则的字段配置 + * + * @param ids + * @return + */ + private static List getPreRuleList(String ids, List protocolFieldConfigs) { + String[] idList = ids.split(","); + Map prepareMaps = new HashMap<>(); + for (String id : idList) { + if (StringUtils.isNotEmpty(id)) { + prepareMaps.put(Long.valueOf(id), ""); + } + } + List preRuleConfigList = protocolFieldConfigs + .stream() + .filter(e -> prepareMaps.containsKey(e.getId())) + .collect(Collectors.toList()); + return preRuleConfigList; + } + + /** + * 获取前置规则解析字段 + */ + private static Map getPreRuleFields(List preRuleFieldConfigList, Map fixDataMap) { + Map ruleFieldMap = new HashMap<>(); + preRuleFieldConfigList.stream() + .forEach( + preRuleFieldConfig -> { + String fieldName = preRuleFieldConfig.getFieldName(); + if (fixDataMap.containsKey(fieldName)) { + ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); + } + } + ); + return ruleFieldMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java new file mode 100644 index 0000000..baae7e8 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -0,0 +1,68 @@ +package com.casic.missiles.parser.rule; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.casic.missiles.pojo.RuleConfig; + +import java.util.*; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleResolverCore { + + + public static RuleConfig doMachRule(List ruleConfigList, Map metaDataMap, + Map fixDataMap, + Map fixDataFieldMap) { + Optional ruleConfigOptional = ruleConfigList.stream() + .filter(ruleConfig -> machRuleConfig( + JSON.parseObject(ruleConfig.getMatchRuleJson(), Map.class), metaDataMap)) + .findFirst(); + if (ObjectUtil.isEmpty(ruleConfigOptional)) { + return null; + } + String[] ruleFields = ruleConfigOptional.get().getDataFieldIds().split(","); + Map ruleMetaDataMap = getRuleFields(ruleFields, fixDataMap, fixDataFieldMap); + //递归选定解析规则,进行规则解析 + if (!ruleConfigOptional.get().getIsFinishMatch().equals("1")) { + //递归选定规则 + doMachRule(ruleConfigList, ruleMetaDataMap, fixDataMap, fixDataFieldMap); + } + return ruleConfigOptional.get(); + } + + + private static Map getRuleFields(String[] preRuleConfigList, Map fixedDataMap, + Map fixedFieldMap) { + Map ruleFieldMap = new HashMap<>(); + for (String preRuleConfigId : preRuleConfigList) { + String fieldName = fixedFieldMap.get(preRuleConfigId); + if (fixedDataMap.containsKey(fieldName)) { + ruleFieldMap.put(fieldName, String.valueOf(fixedDataMap.get(fieldName))); + } + } + return ruleFieldMap; + } + + + //匹配规则配置 + private static Boolean machRuleConfig(Map ruleMap, Map metaDataMap) { + if (ruleMap == null || metaDataMap == null) { + return null; + } + //所有的字段在规则里面必须有有配置 + for (String key : metaDataMap.keySet()) { + if (ruleMap.containsKey(key)) { + if (!ruleMap.get(key).equals(metaDataMap.get(key))) { + return false; + } + } else { + return false; + } + } + return true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java deleted file mode 100644 index 664088d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java +++ /dev/null @@ -1,92 +0,0 @@ -package com.casic.missiles.parser.rule; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.mapper.dao.PreRuleConfigDao; -import com.casic.missiles.mapper.dao.RuleConfigDao; -import lombok.AllArgsConstructor; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.*; -import java.util.stream.Collectors; - -@Service -@AllArgsConstructor -public class RulerProvider { - - private final FieldConfigDao fieldConfigDao; - private final PreRuleConfigDao preRuleConfigDao; - private final RuleConfigDao ruleConfigDao; - - //根据前置字段的值,找到指定的规则 - //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 - //=>循环判断=>通过规则得到业务字段 - public RuleConfig ruleConfig(Map fixDataMap, String protocolId) { - //批量获取规则 - List preRuleConfigList = preRuleConfigDao.getPreRuleList(protocolId); - //获取固定字段 - Map fixFieldMap = getAllFieldMap(protocolId); - //获取前置规则字段 - final String preRuleFields = getPreRuleFields(preRuleConfigList, fixDataMap, fixFieldMap); - List ruleConfigList = ruleConfigDao.getRuleConfigById(protocolId); - Optional ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig ->preRuleFields.equals( ruleConfig.getParseRuleJson())).findFirst(); - //递归选定解析规则,进行规则解析 - while (!ObjectUtil.isEmpty(ruleConfigOptional) && !ruleConfigOptional.get().getIsBizField().equals("1")) { - String ruleFields = getRuleFields(ruleConfigOptional.get().getDataFieldIds().split(","), fixDataMap, fixFieldMap); - ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig -> ruleConfig.getParseRuleJson().equals(ruleFields)).findFirst(); - } - return ruleConfigOptional.get(); - } - - /** - * 获取前置规则解析字段 - */ - private String getPreRuleFields(List preRuleConfigList, Map fixDataMap, Map fixFieldMap) { - Map ruleFieldMap= new HashMap<>(); - preRuleConfigList.stream() - .forEach( - preRuleConfig -> { - String fieldName = fixFieldMap.get(Long.valueOf(preRuleConfig.getRuleFieldId())); - if (fixDataMap.containsKey(fieldName)) { - ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); - } - } - ); - return JSONObject.toJSONString(ruleFieldMap); - } - - private Map getAllFieldMap(String protocolId) { - List fieldList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Map fixFieldMap = fieldList.stream().collect( - Collectors.toMap(FieldConfig::getId, FieldConfig::getFieldName) - ); - return fixFieldMap; - } - - private String getRuleFields(String[] preRuleConfigList, Map fixDataMap, Map fixFieldMap) { - Map ruleFieldMap= new HashMap<>(); - for (String preRuleConfigId : preRuleConfigList) { - String fieldName = fixFieldMap.get(preRuleConfigId); - if (fixDataMap.containsKey(fieldName)) { - ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); - } - } - return JSONObject.toJSONString(ruleFieldMap); - } - - //弃置 - private String ListToString(List ruleFieldList) { - String ruleFields = ""; - for (String ruleField : ruleFieldList) { - ruleFields += ruleField + ","; - } - ruleFields = StringUtils.isEmpty(ruleFields) ? ruleFields : ruleFields.substring(0, ruleFields.length() - 1); - return ruleFields; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java index 6177e10..bfa87a5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java @@ -2,7 +2,7 @@ public interface SafeStrategy { - String decryption(byte[] bytes); + String decryption(String cipher); String encryption(String lightText); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java index 618716c..6236302 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java @@ -9,9 +9,9 @@ //十六进制的字符串转换成字节数组 byte[] bytes = hexStrToBinaryStr(msg); //计算CRC8 - byte crc8 = CRC8(bytes, 0, bytes.length); - String crc8ToStr = "" + Integer.toHexString(0xff & crc8); - return crc8ToStr; +// String crc8ToStr = "" + Integer.toHexString(0xff & crc8); +// return crc8ToStr; + return null; } /** @@ -33,50 +33,5 @@ return bytes; } - /** - * CRC8 校验 多项式 x8+x2+x+1 - * - * @param b - * @param off - * @param len - * @return - */ - public static byte CRC8(final byte[] b, final int off, final int len) { - byte result = 0x00; - for (int i = 0; i < len; i++) { - result = CHECKSUM_TABLE[(result ^ (b[i + off] & 0xFF)) & 0xFF]; - } - return (byte) (result & 0xFFL); - } - - private final static byte[] CHECKSUM_TABLE = {(byte) 0x00, (byte) 0x07, (byte) 0x0e, (byte) 0x09, (byte) 0x1c, (byte) 0x1b, - (byte) 0x12, (byte) 0x15, (byte) 0x38, (byte) 0x3f, (byte) 0x36, (byte) 0x31, (byte) 0x24, (byte) 0x23, (byte) 0x2a, - (byte) 0x2d, (byte) 0x70, (byte) 0x77, (byte) 0x7e, (byte) 0x79, (byte) 0x6c, (byte) 0x6b, (byte) 0x62, (byte) 0x65, - (byte) 0x48, (byte) 0x4f, (byte) 0x46, (byte) 0x41, (byte) 0x54, (byte) 0x53, (byte) 0x5a, (byte) 0x5d, (byte) 0xe0, - (byte) 0xe7, (byte) 0xee, (byte) 0xe9, (byte) 0xfc, (byte) 0xfb, (byte) 0xf2, (byte) 0xf5, (byte) 0xd8, (byte) 0xdf, - (byte) 0xd6, (byte) 0xd1, (byte) 0xc4, (byte) 0xc3, (byte) 0xca, (byte) 0xcd, (byte) 0x90, (byte) 0x97, (byte) 0x9e, - (byte) 0x99, (byte) 0x8c, (byte) 0x8b, (byte) 0x82, (byte) 0x85, (byte) 0xa8, (byte) 0xaf, (byte) 0xa6, (byte) 0xa1, - (byte) 0xb4, (byte) 0xb3, (byte) 0xba, (byte) 0xbd, (byte) 0xc7, (byte) 0xc0, (byte) 0xc9, (byte) 0xce, (byte) 0xdb, - (byte) 0xdc, (byte) 0xd5, (byte) 0xd2, (byte) 0xff, (byte) 0xf8, (byte) 0xf1, (byte) 0xf6, (byte) 0xe3, (byte) 0xe4, - (byte) 0xed, (byte) 0xea, (byte) 0xb7, (byte) 0xb0, (byte) 0xb9, (byte) 0xbe, (byte) 0xab, (byte) 0xac, (byte) 0xa5, - (byte) 0xa2, (byte) 0x8f, (byte) 0x88, (byte) 0x81, (byte) 0x86, (byte) 0x93, (byte) 0x94, (byte) 0x9d, (byte) 0x9a, - (byte) 0x27, (byte) 0x20, (byte) 0x29, (byte) 0x2e, (byte) 0x3b, (byte) 0x3c, (byte) 0x35, (byte) 0x32, (byte) 0x1f, - (byte) 0x18, (byte) 0x11, (byte) 0x16, (byte) 0x03, (byte) 0x04, (byte) 0x0d, (byte) 0x0a, (byte) 0x57, (byte) 0x50, - (byte) 0x59, (byte) 0x5e, (byte) 0x4b, (byte) 0x4c, (byte) 0x45, (byte) 0x42, (byte) 0x6f, (byte) 0x68, (byte) 0x61, - (byte) 0x66, (byte) 0x73, (byte) 0x74, (byte) 0x7d, (byte) 0x7a, (byte) 0x89, (byte) 0x8e, (byte) 0x87, (byte) 0x80, - (byte) 0x95, (byte) 0x92, (byte) 0x9b, (byte) 0x9c, (byte) 0xb1, (byte) 0xb6, (byte) 0xbf, (byte) 0xb8, (byte) 0xad, - (byte) 0xaa, (byte) 0xa3, (byte) 0xa4, (byte) 0xf9, (byte) 0xfe, (byte) 0xf7, (byte) 0xf0, (byte) 0xe5, (byte) 0xe2, - (byte) 0xeb, (byte) 0xec, (byte) 0xc1, (byte) 0xc6, (byte) 0xcf, (byte) 0xc8, (byte) 0xdd, (byte) 0xda, (byte) 0xd3, - (byte) 0xd4, (byte) 0x69, (byte) 0x6e, (byte) 0x67, (byte) 0x60, (byte) 0x75, (byte) 0x72, (byte) 0x7b, (byte) 0x7c, - (byte) 0x51, (byte) 0x56, (byte) 0x5f, (byte) 0x58, (byte) 0x4d, (byte) 0x4a, (byte) 0x43, (byte) 0x44, (byte) 0x19, - (byte) 0x1e, (byte) 0x17, (byte) 0x10, (byte) 0x05, (byte) 0x02, (byte) 0x0b, (byte) 0x0c, (byte) 0x21, (byte) 0x26, - (byte) 0x2f, (byte) 0x28, (byte) 0x3d, (byte) 0x3a, (byte) 0x33, (byte) 0x34, (byte) 0x4e, (byte) 0x49, (byte) 0x40, - (byte) 0x47, (byte) 0x52, (byte) 0x55, (byte) 0x5c, (byte) 0x5b, (byte) 0x76, (byte) 0x71, (byte) 0x78, (byte) 0x7f, - (byte) 0x6a, (byte) 0x6d, (byte) 0x64, (byte) 0x63, (byte) 0x3e, (byte) 0x39, (byte) 0x30, (byte) 0x37, (byte) 0x22, - (byte) 0x25, (byte) 0x2c, (byte) 0x2b, (byte) 0x06, (byte) 0x01, (byte) 0x08, (byte) 0x0f, (byte) 0x1a, (byte) 0x1d, - (byte) 0x14, (byte) 0x13, (byte) 0xae, (byte) 0xa9, (byte) 0xa0, (byte) 0xa7, (byte) 0xb2, (byte) 0xb5, (byte) 0xbc, - (byte) 0xbb, (byte) 0x96, (byte) 0x91, (byte) 0x98, (byte) 0x9f, (byte) 0x8a, (byte) 0x8d, (byte) 0x84, (byte) 0x83, - (byte) 0xde, (byte) 0xd9, (byte) 0xd0, (byte) 0xd7, (byte) 0xc2, (byte) 0xc5, (byte) 0xcc, (byte) 0xcb, (byte) 0xe6, - (byte) 0xe1, (byte) 0xe8, (byte) 0xef, (byte) 0xfa, (byte) 0xfd, (byte) 0xf4, (byte) 0xf3}; } \ No newline at end of file diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java index 27c2838..6e078a3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java @@ -1,9 +1,6 @@ package com.casic.missiles.parser.safe.impl; -import cn.hutool.core.util.CharsetUtil; -import cn.hutool.crypto.symmetric.SM4; -import cn.hutool.crypto.symmetric.SymmetricCrypto; - +import com.casic.missiles.parser.safe.SafeStrategy; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; @@ -11,19 +8,44 @@ import org.bouncycastle.crypto.engines.SM4Engine; import org.bouncycastle.crypto.params.KeyParameter; import org.bouncycastle.util.encoders.Hex; - -import static cn.hutool.crypto.Mode.ECB; -import static cn.hutool.crypto.Padding.NoPadding; +import org.springframework.stereotype.Component; /** * SM4算法工具类 */ @Slf4j -public class Sm4 { +@Component("sm4") +public class Sm4 implements SafeStrategy { //加解密的字节快大小 public static final int BlockSize = 16; + @Override + public String decryption(String cipher) { + byte[] keyByte = { + 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 + }; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(keyByte); + byte[] in = Hex.decode(cipher); + byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); + String plain = EcbDecrypt(in, keyBytes); + return plain; + } + + @Override + public String encryption(String cipher) { + byte[] keyByte = { + 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 + }; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(keyByte); + byte[] in = Hex.decode(cipher); + byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); + String plain = EcbDecrypt(in, keyBytes); + return plain; + } + /** * SM4ECB加密算法,对内 * @@ -32,8 +54,6 @@ * @return */ private static byte[] ecb_encrypt(byte[] in, byte[] keyBytes) { - - SM4Engine sm4Engine = new SM4Engine(); sm4Engine.init(true, new KeyParameter(keyBytes)); byte[] out = new byte[in.length]; @@ -58,27 +78,6 @@ return cipher; } - - /** - * hutool 解密SM4 - * - * @param encodeContent - * @return - */ - public static String decode(String encodeContent) { - String key = "24ad182507479a5da3ad94d9d78ea203"; - try { - SymmetricCrypto sm4 = new SM4(ECB, NoPadding, key.getBytes()); - String decryptStr = sm4.decryptStr(encodeContent, CharsetUtil.CHARSET_UTF_8); - return decryptStr; - } catch (Exception e) { - e.printStackTrace(); - log.error("SM4解密失败"); - } - return null; - } - - /** * SM4的ECB加密算法 * @@ -129,20 +128,6 @@ return plain; } - /** - * SM4的ECB解密算法 - * - * @param cipher 输入的密文字符串 - * @param key 密钥 - * @return - */ - public static String EcbDecrypt(String cipher, String key) { - byte[] in = Hex.decode(cipher); - byte[] keyBytes = Hex.decode(key); - - String plain = EcbDecrypt(in, keyBytes); - return plain; - } /** * 主函数 @@ -151,28 +136,24 @@ */ public static void main(String[] args) { byte[] ciphertext = { + 0x4B, (byte) 0x8C, (byte) 0x9D, 0x08, (byte) 0xE4, (byte) 0xD3, 0x64, 0x42, (byte) 0xB9, (byte) 0xA5, (byte) 0xFE, (byte) 0xCD, (byte) 0x91, 0x1B, 0x38, (byte) 0xAC, (byte) 0xE9, 0x1C, (byte) 0xCD, 0x53, 0x02, (byte) 0xD7, 0x0C, (byte) 0x9B, (byte) 0x96, 0x30, 0x62, (byte) 0xE8, (byte) 0xFB, (byte) 0xEF, (byte) 0xB9, (byte) 0xFF, (byte) 0xDE, 0x19, (byte) 0x80, 0x35, 0x3E, (byte) 0x90, 0x4F, 0x2F, 0x12, 0x2B, 0x19, (byte) 0x8B, 0x6C, 0x7A, (byte) 0x85, (byte) 0xA1, (byte) 0xB1, (byte) 0x86, (byte) 0xA3, 0x7A, 0x46, 0x0C, 0x2F, (byte) 0x94, 0x4F, 0x7F, 0x2C, 0x56, 0x14, (byte) 0xF3, (byte) 0x89, (byte) 0xC3, - 0x3F, 0x20, (byte) 0xF9, (byte) 0x87, (byte) 0xA1, 0x60, (byte) 0xD9, (byte) 0xA8, (byte) 0xFD, (byte) 0xD7, (byte) 0x9B, 0x4B, 0x26, 0x06, 0x30, 0x44}; + 0x3F, 0x20, (byte) 0xF9, (byte) 0x87, (byte) 0xA1, 0x60, (byte) 0xD9, (byte) 0xA8, (byte) 0xFD, (byte) 0xD7, (byte) 0x9B, 0x4B, 0x26, 0x06, 0x30, 0x44 + }; ByteBuf in = ByteBufAllocator.DEFAULT.heapBuffer(); in.writeBytes(ciphertext); - byte[] keyByte = { 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 }; ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); - key.writeBytes(ciphertext); - String resCipherData = decode(ByteBufUtil.hexDump(in)); - ByteBuf out = ByteBufAllocator.DEFAULT.heapBuffer(); -// out.writeBytes(resCipherData); -// System.out.println(hexBytes); - System.out.println(resCipherData.toString()); -// String resPlainData = EcbDecrypt(resCipherData, key); -// System.out.println("原始明文:" + data); -// System.out.println("解密后明文:" + resPlainData); + key.writeBytes(keyByte); +// String resCipherData = EcbDecrypt(ByteBufUtil.hexDump(in), ByteBufUtil.hexDump(key)); +// System.out.println(resCipherData); } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java index 1395a51..ac5f957 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java @@ -1,7 +1,7 @@ package com.casic.missiles.parser.safe.impl; import io.netty.buffer.ByteBufUtil; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** *

@@ -14,9 +14,8 @@ * @author hyl * @version v1.0: Tea.java, v 0.1 2021/3/12 13:48 $ */ -@Service("tea") -///tea算法类 - +//tea算法类 +@Component("tea") public class Tea { public static byte[] MyTea_Encrypt(byte[] MyTeaContent, int ByteLen, byte[] MyTeakey) { @@ -99,7 +98,6 @@ // for(int i32Index = 0; i32Index < 8; i32Index++) { // System.out.print("0x" + Integer.toHexString(MyContent[i32Index]) + " "); // } - // System.out.println("密钥为:"); // for(int i32Index = 0; i32Index < 16; i32Index++) { // System.out.print("0x" + Integer.toHexString(MyKeys[i32Index]) + " "); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java index bdd0721..bd1516a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java @@ -3,7 +3,7 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.parser.sender.DataSubscribeProvider; import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponents; import org.springframework.web.util.UriComponentsBuilder; @@ -12,7 +12,7 @@ import java.util.Collections; import java.util.Map; -@Service("functionCallback") +@Component("functionCallback") public class FunctionCallback implements DataSubscribeProvider { @Resource diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java index 0b44fb9..7526de2 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.Map; -@Service("middleware") +@Component("middleware") public class MiddlewareSubscribe implements DataSubscribeProvider { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java index 5dcee3f..e2f1192 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.Map; -@Service("nosql") +@Component("nosql") public class NoSqlSubscribe implements DataSubscribeProvider { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java b/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java new file mode 100644 index 0000000..81a5324 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java @@ -0,0 +1,86 @@ +package com.casic.missiles.pojo; + +import lombok.Data; + +/** + * 协议 + */ +@Data +public class Msg { + + /** + * 前导码 + */ + private String preamble; + + /** + * 版本号 + */ + private String version; + + /** + * 内容长度 + */ + private int leng; + + /** + * 设备ID + */ + private String deviceId; + + /** + * 通讯方式 + */ + private Integer connType; + + /** + * 加密方式 + */ + private Integer encryType; + + /** + * 目标地址 + */ + private String destAddr; + + /** + * PDUType + */ + private String PDUType; + + /** + * 操作类型 + */ + private Integer operateType; + + /** + * 传输控制位 PDUType.bit7=0时,表示存在后续的访问;当PDUType.bit7=1时,表示无后续的访问。 + */ + private Integer transControlFlag; + + /** + * 设备类型 + */ + private Integer deviceType; + + /** + * 序号 + */ + private Integer seq; + + /** + * tagList + */ + private String tagList; + + /** + * OidList + */ + private String OidList; + + /** + * CRC + */ + private String CRC; + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java index 40a5265..97cc984 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java @@ -40,7 +40,7 @@ String httpContent = msg.toString(Charset.defaultCharset()); log.info(" String : " + msg.toString(Charset.defaultCharset())); String majorContent = httpContent.substring(httpContent.indexOf("{"), httpContent.lastIndexOf("}") + 1); - String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("serviceData")).get("Value")); + String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("RegistryData")).get("Value")); log.info("----------------------------------" + values); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); bufferContent.writeBytes(values.getBytes(Charset.forName("ISO-8859-1"))); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java index 1b132a7..e3ced4b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java @@ -35,7 +35,7 @@ String httpContent = msg.toString(Charset.defaultCharset()); log.info(" String : " + msg.toString(Charset.defaultCharset())); String majorContent = httpContent.substring(httpContent.indexOf("{"), httpContent.lastIndexOf("}") + 1); - String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("serviceData")).get("Value")); + String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("RegistryData")).get("Value")); log.info("----------------------------------" + values); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); bufferContent.writeBytes(values.getBytes(Charset.forName("ISO-8859-1"))); diff --git a/sensorhub-core/src/main/resources/application.properties b/sensorhub-core/src/main/resources/application.properties deleted file mode 100644 index 8b13789..0000000 --- a/sensorhub-core/src/main/resources/application.properties +++ /dev/null @@ -1 +0,0 @@ - diff --git a/sensorhub-core/src/main/resources/config/application-dev.yml b/sensorhub-core/src/main/resources/config/application-dev.yml index 4f897a8..dcc4c2d 100644 --- a/sensorhub-core/src/main/resources/config/application-dev.yml +++ b/sensorhub-core/src/main/resources/config/application-dev.yml @@ -4,9 +4,9 @@ spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true + url: jdbc:mysql://127.0.0.1:3306/sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true username: root - password: Casic203 + password: root session: store-type: redis redis: diff --git a/sensorhub-core/src/main/resources/config/application.yml b/sensorhub-core/src/main/resources/config/application.yml index ae89f9d..7965da1 100644 --- a/sensorhub-core/src/main/resources/config/application.yml +++ b/sensorhub-core/src/main/resources/config/application.yml @@ -30,6 +30,13 @@ port: 6379 password: ew5T4K3#203lwh config-prefix: 'Casic:' +#代码生成器配置 +code: + generate: + #作者 + author: cz + #待生成对象表名 + table-name: bussiness_field_config,combined_field_config sensorhub: config: port: 7091 diff --git a/sensorhub-support/pom.xml b/sensorhub-support/pom.xml index 9a71296..761601c 100644 --- a/sensorhub-support/pom.xml +++ b/sensorhub-support/pom.xml @@ -42,6 +42,12 @@ ${redis.version} + + com.baomidou + mybatis-plus-generator + ${mybatis-plus-generator.version} + + org.reflections diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java index 608af3a..32cc8a4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java @@ -2,48 +2,47 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.delivery.decorator.ByteDecorator; +import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @AllArgsConstructor public class FieldDecoratorManger { - private final RuleDictDao ruleDictDao; + private final RuleConfigRegistry ruleDictDao; // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 // (1)静态的业务字段是字典里面可以配置的 // (2)动态的业务字段是通过规则生成的 public String contentMerge(String ruleJson, String sceneConent, String dynamicContent) { - List ruleDictList = ruleDictDao.getRuleDictConfig(); - Map ruleDictMap = ruleDictList.stream().collect( - Collectors.toMap(RuleDict::getId, e -> e)); - List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); - for (Map ruleMap : ruleMapList) { - String ruleType = String.valueOf(ruleMap.get("ruleType")); - ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); - NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); - byteDecorator.nodeDecoratorRule(nodeDecoratorParm); - } +// List ruleDictList = ruleDictDao.getRuleDictConfig(); +// Map ruleDictMap = ruleDictList.stream().collect( +// Collectors.toMap(RuleDict::getId, e -> e)); +// List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); +// for (Map ruleMap : ruleMapList) { +// String ruleType = String.valueOf(ruleMap.get("ruleType")); +// ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); +// NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); +// byteDecorator.nodeDecoratorRule(nodeDecoratorParm); +// } return null; } - - private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { - NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() - .contents(sceneConent) - .dynamicContent(dynamicContent) - .ruletypeId(ruletypeId) - .ruleDictMap(ruleDictMap) - .build(); - return nodeDecoratorParm; - } +// +// private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { +// NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() +// .contents(sceneConent) +// .dynamicContent(dynamicContent) +// .ruletypeId(ruletypeId) +// .ruleDictMap(ruleDictMap) +// .build(); +// return nodeDecoratorParm; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java index 652970c..b204ac3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java @@ -1,56 +1,56 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@AllArgsConstructor -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", - JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Component; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Component("logicalDecorator") +//@AllArgsConstructor +//@Slf4j +//public class LogicalShiftDecorator implements ByteDecorator { +// +//// private final FieldRuleEngineMapper fieldRuleEngineMapper; +//// +//// //字节位移 +//// @Override +//// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +//// String logicalValue = ""; +//// RuleEvaluator fieldRuleEngine = new RuleEvaluator(); +//// try { +//// Map env2 = new HashMap(); +//// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +//// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +//// for (String contentId : contentIdList) { +//// RuleDict ruleDict = ruleDictMap.get(contentId); +//// if (ruleDict.getCode().contains("#")) { +//// //使用动态的值 +//// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +//// } +//// env2.put(ruleDict.getName(), ruleDict.getCode()); +//// } +//// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +//// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +//// return null; +//// } +//// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +//// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +//// return values; +//// } catch (Exception ex) { +//// log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", +//// JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +//// return null; +//// } +//// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java index 346468f..822fead 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@AllArgsConstructor -@Slf4j -public class OperationDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("optionDecorator") +//@AllArgsConstructor +//@Slf4j +//public class OperationDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //混合运算,有常量或者乘除的缩放 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java index 50fb0a7..7a8bccb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@AllArgsConstructor -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +////精度计算 +//@AllArgsConstructor +//@Registry("precisionDecorator") +//@Slf4j +//public class PrecisionDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java index da39235..27f9cc7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java @@ -1,54 +1,53 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@AllArgsConstructor -@Slf4j -public class RuleDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("ruleDecorator") +//@AllArgsConstructor +//@Slf4j +//public class RuleDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //吃我一套正则表达式 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (Exception ex) { +// log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java index 7f5cbf3..c043f97 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java @@ -2,6 +2,6 @@ import java.util.Map; -public interface ComandeEventService { +public interface ComandeEventService{ Map loadComandeEventConfig(String protocolId,String scene); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java index 476ad84..aaf1837 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java @@ -2,46 +2,46 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.dao.CommandEventDao; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @Slf4j @AllArgsConstructor -public class ComandeEventServiceImpl implements ComandeEventService { +public class ComandeEventServiceImpl implements ComandeEventRegistry { - private final CommandEventDao commandEventDao; + // private final CommandEventDao commandEventDao; // 加密bean 固定字段出现变化的字段解析,业务字段的有序内容 @Override - public Map loadComandeEventConfig(String protocolId,String sceneName) { - CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); - if (ObjectUtil.isEmpty(commandEventConfig)) { - log.error("协议{},没有配置成功接收回复配置,清排查原因"); - return null; - } - String replyJson = commandEventConfig.getReplyContentJson(); - List> replyMapList = JSONArray.parseObject(replyJson, List.class); - List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); - Map fixMap = fixList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); - List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) - .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) - .collect(Collectors.toList()); - Map commandConfigMap = new HashMap<>(); - commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); - commandConfigMap.put("fixContent", fixMap); - commandConfigMap.put("bizContent", contentList); - return commandConfigMap; + public Map loadComandeEventConfig(String protocolId, String sceneName) { +// CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); +// if (ObjectUtil.isEmpty(commandEventConfig)) { +// log.error("协议{},没有配置成功接收回复配置,清排查原因"); +// return null; +// } +// String replyJson = commandEventConfig.getReplyContentJson(); +// List> replyMapList = JSONArray.parseObject(replyJson, List.class); +// List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); +// Map fixMap = fixList.stream() +// .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); +// List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) +// .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) +// .collect(Collectors.toList()); +// Map commandConfigMap = new HashMap<>(); +// commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); +// commandConfigMap.put("fixContent", fixMap); +// commandConfigMap.put("bizContent", contentList); +// return commandConfigMap; + return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 128b09d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java deleted file mode 100644 index 4016b0b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface DatagramEventMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java deleted file mode 100644 index 597c306..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.apache.ibatis.annotations.Mapper; - -public interface FieldConfigMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java deleted file mode 100644 index a31680a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.PreRuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface PreRuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java deleted file mode 100644 index 9060a69..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface ProtocolConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java deleted file mode 100644 index 6fa6936..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java deleted file mode 100644 index 582a705..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleDict; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleDictMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java deleted file mode 100644 index 6e302c8..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.CommandEventMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Optional; - -@Component -public class CommandEventDao { - - @Resource - private CommandEventMapper commandEventMapper; - - public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId) - .eq("scene", sceneName) - .eq("enabled", 1); - List commandEventConfig = commandEventMapper.selectList(queryWrapper); - Optional optionalEventConfig = commandEventConfig.stream().findFirst(); - return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java deleted file mode 100644 index 9137e4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.FieldConfigMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class FieldConfigDao { - - @Resource - private FieldConfigMapper fieldConfigMapper; - - public FieldConfig getFieldConfigById(String fieldId) { - FieldConfig fieldConfig = fieldConfigMapper.selectById(fieldId); - return fieldConfig; - } - - public List getFieldConfigs(String protocolId,Integer isFixed) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",isFixed); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - - public List getStorageFieldConfig(String protocolId) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",1) - .eq("is_storage",1); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java deleted file mode 100644 index 67bff6b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.mapper.PreRuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class PreRuleConfigDao { - - @Resource - private PreRuleConfigMapper preRuleConfigMapper; - - public List getPreRuleList(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return preRuleConfigMapper.selectList(queryWrapper); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java deleted file mode 100644 index d69ea85..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.RuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleConfigDao { - - @Resource - private RuleConfigMapper ruleConfigMapper; - - public RuleConfig getNextRuleConfig(String ruleFields) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("parse_rule_json", ruleFields); - return ruleConfigMapper.selectOne(queryWrapper); - } - - - public List getRuleConfigById(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return ruleConfigMapper.selectList(queryWrapper); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java deleted file mode 100644 index 932c185..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.RuleDictMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleDictDao { - - @Resource - private RuleDictMapper ruleDictMapper; - - public List getRuleDictConfig() { - List ruleDictList = ruleDictMapper.selectList(null); - return ruleDictList; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java index 9f9e279..43bc4d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java @@ -10,20 +10,15 @@ import io.netty.channel.socket.nio.NioServerSocketChannel; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import javax.annotation.PreDestroy; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static cn.hutool.core.util.ClassUtil.getClasses; /** * SensorhubServer netty服务端 */ @Slf4j -@Service +@Component public class SensorhubServer { /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java index 2c79ff5..9a28c36 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java @@ -11,13 +11,13 @@ import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioSocketChannel; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClient 客户端 */ @Slf4j -@Service +@Registry public final class SensorhubClient { public static void main(String[] args) throws Exception { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java index 9774be0..477c3f7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java @@ -6,12 +6,12 @@ import io.netty.channel.socket.SocketChannel; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientChannelInitialHandler */ -@Service +@Registry public class SensorhubClientChannelInitialHandler extends ChannelInitializer { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java index 346f4b3..73560e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java @@ -5,13 +5,13 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientHandler */ @Slf4j -@Service +@Registry public class SensorhubClientHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java index 5c1c6f2..d990af5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java @@ -4,12 +4,12 @@ import com.casic.missiles.pojo.Msg; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** * SensorhubServerHandler */ -@Service +@Component public class SensorhubServerHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 67283ae..af3172c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,41 +1,37 @@ package com.casic.missiles.parser; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultProtocolConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.*; +import com.casic.missiles.registry.FieldConfigRegistry; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; -import java.nio.charset.Charset; import java.util.HashMap; import java.util.List; import java.util.Map; -@Service("genericProtocolParser") +/** + * @author + */ +@Component("genericProtocolParser") @Slf4j -@AllArgsConstructor +@RequiredArgsConstructor public class GenericProtocolParser implements ProtocolParser { - private final LeadingCodeMatcher leadingCodeMatcher; private final List frameStructDispenserList; - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorInstanceSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; // 匹配首字母前导码=> 帧结构匹配前导码=> // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 @@ -44,18 +40,19 @@ public Boolean doParseProtocol(ByteBuf byteBuf) { String protocolContent = ByteBufUtil.hexDump(byteBuf); //匹配前导码 - List preCodeConfigs = leadingCodeMatcher.matchLeadingCode(protocolContent); + List preCodeConfigs = LeadingCodeMatcher.matchFrameLeadingCode(protocolContent); //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 if (preCodeConfigs.size() == 0) { - return rematch(byteBuf,protocolContent); + return rematch(byteBuf, protocolContent); } - //暂时先取第一个 + //暂时先取第一个,提升速度,使用享元模式, 减少类的创建销毁与构建 ProtocolConfig protocolConfig = preCodeConfigs.get(0); + AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); ByteBuf wholeDatagramByte = null; //通过匹配帧结构获取完整的数据包 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, preCodeConfigs.get(0))) != null) { + if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, protocolFactory)) != null) { break; } } @@ -68,76 +65,78 @@ * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 */ - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId, wholeDatagramByte); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap, protocolId); - //选取规则对应的流程实例 - DatagramEventConfig datagramEventConfig = processorInstanceSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); + //进行规则字段解析,进行匹配规则 + RuleConfig ruleConfig = getRuleConfig(protocolFactory, wholeDatagramByte); + if (ruleConfig == null) { + return false; + } //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, wholeDatagramByte); + ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte); + //以下进行业务的规则解析,同时选定流程实例 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); + DatagramEventProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain, + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText, protocolId); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain); //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); + datagramEventProvider.storeData(bizDataMap); return true; } - private Boolean rematch(ByteBuf byteBuf,String protocolContent) { + /** + * 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 + */ + private Boolean rematch(ByteBuf byteBuf, String protocolContent) { //重置位判断 byteBuf.resetReaderIndex(); //判断重置是否前移,如果没有前移,则直接判为匹配失败 if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { return false; } else { + //递归执行 return doParseProtocol(byteBuf); } } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; + //获取匹配规则->匹配规则 + private RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + //取出其中参与逻辑provider并判空 + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); + String rulePrepareFields = protocolConfig.getRulePrepareFields(); + //固定字段 + if (StringUtils.isNotEmpty(rulePrepareFields)) { + //获取统一固定字段解析 + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + //获取该协议的字段配置,用于协议规则匹配 + List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); + //获取规则 + RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, + rulePrepareFields, protocolFieldConfigs); + return ruleConfig; + } + return null; } - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + //数据构建,获取固定字段的store和业务字段store + private Map buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + Map bizDataMap = new HashMap<>(); + Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); + Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); + bizDataMap.putAll(ruleStoreObjectMap); + bizDataMap.putAll(protocolStoreObjectMap); return bizDataMap; } - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java index 8a46e32..16ce2e5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java @@ -3,6 +3,7 @@ import io.netty.buffer.ByteBuf; public interface ProtocolParser { + Boolean doParseProtocol(ByteBuf byteBuf); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java new file mode 100644 index 0000000..f7814af --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java @@ -0,0 +1,35 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.ProtocolConfigProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.ProtocolConfig; + +/** + * 存放基本协议的的加载信息 + */ +public class AbstractProtocolConfigFactory { + private final ProtocolConfigProvider protocolConfigProvider; + private final ProtocolFieldConfigProvider protocolFieldConfigProvider; + private final RuleConfigProvider ruleConfigProvider; + + public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { + this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); + this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); + this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); + } + + public ProtocolConfigProvider getProtocolConfigProvider() { + return protocolConfigProvider; + } + + public ProtocolFieldConfigProvider getProtocolFieldConfigProvider() { + return protocolFieldConfigProvider; + } + + public RuleConfigProvider getRuleConfigProvider() { + return ruleConfigProvider; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java new file mode 100644 index 0000000..6e36147 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java @@ -0,0 +1,57 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.CombinedFieldConfigProvider; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.FieldConfigProvider; +import com.casic.missiles.parser.provider.FieldRuleConfigProvider; + +/** + * 存放规则相关的的的加载信息 + */ +public class AbstractRuleConfigFactory { + + /** + * 处理字节 + */ + private final FieldConfigProvider fieldConfigProvider; + /** + * 处理组合字节解析的解码器 + */ + private final CombinedFieldConfigProvider combinedFieldConfigProvider; + /** + * 处理负责字节解析的规则配置 + */ + private final FieldRuleConfigProvider fieldRuleConfigProvider; + /** + * 处理实例流程 + */ + private final DatagramEventProvider datagramEventProvider; + + + public AbstractRuleConfigFactory(Long ruleId) { + this.fieldConfigProvider = new FieldConfigProvider(ruleId); + this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); + this.fieldRuleConfigProvider = new FieldRuleConfigProvider(ruleId); + this.datagramEventProvider = new DatagramEventProvider(ruleId); + } + + public FieldConfigProvider getFieldConfigProvider() { + return fieldConfigProvider; + } + + public CombinedFieldConfigProvider getCombinedFieldConfigProvider() { + return combinedFieldConfigProvider; + } + + public FieldRuleConfigProvider getFieldRuleConfigProvider() { + return fieldRuleConfigProvider; + } + + public DatagramEventProvider getDatagramEventProvider() { + return datagramEventProvider; + } + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java deleted file mode 100644 index 6e1719a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.factory; - - -import com.casic.missiles.pojo.ProtocolConfig; - -import java.util.List; - -/** - * 数据库访问优化(暂时未做) - *

- * 1、初始化协议解析配置,并存放到处存放缓存,对协议基本配置进行管理 - * 2、其中流程中所有的配置都经过此类进行管理,进行调用获取,增强解析速度 - */ -public interface DatagramFactory { - - /** - * 初始化 - */ - List datagramInit(); - - /** - * 根据前导码配置匹配,模糊匹配获取所有的报文项 - */ - List match(); - - /** - * 根据前导码匹配,返回报文项 - */ - List filer(); - - /** - * 保证数据的唯一性选择器 - */ - List selectOne(); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java new file mode 100644 index 0000000..87444a0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java @@ -0,0 +1,18 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +import java.util.List; + +/** + * 直接用,还是边用边创建 + */ +public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { + + + public DefaultProtocolConfigFactory(ProtocolConfig protocolConfig) { + super(protocolConfig); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java new file mode 100644 index 0000000..cce0c7c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java @@ -0,0 +1,12 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; + +public class DefaultRuleFactory extends AbstractRuleConfigFactory { + + public DefaultRuleFactory(Long ruleId) { + super(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java deleted file mode 100644 index 9ee97e0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.casic.missiles.parser.instance; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service -@Slf4j -@AllArgsConstructor -public class GeneralProcessor { - - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; - - /** - * 统一固定字段解析=>进行规则的查询的判断 - * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 - * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 - */ - @Deprecated - public boolean parseWholeDatagram(ByteBuf buffer, ProtocolConfig protocolConfig) { - try { - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap,protocolId); - //选取规则对应的流程= - DatagramEventConfig datagramEventConfig = processorSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); - //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); - //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); - //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); - //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); - //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); - return true; - } catch (Exception ex) { - log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", - ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); - return false; - } - } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; - } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); - } - - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); - return bizDataMap; - } - - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java index 25e7ad8..6a5777e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java @@ -1,23 +1,31 @@ package com.casic.missiles.parser.instance.impl; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.mapper.DatagramEventMapper; import com.casic.missiles.pojo.DatagramEventConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.SpringContextUtil; -@Service -@AllArgsConstructor +import java.util.List; +import java.util.Optional; + +/** + * @author cz + * + */ public class DefaultProcessorInstanceSelector implements ProcessorInstanceSelector { - private final DatagramEventMapper datagramEventMapper; + private static List datagramEventConfigs; + + static { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + datagramEventConfigs = datagramEventRegistry.getDatagramEventList(); + } @Override public DatagramEventConfig getProcessorInstance(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("rule_id", protocolId); - return datagramEventMapper.selectOne(queryWrapper); + Optional optionalSelectInstance = datagramEventConfigs.stream() + .filter(e -> e.getId().equals(protocolId)).limit(1).findFirst(); + return optionalSelectInstance.isPresent() ? optionalSelectInstance.get() : null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a778671..7b56a43 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,16 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import io.netty.buffer.ByteBuf; /** - * 分析匹配情况 - * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 - * 2、匹配不成功,有后续帧,可以进行下次匹配。 - * 3、匹配不成功,无后续帧,可以进行丢弃。 + * 分析匹配情况 + * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 + * 2、匹配不成功,有后续帧,可以进行下次匹配。 + * 3、匹配不成功,无后续帧,可以进行丢弃。 */ -public interface FrameStructMatcher{ +public interface FrameStructMatcher { - ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig); + ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 05320ab..8ebea78 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,23 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.ProtocolConfigMapper; +import com.casic.missiles.parser.provider.ProtocolConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Component; import java.util.List; import java.util.stream.Collectors; -@Component -@AllArgsConstructor public class LeadingCodeMatcher { - private final ProtocolConfigMapper protocolMapper; - //** 1、首字母匹配前导码, // 2、以匹配出的前导码是否在报文中条件进行前导码的匹配二次筛选 - public List matchLeadingCode(String protocolContent){ + public static List matchFrameLeadingCode(String protocolContent){ List initialConfigs = initialMatch(protocolContent); List preCodeConfigs = initialConfigs.stream() .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) @@ -26,13 +19,16 @@ } //初始化匹配前导码内容 - private List initialMatch(String protocolContent) { - String protocolStr = protocolContent.charAt(0) + ""; - QueryWrapper queryWrapper = new QueryWrapper() - .likeRight("pre_fix", protocolStr); - List protocolConfigList = protocolMapper.selectList(queryWrapper); - return protocolConfigList; + private static List initialMatch(String protocolContent) { + String firstFrameChar = protocolContent.charAt(0) + ""; + ProtocolConfigProvider protocolConfigProvider=new ProtocolConfigProvider(firstFrameChar); + return protocolConfigProvider.getMatchList(); } + + + + + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index cf2113d..e915877 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -1,32 +1,35 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(0) -@Service +@Component public class FrameLengthMatcher implements FrameStructMatcher { - @Autowired - private FieldParser fieldParser; - //超过长度 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { String dataGramContent = ByteBufUtil.hexDump(byteBuf); - if (StringUtils.isEmpty(protocolConfig.getUnpackId()) && StringUtils.isEmpty(protocolConfig.getTailStr())) { - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + //当不存在结尾标志和拆包标志,可以直接使用长度进行匹配 + if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { if (dataGramContent.length() >= totalLength) {//等于长度返回true,超出长度,切断 - ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, protocolConfig, totalLength); + ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, totalLength); return wholeDatagramByte; } else { //读的标志位前移舍弃 @@ -38,7 +41,7 @@ return null; } - private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, Integer totalLength) { byteBuf.readBytes(totalLength); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, totalLength - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 2bfc213..d527ad0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; @@ -13,7 +13,7 @@ import lombok.AllArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.nio.charset.Charset; import java.util.Map; @@ -22,32 +22,30 @@ * 后续标志验证 */ @Order(1) -@Service +@Component @AllArgsConstructor -public class FrameMarkMatcher implements FrameStructMatcher { - - private final FieldConfigDao fieldConfigDao; - private final FieldParser fieldParser; - private final FieldResolver fieldResolverManger; +public class FrameMarkMatcher implements FrameStructMatcher, FixedPropertyEnum { //帧后续标志=>结束,进行帧的重组=>有后续,1、帧移位判别 2、继续接收帧 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig UnpackConfig = StringUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getUnpackId()); - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); - Integer upback = 0; + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); ByteBuf mergeWholeFrameByte = null; - if (!ObjectUtil.isEmpty(UnpackConfig)) { - while (hasNextFullFrame(byteBuf, protocolConfig)) { - upback = (Integer) fieldResolverManger.filedParserManger(byteBuf, UnpackConfig, null); + if (!ObjectUtil.isEmpty(unpackFlag)) { + while (hasNextFullFrame(byteBuf, protocolConfig, protocolFieldConfigProvider)) { //是否存在后续位 - if (upback == 1) {//使用esayRule + if (unpackFlag == 1) {//使用esayRule //表示可以截取 - mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolConfig, totalLength); + mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolFieldConfigProvider, protocolConfig); return mergeWholeFrameByte; } else { - byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig)); + byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig, protocolFieldConfigProvider)); } } } @@ -56,7 +54,8 @@ //选取第一个帧,将业务内容和后面部分分开 //计算数据报文-业务内容 - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolFieldConfigProvider protocolFieldConfigProvider, ProtocolConfig protocolConfig) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); //截取完整报文 byteBuf.readBytes(totalLength); ByteBuf byteBufContent = byteBuf.slice(0, byteBuf.readerIndex()); @@ -68,15 +67,15 @@ String tail = ""; System.out.println(ByteBufUtil.hexDump(byteBufContent)); //会存在多个帧拼接在一起的的情况,进行合并处理 - while (hasNextFullFrame(byteBufContent, protocolConfig)) { - Integer currentFrameLength = fieldParser.getTotalLength(protocolConfig, byteBufContent); + while (hasNextFullFrame(byteBufContent, protocolConfig, protocolFieldConfigProvider)) { + Integer currentFrameLength = protocolFieldConfigProvider.getTotalLength(byteBufContent, protocolConfig); byteBufContent.readBytes(currentFrameLength); ByteBuf currentbyteBuf = byteBufContent.slice(0, byteBufContent.readerIndex()); byteBufContent.markReaderIndex();//读的标志位前移 System.out.println(ByteBufUtil.hexDump(byteBufContent)); String hexDump = currentbyteBuf.toString(Charset.forName("ISO-8859-1")); //获取当前固定帧结构的关系map - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, currentbyteBuf); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(currentbyteBuf, protocolConfig); if (StringUtils.isEmpty(mergeFrameStr)) { //首次获取业务数据报文 mergeFrameStr += hexDump.substring(0, currentFrameFixedProperty.get("tailPosition")); @@ -95,22 +94,22 @@ /** * 获取平移到下一帧起始位置 */ - public int getNextFrameOffset(ByteBuf buffer, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, buffer); - return currentFrameFixedProperty.get("totalLength"); + public int getNextFrameOffset(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + return currentFrameFixedProperty.get(TOTAL_LENGTH); } /** * 判断是否出错进行整个帧的 */ - public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, byteBuf); + public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); //保证读取位置不在固定位置,是可变的业务内容 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("fixedPosition")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(FIXED_POSITION)) { return false; } //判断读取是否操作帧长度 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("totalLength")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(TOTAL_LENGTH)) { return false; } return true; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 76a3784..c3a1bab 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -1,50 +1,50 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.parser.instance.GeneralProcessor; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; +import io.netty.buffer.ByteBufUtil;; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(2) -@Service +@Component public class FrameTailMatcher implements FrameStructMatcher { - @Resource - private FieldConfigDao fieldConfigDao; - @Autowired - private GeneralProcessor generalProcessor; - //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig tailFieldConfig = StringUtils.isEmpty(protocolConfig.getTailStr()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getTailStr()); - if (!ObjectUtil.isEmpty(tailFieldConfig)) { - String tailStr = tailFieldConfig.getFieldName(); + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfig protocolFieldConfig = ObjectUtils.isEmpty(protocolConfig.getTailStr()) ? null : + fieldConfigProvider.getFieldConfigById(protocolConfig.getTailStr()); + if (!ObjectUtil.isEmpty(protocolFieldConfig)) { + String tailStr = protocolFieldConfig.getFieldName(); String dataGramContent = ByteBufUtil.hexDump(byteBuf); Boolean tailFlag = ByteBufUtil.hexDump(byteBuf).contains(tailStr); if (!tailFlag) { //使用esayRule return null; } else if (dataGramContent.indexOf(tailStr) < dataGramContent.length() - tailStr.length()) { Integer length = dataGramContent.indexOf(tailStr) + tailStr.length(); - ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, protocolConfig, length); + ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, length); return wholeDatagramByte; //存在粘包 } } return null; } - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer length) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, Integer length) { byteBuf.readBytes(length); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, length - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java new file mode 100644 index 0000000..5f1c177 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java @@ -0,0 +1,73 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.combined.GenericCombinedFieldResolver; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.CombinedFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class CombinedFieldConfigProvider { + + + /** + * 作为临时配置列表缓存使用 + */ + private final List combinedFieldConfigList; + private Map storeObjectMap = new HashMap<>(); + + public CombinedFieldConfigProvider(Long ruleId) { + CombinedFieldConfigRegistry combinedFieldConfigRegistry = SpringContextUtil.getBean(CombinedFieldConfigRegistry.class); + combinedFieldConfigList = combinedFieldConfigRegistry.getCombinedFieldConfigList(ruleId); + } + + public void parseDataField(RuleConfig ruleConfig, String clearZeroPlain,Map fieldConfigsMap ) { + if (showSkip()) { + return; + } + //匹配对应的数据,然后进行相关的字段解析 + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver(); + combinedFieldResolver.parseDataField(combinedFieldConfigList, byteBuf, storeObjectMap,fieldConfigsMap); + } + + + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getCombinedFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return combinedFieldConfigList.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public List getCombinedFieldConfigList() { + return combinedFieldConfigList; + } + + /* 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(combinedFieldConfigList) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java new file mode 100644 index 0000000..f3cfedc --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java @@ -0,0 +1,11 @@ +package com.casic.missiles.parser.provider; + +/** + * @author cz + * @date 2023-6-12 + */ +public class CommandEventProvider{ + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java new file mode 100644 index 0000000..70eec5e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java @@ -0,0 +1,77 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.safe.SafeStrategy; +import com.casic.missiles.parser.sender.DataSubscribeProvider; +import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class DatagramEventProvider { + + private final DatagramEventConfig processorInstance; + + public DatagramEventProvider(Long ruleId) { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + List datagramEventConfigList = + datagramEventRegistry.getDatagramEventList(ruleId); + processorInstance = this.getProcessorInstance(datagramEventConfigList); + } + + public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { + if (showSkip()) { + return null; + } + return datagramEventConfigList.get(0); + } + + // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 + public String getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap) { + String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? + processorInstance.getSafeBean() : + fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); + if (!StringUtils.isEmpty(safeName)) { + //需要加密 + SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); + String plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); + return clearComplementZero(plain); + } + return ByteBufUtil.hexDump(bizDataContent); + } + + //解密清零操作 + private String clearComplementZero(String plain) { + plain = plain.substring(0, plain.lastIndexOf("00")); + return plain; + } + + //数据发送,数据发送者暂未构建 + public void storeData(Map bizDataMap) { + DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); +// dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return ObjectUtils.isNotEmpty(processorInstance) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java new file mode 100644 index 0000000..7e1fe0a --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java @@ -0,0 +1,97 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.FieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class FieldConfigProvider { + + + private final List fieldConfigs; + private Map storeObjectMap = new HashMap<>(); +// private Map singleObjects = new ConcurrentHashMap<>(); + + public FieldConfigProvider(Long ruleId) { + FieldConfigRegistry fieldConfigRegistry = SpringContextUtil.getBean(FieldConfigRegistry.class); + fieldConfigs = fieldConfigRegistry.getFieldConfigList(ruleId); + } + + public List getFieldConfigs() { + return fieldConfigs; + } + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public Map parseDataField(RuleConfig ruleConfig, String clearZeroPlain) { + if (showSkip()) { + return null; + } + List prepareFieldConfig = prepareParseField(ruleConfig); + if (CollectionUtils.isNotEmpty(prepareFieldConfig)) { + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(fieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + return fixDataMap; + } + } + return null; + } + + /** + * 得到需要处理的业务内容 + * + * @return + */ + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return fieldConfigs.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public Map getFieldConfigsMap() { + return fieldConfigs.stream().collect( + Collectors.toMap(FieldConfig::getId, e -> e) + ); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(fieldConfigs) ? false : true; + } + + +} + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java new file mode 100644 index 0000000..817bfaf --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java @@ -0,0 +1,19 @@ +package com.casic.missiles.parser.provider; + +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.registry.FieldRuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; + +public class FieldRuleConfigProvider { + + private final List fieldRuleConfigList; + + public FieldRuleConfigProvider(Long ruleId) { + FieldRuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(FieldRuleConfigRegistry.class); + fieldRuleConfigList = ruleConfigRegistry.getFieldRuleConfigList(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java new file mode 100644 index 0000000..99a1b06 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java @@ -0,0 +1,53 @@ +package com.casic.missiles.parser.provider; + + +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.registry.ProtocolConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolConfigProvider { + + private final List protocolConfigList; + + public ProtocolConfigProvider(String firstChar) { + ProtocolConfigRegistry registry = SpringContextUtil.getBean(ProtocolConfigRegistry.class); + protocolConfigList = registry.getProtocolConfigList(firstChar); + } + + public List getMatchList() { + return protocolConfigList; + } + + /** + * 设置当前协议 + * + * @param protocolConfig + */ + public ProtocolConfigProvider(ProtocolConfig protocolConfig) { + List protocolConfigs = new ArrayList<>(); + protocolConfigs.add(protocolConfig); + protocolConfigList = protocolConfigs; + } + + /** + * 获取当前协议 + * + * @return + */ + public ProtocolConfig getCurrentProtocolConfig() { + if (this.protocolConfigList == null) { + return null; + } else { + return protocolConfigList.get(0); + } + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java new file mode 100644 index 0000000..043927d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java @@ -0,0 +1,213 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.registry.ProtocolFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolFieldConfigProvider { + + private static final String FIXED_FIELD_DS = "fixedFieldDs"; + private static final String CONTENT_FIELD_DS = "contentFieldDs"; + private static final String PROTOCOL_LENGTH = "protocolLength"; + private static final String PROTOCOL_FIELD_ID = "protocolFieldId"; + private static final String PROTOCOL_POSITION = "protocolPosition"; + + private final List protocolFieldConfigs; + private Map singleObjects = new ConcurrentHashMap<>(); + private Map storeObjectMap = new HashMap<>(); + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public ProtocolFieldConfigProvider(Long protocolId) { + ProtocolFieldConfigRegistry protocolFieldConfigRegistry = SpringContextUtil.getBean(ProtocolFieldConfigRegistry.class); + protocolFieldConfigs = protocolFieldConfigRegistry.getProtocolFieldConfigList(protocolId); + } + + public List getProtocolFieldConfigs() { + return protocolFieldConfigs; + } + + public ProtocolFieldConfig getFieldConfigById(Long fieldId) { + Optional optionalConfig = protocolFieldConfigs.stream().filter( + e -> e.getId().equals(fieldId) + ).findFirst(); + return optionalConfig.isPresent() ? optionalConfig.get() : null; + } + + public Integer getProtocolFieldValue(Long protocolFieldId, ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_FIELD_ID + protocolFieldId + ByteBufUtil.hexDump(byteBuf); + //获取缓存 + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + //加载固定长度数据集合 + Map fixDataMap = this.getProtocolDataMap(byteBuf); + ProtocolFieldConfig protocolFieldConfig = selectFieldConfig(protocolFieldId); + Integer protocolFieldValue = 0; + //获取约定字段的总长度 + if (fixDataMap.containsKey(protocolFieldConfig.getFieldName())) { + Object appointUnpackObject = fixDataMap.get(protocolFieldConfig.getFieldName()); + if (ObjectUtils.isNotEmpty(appointUnpackObject)) { + protocolFieldValue = (Integer) appointUnpackObject; + } + } + if (protocolFieldValue != null) { + //加入缓存 + if (ObjectUtils.isNotEmpty(protocolFieldValue)) { + this.singleObjects.put(catchKey, protocolFieldValue); + return protocolFieldValue; + } + } + return null; + } + + /** + * 获取帧固定位置信息 + * + * @param byteBuf + * @param protocolConfig + * @return + */ + public Map getFixedProperty(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_POSITION + protocolConfig.getId(); + if (this.singleObjects.containsKey(catchKey)) { + return (Map) singleObjects.get(catchKey); + } + Map fixedPropertyMap = new HashMap<>(); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + fixedPropertyMap = fieldParser.doGetFixedProperty(protocolFieldConfigs, this.getTotalLength(byteBuf,protocolConfig)); + if (CollectionUtils.isNotEmpty(fixedPropertyMap)) { + this.singleObjects.put(catchKey, fixedPropertyMap); + return fixedPropertyMap; + } + return fixedPropertyMap; + } + + /** + * 获取帧结构应有的总长度 + */ + public Integer getTotalLength(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_LENGTH + ByteBufUtil.hexDump(byteBuf); + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + Integer appointFrameLength = getProtocolFieldValue(protocolConfig.getTotalLengthId(), byteBuf); + if (appointFrameLength != null) { + //获取过滤的字段集合总长度 + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Integer totalFilterLength = fieldParser.getTotalFilterLength(protocolConfig, byteBuf, getFixFieldConfigMap()); + //计算总长度 + Integer totalLength = appointFrameLength + totalFilterLength; + //加入缓存 + if (ObjectUtils.isNotEmpty(totalLength)) { + this.singleObjects.put(catchKey, totalLength); + return totalLength; + } + } + return null; + } + + /** + * 获取协议有关字段解析内容 + * storeObjectMap存储代转存的数据 + * + * @return + */ + public Map getProtocolDataMap(ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(FIXED_FIELD_DS)) { + return (Map) singleObjects.get(FIXED_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(protocolFieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + this.singleObjects.put(FIXED_FIELD_DS, fixDataMap); + return fixDataMap; + } + return null; + } + + /** + * 获取业务报文内容的content字节 + * + * @param wholeDatagramByte + * @return + */ + public ByteBuf getDataContentBuf(ByteBuf wholeDatagramByte) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(CONTENT_FIELD_DS)) { + return (ByteBuf) singleObjects.get(CONTENT_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + ByteBuf bizDataByteBuf = fieldParser.getDataContentBuf(protocolFieldConfigs, wholeDatagramByte); + if (bizDataByteBuf != null) { + this.singleObjects.put(CONTENT_FIELD_DS, bizDataByteBuf); + return bizDataByteBuf; + } + return null; + } + + + private ProtocolFieldConfig selectFieldConfig(Long id) { + Optional optionalProtocolFieldConfig = this.protocolFieldConfigs.stream().filter( + e -> e.getId().equals(id) + ).findFirst(); + return optionalProtocolFieldConfig.isPresent() ? optionalProtocolFieldConfig.get() : null; + } + + + private Map getFixFieldConfigMap() { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, e -> e) + ); + return fixDataFieldMap; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(protocolFieldConfigs) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java new file mode 100644 index 0000000..dafba1c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java @@ -0,0 +1,56 @@ +package com.casic.missiles.parser.provider; + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.rule.GenericRuleResolver; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.RuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleConfigProvider { + + private final List ruleConfigs; + + public List getRuleConfigs() { + return ruleConfigs; + } + + public RuleConfigProvider(Long protocolId) { + RuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(RuleConfigRegistry.class); + ruleConfigs = ruleConfigRegistry.getRuleConfigById(protocolId); + } + + /** + * 获取规则匹配结果 + * + * @param parseFixedDataMap + * @param protocolFieldConfigs + * @return + */ + public RuleConfig doGetRule(Map parseFixedDataMap, + String ids, + List protocolFieldConfigs) { + if (showSkip()) { + return null; + } + RuleConfig ruleConfig = GenericRuleResolver.machRule(parseFixedDataMap, ids, protocolFieldConfigs, ruleConfigs); + return ruleConfig; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(ruleConfigs) ? false : true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java index 3c05891..856b399 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java @@ -1,18 +1,11 @@ package com.casic.missiles.parser.resolver; -import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.springframework.web.bind.annotation.RequestBody; -import javax.annotation.Resource; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -20,19 +13,17 @@ @Slf4j public class ByteMergeProvider { - @Resource - private FieldRuleEngineMapper fieldRuleEngineMapper; - //拿到所有的值合并到一个值 - public String resolveByteMerge(List valueList, String ruletypeId, String vaildRange) { + public static String resolveByteMerge(List valueList, String ruleTypeId, String vaildRange) { String values = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Map vaildMap = getValidRangeMap(vaildRange); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(ruletypeId); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } + //暂时不处理 +// fieldRuleEngine = fieldRuleConfigMapper.selectById(ruleTypeId); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } Map env2 = new HashMap(); for (int i = 0; i < valueList.size(); i++) { if (vaildMap.containsKey(i)) { @@ -47,7 +38,7 @@ } } - private Map getValidRangeMap(String vaildRange) { + private static Map getValidRangeMap(String vaildRange) { String[] range = vaildRange.split(","); Map vaildMap = new HashMap(); for (int i = 0; i < range.length; i++) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 8d821cd..85d6bbf 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -1,9 +1,12 @@ package com.casic.missiles.parser.resolver; +import com.casic.missiles.pojo.AbstractFieldConfig; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; import io.netty.buffer.ByteBuf; +import java.util.List; import java.util.Map; /** @@ -11,18 +14,14 @@ */ public interface FieldParser { -// Map fieldProcess(String protocolContent,); - Map dataParser(RuleConfig ruleConfig, String lightText,String protocolId); + Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength); - Map fixDataParser(String protocolId, ByteBuf buffer); + Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap); - Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf); + ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer); - ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer); - - ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer); - - Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer); + Integer getTotalFilterLength(ProtocolConfig protocolConfig, ByteBuf byteBuf, Map protocolFieldConfigMap); } + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java new file mode 100644 index 0000000..9e0c00e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java @@ -0,0 +1,52 @@ +package com.casic.missiles.parser.resolver; + +import com.casic.missiles.pojo.AbstractFieldConfig; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.util.List; + +public class FieldParserSupport { + + //分别计算bit和byte长度=> 合并长度 + protected Integer calculateLength(List fieldConfigList) { + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + Integer fixedLength = bytefixedLength + bitfixedLength / 8; + return fixedLength; + } + + //找到最大值=> 根据最大值计算业务数据下标 + protected Integer calculatePosition(List fieldConfigList) { + String rex = "[0-9]+"; + Integer max = -1; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) + && Integer.valueOf(fieldConfig.getOriginPositionByte()) > max) { + max = Integer.valueOf(fieldConfig.getOriginPositionByte()); + } + } + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) && fieldConfig.getOriginPositionByte().equals(max)) { + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + } + } + Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; + return maxFixedPosition; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java deleted file mode 100644 index dd3a6cd..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java +++ /dev/null @@ -1,170 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.ByteResolverParam; -import io.netty.buffer.ByteBuf; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -/** - * 字段解析管理总类 - */ -@Service -@Slf4j -@AllArgsConstructor -public class FieldResolver extends ByteMergeProvider { - - //1、字段截取 => 2、简单的字节解析和复杂的字节解析 - public Object filedParserManger(ByteBuf byteBuf, FieldConfig fieldConfig, Integer maxFixedPosition) { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - //最大固定位置不为空, - if (!ObjectUtil.isEmpty(maxFixedPosition)) { - orignPosition -= maxFixedPosition; - } - Object fieldValue = 0; - //待优化 - if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { - fieldValue = bitToResolver(byteBuf, fieldConfig); - } else { - ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); - fieldValue = parsingFields(fieldBytes, fieldConfig.getRuleJson()); - } - return fieldValue; - } - - //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, - //目前默认配置的规则设置暂不支持配置化,由实现完成 - private Object parsingFields(ByteBuf byteBuf, String ruleJson) { - Object fieldsResolveValue = null; - List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); - if (ObjectUtil.isEmpty(ruleMapList)) { - fieldsResolveValue = defaultResolveBuilder(byteBuf); - } else { - fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); - } - return fieldsResolveValue; - } - - private Object defaultResolveBuilder(ByteBuf byteBuf) { - Integer defaultResolveValue = 0; - for (int i = 0; i < byteBuf.writerIndex(); i++) { - defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; - } - return defaultResolveValue; - } - - //字段解析构建器(针对字节单位的) - //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 - // 字节归并结束或者规则结束=>继续根据规则进行判断 - private Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { - Object customizeResolveValue = null; - try { - List bytStrList = new ArrayList<>(); - //存放到数组里面 - for (int i = 0; i < byteBuf.writerIndex(); i++) { - bytStrList.add(byteBuf.readByte()); - } - int i = 0; - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - customizeResolveValue = this.resolveByteMerge(bytStrList, ruletypeId,vaildRange); - break; - } else { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - List tempBytStr = new ArrayList<>(); - for (int k = 0; i < bytStrList.size(); i++) { - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(k) - .value(bytStrList.get(k)) - .ruletypeId(ruletypeId).build(); - tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); - } - bytStrList = tempBytStr; - } - i++; - } - //字节归并到一起=>继续根据规则进行判断 - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(customizeResolveValue) - .ruletypeId(ruletypeId).build(); - customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(customizeResolveValue)); - return customizeResolveValue; - } catch (RuntimeException ex) { - log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); - return null; - } - } - - /** - * 1、单个字节情况表示字段 - * 2、多字节情况表示字段(暂未处理) - */ - private Object bitToResolver(ByteBuf byteBuf, FieldConfig fieldConfig) { - Object fieldValue = new Object(); - try { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - byte fields = 0x00; - if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); - } else { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); - } - - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { - if (!StringUtils.isEmpty(fieldConfig.getExactOrignPosition())) { - fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getExactOrignPosition())).byteValue() - >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); - } else { - fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); - } - } else { - fieldValue = Integer.valueOf(fields & 0xff); - } - if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { - return fieldValue; - } - List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); - int i = 0; - //字节归并到一起=>继续根据规则进行判断 - while (i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(fieldValue) - .ruletypeId(ruletypeId).build(); - fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(fieldValue)); - return fieldValue; - } catch (RuntimeException ex) { - log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); - return null; - } - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java new file mode 100644 index 0000000..1d2aeab --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java @@ -0,0 +1,36 @@ +package com.casic.missiles.parser.resolver.bytes; + +import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.mapper.FieldRuleConfigMapper; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.pojo.ByteResolverParam; +import com.googlecode.aviator.AviatorEvaluator; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; +//转换规则 +@Component("convert") +@AllArgsConstructor +@Slf4j +public class ByteRuleResolver implements ByteResolver { + + private final FieldRuleConfigMapper fieldRuleConfigMapper; + + @Override + public Object resolveOperationRule(ByteResolverParam byteResolverParam){ + FieldRuleConfig fieldRuleEngine=fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); + if(ObjectUtil.isEmpty(fieldRuleEngine)){ + return byteResolverParam.getValue(); + } + String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); + Map env2 = new HashMap(); + env2.put("value", (byte) byteResolverParam.getValue()); + String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); + return values; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java index 103821c..786b71c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java @@ -2,34 +2,34 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("logicalShift") +@Component("logicalShift") @AllArgsConstructor @Slf4j public class LogicalShiftResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //字节位移 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { Integer index = byteResolverParam.getIndex(); - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return byteResolverParam.getValue(); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java index 476747d..01149bd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("operation") +@Component("operation") @AllArgsConstructor @Slf4j public class OperationResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //混合运算,有常量或者乘除的缩放 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java index 0b82cf4..79abcce 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.casic.missiles.pojo.ByteResolverParam; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; //精度计算 -@Service("precision") +@Component("precision") @AllArgsConstructor @Slf4j public class PrecisionResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java deleted file mode 100644 index 5c3f332..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; -//转换规则 -@Service("convert") -@AllArgsConstructor -@Slf4j -public class RuleResolver implements ByteResolver { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam){ - RuleEvaluator fieldRuleEngine=fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); - if(ObjectUtil.isEmpty(fieldRuleEngine)){ - return byteResolverParam.getValue(); - } - String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); - Map env2 = new HashMap(); - env2.put("value", (byte) byteResolverParam.getValue()); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java new file mode 100644 index 0000000..d3bbd91 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java @@ -0,0 +1,15 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; + +import java.util.List; +import java.util.Map; +// 前导码匹配->长度字段 +public interface AbstractCombinedFieldProcessor { + + Map invoke(Map map, ByteBuf byteBuf, List combinedFieldConfigList, + Map fieldConfigsMap, Map storeObjectMap); + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java new file mode 100644 index 0000000..03c8480 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java @@ -0,0 +1,59 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-13 + */ +//依次递增进行数据的解析, +public class GenericCombinedFieldResolver { + + + //通过查询,字段长度长度随机 + public void parseDataField(List combinedFieldConfigList, ByteBuf byteBuf, + Map storeObjectMap, Map fieldConfigsMap) { + Integer frameLength = Integer.valueOf(ByteBufUtil.hexDump(byteBuf)); + //添加前置处理器 + com.casic.missiles.util.ClassUtil classUtil = new com.casic.missiles.util.ClassUtil(); + List abstractCombinedProcessors = classUtil.getSubClassList(AbstractCombinedFieldProcessor.class); + + Map fieldFixedMap = combinedFieldLeadCodeMap(combinedFieldConfigList); + //frameLength + Map combinedProcessorFields = null; + while (byteBuf.readableBytes() < frameLength) { + //一直处理 + for (AbstractCombinedFieldProcessor abstractCombinedProcessor : abstractCombinedProcessors) { + combinedProcessorFields = abstractCombinedProcessor.invoke(combinedProcessorFields, byteBuf, + combinedFieldConfigList, + fieldConfigsMap, storeObjectMap); + if (combinedProcessorFields == null || byteBuf.readableBytes() < frameLength) { + return; + } + } + + } + } + + /** + * 取出前导码匹配集合 + */ + private Map combinedFieldLeadCodeMap(List combinedFieldConfigList) { + Map fieldFixedMap = combinedFieldConfigList + .stream() + .collect(Collectors.toMap(CombinedFieldConfig::getPrefixCode, e -> e)); + return fieldFixedMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java new file mode 100644 index 0000000..643a934 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java @@ -0,0 +1,100 @@ +package com.casic.missiles.parser.resolver.fields; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.FieldParserSupport; +import com.casic.missiles.pojo.*; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 保存使用时最基本的信息,并且使用原型模式 + */ +@Slf4j +public class DefaultProtocolFieldParser extends FieldParserSupport implements FieldParser, FixedPropertyEnum { + + //通过传入的配置和报文进行字段解析 + @Override + public Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap) { + Map dataMap = new HashMap<>(); + for (AbstractFieldConfig protocolFieldConfig : protocolFieldConfigs) { + if (!ObjectUtils.isEmpty(protocolFieldConfig.getOriginPositionByte())) { + Object fieldValue = FieldResolver.parseField(buffer, protocolFieldConfig, null); + if (protocolFieldConfig.getIsStorage() == 1) { + storeObjectMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + dataMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + } + return dataMap; + } + + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength) { + Map fixedPropertyMap = new HashMap<>(); + Integer fixedLength = calculateLength(protocolFieldConfigs); + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + fixedPropertyMap.put(FIXED_POSITION, maxFixedPosition); + fixedPropertyMap.put(TOTAL_LENGTH, totalLength); + fixedPropertyMap.put(TAIL_POSITION, totalLength - fixedLength + maxFixedPosition); + return fixedPropertyMap; + } + + //** 获取业务内容的byteBuf + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer) { + //计算固定长度 + Integer fixedLength = calculateLength(protocolFieldConfigs); + //总长度获取 + String lightText = buffer.toString(Charset.forName("ISO-8859-1")); + Integer totalLength = lightText.length(); + //计算固定长度最大长度 + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + //计算数据报文内容 + ByteBuf bizDataFields = buffer.slice(maxFixedPosition - 1, (totalLength - fixedLength)); + return bizDataFields; + } + + /** + * 获取过滤字段的长度 + */ + @Override + public Integer getTotalFilterLength(ProtocolConfig protocolConfig, + ByteBuf byteBuf, + Map protocolFieldConfigMap) { + if (ByteBufUtil.hexDump(byteBuf).equals("")) { + return 0; + } + int totalFilterLength = 0; + String filterFields = protocolConfig.getTotalLengthFilterFields(); + try { + if (!StringUtils.isEmpty(filterFields)) { + String[] filterFieldList = filterFields.split(","); + for (String filterFieldId : filterFieldList) { + if (StringUtils.isNotEmpty(filterFieldId)) { + ProtocolFieldConfig fieldConfig = protocolFieldConfigMap.get(Long.valueOf(filterFieldId)); + //这里都是按字节计算,没有对位进行区分,可能会出现错误 + // 如果对位有需求,需要进一步跟进 + totalFilterLength += fieldConfig.getOffsetLength(); + } + } + } + return totalFilterLength; + } catch (Exception ex) { + log.error("报文确认分发阶段,获取报文总长度过滤长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); + } + return totalFilterLength; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java new file mode 100644 index 0000000..d51e887 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java @@ -0,0 +1,169 @@ +package com.casic.missiles.parser.resolver.fields; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.parser.resolver.ByteMergeProvider; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.AbstractFieldConfig; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.pojo.ByteResolverParam; +import io.netty.buffer.ByteBuf; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * 字段解析管理总类 + */ +@Slf4j +public class FieldResolver extends ByteMergeProvider { + + //1、字段截取 => 2、简单的字节解析和复杂的字节解析 + public static Object parseField(ByteBuf byteBuf,AbstractFieldConfig fieldConfig, Integer maxFixedPosition) { + Integer orignPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + //最大固定位置不为空, + if (!ObjectUtil.isEmpty(maxFixedPosition)) { + orignPosition -= maxFixedPosition; + } + Object fieldValue = 0; + //待优化 + if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { + fieldValue = doParseBitField(byteBuf, fieldConfig); + } else { + ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); + fieldValue = doParseByteField(fieldBytes, fieldConfig.getRuleJson()); + } + return fieldValue; + } + + //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, + //目前默认配置的规则设置暂不支持配置化,由实现完成 + private static Object doParseByteField(ByteBuf byteBuf, String ruleJson) { + Object fieldsResolveValue = null; + List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); + if (ObjectUtil.isEmpty(ruleMapList)) { + fieldsResolveValue = defaultResolveBuilder(byteBuf); + } else { + fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); + } + return fieldsResolveValue; + } + + private static Object defaultResolveBuilder(ByteBuf byteBuf) { + Integer defaultResolveValue = 0; + for (int i = 0; i < byteBuf.writerIndex(); i++) { + defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; + } + return defaultResolveValue; + } + + //字段解析构建器(针对字节单位的) + //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 + // 字节归并结束或者规则结束=>继续根据规则进行判断 + private static Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { + Object customizeResolveValue = null; + try { + List bytStrList = new ArrayList<>(); + //存放到数组里面 + for (int i = 0; i < byteBuf.writerIndex(); i++) { + bytStrList.add(byteBuf.readByte()); + } + int i = 0; + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { + if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + customizeResolveValue = resolveByteMerge(bytStrList, ruletypeId, vaildRange); + break; + } else { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + List tempBytStr = new ArrayList<>(); + for (int k = 0; i < bytStrList.size(); i++) { + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(k) + .value(bytStrList.get(k)) + .ruletypeId(ruletypeId).build(); + tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); + } + bytStrList = tempBytStr; + } + i++; + } + //字节归并到一起=>继续根据规则进行判断 + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(null) + .value(customizeResolveValue) + .ruletypeId(ruletypeId).build(); + customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); + i++; + } + System.out.println(JSON.toJSON(customizeResolveValue)); + return customizeResolveValue; + } catch (RuntimeException ex) { + log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); + return null; + } + } + + /** + * 1、单个字节情况表示字段 + * 2、多字节情况表示字段(暂未处理) + */ + private static Object doParseBitField(ByteBuf byteBuf,AbstractFieldConfig fieldConfig) { + Object fieldValue = new Object(); + try { + Integer orignPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + byte fields = 0x00; + if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { + fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); + } else { + fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); + } + + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { + if (!StringUtils.isEmpty(fieldConfig.getOriginPositionBit())) { + fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getOriginPositionBit())).byteValue() + >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); + } else { + fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); + } + } else { + fieldValue = Integer.valueOf(fields & 0xff); + } + if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { + return fieldValue; + } + List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); + int i = 0; + //字节归并到一起=>继续根据规则进行判断 + while (i < ruleMapList.size()) { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(null) + .value(fieldValue) + .ruletypeId(ruletypeId).build(); + fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); + i++; + } + System.out.println(JSON.toJSON(fieldValue)); + return fieldValue; + } catch (RuntimeException ex) { + log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); + return null; + } + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java deleted file mode 100644 index 35ae3d0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java +++ /dev/null @@ -1,183 +0,0 @@ -package com.casic.missiles.parser.resolver.fields; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufAllocator; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; -import org.springframework.util.ObjectUtils; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service("standard") -@AllArgsConstructor -@Slf4j -public class StandardFieldParser implements FieldParser { - - private final FieldConfigDao fieldConfigDao; - private final FieldResolver fieldResolver; - - //数据解析 - @Override - public Map dataParser(RuleConfig ruleConfig, String lightText, String protocolId) { - String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); - ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); - bufferContent.writeBytes(lightText.getBytes(Charset.forName("ISO-8859-1"))); - Map dataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - for (String dataFieldId : dataFieldIds) { - FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(dataFieldId); - if (!ObjectUtils.isEmpty(fieldConfig)) { - dataMap.put(fieldConfig.getFieldName(), String.valueOf(fieldResolver.filedParserManger(bufferContent, fieldConfig, maxFixedPosition))); - } - } - return dataMap; - } - - //数据解析 - @Override - public Map fixDataParser(String protocolId, ByteBuf buffer) { - List dataFieldIdList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Map dataMap = new HashMap<>(); - for (FieldConfig dataField : dataFieldIdList) { - if (!ObjectUtils.isEmpty(dataField.getOrignPosition())) { - Object fieldValue = (Integer) fieldResolver.filedParserManger(buffer, dataField, null); - dataMap.put(dataField.getFieldName(), fieldValue); - } - } - return dataMap; - } - - @Override - public Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf) { - if (ByteBufUtil.hexDump(byteBuf).equals("")) { - return 0; - } - String filterFields = protocolConfig.getTotalLengthFilterField(); - Integer totalLength = 0; - try { - FieldConfig totalFieldConfig = fieldConfigDao.getFieldConfigById(protocolConfig.getTotalLengthId()); - int totalFilterLength = 0; - if (!StringUtils.isEmpty(filterFields)) { - String[] filterFieldList = filterFields.split(","); - for (String filterField : filterFieldList) { - FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(filterField); - //这里都是按字节计算,没有对位进行区分,可能会出现错误 - - // 如果对位有需求,需要进一步跟进 - totalFilterLength += fieldConfig.getOffsetLength(); - } - } - totalLength = (Integer) fieldResolver.filedParserManger(byteBuf, totalFieldConfig, null) + totalFilterLength; - } catch (Exception ex) { - log.error("报文确认分发阶段,获取报文总长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); - } - return totalLength; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer) { - //业务内容 - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - String protocolId = String.valueOf(protocolConfig.getId()); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - //计算固定长度 - Integer fixedLength = calculateLength(fieldConfigList); -// Integer totalLength = this.getTotalLength(protocolConfig, buffer); - //总长度获取 - Integer totalLength = lightText.length(); - //计算固定长度最大长度 - Integer maxFixedPosition = calculatePosition(fieldConfigList); -// buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - //计算数据报文内容 - ByteBuf bizDataFields = buffer.slice(maxFixedPosition-1, (totalLength - fixedLength)); - return bizDataFields; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer) { - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - String protocolId = String.valueOf(protocolConfig.getId()); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer fixedLength = calculateLength(fieldConfigList); -// Integer totalLength = this.getTotalLength(protocolConfig, buffer); - Integer totalLength = lightText.length(); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - ByteBuf fixDataFields = buffer.slice(0, maxFixedPosition); - return fixDataFields; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer) { - String protocolId = String.valueOf(protocolConfig.getId()); - Map fixedPropertyMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer fixedLength = calculateLength(fieldConfigList); - Integer totalLength = this.getTotalLength(protocolConfig, buffer); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - fixedPropertyMap.put("fixedPosition", maxFixedPosition); - fixedPropertyMap.put("totalLength", totalLength); - fixedPropertyMap.put("tailPosition", totalLength - fixedLength + maxFixedPosition); - return fixedPropertyMap; - } - - //分别计算bit和byte长度=> 合并长度 - private Integer calculateLength(List fieldConfigList) { - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (FieldConfig fieldConfig : fieldConfigList) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - Integer fixedLength = bytefixedLength + bitfixedLength / 8; - return fixedLength; - } - - //找到最大值=> 根据最大值计算业务数据下标 - private Integer calculatePosition(List fieldConfigList) { - String rex = "[0-9]+"; - Integer max = -1; - for (FieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOrignPosition()) - && Integer.valueOf(fieldConfig.getOrignPosition()) > max) { - max = Integer.valueOf(fieldConfig.getOrignPosition()); - } - } - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (FieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOrignPosition()) && fieldConfig.getOrignPosition().equals(max)) { - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - } - } - Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; - return maxFixedPosition; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java new file mode 100644 index 0000000..d4ec6c7 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java @@ -0,0 +1,76 @@ +package com.casic.missiles.parser.rule; + +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import org.apache.commons.lang3.StringUtils; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class GenericRuleResolver { + + //根据前置字段的值,找到指定的规则 + //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 + //=>循环判断=>通过规则得到业务字段 + public static RuleConfig machRule(Map fixDataMap, + String ids, + List protocolFieldConfigs, + List ruleConfigs) { + List preRuleConfigList = getPreRuleList(ids, protocolFieldConfigs); + //获取前置规则字段 + final Map metaDataMap = getPreRuleFields(preRuleConfigList, fixDataMap); + //准备固定的字段集合 + Map fixDataFieldMap = getFixDataFieldMap(protocolFieldConfigs); + return RuleResolverCore.doMachRule(ruleConfigs, metaDataMap, fixDataMap, fixDataFieldMap); + } + + private static Map getFixDataFieldMap(List protocolFieldConfigs) { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, ProtocolFieldConfig::getFieldName) + ); + return fixDataFieldMap; + } + + + /** + * 查询前置规则的字段配置 + * + * @param ids + * @return + */ + private static List getPreRuleList(String ids, List protocolFieldConfigs) { + String[] idList = ids.split(","); + Map prepareMaps = new HashMap<>(); + for (String id : idList) { + if (StringUtils.isNotEmpty(id)) { + prepareMaps.put(Long.valueOf(id), ""); + } + } + List preRuleConfigList = protocolFieldConfigs + .stream() + .filter(e -> prepareMaps.containsKey(e.getId())) + .collect(Collectors.toList()); + return preRuleConfigList; + } + + /** + * 获取前置规则解析字段 + */ + private static Map getPreRuleFields(List preRuleFieldConfigList, Map fixDataMap) { + Map ruleFieldMap = new HashMap<>(); + preRuleFieldConfigList.stream() + .forEach( + preRuleFieldConfig -> { + String fieldName = preRuleFieldConfig.getFieldName(); + if (fixDataMap.containsKey(fieldName)) { + ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); + } + } + ); + return ruleFieldMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java new file mode 100644 index 0000000..baae7e8 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -0,0 +1,68 @@ +package com.casic.missiles.parser.rule; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.casic.missiles.pojo.RuleConfig; + +import java.util.*; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleResolverCore { + + + public static RuleConfig doMachRule(List ruleConfigList, Map metaDataMap, + Map fixDataMap, + Map fixDataFieldMap) { + Optional ruleConfigOptional = ruleConfigList.stream() + .filter(ruleConfig -> machRuleConfig( + JSON.parseObject(ruleConfig.getMatchRuleJson(), Map.class), metaDataMap)) + .findFirst(); + if (ObjectUtil.isEmpty(ruleConfigOptional)) { + return null; + } + String[] ruleFields = ruleConfigOptional.get().getDataFieldIds().split(","); + Map ruleMetaDataMap = getRuleFields(ruleFields, fixDataMap, fixDataFieldMap); + //递归选定解析规则,进行规则解析 + if (!ruleConfigOptional.get().getIsFinishMatch().equals("1")) { + //递归选定规则 + doMachRule(ruleConfigList, ruleMetaDataMap, fixDataMap, fixDataFieldMap); + } + return ruleConfigOptional.get(); + } + + + private static Map getRuleFields(String[] preRuleConfigList, Map fixedDataMap, + Map fixedFieldMap) { + Map ruleFieldMap = new HashMap<>(); + for (String preRuleConfigId : preRuleConfigList) { + String fieldName = fixedFieldMap.get(preRuleConfigId); + if (fixedDataMap.containsKey(fieldName)) { + ruleFieldMap.put(fieldName, String.valueOf(fixedDataMap.get(fieldName))); + } + } + return ruleFieldMap; + } + + + //匹配规则配置 + private static Boolean machRuleConfig(Map ruleMap, Map metaDataMap) { + if (ruleMap == null || metaDataMap == null) { + return null; + } + //所有的字段在规则里面必须有有配置 + for (String key : metaDataMap.keySet()) { + if (ruleMap.containsKey(key)) { + if (!ruleMap.get(key).equals(metaDataMap.get(key))) { + return false; + } + } else { + return false; + } + } + return true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java deleted file mode 100644 index 664088d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java +++ /dev/null @@ -1,92 +0,0 @@ -package com.casic.missiles.parser.rule; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.mapper.dao.PreRuleConfigDao; -import com.casic.missiles.mapper.dao.RuleConfigDao; -import lombok.AllArgsConstructor; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.*; -import java.util.stream.Collectors; - -@Service -@AllArgsConstructor -public class RulerProvider { - - private final FieldConfigDao fieldConfigDao; - private final PreRuleConfigDao preRuleConfigDao; - private final RuleConfigDao ruleConfigDao; - - //根据前置字段的值,找到指定的规则 - //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 - //=>循环判断=>通过规则得到业务字段 - public RuleConfig ruleConfig(Map fixDataMap, String protocolId) { - //批量获取规则 - List preRuleConfigList = preRuleConfigDao.getPreRuleList(protocolId); - //获取固定字段 - Map fixFieldMap = getAllFieldMap(protocolId); - //获取前置规则字段 - final String preRuleFields = getPreRuleFields(preRuleConfigList, fixDataMap, fixFieldMap); - List ruleConfigList = ruleConfigDao.getRuleConfigById(protocolId); - Optional ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig ->preRuleFields.equals( ruleConfig.getParseRuleJson())).findFirst(); - //递归选定解析规则,进行规则解析 - while (!ObjectUtil.isEmpty(ruleConfigOptional) && !ruleConfigOptional.get().getIsBizField().equals("1")) { - String ruleFields = getRuleFields(ruleConfigOptional.get().getDataFieldIds().split(","), fixDataMap, fixFieldMap); - ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig -> ruleConfig.getParseRuleJson().equals(ruleFields)).findFirst(); - } - return ruleConfigOptional.get(); - } - - /** - * 获取前置规则解析字段 - */ - private String getPreRuleFields(List preRuleConfigList, Map fixDataMap, Map fixFieldMap) { - Map ruleFieldMap= new HashMap<>(); - preRuleConfigList.stream() - .forEach( - preRuleConfig -> { - String fieldName = fixFieldMap.get(Long.valueOf(preRuleConfig.getRuleFieldId())); - if (fixDataMap.containsKey(fieldName)) { - ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); - } - } - ); - return JSONObject.toJSONString(ruleFieldMap); - } - - private Map getAllFieldMap(String protocolId) { - List fieldList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Map fixFieldMap = fieldList.stream().collect( - Collectors.toMap(FieldConfig::getId, FieldConfig::getFieldName) - ); - return fixFieldMap; - } - - private String getRuleFields(String[] preRuleConfigList, Map fixDataMap, Map fixFieldMap) { - Map ruleFieldMap= new HashMap<>(); - for (String preRuleConfigId : preRuleConfigList) { - String fieldName = fixFieldMap.get(preRuleConfigId); - if (fixDataMap.containsKey(fieldName)) { - ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); - } - } - return JSONObject.toJSONString(ruleFieldMap); - } - - //弃置 - private String ListToString(List ruleFieldList) { - String ruleFields = ""; - for (String ruleField : ruleFieldList) { - ruleFields += ruleField + ","; - } - ruleFields = StringUtils.isEmpty(ruleFields) ? ruleFields : ruleFields.substring(0, ruleFields.length() - 1); - return ruleFields; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java index 6177e10..bfa87a5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java @@ -2,7 +2,7 @@ public interface SafeStrategy { - String decryption(byte[] bytes); + String decryption(String cipher); String encryption(String lightText); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java index 618716c..6236302 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java @@ -9,9 +9,9 @@ //十六进制的字符串转换成字节数组 byte[] bytes = hexStrToBinaryStr(msg); //计算CRC8 - byte crc8 = CRC8(bytes, 0, bytes.length); - String crc8ToStr = "" + Integer.toHexString(0xff & crc8); - return crc8ToStr; +// String crc8ToStr = "" + Integer.toHexString(0xff & crc8); +// return crc8ToStr; + return null; } /** @@ -33,50 +33,5 @@ return bytes; } - /** - * CRC8 校验 多项式 x8+x2+x+1 - * - * @param b - * @param off - * @param len - * @return - */ - public static byte CRC8(final byte[] b, final int off, final int len) { - byte result = 0x00; - for (int i = 0; i < len; i++) { - result = CHECKSUM_TABLE[(result ^ (b[i + off] & 0xFF)) & 0xFF]; - } - return (byte) (result & 0xFFL); - } - - private final static byte[] CHECKSUM_TABLE = {(byte) 0x00, (byte) 0x07, (byte) 0x0e, (byte) 0x09, (byte) 0x1c, (byte) 0x1b, - (byte) 0x12, (byte) 0x15, (byte) 0x38, (byte) 0x3f, (byte) 0x36, (byte) 0x31, (byte) 0x24, (byte) 0x23, (byte) 0x2a, - (byte) 0x2d, (byte) 0x70, (byte) 0x77, (byte) 0x7e, (byte) 0x79, (byte) 0x6c, (byte) 0x6b, (byte) 0x62, (byte) 0x65, - (byte) 0x48, (byte) 0x4f, (byte) 0x46, (byte) 0x41, (byte) 0x54, (byte) 0x53, (byte) 0x5a, (byte) 0x5d, (byte) 0xe0, - (byte) 0xe7, (byte) 0xee, (byte) 0xe9, (byte) 0xfc, (byte) 0xfb, (byte) 0xf2, (byte) 0xf5, (byte) 0xd8, (byte) 0xdf, - (byte) 0xd6, (byte) 0xd1, (byte) 0xc4, (byte) 0xc3, (byte) 0xca, (byte) 0xcd, (byte) 0x90, (byte) 0x97, (byte) 0x9e, - (byte) 0x99, (byte) 0x8c, (byte) 0x8b, (byte) 0x82, (byte) 0x85, (byte) 0xa8, (byte) 0xaf, (byte) 0xa6, (byte) 0xa1, - (byte) 0xb4, (byte) 0xb3, (byte) 0xba, (byte) 0xbd, (byte) 0xc7, (byte) 0xc0, (byte) 0xc9, (byte) 0xce, (byte) 0xdb, - (byte) 0xdc, (byte) 0xd5, (byte) 0xd2, (byte) 0xff, (byte) 0xf8, (byte) 0xf1, (byte) 0xf6, (byte) 0xe3, (byte) 0xe4, - (byte) 0xed, (byte) 0xea, (byte) 0xb7, (byte) 0xb0, (byte) 0xb9, (byte) 0xbe, (byte) 0xab, (byte) 0xac, (byte) 0xa5, - (byte) 0xa2, (byte) 0x8f, (byte) 0x88, (byte) 0x81, (byte) 0x86, (byte) 0x93, (byte) 0x94, (byte) 0x9d, (byte) 0x9a, - (byte) 0x27, (byte) 0x20, (byte) 0x29, (byte) 0x2e, (byte) 0x3b, (byte) 0x3c, (byte) 0x35, (byte) 0x32, (byte) 0x1f, - (byte) 0x18, (byte) 0x11, (byte) 0x16, (byte) 0x03, (byte) 0x04, (byte) 0x0d, (byte) 0x0a, (byte) 0x57, (byte) 0x50, - (byte) 0x59, (byte) 0x5e, (byte) 0x4b, (byte) 0x4c, (byte) 0x45, (byte) 0x42, (byte) 0x6f, (byte) 0x68, (byte) 0x61, - (byte) 0x66, (byte) 0x73, (byte) 0x74, (byte) 0x7d, (byte) 0x7a, (byte) 0x89, (byte) 0x8e, (byte) 0x87, (byte) 0x80, - (byte) 0x95, (byte) 0x92, (byte) 0x9b, (byte) 0x9c, (byte) 0xb1, (byte) 0xb6, (byte) 0xbf, (byte) 0xb8, (byte) 0xad, - (byte) 0xaa, (byte) 0xa3, (byte) 0xa4, (byte) 0xf9, (byte) 0xfe, (byte) 0xf7, (byte) 0xf0, (byte) 0xe5, (byte) 0xe2, - (byte) 0xeb, (byte) 0xec, (byte) 0xc1, (byte) 0xc6, (byte) 0xcf, (byte) 0xc8, (byte) 0xdd, (byte) 0xda, (byte) 0xd3, - (byte) 0xd4, (byte) 0x69, (byte) 0x6e, (byte) 0x67, (byte) 0x60, (byte) 0x75, (byte) 0x72, (byte) 0x7b, (byte) 0x7c, - (byte) 0x51, (byte) 0x56, (byte) 0x5f, (byte) 0x58, (byte) 0x4d, (byte) 0x4a, (byte) 0x43, (byte) 0x44, (byte) 0x19, - (byte) 0x1e, (byte) 0x17, (byte) 0x10, (byte) 0x05, (byte) 0x02, (byte) 0x0b, (byte) 0x0c, (byte) 0x21, (byte) 0x26, - (byte) 0x2f, (byte) 0x28, (byte) 0x3d, (byte) 0x3a, (byte) 0x33, (byte) 0x34, (byte) 0x4e, (byte) 0x49, (byte) 0x40, - (byte) 0x47, (byte) 0x52, (byte) 0x55, (byte) 0x5c, (byte) 0x5b, (byte) 0x76, (byte) 0x71, (byte) 0x78, (byte) 0x7f, - (byte) 0x6a, (byte) 0x6d, (byte) 0x64, (byte) 0x63, (byte) 0x3e, (byte) 0x39, (byte) 0x30, (byte) 0x37, (byte) 0x22, - (byte) 0x25, (byte) 0x2c, (byte) 0x2b, (byte) 0x06, (byte) 0x01, (byte) 0x08, (byte) 0x0f, (byte) 0x1a, (byte) 0x1d, - (byte) 0x14, (byte) 0x13, (byte) 0xae, (byte) 0xa9, (byte) 0xa0, (byte) 0xa7, (byte) 0xb2, (byte) 0xb5, (byte) 0xbc, - (byte) 0xbb, (byte) 0x96, (byte) 0x91, (byte) 0x98, (byte) 0x9f, (byte) 0x8a, (byte) 0x8d, (byte) 0x84, (byte) 0x83, - (byte) 0xde, (byte) 0xd9, (byte) 0xd0, (byte) 0xd7, (byte) 0xc2, (byte) 0xc5, (byte) 0xcc, (byte) 0xcb, (byte) 0xe6, - (byte) 0xe1, (byte) 0xe8, (byte) 0xef, (byte) 0xfa, (byte) 0xfd, (byte) 0xf4, (byte) 0xf3}; } \ No newline at end of file diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java index 27c2838..6e078a3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java @@ -1,9 +1,6 @@ package com.casic.missiles.parser.safe.impl; -import cn.hutool.core.util.CharsetUtil; -import cn.hutool.crypto.symmetric.SM4; -import cn.hutool.crypto.symmetric.SymmetricCrypto; - +import com.casic.missiles.parser.safe.SafeStrategy; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; @@ -11,19 +8,44 @@ import org.bouncycastle.crypto.engines.SM4Engine; import org.bouncycastle.crypto.params.KeyParameter; import org.bouncycastle.util.encoders.Hex; - -import static cn.hutool.crypto.Mode.ECB; -import static cn.hutool.crypto.Padding.NoPadding; +import org.springframework.stereotype.Component; /** * SM4算法工具类 */ @Slf4j -public class Sm4 { +@Component("sm4") +public class Sm4 implements SafeStrategy { //加解密的字节快大小 public static final int BlockSize = 16; + @Override + public String decryption(String cipher) { + byte[] keyByte = { + 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 + }; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(keyByte); + byte[] in = Hex.decode(cipher); + byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); + String plain = EcbDecrypt(in, keyBytes); + return plain; + } + + @Override + public String encryption(String cipher) { + byte[] keyByte = { + 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 + }; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(keyByte); + byte[] in = Hex.decode(cipher); + byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); + String plain = EcbDecrypt(in, keyBytes); + return plain; + } + /** * SM4ECB加密算法,对内 * @@ -32,8 +54,6 @@ * @return */ private static byte[] ecb_encrypt(byte[] in, byte[] keyBytes) { - - SM4Engine sm4Engine = new SM4Engine(); sm4Engine.init(true, new KeyParameter(keyBytes)); byte[] out = new byte[in.length]; @@ -58,27 +78,6 @@ return cipher; } - - /** - * hutool 解密SM4 - * - * @param encodeContent - * @return - */ - public static String decode(String encodeContent) { - String key = "24ad182507479a5da3ad94d9d78ea203"; - try { - SymmetricCrypto sm4 = new SM4(ECB, NoPadding, key.getBytes()); - String decryptStr = sm4.decryptStr(encodeContent, CharsetUtil.CHARSET_UTF_8); - return decryptStr; - } catch (Exception e) { - e.printStackTrace(); - log.error("SM4解密失败"); - } - return null; - } - - /** * SM4的ECB加密算法 * @@ -129,20 +128,6 @@ return plain; } - /** - * SM4的ECB解密算法 - * - * @param cipher 输入的密文字符串 - * @param key 密钥 - * @return - */ - public static String EcbDecrypt(String cipher, String key) { - byte[] in = Hex.decode(cipher); - byte[] keyBytes = Hex.decode(key); - - String plain = EcbDecrypt(in, keyBytes); - return plain; - } /** * 主函数 @@ -151,28 +136,24 @@ */ public static void main(String[] args) { byte[] ciphertext = { + 0x4B, (byte) 0x8C, (byte) 0x9D, 0x08, (byte) 0xE4, (byte) 0xD3, 0x64, 0x42, (byte) 0xB9, (byte) 0xA5, (byte) 0xFE, (byte) 0xCD, (byte) 0x91, 0x1B, 0x38, (byte) 0xAC, (byte) 0xE9, 0x1C, (byte) 0xCD, 0x53, 0x02, (byte) 0xD7, 0x0C, (byte) 0x9B, (byte) 0x96, 0x30, 0x62, (byte) 0xE8, (byte) 0xFB, (byte) 0xEF, (byte) 0xB9, (byte) 0xFF, (byte) 0xDE, 0x19, (byte) 0x80, 0x35, 0x3E, (byte) 0x90, 0x4F, 0x2F, 0x12, 0x2B, 0x19, (byte) 0x8B, 0x6C, 0x7A, (byte) 0x85, (byte) 0xA1, (byte) 0xB1, (byte) 0x86, (byte) 0xA3, 0x7A, 0x46, 0x0C, 0x2F, (byte) 0x94, 0x4F, 0x7F, 0x2C, 0x56, 0x14, (byte) 0xF3, (byte) 0x89, (byte) 0xC3, - 0x3F, 0x20, (byte) 0xF9, (byte) 0x87, (byte) 0xA1, 0x60, (byte) 0xD9, (byte) 0xA8, (byte) 0xFD, (byte) 0xD7, (byte) 0x9B, 0x4B, 0x26, 0x06, 0x30, 0x44}; + 0x3F, 0x20, (byte) 0xF9, (byte) 0x87, (byte) 0xA1, 0x60, (byte) 0xD9, (byte) 0xA8, (byte) 0xFD, (byte) 0xD7, (byte) 0x9B, 0x4B, 0x26, 0x06, 0x30, 0x44 + }; ByteBuf in = ByteBufAllocator.DEFAULT.heapBuffer(); in.writeBytes(ciphertext); - byte[] keyByte = { 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 }; ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); - key.writeBytes(ciphertext); - String resCipherData = decode(ByteBufUtil.hexDump(in)); - ByteBuf out = ByteBufAllocator.DEFAULT.heapBuffer(); -// out.writeBytes(resCipherData); -// System.out.println(hexBytes); - System.out.println(resCipherData.toString()); -// String resPlainData = EcbDecrypt(resCipherData, key); -// System.out.println("原始明文:" + data); -// System.out.println("解密后明文:" + resPlainData); + key.writeBytes(keyByte); +// String resCipherData = EcbDecrypt(ByteBufUtil.hexDump(in), ByteBufUtil.hexDump(key)); +// System.out.println(resCipherData); } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java index 1395a51..ac5f957 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java @@ -1,7 +1,7 @@ package com.casic.missiles.parser.safe.impl; import io.netty.buffer.ByteBufUtil; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** *

@@ -14,9 +14,8 @@ * @author hyl * @version v1.0: Tea.java, v 0.1 2021/3/12 13:48 $ */ -@Service("tea") -///tea算法类 - +//tea算法类 +@Component("tea") public class Tea { public static byte[] MyTea_Encrypt(byte[] MyTeaContent, int ByteLen, byte[] MyTeakey) { @@ -99,7 +98,6 @@ // for(int i32Index = 0; i32Index < 8; i32Index++) { // System.out.print("0x" + Integer.toHexString(MyContent[i32Index]) + " "); // } - // System.out.println("密钥为:"); // for(int i32Index = 0; i32Index < 16; i32Index++) { // System.out.print("0x" + Integer.toHexString(MyKeys[i32Index]) + " "); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java index bdd0721..bd1516a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java @@ -3,7 +3,7 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.parser.sender.DataSubscribeProvider; import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponents; import org.springframework.web.util.UriComponentsBuilder; @@ -12,7 +12,7 @@ import java.util.Collections; import java.util.Map; -@Service("functionCallback") +@Component("functionCallback") public class FunctionCallback implements DataSubscribeProvider { @Resource diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java index 0b44fb9..7526de2 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.Map; -@Service("middleware") +@Component("middleware") public class MiddlewareSubscribe implements DataSubscribeProvider { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java index 5dcee3f..e2f1192 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.Map; -@Service("nosql") +@Component("nosql") public class NoSqlSubscribe implements DataSubscribeProvider { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java b/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java new file mode 100644 index 0000000..81a5324 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java @@ -0,0 +1,86 @@ +package com.casic.missiles.pojo; + +import lombok.Data; + +/** + * 协议 + */ +@Data +public class Msg { + + /** + * 前导码 + */ + private String preamble; + + /** + * 版本号 + */ + private String version; + + /** + * 内容长度 + */ + private int leng; + + /** + * 设备ID + */ + private String deviceId; + + /** + * 通讯方式 + */ + private Integer connType; + + /** + * 加密方式 + */ + private Integer encryType; + + /** + * 目标地址 + */ + private String destAddr; + + /** + * PDUType + */ + private String PDUType; + + /** + * 操作类型 + */ + private Integer operateType; + + /** + * 传输控制位 PDUType.bit7=0时,表示存在后续的访问;当PDUType.bit7=1时,表示无后续的访问。 + */ + private Integer transControlFlag; + + /** + * 设备类型 + */ + private Integer deviceType; + + /** + * 序号 + */ + private Integer seq; + + /** + * tagList + */ + private String tagList; + + /** + * OidList + */ + private String OidList; + + /** + * CRC + */ + private String CRC; + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java index 40a5265..97cc984 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java @@ -40,7 +40,7 @@ String httpContent = msg.toString(Charset.defaultCharset()); log.info(" String : " + msg.toString(Charset.defaultCharset())); String majorContent = httpContent.substring(httpContent.indexOf("{"), httpContent.lastIndexOf("}") + 1); - String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("serviceData")).get("Value")); + String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("RegistryData")).get("Value")); log.info("----------------------------------" + values); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); bufferContent.writeBytes(values.getBytes(Charset.forName("ISO-8859-1"))); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java index 1b132a7..e3ced4b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java @@ -35,7 +35,7 @@ String httpContent = msg.toString(Charset.defaultCharset()); log.info(" String : " + msg.toString(Charset.defaultCharset())); String majorContent = httpContent.substring(httpContent.indexOf("{"), httpContent.lastIndexOf("}") + 1); - String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("serviceData")).get("Value")); + String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("RegistryData")).get("Value")); log.info("----------------------------------" + values); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); bufferContent.writeBytes(values.getBytes(Charset.forName("ISO-8859-1"))); diff --git a/sensorhub-core/src/main/resources/application.properties b/sensorhub-core/src/main/resources/application.properties deleted file mode 100644 index 8b13789..0000000 --- a/sensorhub-core/src/main/resources/application.properties +++ /dev/null @@ -1 +0,0 @@ - diff --git a/sensorhub-core/src/main/resources/config/application-dev.yml b/sensorhub-core/src/main/resources/config/application-dev.yml index 4f897a8..dcc4c2d 100644 --- a/sensorhub-core/src/main/resources/config/application-dev.yml +++ b/sensorhub-core/src/main/resources/config/application-dev.yml @@ -4,9 +4,9 @@ spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true + url: jdbc:mysql://127.0.0.1:3306/sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true username: root - password: Casic203 + password: root session: store-type: redis redis: diff --git a/sensorhub-core/src/main/resources/config/application.yml b/sensorhub-core/src/main/resources/config/application.yml index ae89f9d..7965da1 100644 --- a/sensorhub-core/src/main/resources/config/application.yml +++ b/sensorhub-core/src/main/resources/config/application.yml @@ -30,6 +30,13 @@ port: 6379 password: ew5T4K3#203lwh config-prefix: 'Casic:' +#代码生成器配置 +code: + generate: + #作者 + author: cz + #待生成对象表名 + table-name: bussiness_field_config,combined_field_config sensorhub: config: port: 7091 diff --git a/sensorhub-support/pom.xml b/sensorhub-support/pom.xml index 9a71296..761601c 100644 --- a/sensorhub-support/pom.xml +++ b/sensorhub-support/pom.xml @@ -42,6 +42,12 @@ ${redis.version} + + com.baomidou + mybatis-plus-generator + ${mybatis-plus-generator.version} + + org.reflections diff --git a/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java b/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java new file mode 100644 index 0000000..515ca53 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java @@ -0,0 +1,14 @@ +package com.casic.missiles.enums; + +/** + * @author + * @date + */ +public interface FixedPropertyEnum { + + String FIXED_POSITION = "fixedPosition"; + + String TOTAL_LENGTH = "totalLength"; + + String TAIL_POSITION = "tailPosition"; +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java index 608af3a..32cc8a4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java @@ -2,48 +2,47 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.delivery.decorator.ByteDecorator; +import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @AllArgsConstructor public class FieldDecoratorManger { - private final RuleDictDao ruleDictDao; + private final RuleConfigRegistry ruleDictDao; // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 // (1)静态的业务字段是字典里面可以配置的 // (2)动态的业务字段是通过规则生成的 public String contentMerge(String ruleJson, String sceneConent, String dynamicContent) { - List ruleDictList = ruleDictDao.getRuleDictConfig(); - Map ruleDictMap = ruleDictList.stream().collect( - Collectors.toMap(RuleDict::getId, e -> e)); - List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); - for (Map ruleMap : ruleMapList) { - String ruleType = String.valueOf(ruleMap.get("ruleType")); - ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); - NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); - byteDecorator.nodeDecoratorRule(nodeDecoratorParm); - } +// List ruleDictList = ruleDictDao.getRuleDictConfig(); +// Map ruleDictMap = ruleDictList.stream().collect( +// Collectors.toMap(RuleDict::getId, e -> e)); +// List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); +// for (Map ruleMap : ruleMapList) { +// String ruleType = String.valueOf(ruleMap.get("ruleType")); +// ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); +// NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); +// byteDecorator.nodeDecoratorRule(nodeDecoratorParm); +// } return null; } - - private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { - NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() - .contents(sceneConent) - .dynamicContent(dynamicContent) - .ruletypeId(ruletypeId) - .ruleDictMap(ruleDictMap) - .build(); - return nodeDecoratorParm; - } +// +// private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { +// NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() +// .contents(sceneConent) +// .dynamicContent(dynamicContent) +// .ruletypeId(ruletypeId) +// .ruleDictMap(ruleDictMap) +// .build(); +// return nodeDecoratorParm; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java index 652970c..b204ac3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java @@ -1,56 +1,56 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@AllArgsConstructor -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", - JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Component; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Component("logicalDecorator") +//@AllArgsConstructor +//@Slf4j +//public class LogicalShiftDecorator implements ByteDecorator { +// +//// private final FieldRuleEngineMapper fieldRuleEngineMapper; +//// +//// //字节位移 +//// @Override +//// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +//// String logicalValue = ""; +//// RuleEvaluator fieldRuleEngine = new RuleEvaluator(); +//// try { +//// Map env2 = new HashMap(); +//// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +//// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +//// for (String contentId : contentIdList) { +//// RuleDict ruleDict = ruleDictMap.get(contentId); +//// if (ruleDict.getCode().contains("#")) { +//// //使用动态的值 +//// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +//// } +//// env2.put(ruleDict.getName(), ruleDict.getCode()); +//// } +//// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +//// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +//// return null; +//// } +//// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +//// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +//// return values; +//// } catch (Exception ex) { +//// log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", +//// JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +//// return null; +//// } +//// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java index 346468f..822fead 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@AllArgsConstructor -@Slf4j -public class OperationDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("optionDecorator") +//@AllArgsConstructor +//@Slf4j +//public class OperationDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //混合运算,有常量或者乘除的缩放 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java index 50fb0a7..7a8bccb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@AllArgsConstructor -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +////精度计算 +//@AllArgsConstructor +//@Registry("precisionDecorator") +//@Slf4j +//public class PrecisionDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java index da39235..27f9cc7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java @@ -1,54 +1,53 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@AllArgsConstructor -@Slf4j -public class RuleDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("ruleDecorator") +//@AllArgsConstructor +//@Slf4j +//public class RuleDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //吃我一套正则表达式 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (Exception ex) { +// log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java index 7f5cbf3..c043f97 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java @@ -2,6 +2,6 @@ import java.util.Map; -public interface ComandeEventService { +public interface ComandeEventService{ Map loadComandeEventConfig(String protocolId,String scene); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java index 476ad84..aaf1837 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java @@ -2,46 +2,46 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.dao.CommandEventDao; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @Slf4j @AllArgsConstructor -public class ComandeEventServiceImpl implements ComandeEventService { +public class ComandeEventServiceImpl implements ComandeEventRegistry { - private final CommandEventDao commandEventDao; + // private final CommandEventDao commandEventDao; // 加密bean 固定字段出现变化的字段解析,业务字段的有序内容 @Override - public Map loadComandeEventConfig(String protocolId,String sceneName) { - CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); - if (ObjectUtil.isEmpty(commandEventConfig)) { - log.error("协议{},没有配置成功接收回复配置,清排查原因"); - return null; - } - String replyJson = commandEventConfig.getReplyContentJson(); - List> replyMapList = JSONArray.parseObject(replyJson, List.class); - List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); - Map fixMap = fixList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); - List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) - .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) - .collect(Collectors.toList()); - Map commandConfigMap = new HashMap<>(); - commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); - commandConfigMap.put("fixContent", fixMap); - commandConfigMap.put("bizContent", contentList); - return commandConfigMap; + public Map loadComandeEventConfig(String protocolId, String sceneName) { +// CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); +// if (ObjectUtil.isEmpty(commandEventConfig)) { +// log.error("协议{},没有配置成功接收回复配置,清排查原因"); +// return null; +// } +// String replyJson = commandEventConfig.getReplyContentJson(); +// List> replyMapList = JSONArray.parseObject(replyJson, List.class); +// List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); +// Map fixMap = fixList.stream() +// .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); +// List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) +// .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) +// .collect(Collectors.toList()); +// Map commandConfigMap = new HashMap<>(); +// commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); +// commandConfigMap.put("fixContent", fixMap); +// commandConfigMap.put("bizContent", contentList); +// return commandConfigMap; + return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 128b09d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java deleted file mode 100644 index 4016b0b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface DatagramEventMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java deleted file mode 100644 index 597c306..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.apache.ibatis.annotations.Mapper; - -public interface FieldConfigMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java deleted file mode 100644 index a31680a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.PreRuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface PreRuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java deleted file mode 100644 index 9060a69..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface ProtocolConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java deleted file mode 100644 index 6fa6936..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java deleted file mode 100644 index 582a705..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleDict; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleDictMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java deleted file mode 100644 index 6e302c8..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.CommandEventMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Optional; - -@Component -public class CommandEventDao { - - @Resource - private CommandEventMapper commandEventMapper; - - public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId) - .eq("scene", sceneName) - .eq("enabled", 1); - List commandEventConfig = commandEventMapper.selectList(queryWrapper); - Optional optionalEventConfig = commandEventConfig.stream().findFirst(); - return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java deleted file mode 100644 index 9137e4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.FieldConfigMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class FieldConfigDao { - - @Resource - private FieldConfigMapper fieldConfigMapper; - - public FieldConfig getFieldConfigById(String fieldId) { - FieldConfig fieldConfig = fieldConfigMapper.selectById(fieldId); - return fieldConfig; - } - - public List getFieldConfigs(String protocolId,Integer isFixed) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",isFixed); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - - public List getStorageFieldConfig(String protocolId) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",1) - .eq("is_storage",1); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java deleted file mode 100644 index 67bff6b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.mapper.PreRuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class PreRuleConfigDao { - - @Resource - private PreRuleConfigMapper preRuleConfigMapper; - - public List getPreRuleList(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return preRuleConfigMapper.selectList(queryWrapper); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java deleted file mode 100644 index d69ea85..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.RuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleConfigDao { - - @Resource - private RuleConfigMapper ruleConfigMapper; - - public RuleConfig getNextRuleConfig(String ruleFields) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("parse_rule_json", ruleFields); - return ruleConfigMapper.selectOne(queryWrapper); - } - - - public List getRuleConfigById(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return ruleConfigMapper.selectList(queryWrapper); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java deleted file mode 100644 index 932c185..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.RuleDictMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleDictDao { - - @Resource - private RuleDictMapper ruleDictMapper; - - public List getRuleDictConfig() { - List ruleDictList = ruleDictMapper.selectList(null); - return ruleDictList; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java index 9f9e279..43bc4d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java @@ -10,20 +10,15 @@ import io.netty.channel.socket.nio.NioServerSocketChannel; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import javax.annotation.PreDestroy; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static cn.hutool.core.util.ClassUtil.getClasses; /** * SensorhubServer netty服务端 */ @Slf4j -@Service +@Component public class SensorhubServer { /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java index 2c79ff5..9a28c36 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java @@ -11,13 +11,13 @@ import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioSocketChannel; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClient 客户端 */ @Slf4j -@Service +@Registry public final class SensorhubClient { public static void main(String[] args) throws Exception { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java index 9774be0..477c3f7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java @@ -6,12 +6,12 @@ import io.netty.channel.socket.SocketChannel; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientChannelInitialHandler */ -@Service +@Registry public class SensorhubClientChannelInitialHandler extends ChannelInitializer { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java index 346f4b3..73560e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java @@ -5,13 +5,13 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientHandler */ @Slf4j -@Service +@Registry public class SensorhubClientHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java index 5c1c6f2..d990af5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java @@ -4,12 +4,12 @@ import com.casic.missiles.pojo.Msg; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** * SensorhubServerHandler */ -@Service +@Component public class SensorhubServerHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 67283ae..af3172c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,41 +1,37 @@ package com.casic.missiles.parser; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultProtocolConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.*; +import com.casic.missiles.registry.FieldConfigRegistry; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; -import java.nio.charset.Charset; import java.util.HashMap; import java.util.List; import java.util.Map; -@Service("genericProtocolParser") +/** + * @author + */ +@Component("genericProtocolParser") @Slf4j -@AllArgsConstructor +@RequiredArgsConstructor public class GenericProtocolParser implements ProtocolParser { - private final LeadingCodeMatcher leadingCodeMatcher; private final List frameStructDispenserList; - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorInstanceSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; // 匹配首字母前导码=> 帧结构匹配前导码=> // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 @@ -44,18 +40,19 @@ public Boolean doParseProtocol(ByteBuf byteBuf) { String protocolContent = ByteBufUtil.hexDump(byteBuf); //匹配前导码 - List preCodeConfigs = leadingCodeMatcher.matchLeadingCode(protocolContent); + List preCodeConfigs = LeadingCodeMatcher.matchFrameLeadingCode(protocolContent); //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 if (preCodeConfigs.size() == 0) { - return rematch(byteBuf,protocolContent); + return rematch(byteBuf, protocolContent); } - //暂时先取第一个 + //暂时先取第一个,提升速度,使用享元模式, 减少类的创建销毁与构建 ProtocolConfig protocolConfig = preCodeConfigs.get(0); + AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); ByteBuf wholeDatagramByte = null; //通过匹配帧结构获取完整的数据包 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, preCodeConfigs.get(0))) != null) { + if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, protocolFactory)) != null) { break; } } @@ -68,76 +65,78 @@ * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 */ - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId, wholeDatagramByte); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap, protocolId); - //选取规则对应的流程实例 - DatagramEventConfig datagramEventConfig = processorInstanceSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); + //进行规则字段解析,进行匹配规则 + RuleConfig ruleConfig = getRuleConfig(protocolFactory, wholeDatagramByte); + if (ruleConfig == null) { + return false; + } //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, wholeDatagramByte); + ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte); + //以下进行业务的规则解析,同时选定流程实例 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); + DatagramEventProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain, + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText, protocolId); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain); //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); + datagramEventProvider.storeData(bizDataMap); return true; } - private Boolean rematch(ByteBuf byteBuf,String protocolContent) { + /** + * 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 + */ + private Boolean rematch(ByteBuf byteBuf, String protocolContent) { //重置位判断 byteBuf.resetReaderIndex(); //判断重置是否前移,如果没有前移,则直接判为匹配失败 if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { return false; } else { + //递归执行 return doParseProtocol(byteBuf); } } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; + //获取匹配规则->匹配规则 + private RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + //取出其中参与逻辑provider并判空 + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); + String rulePrepareFields = protocolConfig.getRulePrepareFields(); + //固定字段 + if (StringUtils.isNotEmpty(rulePrepareFields)) { + //获取统一固定字段解析 + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + //获取该协议的字段配置,用于协议规则匹配 + List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); + //获取规则 + RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, + rulePrepareFields, protocolFieldConfigs); + return ruleConfig; + } + return null; } - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + //数据构建,获取固定字段的store和业务字段store + private Map buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + Map bizDataMap = new HashMap<>(); + Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); + Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); + bizDataMap.putAll(ruleStoreObjectMap); + bizDataMap.putAll(protocolStoreObjectMap); return bizDataMap; } - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java index 8a46e32..16ce2e5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java @@ -3,6 +3,7 @@ import io.netty.buffer.ByteBuf; public interface ProtocolParser { + Boolean doParseProtocol(ByteBuf byteBuf); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java new file mode 100644 index 0000000..f7814af --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java @@ -0,0 +1,35 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.ProtocolConfigProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.ProtocolConfig; + +/** + * 存放基本协议的的加载信息 + */ +public class AbstractProtocolConfigFactory { + private final ProtocolConfigProvider protocolConfigProvider; + private final ProtocolFieldConfigProvider protocolFieldConfigProvider; + private final RuleConfigProvider ruleConfigProvider; + + public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { + this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); + this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); + this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); + } + + public ProtocolConfigProvider getProtocolConfigProvider() { + return protocolConfigProvider; + } + + public ProtocolFieldConfigProvider getProtocolFieldConfigProvider() { + return protocolFieldConfigProvider; + } + + public RuleConfigProvider getRuleConfigProvider() { + return ruleConfigProvider; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java new file mode 100644 index 0000000..6e36147 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java @@ -0,0 +1,57 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.CombinedFieldConfigProvider; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.FieldConfigProvider; +import com.casic.missiles.parser.provider.FieldRuleConfigProvider; + +/** + * 存放规则相关的的的加载信息 + */ +public class AbstractRuleConfigFactory { + + /** + * 处理字节 + */ + private final FieldConfigProvider fieldConfigProvider; + /** + * 处理组合字节解析的解码器 + */ + private final CombinedFieldConfigProvider combinedFieldConfigProvider; + /** + * 处理负责字节解析的规则配置 + */ + private final FieldRuleConfigProvider fieldRuleConfigProvider; + /** + * 处理实例流程 + */ + private final DatagramEventProvider datagramEventProvider; + + + public AbstractRuleConfigFactory(Long ruleId) { + this.fieldConfigProvider = new FieldConfigProvider(ruleId); + this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); + this.fieldRuleConfigProvider = new FieldRuleConfigProvider(ruleId); + this.datagramEventProvider = new DatagramEventProvider(ruleId); + } + + public FieldConfigProvider getFieldConfigProvider() { + return fieldConfigProvider; + } + + public CombinedFieldConfigProvider getCombinedFieldConfigProvider() { + return combinedFieldConfigProvider; + } + + public FieldRuleConfigProvider getFieldRuleConfigProvider() { + return fieldRuleConfigProvider; + } + + public DatagramEventProvider getDatagramEventProvider() { + return datagramEventProvider; + } + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java deleted file mode 100644 index 6e1719a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.factory; - - -import com.casic.missiles.pojo.ProtocolConfig; - -import java.util.List; - -/** - * 数据库访问优化(暂时未做) - *

- * 1、初始化协议解析配置,并存放到处存放缓存,对协议基本配置进行管理 - * 2、其中流程中所有的配置都经过此类进行管理,进行调用获取,增强解析速度 - */ -public interface DatagramFactory { - - /** - * 初始化 - */ - List datagramInit(); - - /** - * 根据前导码配置匹配,模糊匹配获取所有的报文项 - */ - List match(); - - /** - * 根据前导码匹配,返回报文项 - */ - List filer(); - - /** - * 保证数据的唯一性选择器 - */ - List selectOne(); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java new file mode 100644 index 0000000..87444a0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java @@ -0,0 +1,18 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +import java.util.List; + +/** + * 直接用,还是边用边创建 + */ +public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { + + + public DefaultProtocolConfigFactory(ProtocolConfig protocolConfig) { + super(protocolConfig); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java new file mode 100644 index 0000000..cce0c7c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java @@ -0,0 +1,12 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; + +public class DefaultRuleFactory extends AbstractRuleConfigFactory { + + public DefaultRuleFactory(Long ruleId) { + super(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java deleted file mode 100644 index 9ee97e0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.casic.missiles.parser.instance; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service -@Slf4j -@AllArgsConstructor -public class GeneralProcessor { - - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; - - /** - * 统一固定字段解析=>进行规则的查询的判断 - * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 - * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 - */ - @Deprecated - public boolean parseWholeDatagram(ByteBuf buffer, ProtocolConfig protocolConfig) { - try { - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap,protocolId); - //选取规则对应的流程= - DatagramEventConfig datagramEventConfig = processorSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); - //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); - //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); - //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); - //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); - //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); - return true; - } catch (Exception ex) { - log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", - ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); - return false; - } - } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; - } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); - } - - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); - return bizDataMap; - } - - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java index 25e7ad8..6a5777e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java @@ -1,23 +1,31 @@ package com.casic.missiles.parser.instance.impl; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.mapper.DatagramEventMapper; import com.casic.missiles.pojo.DatagramEventConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.SpringContextUtil; -@Service -@AllArgsConstructor +import java.util.List; +import java.util.Optional; + +/** + * @author cz + * + */ public class DefaultProcessorInstanceSelector implements ProcessorInstanceSelector { - private final DatagramEventMapper datagramEventMapper; + private static List datagramEventConfigs; + + static { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + datagramEventConfigs = datagramEventRegistry.getDatagramEventList(); + } @Override public DatagramEventConfig getProcessorInstance(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("rule_id", protocolId); - return datagramEventMapper.selectOne(queryWrapper); + Optional optionalSelectInstance = datagramEventConfigs.stream() + .filter(e -> e.getId().equals(protocolId)).limit(1).findFirst(); + return optionalSelectInstance.isPresent() ? optionalSelectInstance.get() : null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a778671..7b56a43 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,16 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import io.netty.buffer.ByteBuf; /** - * 分析匹配情况 - * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 - * 2、匹配不成功,有后续帧,可以进行下次匹配。 - * 3、匹配不成功,无后续帧,可以进行丢弃。 + * 分析匹配情况 + * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 + * 2、匹配不成功,有后续帧,可以进行下次匹配。 + * 3、匹配不成功,无后续帧,可以进行丢弃。 */ -public interface FrameStructMatcher{ +public interface FrameStructMatcher { - ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig); + ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 05320ab..8ebea78 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,23 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.ProtocolConfigMapper; +import com.casic.missiles.parser.provider.ProtocolConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Component; import java.util.List; import java.util.stream.Collectors; -@Component -@AllArgsConstructor public class LeadingCodeMatcher { - private final ProtocolConfigMapper protocolMapper; - //** 1、首字母匹配前导码, // 2、以匹配出的前导码是否在报文中条件进行前导码的匹配二次筛选 - public List matchLeadingCode(String protocolContent){ + public static List matchFrameLeadingCode(String protocolContent){ List initialConfigs = initialMatch(protocolContent); List preCodeConfigs = initialConfigs.stream() .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) @@ -26,13 +19,16 @@ } //初始化匹配前导码内容 - private List initialMatch(String protocolContent) { - String protocolStr = protocolContent.charAt(0) + ""; - QueryWrapper queryWrapper = new QueryWrapper() - .likeRight("pre_fix", protocolStr); - List protocolConfigList = protocolMapper.selectList(queryWrapper); - return protocolConfigList; + private static List initialMatch(String protocolContent) { + String firstFrameChar = protocolContent.charAt(0) + ""; + ProtocolConfigProvider protocolConfigProvider=new ProtocolConfigProvider(firstFrameChar); + return protocolConfigProvider.getMatchList(); } + + + + + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index cf2113d..e915877 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -1,32 +1,35 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(0) -@Service +@Component public class FrameLengthMatcher implements FrameStructMatcher { - @Autowired - private FieldParser fieldParser; - //超过长度 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { String dataGramContent = ByteBufUtil.hexDump(byteBuf); - if (StringUtils.isEmpty(protocolConfig.getUnpackId()) && StringUtils.isEmpty(protocolConfig.getTailStr())) { - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + //当不存在结尾标志和拆包标志,可以直接使用长度进行匹配 + if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { if (dataGramContent.length() >= totalLength) {//等于长度返回true,超出长度,切断 - ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, protocolConfig, totalLength); + ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, totalLength); return wholeDatagramByte; } else { //读的标志位前移舍弃 @@ -38,7 +41,7 @@ return null; } - private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, Integer totalLength) { byteBuf.readBytes(totalLength); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, totalLength - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 2bfc213..d527ad0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; @@ -13,7 +13,7 @@ import lombok.AllArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.nio.charset.Charset; import java.util.Map; @@ -22,32 +22,30 @@ * 后续标志验证 */ @Order(1) -@Service +@Component @AllArgsConstructor -public class FrameMarkMatcher implements FrameStructMatcher { - - private final FieldConfigDao fieldConfigDao; - private final FieldParser fieldParser; - private final FieldResolver fieldResolverManger; +public class FrameMarkMatcher implements FrameStructMatcher, FixedPropertyEnum { //帧后续标志=>结束,进行帧的重组=>有后续,1、帧移位判别 2、继续接收帧 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig UnpackConfig = StringUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getUnpackId()); - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); - Integer upback = 0; + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); ByteBuf mergeWholeFrameByte = null; - if (!ObjectUtil.isEmpty(UnpackConfig)) { - while (hasNextFullFrame(byteBuf, protocolConfig)) { - upback = (Integer) fieldResolverManger.filedParserManger(byteBuf, UnpackConfig, null); + if (!ObjectUtil.isEmpty(unpackFlag)) { + while (hasNextFullFrame(byteBuf, protocolConfig, protocolFieldConfigProvider)) { //是否存在后续位 - if (upback == 1) {//使用esayRule + if (unpackFlag == 1) {//使用esayRule //表示可以截取 - mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolConfig, totalLength); + mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolFieldConfigProvider, protocolConfig); return mergeWholeFrameByte; } else { - byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig)); + byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig, protocolFieldConfigProvider)); } } } @@ -56,7 +54,8 @@ //选取第一个帧,将业务内容和后面部分分开 //计算数据报文-业务内容 - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolFieldConfigProvider protocolFieldConfigProvider, ProtocolConfig protocolConfig) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); //截取完整报文 byteBuf.readBytes(totalLength); ByteBuf byteBufContent = byteBuf.slice(0, byteBuf.readerIndex()); @@ -68,15 +67,15 @@ String tail = ""; System.out.println(ByteBufUtil.hexDump(byteBufContent)); //会存在多个帧拼接在一起的的情况,进行合并处理 - while (hasNextFullFrame(byteBufContent, protocolConfig)) { - Integer currentFrameLength = fieldParser.getTotalLength(protocolConfig, byteBufContent); + while (hasNextFullFrame(byteBufContent, protocolConfig, protocolFieldConfigProvider)) { + Integer currentFrameLength = protocolFieldConfigProvider.getTotalLength(byteBufContent, protocolConfig); byteBufContent.readBytes(currentFrameLength); ByteBuf currentbyteBuf = byteBufContent.slice(0, byteBufContent.readerIndex()); byteBufContent.markReaderIndex();//读的标志位前移 System.out.println(ByteBufUtil.hexDump(byteBufContent)); String hexDump = currentbyteBuf.toString(Charset.forName("ISO-8859-1")); //获取当前固定帧结构的关系map - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, currentbyteBuf); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(currentbyteBuf, protocolConfig); if (StringUtils.isEmpty(mergeFrameStr)) { //首次获取业务数据报文 mergeFrameStr += hexDump.substring(0, currentFrameFixedProperty.get("tailPosition")); @@ -95,22 +94,22 @@ /** * 获取平移到下一帧起始位置 */ - public int getNextFrameOffset(ByteBuf buffer, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, buffer); - return currentFrameFixedProperty.get("totalLength"); + public int getNextFrameOffset(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + return currentFrameFixedProperty.get(TOTAL_LENGTH); } /** * 判断是否出错进行整个帧的 */ - public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, byteBuf); + public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); //保证读取位置不在固定位置,是可变的业务内容 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("fixedPosition")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(FIXED_POSITION)) { return false; } //判断读取是否操作帧长度 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("totalLength")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(TOTAL_LENGTH)) { return false; } return true; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 76a3784..c3a1bab 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -1,50 +1,50 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.parser.instance.GeneralProcessor; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; +import io.netty.buffer.ByteBufUtil;; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(2) -@Service +@Component public class FrameTailMatcher implements FrameStructMatcher { - @Resource - private FieldConfigDao fieldConfigDao; - @Autowired - private GeneralProcessor generalProcessor; - //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig tailFieldConfig = StringUtils.isEmpty(protocolConfig.getTailStr()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getTailStr()); - if (!ObjectUtil.isEmpty(tailFieldConfig)) { - String tailStr = tailFieldConfig.getFieldName(); + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfig protocolFieldConfig = ObjectUtils.isEmpty(protocolConfig.getTailStr()) ? null : + fieldConfigProvider.getFieldConfigById(protocolConfig.getTailStr()); + if (!ObjectUtil.isEmpty(protocolFieldConfig)) { + String tailStr = protocolFieldConfig.getFieldName(); String dataGramContent = ByteBufUtil.hexDump(byteBuf); Boolean tailFlag = ByteBufUtil.hexDump(byteBuf).contains(tailStr); if (!tailFlag) { //使用esayRule return null; } else if (dataGramContent.indexOf(tailStr) < dataGramContent.length() - tailStr.length()) { Integer length = dataGramContent.indexOf(tailStr) + tailStr.length(); - ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, protocolConfig, length); + ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, length); return wholeDatagramByte; //存在粘包 } } return null; } - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer length) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, Integer length) { byteBuf.readBytes(length); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, length - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java new file mode 100644 index 0000000..5f1c177 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java @@ -0,0 +1,73 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.combined.GenericCombinedFieldResolver; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.CombinedFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class CombinedFieldConfigProvider { + + + /** + * 作为临时配置列表缓存使用 + */ + private final List combinedFieldConfigList; + private Map storeObjectMap = new HashMap<>(); + + public CombinedFieldConfigProvider(Long ruleId) { + CombinedFieldConfigRegistry combinedFieldConfigRegistry = SpringContextUtil.getBean(CombinedFieldConfigRegistry.class); + combinedFieldConfigList = combinedFieldConfigRegistry.getCombinedFieldConfigList(ruleId); + } + + public void parseDataField(RuleConfig ruleConfig, String clearZeroPlain,Map fieldConfigsMap ) { + if (showSkip()) { + return; + } + //匹配对应的数据,然后进行相关的字段解析 + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver(); + combinedFieldResolver.parseDataField(combinedFieldConfigList, byteBuf, storeObjectMap,fieldConfigsMap); + } + + + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getCombinedFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return combinedFieldConfigList.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public List getCombinedFieldConfigList() { + return combinedFieldConfigList; + } + + /* 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(combinedFieldConfigList) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java new file mode 100644 index 0000000..f3cfedc --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java @@ -0,0 +1,11 @@ +package com.casic.missiles.parser.provider; + +/** + * @author cz + * @date 2023-6-12 + */ +public class CommandEventProvider{ + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java new file mode 100644 index 0000000..70eec5e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java @@ -0,0 +1,77 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.safe.SafeStrategy; +import com.casic.missiles.parser.sender.DataSubscribeProvider; +import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class DatagramEventProvider { + + private final DatagramEventConfig processorInstance; + + public DatagramEventProvider(Long ruleId) { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + List datagramEventConfigList = + datagramEventRegistry.getDatagramEventList(ruleId); + processorInstance = this.getProcessorInstance(datagramEventConfigList); + } + + public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { + if (showSkip()) { + return null; + } + return datagramEventConfigList.get(0); + } + + // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 + public String getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap) { + String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? + processorInstance.getSafeBean() : + fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); + if (!StringUtils.isEmpty(safeName)) { + //需要加密 + SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); + String plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); + return clearComplementZero(plain); + } + return ByteBufUtil.hexDump(bizDataContent); + } + + //解密清零操作 + private String clearComplementZero(String plain) { + plain = plain.substring(0, plain.lastIndexOf("00")); + return plain; + } + + //数据发送,数据发送者暂未构建 + public void storeData(Map bizDataMap) { + DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); +// dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return ObjectUtils.isNotEmpty(processorInstance) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java new file mode 100644 index 0000000..7e1fe0a --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java @@ -0,0 +1,97 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.FieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class FieldConfigProvider { + + + private final List fieldConfigs; + private Map storeObjectMap = new HashMap<>(); +// private Map singleObjects = new ConcurrentHashMap<>(); + + public FieldConfigProvider(Long ruleId) { + FieldConfigRegistry fieldConfigRegistry = SpringContextUtil.getBean(FieldConfigRegistry.class); + fieldConfigs = fieldConfigRegistry.getFieldConfigList(ruleId); + } + + public List getFieldConfigs() { + return fieldConfigs; + } + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public Map parseDataField(RuleConfig ruleConfig, String clearZeroPlain) { + if (showSkip()) { + return null; + } + List prepareFieldConfig = prepareParseField(ruleConfig); + if (CollectionUtils.isNotEmpty(prepareFieldConfig)) { + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(fieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + return fixDataMap; + } + } + return null; + } + + /** + * 得到需要处理的业务内容 + * + * @return + */ + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return fieldConfigs.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public Map getFieldConfigsMap() { + return fieldConfigs.stream().collect( + Collectors.toMap(FieldConfig::getId, e -> e) + ); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(fieldConfigs) ? false : true; + } + + +} + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java new file mode 100644 index 0000000..817bfaf --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java @@ -0,0 +1,19 @@ +package com.casic.missiles.parser.provider; + +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.registry.FieldRuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; + +public class FieldRuleConfigProvider { + + private final List fieldRuleConfigList; + + public FieldRuleConfigProvider(Long ruleId) { + FieldRuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(FieldRuleConfigRegistry.class); + fieldRuleConfigList = ruleConfigRegistry.getFieldRuleConfigList(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java new file mode 100644 index 0000000..99a1b06 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java @@ -0,0 +1,53 @@ +package com.casic.missiles.parser.provider; + + +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.registry.ProtocolConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolConfigProvider { + + private final List protocolConfigList; + + public ProtocolConfigProvider(String firstChar) { + ProtocolConfigRegistry registry = SpringContextUtil.getBean(ProtocolConfigRegistry.class); + protocolConfigList = registry.getProtocolConfigList(firstChar); + } + + public List getMatchList() { + return protocolConfigList; + } + + /** + * 设置当前协议 + * + * @param protocolConfig + */ + public ProtocolConfigProvider(ProtocolConfig protocolConfig) { + List protocolConfigs = new ArrayList<>(); + protocolConfigs.add(protocolConfig); + protocolConfigList = protocolConfigs; + } + + /** + * 获取当前协议 + * + * @return + */ + public ProtocolConfig getCurrentProtocolConfig() { + if (this.protocolConfigList == null) { + return null; + } else { + return protocolConfigList.get(0); + } + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java new file mode 100644 index 0000000..043927d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java @@ -0,0 +1,213 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.registry.ProtocolFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolFieldConfigProvider { + + private static final String FIXED_FIELD_DS = "fixedFieldDs"; + private static final String CONTENT_FIELD_DS = "contentFieldDs"; + private static final String PROTOCOL_LENGTH = "protocolLength"; + private static final String PROTOCOL_FIELD_ID = "protocolFieldId"; + private static final String PROTOCOL_POSITION = "protocolPosition"; + + private final List protocolFieldConfigs; + private Map singleObjects = new ConcurrentHashMap<>(); + private Map storeObjectMap = new HashMap<>(); + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public ProtocolFieldConfigProvider(Long protocolId) { + ProtocolFieldConfigRegistry protocolFieldConfigRegistry = SpringContextUtil.getBean(ProtocolFieldConfigRegistry.class); + protocolFieldConfigs = protocolFieldConfigRegistry.getProtocolFieldConfigList(protocolId); + } + + public List getProtocolFieldConfigs() { + return protocolFieldConfigs; + } + + public ProtocolFieldConfig getFieldConfigById(Long fieldId) { + Optional optionalConfig = protocolFieldConfigs.stream().filter( + e -> e.getId().equals(fieldId) + ).findFirst(); + return optionalConfig.isPresent() ? optionalConfig.get() : null; + } + + public Integer getProtocolFieldValue(Long protocolFieldId, ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_FIELD_ID + protocolFieldId + ByteBufUtil.hexDump(byteBuf); + //获取缓存 + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + //加载固定长度数据集合 + Map fixDataMap = this.getProtocolDataMap(byteBuf); + ProtocolFieldConfig protocolFieldConfig = selectFieldConfig(protocolFieldId); + Integer protocolFieldValue = 0; + //获取约定字段的总长度 + if (fixDataMap.containsKey(protocolFieldConfig.getFieldName())) { + Object appointUnpackObject = fixDataMap.get(protocolFieldConfig.getFieldName()); + if (ObjectUtils.isNotEmpty(appointUnpackObject)) { + protocolFieldValue = (Integer) appointUnpackObject; + } + } + if (protocolFieldValue != null) { + //加入缓存 + if (ObjectUtils.isNotEmpty(protocolFieldValue)) { + this.singleObjects.put(catchKey, protocolFieldValue); + return protocolFieldValue; + } + } + return null; + } + + /** + * 获取帧固定位置信息 + * + * @param byteBuf + * @param protocolConfig + * @return + */ + public Map getFixedProperty(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_POSITION + protocolConfig.getId(); + if (this.singleObjects.containsKey(catchKey)) { + return (Map) singleObjects.get(catchKey); + } + Map fixedPropertyMap = new HashMap<>(); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + fixedPropertyMap = fieldParser.doGetFixedProperty(protocolFieldConfigs, this.getTotalLength(byteBuf,protocolConfig)); + if (CollectionUtils.isNotEmpty(fixedPropertyMap)) { + this.singleObjects.put(catchKey, fixedPropertyMap); + return fixedPropertyMap; + } + return fixedPropertyMap; + } + + /** + * 获取帧结构应有的总长度 + */ + public Integer getTotalLength(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_LENGTH + ByteBufUtil.hexDump(byteBuf); + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + Integer appointFrameLength = getProtocolFieldValue(protocolConfig.getTotalLengthId(), byteBuf); + if (appointFrameLength != null) { + //获取过滤的字段集合总长度 + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Integer totalFilterLength = fieldParser.getTotalFilterLength(protocolConfig, byteBuf, getFixFieldConfigMap()); + //计算总长度 + Integer totalLength = appointFrameLength + totalFilterLength; + //加入缓存 + if (ObjectUtils.isNotEmpty(totalLength)) { + this.singleObjects.put(catchKey, totalLength); + return totalLength; + } + } + return null; + } + + /** + * 获取协议有关字段解析内容 + * storeObjectMap存储代转存的数据 + * + * @return + */ + public Map getProtocolDataMap(ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(FIXED_FIELD_DS)) { + return (Map) singleObjects.get(FIXED_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(protocolFieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + this.singleObjects.put(FIXED_FIELD_DS, fixDataMap); + return fixDataMap; + } + return null; + } + + /** + * 获取业务报文内容的content字节 + * + * @param wholeDatagramByte + * @return + */ + public ByteBuf getDataContentBuf(ByteBuf wholeDatagramByte) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(CONTENT_FIELD_DS)) { + return (ByteBuf) singleObjects.get(CONTENT_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + ByteBuf bizDataByteBuf = fieldParser.getDataContentBuf(protocolFieldConfigs, wholeDatagramByte); + if (bizDataByteBuf != null) { + this.singleObjects.put(CONTENT_FIELD_DS, bizDataByteBuf); + return bizDataByteBuf; + } + return null; + } + + + private ProtocolFieldConfig selectFieldConfig(Long id) { + Optional optionalProtocolFieldConfig = this.protocolFieldConfigs.stream().filter( + e -> e.getId().equals(id) + ).findFirst(); + return optionalProtocolFieldConfig.isPresent() ? optionalProtocolFieldConfig.get() : null; + } + + + private Map getFixFieldConfigMap() { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, e -> e) + ); + return fixDataFieldMap; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(protocolFieldConfigs) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java new file mode 100644 index 0000000..dafba1c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java @@ -0,0 +1,56 @@ +package com.casic.missiles.parser.provider; + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.rule.GenericRuleResolver; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.RuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleConfigProvider { + + private final List ruleConfigs; + + public List getRuleConfigs() { + return ruleConfigs; + } + + public RuleConfigProvider(Long protocolId) { + RuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(RuleConfigRegistry.class); + ruleConfigs = ruleConfigRegistry.getRuleConfigById(protocolId); + } + + /** + * 获取规则匹配结果 + * + * @param parseFixedDataMap + * @param protocolFieldConfigs + * @return + */ + public RuleConfig doGetRule(Map parseFixedDataMap, + String ids, + List protocolFieldConfigs) { + if (showSkip()) { + return null; + } + RuleConfig ruleConfig = GenericRuleResolver.machRule(parseFixedDataMap, ids, protocolFieldConfigs, ruleConfigs); + return ruleConfig; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(ruleConfigs) ? false : true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java index 3c05891..856b399 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java @@ -1,18 +1,11 @@ package com.casic.missiles.parser.resolver; -import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.springframework.web.bind.annotation.RequestBody; -import javax.annotation.Resource; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -20,19 +13,17 @@ @Slf4j public class ByteMergeProvider { - @Resource - private FieldRuleEngineMapper fieldRuleEngineMapper; - //拿到所有的值合并到一个值 - public String resolveByteMerge(List valueList, String ruletypeId, String vaildRange) { + public static String resolveByteMerge(List valueList, String ruleTypeId, String vaildRange) { String values = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Map vaildMap = getValidRangeMap(vaildRange); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(ruletypeId); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } + //暂时不处理 +// fieldRuleEngine = fieldRuleConfigMapper.selectById(ruleTypeId); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } Map env2 = new HashMap(); for (int i = 0; i < valueList.size(); i++) { if (vaildMap.containsKey(i)) { @@ -47,7 +38,7 @@ } } - private Map getValidRangeMap(String vaildRange) { + private static Map getValidRangeMap(String vaildRange) { String[] range = vaildRange.split(","); Map vaildMap = new HashMap(); for (int i = 0; i < range.length; i++) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 8d821cd..85d6bbf 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -1,9 +1,12 @@ package com.casic.missiles.parser.resolver; +import com.casic.missiles.pojo.AbstractFieldConfig; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; import io.netty.buffer.ByteBuf; +import java.util.List; import java.util.Map; /** @@ -11,18 +14,14 @@ */ public interface FieldParser { -// Map fieldProcess(String protocolContent,); - Map dataParser(RuleConfig ruleConfig, String lightText,String protocolId); + Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength); - Map fixDataParser(String protocolId, ByteBuf buffer); + Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap); - Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf); + ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer); - ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer); - - ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer); - - Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer); + Integer getTotalFilterLength(ProtocolConfig protocolConfig, ByteBuf byteBuf, Map protocolFieldConfigMap); } + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java new file mode 100644 index 0000000..9e0c00e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java @@ -0,0 +1,52 @@ +package com.casic.missiles.parser.resolver; + +import com.casic.missiles.pojo.AbstractFieldConfig; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.util.List; + +public class FieldParserSupport { + + //分别计算bit和byte长度=> 合并长度 + protected Integer calculateLength(List fieldConfigList) { + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + Integer fixedLength = bytefixedLength + bitfixedLength / 8; + return fixedLength; + } + + //找到最大值=> 根据最大值计算业务数据下标 + protected Integer calculatePosition(List fieldConfigList) { + String rex = "[0-9]+"; + Integer max = -1; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) + && Integer.valueOf(fieldConfig.getOriginPositionByte()) > max) { + max = Integer.valueOf(fieldConfig.getOriginPositionByte()); + } + } + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) && fieldConfig.getOriginPositionByte().equals(max)) { + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + } + } + Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; + return maxFixedPosition; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java deleted file mode 100644 index dd3a6cd..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java +++ /dev/null @@ -1,170 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.ByteResolverParam; -import io.netty.buffer.ByteBuf; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -/** - * 字段解析管理总类 - */ -@Service -@Slf4j -@AllArgsConstructor -public class FieldResolver extends ByteMergeProvider { - - //1、字段截取 => 2、简单的字节解析和复杂的字节解析 - public Object filedParserManger(ByteBuf byteBuf, FieldConfig fieldConfig, Integer maxFixedPosition) { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - //最大固定位置不为空, - if (!ObjectUtil.isEmpty(maxFixedPosition)) { - orignPosition -= maxFixedPosition; - } - Object fieldValue = 0; - //待优化 - if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { - fieldValue = bitToResolver(byteBuf, fieldConfig); - } else { - ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); - fieldValue = parsingFields(fieldBytes, fieldConfig.getRuleJson()); - } - return fieldValue; - } - - //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, - //目前默认配置的规则设置暂不支持配置化,由实现完成 - private Object parsingFields(ByteBuf byteBuf, String ruleJson) { - Object fieldsResolveValue = null; - List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); - if (ObjectUtil.isEmpty(ruleMapList)) { - fieldsResolveValue = defaultResolveBuilder(byteBuf); - } else { - fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); - } - return fieldsResolveValue; - } - - private Object defaultResolveBuilder(ByteBuf byteBuf) { - Integer defaultResolveValue = 0; - for (int i = 0; i < byteBuf.writerIndex(); i++) { - defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; - } - return defaultResolveValue; - } - - //字段解析构建器(针对字节单位的) - //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 - // 字节归并结束或者规则结束=>继续根据规则进行判断 - private Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { - Object customizeResolveValue = null; - try { - List bytStrList = new ArrayList<>(); - //存放到数组里面 - for (int i = 0; i < byteBuf.writerIndex(); i++) { - bytStrList.add(byteBuf.readByte()); - } - int i = 0; - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - customizeResolveValue = this.resolveByteMerge(bytStrList, ruletypeId,vaildRange); - break; - } else { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - List tempBytStr = new ArrayList<>(); - for (int k = 0; i < bytStrList.size(); i++) { - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(k) - .value(bytStrList.get(k)) - .ruletypeId(ruletypeId).build(); - tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); - } - bytStrList = tempBytStr; - } - i++; - } - //字节归并到一起=>继续根据规则进行判断 - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(customizeResolveValue) - .ruletypeId(ruletypeId).build(); - customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(customizeResolveValue)); - return customizeResolveValue; - } catch (RuntimeException ex) { - log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); - return null; - } - } - - /** - * 1、单个字节情况表示字段 - * 2、多字节情况表示字段(暂未处理) - */ - private Object bitToResolver(ByteBuf byteBuf, FieldConfig fieldConfig) { - Object fieldValue = new Object(); - try { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - byte fields = 0x00; - if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); - } else { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); - } - - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { - if (!StringUtils.isEmpty(fieldConfig.getExactOrignPosition())) { - fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getExactOrignPosition())).byteValue() - >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); - } else { - fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); - } - } else { - fieldValue = Integer.valueOf(fields & 0xff); - } - if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { - return fieldValue; - } - List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); - int i = 0; - //字节归并到一起=>继续根据规则进行判断 - while (i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(fieldValue) - .ruletypeId(ruletypeId).build(); - fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(fieldValue)); - return fieldValue; - } catch (RuntimeException ex) { - log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); - return null; - } - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java new file mode 100644 index 0000000..1d2aeab --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java @@ -0,0 +1,36 @@ +package com.casic.missiles.parser.resolver.bytes; + +import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.mapper.FieldRuleConfigMapper; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.pojo.ByteResolverParam; +import com.googlecode.aviator.AviatorEvaluator; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; +//转换规则 +@Component("convert") +@AllArgsConstructor +@Slf4j +public class ByteRuleResolver implements ByteResolver { + + private final FieldRuleConfigMapper fieldRuleConfigMapper; + + @Override + public Object resolveOperationRule(ByteResolverParam byteResolverParam){ + FieldRuleConfig fieldRuleEngine=fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); + if(ObjectUtil.isEmpty(fieldRuleEngine)){ + return byteResolverParam.getValue(); + } + String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); + Map env2 = new HashMap(); + env2.put("value", (byte) byteResolverParam.getValue()); + String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); + return values; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java index 103821c..786b71c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java @@ -2,34 +2,34 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("logicalShift") +@Component("logicalShift") @AllArgsConstructor @Slf4j public class LogicalShiftResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //字节位移 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { Integer index = byteResolverParam.getIndex(); - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return byteResolverParam.getValue(); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java index 476747d..01149bd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("operation") +@Component("operation") @AllArgsConstructor @Slf4j public class OperationResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //混合运算,有常量或者乘除的缩放 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java index 0b82cf4..79abcce 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.casic.missiles.pojo.ByteResolverParam; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; //精度计算 -@Service("precision") +@Component("precision") @AllArgsConstructor @Slf4j public class PrecisionResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java deleted file mode 100644 index 5c3f332..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; -//转换规则 -@Service("convert") -@AllArgsConstructor -@Slf4j -public class RuleResolver implements ByteResolver { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam){ - RuleEvaluator fieldRuleEngine=fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); - if(ObjectUtil.isEmpty(fieldRuleEngine)){ - return byteResolverParam.getValue(); - } - String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); - Map env2 = new HashMap(); - env2.put("value", (byte) byteResolverParam.getValue()); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java new file mode 100644 index 0000000..d3bbd91 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java @@ -0,0 +1,15 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; + +import java.util.List; +import java.util.Map; +// 前导码匹配->长度字段 +public interface AbstractCombinedFieldProcessor { + + Map invoke(Map map, ByteBuf byteBuf, List combinedFieldConfigList, + Map fieldConfigsMap, Map storeObjectMap); + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java new file mode 100644 index 0000000..03c8480 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java @@ -0,0 +1,59 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-13 + */ +//依次递增进行数据的解析, +public class GenericCombinedFieldResolver { + + + //通过查询,字段长度长度随机 + public void parseDataField(List combinedFieldConfigList, ByteBuf byteBuf, + Map storeObjectMap, Map fieldConfigsMap) { + Integer frameLength = Integer.valueOf(ByteBufUtil.hexDump(byteBuf)); + //添加前置处理器 + com.casic.missiles.util.ClassUtil classUtil = new com.casic.missiles.util.ClassUtil(); + List abstractCombinedProcessors = classUtil.getSubClassList(AbstractCombinedFieldProcessor.class); + + Map fieldFixedMap = combinedFieldLeadCodeMap(combinedFieldConfigList); + //frameLength + Map combinedProcessorFields = null; + while (byteBuf.readableBytes() < frameLength) { + //一直处理 + for (AbstractCombinedFieldProcessor abstractCombinedProcessor : abstractCombinedProcessors) { + combinedProcessorFields = abstractCombinedProcessor.invoke(combinedProcessorFields, byteBuf, + combinedFieldConfigList, + fieldConfigsMap, storeObjectMap); + if (combinedProcessorFields == null || byteBuf.readableBytes() < frameLength) { + return; + } + } + + } + } + + /** + * 取出前导码匹配集合 + */ + private Map combinedFieldLeadCodeMap(List combinedFieldConfigList) { + Map fieldFixedMap = combinedFieldConfigList + .stream() + .collect(Collectors.toMap(CombinedFieldConfig::getPrefixCode, e -> e)); + return fieldFixedMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java new file mode 100644 index 0000000..643a934 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java @@ -0,0 +1,100 @@ +package com.casic.missiles.parser.resolver.fields; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.FieldParserSupport; +import com.casic.missiles.pojo.*; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 保存使用时最基本的信息,并且使用原型模式 + */ +@Slf4j +public class DefaultProtocolFieldParser extends FieldParserSupport implements FieldParser, FixedPropertyEnum { + + //通过传入的配置和报文进行字段解析 + @Override + public Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap) { + Map dataMap = new HashMap<>(); + for (AbstractFieldConfig protocolFieldConfig : protocolFieldConfigs) { + if (!ObjectUtils.isEmpty(protocolFieldConfig.getOriginPositionByte())) { + Object fieldValue = FieldResolver.parseField(buffer, protocolFieldConfig, null); + if (protocolFieldConfig.getIsStorage() == 1) { + storeObjectMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + dataMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + } + return dataMap; + } + + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength) { + Map fixedPropertyMap = new HashMap<>(); + Integer fixedLength = calculateLength(protocolFieldConfigs); + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + fixedPropertyMap.put(FIXED_POSITION, maxFixedPosition); + fixedPropertyMap.put(TOTAL_LENGTH, totalLength); + fixedPropertyMap.put(TAIL_POSITION, totalLength - fixedLength + maxFixedPosition); + return fixedPropertyMap; + } + + //** 获取业务内容的byteBuf + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer) { + //计算固定长度 + Integer fixedLength = calculateLength(protocolFieldConfigs); + //总长度获取 + String lightText = buffer.toString(Charset.forName("ISO-8859-1")); + Integer totalLength = lightText.length(); + //计算固定长度最大长度 + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + //计算数据报文内容 + ByteBuf bizDataFields = buffer.slice(maxFixedPosition - 1, (totalLength - fixedLength)); + return bizDataFields; + } + + /** + * 获取过滤字段的长度 + */ + @Override + public Integer getTotalFilterLength(ProtocolConfig protocolConfig, + ByteBuf byteBuf, + Map protocolFieldConfigMap) { + if (ByteBufUtil.hexDump(byteBuf).equals("")) { + return 0; + } + int totalFilterLength = 0; + String filterFields = protocolConfig.getTotalLengthFilterFields(); + try { + if (!StringUtils.isEmpty(filterFields)) { + String[] filterFieldList = filterFields.split(","); + for (String filterFieldId : filterFieldList) { + if (StringUtils.isNotEmpty(filterFieldId)) { + ProtocolFieldConfig fieldConfig = protocolFieldConfigMap.get(Long.valueOf(filterFieldId)); + //这里都是按字节计算,没有对位进行区分,可能会出现错误 + // 如果对位有需求,需要进一步跟进 + totalFilterLength += fieldConfig.getOffsetLength(); + } + } + } + return totalFilterLength; + } catch (Exception ex) { + log.error("报文确认分发阶段,获取报文总长度过滤长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); + } + return totalFilterLength; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java new file mode 100644 index 0000000..d51e887 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java @@ -0,0 +1,169 @@ +package com.casic.missiles.parser.resolver.fields; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.parser.resolver.ByteMergeProvider; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.AbstractFieldConfig; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.pojo.ByteResolverParam; +import io.netty.buffer.ByteBuf; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * 字段解析管理总类 + */ +@Slf4j +public class FieldResolver extends ByteMergeProvider { + + //1、字段截取 => 2、简单的字节解析和复杂的字节解析 + public static Object parseField(ByteBuf byteBuf,AbstractFieldConfig fieldConfig, Integer maxFixedPosition) { + Integer orignPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + //最大固定位置不为空, + if (!ObjectUtil.isEmpty(maxFixedPosition)) { + orignPosition -= maxFixedPosition; + } + Object fieldValue = 0; + //待优化 + if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { + fieldValue = doParseBitField(byteBuf, fieldConfig); + } else { + ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); + fieldValue = doParseByteField(fieldBytes, fieldConfig.getRuleJson()); + } + return fieldValue; + } + + //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, + //目前默认配置的规则设置暂不支持配置化,由实现完成 + private static Object doParseByteField(ByteBuf byteBuf, String ruleJson) { + Object fieldsResolveValue = null; + List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); + if (ObjectUtil.isEmpty(ruleMapList)) { + fieldsResolveValue = defaultResolveBuilder(byteBuf); + } else { + fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); + } + return fieldsResolveValue; + } + + private static Object defaultResolveBuilder(ByteBuf byteBuf) { + Integer defaultResolveValue = 0; + for (int i = 0; i < byteBuf.writerIndex(); i++) { + defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; + } + return defaultResolveValue; + } + + //字段解析构建器(针对字节单位的) + //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 + // 字节归并结束或者规则结束=>继续根据规则进行判断 + private static Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { + Object customizeResolveValue = null; + try { + List bytStrList = new ArrayList<>(); + //存放到数组里面 + for (int i = 0; i < byteBuf.writerIndex(); i++) { + bytStrList.add(byteBuf.readByte()); + } + int i = 0; + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { + if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + customizeResolveValue = resolveByteMerge(bytStrList, ruletypeId, vaildRange); + break; + } else { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + List tempBytStr = new ArrayList<>(); + for (int k = 0; i < bytStrList.size(); i++) { + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(k) + .value(bytStrList.get(k)) + .ruletypeId(ruletypeId).build(); + tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); + } + bytStrList = tempBytStr; + } + i++; + } + //字节归并到一起=>继续根据规则进行判断 + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(null) + .value(customizeResolveValue) + .ruletypeId(ruletypeId).build(); + customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); + i++; + } + System.out.println(JSON.toJSON(customizeResolveValue)); + return customizeResolveValue; + } catch (RuntimeException ex) { + log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); + return null; + } + } + + /** + * 1、单个字节情况表示字段 + * 2、多字节情况表示字段(暂未处理) + */ + private static Object doParseBitField(ByteBuf byteBuf,AbstractFieldConfig fieldConfig) { + Object fieldValue = new Object(); + try { + Integer orignPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + byte fields = 0x00; + if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { + fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); + } else { + fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); + } + + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { + if (!StringUtils.isEmpty(fieldConfig.getOriginPositionBit())) { + fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getOriginPositionBit())).byteValue() + >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); + } else { + fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); + } + } else { + fieldValue = Integer.valueOf(fields & 0xff); + } + if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { + return fieldValue; + } + List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); + int i = 0; + //字节归并到一起=>继续根据规则进行判断 + while (i < ruleMapList.size()) { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(null) + .value(fieldValue) + .ruletypeId(ruletypeId).build(); + fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); + i++; + } + System.out.println(JSON.toJSON(fieldValue)); + return fieldValue; + } catch (RuntimeException ex) { + log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); + return null; + } + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java deleted file mode 100644 index 35ae3d0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java +++ /dev/null @@ -1,183 +0,0 @@ -package com.casic.missiles.parser.resolver.fields; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufAllocator; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; -import org.springframework.util.ObjectUtils; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service("standard") -@AllArgsConstructor -@Slf4j -public class StandardFieldParser implements FieldParser { - - private final FieldConfigDao fieldConfigDao; - private final FieldResolver fieldResolver; - - //数据解析 - @Override - public Map dataParser(RuleConfig ruleConfig, String lightText, String protocolId) { - String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); - ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); - bufferContent.writeBytes(lightText.getBytes(Charset.forName("ISO-8859-1"))); - Map dataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - for (String dataFieldId : dataFieldIds) { - FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(dataFieldId); - if (!ObjectUtils.isEmpty(fieldConfig)) { - dataMap.put(fieldConfig.getFieldName(), String.valueOf(fieldResolver.filedParserManger(bufferContent, fieldConfig, maxFixedPosition))); - } - } - return dataMap; - } - - //数据解析 - @Override - public Map fixDataParser(String protocolId, ByteBuf buffer) { - List dataFieldIdList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Map dataMap = new HashMap<>(); - for (FieldConfig dataField : dataFieldIdList) { - if (!ObjectUtils.isEmpty(dataField.getOrignPosition())) { - Object fieldValue = (Integer) fieldResolver.filedParserManger(buffer, dataField, null); - dataMap.put(dataField.getFieldName(), fieldValue); - } - } - return dataMap; - } - - @Override - public Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf) { - if (ByteBufUtil.hexDump(byteBuf).equals("")) { - return 0; - } - String filterFields = protocolConfig.getTotalLengthFilterField(); - Integer totalLength = 0; - try { - FieldConfig totalFieldConfig = fieldConfigDao.getFieldConfigById(protocolConfig.getTotalLengthId()); - int totalFilterLength = 0; - if (!StringUtils.isEmpty(filterFields)) { - String[] filterFieldList = filterFields.split(","); - for (String filterField : filterFieldList) { - FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(filterField); - //这里都是按字节计算,没有对位进行区分,可能会出现错误 - - // 如果对位有需求,需要进一步跟进 - totalFilterLength += fieldConfig.getOffsetLength(); - } - } - totalLength = (Integer) fieldResolver.filedParserManger(byteBuf, totalFieldConfig, null) + totalFilterLength; - } catch (Exception ex) { - log.error("报文确认分发阶段,获取报文总长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); - } - return totalLength; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer) { - //业务内容 - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - String protocolId = String.valueOf(protocolConfig.getId()); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - //计算固定长度 - Integer fixedLength = calculateLength(fieldConfigList); -// Integer totalLength = this.getTotalLength(protocolConfig, buffer); - //总长度获取 - Integer totalLength = lightText.length(); - //计算固定长度最大长度 - Integer maxFixedPosition = calculatePosition(fieldConfigList); -// buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - //计算数据报文内容 - ByteBuf bizDataFields = buffer.slice(maxFixedPosition-1, (totalLength - fixedLength)); - return bizDataFields; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer) { - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - String protocolId = String.valueOf(protocolConfig.getId()); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer fixedLength = calculateLength(fieldConfigList); -// Integer totalLength = this.getTotalLength(protocolConfig, buffer); - Integer totalLength = lightText.length(); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - ByteBuf fixDataFields = buffer.slice(0, maxFixedPosition); - return fixDataFields; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer) { - String protocolId = String.valueOf(protocolConfig.getId()); - Map fixedPropertyMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer fixedLength = calculateLength(fieldConfigList); - Integer totalLength = this.getTotalLength(protocolConfig, buffer); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - fixedPropertyMap.put("fixedPosition", maxFixedPosition); - fixedPropertyMap.put("totalLength", totalLength); - fixedPropertyMap.put("tailPosition", totalLength - fixedLength + maxFixedPosition); - return fixedPropertyMap; - } - - //分别计算bit和byte长度=> 合并长度 - private Integer calculateLength(List fieldConfigList) { - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (FieldConfig fieldConfig : fieldConfigList) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - Integer fixedLength = bytefixedLength + bitfixedLength / 8; - return fixedLength; - } - - //找到最大值=> 根据最大值计算业务数据下标 - private Integer calculatePosition(List fieldConfigList) { - String rex = "[0-9]+"; - Integer max = -1; - for (FieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOrignPosition()) - && Integer.valueOf(fieldConfig.getOrignPosition()) > max) { - max = Integer.valueOf(fieldConfig.getOrignPosition()); - } - } - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (FieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOrignPosition()) && fieldConfig.getOrignPosition().equals(max)) { - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - } - } - Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; - return maxFixedPosition; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java new file mode 100644 index 0000000..d4ec6c7 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java @@ -0,0 +1,76 @@ +package com.casic.missiles.parser.rule; + +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import org.apache.commons.lang3.StringUtils; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class GenericRuleResolver { + + //根据前置字段的值,找到指定的规则 + //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 + //=>循环判断=>通过规则得到业务字段 + public static RuleConfig machRule(Map fixDataMap, + String ids, + List protocolFieldConfigs, + List ruleConfigs) { + List preRuleConfigList = getPreRuleList(ids, protocolFieldConfigs); + //获取前置规则字段 + final Map metaDataMap = getPreRuleFields(preRuleConfigList, fixDataMap); + //准备固定的字段集合 + Map fixDataFieldMap = getFixDataFieldMap(protocolFieldConfigs); + return RuleResolverCore.doMachRule(ruleConfigs, metaDataMap, fixDataMap, fixDataFieldMap); + } + + private static Map getFixDataFieldMap(List protocolFieldConfigs) { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, ProtocolFieldConfig::getFieldName) + ); + return fixDataFieldMap; + } + + + /** + * 查询前置规则的字段配置 + * + * @param ids + * @return + */ + private static List getPreRuleList(String ids, List protocolFieldConfigs) { + String[] idList = ids.split(","); + Map prepareMaps = new HashMap<>(); + for (String id : idList) { + if (StringUtils.isNotEmpty(id)) { + prepareMaps.put(Long.valueOf(id), ""); + } + } + List preRuleConfigList = protocolFieldConfigs + .stream() + .filter(e -> prepareMaps.containsKey(e.getId())) + .collect(Collectors.toList()); + return preRuleConfigList; + } + + /** + * 获取前置规则解析字段 + */ + private static Map getPreRuleFields(List preRuleFieldConfigList, Map fixDataMap) { + Map ruleFieldMap = new HashMap<>(); + preRuleFieldConfigList.stream() + .forEach( + preRuleFieldConfig -> { + String fieldName = preRuleFieldConfig.getFieldName(); + if (fixDataMap.containsKey(fieldName)) { + ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); + } + } + ); + return ruleFieldMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java new file mode 100644 index 0000000..baae7e8 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -0,0 +1,68 @@ +package com.casic.missiles.parser.rule; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.casic.missiles.pojo.RuleConfig; + +import java.util.*; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleResolverCore { + + + public static RuleConfig doMachRule(List ruleConfigList, Map metaDataMap, + Map fixDataMap, + Map fixDataFieldMap) { + Optional ruleConfigOptional = ruleConfigList.stream() + .filter(ruleConfig -> machRuleConfig( + JSON.parseObject(ruleConfig.getMatchRuleJson(), Map.class), metaDataMap)) + .findFirst(); + if (ObjectUtil.isEmpty(ruleConfigOptional)) { + return null; + } + String[] ruleFields = ruleConfigOptional.get().getDataFieldIds().split(","); + Map ruleMetaDataMap = getRuleFields(ruleFields, fixDataMap, fixDataFieldMap); + //递归选定解析规则,进行规则解析 + if (!ruleConfigOptional.get().getIsFinishMatch().equals("1")) { + //递归选定规则 + doMachRule(ruleConfigList, ruleMetaDataMap, fixDataMap, fixDataFieldMap); + } + return ruleConfigOptional.get(); + } + + + private static Map getRuleFields(String[] preRuleConfigList, Map fixedDataMap, + Map fixedFieldMap) { + Map ruleFieldMap = new HashMap<>(); + for (String preRuleConfigId : preRuleConfigList) { + String fieldName = fixedFieldMap.get(preRuleConfigId); + if (fixedDataMap.containsKey(fieldName)) { + ruleFieldMap.put(fieldName, String.valueOf(fixedDataMap.get(fieldName))); + } + } + return ruleFieldMap; + } + + + //匹配规则配置 + private static Boolean machRuleConfig(Map ruleMap, Map metaDataMap) { + if (ruleMap == null || metaDataMap == null) { + return null; + } + //所有的字段在规则里面必须有有配置 + for (String key : metaDataMap.keySet()) { + if (ruleMap.containsKey(key)) { + if (!ruleMap.get(key).equals(metaDataMap.get(key))) { + return false; + } + } else { + return false; + } + } + return true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java deleted file mode 100644 index 664088d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java +++ /dev/null @@ -1,92 +0,0 @@ -package com.casic.missiles.parser.rule; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.mapper.dao.PreRuleConfigDao; -import com.casic.missiles.mapper.dao.RuleConfigDao; -import lombok.AllArgsConstructor; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.*; -import java.util.stream.Collectors; - -@Service -@AllArgsConstructor -public class RulerProvider { - - private final FieldConfigDao fieldConfigDao; - private final PreRuleConfigDao preRuleConfigDao; - private final RuleConfigDao ruleConfigDao; - - //根据前置字段的值,找到指定的规则 - //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 - //=>循环判断=>通过规则得到业务字段 - public RuleConfig ruleConfig(Map fixDataMap, String protocolId) { - //批量获取规则 - List preRuleConfigList = preRuleConfigDao.getPreRuleList(protocolId); - //获取固定字段 - Map fixFieldMap = getAllFieldMap(protocolId); - //获取前置规则字段 - final String preRuleFields = getPreRuleFields(preRuleConfigList, fixDataMap, fixFieldMap); - List ruleConfigList = ruleConfigDao.getRuleConfigById(protocolId); - Optional ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig ->preRuleFields.equals( ruleConfig.getParseRuleJson())).findFirst(); - //递归选定解析规则,进行规则解析 - while (!ObjectUtil.isEmpty(ruleConfigOptional) && !ruleConfigOptional.get().getIsBizField().equals("1")) { - String ruleFields = getRuleFields(ruleConfigOptional.get().getDataFieldIds().split(","), fixDataMap, fixFieldMap); - ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig -> ruleConfig.getParseRuleJson().equals(ruleFields)).findFirst(); - } - return ruleConfigOptional.get(); - } - - /** - * 获取前置规则解析字段 - */ - private String getPreRuleFields(List preRuleConfigList, Map fixDataMap, Map fixFieldMap) { - Map ruleFieldMap= new HashMap<>(); - preRuleConfigList.stream() - .forEach( - preRuleConfig -> { - String fieldName = fixFieldMap.get(Long.valueOf(preRuleConfig.getRuleFieldId())); - if (fixDataMap.containsKey(fieldName)) { - ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); - } - } - ); - return JSONObject.toJSONString(ruleFieldMap); - } - - private Map getAllFieldMap(String protocolId) { - List fieldList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Map fixFieldMap = fieldList.stream().collect( - Collectors.toMap(FieldConfig::getId, FieldConfig::getFieldName) - ); - return fixFieldMap; - } - - private String getRuleFields(String[] preRuleConfigList, Map fixDataMap, Map fixFieldMap) { - Map ruleFieldMap= new HashMap<>(); - for (String preRuleConfigId : preRuleConfigList) { - String fieldName = fixFieldMap.get(preRuleConfigId); - if (fixDataMap.containsKey(fieldName)) { - ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); - } - } - return JSONObject.toJSONString(ruleFieldMap); - } - - //弃置 - private String ListToString(List ruleFieldList) { - String ruleFields = ""; - for (String ruleField : ruleFieldList) { - ruleFields += ruleField + ","; - } - ruleFields = StringUtils.isEmpty(ruleFields) ? ruleFields : ruleFields.substring(0, ruleFields.length() - 1); - return ruleFields; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java index 6177e10..bfa87a5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java @@ -2,7 +2,7 @@ public interface SafeStrategy { - String decryption(byte[] bytes); + String decryption(String cipher); String encryption(String lightText); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java index 618716c..6236302 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java @@ -9,9 +9,9 @@ //十六进制的字符串转换成字节数组 byte[] bytes = hexStrToBinaryStr(msg); //计算CRC8 - byte crc8 = CRC8(bytes, 0, bytes.length); - String crc8ToStr = "" + Integer.toHexString(0xff & crc8); - return crc8ToStr; +// String crc8ToStr = "" + Integer.toHexString(0xff & crc8); +// return crc8ToStr; + return null; } /** @@ -33,50 +33,5 @@ return bytes; } - /** - * CRC8 校验 多项式 x8+x2+x+1 - * - * @param b - * @param off - * @param len - * @return - */ - public static byte CRC8(final byte[] b, final int off, final int len) { - byte result = 0x00; - for (int i = 0; i < len; i++) { - result = CHECKSUM_TABLE[(result ^ (b[i + off] & 0xFF)) & 0xFF]; - } - return (byte) (result & 0xFFL); - } - - private final static byte[] CHECKSUM_TABLE = {(byte) 0x00, (byte) 0x07, (byte) 0x0e, (byte) 0x09, (byte) 0x1c, (byte) 0x1b, - (byte) 0x12, (byte) 0x15, (byte) 0x38, (byte) 0x3f, (byte) 0x36, (byte) 0x31, (byte) 0x24, (byte) 0x23, (byte) 0x2a, - (byte) 0x2d, (byte) 0x70, (byte) 0x77, (byte) 0x7e, (byte) 0x79, (byte) 0x6c, (byte) 0x6b, (byte) 0x62, (byte) 0x65, - (byte) 0x48, (byte) 0x4f, (byte) 0x46, (byte) 0x41, (byte) 0x54, (byte) 0x53, (byte) 0x5a, (byte) 0x5d, (byte) 0xe0, - (byte) 0xe7, (byte) 0xee, (byte) 0xe9, (byte) 0xfc, (byte) 0xfb, (byte) 0xf2, (byte) 0xf5, (byte) 0xd8, (byte) 0xdf, - (byte) 0xd6, (byte) 0xd1, (byte) 0xc4, (byte) 0xc3, (byte) 0xca, (byte) 0xcd, (byte) 0x90, (byte) 0x97, (byte) 0x9e, - (byte) 0x99, (byte) 0x8c, (byte) 0x8b, (byte) 0x82, (byte) 0x85, (byte) 0xa8, (byte) 0xaf, (byte) 0xa6, (byte) 0xa1, - (byte) 0xb4, (byte) 0xb3, (byte) 0xba, (byte) 0xbd, (byte) 0xc7, (byte) 0xc0, (byte) 0xc9, (byte) 0xce, (byte) 0xdb, - (byte) 0xdc, (byte) 0xd5, (byte) 0xd2, (byte) 0xff, (byte) 0xf8, (byte) 0xf1, (byte) 0xf6, (byte) 0xe3, (byte) 0xe4, - (byte) 0xed, (byte) 0xea, (byte) 0xb7, (byte) 0xb0, (byte) 0xb9, (byte) 0xbe, (byte) 0xab, (byte) 0xac, (byte) 0xa5, - (byte) 0xa2, (byte) 0x8f, (byte) 0x88, (byte) 0x81, (byte) 0x86, (byte) 0x93, (byte) 0x94, (byte) 0x9d, (byte) 0x9a, - (byte) 0x27, (byte) 0x20, (byte) 0x29, (byte) 0x2e, (byte) 0x3b, (byte) 0x3c, (byte) 0x35, (byte) 0x32, (byte) 0x1f, - (byte) 0x18, (byte) 0x11, (byte) 0x16, (byte) 0x03, (byte) 0x04, (byte) 0x0d, (byte) 0x0a, (byte) 0x57, (byte) 0x50, - (byte) 0x59, (byte) 0x5e, (byte) 0x4b, (byte) 0x4c, (byte) 0x45, (byte) 0x42, (byte) 0x6f, (byte) 0x68, (byte) 0x61, - (byte) 0x66, (byte) 0x73, (byte) 0x74, (byte) 0x7d, (byte) 0x7a, (byte) 0x89, (byte) 0x8e, (byte) 0x87, (byte) 0x80, - (byte) 0x95, (byte) 0x92, (byte) 0x9b, (byte) 0x9c, (byte) 0xb1, (byte) 0xb6, (byte) 0xbf, (byte) 0xb8, (byte) 0xad, - (byte) 0xaa, (byte) 0xa3, (byte) 0xa4, (byte) 0xf9, (byte) 0xfe, (byte) 0xf7, (byte) 0xf0, (byte) 0xe5, (byte) 0xe2, - (byte) 0xeb, (byte) 0xec, (byte) 0xc1, (byte) 0xc6, (byte) 0xcf, (byte) 0xc8, (byte) 0xdd, (byte) 0xda, (byte) 0xd3, - (byte) 0xd4, (byte) 0x69, (byte) 0x6e, (byte) 0x67, (byte) 0x60, (byte) 0x75, (byte) 0x72, (byte) 0x7b, (byte) 0x7c, - (byte) 0x51, (byte) 0x56, (byte) 0x5f, (byte) 0x58, (byte) 0x4d, (byte) 0x4a, (byte) 0x43, (byte) 0x44, (byte) 0x19, - (byte) 0x1e, (byte) 0x17, (byte) 0x10, (byte) 0x05, (byte) 0x02, (byte) 0x0b, (byte) 0x0c, (byte) 0x21, (byte) 0x26, - (byte) 0x2f, (byte) 0x28, (byte) 0x3d, (byte) 0x3a, (byte) 0x33, (byte) 0x34, (byte) 0x4e, (byte) 0x49, (byte) 0x40, - (byte) 0x47, (byte) 0x52, (byte) 0x55, (byte) 0x5c, (byte) 0x5b, (byte) 0x76, (byte) 0x71, (byte) 0x78, (byte) 0x7f, - (byte) 0x6a, (byte) 0x6d, (byte) 0x64, (byte) 0x63, (byte) 0x3e, (byte) 0x39, (byte) 0x30, (byte) 0x37, (byte) 0x22, - (byte) 0x25, (byte) 0x2c, (byte) 0x2b, (byte) 0x06, (byte) 0x01, (byte) 0x08, (byte) 0x0f, (byte) 0x1a, (byte) 0x1d, - (byte) 0x14, (byte) 0x13, (byte) 0xae, (byte) 0xa9, (byte) 0xa0, (byte) 0xa7, (byte) 0xb2, (byte) 0xb5, (byte) 0xbc, - (byte) 0xbb, (byte) 0x96, (byte) 0x91, (byte) 0x98, (byte) 0x9f, (byte) 0x8a, (byte) 0x8d, (byte) 0x84, (byte) 0x83, - (byte) 0xde, (byte) 0xd9, (byte) 0xd0, (byte) 0xd7, (byte) 0xc2, (byte) 0xc5, (byte) 0xcc, (byte) 0xcb, (byte) 0xe6, - (byte) 0xe1, (byte) 0xe8, (byte) 0xef, (byte) 0xfa, (byte) 0xfd, (byte) 0xf4, (byte) 0xf3}; } \ No newline at end of file diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java index 27c2838..6e078a3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java @@ -1,9 +1,6 @@ package com.casic.missiles.parser.safe.impl; -import cn.hutool.core.util.CharsetUtil; -import cn.hutool.crypto.symmetric.SM4; -import cn.hutool.crypto.symmetric.SymmetricCrypto; - +import com.casic.missiles.parser.safe.SafeStrategy; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; @@ -11,19 +8,44 @@ import org.bouncycastle.crypto.engines.SM4Engine; import org.bouncycastle.crypto.params.KeyParameter; import org.bouncycastle.util.encoders.Hex; - -import static cn.hutool.crypto.Mode.ECB; -import static cn.hutool.crypto.Padding.NoPadding; +import org.springframework.stereotype.Component; /** * SM4算法工具类 */ @Slf4j -public class Sm4 { +@Component("sm4") +public class Sm4 implements SafeStrategy { //加解密的字节快大小 public static final int BlockSize = 16; + @Override + public String decryption(String cipher) { + byte[] keyByte = { + 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 + }; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(keyByte); + byte[] in = Hex.decode(cipher); + byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); + String plain = EcbDecrypt(in, keyBytes); + return plain; + } + + @Override + public String encryption(String cipher) { + byte[] keyByte = { + 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 + }; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(keyByte); + byte[] in = Hex.decode(cipher); + byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); + String plain = EcbDecrypt(in, keyBytes); + return plain; + } + /** * SM4ECB加密算法,对内 * @@ -32,8 +54,6 @@ * @return */ private static byte[] ecb_encrypt(byte[] in, byte[] keyBytes) { - - SM4Engine sm4Engine = new SM4Engine(); sm4Engine.init(true, new KeyParameter(keyBytes)); byte[] out = new byte[in.length]; @@ -58,27 +78,6 @@ return cipher; } - - /** - * hutool 解密SM4 - * - * @param encodeContent - * @return - */ - public static String decode(String encodeContent) { - String key = "24ad182507479a5da3ad94d9d78ea203"; - try { - SymmetricCrypto sm4 = new SM4(ECB, NoPadding, key.getBytes()); - String decryptStr = sm4.decryptStr(encodeContent, CharsetUtil.CHARSET_UTF_8); - return decryptStr; - } catch (Exception e) { - e.printStackTrace(); - log.error("SM4解密失败"); - } - return null; - } - - /** * SM4的ECB加密算法 * @@ -129,20 +128,6 @@ return plain; } - /** - * SM4的ECB解密算法 - * - * @param cipher 输入的密文字符串 - * @param key 密钥 - * @return - */ - public static String EcbDecrypt(String cipher, String key) { - byte[] in = Hex.decode(cipher); - byte[] keyBytes = Hex.decode(key); - - String plain = EcbDecrypt(in, keyBytes); - return plain; - } /** * 主函数 @@ -151,28 +136,24 @@ */ public static void main(String[] args) { byte[] ciphertext = { + 0x4B, (byte) 0x8C, (byte) 0x9D, 0x08, (byte) 0xE4, (byte) 0xD3, 0x64, 0x42, (byte) 0xB9, (byte) 0xA5, (byte) 0xFE, (byte) 0xCD, (byte) 0x91, 0x1B, 0x38, (byte) 0xAC, (byte) 0xE9, 0x1C, (byte) 0xCD, 0x53, 0x02, (byte) 0xD7, 0x0C, (byte) 0x9B, (byte) 0x96, 0x30, 0x62, (byte) 0xE8, (byte) 0xFB, (byte) 0xEF, (byte) 0xB9, (byte) 0xFF, (byte) 0xDE, 0x19, (byte) 0x80, 0x35, 0x3E, (byte) 0x90, 0x4F, 0x2F, 0x12, 0x2B, 0x19, (byte) 0x8B, 0x6C, 0x7A, (byte) 0x85, (byte) 0xA1, (byte) 0xB1, (byte) 0x86, (byte) 0xA3, 0x7A, 0x46, 0x0C, 0x2F, (byte) 0x94, 0x4F, 0x7F, 0x2C, 0x56, 0x14, (byte) 0xF3, (byte) 0x89, (byte) 0xC3, - 0x3F, 0x20, (byte) 0xF9, (byte) 0x87, (byte) 0xA1, 0x60, (byte) 0xD9, (byte) 0xA8, (byte) 0xFD, (byte) 0xD7, (byte) 0x9B, 0x4B, 0x26, 0x06, 0x30, 0x44}; + 0x3F, 0x20, (byte) 0xF9, (byte) 0x87, (byte) 0xA1, 0x60, (byte) 0xD9, (byte) 0xA8, (byte) 0xFD, (byte) 0xD7, (byte) 0x9B, 0x4B, 0x26, 0x06, 0x30, 0x44 + }; ByteBuf in = ByteBufAllocator.DEFAULT.heapBuffer(); in.writeBytes(ciphertext); - byte[] keyByte = { 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 }; ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); - key.writeBytes(ciphertext); - String resCipherData = decode(ByteBufUtil.hexDump(in)); - ByteBuf out = ByteBufAllocator.DEFAULT.heapBuffer(); -// out.writeBytes(resCipherData); -// System.out.println(hexBytes); - System.out.println(resCipherData.toString()); -// String resPlainData = EcbDecrypt(resCipherData, key); -// System.out.println("原始明文:" + data); -// System.out.println("解密后明文:" + resPlainData); + key.writeBytes(keyByte); +// String resCipherData = EcbDecrypt(ByteBufUtil.hexDump(in), ByteBufUtil.hexDump(key)); +// System.out.println(resCipherData); } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java index 1395a51..ac5f957 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java @@ -1,7 +1,7 @@ package com.casic.missiles.parser.safe.impl; import io.netty.buffer.ByteBufUtil; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** *

@@ -14,9 +14,8 @@ * @author hyl * @version v1.0: Tea.java, v 0.1 2021/3/12 13:48 $ */ -@Service("tea") -///tea算法类 - +//tea算法类 +@Component("tea") public class Tea { public static byte[] MyTea_Encrypt(byte[] MyTeaContent, int ByteLen, byte[] MyTeakey) { @@ -99,7 +98,6 @@ // for(int i32Index = 0; i32Index < 8; i32Index++) { // System.out.print("0x" + Integer.toHexString(MyContent[i32Index]) + " "); // } - // System.out.println("密钥为:"); // for(int i32Index = 0; i32Index < 16; i32Index++) { // System.out.print("0x" + Integer.toHexString(MyKeys[i32Index]) + " "); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java index bdd0721..bd1516a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java @@ -3,7 +3,7 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.parser.sender.DataSubscribeProvider; import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponents; import org.springframework.web.util.UriComponentsBuilder; @@ -12,7 +12,7 @@ import java.util.Collections; import java.util.Map; -@Service("functionCallback") +@Component("functionCallback") public class FunctionCallback implements DataSubscribeProvider { @Resource diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java index 0b44fb9..7526de2 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.Map; -@Service("middleware") +@Component("middleware") public class MiddlewareSubscribe implements DataSubscribeProvider { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java index 5dcee3f..e2f1192 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.Map; -@Service("nosql") +@Component("nosql") public class NoSqlSubscribe implements DataSubscribeProvider { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java b/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java new file mode 100644 index 0000000..81a5324 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java @@ -0,0 +1,86 @@ +package com.casic.missiles.pojo; + +import lombok.Data; + +/** + * 协议 + */ +@Data +public class Msg { + + /** + * 前导码 + */ + private String preamble; + + /** + * 版本号 + */ + private String version; + + /** + * 内容长度 + */ + private int leng; + + /** + * 设备ID + */ + private String deviceId; + + /** + * 通讯方式 + */ + private Integer connType; + + /** + * 加密方式 + */ + private Integer encryType; + + /** + * 目标地址 + */ + private String destAddr; + + /** + * PDUType + */ + private String PDUType; + + /** + * 操作类型 + */ + private Integer operateType; + + /** + * 传输控制位 PDUType.bit7=0时,表示存在后续的访问;当PDUType.bit7=1时,表示无后续的访问。 + */ + private Integer transControlFlag; + + /** + * 设备类型 + */ + private Integer deviceType; + + /** + * 序号 + */ + private Integer seq; + + /** + * tagList + */ + private String tagList; + + /** + * OidList + */ + private String OidList; + + /** + * CRC + */ + private String CRC; + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java index 40a5265..97cc984 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java @@ -40,7 +40,7 @@ String httpContent = msg.toString(Charset.defaultCharset()); log.info(" String : " + msg.toString(Charset.defaultCharset())); String majorContent = httpContent.substring(httpContent.indexOf("{"), httpContent.lastIndexOf("}") + 1); - String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("serviceData")).get("Value")); + String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("RegistryData")).get("Value")); log.info("----------------------------------" + values); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); bufferContent.writeBytes(values.getBytes(Charset.forName("ISO-8859-1"))); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java index 1b132a7..e3ced4b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java @@ -35,7 +35,7 @@ String httpContent = msg.toString(Charset.defaultCharset()); log.info(" String : " + msg.toString(Charset.defaultCharset())); String majorContent = httpContent.substring(httpContent.indexOf("{"), httpContent.lastIndexOf("}") + 1); - String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("serviceData")).get("Value")); + String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("RegistryData")).get("Value")); log.info("----------------------------------" + values); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); bufferContent.writeBytes(values.getBytes(Charset.forName("ISO-8859-1"))); diff --git a/sensorhub-core/src/main/resources/application.properties b/sensorhub-core/src/main/resources/application.properties deleted file mode 100644 index 8b13789..0000000 --- a/sensorhub-core/src/main/resources/application.properties +++ /dev/null @@ -1 +0,0 @@ - diff --git a/sensorhub-core/src/main/resources/config/application-dev.yml b/sensorhub-core/src/main/resources/config/application-dev.yml index 4f897a8..dcc4c2d 100644 --- a/sensorhub-core/src/main/resources/config/application-dev.yml +++ b/sensorhub-core/src/main/resources/config/application-dev.yml @@ -4,9 +4,9 @@ spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true + url: jdbc:mysql://127.0.0.1:3306/sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true username: root - password: Casic203 + password: root session: store-type: redis redis: diff --git a/sensorhub-core/src/main/resources/config/application.yml b/sensorhub-core/src/main/resources/config/application.yml index ae89f9d..7965da1 100644 --- a/sensorhub-core/src/main/resources/config/application.yml +++ b/sensorhub-core/src/main/resources/config/application.yml @@ -30,6 +30,13 @@ port: 6379 password: ew5T4K3#203lwh config-prefix: 'Casic:' +#代码生成器配置 +code: + generate: + #作者 + author: cz + #待生成对象表名 + table-name: bussiness_field_config,combined_field_config sensorhub: config: port: 7091 diff --git a/sensorhub-support/pom.xml b/sensorhub-support/pom.xml index 9a71296..761601c 100644 --- a/sensorhub-support/pom.xml +++ b/sensorhub-support/pom.xml @@ -42,6 +42,12 @@ ${redis.version} + + com.baomidou + mybatis-plus-generator + ${mybatis-plus-generator.version} + + org.reflections diff --git a/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java b/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java new file mode 100644 index 0000000..515ca53 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java @@ -0,0 +1,14 @@ +package com.casic.missiles.enums; + +/** + * @author + * @date + */ +public interface FixedPropertyEnum { + + String FIXED_POSITION = "fixedPosition"; + + String TOTAL_LENGTH = "totalLength"; + + String TAIL_POSITION = "tailPosition"; +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/CombinedFieldMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CombinedFieldMapper.java new file mode 100644 index 0000000..38e8f42 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CombinedFieldMapper.java @@ -0,0 +1,15 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.CombinedFieldConfig; +import org.apache.ibatis.annotations.Mapper; + +/** + * @author cz + * + */ +@Mapper +public interface CombinedFieldMapper extends BaseMapper { + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java index 608af3a..32cc8a4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java @@ -2,48 +2,47 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.delivery.decorator.ByteDecorator; +import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @AllArgsConstructor public class FieldDecoratorManger { - private final RuleDictDao ruleDictDao; + private final RuleConfigRegistry ruleDictDao; // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 // (1)静态的业务字段是字典里面可以配置的 // (2)动态的业务字段是通过规则生成的 public String contentMerge(String ruleJson, String sceneConent, String dynamicContent) { - List ruleDictList = ruleDictDao.getRuleDictConfig(); - Map ruleDictMap = ruleDictList.stream().collect( - Collectors.toMap(RuleDict::getId, e -> e)); - List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); - for (Map ruleMap : ruleMapList) { - String ruleType = String.valueOf(ruleMap.get("ruleType")); - ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); - NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); - byteDecorator.nodeDecoratorRule(nodeDecoratorParm); - } +// List ruleDictList = ruleDictDao.getRuleDictConfig(); +// Map ruleDictMap = ruleDictList.stream().collect( +// Collectors.toMap(RuleDict::getId, e -> e)); +// List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); +// for (Map ruleMap : ruleMapList) { +// String ruleType = String.valueOf(ruleMap.get("ruleType")); +// ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); +// NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); +// byteDecorator.nodeDecoratorRule(nodeDecoratorParm); +// } return null; } - - private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { - NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() - .contents(sceneConent) - .dynamicContent(dynamicContent) - .ruletypeId(ruletypeId) - .ruleDictMap(ruleDictMap) - .build(); - return nodeDecoratorParm; - } +// +// private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { +// NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() +// .contents(sceneConent) +// .dynamicContent(dynamicContent) +// .ruletypeId(ruletypeId) +// .ruleDictMap(ruleDictMap) +// .build(); +// return nodeDecoratorParm; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java index 652970c..b204ac3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java @@ -1,56 +1,56 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@AllArgsConstructor -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", - JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Component; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Component("logicalDecorator") +//@AllArgsConstructor +//@Slf4j +//public class LogicalShiftDecorator implements ByteDecorator { +// +//// private final FieldRuleEngineMapper fieldRuleEngineMapper; +//// +//// //字节位移 +//// @Override +//// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +//// String logicalValue = ""; +//// RuleEvaluator fieldRuleEngine = new RuleEvaluator(); +//// try { +//// Map env2 = new HashMap(); +//// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +//// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +//// for (String contentId : contentIdList) { +//// RuleDict ruleDict = ruleDictMap.get(contentId); +//// if (ruleDict.getCode().contains("#")) { +//// //使用动态的值 +//// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +//// } +//// env2.put(ruleDict.getName(), ruleDict.getCode()); +//// } +//// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +//// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +//// return null; +//// } +//// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +//// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +//// return values; +//// } catch (Exception ex) { +//// log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", +//// JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +//// return null; +//// } +//// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java index 346468f..822fead 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@AllArgsConstructor -@Slf4j -public class OperationDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("optionDecorator") +//@AllArgsConstructor +//@Slf4j +//public class OperationDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //混合运算,有常量或者乘除的缩放 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java index 50fb0a7..7a8bccb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@AllArgsConstructor -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +////精度计算 +//@AllArgsConstructor +//@Registry("precisionDecorator") +//@Slf4j +//public class PrecisionDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java index da39235..27f9cc7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java @@ -1,54 +1,53 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@AllArgsConstructor -@Slf4j -public class RuleDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("ruleDecorator") +//@AllArgsConstructor +//@Slf4j +//public class RuleDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //吃我一套正则表达式 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (Exception ex) { +// log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java index 7f5cbf3..c043f97 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java @@ -2,6 +2,6 @@ import java.util.Map; -public interface ComandeEventService { +public interface ComandeEventService{ Map loadComandeEventConfig(String protocolId,String scene); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java index 476ad84..aaf1837 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java @@ -2,46 +2,46 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.dao.CommandEventDao; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @Slf4j @AllArgsConstructor -public class ComandeEventServiceImpl implements ComandeEventService { +public class ComandeEventServiceImpl implements ComandeEventRegistry { - private final CommandEventDao commandEventDao; + // private final CommandEventDao commandEventDao; // 加密bean 固定字段出现变化的字段解析,业务字段的有序内容 @Override - public Map loadComandeEventConfig(String protocolId,String sceneName) { - CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); - if (ObjectUtil.isEmpty(commandEventConfig)) { - log.error("协议{},没有配置成功接收回复配置,清排查原因"); - return null; - } - String replyJson = commandEventConfig.getReplyContentJson(); - List> replyMapList = JSONArray.parseObject(replyJson, List.class); - List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); - Map fixMap = fixList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); - List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) - .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) - .collect(Collectors.toList()); - Map commandConfigMap = new HashMap<>(); - commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); - commandConfigMap.put("fixContent", fixMap); - commandConfigMap.put("bizContent", contentList); - return commandConfigMap; + public Map loadComandeEventConfig(String protocolId, String sceneName) { +// CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); +// if (ObjectUtil.isEmpty(commandEventConfig)) { +// log.error("协议{},没有配置成功接收回复配置,清排查原因"); +// return null; +// } +// String replyJson = commandEventConfig.getReplyContentJson(); +// List> replyMapList = JSONArray.parseObject(replyJson, List.class); +// List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); +// Map fixMap = fixList.stream() +// .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); +// List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) +// .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) +// .collect(Collectors.toList()); +// Map commandConfigMap = new HashMap<>(); +// commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); +// commandConfigMap.put("fixContent", fixMap); +// commandConfigMap.put("bizContent", contentList); +// return commandConfigMap; + return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 128b09d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java deleted file mode 100644 index 4016b0b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface DatagramEventMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java deleted file mode 100644 index 597c306..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.apache.ibatis.annotations.Mapper; - -public interface FieldConfigMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java deleted file mode 100644 index a31680a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.PreRuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface PreRuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java deleted file mode 100644 index 9060a69..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface ProtocolConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java deleted file mode 100644 index 6fa6936..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java deleted file mode 100644 index 582a705..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleDict; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleDictMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java deleted file mode 100644 index 6e302c8..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.CommandEventMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Optional; - -@Component -public class CommandEventDao { - - @Resource - private CommandEventMapper commandEventMapper; - - public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId) - .eq("scene", sceneName) - .eq("enabled", 1); - List commandEventConfig = commandEventMapper.selectList(queryWrapper); - Optional optionalEventConfig = commandEventConfig.stream().findFirst(); - return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java deleted file mode 100644 index 9137e4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.FieldConfigMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class FieldConfigDao { - - @Resource - private FieldConfigMapper fieldConfigMapper; - - public FieldConfig getFieldConfigById(String fieldId) { - FieldConfig fieldConfig = fieldConfigMapper.selectById(fieldId); - return fieldConfig; - } - - public List getFieldConfigs(String protocolId,Integer isFixed) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",isFixed); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - - public List getStorageFieldConfig(String protocolId) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",1) - .eq("is_storage",1); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java deleted file mode 100644 index 67bff6b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.mapper.PreRuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class PreRuleConfigDao { - - @Resource - private PreRuleConfigMapper preRuleConfigMapper; - - public List getPreRuleList(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return preRuleConfigMapper.selectList(queryWrapper); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java deleted file mode 100644 index d69ea85..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.RuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleConfigDao { - - @Resource - private RuleConfigMapper ruleConfigMapper; - - public RuleConfig getNextRuleConfig(String ruleFields) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("parse_rule_json", ruleFields); - return ruleConfigMapper.selectOne(queryWrapper); - } - - - public List getRuleConfigById(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return ruleConfigMapper.selectList(queryWrapper); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java deleted file mode 100644 index 932c185..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.RuleDictMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleDictDao { - - @Resource - private RuleDictMapper ruleDictMapper; - - public List getRuleDictConfig() { - List ruleDictList = ruleDictMapper.selectList(null); - return ruleDictList; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java index 9f9e279..43bc4d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java @@ -10,20 +10,15 @@ import io.netty.channel.socket.nio.NioServerSocketChannel; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import javax.annotation.PreDestroy; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static cn.hutool.core.util.ClassUtil.getClasses; /** * SensorhubServer netty服务端 */ @Slf4j -@Service +@Component public class SensorhubServer { /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java index 2c79ff5..9a28c36 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java @@ -11,13 +11,13 @@ import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioSocketChannel; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClient 客户端 */ @Slf4j -@Service +@Registry public final class SensorhubClient { public static void main(String[] args) throws Exception { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java index 9774be0..477c3f7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java @@ -6,12 +6,12 @@ import io.netty.channel.socket.SocketChannel; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientChannelInitialHandler */ -@Service +@Registry public class SensorhubClientChannelInitialHandler extends ChannelInitializer { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java index 346f4b3..73560e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java @@ -5,13 +5,13 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientHandler */ @Slf4j -@Service +@Registry public class SensorhubClientHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java index 5c1c6f2..d990af5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java @@ -4,12 +4,12 @@ import com.casic.missiles.pojo.Msg; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** * SensorhubServerHandler */ -@Service +@Component public class SensorhubServerHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 67283ae..af3172c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,41 +1,37 @@ package com.casic.missiles.parser; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultProtocolConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.*; +import com.casic.missiles.registry.FieldConfigRegistry; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; -import java.nio.charset.Charset; import java.util.HashMap; import java.util.List; import java.util.Map; -@Service("genericProtocolParser") +/** + * @author + */ +@Component("genericProtocolParser") @Slf4j -@AllArgsConstructor +@RequiredArgsConstructor public class GenericProtocolParser implements ProtocolParser { - private final LeadingCodeMatcher leadingCodeMatcher; private final List frameStructDispenserList; - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorInstanceSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; // 匹配首字母前导码=> 帧结构匹配前导码=> // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 @@ -44,18 +40,19 @@ public Boolean doParseProtocol(ByteBuf byteBuf) { String protocolContent = ByteBufUtil.hexDump(byteBuf); //匹配前导码 - List preCodeConfigs = leadingCodeMatcher.matchLeadingCode(protocolContent); + List preCodeConfigs = LeadingCodeMatcher.matchFrameLeadingCode(protocolContent); //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 if (preCodeConfigs.size() == 0) { - return rematch(byteBuf,protocolContent); + return rematch(byteBuf, protocolContent); } - //暂时先取第一个 + //暂时先取第一个,提升速度,使用享元模式, 减少类的创建销毁与构建 ProtocolConfig protocolConfig = preCodeConfigs.get(0); + AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); ByteBuf wholeDatagramByte = null; //通过匹配帧结构获取完整的数据包 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, preCodeConfigs.get(0))) != null) { + if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, protocolFactory)) != null) { break; } } @@ -68,76 +65,78 @@ * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 */ - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId, wholeDatagramByte); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap, protocolId); - //选取规则对应的流程实例 - DatagramEventConfig datagramEventConfig = processorInstanceSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); + //进行规则字段解析,进行匹配规则 + RuleConfig ruleConfig = getRuleConfig(protocolFactory, wholeDatagramByte); + if (ruleConfig == null) { + return false; + } //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, wholeDatagramByte); + ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte); + //以下进行业务的规则解析,同时选定流程实例 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); + DatagramEventProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain, + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText, protocolId); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain); //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); + datagramEventProvider.storeData(bizDataMap); return true; } - private Boolean rematch(ByteBuf byteBuf,String protocolContent) { + /** + * 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 + */ + private Boolean rematch(ByteBuf byteBuf, String protocolContent) { //重置位判断 byteBuf.resetReaderIndex(); //判断重置是否前移,如果没有前移,则直接判为匹配失败 if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { return false; } else { + //递归执行 return doParseProtocol(byteBuf); } } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; + //获取匹配规则->匹配规则 + private RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + //取出其中参与逻辑provider并判空 + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); + String rulePrepareFields = protocolConfig.getRulePrepareFields(); + //固定字段 + if (StringUtils.isNotEmpty(rulePrepareFields)) { + //获取统一固定字段解析 + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + //获取该协议的字段配置,用于协议规则匹配 + List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); + //获取规则 + RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, + rulePrepareFields, protocolFieldConfigs); + return ruleConfig; + } + return null; } - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + //数据构建,获取固定字段的store和业务字段store + private Map buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + Map bizDataMap = new HashMap<>(); + Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); + Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); + bizDataMap.putAll(ruleStoreObjectMap); + bizDataMap.putAll(protocolStoreObjectMap); return bizDataMap; } - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java index 8a46e32..16ce2e5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java @@ -3,6 +3,7 @@ import io.netty.buffer.ByteBuf; public interface ProtocolParser { + Boolean doParseProtocol(ByteBuf byteBuf); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java new file mode 100644 index 0000000..f7814af --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java @@ -0,0 +1,35 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.ProtocolConfigProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.ProtocolConfig; + +/** + * 存放基本协议的的加载信息 + */ +public class AbstractProtocolConfigFactory { + private final ProtocolConfigProvider protocolConfigProvider; + private final ProtocolFieldConfigProvider protocolFieldConfigProvider; + private final RuleConfigProvider ruleConfigProvider; + + public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { + this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); + this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); + this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); + } + + public ProtocolConfigProvider getProtocolConfigProvider() { + return protocolConfigProvider; + } + + public ProtocolFieldConfigProvider getProtocolFieldConfigProvider() { + return protocolFieldConfigProvider; + } + + public RuleConfigProvider getRuleConfigProvider() { + return ruleConfigProvider; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java new file mode 100644 index 0000000..6e36147 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java @@ -0,0 +1,57 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.CombinedFieldConfigProvider; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.FieldConfigProvider; +import com.casic.missiles.parser.provider.FieldRuleConfigProvider; + +/** + * 存放规则相关的的的加载信息 + */ +public class AbstractRuleConfigFactory { + + /** + * 处理字节 + */ + private final FieldConfigProvider fieldConfigProvider; + /** + * 处理组合字节解析的解码器 + */ + private final CombinedFieldConfigProvider combinedFieldConfigProvider; + /** + * 处理负责字节解析的规则配置 + */ + private final FieldRuleConfigProvider fieldRuleConfigProvider; + /** + * 处理实例流程 + */ + private final DatagramEventProvider datagramEventProvider; + + + public AbstractRuleConfigFactory(Long ruleId) { + this.fieldConfigProvider = new FieldConfigProvider(ruleId); + this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); + this.fieldRuleConfigProvider = new FieldRuleConfigProvider(ruleId); + this.datagramEventProvider = new DatagramEventProvider(ruleId); + } + + public FieldConfigProvider getFieldConfigProvider() { + return fieldConfigProvider; + } + + public CombinedFieldConfigProvider getCombinedFieldConfigProvider() { + return combinedFieldConfigProvider; + } + + public FieldRuleConfigProvider getFieldRuleConfigProvider() { + return fieldRuleConfigProvider; + } + + public DatagramEventProvider getDatagramEventProvider() { + return datagramEventProvider; + } + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java deleted file mode 100644 index 6e1719a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.factory; - - -import com.casic.missiles.pojo.ProtocolConfig; - -import java.util.List; - -/** - * 数据库访问优化(暂时未做) - *

- * 1、初始化协议解析配置,并存放到处存放缓存,对协议基本配置进行管理 - * 2、其中流程中所有的配置都经过此类进行管理,进行调用获取,增强解析速度 - */ -public interface DatagramFactory { - - /** - * 初始化 - */ - List datagramInit(); - - /** - * 根据前导码配置匹配,模糊匹配获取所有的报文项 - */ - List match(); - - /** - * 根据前导码匹配,返回报文项 - */ - List filer(); - - /** - * 保证数据的唯一性选择器 - */ - List selectOne(); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java new file mode 100644 index 0000000..87444a0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java @@ -0,0 +1,18 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +import java.util.List; + +/** + * 直接用,还是边用边创建 + */ +public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { + + + public DefaultProtocolConfigFactory(ProtocolConfig protocolConfig) { + super(protocolConfig); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java new file mode 100644 index 0000000..cce0c7c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java @@ -0,0 +1,12 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; + +public class DefaultRuleFactory extends AbstractRuleConfigFactory { + + public DefaultRuleFactory(Long ruleId) { + super(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java deleted file mode 100644 index 9ee97e0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.casic.missiles.parser.instance; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service -@Slf4j -@AllArgsConstructor -public class GeneralProcessor { - - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; - - /** - * 统一固定字段解析=>进行规则的查询的判断 - * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 - * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 - */ - @Deprecated - public boolean parseWholeDatagram(ByteBuf buffer, ProtocolConfig protocolConfig) { - try { - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap,protocolId); - //选取规则对应的流程= - DatagramEventConfig datagramEventConfig = processorSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); - //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); - //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); - //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); - //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); - //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); - return true; - } catch (Exception ex) { - log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", - ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); - return false; - } - } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; - } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); - } - - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); - return bizDataMap; - } - - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java index 25e7ad8..6a5777e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java @@ -1,23 +1,31 @@ package com.casic.missiles.parser.instance.impl; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.mapper.DatagramEventMapper; import com.casic.missiles.pojo.DatagramEventConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.SpringContextUtil; -@Service -@AllArgsConstructor +import java.util.List; +import java.util.Optional; + +/** + * @author cz + * + */ public class DefaultProcessorInstanceSelector implements ProcessorInstanceSelector { - private final DatagramEventMapper datagramEventMapper; + private static List datagramEventConfigs; + + static { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + datagramEventConfigs = datagramEventRegistry.getDatagramEventList(); + } @Override public DatagramEventConfig getProcessorInstance(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("rule_id", protocolId); - return datagramEventMapper.selectOne(queryWrapper); + Optional optionalSelectInstance = datagramEventConfigs.stream() + .filter(e -> e.getId().equals(protocolId)).limit(1).findFirst(); + return optionalSelectInstance.isPresent() ? optionalSelectInstance.get() : null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a778671..7b56a43 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,16 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import io.netty.buffer.ByteBuf; /** - * 分析匹配情况 - * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 - * 2、匹配不成功,有后续帧,可以进行下次匹配。 - * 3、匹配不成功,无后续帧,可以进行丢弃。 + * 分析匹配情况 + * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 + * 2、匹配不成功,有后续帧,可以进行下次匹配。 + * 3、匹配不成功,无后续帧,可以进行丢弃。 */ -public interface FrameStructMatcher{ +public interface FrameStructMatcher { - ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig); + ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 05320ab..8ebea78 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,23 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.ProtocolConfigMapper; +import com.casic.missiles.parser.provider.ProtocolConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Component; import java.util.List; import java.util.stream.Collectors; -@Component -@AllArgsConstructor public class LeadingCodeMatcher { - private final ProtocolConfigMapper protocolMapper; - //** 1、首字母匹配前导码, // 2、以匹配出的前导码是否在报文中条件进行前导码的匹配二次筛选 - public List matchLeadingCode(String protocolContent){ + public static List matchFrameLeadingCode(String protocolContent){ List initialConfigs = initialMatch(protocolContent); List preCodeConfigs = initialConfigs.stream() .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) @@ -26,13 +19,16 @@ } //初始化匹配前导码内容 - private List initialMatch(String protocolContent) { - String protocolStr = protocolContent.charAt(0) + ""; - QueryWrapper queryWrapper = new QueryWrapper() - .likeRight("pre_fix", protocolStr); - List protocolConfigList = protocolMapper.selectList(queryWrapper); - return protocolConfigList; + private static List initialMatch(String protocolContent) { + String firstFrameChar = protocolContent.charAt(0) + ""; + ProtocolConfigProvider protocolConfigProvider=new ProtocolConfigProvider(firstFrameChar); + return protocolConfigProvider.getMatchList(); } + + + + + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index cf2113d..e915877 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -1,32 +1,35 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(0) -@Service +@Component public class FrameLengthMatcher implements FrameStructMatcher { - @Autowired - private FieldParser fieldParser; - //超过长度 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { String dataGramContent = ByteBufUtil.hexDump(byteBuf); - if (StringUtils.isEmpty(protocolConfig.getUnpackId()) && StringUtils.isEmpty(protocolConfig.getTailStr())) { - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + //当不存在结尾标志和拆包标志,可以直接使用长度进行匹配 + if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { if (dataGramContent.length() >= totalLength) {//等于长度返回true,超出长度,切断 - ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, protocolConfig, totalLength); + ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, totalLength); return wholeDatagramByte; } else { //读的标志位前移舍弃 @@ -38,7 +41,7 @@ return null; } - private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, Integer totalLength) { byteBuf.readBytes(totalLength); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, totalLength - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 2bfc213..d527ad0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; @@ -13,7 +13,7 @@ import lombok.AllArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.nio.charset.Charset; import java.util.Map; @@ -22,32 +22,30 @@ * 后续标志验证 */ @Order(1) -@Service +@Component @AllArgsConstructor -public class FrameMarkMatcher implements FrameStructMatcher { - - private final FieldConfigDao fieldConfigDao; - private final FieldParser fieldParser; - private final FieldResolver fieldResolverManger; +public class FrameMarkMatcher implements FrameStructMatcher, FixedPropertyEnum { //帧后续标志=>结束,进行帧的重组=>有后续,1、帧移位判别 2、继续接收帧 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig UnpackConfig = StringUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getUnpackId()); - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); - Integer upback = 0; + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); ByteBuf mergeWholeFrameByte = null; - if (!ObjectUtil.isEmpty(UnpackConfig)) { - while (hasNextFullFrame(byteBuf, protocolConfig)) { - upback = (Integer) fieldResolverManger.filedParserManger(byteBuf, UnpackConfig, null); + if (!ObjectUtil.isEmpty(unpackFlag)) { + while (hasNextFullFrame(byteBuf, protocolConfig, protocolFieldConfigProvider)) { //是否存在后续位 - if (upback == 1) {//使用esayRule + if (unpackFlag == 1) {//使用esayRule //表示可以截取 - mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolConfig, totalLength); + mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolFieldConfigProvider, protocolConfig); return mergeWholeFrameByte; } else { - byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig)); + byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig, protocolFieldConfigProvider)); } } } @@ -56,7 +54,8 @@ //选取第一个帧,将业务内容和后面部分分开 //计算数据报文-业务内容 - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolFieldConfigProvider protocolFieldConfigProvider, ProtocolConfig protocolConfig) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); //截取完整报文 byteBuf.readBytes(totalLength); ByteBuf byteBufContent = byteBuf.slice(0, byteBuf.readerIndex()); @@ -68,15 +67,15 @@ String tail = ""; System.out.println(ByteBufUtil.hexDump(byteBufContent)); //会存在多个帧拼接在一起的的情况,进行合并处理 - while (hasNextFullFrame(byteBufContent, protocolConfig)) { - Integer currentFrameLength = fieldParser.getTotalLength(protocolConfig, byteBufContent); + while (hasNextFullFrame(byteBufContent, protocolConfig, protocolFieldConfigProvider)) { + Integer currentFrameLength = protocolFieldConfigProvider.getTotalLength(byteBufContent, protocolConfig); byteBufContent.readBytes(currentFrameLength); ByteBuf currentbyteBuf = byteBufContent.slice(0, byteBufContent.readerIndex()); byteBufContent.markReaderIndex();//读的标志位前移 System.out.println(ByteBufUtil.hexDump(byteBufContent)); String hexDump = currentbyteBuf.toString(Charset.forName("ISO-8859-1")); //获取当前固定帧结构的关系map - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, currentbyteBuf); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(currentbyteBuf, protocolConfig); if (StringUtils.isEmpty(mergeFrameStr)) { //首次获取业务数据报文 mergeFrameStr += hexDump.substring(0, currentFrameFixedProperty.get("tailPosition")); @@ -95,22 +94,22 @@ /** * 获取平移到下一帧起始位置 */ - public int getNextFrameOffset(ByteBuf buffer, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, buffer); - return currentFrameFixedProperty.get("totalLength"); + public int getNextFrameOffset(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + return currentFrameFixedProperty.get(TOTAL_LENGTH); } /** * 判断是否出错进行整个帧的 */ - public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, byteBuf); + public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); //保证读取位置不在固定位置,是可变的业务内容 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("fixedPosition")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(FIXED_POSITION)) { return false; } //判断读取是否操作帧长度 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("totalLength")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(TOTAL_LENGTH)) { return false; } return true; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 76a3784..c3a1bab 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -1,50 +1,50 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.parser.instance.GeneralProcessor; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; +import io.netty.buffer.ByteBufUtil;; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(2) -@Service +@Component public class FrameTailMatcher implements FrameStructMatcher { - @Resource - private FieldConfigDao fieldConfigDao; - @Autowired - private GeneralProcessor generalProcessor; - //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig tailFieldConfig = StringUtils.isEmpty(protocolConfig.getTailStr()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getTailStr()); - if (!ObjectUtil.isEmpty(tailFieldConfig)) { - String tailStr = tailFieldConfig.getFieldName(); + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfig protocolFieldConfig = ObjectUtils.isEmpty(protocolConfig.getTailStr()) ? null : + fieldConfigProvider.getFieldConfigById(protocolConfig.getTailStr()); + if (!ObjectUtil.isEmpty(protocolFieldConfig)) { + String tailStr = protocolFieldConfig.getFieldName(); String dataGramContent = ByteBufUtil.hexDump(byteBuf); Boolean tailFlag = ByteBufUtil.hexDump(byteBuf).contains(tailStr); if (!tailFlag) { //使用esayRule return null; } else if (dataGramContent.indexOf(tailStr) < dataGramContent.length() - tailStr.length()) { Integer length = dataGramContent.indexOf(tailStr) + tailStr.length(); - ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, protocolConfig, length); + ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, length); return wholeDatagramByte; //存在粘包 } } return null; } - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer length) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, Integer length) { byteBuf.readBytes(length); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, length - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java new file mode 100644 index 0000000..5f1c177 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java @@ -0,0 +1,73 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.combined.GenericCombinedFieldResolver; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.CombinedFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class CombinedFieldConfigProvider { + + + /** + * 作为临时配置列表缓存使用 + */ + private final List combinedFieldConfigList; + private Map storeObjectMap = new HashMap<>(); + + public CombinedFieldConfigProvider(Long ruleId) { + CombinedFieldConfigRegistry combinedFieldConfigRegistry = SpringContextUtil.getBean(CombinedFieldConfigRegistry.class); + combinedFieldConfigList = combinedFieldConfigRegistry.getCombinedFieldConfigList(ruleId); + } + + public void parseDataField(RuleConfig ruleConfig, String clearZeroPlain,Map fieldConfigsMap ) { + if (showSkip()) { + return; + } + //匹配对应的数据,然后进行相关的字段解析 + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver(); + combinedFieldResolver.parseDataField(combinedFieldConfigList, byteBuf, storeObjectMap,fieldConfigsMap); + } + + + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getCombinedFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return combinedFieldConfigList.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public List getCombinedFieldConfigList() { + return combinedFieldConfigList; + } + + /* 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(combinedFieldConfigList) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java new file mode 100644 index 0000000..f3cfedc --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java @@ -0,0 +1,11 @@ +package com.casic.missiles.parser.provider; + +/** + * @author cz + * @date 2023-6-12 + */ +public class CommandEventProvider{ + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java new file mode 100644 index 0000000..70eec5e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java @@ -0,0 +1,77 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.safe.SafeStrategy; +import com.casic.missiles.parser.sender.DataSubscribeProvider; +import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class DatagramEventProvider { + + private final DatagramEventConfig processorInstance; + + public DatagramEventProvider(Long ruleId) { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + List datagramEventConfigList = + datagramEventRegistry.getDatagramEventList(ruleId); + processorInstance = this.getProcessorInstance(datagramEventConfigList); + } + + public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { + if (showSkip()) { + return null; + } + return datagramEventConfigList.get(0); + } + + // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 + public String getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap) { + String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? + processorInstance.getSafeBean() : + fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); + if (!StringUtils.isEmpty(safeName)) { + //需要加密 + SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); + String plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); + return clearComplementZero(plain); + } + return ByteBufUtil.hexDump(bizDataContent); + } + + //解密清零操作 + private String clearComplementZero(String plain) { + plain = plain.substring(0, plain.lastIndexOf("00")); + return plain; + } + + //数据发送,数据发送者暂未构建 + public void storeData(Map bizDataMap) { + DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); +// dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return ObjectUtils.isNotEmpty(processorInstance) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java new file mode 100644 index 0000000..7e1fe0a --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java @@ -0,0 +1,97 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.FieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class FieldConfigProvider { + + + private final List fieldConfigs; + private Map storeObjectMap = new HashMap<>(); +// private Map singleObjects = new ConcurrentHashMap<>(); + + public FieldConfigProvider(Long ruleId) { + FieldConfigRegistry fieldConfigRegistry = SpringContextUtil.getBean(FieldConfigRegistry.class); + fieldConfigs = fieldConfigRegistry.getFieldConfigList(ruleId); + } + + public List getFieldConfigs() { + return fieldConfigs; + } + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public Map parseDataField(RuleConfig ruleConfig, String clearZeroPlain) { + if (showSkip()) { + return null; + } + List prepareFieldConfig = prepareParseField(ruleConfig); + if (CollectionUtils.isNotEmpty(prepareFieldConfig)) { + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(fieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + return fixDataMap; + } + } + return null; + } + + /** + * 得到需要处理的业务内容 + * + * @return + */ + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return fieldConfigs.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public Map getFieldConfigsMap() { + return fieldConfigs.stream().collect( + Collectors.toMap(FieldConfig::getId, e -> e) + ); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(fieldConfigs) ? false : true; + } + + +} + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java new file mode 100644 index 0000000..817bfaf --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java @@ -0,0 +1,19 @@ +package com.casic.missiles.parser.provider; + +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.registry.FieldRuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; + +public class FieldRuleConfigProvider { + + private final List fieldRuleConfigList; + + public FieldRuleConfigProvider(Long ruleId) { + FieldRuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(FieldRuleConfigRegistry.class); + fieldRuleConfigList = ruleConfigRegistry.getFieldRuleConfigList(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java new file mode 100644 index 0000000..99a1b06 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java @@ -0,0 +1,53 @@ +package com.casic.missiles.parser.provider; + + +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.registry.ProtocolConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolConfigProvider { + + private final List protocolConfigList; + + public ProtocolConfigProvider(String firstChar) { + ProtocolConfigRegistry registry = SpringContextUtil.getBean(ProtocolConfigRegistry.class); + protocolConfigList = registry.getProtocolConfigList(firstChar); + } + + public List getMatchList() { + return protocolConfigList; + } + + /** + * 设置当前协议 + * + * @param protocolConfig + */ + public ProtocolConfigProvider(ProtocolConfig protocolConfig) { + List protocolConfigs = new ArrayList<>(); + protocolConfigs.add(protocolConfig); + protocolConfigList = protocolConfigs; + } + + /** + * 获取当前协议 + * + * @return + */ + public ProtocolConfig getCurrentProtocolConfig() { + if (this.protocolConfigList == null) { + return null; + } else { + return protocolConfigList.get(0); + } + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java new file mode 100644 index 0000000..043927d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java @@ -0,0 +1,213 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.registry.ProtocolFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolFieldConfigProvider { + + private static final String FIXED_FIELD_DS = "fixedFieldDs"; + private static final String CONTENT_FIELD_DS = "contentFieldDs"; + private static final String PROTOCOL_LENGTH = "protocolLength"; + private static final String PROTOCOL_FIELD_ID = "protocolFieldId"; + private static final String PROTOCOL_POSITION = "protocolPosition"; + + private final List protocolFieldConfigs; + private Map singleObjects = new ConcurrentHashMap<>(); + private Map storeObjectMap = new HashMap<>(); + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public ProtocolFieldConfigProvider(Long protocolId) { + ProtocolFieldConfigRegistry protocolFieldConfigRegistry = SpringContextUtil.getBean(ProtocolFieldConfigRegistry.class); + protocolFieldConfigs = protocolFieldConfigRegistry.getProtocolFieldConfigList(protocolId); + } + + public List getProtocolFieldConfigs() { + return protocolFieldConfigs; + } + + public ProtocolFieldConfig getFieldConfigById(Long fieldId) { + Optional optionalConfig = protocolFieldConfigs.stream().filter( + e -> e.getId().equals(fieldId) + ).findFirst(); + return optionalConfig.isPresent() ? optionalConfig.get() : null; + } + + public Integer getProtocolFieldValue(Long protocolFieldId, ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_FIELD_ID + protocolFieldId + ByteBufUtil.hexDump(byteBuf); + //获取缓存 + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + //加载固定长度数据集合 + Map fixDataMap = this.getProtocolDataMap(byteBuf); + ProtocolFieldConfig protocolFieldConfig = selectFieldConfig(protocolFieldId); + Integer protocolFieldValue = 0; + //获取约定字段的总长度 + if (fixDataMap.containsKey(protocolFieldConfig.getFieldName())) { + Object appointUnpackObject = fixDataMap.get(protocolFieldConfig.getFieldName()); + if (ObjectUtils.isNotEmpty(appointUnpackObject)) { + protocolFieldValue = (Integer) appointUnpackObject; + } + } + if (protocolFieldValue != null) { + //加入缓存 + if (ObjectUtils.isNotEmpty(protocolFieldValue)) { + this.singleObjects.put(catchKey, protocolFieldValue); + return protocolFieldValue; + } + } + return null; + } + + /** + * 获取帧固定位置信息 + * + * @param byteBuf + * @param protocolConfig + * @return + */ + public Map getFixedProperty(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_POSITION + protocolConfig.getId(); + if (this.singleObjects.containsKey(catchKey)) { + return (Map) singleObjects.get(catchKey); + } + Map fixedPropertyMap = new HashMap<>(); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + fixedPropertyMap = fieldParser.doGetFixedProperty(protocolFieldConfigs, this.getTotalLength(byteBuf,protocolConfig)); + if (CollectionUtils.isNotEmpty(fixedPropertyMap)) { + this.singleObjects.put(catchKey, fixedPropertyMap); + return fixedPropertyMap; + } + return fixedPropertyMap; + } + + /** + * 获取帧结构应有的总长度 + */ + public Integer getTotalLength(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_LENGTH + ByteBufUtil.hexDump(byteBuf); + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + Integer appointFrameLength = getProtocolFieldValue(protocolConfig.getTotalLengthId(), byteBuf); + if (appointFrameLength != null) { + //获取过滤的字段集合总长度 + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Integer totalFilterLength = fieldParser.getTotalFilterLength(protocolConfig, byteBuf, getFixFieldConfigMap()); + //计算总长度 + Integer totalLength = appointFrameLength + totalFilterLength; + //加入缓存 + if (ObjectUtils.isNotEmpty(totalLength)) { + this.singleObjects.put(catchKey, totalLength); + return totalLength; + } + } + return null; + } + + /** + * 获取协议有关字段解析内容 + * storeObjectMap存储代转存的数据 + * + * @return + */ + public Map getProtocolDataMap(ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(FIXED_FIELD_DS)) { + return (Map) singleObjects.get(FIXED_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(protocolFieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + this.singleObjects.put(FIXED_FIELD_DS, fixDataMap); + return fixDataMap; + } + return null; + } + + /** + * 获取业务报文内容的content字节 + * + * @param wholeDatagramByte + * @return + */ + public ByteBuf getDataContentBuf(ByteBuf wholeDatagramByte) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(CONTENT_FIELD_DS)) { + return (ByteBuf) singleObjects.get(CONTENT_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + ByteBuf bizDataByteBuf = fieldParser.getDataContentBuf(protocolFieldConfigs, wholeDatagramByte); + if (bizDataByteBuf != null) { + this.singleObjects.put(CONTENT_FIELD_DS, bizDataByteBuf); + return bizDataByteBuf; + } + return null; + } + + + private ProtocolFieldConfig selectFieldConfig(Long id) { + Optional optionalProtocolFieldConfig = this.protocolFieldConfigs.stream().filter( + e -> e.getId().equals(id) + ).findFirst(); + return optionalProtocolFieldConfig.isPresent() ? optionalProtocolFieldConfig.get() : null; + } + + + private Map getFixFieldConfigMap() { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, e -> e) + ); + return fixDataFieldMap; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(protocolFieldConfigs) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java new file mode 100644 index 0000000..dafba1c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java @@ -0,0 +1,56 @@ +package com.casic.missiles.parser.provider; + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.rule.GenericRuleResolver; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.RuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleConfigProvider { + + private final List ruleConfigs; + + public List getRuleConfigs() { + return ruleConfigs; + } + + public RuleConfigProvider(Long protocolId) { + RuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(RuleConfigRegistry.class); + ruleConfigs = ruleConfigRegistry.getRuleConfigById(protocolId); + } + + /** + * 获取规则匹配结果 + * + * @param parseFixedDataMap + * @param protocolFieldConfigs + * @return + */ + public RuleConfig doGetRule(Map parseFixedDataMap, + String ids, + List protocolFieldConfigs) { + if (showSkip()) { + return null; + } + RuleConfig ruleConfig = GenericRuleResolver.machRule(parseFixedDataMap, ids, protocolFieldConfigs, ruleConfigs); + return ruleConfig; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(ruleConfigs) ? false : true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java index 3c05891..856b399 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java @@ -1,18 +1,11 @@ package com.casic.missiles.parser.resolver; -import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.springframework.web.bind.annotation.RequestBody; -import javax.annotation.Resource; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -20,19 +13,17 @@ @Slf4j public class ByteMergeProvider { - @Resource - private FieldRuleEngineMapper fieldRuleEngineMapper; - //拿到所有的值合并到一个值 - public String resolveByteMerge(List valueList, String ruletypeId, String vaildRange) { + public static String resolveByteMerge(List valueList, String ruleTypeId, String vaildRange) { String values = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Map vaildMap = getValidRangeMap(vaildRange); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(ruletypeId); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } + //暂时不处理 +// fieldRuleEngine = fieldRuleConfigMapper.selectById(ruleTypeId); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } Map env2 = new HashMap(); for (int i = 0; i < valueList.size(); i++) { if (vaildMap.containsKey(i)) { @@ -47,7 +38,7 @@ } } - private Map getValidRangeMap(String vaildRange) { + private static Map getValidRangeMap(String vaildRange) { String[] range = vaildRange.split(","); Map vaildMap = new HashMap(); for (int i = 0; i < range.length; i++) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 8d821cd..85d6bbf 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -1,9 +1,12 @@ package com.casic.missiles.parser.resolver; +import com.casic.missiles.pojo.AbstractFieldConfig; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; import io.netty.buffer.ByteBuf; +import java.util.List; import java.util.Map; /** @@ -11,18 +14,14 @@ */ public interface FieldParser { -// Map fieldProcess(String protocolContent,); - Map dataParser(RuleConfig ruleConfig, String lightText,String protocolId); + Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength); - Map fixDataParser(String protocolId, ByteBuf buffer); + Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap); - Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf); + ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer); - ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer); - - ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer); - - Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer); + Integer getTotalFilterLength(ProtocolConfig protocolConfig, ByteBuf byteBuf, Map protocolFieldConfigMap); } + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java new file mode 100644 index 0000000..9e0c00e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java @@ -0,0 +1,52 @@ +package com.casic.missiles.parser.resolver; + +import com.casic.missiles.pojo.AbstractFieldConfig; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.util.List; + +public class FieldParserSupport { + + //分别计算bit和byte长度=> 合并长度 + protected Integer calculateLength(List fieldConfigList) { + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + Integer fixedLength = bytefixedLength + bitfixedLength / 8; + return fixedLength; + } + + //找到最大值=> 根据最大值计算业务数据下标 + protected Integer calculatePosition(List fieldConfigList) { + String rex = "[0-9]+"; + Integer max = -1; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) + && Integer.valueOf(fieldConfig.getOriginPositionByte()) > max) { + max = Integer.valueOf(fieldConfig.getOriginPositionByte()); + } + } + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) && fieldConfig.getOriginPositionByte().equals(max)) { + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + } + } + Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; + return maxFixedPosition; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java deleted file mode 100644 index dd3a6cd..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java +++ /dev/null @@ -1,170 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.ByteResolverParam; -import io.netty.buffer.ByteBuf; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -/** - * 字段解析管理总类 - */ -@Service -@Slf4j -@AllArgsConstructor -public class FieldResolver extends ByteMergeProvider { - - //1、字段截取 => 2、简单的字节解析和复杂的字节解析 - public Object filedParserManger(ByteBuf byteBuf, FieldConfig fieldConfig, Integer maxFixedPosition) { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - //最大固定位置不为空, - if (!ObjectUtil.isEmpty(maxFixedPosition)) { - orignPosition -= maxFixedPosition; - } - Object fieldValue = 0; - //待优化 - if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { - fieldValue = bitToResolver(byteBuf, fieldConfig); - } else { - ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); - fieldValue = parsingFields(fieldBytes, fieldConfig.getRuleJson()); - } - return fieldValue; - } - - //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, - //目前默认配置的规则设置暂不支持配置化,由实现完成 - private Object parsingFields(ByteBuf byteBuf, String ruleJson) { - Object fieldsResolveValue = null; - List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); - if (ObjectUtil.isEmpty(ruleMapList)) { - fieldsResolveValue = defaultResolveBuilder(byteBuf); - } else { - fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); - } - return fieldsResolveValue; - } - - private Object defaultResolveBuilder(ByteBuf byteBuf) { - Integer defaultResolveValue = 0; - for (int i = 0; i < byteBuf.writerIndex(); i++) { - defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; - } - return defaultResolveValue; - } - - //字段解析构建器(针对字节单位的) - //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 - // 字节归并结束或者规则结束=>继续根据规则进行判断 - private Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { - Object customizeResolveValue = null; - try { - List bytStrList = new ArrayList<>(); - //存放到数组里面 - for (int i = 0; i < byteBuf.writerIndex(); i++) { - bytStrList.add(byteBuf.readByte()); - } - int i = 0; - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - customizeResolveValue = this.resolveByteMerge(bytStrList, ruletypeId,vaildRange); - break; - } else { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - List tempBytStr = new ArrayList<>(); - for (int k = 0; i < bytStrList.size(); i++) { - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(k) - .value(bytStrList.get(k)) - .ruletypeId(ruletypeId).build(); - tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); - } - bytStrList = tempBytStr; - } - i++; - } - //字节归并到一起=>继续根据规则进行判断 - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(customizeResolveValue) - .ruletypeId(ruletypeId).build(); - customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(customizeResolveValue)); - return customizeResolveValue; - } catch (RuntimeException ex) { - log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); - return null; - } - } - - /** - * 1、单个字节情况表示字段 - * 2、多字节情况表示字段(暂未处理) - */ - private Object bitToResolver(ByteBuf byteBuf, FieldConfig fieldConfig) { - Object fieldValue = new Object(); - try { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - byte fields = 0x00; - if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); - } else { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); - } - - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { - if (!StringUtils.isEmpty(fieldConfig.getExactOrignPosition())) { - fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getExactOrignPosition())).byteValue() - >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); - } else { - fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); - } - } else { - fieldValue = Integer.valueOf(fields & 0xff); - } - if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { - return fieldValue; - } - List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); - int i = 0; - //字节归并到一起=>继续根据规则进行判断 - while (i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(fieldValue) - .ruletypeId(ruletypeId).build(); - fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(fieldValue)); - return fieldValue; - } catch (RuntimeException ex) { - log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); - return null; - } - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java new file mode 100644 index 0000000..1d2aeab --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java @@ -0,0 +1,36 @@ +package com.casic.missiles.parser.resolver.bytes; + +import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.mapper.FieldRuleConfigMapper; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.pojo.ByteResolverParam; +import com.googlecode.aviator.AviatorEvaluator; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; +//转换规则 +@Component("convert") +@AllArgsConstructor +@Slf4j +public class ByteRuleResolver implements ByteResolver { + + private final FieldRuleConfigMapper fieldRuleConfigMapper; + + @Override + public Object resolveOperationRule(ByteResolverParam byteResolverParam){ + FieldRuleConfig fieldRuleEngine=fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); + if(ObjectUtil.isEmpty(fieldRuleEngine)){ + return byteResolverParam.getValue(); + } + String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); + Map env2 = new HashMap(); + env2.put("value", (byte) byteResolverParam.getValue()); + String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); + return values; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java index 103821c..786b71c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java @@ -2,34 +2,34 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("logicalShift") +@Component("logicalShift") @AllArgsConstructor @Slf4j public class LogicalShiftResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //字节位移 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { Integer index = byteResolverParam.getIndex(); - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return byteResolverParam.getValue(); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java index 476747d..01149bd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("operation") +@Component("operation") @AllArgsConstructor @Slf4j public class OperationResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //混合运算,有常量或者乘除的缩放 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java index 0b82cf4..79abcce 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.casic.missiles.pojo.ByteResolverParam; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; //精度计算 -@Service("precision") +@Component("precision") @AllArgsConstructor @Slf4j public class PrecisionResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java deleted file mode 100644 index 5c3f332..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; -//转换规则 -@Service("convert") -@AllArgsConstructor -@Slf4j -public class RuleResolver implements ByteResolver { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam){ - RuleEvaluator fieldRuleEngine=fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); - if(ObjectUtil.isEmpty(fieldRuleEngine)){ - return byteResolverParam.getValue(); - } - String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); - Map env2 = new HashMap(); - env2.put("value", (byte) byteResolverParam.getValue()); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java new file mode 100644 index 0000000..d3bbd91 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java @@ -0,0 +1,15 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; + +import java.util.List; +import java.util.Map; +// 前导码匹配->长度字段 +public interface AbstractCombinedFieldProcessor { + + Map invoke(Map map, ByteBuf byteBuf, List combinedFieldConfigList, + Map fieldConfigsMap, Map storeObjectMap); + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java new file mode 100644 index 0000000..03c8480 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java @@ -0,0 +1,59 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-13 + */ +//依次递增进行数据的解析, +public class GenericCombinedFieldResolver { + + + //通过查询,字段长度长度随机 + public void parseDataField(List combinedFieldConfigList, ByteBuf byteBuf, + Map storeObjectMap, Map fieldConfigsMap) { + Integer frameLength = Integer.valueOf(ByteBufUtil.hexDump(byteBuf)); + //添加前置处理器 + com.casic.missiles.util.ClassUtil classUtil = new com.casic.missiles.util.ClassUtil(); + List abstractCombinedProcessors = classUtil.getSubClassList(AbstractCombinedFieldProcessor.class); + + Map fieldFixedMap = combinedFieldLeadCodeMap(combinedFieldConfigList); + //frameLength + Map combinedProcessorFields = null; + while (byteBuf.readableBytes() < frameLength) { + //一直处理 + for (AbstractCombinedFieldProcessor abstractCombinedProcessor : abstractCombinedProcessors) { + combinedProcessorFields = abstractCombinedProcessor.invoke(combinedProcessorFields, byteBuf, + combinedFieldConfigList, + fieldConfigsMap, storeObjectMap); + if (combinedProcessorFields == null || byteBuf.readableBytes() < frameLength) { + return; + } + } + + } + } + + /** + * 取出前导码匹配集合 + */ + private Map combinedFieldLeadCodeMap(List combinedFieldConfigList) { + Map fieldFixedMap = combinedFieldConfigList + .stream() + .collect(Collectors.toMap(CombinedFieldConfig::getPrefixCode, e -> e)); + return fieldFixedMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java new file mode 100644 index 0000000..643a934 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java @@ -0,0 +1,100 @@ +package com.casic.missiles.parser.resolver.fields; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.FieldParserSupport; +import com.casic.missiles.pojo.*; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 保存使用时最基本的信息,并且使用原型模式 + */ +@Slf4j +public class DefaultProtocolFieldParser extends FieldParserSupport implements FieldParser, FixedPropertyEnum { + + //通过传入的配置和报文进行字段解析 + @Override + public Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap) { + Map dataMap = new HashMap<>(); + for (AbstractFieldConfig protocolFieldConfig : protocolFieldConfigs) { + if (!ObjectUtils.isEmpty(protocolFieldConfig.getOriginPositionByte())) { + Object fieldValue = FieldResolver.parseField(buffer, protocolFieldConfig, null); + if (protocolFieldConfig.getIsStorage() == 1) { + storeObjectMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + dataMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + } + return dataMap; + } + + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength) { + Map fixedPropertyMap = new HashMap<>(); + Integer fixedLength = calculateLength(protocolFieldConfigs); + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + fixedPropertyMap.put(FIXED_POSITION, maxFixedPosition); + fixedPropertyMap.put(TOTAL_LENGTH, totalLength); + fixedPropertyMap.put(TAIL_POSITION, totalLength - fixedLength + maxFixedPosition); + return fixedPropertyMap; + } + + //** 获取业务内容的byteBuf + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer) { + //计算固定长度 + Integer fixedLength = calculateLength(protocolFieldConfigs); + //总长度获取 + String lightText = buffer.toString(Charset.forName("ISO-8859-1")); + Integer totalLength = lightText.length(); + //计算固定长度最大长度 + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + //计算数据报文内容 + ByteBuf bizDataFields = buffer.slice(maxFixedPosition - 1, (totalLength - fixedLength)); + return bizDataFields; + } + + /** + * 获取过滤字段的长度 + */ + @Override + public Integer getTotalFilterLength(ProtocolConfig protocolConfig, + ByteBuf byteBuf, + Map protocolFieldConfigMap) { + if (ByteBufUtil.hexDump(byteBuf).equals("")) { + return 0; + } + int totalFilterLength = 0; + String filterFields = protocolConfig.getTotalLengthFilterFields(); + try { + if (!StringUtils.isEmpty(filterFields)) { + String[] filterFieldList = filterFields.split(","); + for (String filterFieldId : filterFieldList) { + if (StringUtils.isNotEmpty(filterFieldId)) { + ProtocolFieldConfig fieldConfig = protocolFieldConfigMap.get(Long.valueOf(filterFieldId)); + //这里都是按字节计算,没有对位进行区分,可能会出现错误 + // 如果对位有需求,需要进一步跟进 + totalFilterLength += fieldConfig.getOffsetLength(); + } + } + } + return totalFilterLength; + } catch (Exception ex) { + log.error("报文确认分发阶段,获取报文总长度过滤长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); + } + return totalFilterLength; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java new file mode 100644 index 0000000..d51e887 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java @@ -0,0 +1,169 @@ +package com.casic.missiles.parser.resolver.fields; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.parser.resolver.ByteMergeProvider; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.AbstractFieldConfig; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.pojo.ByteResolverParam; +import io.netty.buffer.ByteBuf; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * 字段解析管理总类 + */ +@Slf4j +public class FieldResolver extends ByteMergeProvider { + + //1、字段截取 => 2、简单的字节解析和复杂的字节解析 + public static Object parseField(ByteBuf byteBuf,AbstractFieldConfig fieldConfig, Integer maxFixedPosition) { + Integer orignPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + //最大固定位置不为空, + if (!ObjectUtil.isEmpty(maxFixedPosition)) { + orignPosition -= maxFixedPosition; + } + Object fieldValue = 0; + //待优化 + if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { + fieldValue = doParseBitField(byteBuf, fieldConfig); + } else { + ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); + fieldValue = doParseByteField(fieldBytes, fieldConfig.getRuleJson()); + } + return fieldValue; + } + + //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, + //目前默认配置的规则设置暂不支持配置化,由实现完成 + private static Object doParseByteField(ByteBuf byteBuf, String ruleJson) { + Object fieldsResolveValue = null; + List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); + if (ObjectUtil.isEmpty(ruleMapList)) { + fieldsResolveValue = defaultResolveBuilder(byteBuf); + } else { + fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); + } + return fieldsResolveValue; + } + + private static Object defaultResolveBuilder(ByteBuf byteBuf) { + Integer defaultResolveValue = 0; + for (int i = 0; i < byteBuf.writerIndex(); i++) { + defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; + } + return defaultResolveValue; + } + + //字段解析构建器(针对字节单位的) + //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 + // 字节归并结束或者规则结束=>继续根据规则进行判断 + private static Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { + Object customizeResolveValue = null; + try { + List bytStrList = new ArrayList<>(); + //存放到数组里面 + for (int i = 0; i < byteBuf.writerIndex(); i++) { + bytStrList.add(byteBuf.readByte()); + } + int i = 0; + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { + if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + customizeResolveValue = resolveByteMerge(bytStrList, ruletypeId, vaildRange); + break; + } else { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + List tempBytStr = new ArrayList<>(); + for (int k = 0; i < bytStrList.size(); i++) { + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(k) + .value(bytStrList.get(k)) + .ruletypeId(ruletypeId).build(); + tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); + } + bytStrList = tempBytStr; + } + i++; + } + //字节归并到一起=>继续根据规则进行判断 + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(null) + .value(customizeResolveValue) + .ruletypeId(ruletypeId).build(); + customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); + i++; + } + System.out.println(JSON.toJSON(customizeResolveValue)); + return customizeResolveValue; + } catch (RuntimeException ex) { + log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); + return null; + } + } + + /** + * 1、单个字节情况表示字段 + * 2、多字节情况表示字段(暂未处理) + */ + private static Object doParseBitField(ByteBuf byteBuf,AbstractFieldConfig fieldConfig) { + Object fieldValue = new Object(); + try { + Integer orignPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + byte fields = 0x00; + if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { + fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); + } else { + fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); + } + + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { + if (!StringUtils.isEmpty(fieldConfig.getOriginPositionBit())) { + fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getOriginPositionBit())).byteValue() + >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); + } else { + fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); + } + } else { + fieldValue = Integer.valueOf(fields & 0xff); + } + if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { + return fieldValue; + } + List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); + int i = 0; + //字节归并到一起=>继续根据规则进行判断 + while (i < ruleMapList.size()) { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(null) + .value(fieldValue) + .ruletypeId(ruletypeId).build(); + fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); + i++; + } + System.out.println(JSON.toJSON(fieldValue)); + return fieldValue; + } catch (RuntimeException ex) { + log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); + return null; + } + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java deleted file mode 100644 index 35ae3d0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java +++ /dev/null @@ -1,183 +0,0 @@ -package com.casic.missiles.parser.resolver.fields; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufAllocator; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; -import org.springframework.util.ObjectUtils; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service("standard") -@AllArgsConstructor -@Slf4j -public class StandardFieldParser implements FieldParser { - - private final FieldConfigDao fieldConfigDao; - private final FieldResolver fieldResolver; - - //数据解析 - @Override - public Map dataParser(RuleConfig ruleConfig, String lightText, String protocolId) { - String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); - ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); - bufferContent.writeBytes(lightText.getBytes(Charset.forName("ISO-8859-1"))); - Map dataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - for (String dataFieldId : dataFieldIds) { - FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(dataFieldId); - if (!ObjectUtils.isEmpty(fieldConfig)) { - dataMap.put(fieldConfig.getFieldName(), String.valueOf(fieldResolver.filedParserManger(bufferContent, fieldConfig, maxFixedPosition))); - } - } - return dataMap; - } - - //数据解析 - @Override - public Map fixDataParser(String protocolId, ByteBuf buffer) { - List dataFieldIdList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Map dataMap = new HashMap<>(); - for (FieldConfig dataField : dataFieldIdList) { - if (!ObjectUtils.isEmpty(dataField.getOrignPosition())) { - Object fieldValue = (Integer) fieldResolver.filedParserManger(buffer, dataField, null); - dataMap.put(dataField.getFieldName(), fieldValue); - } - } - return dataMap; - } - - @Override - public Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf) { - if (ByteBufUtil.hexDump(byteBuf).equals("")) { - return 0; - } - String filterFields = protocolConfig.getTotalLengthFilterField(); - Integer totalLength = 0; - try { - FieldConfig totalFieldConfig = fieldConfigDao.getFieldConfigById(protocolConfig.getTotalLengthId()); - int totalFilterLength = 0; - if (!StringUtils.isEmpty(filterFields)) { - String[] filterFieldList = filterFields.split(","); - for (String filterField : filterFieldList) { - FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(filterField); - //这里都是按字节计算,没有对位进行区分,可能会出现错误 - - // 如果对位有需求,需要进一步跟进 - totalFilterLength += fieldConfig.getOffsetLength(); - } - } - totalLength = (Integer) fieldResolver.filedParserManger(byteBuf, totalFieldConfig, null) + totalFilterLength; - } catch (Exception ex) { - log.error("报文确认分发阶段,获取报文总长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); - } - return totalLength; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer) { - //业务内容 - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - String protocolId = String.valueOf(protocolConfig.getId()); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - //计算固定长度 - Integer fixedLength = calculateLength(fieldConfigList); -// Integer totalLength = this.getTotalLength(protocolConfig, buffer); - //总长度获取 - Integer totalLength = lightText.length(); - //计算固定长度最大长度 - Integer maxFixedPosition = calculatePosition(fieldConfigList); -// buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - //计算数据报文内容 - ByteBuf bizDataFields = buffer.slice(maxFixedPosition-1, (totalLength - fixedLength)); - return bizDataFields; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer) { - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - String protocolId = String.valueOf(protocolConfig.getId()); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer fixedLength = calculateLength(fieldConfigList); -// Integer totalLength = this.getTotalLength(protocolConfig, buffer); - Integer totalLength = lightText.length(); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - ByteBuf fixDataFields = buffer.slice(0, maxFixedPosition); - return fixDataFields; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer) { - String protocolId = String.valueOf(protocolConfig.getId()); - Map fixedPropertyMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer fixedLength = calculateLength(fieldConfigList); - Integer totalLength = this.getTotalLength(protocolConfig, buffer); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - fixedPropertyMap.put("fixedPosition", maxFixedPosition); - fixedPropertyMap.put("totalLength", totalLength); - fixedPropertyMap.put("tailPosition", totalLength - fixedLength + maxFixedPosition); - return fixedPropertyMap; - } - - //分别计算bit和byte长度=> 合并长度 - private Integer calculateLength(List fieldConfigList) { - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (FieldConfig fieldConfig : fieldConfigList) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - Integer fixedLength = bytefixedLength + bitfixedLength / 8; - return fixedLength; - } - - //找到最大值=> 根据最大值计算业务数据下标 - private Integer calculatePosition(List fieldConfigList) { - String rex = "[0-9]+"; - Integer max = -1; - for (FieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOrignPosition()) - && Integer.valueOf(fieldConfig.getOrignPosition()) > max) { - max = Integer.valueOf(fieldConfig.getOrignPosition()); - } - } - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (FieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOrignPosition()) && fieldConfig.getOrignPosition().equals(max)) { - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - } - } - Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; - return maxFixedPosition; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java new file mode 100644 index 0000000..d4ec6c7 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java @@ -0,0 +1,76 @@ +package com.casic.missiles.parser.rule; + +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import org.apache.commons.lang3.StringUtils; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class GenericRuleResolver { + + //根据前置字段的值,找到指定的规则 + //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 + //=>循环判断=>通过规则得到业务字段 + public static RuleConfig machRule(Map fixDataMap, + String ids, + List protocolFieldConfigs, + List ruleConfigs) { + List preRuleConfigList = getPreRuleList(ids, protocolFieldConfigs); + //获取前置规则字段 + final Map metaDataMap = getPreRuleFields(preRuleConfigList, fixDataMap); + //准备固定的字段集合 + Map fixDataFieldMap = getFixDataFieldMap(protocolFieldConfigs); + return RuleResolverCore.doMachRule(ruleConfigs, metaDataMap, fixDataMap, fixDataFieldMap); + } + + private static Map getFixDataFieldMap(List protocolFieldConfigs) { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, ProtocolFieldConfig::getFieldName) + ); + return fixDataFieldMap; + } + + + /** + * 查询前置规则的字段配置 + * + * @param ids + * @return + */ + private static List getPreRuleList(String ids, List protocolFieldConfigs) { + String[] idList = ids.split(","); + Map prepareMaps = new HashMap<>(); + for (String id : idList) { + if (StringUtils.isNotEmpty(id)) { + prepareMaps.put(Long.valueOf(id), ""); + } + } + List preRuleConfigList = protocolFieldConfigs + .stream() + .filter(e -> prepareMaps.containsKey(e.getId())) + .collect(Collectors.toList()); + return preRuleConfigList; + } + + /** + * 获取前置规则解析字段 + */ + private static Map getPreRuleFields(List preRuleFieldConfigList, Map fixDataMap) { + Map ruleFieldMap = new HashMap<>(); + preRuleFieldConfigList.stream() + .forEach( + preRuleFieldConfig -> { + String fieldName = preRuleFieldConfig.getFieldName(); + if (fixDataMap.containsKey(fieldName)) { + ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); + } + } + ); + return ruleFieldMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java new file mode 100644 index 0000000..baae7e8 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -0,0 +1,68 @@ +package com.casic.missiles.parser.rule; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.casic.missiles.pojo.RuleConfig; + +import java.util.*; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleResolverCore { + + + public static RuleConfig doMachRule(List ruleConfigList, Map metaDataMap, + Map fixDataMap, + Map fixDataFieldMap) { + Optional ruleConfigOptional = ruleConfigList.stream() + .filter(ruleConfig -> machRuleConfig( + JSON.parseObject(ruleConfig.getMatchRuleJson(), Map.class), metaDataMap)) + .findFirst(); + if (ObjectUtil.isEmpty(ruleConfigOptional)) { + return null; + } + String[] ruleFields = ruleConfigOptional.get().getDataFieldIds().split(","); + Map ruleMetaDataMap = getRuleFields(ruleFields, fixDataMap, fixDataFieldMap); + //递归选定解析规则,进行规则解析 + if (!ruleConfigOptional.get().getIsFinishMatch().equals("1")) { + //递归选定规则 + doMachRule(ruleConfigList, ruleMetaDataMap, fixDataMap, fixDataFieldMap); + } + return ruleConfigOptional.get(); + } + + + private static Map getRuleFields(String[] preRuleConfigList, Map fixedDataMap, + Map fixedFieldMap) { + Map ruleFieldMap = new HashMap<>(); + for (String preRuleConfigId : preRuleConfigList) { + String fieldName = fixedFieldMap.get(preRuleConfigId); + if (fixedDataMap.containsKey(fieldName)) { + ruleFieldMap.put(fieldName, String.valueOf(fixedDataMap.get(fieldName))); + } + } + return ruleFieldMap; + } + + + //匹配规则配置 + private static Boolean machRuleConfig(Map ruleMap, Map metaDataMap) { + if (ruleMap == null || metaDataMap == null) { + return null; + } + //所有的字段在规则里面必须有有配置 + for (String key : metaDataMap.keySet()) { + if (ruleMap.containsKey(key)) { + if (!ruleMap.get(key).equals(metaDataMap.get(key))) { + return false; + } + } else { + return false; + } + } + return true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java deleted file mode 100644 index 664088d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java +++ /dev/null @@ -1,92 +0,0 @@ -package com.casic.missiles.parser.rule; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.mapper.dao.PreRuleConfigDao; -import com.casic.missiles.mapper.dao.RuleConfigDao; -import lombok.AllArgsConstructor; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.*; -import java.util.stream.Collectors; - -@Service -@AllArgsConstructor -public class RulerProvider { - - private final FieldConfigDao fieldConfigDao; - private final PreRuleConfigDao preRuleConfigDao; - private final RuleConfigDao ruleConfigDao; - - //根据前置字段的值,找到指定的规则 - //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 - //=>循环判断=>通过规则得到业务字段 - public RuleConfig ruleConfig(Map fixDataMap, String protocolId) { - //批量获取规则 - List preRuleConfigList = preRuleConfigDao.getPreRuleList(protocolId); - //获取固定字段 - Map fixFieldMap = getAllFieldMap(protocolId); - //获取前置规则字段 - final String preRuleFields = getPreRuleFields(preRuleConfigList, fixDataMap, fixFieldMap); - List ruleConfigList = ruleConfigDao.getRuleConfigById(protocolId); - Optional ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig ->preRuleFields.equals( ruleConfig.getParseRuleJson())).findFirst(); - //递归选定解析规则,进行规则解析 - while (!ObjectUtil.isEmpty(ruleConfigOptional) && !ruleConfigOptional.get().getIsBizField().equals("1")) { - String ruleFields = getRuleFields(ruleConfigOptional.get().getDataFieldIds().split(","), fixDataMap, fixFieldMap); - ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig -> ruleConfig.getParseRuleJson().equals(ruleFields)).findFirst(); - } - return ruleConfigOptional.get(); - } - - /** - * 获取前置规则解析字段 - */ - private String getPreRuleFields(List preRuleConfigList, Map fixDataMap, Map fixFieldMap) { - Map ruleFieldMap= new HashMap<>(); - preRuleConfigList.stream() - .forEach( - preRuleConfig -> { - String fieldName = fixFieldMap.get(Long.valueOf(preRuleConfig.getRuleFieldId())); - if (fixDataMap.containsKey(fieldName)) { - ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); - } - } - ); - return JSONObject.toJSONString(ruleFieldMap); - } - - private Map getAllFieldMap(String protocolId) { - List fieldList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Map fixFieldMap = fieldList.stream().collect( - Collectors.toMap(FieldConfig::getId, FieldConfig::getFieldName) - ); - return fixFieldMap; - } - - private String getRuleFields(String[] preRuleConfigList, Map fixDataMap, Map fixFieldMap) { - Map ruleFieldMap= new HashMap<>(); - for (String preRuleConfigId : preRuleConfigList) { - String fieldName = fixFieldMap.get(preRuleConfigId); - if (fixDataMap.containsKey(fieldName)) { - ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); - } - } - return JSONObject.toJSONString(ruleFieldMap); - } - - //弃置 - private String ListToString(List ruleFieldList) { - String ruleFields = ""; - for (String ruleField : ruleFieldList) { - ruleFields += ruleField + ","; - } - ruleFields = StringUtils.isEmpty(ruleFields) ? ruleFields : ruleFields.substring(0, ruleFields.length() - 1); - return ruleFields; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java index 6177e10..bfa87a5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java @@ -2,7 +2,7 @@ public interface SafeStrategy { - String decryption(byte[] bytes); + String decryption(String cipher); String encryption(String lightText); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java index 618716c..6236302 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java @@ -9,9 +9,9 @@ //十六进制的字符串转换成字节数组 byte[] bytes = hexStrToBinaryStr(msg); //计算CRC8 - byte crc8 = CRC8(bytes, 0, bytes.length); - String crc8ToStr = "" + Integer.toHexString(0xff & crc8); - return crc8ToStr; +// String crc8ToStr = "" + Integer.toHexString(0xff & crc8); +// return crc8ToStr; + return null; } /** @@ -33,50 +33,5 @@ return bytes; } - /** - * CRC8 校验 多项式 x8+x2+x+1 - * - * @param b - * @param off - * @param len - * @return - */ - public static byte CRC8(final byte[] b, final int off, final int len) { - byte result = 0x00; - for (int i = 0; i < len; i++) { - result = CHECKSUM_TABLE[(result ^ (b[i + off] & 0xFF)) & 0xFF]; - } - return (byte) (result & 0xFFL); - } - - private final static byte[] CHECKSUM_TABLE = {(byte) 0x00, (byte) 0x07, (byte) 0x0e, (byte) 0x09, (byte) 0x1c, (byte) 0x1b, - (byte) 0x12, (byte) 0x15, (byte) 0x38, (byte) 0x3f, (byte) 0x36, (byte) 0x31, (byte) 0x24, (byte) 0x23, (byte) 0x2a, - (byte) 0x2d, (byte) 0x70, (byte) 0x77, (byte) 0x7e, (byte) 0x79, (byte) 0x6c, (byte) 0x6b, (byte) 0x62, (byte) 0x65, - (byte) 0x48, (byte) 0x4f, (byte) 0x46, (byte) 0x41, (byte) 0x54, (byte) 0x53, (byte) 0x5a, (byte) 0x5d, (byte) 0xe0, - (byte) 0xe7, (byte) 0xee, (byte) 0xe9, (byte) 0xfc, (byte) 0xfb, (byte) 0xf2, (byte) 0xf5, (byte) 0xd8, (byte) 0xdf, - (byte) 0xd6, (byte) 0xd1, (byte) 0xc4, (byte) 0xc3, (byte) 0xca, (byte) 0xcd, (byte) 0x90, (byte) 0x97, (byte) 0x9e, - (byte) 0x99, (byte) 0x8c, (byte) 0x8b, (byte) 0x82, (byte) 0x85, (byte) 0xa8, (byte) 0xaf, (byte) 0xa6, (byte) 0xa1, - (byte) 0xb4, (byte) 0xb3, (byte) 0xba, (byte) 0xbd, (byte) 0xc7, (byte) 0xc0, (byte) 0xc9, (byte) 0xce, (byte) 0xdb, - (byte) 0xdc, (byte) 0xd5, (byte) 0xd2, (byte) 0xff, (byte) 0xf8, (byte) 0xf1, (byte) 0xf6, (byte) 0xe3, (byte) 0xe4, - (byte) 0xed, (byte) 0xea, (byte) 0xb7, (byte) 0xb0, (byte) 0xb9, (byte) 0xbe, (byte) 0xab, (byte) 0xac, (byte) 0xa5, - (byte) 0xa2, (byte) 0x8f, (byte) 0x88, (byte) 0x81, (byte) 0x86, (byte) 0x93, (byte) 0x94, (byte) 0x9d, (byte) 0x9a, - (byte) 0x27, (byte) 0x20, (byte) 0x29, (byte) 0x2e, (byte) 0x3b, (byte) 0x3c, (byte) 0x35, (byte) 0x32, (byte) 0x1f, - (byte) 0x18, (byte) 0x11, (byte) 0x16, (byte) 0x03, (byte) 0x04, (byte) 0x0d, (byte) 0x0a, (byte) 0x57, (byte) 0x50, - (byte) 0x59, (byte) 0x5e, (byte) 0x4b, (byte) 0x4c, (byte) 0x45, (byte) 0x42, (byte) 0x6f, (byte) 0x68, (byte) 0x61, - (byte) 0x66, (byte) 0x73, (byte) 0x74, (byte) 0x7d, (byte) 0x7a, (byte) 0x89, (byte) 0x8e, (byte) 0x87, (byte) 0x80, - (byte) 0x95, (byte) 0x92, (byte) 0x9b, (byte) 0x9c, (byte) 0xb1, (byte) 0xb6, (byte) 0xbf, (byte) 0xb8, (byte) 0xad, - (byte) 0xaa, (byte) 0xa3, (byte) 0xa4, (byte) 0xf9, (byte) 0xfe, (byte) 0xf7, (byte) 0xf0, (byte) 0xe5, (byte) 0xe2, - (byte) 0xeb, (byte) 0xec, (byte) 0xc1, (byte) 0xc6, (byte) 0xcf, (byte) 0xc8, (byte) 0xdd, (byte) 0xda, (byte) 0xd3, - (byte) 0xd4, (byte) 0x69, (byte) 0x6e, (byte) 0x67, (byte) 0x60, (byte) 0x75, (byte) 0x72, (byte) 0x7b, (byte) 0x7c, - (byte) 0x51, (byte) 0x56, (byte) 0x5f, (byte) 0x58, (byte) 0x4d, (byte) 0x4a, (byte) 0x43, (byte) 0x44, (byte) 0x19, - (byte) 0x1e, (byte) 0x17, (byte) 0x10, (byte) 0x05, (byte) 0x02, (byte) 0x0b, (byte) 0x0c, (byte) 0x21, (byte) 0x26, - (byte) 0x2f, (byte) 0x28, (byte) 0x3d, (byte) 0x3a, (byte) 0x33, (byte) 0x34, (byte) 0x4e, (byte) 0x49, (byte) 0x40, - (byte) 0x47, (byte) 0x52, (byte) 0x55, (byte) 0x5c, (byte) 0x5b, (byte) 0x76, (byte) 0x71, (byte) 0x78, (byte) 0x7f, - (byte) 0x6a, (byte) 0x6d, (byte) 0x64, (byte) 0x63, (byte) 0x3e, (byte) 0x39, (byte) 0x30, (byte) 0x37, (byte) 0x22, - (byte) 0x25, (byte) 0x2c, (byte) 0x2b, (byte) 0x06, (byte) 0x01, (byte) 0x08, (byte) 0x0f, (byte) 0x1a, (byte) 0x1d, - (byte) 0x14, (byte) 0x13, (byte) 0xae, (byte) 0xa9, (byte) 0xa0, (byte) 0xa7, (byte) 0xb2, (byte) 0xb5, (byte) 0xbc, - (byte) 0xbb, (byte) 0x96, (byte) 0x91, (byte) 0x98, (byte) 0x9f, (byte) 0x8a, (byte) 0x8d, (byte) 0x84, (byte) 0x83, - (byte) 0xde, (byte) 0xd9, (byte) 0xd0, (byte) 0xd7, (byte) 0xc2, (byte) 0xc5, (byte) 0xcc, (byte) 0xcb, (byte) 0xe6, - (byte) 0xe1, (byte) 0xe8, (byte) 0xef, (byte) 0xfa, (byte) 0xfd, (byte) 0xf4, (byte) 0xf3}; } \ No newline at end of file diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java index 27c2838..6e078a3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java @@ -1,9 +1,6 @@ package com.casic.missiles.parser.safe.impl; -import cn.hutool.core.util.CharsetUtil; -import cn.hutool.crypto.symmetric.SM4; -import cn.hutool.crypto.symmetric.SymmetricCrypto; - +import com.casic.missiles.parser.safe.SafeStrategy; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; @@ -11,19 +8,44 @@ import org.bouncycastle.crypto.engines.SM4Engine; import org.bouncycastle.crypto.params.KeyParameter; import org.bouncycastle.util.encoders.Hex; - -import static cn.hutool.crypto.Mode.ECB; -import static cn.hutool.crypto.Padding.NoPadding; +import org.springframework.stereotype.Component; /** * SM4算法工具类 */ @Slf4j -public class Sm4 { +@Component("sm4") +public class Sm4 implements SafeStrategy { //加解密的字节快大小 public static final int BlockSize = 16; + @Override + public String decryption(String cipher) { + byte[] keyByte = { + 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 + }; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(keyByte); + byte[] in = Hex.decode(cipher); + byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); + String plain = EcbDecrypt(in, keyBytes); + return plain; + } + + @Override + public String encryption(String cipher) { + byte[] keyByte = { + 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 + }; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(keyByte); + byte[] in = Hex.decode(cipher); + byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); + String plain = EcbDecrypt(in, keyBytes); + return plain; + } + /** * SM4ECB加密算法,对内 * @@ -32,8 +54,6 @@ * @return */ private static byte[] ecb_encrypt(byte[] in, byte[] keyBytes) { - - SM4Engine sm4Engine = new SM4Engine(); sm4Engine.init(true, new KeyParameter(keyBytes)); byte[] out = new byte[in.length]; @@ -58,27 +78,6 @@ return cipher; } - - /** - * hutool 解密SM4 - * - * @param encodeContent - * @return - */ - public static String decode(String encodeContent) { - String key = "24ad182507479a5da3ad94d9d78ea203"; - try { - SymmetricCrypto sm4 = new SM4(ECB, NoPadding, key.getBytes()); - String decryptStr = sm4.decryptStr(encodeContent, CharsetUtil.CHARSET_UTF_8); - return decryptStr; - } catch (Exception e) { - e.printStackTrace(); - log.error("SM4解密失败"); - } - return null; - } - - /** * SM4的ECB加密算法 * @@ -129,20 +128,6 @@ return plain; } - /** - * SM4的ECB解密算法 - * - * @param cipher 输入的密文字符串 - * @param key 密钥 - * @return - */ - public static String EcbDecrypt(String cipher, String key) { - byte[] in = Hex.decode(cipher); - byte[] keyBytes = Hex.decode(key); - - String plain = EcbDecrypt(in, keyBytes); - return plain; - } /** * 主函数 @@ -151,28 +136,24 @@ */ public static void main(String[] args) { byte[] ciphertext = { + 0x4B, (byte) 0x8C, (byte) 0x9D, 0x08, (byte) 0xE4, (byte) 0xD3, 0x64, 0x42, (byte) 0xB9, (byte) 0xA5, (byte) 0xFE, (byte) 0xCD, (byte) 0x91, 0x1B, 0x38, (byte) 0xAC, (byte) 0xE9, 0x1C, (byte) 0xCD, 0x53, 0x02, (byte) 0xD7, 0x0C, (byte) 0x9B, (byte) 0x96, 0x30, 0x62, (byte) 0xE8, (byte) 0xFB, (byte) 0xEF, (byte) 0xB9, (byte) 0xFF, (byte) 0xDE, 0x19, (byte) 0x80, 0x35, 0x3E, (byte) 0x90, 0x4F, 0x2F, 0x12, 0x2B, 0x19, (byte) 0x8B, 0x6C, 0x7A, (byte) 0x85, (byte) 0xA1, (byte) 0xB1, (byte) 0x86, (byte) 0xA3, 0x7A, 0x46, 0x0C, 0x2F, (byte) 0x94, 0x4F, 0x7F, 0x2C, 0x56, 0x14, (byte) 0xF3, (byte) 0x89, (byte) 0xC3, - 0x3F, 0x20, (byte) 0xF9, (byte) 0x87, (byte) 0xA1, 0x60, (byte) 0xD9, (byte) 0xA8, (byte) 0xFD, (byte) 0xD7, (byte) 0x9B, 0x4B, 0x26, 0x06, 0x30, 0x44}; + 0x3F, 0x20, (byte) 0xF9, (byte) 0x87, (byte) 0xA1, 0x60, (byte) 0xD9, (byte) 0xA8, (byte) 0xFD, (byte) 0xD7, (byte) 0x9B, 0x4B, 0x26, 0x06, 0x30, 0x44 + }; ByteBuf in = ByteBufAllocator.DEFAULT.heapBuffer(); in.writeBytes(ciphertext); - byte[] keyByte = { 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 }; ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); - key.writeBytes(ciphertext); - String resCipherData = decode(ByteBufUtil.hexDump(in)); - ByteBuf out = ByteBufAllocator.DEFAULT.heapBuffer(); -// out.writeBytes(resCipherData); -// System.out.println(hexBytes); - System.out.println(resCipherData.toString()); -// String resPlainData = EcbDecrypt(resCipherData, key); -// System.out.println("原始明文:" + data); -// System.out.println("解密后明文:" + resPlainData); + key.writeBytes(keyByte); +// String resCipherData = EcbDecrypt(ByteBufUtil.hexDump(in), ByteBufUtil.hexDump(key)); +// System.out.println(resCipherData); } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java index 1395a51..ac5f957 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java @@ -1,7 +1,7 @@ package com.casic.missiles.parser.safe.impl; import io.netty.buffer.ByteBufUtil; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** *

@@ -14,9 +14,8 @@ * @author hyl * @version v1.0: Tea.java, v 0.1 2021/3/12 13:48 $ */ -@Service("tea") -///tea算法类 - +//tea算法类 +@Component("tea") public class Tea { public static byte[] MyTea_Encrypt(byte[] MyTeaContent, int ByteLen, byte[] MyTeakey) { @@ -99,7 +98,6 @@ // for(int i32Index = 0; i32Index < 8; i32Index++) { // System.out.print("0x" + Integer.toHexString(MyContent[i32Index]) + " "); // } - // System.out.println("密钥为:"); // for(int i32Index = 0; i32Index < 16; i32Index++) { // System.out.print("0x" + Integer.toHexString(MyKeys[i32Index]) + " "); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java index bdd0721..bd1516a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java @@ -3,7 +3,7 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.parser.sender.DataSubscribeProvider; import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponents; import org.springframework.web.util.UriComponentsBuilder; @@ -12,7 +12,7 @@ import java.util.Collections; import java.util.Map; -@Service("functionCallback") +@Component("functionCallback") public class FunctionCallback implements DataSubscribeProvider { @Resource diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java index 0b44fb9..7526de2 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.Map; -@Service("middleware") +@Component("middleware") public class MiddlewareSubscribe implements DataSubscribeProvider { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java index 5dcee3f..e2f1192 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.Map; -@Service("nosql") +@Component("nosql") public class NoSqlSubscribe implements DataSubscribeProvider { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java b/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java new file mode 100644 index 0000000..81a5324 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java @@ -0,0 +1,86 @@ +package com.casic.missiles.pojo; + +import lombok.Data; + +/** + * 协议 + */ +@Data +public class Msg { + + /** + * 前导码 + */ + private String preamble; + + /** + * 版本号 + */ + private String version; + + /** + * 内容长度 + */ + private int leng; + + /** + * 设备ID + */ + private String deviceId; + + /** + * 通讯方式 + */ + private Integer connType; + + /** + * 加密方式 + */ + private Integer encryType; + + /** + * 目标地址 + */ + private String destAddr; + + /** + * PDUType + */ + private String PDUType; + + /** + * 操作类型 + */ + private Integer operateType; + + /** + * 传输控制位 PDUType.bit7=0时,表示存在后续的访问;当PDUType.bit7=1时,表示无后续的访问。 + */ + private Integer transControlFlag; + + /** + * 设备类型 + */ + private Integer deviceType; + + /** + * 序号 + */ + private Integer seq; + + /** + * tagList + */ + private String tagList; + + /** + * OidList + */ + private String OidList; + + /** + * CRC + */ + private String CRC; + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java index 40a5265..97cc984 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java @@ -40,7 +40,7 @@ String httpContent = msg.toString(Charset.defaultCharset()); log.info(" String : " + msg.toString(Charset.defaultCharset())); String majorContent = httpContent.substring(httpContent.indexOf("{"), httpContent.lastIndexOf("}") + 1); - String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("serviceData")).get("Value")); + String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("RegistryData")).get("Value")); log.info("----------------------------------" + values); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); bufferContent.writeBytes(values.getBytes(Charset.forName("ISO-8859-1"))); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java index 1b132a7..e3ced4b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java @@ -35,7 +35,7 @@ String httpContent = msg.toString(Charset.defaultCharset()); log.info(" String : " + msg.toString(Charset.defaultCharset())); String majorContent = httpContent.substring(httpContent.indexOf("{"), httpContent.lastIndexOf("}") + 1); - String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("serviceData")).get("Value")); + String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("RegistryData")).get("Value")); log.info("----------------------------------" + values); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); bufferContent.writeBytes(values.getBytes(Charset.forName("ISO-8859-1"))); diff --git a/sensorhub-core/src/main/resources/application.properties b/sensorhub-core/src/main/resources/application.properties deleted file mode 100644 index 8b13789..0000000 --- a/sensorhub-core/src/main/resources/application.properties +++ /dev/null @@ -1 +0,0 @@ - diff --git a/sensorhub-core/src/main/resources/config/application-dev.yml b/sensorhub-core/src/main/resources/config/application-dev.yml index 4f897a8..dcc4c2d 100644 --- a/sensorhub-core/src/main/resources/config/application-dev.yml +++ b/sensorhub-core/src/main/resources/config/application-dev.yml @@ -4,9 +4,9 @@ spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true + url: jdbc:mysql://127.0.0.1:3306/sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true username: root - password: Casic203 + password: root session: store-type: redis redis: diff --git a/sensorhub-core/src/main/resources/config/application.yml b/sensorhub-core/src/main/resources/config/application.yml index ae89f9d..7965da1 100644 --- a/sensorhub-core/src/main/resources/config/application.yml +++ b/sensorhub-core/src/main/resources/config/application.yml @@ -30,6 +30,13 @@ port: 6379 password: ew5T4K3#203lwh config-prefix: 'Casic:' +#代码生成器配置 +code: + generate: + #作者 + author: cz + #待生成对象表名 + table-name: bussiness_field_config,combined_field_config sensorhub: config: port: 7091 diff --git a/sensorhub-support/pom.xml b/sensorhub-support/pom.xml index 9a71296..761601c 100644 --- a/sensorhub-support/pom.xml +++ b/sensorhub-support/pom.xml @@ -42,6 +42,12 @@ ${redis.version} + + com.baomidou + mybatis-plus-generator + ${mybatis-plus-generator.version} + + org.reflections diff --git a/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java b/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java new file mode 100644 index 0000000..515ca53 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java @@ -0,0 +1,14 @@ +package com.casic.missiles.enums; + +/** + * @author + * @date + */ +public interface FixedPropertyEnum { + + String FIXED_POSITION = "fixedPosition"; + + String TOTAL_LENGTH = "totalLength"; + + String TAIL_POSITION = "tailPosition"; +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/CombinedFieldMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CombinedFieldMapper.java new file mode 100644 index 0000000..38e8f42 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CombinedFieldMapper.java @@ -0,0 +1,15 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.CombinedFieldConfig; +import org.apache.ibatis.annotations.Mapper; + +/** + * @author cz + * + */ +@Mapper +public interface CombinedFieldMapper extends BaseMapper { + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java new file mode 100644 index 0000000..128b09d --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java @@ -0,0 +1,10 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.CommandEventConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface CommandEventMapper extends BaseMapper { + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java index 608af3a..32cc8a4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java @@ -2,48 +2,47 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.delivery.decorator.ByteDecorator; +import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @AllArgsConstructor public class FieldDecoratorManger { - private final RuleDictDao ruleDictDao; + private final RuleConfigRegistry ruleDictDao; // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 // (1)静态的业务字段是字典里面可以配置的 // (2)动态的业务字段是通过规则生成的 public String contentMerge(String ruleJson, String sceneConent, String dynamicContent) { - List ruleDictList = ruleDictDao.getRuleDictConfig(); - Map ruleDictMap = ruleDictList.stream().collect( - Collectors.toMap(RuleDict::getId, e -> e)); - List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); - for (Map ruleMap : ruleMapList) { - String ruleType = String.valueOf(ruleMap.get("ruleType")); - ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); - NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); - byteDecorator.nodeDecoratorRule(nodeDecoratorParm); - } +// List ruleDictList = ruleDictDao.getRuleDictConfig(); +// Map ruleDictMap = ruleDictList.stream().collect( +// Collectors.toMap(RuleDict::getId, e -> e)); +// List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); +// for (Map ruleMap : ruleMapList) { +// String ruleType = String.valueOf(ruleMap.get("ruleType")); +// ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); +// NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); +// byteDecorator.nodeDecoratorRule(nodeDecoratorParm); +// } return null; } - - private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { - NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() - .contents(sceneConent) - .dynamicContent(dynamicContent) - .ruletypeId(ruletypeId) - .ruleDictMap(ruleDictMap) - .build(); - return nodeDecoratorParm; - } +// +// private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { +// NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() +// .contents(sceneConent) +// .dynamicContent(dynamicContent) +// .ruletypeId(ruletypeId) +// .ruleDictMap(ruleDictMap) +// .build(); +// return nodeDecoratorParm; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java index 652970c..b204ac3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java @@ -1,56 +1,56 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@AllArgsConstructor -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", - JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Component; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Component("logicalDecorator") +//@AllArgsConstructor +//@Slf4j +//public class LogicalShiftDecorator implements ByteDecorator { +// +//// private final FieldRuleEngineMapper fieldRuleEngineMapper; +//// +//// //字节位移 +//// @Override +//// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +//// String logicalValue = ""; +//// RuleEvaluator fieldRuleEngine = new RuleEvaluator(); +//// try { +//// Map env2 = new HashMap(); +//// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +//// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +//// for (String contentId : contentIdList) { +//// RuleDict ruleDict = ruleDictMap.get(contentId); +//// if (ruleDict.getCode().contains("#")) { +//// //使用动态的值 +//// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +//// } +//// env2.put(ruleDict.getName(), ruleDict.getCode()); +//// } +//// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +//// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +//// return null; +//// } +//// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +//// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +//// return values; +//// } catch (Exception ex) { +//// log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", +//// JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +//// return null; +//// } +//// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java index 346468f..822fead 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@AllArgsConstructor -@Slf4j -public class OperationDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("optionDecorator") +//@AllArgsConstructor +//@Slf4j +//public class OperationDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //混合运算,有常量或者乘除的缩放 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java index 50fb0a7..7a8bccb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@AllArgsConstructor -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +////精度计算 +//@AllArgsConstructor +//@Registry("precisionDecorator") +//@Slf4j +//public class PrecisionDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java index da39235..27f9cc7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java @@ -1,54 +1,53 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@AllArgsConstructor -@Slf4j -public class RuleDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("ruleDecorator") +//@AllArgsConstructor +//@Slf4j +//public class RuleDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //吃我一套正则表达式 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (Exception ex) { +// log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java index 7f5cbf3..c043f97 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java @@ -2,6 +2,6 @@ import java.util.Map; -public interface ComandeEventService { +public interface ComandeEventService{ Map loadComandeEventConfig(String protocolId,String scene); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java index 476ad84..aaf1837 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java @@ -2,46 +2,46 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.dao.CommandEventDao; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @Slf4j @AllArgsConstructor -public class ComandeEventServiceImpl implements ComandeEventService { +public class ComandeEventServiceImpl implements ComandeEventRegistry { - private final CommandEventDao commandEventDao; + // private final CommandEventDao commandEventDao; // 加密bean 固定字段出现变化的字段解析,业务字段的有序内容 @Override - public Map loadComandeEventConfig(String protocolId,String sceneName) { - CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); - if (ObjectUtil.isEmpty(commandEventConfig)) { - log.error("协议{},没有配置成功接收回复配置,清排查原因"); - return null; - } - String replyJson = commandEventConfig.getReplyContentJson(); - List> replyMapList = JSONArray.parseObject(replyJson, List.class); - List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); - Map fixMap = fixList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); - List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) - .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) - .collect(Collectors.toList()); - Map commandConfigMap = new HashMap<>(); - commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); - commandConfigMap.put("fixContent", fixMap); - commandConfigMap.put("bizContent", contentList); - return commandConfigMap; + public Map loadComandeEventConfig(String protocolId, String sceneName) { +// CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); +// if (ObjectUtil.isEmpty(commandEventConfig)) { +// log.error("协议{},没有配置成功接收回复配置,清排查原因"); +// return null; +// } +// String replyJson = commandEventConfig.getReplyContentJson(); +// List> replyMapList = JSONArray.parseObject(replyJson, List.class); +// List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); +// Map fixMap = fixList.stream() +// .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); +// List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) +// .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) +// .collect(Collectors.toList()); +// Map commandConfigMap = new HashMap<>(); +// commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); +// commandConfigMap.put("fixContent", fixMap); +// commandConfigMap.put("bizContent", contentList); +// return commandConfigMap; + return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 128b09d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java deleted file mode 100644 index 4016b0b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface DatagramEventMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java deleted file mode 100644 index 597c306..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.apache.ibatis.annotations.Mapper; - -public interface FieldConfigMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java deleted file mode 100644 index a31680a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.PreRuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface PreRuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java deleted file mode 100644 index 9060a69..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface ProtocolConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java deleted file mode 100644 index 6fa6936..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java deleted file mode 100644 index 582a705..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleDict; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleDictMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java deleted file mode 100644 index 6e302c8..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.CommandEventMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Optional; - -@Component -public class CommandEventDao { - - @Resource - private CommandEventMapper commandEventMapper; - - public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId) - .eq("scene", sceneName) - .eq("enabled", 1); - List commandEventConfig = commandEventMapper.selectList(queryWrapper); - Optional optionalEventConfig = commandEventConfig.stream().findFirst(); - return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java deleted file mode 100644 index 9137e4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.FieldConfigMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class FieldConfigDao { - - @Resource - private FieldConfigMapper fieldConfigMapper; - - public FieldConfig getFieldConfigById(String fieldId) { - FieldConfig fieldConfig = fieldConfigMapper.selectById(fieldId); - return fieldConfig; - } - - public List getFieldConfigs(String protocolId,Integer isFixed) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",isFixed); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - - public List getStorageFieldConfig(String protocolId) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",1) - .eq("is_storage",1); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java deleted file mode 100644 index 67bff6b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.mapper.PreRuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class PreRuleConfigDao { - - @Resource - private PreRuleConfigMapper preRuleConfigMapper; - - public List getPreRuleList(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return preRuleConfigMapper.selectList(queryWrapper); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java deleted file mode 100644 index d69ea85..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.RuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleConfigDao { - - @Resource - private RuleConfigMapper ruleConfigMapper; - - public RuleConfig getNextRuleConfig(String ruleFields) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("parse_rule_json", ruleFields); - return ruleConfigMapper.selectOne(queryWrapper); - } - - - public List getRuleConfigById(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return ruleConfigMapper.selectList(queryWrapper); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java deleted file mode 100644 index 932c185..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.RuleDictMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleDictDao { - - @Resource - private RuleDictMapper ruleDictMapper; - - public List getRuleDictConfig() { - List ruleDictList = ruleDictMapper.selectList(null); - return ruleDictList; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java index 9f9e279..43bc4d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java @@ -10,20 +10,15 @@ import io.netty.channel.socket.nio.NioServerSocketChannel; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import javax.annotation.PreDestroy; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static cn.hutool.core.util.ClassUtil.getClasses; /** * SensorhubServer netty服务端 */ @Slf4j -@Service +@Component public class SensorhubServer { /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java index 2c79ff5..9a28c36 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java @@ -11,13 +11,13 @@ import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioSocketChannel; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClient 客户端 */ @Slf4j -@Service +@Registry public final class SensorhubClient { public static void main(String[] args) throws Exception { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java index 9774be0..477c3f7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java @@ -6,12 +6,12 @@ import io.netty.channel.socket.SocketChannel; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientChannelInitialHandler */ -@Service +@Registry public class SensorhubClientChannelInitialHandler extends ChannelInitializer { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java index 346f4b3..73560e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java @@ -5,13 +5,13 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientHandler */ @Slf4j -@Service +@Registry public class SensorhubClientHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java index 5c1c6f2..d990af5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java @@ -4,12 +4,12 @@ import com.casic.missiles.pojo.Msg; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** * SensorhubServerHandler */ -@Service +@Component public class SensorhubServerHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 67283ae..af3172c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,41 +1,37 @@ package com.casic.missiles.parser; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultProtocolConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.*; +import com.casic.missiles.registry.FieldConfigRegistry; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; -import java.nio.charset.Charset; import java.util.HashMap; import java.util.List; import java.util.Map; -@Service("genericProtocolParser") +/** + * @author + */ +@Component("genericProtocolParser") @Slf4j -@AllArgsConstructor +@RequiredArgsConstructor public class GenericProtocolParser implements ProtocolParser { - private final LeadingCodeMatcher leadingCodeMatcher; private final List frameStructDispenserList; - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorInstanceSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; // 匹配首字母前导码=> 帧结构匹配前导码=> // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 @@ -44,18 +40,19 @@ public Boolean doParseProtocol(ByteBuf byteBuf) { String protocolContent = ByteBufUtil.hexDump(byteBuf); //匹配前导码 - List preCodeConfigs = leadingCodeMatcher.matchLeadingCode(protocolContent); + List preCodeConfigs = LeadingCodeMatcher.matchFrameLeadingCode(protocolContent); //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 if (preCodeConfigs.size() == 0) { - return rematch(byteBuf,protocolContent); + return rematch(byteBuf, protocolContent); } - //暂时先取第一个 + //暂时先取第一个,提升速度,使用享元模式, 减少类的创建销毁与构建 ProtocolConfig protocolConfig = preCodeConfigs.get(0); + AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); ByteBuf wholeDatagramByte = null; //通过匹配帧结构获取完整的数据包 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, preCodeConfigs.get(0))) != null) { + if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, protocolFactory)) != null) { break; } } @@ -68,76 +65,78 @@ * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 */ - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId, wholeDatagramByte); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap, protocolId); - //选取规则对应的流程实例 - DatagramEventConfig datagramEventConfig = processorInstanceSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); + //进行规则字段解析,进行匹配规则 + RuleConfig ruleConfig = getRuleConfig(protocolFactory, wholeDatagramByte); + if (ruleConfig == null) { + return false; + } //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, wholeDatagramByte); + ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte); + //以下进行业务的规则解析,同时选定流程实例 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); + DatagramEventProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain, + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText, protocolId); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain); //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); + datagramEventProvider.storeData(bizDataMap); return true; } - private Boolean rematch(ByteBuf byteBuf,String protocolContent) { + /** + * 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 + */ + private Boolean rematch(ByteBuf byteBuf, String protocolContent) { //重置位判断 byteBuf.resetReaderIndex(); //判断重置是否前移,如果没有前移,则直接判为匹配失败 if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { return false; } else { + //递归执行 return doParseProtocol(byteBuf); } } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; + //获取匹配规则->匹配规则 + private RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + //取出其中参与逻辑provider并判空 + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); + String rulePrepareFields = protocolConfig.getRulePrepareFields(); + //固定字段 + if (StringUtils.isNotEmpty(rulePrepareFields)) { + //获取统一固定字段解析 + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + //获取该协议的字段配置,用于协议规则匹配 + List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); + //获取规则 + RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, + rulePrepareFields, protocolFieldConfigs); + return ruleConfig; + } + return null; } - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + //数据构建,获取固定字段的store和业务字段store + private Map buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + Map bizDataMap = new HashMap<>(); + Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); + Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); + bizDataMap.putAll(ruleStoreObjectMap); + bizDataMap.putAll(protocolStoreObjectMap); return bizDataMap; } - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java index 8a46e32..16ce2e5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java @@ -3,6 +3,7 @@ import io.netty.buffer.ByteBuf; public interface ProtocolParser { + Boolean doParseProtocol(ByteBuf byteBuf); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java new file mode 100644 index 0000000..f7814af --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java @@ -0,0 +1,35 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.ProtocolConfigProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.ProtocolConfig; + +/** + * 存放基本协议的的加载信息 + */ +public class AbstractProtocolConfigFactory { + private final ProtocolConfigProvider protocolConfigProvider; + private final ProtocolFieldConfigProvider protocolFieldConfigProvider; + private final RuleConfigProvider ruleConfigProvider; + + public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { + this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); + this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); + this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); + } + + public ProtocolConfigProvider getProtocolConfigProvider() { + return protocolConfigProvider; + } + + public ProtocolFieldConfigProvider getProtocolFieldConfigProvider() { + return protocolFieldConfigProvider; + } + + public RuleConfigProvider getRuleConfigProvider() { + return ruleConfigProvider; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java new file mode 100644 index 0000000..6e36147 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java @@ -0,0 +1,57 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.CombinedFieldConfigProvider; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.FieldConfigProvider; +import com.casic.missiles.parser.provider.FieldRuleConfigProvider; + +/** + * 存放规则相关的的的加载信息 + */ +public class AbstractRuleConfigFactory { + + /** + * 处理字节 + */ + private final FieldConfigProvider fieldConfigProvider; + /** + * 处理组合字节解析的解码器 + */ + private final CombinedFieldConfigProvider combinedFieldConfigProvider; + /** + * 处理负责字节解析的规则配置 + */ + private final FieldRuleConfigProvider fieldRuleConfigProvider; + /** + * 处理实例流程 + */ + private final DatagramEventProvider datagramEventProvider; + + + public AbstractRuleConfigFactory(Long ruleId) { + this.fieldConfigProvider = new FieldConfigProvider(ruleId); + this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); + this.fieldRuleConfigProvider = new FieldRuleConfigProvider(ruleId); + this.datagramEventProvider = new DatagramEventProvider(ruleId); + } + + public FieldConfigProvider getFieldConfigProvider() { + return fieldConfigProvider; + } + + public CombinedFieldConfigProvider getCombinedFieldConfigProvider() { + return combinedFieldConfigProvider; + } + + public FieldRuleConfigProvider getFieldRuleConfigProvider() { + return fieldRuleConfigProvider; + } + + public DatagramEventProvider getDatagramEventProvider() { + return datagramEventProvider; + } + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java deleted file mode 100644 index 6e1719a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.factory; - - -import com.casic.missiles.pojo.ProtocolConfig; - -import java.util.List; - -/** - * 数据库访问优化(暂时未做) - *

- * 1、初始化协议解析配置,并存放到处存放缓存,对协议基本配置进行管理 - * 2、其中流程中所有的配置都经过此类进行管理,进行调用获取,增强解析速度 - */ -public interface DatagramFactory { - - /** - * 初始化 - */ - List datagramInit(); - - /** - * 根据前导码配置匹配,模糊匹配获取所有的报文项 - */ - List match(); - - /** - * 根据前导码匹配,返回报文项 - */ - List filer(); - - /** - * 保证数据的唯一性选择器 - */ - List selectOne(); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java new file mode 100644 index 0000000..87444a0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java @@ -0,0 +1,18 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +import java.util.List; + +/** + * 直接用,还是边用边创建 + */ +public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { + + + public DefaultProtocolConfigFactory(ProtocolConfig protocolConfig) { + super(protocolConfig); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java new file mode 100644 index 0000000..cce0c7c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java @@ -0,0 +1,12 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; + +public class DefaultRuleFactory extends AbstractRuleConfigFactory { + + public DefaultRuleFactory(Long ruleId) { + super(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java deleted file mode 100644 index 9ee97e0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.casic.missiles.parser.instance; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service -@Slf4j -@AllArgsConstructor -public class GeneralProcessor { - - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; - - /** - * 统一固定字段解析=>进行规则的查询的判断 - * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 - * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 - */ - @Deprecated - public boolean parseWholeDatagram(ByteBuf buffer, ProtocolConfig protocolConfig) { - try { - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap,protocolId); - //选取规则对应的流程= - DatagramEventConfig datagramEventConfig = processorSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); - //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); - //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); - //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); - //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); - //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); - return true; - } catch (Exception ex) { - log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", - ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); - return false; - } - } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; - } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); - } - - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); - return bizDataMap; - } - - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java index 25e7ad8..6a5777e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java @@ -1,23 +1,31 @@ package com.casic.missiles.parser.instance.impl; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.mapper.DatagramEventMapper; import com.casic.missiles.pojo.DatagramEventConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.SpringContextUtil; -@Service -@AllArgsConstructor +import java.util.List; +import java.util.Optional; + +/** + * @author cz + * + */ public class DefaultProcessorInstanceSelector implements ProcessorInstanceSelector { - private final DatagramEventMapper datagramEventMapper; + private static List datagramEventConfigs; + + static { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + datagramEventConfigs = datagramEventRegistry.getDatagramEventList(); + } @Override public DatagramEventConfig getProcessorInstance(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("rule_id", protocolId); - return datagramEventMapper.selectOne(queryWrapper); + Optional optionalSelectInstance = datagramEventConfigs.stream() + .filter(e -> e.getId().equals(protocolId)).limit(1).findFirst(); + return optionalSelectInstance.isPresent() ? optionalSelectInstance.get() : null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a778671..7b56a43 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,16 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import io.netty.buffer.ByteBuf; /** - * 分析匹配情况 - * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 - * 2、匹配不成功,有后续帧,可以进行下次匹配。 - * 3、匹配不成功,无后续帧,可以进行丢弃。 + * 分析匹配情况 + * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 + * 2、匹配不成功,有后续帧,可以进行下次匹配。 + * 3、匹配不成功,无后续帧,可以进行丢弃。 */ -public interface FrameStructMatcher{ +public interface FrameStructMatcher { - ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig); + ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 05320ab..8ebea78 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,23 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.ProtocolConfigMapper; +import com.casic.missiles.parser.provider.ProtocolConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Component; import java.util.List; import java.util.stream.Collectors; -@Component -@AllArgsConstructor public class LeadingCodeMatcher { - private final ProtocolConfigMapper protocolMapper; - //** 1、首字母匹配前导码, // 2、以匹配出的前导码是否在报文中条件进行前导码的匹配二次筛选 - public List matchLeadingCode(String protocolContent){ + public static List matchFrameLeadingCode(String protocolContent){ List initialConfigs = initialMatch(protocolContent); List preCodeConfigs = initialConfigs.stream() .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) @@ -26,13 +19,16 @@ } //初始化匹配前导码内容 - private List initialMatch(String protocolContent) { - String protocolStr = protocolContent.charAt(0) + ""; - QueryWrapper queryWrapper = new QueryWrapper() - .likeRight("pre_fix", protocolStr); - List protocolConfigList = protocolMapper.selectList(queryWrapper); - return protocolConfigList; + private static List initialMatch(String protocolContent) { + String firstFrameChar = protocolContent.charAt(0) + ""; + ProtocolConfigProvider protocolConfigProvider=new ProtocolConfigProvider(firstFrameChar); + return protocolConfigProvider.getMatchList(); } + + + + + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index cf2113d..e915877 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -1,32 +1,35 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(0) -@Service +@Component public class FrameLengthMatcher implements FrameStructMatcher { - @Autowired - private FieldParser fieldParser; - //超过长度 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { String dataGramContent = ByteBufUtil.hexDump(byteBuf); - if (StringUtils.isEmpty(protocolConfig.getUnpackId()) && StringUtils.isEmpty(protocolConfig.getTailStr())) { - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + //当不存在结尾标志和拆包标志,可以直接使用长度进行匹配 + if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { if (dataGramContent.length() >= totalLength) {//等于长度返回true,超出长度,切断 - ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, protocolConfig, totalLength); + ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, totalLength); return wholeDatagramByte; } else { //读的标志位前移舍弃 @@ -38,7 +41,7 @@ return null; } - private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, Integer totalLength) { byteBuf.readBytes(totalLength); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, totalLength - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 2bfc213..d527ad0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; @@ -13,7 +13,7 @@ import lombok.AllArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.nio.charset.Charset; import java.util.Map; @@ -22,32 +22,30 @@ * 后续标志验证 */ @Order(1) -@Service +@Component @AllArgsConstructor -public class FrameMarkMatcher implements FrameStructMatcher { - - private final FieldConfigDao fieldConfigDao; - private final FieldParser fieldParser; - private final FieldResolver fieldResolverManger; +public class FrameMarkMatcher implements FrameStructMatcher, FixedPropertyEnum { //帧后续标志=>结束,进行帧的重组=>有后续,1、帧移位判别 2、继续接收帧 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig UnpackConfig = StringUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getUnpackId()); - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); - Integer upback = 0; + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); ByteBuf mergeWholeFrameByte = null; - if (!ObjectUtil.isEmpty(UnpackConfig)) { - while (hasNextFullFrame(byteBuf, protocolConfig)) { - upback = (Integer) fieldResolverManger.filedParserManger(byteBuf, UnpackConfig, null); + if (!ObjectUtil.isEmpty(unpackFlag)) { + while (hasNextFullFrame(byteBuf, protocolConfig, protocolFieldConfigProvider)) { //是否存在后续位 - if (upback == 1) {//使用esayRule + if (unpackFlag == 1) {//使用esayRule //表示可以截取 - mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolConfig, totalLength); + mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolFieldConfigProvider, protocolConfig); return mergeWholeFrameByte; } else { - byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig)); + byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig, protocolFieldConfigProvider)); } } } @@ -56,7 +54,8 @@ //选取第一个帧,将业务内容和后面部分分开 //计算数据报文-业务内容 - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolFieldConfigProvider protocolFieldConfigProvider, ProtocolConfig protocolConfig) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); //截取完整报文 byteBuf.readBytes(totalLength); ByteBuf byteBufContent = byteBuf.slice(0, byteBuf.readerIndex()); @@ -68,15 +67,15 @@ String tail = ""; System.out.println(ByteBufUtil.hexDump(byteBufContent)); //会存在多个帧拼接在一起的的情况,进行合并处理 - while (hasNextFullFrame(byteBufContent, protocolConfig)) { - Integer currentFrameLength = fieldParser.getTotalLength(protocolConfig, byteBufContent); + while (hasNextFullFrame(byteBufContent, protocolConfig, protocolFieldConfigProvider)) { + Integer currentFrameLength = protocolFieldConfigProvider.getTotalLength(byteBufContent, protocolConfig); byteBufContent.readBytes(currentFrameLength); ByteBuf currentbyteBuf = byteBufContent.slice(0, byteBufContent.readerIndex()); byteBufContent.markReaderIndex();//读的标志位前移 System.out.println(ByteBufUtil.hexDump(byteBufContent)); String hexDump = currentbyteBuf.toString(Charset.forName("ISO-8859-1")); //获取当前固定帧结构的关系map - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, currentbyteBuf); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(currentbyteBuf, protocolConfig); if (StringUtils.isEmpty(mergeFrameStr)) { //首次获取业务数据报文 mergeFrameStr += hexDump.substring(0, currentFrameFixedProperty.get("tailPosition")); @@ -95,22 +94,22 @@ /** * 获取平移到下一帧起始位置 */ - public int getNextFrameOffset(ByteBuf buffer, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, buffer); - return currentFrameFixedProperty.get("totalLength"); + public int getNextFrameOffset(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + return currentFrameFixedProperty.get(TOTAL_LENGTH); } /** * 判断是否出错进行整个帧的 */ - public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, byteBuf); + public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); //保证读取位置不在固定位置,是可变的业务内容 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("fixedPosition")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(FIXED_POSITION)) { return false; } //判断读取是否操作帧长度 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("totalLength")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(TOTAL_LENGTH)) { return false; } return true; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 76a3784..c3a1bab 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -1,50 +1,50 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.parser.instance.GeneralProcessor; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; +import io.netty.buffer.ByteBufUtil;; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(2) -@Service +@Component public class FrameTailMatcher implements FrameStructMatcher { - @Resource - private FieldConfigDao fieldConfigDao; - @Autowired - private GeneralProcessor generalProcessor; - //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig tailFieldConfig = StringUtils.isEmpty(protocolConfig.getTailStr()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getTailStr()); - if (!ObjectUtil.isEmpty(tailFieldConfig)) { - String tailStr = tailFieldConfig.getFieldName(); + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfig protocolFieldConfig = ObjectUtils.isEmpty(protocolConfig.getTailStr()) ? null : + fieldConfigProvider.getFieldConfigById(protocolConfig.getTailStr()); + if (!ObjectUtil.isEmpty(protocolFieldConfig)) { + String tailStr = protocolFieldConfig.getFieldName(); String dataGramContent = ByteBufUtil.hexDump(byteBuf); Boolean tailFlag = ByteBufUtil.hexDump(byteBuf).contains(tailStr); if (!tailFlag) { //使用esayRule return null; } else if (dataGramContent.indexOf(tailStr) < dataGramContent.length() - tailStr.length()) { Integer length = dataGramContent.indexOf(tailStr) + tailStr.length(); - ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, protocolConfig, length); + ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, length); return wholeDatagramByte; //存在粘包 } } return null; } - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer length) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, Integer length) { byteBuf.readBytes(length); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, length - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java new file mode 100644 index 0000000..5f1c177 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java @@ -0,0 +1,73 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.combined.GenericCombinedFieldResolver; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.CombinedFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class CombinedFieldConfigProvider { + + + /** + * 作为临时配置列表缓存使用 + */ + private final List combinedFieldConfigList; + private Map storeObjectMap = new HashMap<>(); + + public CombinedFieldConfigProvider(Long ruleId) { + CombinedFieldConfigRegistry combinedFieldConfigRegistry = SpringContextUtil.getBean(CombinedFieldConfigRegistry.class); + combinedFieldConfigList = combinedFieldConfigRegistry.getCombinedFieldConfigList(ruleId); + } + + public void parseDataField(RuleConfig ruleConfig, String clearZeroPlain,Map fieldConfigsMap ) { + if (showSkip()) { + return; + } + //匹配对应的数据,然后进行相关的字段解析 + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver(); + combinedFieldResolver.parseDataField(combinedFieldConfigList, byteBuf, storeObjectMap,fieldConfigsMap); + } + + + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getCombinedFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return combinedFieldConfigList.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public List getCombinedFieldConfigList() { + return combinedFieldConfigList; + } + + /* 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(combinedFieldConfigList) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java new file mode 100644 index 0000000..f3cfedc --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java @@ -0,0 +1,11 @@ +package com.casic.missiles.parser.provider; + +/** + * @author cz + * @date 2023-6-12 + */ +public class CommandEventProvider{ + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java new file mode 100644 index 0000000..70eec5e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java @@ -0,0 +1,77 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.safe.SafeStrategy; +import com.casic.missiles.parser.sender.DataSubscribeProvider; +import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class DatagramEventProvider { + + private final DatagramEventConfig processorInstance; + + public DatagramEventProvider(Long ruleId) { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + List datagramEventConfigList = + datagramEventRegistry.getDatagramEventList(ruleId); + processorInstance = this.getProcessorInstance(datagramEventConfigList); + } + + public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { + if (showSkip()) { + return null; + } + return datagramEventConfigList.get(0); + } + + // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 + public String getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap) { + String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? + processorInstance.getSafeBean() : + fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); + if (!StringUtils.isEmpty(safeName)) { + //需要加密 + SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); + String plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); + return clearComplementZero(plain); + } + return ByteBufUtil.hexDump(bizDataContent); + } + + //解密清零操作 + private String clearComplementZero(String plain) { + plain = plain.substring(0, plain.lastIndexOf("00")); + return plain; + } + + //数据发送,数据发送者暂未构建 + public void storeData(Map bizDataMap) { + DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); +// dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return ObjectUtils.isNotEmpty(processorInstance) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java new file mode 100644 index 0000000..7e1fe0a --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java @@ -0,0 +1,97 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.FieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class FieldConfigProvider { + + + private final List fieldConfigs; + private Map storeObjectMap = new HashMap<>(); +// private Map singleObjects = new ConcurrentHashMap<>(); + + public FieldConfigProvider(Long ruleId) { + FieldConfigRegistry fieldConfigRegistry = SpringContextUtil.getBean(FieldConfigRegistry.class); + fieldConfigs = fieldConfigRegistry.getFieldConfigList(ruleId); + } + + public List getFieldConfigs() { + return fieldConfigs; + } + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public Map parseDataField(RuleConfig ruleConfig, String clearZeroPlain) { + if (showSkip()) { + return null; + } + List prepareFieldConfig = prepareParseField(ruleConfig); + if (CollectionUtils.isNotEmpty(prepareFieldConfig)) { + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(fieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + return fixDataMap; + } + } + return null; + } + + /** + * 得到需要处理的业务内容 + * + * @return + */ + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return fieldConfigs.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public Map getFieldConfigsMap() { + return fieldConfigs.stream().collect( + Collectors.toMap(FieldConfig::getId, e -> e) + ); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(fieldConfigs) ? false : true; + } + + +} + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java new file mode 100644 index 0000000..817bfaf --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java @@ -0,0 +1,19 @@ +package com.casic.missiles.parser.provider; + +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.registry.FieldRuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; + +public class FieldRuleConfigProvider { + + private final List fieldRuleConfigList; + + public FieldRuleConfigProvider(Long ruleId) { + FieldRuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(FieldRuleConfigRegistry.class); + fieldRuleConfigList = ruleConfigRegistry.getFieldRuleConfigList(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java new file mode 100644 index 0000000..99a1b06 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java @@ -0,0 +1,53 @@ +package com.casic.missiles.parser.provider; + + +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.registry.ProtocolConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolConfigProvider { + + private final List protocolConfigList; + + public ProtocolConfigProvider(String firstChar) { + ProtocolConfigRegistry registry = SpringContextUtil.getBean(ProtocolConfigRegistry.class); + protocolConfigList = registry.getProtocolConfigList(firstChar); + } + + public List getMatchList() { + return protocolConfigList; + } + + /** + * 设置当前协议 + * + * @param protocolConfig + */ + public ProtocolConfigProvider(ProtocolConfig protocolConfig) { + List protocolConfigs = new ArrayList<>(); + protocolConfigs.add(protocolConfig); + protocolConfigList = protocolConfigs; + } + + /** + * 获取当前协议 + * + * @return + */ + public ProtocolConfig getCurrentProtocolConfig() { + if (this.protocolConfigList == null) { + return null; + } else { + return protocolConfigList.get(0); + } + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java new file mode 100644 index 0000000..043927d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java @@ -0,0 +1,213 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.registry.ProtocolFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolFieldConfigProvider { + + private static final String FIXED_FIELD_DS = "fixedFieldDs"; + private static final String CONTENT_FIELD_DS = "contentFieldDs"; + private static final String PROTOCOL_LENGTH = "protocolLength"; + private static final String PROTOCOL_FIELD_ID = "protocolFieldId"; + private static final String PROTOCOL_POSITION = "protocolPosition"; + + private final List protocolFieldConfigs; + private Map singleObjects = new ConcurrentHashMap<>(); + private Map storeObjectMap = new HashMap<>(); + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public ProtocolFieldConfigProvider(Long protocolId) { + ProtocolFieldConfigRegistry protocolFieldConfigRegistry = SpringContextUtil.getBean(ProtocolFieldConfigRegistry.class); + protocolFieldConfigs = protocolFieldConfigRegistry.getProtocolFieldConfigList(protocolId); + } + + public List getProtocolFieldConfigs() { + return protocolFieldConfigs; + } + + public ProtocolFieldConfig getFieldConfigById(Long fieldId) { + Optional optionalConfig = protocolFieldConfigs.stream().filter( + e -> e.getId().equals(fieldId) + ).findFirst(); + return optionalConfig.isPresent() ? optionalConfig.get() : null; + } + + public Integer getProtocolFieldValue(Long protocolFieldId, ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_FIELD_ID + protocolFieldId + ByteBufUtil.hexDump(byteBuf); + //获取缓存 + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + //加载固定长度数据集合 + Map fixDataMap = this.getProtocolDataMap(byteBuf); + ProtocolFieldConfig protocolFieldConfig = selectFieldConfig(protocolFieldId); + Integer protocolFieldValue = 0; + //获取约定字段的总长度 + if (fixDataMap.containsKey(protocolFieldConfig.getFieldName())) { + Object appointUnpackObject = fixDataMap.get(protocolFieldConfig.getFieldName()); + if (ObjectUtils.isNotEmpty(appointUnpackObject)) { + protocolFieldValue = (Integer) appointUnpackObject; + } + } + if (protocolFieldValue != null) { + //加入缓存 + if (ObjectUtils.isNotEmpty(protocolFieldValue)) { + this.singleObjects.put(catchKey, protocolFieldValue); + return protocolFieldValue; + } + } + return null; + } + + /** + * 获取帧固定位置信息 + * + * @param byteBuf + * @param protocolConfig + * @return + */ + public Map getFixedProperty(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_POSITION + protocolConfig.getId(); + if (this.singleObjects.containsKey(catchKey)) { + return (Map) singleObjects.get(catchKey); + } + Map fixedPropertyMap = new HashMap<>(); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + fixedPropertyMap = fieldParser.doGetFixedProperty(protocolFieldConfigs, this.getTotalLength(byteBuf,protocolConfig)); + if (CollectionUtils.isNotEmpty(fixedPropertyMap)) { + this.singleObjects.put(catchKey, fixedPropertyMap); + return fixedPropertyMap; + } + return fixedPropertyMap; + } + + /** + * 获取帧结构应有的总长度 + */ + public Integer getTotalLength(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_LENGTH + ByteBufUtil.hexDump(byteBuf); + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + Integer appointFrameLength = getProtocolFieldValue(protocolConfig.getTotalLengthId(), byteBuf); + if (appointFrameLength != null) { + //获取过滤的字段集合总长度 + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Integer totalFilterLength = fieldParser.getTotalFilterLength(protocolConfig, byteBuf, getFixFieldConfigMap()); + //计算总长度 + Integer totalLength = appointFrameLength + totalFilterLength; + //加入缓存 + if (ObjectUtils.isNotEmpty(totalLength)) { + this.singleObjects.put(catchKey, totalLength); + return totalLength; + } + } + return null; + } + + /** + * 获取协议有关字段解析内容 + * storeObjectMap存储代转存的数据 + * + * @return + */ + public Map getProtocolDataMap(ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(FIXED_FIELD_DS)) { + return (Map) singleObjects.get(FIXED_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(protocolFieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + this.singleObjects.put(FIXED_FIELD_DS, fixDataMap); + return fixDataMap; + } + return null; + } + + /** + * 获取业务报文内容的content字节 + * + * @param wholeDatagramByte + * @return + */ + public ByteBuf getDataContentBuf(ByteBuf wholeDatagramByte) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(CONTENT_FIELD_DS)) { + return (ByteBuf) singleObjects.get(CONTENT_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + ByteBuf bizDataByteBuf = fieldParser.getDataContentBuf(protocolFieldConfigs, wholeDatagramByte); + if (bizDataByteBuf != null) { + this.singleObjects.put(CONTENT_FIELD_DS, bizDataByteBuf); + return bizDataByteBuf; + } + return null; + } + + + private ProtocolFieldConfig selectFieldConfig(Long id) { + Optional optionalProtocolFieldConfig = this.protocolFieldConfigs.stream().filter( + e -> e.getId().equals(id) + ).findFirst(); + return optionalProtocolFieldConfig.isPresent() ? optionalProtocolFieldConfig.get() : null; + } + + + private Map getFixFieldConfigMap() { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, e -> e) + ); + return fixDataFieldMap; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(protocolFieldConfigs) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java new file mode 100644 index 0000000..dafba1c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java @@ -0,0 +1,56 @@ +package com.casic.missiles.parser.provider; + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.rule.GenericRuleResolver; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.RuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleConfigProvider { + + private final List ruleConfigs; + + public List getRuleConfigs() { + return ruleConfigs; + } + + public RuleConfigProvider(Long protocolId) { + RuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(RuleConfigRegistry.class); + ruleConfigs = ruleConfigRegistry.getRuleConfigById(protocolId); + } + + /** + * 获取规则匹配结果 + * + * @param parseFixedDataMap + * @param protocolFieldConfigs + * @return + */ + public RuleConfig doGetRule(Map parseFixedDataMap, + String ids, + List protocolFieldConfigs) { + if (showSkip()) { + return null; + } + RuleConfig ruleConfig = GenericRuleResolver.machRule(parseFixedDataMap, ids, protocolFieldConfigs, ruleConfigs); + return ruleConfig; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(ruleConfigs) ? false : true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java index 3c05891..856b399 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java @@ -1,18 +1,11 @@ package com.casic.missiles.parser.resolver; -import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.springframework.web.bind.annotation.RequestBody; -import javax.annotation.Resource; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -20,19 +13,17 @@ @Slf4j public class ByteMergeProvider { - @Resource - private FieldRuleEngineMapper fieldRuleEngineMapper; - //拿到所有的值合并到一个值 - public String resolveByteMerge(List valueList, String ruletypeId, String vaildRange) { + public static String resolveByteMerge(List valueList, String ruleTypeId, String vaildRange) { String values = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Map vaildMap = getValidRangeMap(vaildRange); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(ruletypeId); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } + //暂时不处理 +// fieldRuleEngine = fieldRuleConfigMapper.selectById(ruleTypeId); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } Map env2 = new HashMap(); for (int i = 0; i < valueList.size(); i++) { if (vaildMap.containsKey(i)) { @@ -47,7 +38,7 @@ } } - private Map getValidRangeMap(String vaildRange) { + private static Map getValidRangeMap(String vaildRange) { String[] range = vaildRange.split(","); Map vaildMap = new HashMap(); for (int i = 0; i < range.length; i++) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 8d821cd..85d6bbf 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -1,9 +1,12 @@ package com.casic.missiles.parser.resolver; +import com.casic.missiles.pojo.AbstractFieldConfig; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; import io.netty.buffer.ByteBuf; +import java.util.List; import java.util.Map; /** @@ -11,18 +14,14 @@ */ public interface FieldParser { -// Map fieldProcess(String protocolContent,); - Map dataParser(RuleConfig ruleConfig, String lightText,String protocolId); + Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength); - Map fixDataParser(String protocolId, ByteBuf buffer); + Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap); - Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf); + ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer); - ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer); - - ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer); - - Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer); + Integer getTotalFilterLength(ProtocolConfig protocolConfig, ByteBuf byteBuf, Map protocolFieldConfigMap); } + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java new file mode 100644 index 0000000..9e0c00e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java @@ -0,0 +1,52 @@ +package com.casic.missiles.parser.resolver; + +import com.casic.missiles.pojo.AbstractFieldConfig; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.util.List; + +public class FieldParserSupport { + + //分别计算bit和byte长度=> 合并长度 + protected Integer calculateLength(List fieldConfigList) { + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + Integer fixedLength = bytefixedLength + bitfixedLength / 8; + return fixedLength; + } + + //找到最大值=> 根据最大值计算业务数据下标 + protected Integer calculatePosition(List fieldConfigList) { + String rex = "[0-9]+"; + Integer max = -1; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) + && Integer.valueOf(fieldConfig.getOriginPositionByte()) > max) { + max = Integer.valueOf(fieldConfig.getOriginPositionByte()); + } + } + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) && fieldConfig.getOriginPositionByte().equals(max)) { + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + } + } + Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; + return maxFixedPosition; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java deleted file mode 100644 index dd3a6cd..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java +++ /dev/null @@ -1,170 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.ByteResolverParam; -import io.netty.buffer.ByteBuf; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -/** - * 字段解析管理总类 - */ -@Service -@Slf4j -@AllArgsConstructor -public class FieldResolver extends ByteMergeProvider { - - //1、字段截取 => 2、简单的字节解析和复杂的字节解析 - public Object filedParserManger(ByteBuf byteBuf, FieldConfig fieldConfig, Integer maxFixedPosition) { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - //最大固定位置不为空, - if (!ObjectUtil.isEmpty(maxFixedPosition)) { - orignPosition -= maxFixedPosition; - } - Object fieldValue = 0; - //待优化 - if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { - fieldValue = bitToResolver(byteBuf, fieldConfig); - } else { - ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); - fieldValue = parsingFields(fieldBytes, fieldConfig.getRuleJson()); - } - return fieldValue; - } - - //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, - //目前默认配置的规则设置暂不支持配置化,由实现完成 - private Object parsingFields(ByteBuf byteBuf, String ruleJson) { - Object fieldsResolveValue = null; - List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); - if (ObjectUtil.isEmpty(ruleMapList)) { - fieldsResolveValue = defaultResolveBuilder(byteBuf); - } else { - fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); - } - return fieldsResolveValue; - } - - private Object defaultResolveBuilder(ByteBuf byteBuf) { - Integer defaultResolveValue = 0; - for (int i = 0; i < byteBuf.writerIndex(); i++) { - defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; - } - return defaultResolveValue; - } - - //字段解析构建器(针对字节单位的) - //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 - // 字节归并结束或者规则结束=>继续根据规则进行判断 - private Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { - Object customizeResolveValue = null; - try { - List bytStrList = new ArrayList<>(); - //存放到数组里面 - for (int i = 0; i < byteBuf.writerIndex(); i++) { - bytStrList.add(byteBuf.readByte()); - } - int i = 0; - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - customizeResolveValue = this.resolveByteMerge(bytStrList, ruletypeId,vaildRange); - break; - } else { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - List tempBytStr = new ArrayList<>(); - for (int k = 0; i < bytStrList.size(); i++) { - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(k) - .value(bytStrList.get(k)) - .ruletypeId(ruletypeId).build(); - tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); - } - bytStrList = tempBytStr; - } - i++; - } - //字节归并到一起=>继续根据规则进行判断 - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(customizeResolveValue) - .ruletypeId(ruletypeId).build(); - customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(customizeResolveValue)); - return customizeResolveValue; - } catch (RuntimeException ex) { - log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); - return null; - } - } - - /** - * 1、单个字节情况表示字段 - * 2、多字节情况表示字段(暂未处理) - */ - private Object bitToResolver(ByteBuf byteBuf, FieldConfig fieldConfig) { - Object fieldValue = new Object(); - try { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - byte fields = 0x00; - if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); - } else { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); - } - - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { - if (!StringUtils.isEmpty(fieldConfig.getExactOrignPosition())) { - fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getExactOrignPosition())).byteValue() - >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); - } else { - fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); - } - } else { - fieldValue = Integer.valueOf(fields & 0xff); - } - if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { - return fieldValue; - } - List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); - int i = 0; - //字节归并到一起=>继续根据规则进行判断 - while (i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(fieldValue) - .ruletypeId(ruletypeId).build(); - fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(fieldValue)); - return fieldValue; - } catch (RuntimeException ex) { - log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); - return null; - } - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java new file mode 100644 index 0000000..1d2aeab --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java @@ -0,0 +1,36 @@ +package com.casic.missiles.parser.resolver.bytes; + +import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.mapper.FieldRuleConfigMapper; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.pojo.ByteResolverParam; +import com.googlecode.aviator.AviatorEvaluator; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; +//转换规则 +@Component("convert") +@AllArgsConstructor +@Slf4j +public class ByteRuleResolver implements ByteResolver { + + private final FieldRuleConfigMapper fieldRuleConfigMapper; + + @Override + public Object resolveOperationRule(ByteResolverParam byteResolverParam){ + FieldRuleConfig fieldRuleEngine=fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); + if(ObjectUtil.isEmpty(fieldRuleEngine)){ + return byteResolverParam.getValue(); + } + String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); + Map env2 = new HashMap(); + env2.put("value", (byte) byteResolverParam.getValue()); + String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); + return values; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java index 103821c..786b71c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java @@ -2,34 +2,34 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("logicalShift") +@Component("logicalShift") @AllArgsConstructor @Slf4j public class LogicalShiftResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //字节位移 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { Integer index = byteResolverParam.getIndex(); - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return byteResolverParam.getValue(); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java index 476747d..01149bd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("operation") +@Component("operation") @AllArgsConstructor @Slf4j public class OperationResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //混合运算,有常量或者乘除的缩放 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java index 0b82cf4..79abcce 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.casic.missiles.pojo.ByteResolverParam; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; //精度计算 -@Service("precision") +@Component("precision") @AllArgsConstructor @Slf4j public class PrecisionResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java deleted file mode 100644 index 5c3f332..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; -//转换规则 -@Service("convert") -@AllArgsConstructor -@Slf4j -public class RuleResolver implements ByteResolver { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam){ - RuleEvaluator fieldRuleEngine=fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); - if(ObjectUtil.isEmpty(fieldRuleEngine)){ - return byteResolverParam.getValue(); - } - String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); - Map env2 = new HashMap(); - env2.put("value", (byte) byteResolverParam.getValue()); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java new file mode 100644 index 0000000..d3bbd91 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java @@ -0,0 +1,15 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; + +import java.util.List; +import java.util.Map; +// 前导码匹配->长度字段 +public interface AbstractCombinedFieldProcessor { + + Map invoke(Map map, ByteBuf byteBuf, List combinedFieldConfigList, + Map fieldConfigsMap, Map storeObjectMap); + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java new file mode 100644 index 0000000..03c8480 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java @@ -0,0 +1,59 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-13 + */ +//依次递增进行数据的解析, +public class GenericCombinedFieldResolver { + + + //通过查询,字段长度长度随机 + public void parseDataField(List combinedFieldConfigList, ByteBuf byteBuf, + Map storeObjectMap, Map fieldConfigsMap) { + Integer frameLength = Integer.valueOf(ByteBufUtil.hexDump(byteBuf)); + //添加前置处理器 + com.casic.missiles.util.ClassUtil classUtil = new com.casic.missiles.util.ClassUtil(); + List abstractCombinedProcessors = classUtil.getSubClassList(AbstractCombinedFieldProcessor.class); + + Map fieldFixedMap = combinedFieldLeadCodeMap(combinedFieldConfigList); + //frameLength + Map combinedProcessorFields = null; + while (byteBuf.readableBytes() < frameLength) { + //一直处理 + for (AbstractCombinedFieldProcessor abstractCombinedProcessor : abstractCombinedProcessors) { + combinedProcessorFields = abstractCombinedProcessor.invoke(combinedProcessorFields, byteBuf, + combinedFieldConfigList, + fieldConfigsMap, storeObjectMap); + if (combinedProcessorFields == null || byteBuf.readableBytes() < frameLength) { + return; + } + } + + } + } + + /** + * 取出前导码匹配集合 + */ + private Map combinedFieldLeadCodeMap(List combinedFieldConfigList) { + Map fieldFixedMap = combinedFieldConfigList + .stream() + .collect(Collectors.toMap(CombinedFieldConfig::getPrefixCode, e -> e)); + return fieldFixedMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java new file mode 100644 index 0000000..643a934 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java @@ -0,0 +1,100 @@ +package com.casic.missiles.parser.resolver.fields; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.FieldParserSupport; +import com.casic.missiles.pojo.*; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 保存使用时最基本的信息,并且使用原型模式 + */ +@Slf4j +public class DefaultProtocolFieldParser extends FieldParserSupport implements FieldParser, FixedPropertyEnum { + + //通过传入的配置和报文进行字段解析 + @Override + public Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap) { + Map dataMap = new HashMap<>(); + for (AbstractFieldConfig protocolFieldConfig : protocolFieldConfigs) { + if (!ObjectUtils.isEmpty(protocolFieldConfig.getOriginPositionByte())) { + Object fieldValue = FieldResolver.parseField(buffer, protocolFieldConfig, null); + if (protocolFieldConfig.getIsStorage() == 1) { + storeObjectMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + dataMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + } + return dataMap; + } + + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength) { + Map fixedPropertyMap = new HashMap<>(); + Integer fixedLength = calculateLength(protocolFieldConfigs); + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + fixedPropertyMap.put(FIXED_POSITION, maxFixedPosition); + fixedPropertyMap.put(TOTAL_LENGTH, totalLength); + fixedPropertyMap.put(TAIL_POSITION, totalLength - fixedLength + maxFixedPosition); + return fixedPropertyMap; + } + + //** 获取业务内容的byteBuf + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer) { + //计算固定长度 + Integer fixedLength = calculateLength(protocolFieldConfigs); + //总长度获取 + String lightText = buffer.toString(Charset.forName("ISO-8859-1")); + Integer totalLength = lightText.length(); + //计算固定长度最大长度 + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + //计算数据报文内容 + ByteBuf bizDataFields = buffer.slice(maxFixedPosition - 1, (totalLength - fixedLength)); + return bizDataFields; + } + + /** + * 获取过滤字段的长度 + */ + @Override + public Integer getTotalFilterLength(ProtocolConfig protocolConfig, + ByteBuf byteBuf, + Map protocolFieldConfigMap) { + if (ByteBufUtil.hexDump(byteBuf).equals("")) { + return 0; + } + int totalFilterLength = 0; + String filterFields = protocolConfig.getTotalLengthFilterFields(); + try { + if (!StringUtils.isEmpty(filterFields)) { + String[] filterFieldList = filterFields.split(","); + for (String filterFieldId : filterFieldList) { + if (StringUtils.isNotEmpty(filterFieldId)) { + ProtocolFieldConfig fieldConfig = protocolFieldConfigMap.get(Long.valueOf(filterFieldId)); + //这里都是按字节计算,没有对位进行区分,可能会出现错误 + // 如果对位有需求,需要进一步跟进 + totalFilterLength += fieldConfig.getOffsetLength(); + } + } + } + return totalFilterLength; + } catch (Exception ex) { + log.error("报文确认分发阶段,获取报文总长度过滤长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); + } + return totalFilterLength; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java new file mode 100644 index 0000000..d51e887 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java @@ -0,0 +1,169 @@ +package com.casic.missiles.parser.resolver.fields; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.parser.resolver.ByteMergeProvider; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.AbstractFieldConfig; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.pojo.ByteResolverParam; +import io.netty.buffer.ByteBuf; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * 字段解析管理总类 + */ +@Slf4j +public class FieldResolver extends ByteMergeProvider { + + //1、字段截取 => 2、简单的字节解析和复杂的字节解析 + public static Object parseField(ByteBuf byteBuf,AbstractFieldConfig fieldConfig, Integer maxFixedPosition) { + Integer orignPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + //最大固定位置不为空, + if (!ObjectUtil.isEmpty(maxFixedPosition)) { + orignPosition -= maxFixedPosition; + } + Object fieldValue = 0; + //待优化 + if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { + fieldValue = doParseBitField(byteBuf, fieldConfig); + } else { + ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); + fieldValue = doParseByteField(fieldBytes, fieldConfig.getRuleJson()); + } + return fieldValue; + } + + //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, + //目前默认配置的规则设置暂不支持配置化,由实现完成 + private static Object doParseByteField(ByteBuf byteBuf, String ruleJson) { + Object fieldsResolveValue = null; + List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); + if (ObjectUtil.isEmpty(ruleMapList)) { + fieldsResolveValue = defaultResolveBuilder(byteBuf); + } else { + fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); + } + return fieldsResolveValue; + } + + private static Object defaultResolveBuilder(ByteBuf byteBuf) { + Integer defaultResolveValue = 0; + for (int i = 0; i < byteBuf.writerIndex(); i++) { + defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; + } + return defaultResolveValue; + } + + //字段解析构建器(针对字节单位的) + //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 + // 字节归并结束或者规则结束=>继续根据规则进行判断 + private static Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { + Object customizeResolveValue = null; + try { + List bytStrList = new ArrayList<>(); + //存放到数组里面 + for (int i = 0; i < byteBuf.writerIndex(); i++) { + bytStrList.add(byteBuf.readByte()); + } + int i = 0; + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { + if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + customizeResolveValue = resolveByteMerge(bytStrList, ruletypeId, vaildRange); + break; + } else { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + List tempBytStr = new ArrayList<>(); + for (int k = 0; i < bytStrList.size(); i++) { + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(k) + .value(bytStrList.get(k)) + .ruletypeId(ruletypeId).build(); + tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); + } + bytStrList = tempBytStr; + } + i++; + } + //字节归并到一起=>继续根据规则进行判断 + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(null) + .value(customizeResolveValue) + .ruletypeId(ruletypeId).build(); + customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); + i++; + } + System.out.println(JSON.toJSON(customizeResolveValue)); + return customizeResolveValue; + } catch (RuntimeException ex) { + log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); + return null; + } + } + + /** + * 1、单个字节情况表示字段 + * 2、多字节情况表示字段(暂未处理) + */ + private static Object doParseBitField(ByteBuf byteBuf,AbstractFieldConfig fieldConfig) { + Object fieldValue = new Object(); + try { + Integer orignPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + byte fields = 0x00; + if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { + fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); + } else { + fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); + } + + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { + if (!StringUtils.isEmpty(fieldConfig.getOriginPositionBit())) { + fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getOriginPositionBit())).byteValue() + >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); + } else { + fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); + } + } else { + fieldValue = Integer.valueOf(fields & 0xff); + } + if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { + return fieldValue; + } + List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); + int i = 0; + //字节归并到一起=>继续根据规则进行判断 + while (i < ruleMapList.size()) { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(null) + .value(fieldValue) + .ruletypeId(ruletypeId).build(); + fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); + i++; + } + System.out.println(JSON.toJSON(fieldValue)); + return fieldValue; + } catch (RuntimeException ex) { + log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); + return null; + } + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java deleted file mode 100644 index 35ae3d0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java +++ /dev/null @@ -1,183 +0,0 @@ -package com.casic.missiles.parser.resolver.fields; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufAllocator; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; -import org.springframework.util.ObjectUtils; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service("standard") -@AllArgsConstructor -@Slf4j -public class StandardFieldParser implements FieldParser { - - private final FieldConfigDao fieldConfigDao; - private final FieldResolver fieldResolver; - - //数据解析 - @Override - public Map dataParser(RuleConfig ruleConfig, String lightText, String protocolId) { - String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); - ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); - bufferContent.writeBytes(lightText.getBytes(Charset.forName("ISO-8859-1"))); - Map dataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - for (String dataFieldId : dataFieldIds) { - FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(dataFieldId); - if (!ObjectUtils.isEmpty(fieldConfig)) { - dataMap.put(fieldConfig.getFieldName(), String.valueOf(fieldResolver.filedParserManger(bufferContent, fieldConfig, maxFixedPosition))); - } - } - return dataMap; - } - - //数据解析 - @Override - public Map fixDataParser(String protocolId, ByteBuf buffer) { - List dataFieldIdList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Map dataMap = new HashMap<>(); - for (FieldConfig dataField : dataFieldIdList) { - if (!ObjectUtils.isEmpty(dataField.getOrignPosition())) { - Object fieldValue = (Integer) fieldResolver.filedParserManger(buffer, dataField, null); - dataMap.put(dataField.getFieldName(), fieldValue); - } - } - return dataMap; - } - - @Override - public Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf) { - if (ByteBufUtil.hexDump(byteBuf).equals("")) { - return 0; - } - String filterFields = protocolConfig.getTotalLengthFilterField(); - Integer totalLength = 0; - try { - FieldConfig totalFieldConfig = fieldConfigDao.getFieldConfigById(protocolConfig.getTotalLengthId()); - int totalFilterLength = 0; - if (!StringUtils.isEmpty(filterFields)) { - String[] filterFieldList = filterFields.split(","); - for (String filterField : filterFieldList) { - FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(filterField); - //这里都是按字节计算,没有对位进行区分,可能会出现错误 - - // 如果对位有需求,需要进一步跟进 - totalFilterLength += fieldConfig.getOffsetLength(); - } - } - totalLength = (Integer) fieldResolver.filedParserManger(byteBuf, totalFieldConfig, null) + totalFilterLength; - } catch (Exception ex) { - log.error("报文确认分发阶段,获取报文总长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); - } - return totalLength; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer) { - //业务内容 - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - String protocolId = String.valueOf(protocolConfig.getId()); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - //计算固定长度 - Integer fixedLength = calculateLength(fieldConfigList); -// Integer totalLength = this.getTotalLength(protocolConfig, buffer); - //总长度获取 - Integer totalLength = lightText.length(); - //计算固定长度最大长度 - Integer maxFixedPosition = calculatePosition(fieldConfigList); -// buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - //计算数据报文内容 - ByteBuf bizDataFields = buffer.slice(maxFixedPosition-1, (totalLength - fixedLength)); - return bizDataFields; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer) { - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - String protocolId = String.valueOf(protocolConfig.getId()); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer fixedLength = calculateLength(fieldConfigList); -// Integer totalLength = this.getTotalLength(protocolConfig, buffer); - Integer totalLength = lightText.length(); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - ByteBuf fixDataFields = buffer.slice(0, maxFixedPosition); - return fixDataFields; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer) { - String protocolId = String.valueOf(protocolConfig.getId()); - Map fixedPropertyMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer fixedLength = calculateLength(fieldConfigList); - Integer totalLength = this.getTotalLength(protocolConfig, buffer); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - fixedPropertyMap.put("fixedPosition", maxFixedPosition); - fixedPropertyMap.put("totalLength", totalLength); - fixedPropertyMap.put("tailPosition", totalLength - fixedLength + maxFixedPosition); - return fixedPropertyMap; - } - - //分别计算bit和byte长度=> 合并长度 - private Integer calculateLength(List fieldConfigList) { - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (FieldConfig fieldConfig : fieldConfigList) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - Integer fixedLength = bytefixedLength + bitfixedLength / 8; - return fixedLength; - } - - //找到最大值=> 根据最大值计算业务数据下标 - private Integer calculatePosition(List fieldConfigList) { - String rex = "[0-9]+"; - Integer max = -1; - for (FieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOrignPosition()) - && Integer.valueOf(fieldConfig.getOrignPosition()) > max) { - max = Integer.valueOf(fieldConfig.getOrignPosition()); - } - } - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (FieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOrignPosition()) && fieldConfig.getOrignPosition().equals(max)) { - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - } - } - Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; - return maxFixedPosition; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java new file mode 100644 index 0000000..d4ec6c7 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java @@ -0,0 +1,76 @@ +package com.casic.missiles.parser.rule; + +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import org.apache.commons.lang3.StringUtils; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class GenericRuleResolver { + + //根据前置字段的值,找到指定的规则 + //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 + //=>循环判断=>通过规则得到业务字段 + public static RuleConfig machRule(Map fixDataMap, + String ids, + List protocolFieldConfigs, + List ruleConfigs) { + List preRuleConfigList = getPreRuleList(ids, protocolFieldConfigs); + //获取前置规则字段 + final Map metaDataMap = getPreRuleFields(preRuleConfigList, fixDataMap); + //准备固定的字段集合 + Map fixDataFieldMap = getFixDataFieldMap(protocolFieldConfigs); + return RuleResolverCore.doMachRule(ruleConfigs, metaDataMap, fixDataMap, fixDataFieldMap); + } + + private static Map getFixDataFieldMap(List protocolFieldConfigs) { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, ProtocolFieldConfig::getFieldName) + ); + return fixDataFieldMap; + } + + + /** + * 查询前置规则的字段配置 + * + * @param ids + * @return + */ + private static List getPreRuleList(String ids, List protocolFieldConfigs) { + String[] idList = ids.split(","); + Map prepareMaps = new HashMap<>(); + for (String id : idList) { + if (StringUtils.isNotEmpty(id)) { + prepareMaps.put(Long.valueOf(id), ""); + } + } + List preRuleConfigList = protocolFieldConfigs + .stream() + .filter(e -> prepareMaps.containsKey(e.getId())) + .collect(Collectors.toList()); + return preRuleConfigList; + } + + /** + * 获取前置规则解析字段 + */ + private static Map getPreRuleFields(List preRuleFieldConfigList, Map fixDataMap) { + Map ruleFieldMap = new HashMap<>(); + preRuleFieldConfigList.stream() + .forEach( + preRuleFieldConfig -> { + String fieldName = preRuleFieldConfig.getFieldName(); + if (fixDataMap.containsKey(fieldName)) { + ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); + } + } + ); + return ruleFieldMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java new file mode 100644 index 0000000..baae7e8 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -0,0 +1,68 @@ +package com.casic.missiles.parser.rule; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.casic.missiles.pojo.RuleConfig; + +import java.util.*; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleResolverCore { + + + public static RuleConfig doMachRule(List ruleConfigList, Map metaDataMap, + Map fixDataMap, + Map fixDataFieldMap) { + Optional ruleConfigOptional = ruleConfigList.stream() + .filter(ruleConfig -> machRuleConfig( + JSON.parseObject(ruleConfig.getMatchRuleJson(), Map.class), metaDataMap)) + .findFirst(); + if (ObjectUtil.isEmpty(ruleConfigOptional)) { + return null; + } + String[] ruleFields = ruleConfigOptional.get().getDataFieldIds().split(","); + Map ruleMetaDataMap = getRuleFields(ruleFields, fixDataMap, fixDataFieldMap); + //递归选定解析规则,进行规则解析 + if (!ruleConfigOptional.get().getIsFinishMatch().equals("1")) { + //递归选定规则 + doMachRule(ruleConfigList, ruleMetaDataMap, fixDataMap, fixDataFieldMap); + } + return ruleConfigOptional.get(); + } + + + private static Map getRuleFields(String[] preRuleConfigList, Map fixedDataMap, + Map fixedFieldMap) { + Map ruleFieldMap = new HashMap<>(); + for (String preRuleConfigId : preRuleConfigList) { + String fieldName = fixedFieldMap.get(preRuleConfigId); + if (fixedDataMap.containsKey(fieldName)) { + ruleFieldMap.put(fieldName, String.valueOf(fixedDataMap.get(fieldName))); + } + } + return ruleFieldMap; + } + + + //匹配规则配置 + private static Boolean machRuleConfig(Map ruleMap, Map metaDataMap) { + if (ruleMap == null || metaDataMap == null) { + return null; + } + //所有的字段在规则里面必须有有配置 + for (String key : metaDataMap.keySet()) { + if (ruleMap.containsKey(key)) { + if (!ruleMap.get(key).equals(metaDataMap.get(key))) { + return false; + } + } else { + return false; + } + } + return true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java deleted file mode 100644 index 664088d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java +++ /dev/null @@ -1,92 +0,0 @@ -package com.casic.missiles.parser.rule; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.mapper.dao.PreRuleConfigDao; -import com.casic.missiles.mapper.dao.RuleConfigDao; -import lombok.AllArgsConstructor; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.*; -import java.util.stream.Collectors; - -@Service -@AllArgsConstructor -public class RulerProvider { - - private final FieldConfigDao fieldConfigDao; - private final PreRuleConfigDao preRuleConfigDao; - private final RuleConfigDao ruleConfigDao; - - //根据前置字段的值,找到指定的规则 - //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 - //=>循环判断=>通过规则得到业务字段 - public RuleConfig ruleConfig(Map fixDataMap, String protocolId) { - //批量获取规则 - List preRuleConfigList = preRuleConfigDao.getPreRuleList(protocolId); - //获取固定字段 - Map fixFieldMap = getAllFieldMap(protocolId); - //获取前置规则字段 - final String preRuleFields = getPreRuleFields(preRuleConfigList, fixDataMap, fixFieldMap); - List ruleConfigList = ruleConfigDao.getRuleConfigById(protocolId); - Optional ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig ->preRuleFields.equals( ruleConfig.getParseRuleJson())).findFirst(); - //递归选定解析规则,进行规则解析 - while (!ObjectUtil.isEmpty(ruleConfigOptional) && !ruleConfigOptional.get().getIsBizField().equals("1")) { - String ruleFields = getRuleFields(ruleConfigOptional.get().getDataFieldIds().split(","), fixDataMap, fixFieldMap); - ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig -> ruleConfig.getParseRuleJson().equals(ruleFields)).findFirst(); - } - return ruleConfigOptional.get(); - } - - /** - * 获取前置规则解析字段 - */ - private String getPreRuleFields(List preRuleConfigList, Map fixDataMap, Map fixFieldMap) { - Map ruleFieldMap= new HashMap<>(); - preRuleConfigList.stream() - .forEach( - preRuleConfig -> { - String fieldName = fixFieldMap.get(Long.valueOf(preRuleConfig.getRuleFieldId())); - if (fixDataMap.containsKey(fieldName)) { - ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); - } - } - ); - return JSONObject.toJSONString(ruleFieldMap); - } - - private Map getAllFieldMap(String protocolId) { - List fieldList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Map fixFieldMap = fieldList.stream().collect( - Collectors.toMap(FieldConfig::getId, FieldConfig::getFieldName) - ); - return fixFieldMap; - } - - private String getRuleFields(String[] preRuleConfigList, Map fixDataMap, Map fixFieldMap) { - Map ruleFieldMap= new HashMap<>(); - for (String preRuleConfigId : preRuleConfigList) { - String fieldName = fixFieldMap.get(preRuleConfigId); - if (fixDataMap.containsKey(fieldName)) { - ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); - } - } - return JSONObject.toJSONString(ruleFieldMap); - } - - //弃置 - private String ListToString(List ruleFieldList) { - String ruleFields = ""; - for (String ruleField : ruleFieldList) { - ruleFields += ruleField + ","; - } - ruleFields = StringUtils.isEmpty(ruleFields) ? ruleFields : ruleFields.substring(0, ruleFields.length() - 1); - return ruleFields; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java index 6177e10..bfa87a5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java @@ -2,7 +2,7 @@ public interface SafeStrategy { - String decryption(byte[] bytes); + String decryption(String cipher); String encryption(String lightText); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java index 618716c..6236302 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java @@ -9,9 +9,9 @@ //十六进制的字符串转换成字节数组 byte[] bytes = hexStrToBinaryStr(msg); //计算CRC8 - byte crc8 = CRC8(bytes, 0, bytes.length); - String crc8ToStr = "" + Integer.toHexString(0xff & crc8); - return crc8ToStr; +// String crc8ToStr = "" + Integer.toHexString(0xff & crc8); +// return crc8ToStr; + return null; } /** @@ -33,50 +33,5 @@ return bytes; } - /** - * CRC8 校验 多项式 x8+x2+x+1 - * - * @param b - * @param off - * @param len - * @return - */ - public static byte CRC8(final byte[] b, final int off, final int len) { - byte result = 0x00; - for (int i = 0; i < len; i++) { - result = CHECKSUM_TABLE[(result ^ (b[i + off] & 0xFF)) & 0xFF]; - } - return (byte) (result & 0xFFL); - } - - private final static byte[] CHECKSUM_TABLE = {(byte) 0x00, (byte) 0x07, (byte) 0x0e, (byte) 0x09, (byte) 0x1c, (byte) 0x1b, - (byte) 0x12, (byte) 0x15, (byte) 0x38, (byte) 0x3f, (byte) 0x36, (byte) 0x31, (byte) 0x24, (byte) 0x23, (byte) 0x2a, - (byte) 0x2d, (byte) 0x70, (byte) 0x77, (byte) 0x7e, (byte) 0x79, (byte) 0x6c, (byte) 0x6b, (byte) 0x62, (byte) 0x65, - (byte) 0x48, (byte) 0x4f, (byte) 0x46, (byte) 0x41, (byte) 0x54, (byte) 0x53, (byte) 0x5a, (byte) 0x5d, (byte) 0xe0, - (byte) 0xe7, (byte) 0xee, (byte) 0xe9, (byte) 0xfc, (byte) 0xfb, (byte) 0xf2, (byte) 0xf5, (byte) 0xd8, (byte) 0xdf, - (byte) 0xd6, (byte) 0xd1, (byte) 0xc4, (byte) 0xc3, (byte) 0xca, (byte) 0xcd, (byte) 0x90, (byte) 0x97, (byte) 0x9e, - (byte) 0x99, (byte) 0x8c, (byte) 0x8b, (byte) 0x82, (byte) 0x85, (byte) 0xa8, (byte) 0xaf, (byte) 0xa6, (byte) 0xa1, - (byte) 0xb4, (byte) 0xb3, (byte) 0xba, (byte) 0xbd, (byte) 0xc7, (byte) 0xc0, (byte) 0xc9, (byte) 0xce, (byte) 0xdb, - (byte) 0xdc, (byte) 0xd5, (byte) 0xd2, (byte) 0xff, (byte) 0xf8, (byte) 0xf1, (byte) 0xf6, (byte) 0xe3, (byte) 0xe4, - (byte) 0xed, (byte) 0xea, (byte) 0xb7, (byte) 0xb0, (byte) 0xb9, (byte) 0xbe, (byte) 0xab, (byte) 0xac, (byte) 0xa5, - (byte) 0xa2, (byte) 0x8f, (byte) 0x88, (byte) 0x81, (byte) 0x86, (byte) 0x93, (byte) 0x94, (byte) 0x9d, (byte) 0x9a, - (byte) 0x27, (byte) 0x20, (byte) 0x29, (byte) 0x2e, (byte) 0x3b, (byte) 0x3c, (byte) 0x35, (byte) 0x32, (byte) 0x1f, - (byte) 0x18, (byte) 0x11, (byte) 0x16, (byte) 0x03, (byte) 0x04, (byte) 0x0d, (byte) 0x0a, (byte) 0x57, (byte) 0x50, - (byte) 0x59, (byte) 0x5e, (byte) 0x4b, (byte) 0x4c, (byte) 0x45, (byte) 0x42, (byte) 0x6f, (byte) 0x68, (byte) 0x61, - (byte) 0x66, (byte) 0x73, (byte) 0x74, (byte) 0x7d, (byte) 0x7a, (byte) 0x89, (byte) 0x8e, (byte) 0x87, (byte) 0x80, - (byte) 0x95, (byte) 0x92, (byte) 0x9b, (byte) 0x9c, (byte) 0xb1, (byte) 0xb6, (byte) 0xbf, (byte) 0xb8, (byte) 0xad, - (byte) 0xaa, (byte) 0xa3, (byte) 0xa4, (byte) 0xf9, (byte) 0xfe, (byte) 0xf7, (byte) 0xf0, (byte) 0xe5, (byte) 0xe2, - (byte) 0xeb, (byte) 0xec, (byte) 0xc1, (byte) 0xc6, (byte) 0xcf, (byte) 0xc8, (byte) 0xdd, (byte) 0xda, (byte) 0xd3, - (byte) 0xd4, (byte) 0x69, (byte) 0x6e, (byte) 0x67, (byte) 0x60, (byte) 0x75, (byte) 0x72, (byte) 0x7b, (byte) 0x7c, - (byte) 0x51, (byte) 0x56, (byte) 0x5f, (byte) 0x58, (byte) 0x4d, (byte) 0x4a, (byte) 0x43, (byte) 0x44, (byte) 0x19, - (byte) 0x1e, (byte) 0x17, (byte) 0x10, (byte) 0x05, (byte) 0x02, (byte) 0x0b, (byte) 0x0c, (byte) 0x21, (byte) 0x26, - (byte) 0x2f, (byte) 0x28, (byte) 0x3d, (byte) 0x3a, (byte) 0x33, (byte) 0x34, (byte) 0x4e, (byte) 0x49, (byte) 0x40, - (byte) 0x47, (byte) 0x52, (byte) 0x55, (byte) 0x5c, (byte) 0x5b, (byte) 0x76, (byte) 0x71, (byte) 0x78, (byte) 0x7f, - (byte) 0x6a, (byte) 0x6d, (byte) 0x64, (byte) 0x63, (byte) 0x3e, (byte) 0x39, (byte) 0x30, (byte) 0x37, (byte) 0x22, - (byte) 0x25, (byte) 0x2c, (byte) 0x2b, (byte) 0x06, (byte) 0x01, (byte) 0x08, (byte) 0x0f, (byte) 0x1a, (byte) 0x1d, - (byte) 0x14, (byte) 0x13, (byte) 0xae, (byte) 0xa9, (byte) 0xa0, (byte) 0xa7, (byte) 0xb2, (byte) 0xb5, (byte) 0xbc, - (byte) 0xbb, (byte) 0x96, (byte) 0x91, (byte) 0x98, (byte) 0x9f, (byte) 0x8a, (byte) 0x8d, (byte) 0x84, (byte) 0x83, - (byte) 0xde, (byte) 0xd9, (byte) 0xd0, (byte) 0xd7, (byte) 0xc2, (byte) 0xc5, (byte) 0xcc, (byte) 0xcb, (byte) 0xe6, - (byte) 0xe1, (byte) 0xe8, (byte) 0xef, (byte) 0xfa, (byte) 0xfd, (byte) 0xf4, (byte) 0xf3}; } \ No newline at end of file diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java index 27c2838..6e078a3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java @@ -1,9 +1,6 @@ package com.casic.missiles.parser.safe.impl; -import cn.hutool.core.util.CharsetUtil; -import cn.hutool.crypto.symmetric.SM4; -import cn.hutool.crypto.symmetric.SymmetricCrypto; - +import com.casic.missiles.parser.safe.SafeStrategy; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; @@ -11,19 +8,44 @@ import org.bouncycastle.crypto.engines.SM4Engine; import org.bouncycastle.crypto.params.KeyParameter; import org.bouncycastle.util.encoders.Hex; - -import static cn.hutool.crypto.Mode.ECB; -import static cn.hutool.crypto.Padding.NoPadding; +import org.springframework.stereotype.Component; /** * SM4算法工具类 */ @Slf4j -public class Sm4 { +@Component("sm4") +public class Sm4 implements SafeStrategy { //加解密的字节快大小 public static final int BlockSize = 16; + @Override + public String decryption(String cipher) { + byte[] keyByte = { + 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 + }; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(keyByte); + byte[] in = Hex.decode(cipher); + byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); + String plain = EcbDecrypt(in, keyBytes); + return plain; + } + + @Override + public String encryption(String cipher) { + byte[] keyByte = { + 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 + }; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(keyByte); + byte[] in = Hex.decode(cipher); + byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); + String plain = EcbDecrypt(in, keyBytes); + return plain; + } + /** * SM4ECB加密算法,对内 * @@ -32,8 +54,6 @@ * @return */ private static byte[] ecb_encrypt(byte[] in, byte[] keyBytes) { - - SM4Engine sm4Engine = new SM4Engine(); sm4Engine.init(true, new KeyParameter(keyBytes)); byte[] out = new byte[in.length]; @@ -58,27 +78,6 @@ return cipher; } - - /** - * hutool 解密SM4 - * - * @param encodeContent - * @return - */ - public static String decode(String encodeContent) { - String key = "24ad182507479a5da3ad94d9d78ea203"; - try { - SymmetricCrypto sm4 = new SM4(ECB, NoPadding, key.getBytes()); - String decryptStr = sm4.decryptStr(encodeContent, CharsetUtil.CHARSET_UTF_8); - return decryptStr; - } catch (Exception e) { - e.printStackTrace(); - log.error("SM4解密失败"); - } - return null; - } - - /** * SM4的ECB加密算法 * @@ -129,20 +128,6 @@ return plain; } - /** - * SM4的ECB解密算法 - * - * @param cipher 输入的密文字符串 - * @param key 密钥 - * @return - */ - public static String EcbDecrypt(String cipher, String key) { - byte[] in = Hex.decode(cipher); - byte[] keyBytes = Hex.decode(key); - - String plain = EcbDecrypt(in, keyBytes); - return plain; - } /** * 主函数 @@ -151,28 +136,24 @@ */ public static void main(String[] args) { byte[] ciphertext = { + 0x4B, (byte) 0x8C, (byte) 0x9D, 0x08, (byte) 0xE4, (byte) 0xD3, 0x64, 0x42, (byte) 0xB9, (byte) 0xA5, (byte) 0xFE, (byte) 0xCD, (byte) 0x91, 0x1B, 0x38, (byte) 0xAC, (byte) 0xE9, 0x1C, (byte) 0xCD, 0x53, 0x02, (byte) 0xD7, 0x0C, (byte) 0x9B, (byte) 0x96, 0x30, 0x62, (byte) 0xE8, (byte) 0xFB, (byte) 0xEF, (byte) 0xB9, (byte) 0xFF, (byte) 0xDE, 0x19, (byte) 0x80, 0x35, 0x3E, (byte) 0x90, 0x4F, 0x2F, 0x12, 0x2B, 0x19, (byte) 0x8B, 0x6C, 0x7A, (byte) 0x85, (byte) 0xA1, (byte) 0xB1, (byte) 0x86, (byte) 0xA3, 0x7A, 0x46, 0x0C, 0x2F, (byte) 0x94, 0x4F, 0x7F, 0x2C, 0x56, 0x14, (byte) 0xF3, (byte) 0x89, (byte) 0xC3, - 0x3F, 0x20, (byte) 0xF9, (byte) 0x87, (byte) 0xA1, 0x60, (byte) 0xD9, (byte) 0xA8, (byte) 0xFD, (byte) 0xD7, (byte) 0x9B, 0x4B, 0x26, 0x06, 0x30, 0x44}; + 0x3F, 0x20, (byte) 0xF9, (byte) 0x87, (byte) 0xA1, 0x60, (byte) 0xD9, (byte) 0xA8, (byte) 0xFD, (byte) 0xD7, (byte) 0x9B, 0x4B, 0x26, 0x06, 0x30, 0x44 + }; ByteBuf in = ByteBufAllocator.DEFAULT.heapBuffer(); in.writeBytes(ciphertext); - byte[] keyByte = { 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 }; ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); - key.writeBytes(ciphertext); - String resCipherData = decode(ByteBufUtil.hexDump(in)); - ByteBuf out = ByteBufAllocator.DEFAULT.heapBuffer(); -// out.writeBytes(resCipherData); -// System.out.println(hexBytes); - System.out.println(resCipherData.toString()); -// String resPlainData = EcbDecrypt(resCipherData, key); -// System.out.println("原始明文:" + data); -// System.out.println("解密后明文:" + resPlainData); + key.writeBytes(keyByte); +// String resCipherData = EcbDecrypt(ByteBufUtil.hexDump(in), ByteBufUtil.hexDump(key)); +// System.out.println(resCipherData); } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java index 1395a51..ac5f957 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java @@ -1,7 +1,7 @@ package com.casic.missiles.parser.safe.impl; import io.netty.buffer.ByteBufUtil; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** *

@@ -14,9 +14,8 @@ * @author hyl * @version v1.0: Tea.java, v 0.1 2021/3/12 13:48 $ */ -@Service("tea") -///tea算法类 - +//tea算法类 +@Component("tea") public class Tea { public static byte[] MyTea_Encrypt(byte[] MyTeaContent, int ByteLen, byte[] MyTeakey) { @@ -99,7 +98,6 @@ // for(int i32Index = 0; i32Index < 8; i32Index++) { // System.out.print("0x" + Integer.toHexString(MyContent[i32Index]) + " "); // } - // System.out.println("密钥为:"); // for(int i32Index = 0; i32Index < 16; i32Index++) { // System.out.print("0x" + Integer.toHexString(MyKeys[i32Index]) + " "); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java index bdd0721..bd1516a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java @@ -3,7 +3,7 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.parser.sender.DataSubscribeProvider; import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponents; import org.springframework.web.util.UriComponentsBuilder; @@ -12,7 +12,7 @@ import java.util.Collections; import java.util.Map; -@Service("functionCallback") +@Component("functionCallback") public class FunctionCallback implements DataSubscribeProvider { @Resource diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java index 0b44fb9..7526de2 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.Map; -@Service("middleware") +@Component("middleware") public class MiddlewareSubscribe implements DataSubscribeProvider { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java index 5dcee3f..e2f1192 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.Map; -@Service("nosql") +@Component("nosql") public class NoSqlSubscribe implements DataSubscribeProvider { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java b/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java new file mode 100644 index 0000000..81a5324 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java @@ -0,0 +1,86 @@ +package com.casic.missiles.pojo; + +import lombok.Data; + +/** + * 协议 + */ +@Data +public class Msg { + + /** + * 前导码 + */ + private String preamble; + + /** + * 版本号 + */ + private String version; + + /** + * 内容长度 + */ + private int leng; + + /** + * 设备ID + */ + private String deviceId; + + /** + * 通讯方式 + */ + private Integer connType; + + /** + * 加密方式 + */ + private Integer encryType; + + /** + * 目标地址 + */ + private String destAddr; + + /** + * PDUType + */ + private String PDUType; + + /** + * 操作类型 + */ + private Integer operateType; + + /** + * 传输控制位 PDUType.bit7=0时,表示存在后续的访问;当PDUType.bit7=1时,表示无后续的访问。 + */ + private Integer transControlFlag; + + /** + * 设备类型 + */ + private Integer deviceType; + + /** + * 序号 + */ + private Integer seq; + + /** + * tagList + */ + private String tagList; + + /** + * OidList + */ + private String OidList; + + /** + * CRC + */ + private String CRC; + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java index 40a5265..97cc984 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java @@ -40,7 +40,7 @@ String httpContent = msg.toString(Charset.defaultCharset()); log.info(" String : " + msg.toString(Charset.defaultCharset())); String majorContent = httpContent.substring(httpContent.indexOf("{"), httpContent.lastIndexOf("}") + 1); - String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("serviceData")).get("Value")); + String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("RegistryData")).get("Value")); log.info("----------------------------------" + values); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); bufferContent.writeBytes(values.getBytes(Charset.forName("ISO-8859-1"))); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java index 1b132a7..e3ced4b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java @@ -35,7 +35,7 @@ String httpContent = msg.toString(Charset.defaultCharset()); log.info(" String : " + msg.toString(Charset.defaultCharset())); String majorContent = httpContent.substring(httpContent.indexOf("{"), httpContent.lastIndexOf("}") + 1); - String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("serviceData")).get("Value")); + String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("RegistryData")).get("Value")); log.info("----------------------------------" + values); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); bufferContent.writeBytes(values.getBytes(Charset.forName("ISO-8859-1"))); diff --git a/sensorhub-core/src/main/resources/application.properties b/sensorhub-core/src/main/resources/application.properties deleted file mode 100644 index 8b13789..0000000 --- a/sensorhub-core/src/main/resources/application.properties +++ /dev/null @@ -1 +0,0 @@ - diff --git a/sensorhub-core/src/main/resources/config/application-dev.yml b/sensorhub-core/src/main/resources/config/application-dev.yml index 4f897a8..dcc4c2d 100644 --- a/sensorhub-core/src/main/resources/config/application-dev.yml +++ b/sensorhub-core/src/main/resources/config/application-dev.yml @@ -4,9 +4,9 @@ spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true + url: jdbc:mysql://127.0.0.1:3306/sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true username: root - password: Casic203 + password: root session: store-type: redis redis: diff --git a/sensorhub-core/src/main/resources/config/application.yml b/sensorhub-core/src/main/resources/config/application.yml index ae89f9d..7965da1 100644 --- a/sensorhub-core/src/main/resources/config/application.yml +++ b/sensorhub-core/src/main/resources/config/application.yml @@ -30,6 +30,13 @@ port: 6379 password: ew5T4K3#203lwh config-prefix: 'Casic:' +#代码生成器配置 +code: + generate: + #作者 + author: cz + #待生成对象表名 + table-name: bussiness_field_config,combined_field_config sensorhub: config: port: 7091 diff --git a/sensorhub-support/pom.xml b/sensorhub-support/pom.xml index 9a71296..761601c 100644 --- a/sensorhub-support/pom.xml +++ b/sensorhub-support/pom.xml @@ -42,6 +42,12 @@ ${redis.version} + + com.baomidou + mybatis-plus-generator + ${mybatis-plus-generator.version} + + org.reflections diff --git a/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java b/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java new file mode 100644 index 0000000..515ca53 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java @@ -0,0 +1,14 @@ +package com.casic.missiles.enums; + +/** + * @author + * @date + */ +public interface FixedPropertyEnum { + + String FIXED_POSITION = "fixedPosition"; + + String TOTAL_LENGTH = "totalLength"; + + String TAIL_POSITION = "tailPosition"; +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/CombinedFieldMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CombinedFieldMapper.java new file mode 100644 index 0000000..38e8f42 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CombinedFieldMapper.java @@ -0,0 +1,15 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.CombinedFieldConfig; +import org.apache.ibatis.annotations.Mapper; + +/** + * @author cz + * + */ +@Mapper +public interface CombinedFieldMapper extends BaseMapper { + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java new file mode 100644 index 0000000..128b09d --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java @@ -0,0 +1,10 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.CommandEventConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface CommandEventMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java new file mode 100644 index 0000000..042eb3c --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.DatagramEventConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface DatagramEventConfigMapper extends BaseMapper { +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java index 608af3a..32cc8a4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java @@ -2,48 +2,47 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.delivery.decorator.ByteDecorator; +import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @AllArgsConstructor public class FieldDecoratorManger { - private final RuleDictDao ruleDictDao; + private final RuleConfigRegistry ruleDictDao; // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 // (1)静态的业务字段是字典里面可以配置的 // (2)动态的业务字段是通过规则生成的 public String contentMerge(String ruleJson, String sceneConent, String dynamicContent) { - List ruleDictList = ruleDictDao.getRuleDictConfig(); - Map ruleDictMap = ruleDictList.stream().collect( - Collectors.toMap(RuleDict::getId, e -> e)); - List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); - for (Map ruleMap : ruleMapList) { - String ruleType = String.valueOf(ruleMap.get("ruleType")); - ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); - NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); - byteDecorator.nodeDecoratorRule(nodeDecoratorParm); - } +// List ruleDictList = ruleDictDao.getRuleDictConfig(); +// Map ruleDictMap = ruleDictList.stream().collect( +// Collectors.toMap(RuleDict::getId, e -> e)); +// List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); +// for (Map ruleMap : ruleMapList) { +// String ruleType = String.valueOf(ruleMap.get("ruleType")); +// ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); +// NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); +// byteDecorator.nodeDecoratorRule(nodeDecoratorParm); +// } return null; } - - private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { - NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() - .contents(sceneConent) - .dynamicContent(dynamicContent) - .ruletypeId(ruletypeId) - .ruleDictMap(ruleDictMap) - .build(); - return nodeDecoratorParm; - } +// +// private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { +// NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() +// .contents(sceneConent) +// .dynamicContent(dynamicContent) +// .ruletypeId(ruletypeId) +// .ruleDictMap(ruleDictMap) +// .build(); +// return nodeDecoratorParm; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java index 652970c..b204ac3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java @@ -1,56 +1,56 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@AllArgsConstructor -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", - JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Component; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Component("logicalDecorator") +//@AllArgsConstructor +//@Slf4j +//public class LogicalShiftDecorator implements ByteDecorator { +// +//// private final FieldRuleEngineMapper fieldRuleEngineMapper; +//// +//// //字节位移 +//// @Override +//// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +//// String logicalValue = ""; +//// RuleEvaluator fieldRuleEngine = new RuleEvaluator(); +//// try { +//// Map env2 = new HashMap(); +//// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +//// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +//// for (String contentId : contentIdList) { +//// RuleDict ruleDict = ruleDictMap.get(contentId); +//// if (ruleDict.getCode().contains("#")) { +//// //使用动态的值 +//// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +//// } +//// env2.put(ruleDict.getName(), ruleDict.getCode()); +//// } +//// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +//// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +//// return null; +//// } +//// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +//// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +//// return values; +//// } catch (Exception ex) { +//// log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", +//// JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +//// return null; +//// } +//// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java index 346468f..822fead 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@AllArgsConstructor -@Slf4j -public class OperationDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("optionDecorator") +//@AllArgsConstructor +//@Slf4j +//public class OperationDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //混合运算,有常量或者乘除的缩放 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java index 50fb0a7..7a8bccb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@AllArgsConstructor -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +////精度计算 +//@AllArgsConstructor +//@Registry("precisionDecorator") +//@Slf4j +//public class PrecisionDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java index da39235..27f9cc7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java @@ -1,54 +1,53 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@AllArgsConstructor -@Slf4j -public class RuleDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("ruleDecorator") +//@AllArgsConstructor +//@Slf4j +//public class RuleDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //吃我一套正则表达式 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (Exception ex) { +// log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java index 7f5cbf3..c043f97 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java @@ -2,6 +2,6 @@ import java.util.Map; -public interface ComandeEventService { +public interface ComandeEventService{ Map loadComandeEventConfig(String protocolId,String scene); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java index 476ad84..aaf1837 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java @@ -2,46 +2,46 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.dao.CommandEventDao; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @Slf4j @AllArgsConstructor -public class ComandeEventServiceImpl implements ComandeEventService { +public class ComandeEventServiceImpl implements ComandeEventRegistry { - private final CommandEventDao commandEventDao; + // private final CommandEventDao commandEventDao; // 加密bean 固定字段出现变化的字段解析,业务字段的有序内容 @Override - public Map loadComandeEventConfig(String protocolId,String sceneName) { - CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); - if (ObjectUtil.isEmpty(commandEventConfig)) { - log.error("协议{},没有配置成功接收回复配置,清排查原因"); - return null; - } - String replyJson = commandEventConfig.getReplyContentJson(); - List> replyMapList = JSONArray.parseObject(replyJson, List.class); - List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); - Map fixMap = fixList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); - List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) - .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) - .collect(Collectors.toList()); - Map commandConfigMap = new HashMap<>(); - commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); - commandConfigMap.put("fixContent", fixMap); - commandConfigMap.put("bizContent", contentList); - return commandConfigMap; + public Map loadComandeEventConfig(String protocolId, String sceneName) { +// CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); +// if (ObjectUtil.isEmpty(commandEventConfig)) { +// log.error("协议{},没有配置成功接收回复配置,清排查原因"); +// return null; +// } +// String replyJson = commandEventConfig.getReplyContentJson(); +// List> replyMapList = JSONArray.parseObject(replyJson, List.class); +// List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); +// Map fixMap = fixList.stream() +// .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); +// List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) +// .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) +// .collect(Collectors.toList()); +// Map commandConfigMap = new HashMap<>(); +// commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); +// commandConfigMap.put("fixContent", fixMap); +// commandConfigMap.put("bizContent", contentList); +// return commandConfigMap; + return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 128b09d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java deleted file mode 100644 index 4016b0b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface DatagramEventMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java deleted file mode 100644 index 597c306..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.apache.ibatis.annotations.Mapper; - -public interface FieldConfigMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java deleted file mode 100644 index a31680a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.PreRuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface PreRuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java deleted file mode 100644 index 9060a69..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface ProtocolConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java deleted file mode 100644 index 6fa6936..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java deleted file mode 100644 index 582a705..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleDict; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleDictMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java deleted file mode 100644 index 6e302c8..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.CommandEventMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Optional; - -@Component -public class CommandEventDao { - - @Resource - private CommandEventMapper commandEventMapper; - - public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId) - .eq("scene", sceneName) - .eq("enabled", 1); - List commandEventConfig = commandEventMapper.selectList(queryWrapper); - Optional optionalEventConfig = commandEventConfig.stream().findFirst(); - return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java deleted file mode 100644 index 9137e4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.FieldConfigMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class FieldConfigDao { - - @Resource - private FieldConfigMapper fieldConfigMapper; - - public FieldConfig getFieldConfigById(String fieldId) { - FieldConfig fieldConfig = fieldConfigMapper.selectById(fieldId); - return fieldConfig; - } - - public List getFieldConfigs(String protocolId,Integer isFixed) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",isFixed); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - - public List getStorageFieldConfig(String protocolId) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",1) - .eq("is_storage",1); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java deleted file mode 100644 index 67bff6b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.mapper.PreRuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class PreRuleConfigDao { - - @Resource - private PreRuleConfigMapper preRuleConfigMapper; - - public List getPreRuleList(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return preRuleConfigMapper.selectList(queryWrapper); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java deleted file mode 100644 index d69ea85..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.RuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleConfigDao { - - @Resource - private RuleConfigMapper ruleConfigMapper; - - public RuleConfig getNextRuleConfig(String ruleFields) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("parse_rule_json", ruleFields); - return ruleConfigMapper.selectOne(queryWrapper); - } - - - public List getRuleConfigById(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return ruleConfigMapper.selectList(queryWrapper); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java deleted file mode 100644 index 932c185..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.RuleDictMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleDictDao { - - @Resource - private RuleDictMapper ruleDictMapper; - - public List getRuleDictConfig() { - List ruleDictList = ruleDictMapper.selectList(null); - return ruleDictList; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java index 9f9e279..43bc4d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java @@ -10,20 +10,15 @@ import io.netty.channel.socket.nio.NioServerSocketChannel; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import javax.annotation.PreDestroy; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static cn.hutool.core.util.ClassUtil.getClasses; /** * SensorhubServer netty服务端 */ @Slf4j -@Service +@Component public class SensorhubServer { /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java index 2c79ff5..9a28c36 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java @@ -11,13 +11,13 @@ import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioSocketChannel; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClient 客户端 */ @Slf4j -@Service +@Registry public final class SensorhubClient { public static void main(String[] args) throws Exception { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java index 9774be0..477c3f7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java @@ -6,12 +6,12 @@ import io.netty.channel.socket.SocketChannel; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientChannelInitialHandler */ -@Service +@Registry public class SensorhubClientChannelInitialHandler extends ChannelInitializer { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java index 346f4b3..73560e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java @@ -5,13 +5,13 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientHandler */ @Slf4j -@Service +@Registry public class SensorhubClientHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java index 5c1c6f2..d990af5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java @@ -4,12 +4,12 @@ import com.casic.missiles.pojo.Msg; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** * SensorhubServerHandler */ -@Service +@Component public class SensorhubServerHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 67283ae..af3172c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,41 +1,37 @@ package com.casic.missiles.parser; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultProtocolConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.*; +import com.casic.missiles.registry.FieldConfigRegistry; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; -import java.nio.charset.Charset; import java.util.HashMap; import java.util.List; import java.util.Map; -@Service("genericProtocolParser") +/** + * @author + */ +@Component("genericProtocolParser") @Slf4j -@AllArgsConstructor +@RequiredArgsConstructor public class GenericProtocolParser implements ProtocolParser { - private final LeadingCodeMatcher leadingCodeMatcher; private final List frameStructDispenserList; - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorInstanceSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; // 匹配首字母前导码=> 帧结构匹配前导码=> // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 @@ -44,18 +40,19 @@ public Boolean doParseProtocol(ByteBuf byteBuf) { String protocolContent = ByteBufUtil.hexDump(byteBuf); //匹配前导码 - List preCodeConfigs = leadingCodeMatcher.matchLeadingCode(protocolContent); + List preCodeConfigs = LeadingCodeMatcher.matchFrameLeadingCode(protocolContent); //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 if (preCodeConfigs.size() == 0) { - return rematch(byteBuf,protocolContent); + return rematch(byteBuf, protocolContent); } - //暂时先取第一个 + //暂时先取第一个,提升速度,使用享元模式, 减少类的创建销毁与构建 ProtocolConfig protocolConfig = preCodeConfigs.get(0); + AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); ByteBuf wholeDatagramByte = null; //通过匹配帧结构获取完整的数据包 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, preCodeConfigs.get(0))) != null) { + if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, protocolFactory)) != null) { break; } } @@ -68,76 +65,78 @@ * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 */ - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId, wholeDatagramByte); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap, protocolId); - //选取规则对应的流程实例 - DatagramEventConfig datagramEventConfig = processorInstanceSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); + //进行规则字段解析,进行匹配规则 + RuleConfig ruleConfig = getRuleConfig(protocolFactory, wholeDatagramByte); + if (ruleConfig == null) { + return false; + } //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, wholeDatagramByte); + ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte); + //以下进行业务的规则解析,同时选定流程实例 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); + DatagramEventProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain, + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText, protocolId); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain); //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); + datagramEventProvider.storeData(bizDataMap); return true; } - private Boolean rematch(ByteBuf byteBuf,String protocolContent) { + /** + * 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 + */ + private Boolean rematch(ByteBuf byteBuf, String protocolContent) { //重置位判断 byteBuf.resetReaderIndex(); //判断重置是否前移,如果没有前移,则直接判为匹配失败 if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { return false; } else { + //递归执行 return doParseProtocol(byteBuf); } } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; + //获取匹配规则->匹配规则 + private RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + //取出其中参与逻辑provider并判空 + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); + String rulePrepareFields = protocolConfig.getRulePrepareFields(); + //固定字段 + if (StringUtils.isNotEmpty(rulePrepareFields)) { + //获取统一固定字段解析 + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + //获取该协议的字段配置,用于协议规则匹配 + List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); + //获取规则 + RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, + rulePrepareFields, protocolFieldConfigs); + return ruleConfig; + } + return null; } - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + //数据构建,获取固定字段的store和业务字段store + private Map buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + Map bizDataMap = new HashMap<>(); + Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); + Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); + bizDataMap.putAll(ruleStoreObjectMap); + bizDataMap.putAll(protocolStoreObjectMap); return bizDataMap; } - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java index 8a46e32..16ce2e5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java @@ -3,6 +3,7 @@ import io.netty.buffer.ByteBuf; public interface ProtocolParser { + Boolean doParseProtocol(ByteBuf byteBuf); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java new file mode 100644 index 0000000..f7814af --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java @@ -0,0 +1,35 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.ProtocolConfigProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.ProtocolConfig; + +/** + * 存放基本协议的的加载信息 + */ +public class AbstractProtocolConfigFactory { + private final ProtocolConfigProvider protocolConfigProvider; + private final ProtocolFieldConfigProvider protocolFieldConfigProvider; + private final RuleConfigProvider ruleConfigProvider; + + public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { + this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); + this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); + this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); + } + + public ProtocolConfigProvider getProtocolConfigProvider() { + return protocolConfigProvider; + } + + public ProtocolFieldConfigProvider getProtocolFieldConfigProvider() { + return protocolFieldConfigProvider; + } + + public RuleConfigProvider getRuleConfigProvider() { + return ruleConfigProvider; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java new file mode 100644 index 0000000..6e36147 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java @@ -0,0 +1,57 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.CombinedFieldConfigProvider; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.FieldConfigProvider; +import com.casic.missiles.parser.provider.FieldRuleConfigProvider; + +/** + * 存放规则相关的的的加载信息 + */ +public class AbstractRuleConfigFactory { + + /** + * 处理字节 + */ + private final FieldConfigProvider fieldConfigProvider; + /** + * 处理组合字节解析的解码器 + */ + private final CombinedFieldConfigProvider combinedFieldConfigProvider; + /** + * 处理负责字节解析的规则配置 + */ + private final FieldRuleConfigProvider fieldRuleConfigProvider; + /** + * 处理实例流程 + */ + private final DatagramEventProvider datagramEventProvider; + + + public AbstractRuleConfigFactory(Long ruleId) { + this.fieldConfigProvider = new FieldConfigProvider(ruleId); + this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); + this.fieldRuleConfigProvider = new FieldRuleConfigProvider(ruleId); + this.datagramEventProvider = new DatagramEventProvider(ruleId); + } + + public FieldConfigProvider getFieldConfigProvider() { + return fieldConfigProvider; + } + + public CombinedFieldConfigProvider getCombinedFieldConfigProvider() { + return combinedFieldConfigProvider; + } + + public FieldRuleConfigProvider getFieldRuleConfigProvider() { + return fieldRuleConfigProvider; + } + + public DatagramEventProvider getDatagramEventProvider() { + return datagramEventProvider; + } + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java deleted file mode 100644 index 6e1719a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.factory; - - -import com.casic.missiles.pojo.ProtocolConfig; - -import java.util.List; - -/** - * 数据库访问优化(暂时未做) - *

- * 1、初始化协议解析配置,并存放到处存放缓存,对协议基本配置进行管理 - * 2、其中流程中所有的配置都经过此类进行管理,进行调用获取,增强解析速度 - */ -public interface DatagramFactory { - - /** - * 初始化 - */ - List datagramInit(); - - /** - * 根据前导码配置匹配,模糊匹配获取所有的报文项 - */ - List match(); - - /** - * 根据前导码匹配,返回报文项 - */ - List filer(); - - /** - * 保证数据的唯一性选择器 - */ - List selectOne(); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java new file mode 100644 index 0000000..87444a0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java @@ -0,0 +1,18 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +import java.util.List; + +/** + * 直接用,还是边用边创建 + */ +public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { + + + public DefaultProtocolConfigFactory(ProtocolConfig protocolConfig) { + super(protocolConfig); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java new file mode 100644 index 0000000..cce0c7c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java @@ -0,0 +1,12 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; + +public class DefaultRuleFactory extends AbstractRuleConfigFactory { + + public DefaultRuleFactory(Long ruleId) { + super(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java deleted file mode 100644 index 9ee97e0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.casic.missiles.parser.instance; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service -@Slf4j -@AllArgsConstructor -public class GeneralProcessor { - - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; - - /** - * 统一固定字段解析=>进行规则的查询的判断 - * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 - * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 - */ - @Deprecated - public boolean parseWholeDatagram(ByteBuf buffer, ProtocolConfig protocolConfig) { - try { - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap,protocolId); - //选取规则对应的流程= - DatagramEventConfig datagramEventConfig = processorSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); - //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); - //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); - //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); - //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); - //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); - return true; - } catch (Exception ex) { - log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", - ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); - return false; - } - } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; - } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); - } - - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); - return bizDataMap; - } - - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java index 25e7ad8..6a5777e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java @@ -1,23 +1,31 @@ package com.casic.missiles.parser.instance.impl; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.mapper.DatagramEventMapper; import com.casic.missiles.pojo.DatagramEventConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.SpringContextUtil; -@Service -@AllArgsConstructor +import java.util.List; +import java.util.Optional; + +/** + * @author cz + * + */ public class DefaultProcessorInstanceSelector implements ProcessorInstanceSelector { - private final DatagramEventMapper datagramEventMapper; + private static List datagramEventConfigs; + + static { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + datagramEventConfigs = datagramEventRegistry.getDatagramEventList(); + } @Override public DatagramEventConfig getProcessorInstance(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("rule_id", protocolId); - return datagramEventMapper.selectOne(queryWrapper); + Optional optionalSelectInstance = datagramEventConfigs.stream() + .filter(e -> e.getId().equals(protocolId)).limit(1).findFirst(); + return optionalSelectInstance.isPresent() ? optionalSelectInstance.get() : null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a778671..7b56a43 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,16 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import io.netty.buffer.ByteBuf; /** - * 分析匹配情况 - * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 - * 2、匹配不成功,有后续帧,可以进行下次匹配。 - * 3、匹配不成功,无后续帧,可以进行丢弃。 + * 分析匹配情况 + * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 + * 2、匹配不成功,有后续帧,可以进行下次匹配。 + * 3、匹配不成功,无后续帧,可以进行丢弃。 */ -public interface FrameStructMatcher{ +public interface FrameStructMatcher { - ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig); + ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 05320ab..8ebea78 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,23 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.ProtocolConfigMapper; +import com.casic.missiles.parser.provider.ProtocolConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Component; import java.util.List; import java.util.stream.Collectors; -@Component -@AllArgsConstructor public class LeadingCodeMatcher { - private final ProtocolConfigMapper protocolMapper; - //** 1、首字母匹配前导码, // 2、以匹配出的前导码是否在报文中条件进行前导码的匹配二次筛选 - public List matchLeadingCode(String protocolContent){ + public static List matchFrameLeadingCode(String protocolContent){ List initialConfigs = initialMatch(protocolContent); List preCodeConfigs = initialConfigs.stream() .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) @@ -26,13 +19,16 @@ } //初始化匹配前导码内容 - private List initialMatch(String protocolContent) { - String protocolStr = protocolContent.charAt(0) + ""; - QueryWrapper queryWrapper = new QueryWrapper() - .likeRight("pre_fix", protocolStr); - List protocolConfigList = protocolMapper.selectList(queryWrapper); - return protocolConfigList; + private static List initialMatch(String protocolContent) { + String firstFrameChar = protocolContent.charAt(0) + ""; + ProtocolConfigProvider protocolConfigProvider=new ProtocolConfigProvider(firstFrameChar); + return protocolConfigProvider.getMatchList(); } + + + + + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index cf2113d..e915877 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -1,32 +1,35 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(0) -@Service +@Component public class FrameLengthMatcher implements FrameStructMatcher { - @Autowired - private FieldParser fieldParser; - //超过长度 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { String dataGramContent = ByteBufUtil.hexDump(byteBuf); - if (StringUtils.isEmpty(protocolConfig.getUnpackId()) && StringUtils.isEmpty(protocolConfig.getTailStr())) { - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + //当不存在结尾标志和拆包标志,可以直接使用长度进行匹配 + if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { if (dataGramContent.length() >= totalLength) {//等于长度返回true,超出长度,切断 - ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, protocolConfig, totalLength); + ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, totalLength); return wholeDatagramByte; } else { //读的标志位前移舍弃 @@ -38,7 +41,7 @@ return null; } - private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, Integer totalLength) { byteBuf.readBytes(totalLength); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, totalLength - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 2bfc213..d527ad0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; @@ -13,7 +13,7 @@ import lombok.AllArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.nio.charset.Charset; import java.util.Map; @@ -22,32 +22,30 @@ * 后续标志验证 */ @Order(1) -@Service +@Component @AllArgsConstructor -public class FrameMarkMatcher implements FrameStructMatcher { - - private final FieldConfigDao fieldConfigDao; - private final FieldParser fieldParser; - private final FieldResolver fieldResolverManger; +public class FrameMarkMatcher implements FrameStructMatcher, FixedPropertyEnum { //帧后续标志=>结束,进行帧的重组=>有后续,1、帧移位判别 2、继续接收帧 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig UnpackConfig = StringUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getUnpackId()); - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); - Integer upback = 0; + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); ByteBuf mergeWholeFrameByte = null; - if (!ObjectUtil.isEmpty(UnpackConfig)) { - while (hasNextFullFrame(byteBuf, protocolConfig)) { - upback = (Integer) fieldResolverManger.filedParserManger(byteBuf, UnpackConfig, null); + if (!ObjectUtil.isEmpty(unpackFlag)) { + while (hasNextFullFrame(byteBuf, protocolConfig, protocolFieldConfigProvider)) { //是否存在后续位 - if (upback == 1) {//使用esayRule + if (unpackFlag == 1) {//使用esayRule //表示可以截取 - mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolConfig, totalLength); + mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolFieldConfigProvider, protocolConfig); return mergeWholeFrameByte; } else { - byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig)); + byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig, protocolFieldConfigProvider)); } } } @@ -56,7 +54,8 @@ //选取第一个帧,将业务内容和后面部分分开 //计算数据报文-业务内容 - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolFieldConfigProvider protocolFieldConfigProvider, ProtocolConfig protocolConfig) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); //截取完整报文 byteBuf.readBytes(totalLength); ByteBuf byteBufContent = byteBuf.slice(0, byteBuf.readerIndex()); @@ -68,15 +67,15 @@ String tail = ""; System.out.println(ByteBufUtil.hexDump(byteBufContent)); //会存在多个帧拼接在一起的的情况,进行合并处理 - while (hasNextFullFrame(byteBufContent, protocolConfig)) { - Integer currentFrameLength = fieldParser.getTotalLength(protocolConfig, byteBufContent); + while (hasNextFullFrame(byteBufContent, protocolConfig, protocolFieldConfigProvider)) { + Integer currentFrameLength = protocolFieldConfigProvider.getTotalLength(byteBufContent, protocolConfig); byteBufContent.readBytes(currentFrameLength); ByteBuf currentbyteBuf = byteBufContent.slice(0, byteBufContent.readerIndex()); byteBufContent.markReaderIndex();//读的标志位前移 System.out.println(ByteBufUtil.hexDump(byteBufContent)); String hexDump = currentbyteBuf.toString(Charset.forName("ISO-8859-1")); //获取当前固定帧结构的关系map - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, currentbyteBuf); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(currentbyteBuf, protocolConfig); if (StringUtils.isEmpty(mergeFrameStr)) { //首次获取业务数据报文 mergeFrameStr += hexDump.substring(0, currentFrameFixedProperty.get("tailPosition")); @@ -95,22 +94,22 @@ /** * 获取平移到下一帧起始位置 */ - public int getNextFrameOffset(ByteBuf buffer, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, buffer); - return currentFrameFixedProperty.get("totalLength"); + public int getNextFrameOffset(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + return currentFrameFixedProperty.get(TOTAL_LENGTH); } /** * 判断是否出错进行整个帧的 */ - public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, byteBuf); + public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); //保证读取位置不在固定位置,是可变的业务内容 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("fixedPosition")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(FIXED_POSITION)) { return false; } //判断读取是否操作帧长度 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("totalLength")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(TOTAL_LENGTH)) { return false; } return true; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 76a3784..c3a1bab 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -1,50 +1,50 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.parser.instance.GeneralProcessor; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; +import io.netty.buffer.ByteBufUtil;; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(2) -@Service +@Component public class FrameTailMatcher implements FrameStructMatcher { - @Resource - private FieldConfigDao fieldConfigDao; - @Autowired - private GeneralProcessor generalProcessor; - //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig tailFieldConfig = StringUtils.isEmpty(protocolConfig.getTailStr()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getTailStr()); - if (!ObjectUtil.isEmpty(tailFieldConfig)) { - String tailStr = tailFieldConfig.getFieldName(); + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfig protocolFieldConfig = ObjectUtils.isEmpty(protocolConfig.getTailStr()) ? null : + fieldConfigProvider.getFieldConfigById(protocolConfig.getTailStr()); + if (!ObjectUtil.isEmpty(protocolFieldConfig)) { + String tailStr = protocolFieldConfig.getFieldName(); String dataGramContent = ByteBufUtil.hexDump(byteBuf); Boolean tailFlag = ByteBufUtil.hexDump(byteBuf).contains(tailStr); if (!tailFlag) { //使用esayRule return null; } else if (dataGramContent.indexOf(tailStr) < dataGramContent.length() - tailStr.length()) { Integer length = dataGramContent.indexOf(tailStr) + tailStr.length(); - ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, protocolConfig, length); + ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, length); return wholeDatagramByte; //存在粘包 } } return null; } - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer length) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, Integer length) { byteBuf.readBytes(length); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, length - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java new file mode 100644 index 0000000..5f1c177 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java @@ -0,0 +1,73 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.combined.GenericCombinedFieldResolver; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.CombinedFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class CombinedFieldConfigProvider { + + + /** + * 作为临时配置列表缓存使用 + */ + private final List combinedFieldConfigList; + private Map storeObjectMap = new HashMap<>(); + + public CombinedFieldConfigProvider(Long ruleId) { + CombinedFieldConfigRegistry combinedFieldConfigRegistry = SpringContextUtil.getBean(CombinedFieldConfigRegistry.class); + combinedFieldConfigList = combinedFieldConfigRegistry.getCombinedFieldConfigList(ruleId); + } + + public void parseDataField(RuleConfig ruleConfig, String clearZeroPlain,Map fieldConfigsMap ) { + if (showSkip()) { + return; + } + //匹配对应的数据,然后进行相关的字段解析 + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver(); + combinedFieldResolver.parseDataField(combinedFieldConfigList, byteBuf, storeObjectMap,fieldConfigsMap); + } + + + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getCombinedFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return combinedFieldConfigList.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public List getCombinedFieldConfigList() { + return combinedFieldConfigList; + } + + /* 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(combinedFieldConfigList) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java new file mode 100644 index 0000000..f3cfedc --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java @@ -0,0 +1,11 @@ +package com.casic.missiles.parser.provider; + +/** + * @author cz + * @date 2023-6-12 + */ +public class CommandEventProvider{ + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java new file mode 100644 index 0000000..70eec5e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java @@ -0,0 +1,77 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.safe.SafeStrategy; +import com.casic.missiles.parser.sender.DataSubscribeProvider; +import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class DatagramEventProvider { + + private final DatagramEventConfig processorInstance; + + public DatagramEventProvider(Long ruleId) { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + List datagramEventConfigList = + datagramEventRegistry.getDatagramEventList(ruleId); + processorInstance = this.getProcessorInstance(datagramEventConfigList); + } + + public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { + if (showSkip()) { + return null; + } + return datagramEventConfigList.get(0); + } + + // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 + public String getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap) { + String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? + processorInstance.getSafeBean() : + fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); + if (!StringUtils.isEmpty(safeName)) { + //需要加密 + SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); + String plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); + return clearComplementZero(plain); + } + return ByteBufUtil.hexDump(bizDataContent); + } + + //解密清零操作 + private String clearComplementZero(String plain) { + plain = plain.substring(0, plain.lastIndexOf("00")); + return plain; + } + + //数据发送,数据发送者暂未构建 + public void storeData(Map bizDataMap) { + DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); +// dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return ObjectUtils.isNotEmpty(processorInstance) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java new file mode 100644 index 0000000..7e1fe0a --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java @@ -0,0 +1,97 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.FieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class FieldConfigProvider { + + + private final List fieldConfigs; + private Map storeObjectMap = new HashMap<>(); +// private Map singleObjects = new ConcurrentHashMap<>(); + + public FieldConfigProvider(Long ruleId) { + FieldConfigRegistry fieldConfigRegistry = SpringContextUtil.getBean(FieldConfigRegistry.class); + fieldConfigs = fieldConfigRegistry.getFieldConfigList(ruleId); + } + + public List getFieldConfigs() { + return fieldConfigs; + } + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public Map parseDataField(RuleConfig ruleConfig, String clearZeroPlain) { + if (showSkip()) { + return null; + } + List prepareFieldConfig = prepareParseField(ruleConfig); + if (CollectionUtils.isNotEmpty(prepareFieldConfig)) { + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(fieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + return fixDataMap; + } + } + return null; + } + + /** + * 得到需要处理的业务内容 + * + * @return + */ + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return fieldConfigs.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public Map getFieldConfigsMap() { + return fieldConfigs.stream().collect( + Collectors.toMap(FieldConfig::getId, e -> e) + ); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(fieldConfigs) ? false : true; + } + + +} + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java new file mode 100644 index 0000000..817bfaf --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java @@ -0,0 +1,19 @@ +package com.casic.missiles.parser.provider; + +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.registry.FieldRuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; + +public class FieldRuleConfigProvider { + + private final List fieldRuleConfigList; + + public FieldRuleConfigProvider(Long ruleId) { + FieldRuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(FieldRuleConfigRegistry.class); + fieldRuleConfigList = ruleConfigRegistry.getFieldRuleConfigList(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java new file mode 100644 index 0000000..99a1b06 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java @@ -0,0 +1,53 @@ +package com.casic.missiles.parser.provider; + + +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.registry.ProtocolConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolConfigProvider { + + private final List protocolConfigList; + + public ProtocolConfigProvider(String firstChar) { + ProtocolConfigRegistry registry = SpringContextUtil.getBean(ProtocolConfigRegistry.class); + protocolConfigList = registry.getProtocolConfigList(firstChar); + } + + public List getMatchList() { + return protocolConfigList; + } + + /** + * 设置当前协议 + * + * @param protocolConfig + */ + public ProtocolConfigProvider(ProtocolConfig protocolConfig) { + List protocolConfigs = new ArrayList<>(); + protocolConfigs.add(protocolConfig); + protocolConfigList = protocolConfigs; + } + + /** + * 获取当前协议 + * + * @return + */ + public ProtocolConfig getCurrentProtocolConfig() { + if (this.protocolConfigList == null) { + return null; + } else { + return protocolConfigList.get(0); + } + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java new file mode 100644 index 0000000..043927d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java @@ -0,0 +1,213 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.registry.ProtocolFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolFieldConfigProvider { + + private static final String FIXED_FIELD_DS = "fixedFieldDs"; + private static final String CONTENT_FIELD_DS = "contentFieldDs"; + private static final String PROTOCOL_LENGTH = "protocolLength"; + private static final String PROTOCOL_FIELD_ID = "protocolFieldId"; + private static final String PROTOCOL_POSITION = "protocolPosition"; + + private final List protocolFieldConfigs; + private Map singleObjects = new ConcurrentHashMap<>(); + private Map storeObjectMap = new HashMap<>(); + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public ProtocolFieldConfigProvider(Long protocolId) { + ProtocolFieldConfigRegistry protocolFieldConfigRegistry = SpringContextUtil.getBean(ProtocolFieldConfigRegistry.class); + protocolFieldConfigs = protocolFieldConfigRegistry.getProtocolFieldConfigList(protocolId); + } + + public List getProtocolFieldConfigs() { + return protocolFieldConfigs; + } + + public ProtocolFieldConfig getFieldConfigById(Long fieldId) { + Optional optionalConfig = protocolFieldConfigs.stream().filter( + e -> e.getId().equals(fieldId) + ).findFirst(); + return optionalConfig.isPresent() ? optionalConfig.get() : null; + } + + public Integer getProtocolFieldValue(Long protocolFieldId, ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_FIELD_ID + protocolFieldId + ByteBufUtil.hexDump(byteBuf); + //获取缓存 + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + //加载固定长度数据集合 + Map fixDataMap = this.getProtocolDataMap(byteBuf); + ProtocolFieldConfig protocolFieldConfig = selectFieldConfig(protocolFieldId); + Integer protocolFieldValue = 0; + //获取约定字段的总长度 + if (fixDataMap.containsKey(protocolFieldConfig.getFieldName())) { + Object appointUnpackObject = fixDataMap.get(protocolFieldConfig.getFieldName()); + if (ObjectUtils.isNotEmpty(appointUnpackObject)) { + protocolFieldValue = (Integer) appointUnpackObject; + } + } + if (protocolFieldValue != null) { + //加入缓存 + if (ObjectUtils.isNotEmpty(protocolFieldValue)) { + this.singleObjects.put(catchKey, protocolFieldValue); + return protocolFieldValue; + } + } + return null; + } + + /** + * 获取帧固定位置信息 + * + * @param byteBuf + * @param protocolConfig + * @return + */ + public Map getFixedProperty(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_POSITION + protocolConfig.getId(); + if (this.singleObjects.containsKey(catchKey)) { + return (Map) singleObjects.get(catchKey); + } + Map fixedPropertyMap = new HashMap<>(); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + fixedPropertyMap = fieldParser.doGetFixedProperty(protocolFieldConfigs, this.getTotalLength(byteBuf,protocolConfig)); + if (CollectionUtils.isNotEmpty(fixedPropertyMap)) { + this.singleObjects.put(catchKey, fixedPropertyMap); + return fixedPropertyMap; + } + return fixedPropertyMap; + } + + /** + * 获取帧结构应有的总长度 + */ + public Integer getTotalLength(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_LENGTH + ByteBufUtil.hexDump(byteBuf); + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + Integer appointFrameLength = getProtocolFieldValue(protocolConfig.getTotalLengthId(), byteBuf); + if (appointFrameLength != null) { + //获取过滤的字段集合总长度 + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Integer totalFilterLength = fieldParser.getTotalFilterLength(protocolConfig, byteBuf, getFixFieldConfigMap()); + //计算总长度 + Integer totalLength = appointFrameLength + totalFilterLength; + //加入缓存 + if (ObjectUtils.isNotEmpty(totalLength)) { + this.singleObjects.put(catchKey, totalLength); + return totalLength; + } + } + return null; + } + + /** + * 获取协议有关字段解析内容 + * storeObjectMap存储代转存的数据 + * + * @return + */ + public Map getProtocolDataMap(ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(FIXED_FIELD_DS)) { + return (Map) singleObjects.get(FIXED_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(protocolFieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + this.singleObjects.put(FIXED_FIELD_DS, fixDataMap); + return fixDataMap; + } + return null; + } + + /** + * 获取业务报文内容的content字节 + * + * @param wholeDatagramByte + * @return + */ + public ByteBuf getDataContentBuf(ByteBuf wholeDatagramByte) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(CONTENT_FIELD_DS)) { + return (ByteBuf) singleObjects.get(CONTENT_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + ByteBuf bizDataByteBuf = fieldParser.getDataContentBuf(protocolFieldConfigs, wholeDatagramByte); + if (bizDataByteBuf != null) { + this.singleObjects.put(CONTENT_FIELD_DS, bizDataByteBuf); + return bizDataByteBuf; + } + return null; + } + + + private ProtocolFieldConfig selectFieldConfig(Long id) { + Optional optionalProtocolFieldConfig = this.protocolFieldConfigs.stream().filter( + e -> e.getId().equals(id) + ).findFirst(); + return optionalProtocolFieldConfig.isPresent() ? optionalProtocolFieldConfig.get() : null; + } + + + private Map getFixFieldConfigMap() { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, e -> e) + ); + return fixDataFieldMap; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(protocolFieldConfigs) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java new file mode 100644 index 0000000..dafba1c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java @@ -0,0 +1,56 @@ +package com.casic.missiles.parser.provider; + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.rule.GenericRuleResolver; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.RuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleConfigProvider { + + private final List ruleConfigs; + + public List getRuleConfigs() { + return ruleConfigs; + } + + public RuleConfigProvider(Long protocolId) { + RuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(RuleConfigRegistry.class); + ruleConfigs = ruleConfigRegistry.getRuleConfigById(protocolId); + } + + /** + * 获取规则匹配结果 + * + * @param parseFixedDataMap + * @param protocolFieldConfigs + * @return + */ + public RuleConfig doGetRule(Map parseFixedDataMap, + String ids, + List protocolFieldConfigs) { + if (showSkip()) { + return null; + } + RuleConfig ruleConfig = GenericRuleResolver.machRule(parseFixedDataMap, ids, protocolFieldConfigs, ruleConfigs); + return ruleConfig; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(ruleConfigs) ? false : true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java index 3c05891..856b399 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java @@ -1,18 +1,11 @@ package com.casic.missiles.parser.resolver; -import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.springframework.web.bind.annotation.RequestBody; -import javax.annotation.Resource; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -20,19 +13,17 @@ @Slf4j public class ByteMergeProvider { - @Resource - private FieldRuleEngineMapper fieldRuleEngineMapper; - //拿到所有的值合并到一个值 - public String resolveByteMerge(List valueList, String ruletypeId, String vaildRange) { + public static String resolveByteMerge(List valueList, String ruleTypeId, String vaildRange) { String values = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Map vaildMap = getValidRangeMap(vaildRange); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(ruletypeId); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } + //暂时不处理 +// fieldRuleEngine = fieldRuleConfigMapper.selectById(ruleTypeId); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } Map env2 = new HashMap(); for (int i = 0; i < valueList.size(); i++) { if (vaildMap.containsKey(i)) { @@ -47,7 +38,7 @@ } } - private Map getValidRangeMap(String vaildRange) { + private static Map getValidRangeMap(String vaildRange) { String[] range = vaildRange.split(","); Map vaildMap = new HashMap(); for (int i = 0; i < range.length; i++) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 8d821cd..85d6bbf 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -1,9 +1,12 @@ package com.casic.missiles.parser.resolver; +import com.casic.missiles.pojo.AbstractFieldConfig; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; import io.netty.buffer.ByteBuf; +import java.util.List; import java.util.Map; /** @@ -11,18 +14,14 @@ */ public interface FieldParser { -// Map fieldProcess(String protocolContent,); - Map dataParser(RuleConfig ruleConfig, String lightText,String protocolId); + Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength); - Map fixDataParser(String protocolId, ByteBuf buffer); + Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap); - Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf); + ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer); - ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer); - - ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer); - - Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer); + Integer getTotalFilterLength(ProtocolConfig protocolConfig, ByteBuf byteBuf, Map protocolFieldConfigMap); } + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java new file mode 100644 index 0000000..9e0c00e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java @@ -0,0 +1,52 @@ +package com.casic.missiles.parser.resolver; + +import com.casic.missiles.pojo.AbstractFieldConfig; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.util.List; + +public class FieldParserSupport { + + //分别计算bit和byte长度=> 合并长度 + protected Integer calculateLength(List fieldConfigList) { + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + Integer fixedLength = bytefixedLength + bitfixedLength / 8; + return fixedLength; + } + + //找到最大值=> 根据最大值计算业务数据下标 + protected Integer calculatePosition(List fieldConfigList) { + String rex = "[0-9]+"; + Integer max = -1; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) + && Integer.valueOf(fieldConfig.getOriginPositionByte()) > max) { + max = Integer.valueOf(fieldConfig.getOriginPositionByte()); + } + } + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) && fieldConfig.getOriginPositionByte().equals(max)) { + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + } + } + Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; + return maxFixedPosition; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java deleted file mode 100644 index dd3a6cd..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java +++ /dev/null @@ -1,170 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.ByteResolverParam; -import io.netty.buffer.ByteBuf; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -/** - * 字段解析管理总类 - */ -@Service -@Slf4j -@AllArgsConstructor -public class FieldResolver extends ByteMergeProvider { - - //1、字段截取 => 2、简单的字节解析和复杂的字节解析 - public Object filedParserManger(ByteBuf byteBuf, FieldConfig fieldConfig, Integer maxFixedPosition) { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - //最大固定位置不为空, - if (!ObjectUtil.isEmpty(maxFixedPosition)) { - orignPosition -= maxFixedPosition; - } - Object fieldValue = 0; - //待优化 - if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { - fieldValue = bitToResolver(byteBuf, fieldConfig); - } else { - ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); - fieldValue = parsingFields(fieldBytes, fieldConfig.getRuleJson()); - } - return fieldValue; - } - - //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, - //目前默认配置的规则设置暂不支持配置化,由实现完成 - private Object parsingFields(ByteBuf byteBuf, String ruleJson) { - Object fieldsResolveValue = null; - List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); - if (ObjectUtil.isEmpty(ruleMapList)) { - fieldsResolveValue = defaultResolveBuilder(byteBuf); - } else { - fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); - } - return fieldsResolveValue; - } - - private Object defaultResolveBuilder(ByteBuf byteBuf) { - Integer defaultResolveValue = 0; - for (int i = 0; i < byteBuf.writerIndex(); i++) { - defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; - } - return defaultResolveValue; - } - - //字段解析构建器(针对字节单位的) - //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 - // 字节归并结束或者规则结束=>继续根据规则进行判断 - private Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { - Object customizeResolveValue = null; - try { - List bytStrList = new ArrayList<>(); - //存放到数组里面 - for (int i = 0; i < byteBuf.writerIndex(); i++) { - bytStrList.add(byteBuf.readByte()); - } - int i = 0; - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - customizeResolveValue = this.resolveByteMerge(bytStrList, ruletypeId,vaildRange); - break; - } else { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - List tempBytStr = new ArrayList<>(); - for (int k = 0; i < bytStrList.size(); i++) { - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(k) - .value(bytStrList.get(k)) - .ruletypeId(ruletypeId).build(); - tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); - } - bytStrList = tempBytStr; - } - i++; - } - //字节归并到一起=>继续根据规则进行判断 - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(customizeResolveValue) - .ruletypeId(ruletypeId).build(); - customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(customizeResolveValue)); - return customizeResolveValue; - } catch (RuntimeException ex) { - log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); - return null; - } - } - - /** - * 1、单个字节情况表示字段 - * 2、多字节情况表示字段(暂未处理) - */ - private Object bitToResolver(ByteBuf byteBuf, FieldConfig fieldConfig) { - Object fieldValue = new Object(); - try { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - byte fields = 0x00; - if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); - } else { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); - } - - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { - if (!StringUtils.isEmpty(fieldConfig.getExactOrignPosition())) { - fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getExactOrignPosition())).byteValue() - >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); - } else { - fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); - } - } else { - fieldValue = Integer.valueOf(fields & 0xff); - } - if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { - return fieldValue; - } - List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); - int i = 0; - //字节归并到一起=>继续根据规则进行判断 - while (i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(fieldValue) - .ruletypeId(ruletypeId).build(); - fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(fieldValue)); - return fieldValue; - } catch (RuntimeException ex) { - log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); - return null; - } - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java new file mode 100644 index 0000000..1d2aeab --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java @@ -0,0 +1,36 @@ +package com.casic.missiles.parser.resolver.bytes; + +import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.mapper.FieldRuleConfigMapper; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.pojo.ByteResolverParam; +import com.googlecode.aviator.AviatorEvaluator; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; +//转换规则 +@Component("convert") +@AllArgsConstructor +@Slf4j +public class ByteRuleResolver implements ByteResolver { + + private final FieldRuleConfigMapper fieldRuleConfigMapper; + + @Override + public Object resolveOperationRule(ByteResolverParam byteResolverParam){ + FieldRuleConfig fieldRuleEngine=fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); + if(ObjectUtil.isEmpty(fieldRuleEngine)){ + return byteResolverParam.getValue(); + } + String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); + Map env2 = new HashMap(); + env2.put("value", (byte) byteResolverParam.getValue()); + String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); + return values; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java index 103821c..786b71c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java @@ -2,34 +2,34 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("logicalShift") +@Component("logicalShift") @AllArgsConstructor @Slf4j public class LogicalShiftResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //字节位移 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { Integer index = byteResolverParam.getIndex(); - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return byteResolverParam.getValue(); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java index 476747d..01149bd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("operation") +@Component("operation") @AllArgsConstructor @Slf4j public class OperationResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //混合运算,有常量或者乘除的缩放 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java index 0b82cf4..79abcce 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.casic.missiles.pojo.ByteResolverParam; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; //精度计算 -@Service("precision") +@Component("precision") @AllArgsConstructor @Slf4j public class PrecisionResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java deleted file mode 100644 index 5c3f332..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; -//转换规则 -@Service("convert") -@AllArgsConstructor -@Slf4j -public class RuleResolver implements ByteResolver { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam){ - RuleEvaluator fieldRuleEngine=fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); - if(ObjectUtil.isEmpty(fieldRuleEngine)){ - return byteResolverParam.getValue(); - } - String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); - Map env2 = new HashMap(); - env2.put("value", (byte) byteResolverParam.getValue()); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java new file mode 100644 index 0000000..d3bbd91 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java @@ -0,0 +1,15 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; + +import java.util.List; +import java.util.Map; +// 前导码匹配->长度字段 +public interface AbstractCombinedFieldProcessor { + + Map invoke(Map map, ByteBuf byteBuf, List combinedFieldConfigList, + Map fieldConfigsMap, Map storeObjectMap); + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java new file mode 100644 index 0000000..03c8480 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java @@ -0,0 +1,59 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-13 + */ +//依次递增进行数据的解析, +public class GenericCombinedFieldResolver { + + + //通过查询,字段长度长度随机 + public void parseDataField(List combinedFieldConfigList, ByteBuf byteBuf, + Map storeObjectMap, Map fieldConfigsMap) { + Integer frameLength = Integer.valueOf(ByteBufUtil.hexDump(byteBuf)); + //添加前置处理器 + com.casic.missiles.util.ClassUtil classUtil = new com.casic.missiles.util.ClassUtil(); + List abstractCombinedProcessors = classUtil.getSubClassList(AbstractCombinedFieldProcessor.class); + + Map fieldFixedMap = combinedFieldLeadCodeMap(combinedFieldConfigList); + //frameLength + Map combinedProcessorFields = null; + while (byteBuf.readableBytes() < frameLength) { + //一直处理 + for (AbstractCombinedFieldProcessor abstractCombinedProcessor : abstractCombinedProcessors) { + combinedProcessorFields = abstractCombinedProcessor.invoke(combinedProcessorFields, byteBuf, + combinedFieldConfigList, + fieldConfigsMap, storeObjectMap); + if (combinedProcessorFields == null || byteBuf.readableBytes() < frameLength) { + return; + } + } + + } + } + + /** + * 取出前导码匹配集合 + */ + private Map combinedFieldLeadCodeMap(List combinedFieldConfigList) { + Map fieldFixedMap = combinedFieldConfigList + .stream() + .collect(Collectors.toMap(CombinedFieldConfig::getPrefixCode, e -> e)); + return fieldFixedMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java new file mode 100644 index 0000000..643a934 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java @@ -0,0 +1,100 @@ +package com.casic.missiles.parser.resolver.fields; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.FieldParserSupport; +import com.casic.missiles.pojo.*; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 保存使用时最基本的信息,并且使用原型模式 + */ +@Slf4j +public class DefaultProtocolFieldParser extends FieldParserSupport implements FieldParser, FixedPropertyEnum { + + //通过传入的配置和报文进行字段解析 + @Override + public Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap) { + Map dataMap = new HashMap<>(); + for (AbstractFieldConfig protocolFieldConfig : protocolFieldConfigs) { + if (!ObjectUtils.isEmpty(protocolFieldConfig.getOriginPositionByte())) { + Object fieldValue = FieldResolver.parseField(buffer, protocolFieldConfig, null); + if (protocolFieldConfig.getIsStorage() == 1) { + storeObjectMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + dataMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + } + return dataMap; + } + + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength) { + Map fixedPropertyMap = new HashMap<>(); + Integer fixedLength = calculateLength(protocolFieldConfigs); + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + fixedPropertyMap.put(FIXED_POSITION, maxFixedPosition); + fixedPropertyMap.put(TOTAL_LENGTH, totalLength); + fixedPropertyMap.put(TAIL_POSITION, totalLength - fixedLength + maxFixedPosition); + return fixedPropertyMap; + } + + //** 获取业务内容的byteBuf + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer) { + //计算固定长度 + Integer fixedLength = calculateLength(protocolFieldConfigs); + //总长度获取 + String lightText = buffer.toString(Charset.forName("ISO-8859-1")); + Integer totalLength = lightText.length(); + //计算固定长度最大长度 + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + //计算数据报文内容 + ByteBuf bizDataFields = buffer.slice(maxFixedPosition - 1, (totalLength - fixedLength)); + return bizDataFields; + } + + /** + * 获取过滤字段的长度 + */ + @Override + public Integer getTotalFilterLength(ProtocolConfig protocolConfig, + ByteBuf byteBuf, + Map protocolFieldConfigMap) { + if (ByteBufUtil.hexDump(byteBuf).equals("")) { + return 0; + } + int totalFilterLength = 0; + String filterFields = protocolConfig.getTotalLengthFilterFields(); + try { + if (!StringUtils.isEmpty(filterFields)) { + String[] filterFieldList = filterFields.split(","); + for (String filterFieldId : filterFieldList) { + if (StringUtils.isNotEmpty(filterFieldId)) { + ProtocolFieldConfig fieldConfig = protocolFieldConfigMap.get(Long.valueOf(filterFieldId)); + //这里都是按字节计算,没有对位进行区分,可能会出现错误 + // 如果对位有需求,需要进一步跟进 + totalFilterLength += fieldConfig.getOffsetLength(); + } + } + } + return totalFilterLength; + } catch (Exception ex) { + log.error("报文确认分发阶段,获取报文总长度过滤长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); + } + return totalFilterLength; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java new file mode 100644 index 0000000..d51e887 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java @@ -0,0 +1,169 @@ +package com.casic.missiles.parser.resolver.fields; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.parser.resolver.ByteMergeProvider; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.AbstractFieldConfig; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.pojo.ByteResolverParam; +import io.netty.buffer.ByteBuf; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * 字段解析管理总类 + */ +@Slf4j +public class FieldResolver extends ByteMergeProvider { + + //1、字段截取 => 2、简单的字节解析和复杂的字节解析 + public static Object parseField(ByteBuf byteBuf,AbstractFieldConfig fieldConfig, Integer maxFixedPosition) { + Integer orignPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + //最大固定位置不为空, + if (!ObjectUtil.isEmpty(maxFixedPosition)) { + orignPosition -= maxFixedPosition; + } + Object fieldValue = 0; + //待优化 + if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { + fieldValue = doParseBitField(byteBuf, fieldConfig); + } else { + ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); + fieldValue = doParseByteField(fieldBytes, fieldConfig.getRuleJson()); + } + return fieldValue; + } + + //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, + //目前默认配置的规则设置暂不支持配置化,由实现完成 + private static Object doParseByteField(ByteBuf byteBuf, String ruleJson) { + Object fieldsResolveValue = null; + List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); + if (ObjectUtil.isEmpty(ruleMapList)) { + fieldsResolveValue = defaultResolveBuilder(byteBuf); + } else { + fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); + } + return fieldsResolveValue; + } + + private static Object defaultResolveBuilder(ByteBuf byteBuf) { + Integer defaultResolveValue = 0; + for (int i = 0; i < byteBuf.writerIndex(); i++) { + defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; + } + return defaultResolveValue; + } + + //字段解析构建器(针对字节单位的) + //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 + // 字节归并结束或者规则结束=>继续根据规则进行判断 + private static Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { + Object customizeResolveValue = null; + try { + List bytStrList = new ArrayList<>(); + //存放到数组里面 + for (int i = 0; i < byteBuf.writerIndex(); i++) { + bytStrList.add(byteBuf.readByte()); + } + int i = 0; + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { + if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + customizeResolveValue = resolveByteMerge(bytStrList, ruletypeId, vaildRange); + break; + } else { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + List tempBytStr = new ArrayList<>(); + for (int k = 0; i < bytStrList.size(); i++) { + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(k) + .value(bytStrList.get(k)) + .ruletypeId(ruletypeId).build(); + tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); + } + bytStrList = tempBytStr; + } + i++; + } + //字节归并到一起=>继续根据规则进行判断 + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(null) + .value(customizeResolveValue) + .ruletypeId(ruletypeId).build(); + customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); + i++; + } + System.out.println(JSON.toJSON(customizeResolveValue)); + return customizeResolveValue; + } catch (RuntimeException ex) { + log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); + return null; + } + } + + /** + * 1、单个字节情况表示字段 + * 2、多字节情况表示字段(暂未处理) + */ + private static Object doParseBitField(ByteBuf byteBuf,AbstractFieldConfig fieldConfig) { + Object fieldValue = new Object(); + try { + Integer orignPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + byte fields = 0x00; + if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { + fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); + } else { + fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); + } + + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { + if (!StringUtils.isEmpty(fieldConfig.getOriginPositionBit())) { + fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getOriginPositionBit())).byteValue() + >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); + } else { + fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); + } + } else { + fieldValue = Integer.valueOf(fields & 0xff); + } + if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { + return fieldValue; + } + List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); + int i = 0; + //字节归并到一起=>继续根据规则进行判断 + while (i < ruleMapList.size()) { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(null) + .value(fieldValue) + .ruletypeId(ruletypeId).build(); + fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); + i++; + } + System.out.println(JSON.toJSON(fieldValue)); + return fieldValue; + } catch (RuntimeException ex) { + log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); + return null; + } + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java deleted file mode 100644 index 35ae3d0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java +++ /dev/null @@ -1,183 +0,0 @@ -package com.casic.missiles.parser.resolver.fields; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufAllocator; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; -import org.springframework.util.ObjectUtils; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service("standard") -@AllArgsConstructor -@Slf4j -public class StandardFieldParser implements FieldParser { - - private final FieldConfigDao fieldConfigDao; - private final FieldResolver fieldResolver; - - //数据解析 - @Override - public Map dataParser(RuleConfig ruleConfig, String lightText, String protocolId) { - String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); - ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); - bufferContent.writeBytes(lightText.getBytes(Charset.forName("ISO-8859-1"))); - Map dataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - for (String dataFieldId : dataFieldIds) { - FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(dataFieldId); - if (!ObjectUtils.isEmpty(fieldConfig)) { - dataMap.put(fieldConfig.getFieldName(), String.valueOf(fieldResolver.filedParserManger(bufferContent, fieldConfig, maxFixedPosition))); - } - } - return dataMap; - } - - //数据解析 - @Override - public Map fixDataParser(String protocolId, ByteBuf buffer) { - List dataFieldIdList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Map dataMap = new HashMap<>(); - for (FieldConfig dataField : dataFieldIdList) { - if (!ObjectUtils.isEmpty(dataField.getOrignPosition())) { - Object fieldValue = (Integer) fieldResolver.filedParserManger(buffer, dataField, null); - dataMap.put(dataField.getFieldName(), fieldValue); - } - } - return dataMap; - } - - @Override - public Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf) { - if (ByteBufUtil.hexDump(byteBuf).equals("")) { - return 0; - } - String filterFields = protocolConfig.getTotalLengthFilterField(); - Integer totalLength = 0; - try { - FieldConfig totalFieldConfig = fieldConfigDao.getFieldConfigById(protocolConfig.getTotalLengthId()); - int totalFilterLength = 0; - if (!StringUtils.isEmpty(filterFields)) { - String[] filterFieldList = filterFields.split(","); - for (String filterField : filterFieldList) { - FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(filterField); - //这里都是按字节计算,没有对位进行区分,可能会出现错误 - - // 如果对位有需求,需要进一步跟进 - totalFilterLength += fieldConfig.getOffsetLength(); - } - } - totalLength = (Integer) fieldResolver.filedParserManger(byteBuf, totalFieldConfig, null) + totalFilterLength; - } catch (Exception ex) { - log.error("报文确认分发阶段,获取报文总长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); - } - return totalLength; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer) { - //业务内容 - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - String protocolId = String.valueOf(protocolConfig.getId()); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - //计算固定长度 - Integer fixedLength = calculateLength(fieldConfigList); -// Integer totalLength = this.getTotalLength(protocolConfig, buffer); - //总长度获取 - Integer totalLength = lightText.length(); - //计算固定长度最大长度 - Integer maxFixedPosition = calculatePosition(fieldConfigList); -// buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - //计算数据报文内容 - ByteBuf bizDataFields = buffer.slice(maxFixedPosition-1, (totalLength - fixedLength)); - return bizDataFields; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer) { - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - String protocolId = String.valueOf(protocolConfig.getId()); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer fixedLength = calculateLength(fieldConfigList); -// Integer totalLength = this.getTotalLength(protocolConfig, buffer); - Integer totalLength = lightText.length(); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - ByteBuf fixDataFields = buffer.slice(0, maxFixedPosition); - return fixDataFields; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer) { - String protocolId = String.valueOf(protocolConfig.getId()); - Map fixedPropertyMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer fixedLength = calculateLength(fieldConfigList); - Integer totalLength = this.getTotalLength(protocolConfig, buffer); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - fixedPropertyMap.put("fixedPosition", maxFixedPosition); - fixedPropertyMap.put("totalLength", totalLength); - fixedPropertyMap.put("tailPosition", totalLength - fixedLength + maxFixedPosition); - return fixedPropertyMap; - } - - //分别计算bit和byte长度=> 合并长度 - private Integer calculateLength(List fieldConfigList) { - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (FieldConfig fieldConfig : fieldConfigList) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - Integer fixedLength = bytefixedLength + bitfixedLength / 8; - return fixedLength; - } - - //找到最大值=> 根据最大值计算业务数据下标 - private Integer calculatePosition(List fieldConfigList) { - String rex = "[0-9]+"; - Integer max = -1; - for (FieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOrignPosition()) - && Integer.valueOf(fieldConfig.getOrignPosition()) > max) { - max = Integer.valueOf(fieldConfig.getOrignPosition()); - } - } - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (FieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOrignPosition()) && fieldConfig.getOrignPosition().equals(max)) { - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - } - } - Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; - return maxFixedPosition; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java new file mode 100644 index 0000000..d4ec6c7 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java @@ -0,0 +1,76 @@ +package com.casic.missiles.parser.rule; + +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import org.apache.commons.lang3.StringUtils; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class GenericRuleResolver { + + //根据前置字段的值,找到指定的规则 + //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 + //=>循环判断=>通过规则得到业务字段 + public static RuleConfig machRule(Map fixDataMap, + String ids, + List protocolFieldConfigs, + List ruleConfigs) { + List preRuleConfigList = getPreRuleList(ids, protocolFieldConfigs); + //获取前置规则字段 + final Map metaDataMap = getPreRuleFields(preRuleConfigList, fixDataMap); + //准备固定的字段集合 + Map fixDataFieldMap = getFixDataFieldMap(protocolFieldConfigs); + return RuleResolverCore.doMachRule(ruleConfigs, metaDataMap, fixDataMap, fixDataFieldMap); + } + + private static Map getFixDataFieldMap(List protocolFieldConfigs) { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, ProtocolFieldConfig::getFieldName) + ); + return fixDataFieldMap; + } + + + /** + * 查询前置规则的字段配置 + * + * @param ids + * @return + */ + private static List getPreRuleList(String ids, List protocolFieldConfigs) { + String[] idList = ids.split(","); + Map prepareMaps = new HashMap<>(); + for (String id : idList) { + if (StringUtils.isNotEmpty(id)) { + prepareMaps.put(Long.valueOf(id), ""); + } + } + List preRuleConfigList = protocolFieldConfigs + .stream() + .filter(e -> prepareMaps.containsKey(e.getId())) + .collect(Collectors.toList()); + return preRuleConfigList; + } + + /** + * 获取前置规则解析字段 + */ + private static Map getPreRuleFields(List preRuleFieldConfigList, Map fixDataMap) { + Map ruleFieldMap = new HashMap<>(); + preRuleFieldConfigList.stream() + .forEach( + preRuleFieldConfig -> { + String fieldName = preRuleFieldConfig.getFieldName(); + if (fixDataMap.containsKey(fieldName)) { + ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); + } + } + ); + return ruleFieldMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java new file mode 100644 index 0000000..baae7e8 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -0,0 +1,68 @@ +package com.casic.missiles.parser.rule; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.casic.missiles.pojo.RuleConfig; + +import java.util.*; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleResolverCore { + + + public static RuleConfig doMachRule(List ruleConfigList, Map metaDataMap, + Map fixDataMap, + Map fixDataFieldMap) { + Optional ruleConfigOptional = ruleConfigList.stream() + .filter(ruleConfig -> machRuleConfig( + JSON.parseObject(ruleConfig.getMatchRuleJson(), Map.class), metaDataMap)) + .findFirst(); + if (ObjectUtil.isEmpty(ruleConfigOptional)) { + return null; + } + String[] ruleFields = ruleConfigOptional.get().getDataFieldIds().split(","); + Map ruleMetaDataMap = getRuleFields(ruleFields, fixDataMap, fixDataFieldMap); + //递归选定解析规则,进行规则解析 + if (!ruleConfigOptional.get().getIsFinishMatch().equals("1")) { + //递归选定规则 + doMachRule(ruleConfigList, ruleMetaDataMap, fixDataMap, fixDataFieldMap); + } + return ruleConfigOptional.get(); + } + + + private static Map getRuleFields(String[] preRuleConfigList, Map fixedDataMap, + Map fixedFieldMap) { + Map ruleFieldMap = new HashMap<>(); + for (String preRuleConfigId : preRuleConfigList) { + String fieldName = fixedFieldMap.get(preRuleConfigId); + if (fixedDataMap.containsKey(fieldName)) { + ruleFieldMap.put(fieldName, String.valueOf(fixedDataMap.get(fieldName))); + } + } + return ruleFieldMap; + } + + + //匹配规则配置 + private static Boolean machRuleConfig(Map ruleMap, Map metaDataMap) { + if (ruleMap == null || metaDataMap == null) { + return null; + } + //所有的字段在规则里面必须有有配置 + for (String key : metaDataMap.keySet()) { + if (ruleMap.containsKey(key)) { + if (!ruleMap.get(key).equals(metaDataMap.get(key))) { + return false; + } + } else { + return false; + } + } + return true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java deleted file mode 100644 index 664088d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java +++ /dev/null @@ -1,92 +0,0 @@ -package com.casic.missiles.parser.rule; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.mapper.dao.PreRuleConfigDao; -import com.casic.missiles.mapper.dao.RuleConfigDao; -import lombok.AllArgsConstructor; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.*; -import java.util.stream.Collectors; - -@Service -@AllArgsConstructor -public class RulerProvider { - - private final FieldConfigDao fieldConfigDao; - private final PreRuleConfigDao preRuleConfigDao; - private final RuleConfigDao ruleConfigDao; - - //根据前置字段的值,找到指定的规则 - //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 - //=>循环判断=>通过规则得到业务字段 - public RuleConfig ruleConfig(Map fixDataMap, String protocolId) { - //批量获取规则 - List preRuleConfigList = preRuleConfigDao.getPreRuleList(protocolId); - //获取固定字段 - Map fixFieldMap = getAllFieldMap(protocolId); - //获取前置规则字段 - final String preRuleFields = getPreRuleFields(preRuleConfigList, fixDataMap, fixFieldMap); - List ruleConfigList = ruleConfigDao.getRuleConfigById(protocolId); - Optional ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig ->preRuleFields.equals( ruleConfig.getParseRuleJson())).findFirst(); - //递归选定解析规则,进行规则解析 - while (!ObjectUtil.isEmpty(ruleConfigOptional) && !ruleConfigOptional.get().getIsBizField().equals("1")) { - String ruleFields = getRuleFields(ruleConfigOptional.get().getDataFieldIds().split(","), fixDataMap, fixFieldMap); - ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig -> ruleConfig.getParseRuleJson().equals(ruleFields)).findFirst(); - } - return ruleConfigOptional.get(); - } - - /** - * 获取前置规则解析字段 - */ - private String getPreRuleFields(List preRuleConfigList, Map fixDataMap, Map fixFieldMap) { - Map ruleFieldMap= new HashMap<>(); - preRuleConfigList.stream() - .forEach( - preRuleConfig -> { - String fieldName = fixFieldMap.get(Long.valueOf(preRuleConfig.getRuleFieldId())); - if (fixDataMap.containsKey(fieldName)) { - ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); - } - } - ); - return JSONObject.toJSONString(ruleFieldMap); - } - - private Map getAllFieldMap(String protocolId) { - List fieldList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Map fixFieldMap = fieldList.stream().collect( - Collectors.toMap(FieldConfig::getId, FieldConfig::getFieldName) - ); - return fixFieldMap; - } - - private String getRuleFields(String[] preRuleConfigList, Map fixDataMap, Map fixFieldMap) { - Map ruleFieldMap= new HashMap<>(); - for (String preRuleConfigId : preRuleConfigList) { - String fieldName = fixFieldMap.get(preRuleConfigId); - if (fixDataMap.containsKey(fieldName)) { - ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); - } - } - return JSONObject.toJSONString(ruleFieldMap); - } - - //弃置 - private String ListToString(List ruleFieldList) { - String ruleFields = ""; - for (String ruleField : ruleFieldList) { - ruleFields += ruleField + ","; - } - ruleFields = StringUtils.isEmpty(ruleFields) ? ruleFields : ruleFields.substring(0, ruleFields.length() - 1); - return ruleFields; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java index 6177e10..bfa87a5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java @@ -2,7 +2,7 @@ public interface SafeStrategy { - String decryption(byte[] bytes); + String decryption(String cipher); String encryption(String lightText); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java index 618716c..6236302 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java @@ -9,9 +9,9 @@ //十六进制的字符串转换成字节数组 byte[] bytes = hexStrToBinaryStr(msg); //计算CRC8 - byte crc8 = CRC8(bytes, 0, bytes.length); - String crc8ToStr = "" + Integer.toHexString(0xff & crc8); - return crc8ToStr; +// String crc8ToStr = "" + Integer.toHexString(0xff & crc8); +// return crc8ToStr; + return null; } /** @@ -33,50 +33,5 @@ return bytes; } - /** - * CRC8 校验 多项式 x8+x2+x+1 - * - * @param b - * @param off - * @param len - * @return - */ - public static byte CRC8(final byte[] b, final int off, final int len) { - byte result = 0x00; - for (int i = 0; i < len; i++) { - result = CHECKSUM_TABLE[(result ^ (b[i + off] & 0xFF)) & 0xFF]; - } - return (byte) (result & 0xFFL); - } - - private final static byte[] CHECKSUM_TABLE = {(byte) 0x00, (byte) 0x07, (byte) 0x0e, (byte) 0x09, (byte) 0x1c, (byte) 0x1b, - (byte) 0x12, (byte) 0x15, (byte) 0x38, (byte) 0x3f, (byte) 0x36, (byte) 0x31, (byte) 0x24, (byte) 0x23, (byte) 0x2a, - (byte) 0x2d, (byte) 0x70, (byte) 0x77, (byte) 0x7e, (byte) 0x79, (byte) 0x6c, (byte) 0x6b, (byte) 0x62, (byte) 0x65, - (byte) 0x48, (byte) 0x4f, (byte) 0x46, (byte) 0x41, (byte) 0x54, (byte) 0x53, (byte) 0x5a, (byte) 0x5d, (byte) 0xe0, - (byte) 0xe7, (byte) 0xee, (byte) 0xe9, (byte) 0xfc, (byte) 0xfb, (byte) 0xf2, (byte) 0xf5, (byte) 0xd8, (byte) 0xdf, - (byte) 0xd6, (byte) 0xd1, (byte) 0xc4, (byte) 0xc3, (byte) 0xca, (byte) 0xcd, (byte) 0x90, (byte) 0x97, (byte) 0x9e, - (byte) 0x99, (byte) 0x8c, (byte) 0x8b, (byte) 0x82, (byte) 0x85, (byte) 0xa8, (byte) 0xaf, (byte) 0xa6, (byte) 0xa1, - (byte) 0xb4, (byte) 0xb3, (byte) 0xba, (byte) 0xbd, (byte) 0xc7, (byte) 0xc0, (byte) 0xc9, (byte) 0xce, (byte) 0xdb, - (byte) 0xdc, (byte) 0xd5, (byte) 0xd2, (byte) 0xff, (byte) 0xf8, (byte) 0xf1, (byte) 0xf6, (byte) 0xe3, (byte) 0xe4, - (byte) 0xed, (byte) 0xea, (byte) 0xb7, (byte) 0xb0, (byte) 0xb9, (byte) 0xbe, (byte) 0xab, (byte) 0xac, (byte) 0xa5, - (byte) 0xa2, (byte) 0x8f, (byte) 0x88, (byte) 0x81, (byte) 0x86, (byte) 0x93, (byte) 0x94, (byte) 0x9d, (byte) 0x9a, - (byte) 0x27, (byte) 0x20, (byte) 0x29, (byte) 0x2e, (byte) 0x3b, (byte) 0x3c, (byte) 0x35, (byte) 0x32, (byte) 0x1f, - (byte) 0x18, (byte) 0x11, (byte) 0x16, (byte) 0x03, (byte) 0x04, (byte) 0x0d, (byte) 0x0a, (byte) 0x57, (byte) 0x50, - (byte) 0x59, (byte) 0x5e, (byte) 0x4b, (byte) 0x4c, (byte) 0x45, (byte) 0x42, (byte) 0x6f, (byte) 0x68, (byte) 0x61, - (byte) 0x66, (byte) 0x73, (byte) 0x74, (byte) 0x7d, (byte) 0x7a, (byte) 0x89, (byte) 0x8e, (byte) 0x87, (byte) 0x80, - (byte) 0x95, (byte) 0x92, (byte) 0x9b, (byte) 0x9c, (byte) 0xb1, (byte) 0xb6, (byte) 0xbf, (byte) 0xb8, (byte) 0xad, - (byte) 0xaa, (byte) 0xa3, (byte) 0xa4, (byte) 0xf9, (byte) 0xfe, (byte) 0xf7, (byte) 0xf0, (byte) 0xe5, (byte) 0xe2, - (byte) 0xeb, (byte) 0xec, (byte) 0xc1, (byte) 0xc6, (byte) 0xcf, (byte) 0xc8, (byte) 0xdd, (byte) 0xda, (byte) 0xd3, - (byte) 0xd4, (byte) 0x69, (byte) 0x6e, (byte) 0x67, (byte) 0x60, (byte) 0x75, (byte) 0x72, (byte) 0x7b, (byte) 0x7c, - (byte) 0x51, (byte) 0x56, (byte) 0x5f, (byte) 0x58, (byte) 0x4d, (byte) 0x4a, (byte) 0x43, (byte) 0x44, (byte) 0x19, - (byte) 0x1e, (byte) 0x17, (byte) 0x10, (byte) 0x05, (byte) 0x02, (byte) 0x0b, (byte) 0x0c, (byte) 0x21, (byte) 0x26, - (byte) 0x2f, (byte) 0x28, (byte) 0x3d, (byte) 0x3a, (byte) 0x33, (byte) 0x34, (byte) 0x4e, (byte) 0x49, (byte) 0x40, - (byte) 0x47, (byte) 0x52, (byte) 0x55, (byte) 0x5c, (byte) 0x5b, (byte) 0x76, (byte) 0x71, (byte) 0x78, (byte) 0x7f, - (byte) 0x6a, (byte) 0x6d, (byte) 0x64, (byte) 0x63, (byte) 0x3e, (byte) 0x39, (byte) 0x30, (byte) 0x37, (byte) 0x22, - (byte) 0x25, (byte) 0x2c, (byte) 0x2b, (byte) 0x06, (byte) 0x01, (byte) 0x08, (byte) 0x0f, (byte) 0x1a, (byte) 0x1d, - (byte) 0x14, (byte) 0x13, (byte) 0xae, (byte) 0xa9, (byte) 0xa0, (byte) 0xa7, (byte) 0xb2, (byte) 0xb5, (byte) 0xbc, - (byte) 0xbb, (byte) 0x96, (byte) 0x91, (byte) 0x98, (byte) 0x9f, (byte) 0x8a, (byte) 0x8d, (byte) 0x84, (byte) 0x83, - (byte) 0xde, (byte) 0xd9, (byte) 0xd0, (byte) 0xd7, (byte) 0xc2, (byte) 0xc5, (byte) 0xcc, (byte) 0xcb, (byte) 0xe6, - (byte) 0xe1, (byte) 0xe8, (byte) 0xef, (byte) 0xfa, (byte) 0xfd, (byte) 0xf4, (byte) 0xf3}; } \ No newline at end of file diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java index 27c2838..6e078a3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java @@ -1,9 +1,6 @@ package com.casic.missiles.parser.safe.impl; -import cn.hutool.core.util.CharsetUtil; -import cn.hutool.crypto.symmetric.SM4; -import cn.hutool.crypto.symmetric.SymmetricCrypto; - +import com.casic.missiles.parser.safe.SafeStrategy; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; @@ -11,19 +8,44 @@ import org.bouncycastle.crypto.engines.SM4Engine; import org.bouncycastle.crypto.params.KeyParameter; import org.bouncycastle.util.encoders.Hex; - -import static cn.hutool.crypto.Mode.ECB; -import static cn.hutool.crypto.Padding.NoPadding; +import org.springframework.stereotype.Component; /** * SM4算法工具类 */ @Slf4j -public class Sm4 { +@Component("sm4") +public class Sm4 implements SafeStrategy { //加解密的字节快大小 public static final int BlockSize = 16; + @Override + public String decryption(String cipher) { + byte[] keyByte = { + 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 + }; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(keyByte); + byte[] in = Hex.decode(cipher); + byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); + String plain = EcbDecrypt(in, keyBytes); + return plain; + } + + @Override + public String encryption(String cipher) { + byte[] keyByte = { + 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 + }; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(keyByte); + byte[] in = Hex.decode(cipher); + byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); + String plain = EcbDecrypt(in, keyBytes); + return plain; + } + /** * SM4ECB加密算法,对内 * @@ -32,8 +54,6 @@ * @return */ private static byte[] ecb_encrypt(byte[] in, byte[] keyBytes) { - - SM4Engine sm4Engine = new SM4Engine(); sm4Engine.init(true, new KeyParameter(keyBytes)); byte[] out = new byte[in.length]; @@ -58,27 +78,6 @@ return cipher; } - - /** - * hutool 解密SM4 - * - * @param encodeContent - * @return - */ - public static String decode(String encodeContent) { - String key = "24ad182507479a5da3ad94d9d78ea203"; - try { - SymmetricCrypto sm4 = new SM4(ECB, NoPadding, key.getBytes()); - String decryptStr = sm4.decryptStr(encodeContent, CharsetUtil.CHARSET_UTF_8); - return decryptStr; - } catch (Exception e) { - e.printStackTrace(); - log.error("SM4解密失败"); - } - return null; - } - - /** * SM4的ECB加密算法 * @@ -129,20 +128,6 @@ return plain; } - /** - * SM4的ECB解密算法 - * - * @param cipher 输入的密文字符串 - * @param key 密钥 - * @return - */ - public static String EcbDecrypt(String cipher, String key) { - byte[] in = Hex.decode(cipher); - byte[] keyBytes = Hex.decode(key); - - String plain = EcbDecrypt(in, keyBytes); - return plain; - } /** * 主函数 @@ -151,28 +136,24 @@ */ public static void main(String[] args) { byte[] ciphertext = { + 0x4B, (byte) 0x8C, (byte) 0x9D, 0x08, (byte) 0xE4, (byte) 0xD3, 0x64, 0x42, (byte) 0xB9, (byte) 0xA5, (byte) 0xFE, (byte) 0xCD, (byte) 0x91, 0x1B, 0x38, (byte) 0xAC, (byte) 0xE9, 0x1C, (byte) 0xCD, 0x53, 0x02, (byte) 0xD7, 0x0C, (byte) 0x9B, (byte) 0x96, 0x30, 0x62, (byte) 0xE8, (byte) 0xFB, (byte) 0xEF, (byte) 0xB9, (byte) 0xFF, (byte) 0xDE, 0x19, (byte) 0x80, 0x35, 0x3E, (byte) 0x90, 0x4F, 0x2F, 0x12, 0x2B, 0x19, (byte) 0x8B, 0x6C, 0x7A, (byte) 0x85, (byte) 0xA1, (byte) 0xB1, (byte) 0x86, (byte) 0xA3, 0x7A, 0x46, 0x0C, 0x2F, (byte) 0x94, 0x4F, 0x7F, 0x2C, 0x56, 0x14, (byte) 0xF3, (byte) 0x89, (byte) 0xC3, - 0x3F, 0x20, (byte) 0xF9, (byte) 0x87, (byte) 0xA1, 0x60, (byte) 0xD9, (byte) 0xA8, (byte) 0xFD, (byte) 0xD7, (byte) 0x9B, 0x4B, 0x26, 0x06, 0x30, 0x44}; + 0x3F, 0x20, (byte) 0xF9, (byte) 0x87, (byte) 0xA1, 0x60, (byte) 0xD9, (byte) 0xA8, (byte) 0xFD, (byte) 0xD7, (byte) 0x9B, 0x4B, 0x26, 0x06, 0x30, 0x44 + }; ByteBuf in = ByteBufAllocator.DEFAULT.heapBuffer(); in.writeBytes(ciphertext); - byte[] keyByte = { 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 }; ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); - key.writeBytes(ciphertext); - String resCipherData = decode(ByteBufUtil.hexDump(in)); - ByteBuf out = ByteBufAllocator.DEFAULT.heapBuffer(); -// out.writeBytes(resCipherData); -// System.out.println(hexBytes); - System.out.println(resCipherData.toString()); -// String resPlainData = EcbDecrypt(resCipherData, key); -// System.out.println("原始明文:" + data); -// System.out.println("解密后明文:" + resPlainData); + key.writeBytes(keyByte); +// String resCipherData = EcbDecrypt(ByteBufUtil.hexDump(in), ByteBufUtil.hexDump(key)); +// System.out.println(resCipherData); } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java index 1395a51..ac5f957 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java @@ -1,7 +1,7 @@ package com.casic.missiles.parser.safe.impl; import io.netty.buffer.ByteBufUtil; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** *

@@ -14,9 +14,8 @@ * @author hyl * @version v1.0: Tea.java, v 0.1 2021/3/12 13:48 $ */ -@Service("tea") -///tea算法类 - +//tea算法类 +@Component("tea") public class Tea { public static byte[] MyTea_Encrypt(byte[] MyTeaContent, int ByteLen, byte[] MyTeakey) { @@ -99,7 +98,6 @@ // for(int i32Index = 0; i32Index < 8; i32Index++) { // System.out.print("0x" + Integer.toHexString(MyContent[i32Index]) + " "); // } - // System.out.println("密钥为:"); // for(int i32Index = 0; i32Index < 16; i32Index++) { // System.out.print("0x" + Integer.toHexString(MyKeys[i32Index]) + " "); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java index bdd0721..bd1516a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java @@ -3,7 +3,7 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.parser.sender.DataSubscribeProvider; import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponents; import org.springframework.web.util.UriComponentsBuilder; @@ -12,7 +12,7 @@ import java.util.Collections; import java.util.Map; -@Service("functionCallback") +@Component("functionCallback") public class FunctionCallback implements DataSubscribeProvider { @Resource diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java index 0b44fb9..7526de2 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.Map; -@Service("middleware") +@Component("middleware") public class MiddlewareSubscribe implements DataSubscribeProvider { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java index 5dcee3f..e2f1192 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.Map; -@Service("nosql") +@Component("nosql") public class NoSqlSubscribe implements DataSubscribeProvider { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java b/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java new file mode 100644 index 0000000..81a5324 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java @@ -0,0 +1,86 @@ +package com.casic.missiles.pojo; + +import lombok.Data; + +/** + * 协议 + */ +@Data +public class Msg { + + /** + * 前导码 + */ + private String preamble; + + /** + * 版本号 + */ + private String version; + + /** + * 内容长度 + */ + private int leng; + + /** + * 设备ID + */ + private String deviceId; + + /** + * 通讯方式 + */ + private Integer connType; + + /** + * 加密方式 + */ + private Integer encryType; + + /** + * 目标地址 + */ + private String destAddr; + + /** + * PDUType + */ + private String PDUType; + + /** + * 操作类型 + */ + private Integer operateType; + + /** + * 传输控制位 PDUType.bit7=0时,表示存在后续的访问;当PDUType.bit7=1时,表示无后续的访问。 + */ + private Integer transControlFlag; + + /** + * 设备类型 + */ + private Integer deviceType; + + /** + * 序号 + */ + private Integer seq; + + /** + * tagList + */ + private String tagList; + + /** + * OidList + */ + private String OidList; + + /** + * CRC + */ + private String CRC; + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java index 40a5265..97cc984 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java @@ -40,7 +40,7 @@ String httpContent = msg.toString(Charset.defaultCharset()); log.info(" String : " + msg.toString(Charset.defaultCharset())); String majorContent = httpContent.substring(httpContent.indexOf("{"), httpContent.lastIndexOf("}") + 1); - String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("serviceData")).get("Value")); + String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("RegistryData")).get("Value")); log.info("----------------------------------" + values); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); bufferContent.writeBytes(values.getBytes(Charset.forName("ISO-8859-1"))); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java index 1b132a7..e3ced4b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java @@ -35,7 +35,7 @@ String httpContent = msg.toString(Charset.defaultCharset()); log.info(" String : " + msg.toString(Charset.defaultCharset())); String majorContent = httpContent.substring(httpContent.indexOf("{"), httpContent.lastIndexOf("}") + 1); - String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("serviceData")).get("Value")); + String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("RegistryData")).get("Value")); log.info("----------------------------------" + values); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); bufferContent.writeBytes(values.getBytes(Charset.forName("ISO-8859-1"))); diff --git a/sensorhub-core/src/main/resources/application.properties b/sensorhub-core/src/main/resources/application.properties deleted file mode 100644 index 8b13789..0000000 --- a/sensorhub-core/src/main/resources/application.properties +++ /dev/null @@ -1 +0,0 @@ - diff --git a/sensorhub-core/src/main/resources/config/application-dev.yml b/sensorhub-core/src/main/resources/config/application-dev.yml index 4f897a8..dcc4c2d 100644 --- a/sensorhub-core/src/main/resources/config/application-dev.yml +++ b/sensorhub-core/src/main/resources/config/application-dev.yml @@ -4,9 +4,9 @@ spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true + url: jdbc:mysql://127.0.0.1:3306/sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true username: root - password: Casic203 + password: root session: store-type: redis redis: diff --git a/sensorhub-core/src/main/resources/config/application.yml b/sensorhub-core/src/main/resources/config/application.yml index ae89f9d..7965da1 100644 --- a/sensorhub-core/src/main/resources/config/application.yml +++ b/sensorhub-core/src/main/resources/config/application.yml @@ -30,6 +30,13 @@ port: 6379 password: ew5T4K3#203lwh config-prefix: 'Casic:' +#代码生成器配置 +code: + generate: + #作者 + author: cz + #待生成对象表名 + table-name: bussiness_field_config,combined_field_config sensorhub: config: port: 7091 diff --git a/sensorhub-support/pom.xml b/sensorhub-support/pom.xml index 9a71296..761601c 100644 --- a/sensorhub-support/pom.xml +++ b/sensorhub-support/pom.xml @@ -42,6 +42,12 @@ ${redis.version} + + com.baomidou + mybatis-plus-generator + ${mybatis-plus-generator.version} + + org.reflections diff --git a/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java b/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java new file mode 100644 index 0000000..515ca53 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java @@ -0,0 +1,14 @@ +package com.casic.missiles.enums; + +/** + * @author + * @date + */ +public interface FixedPropertyEnum { + + String FIXED_POSITION = "fixedPosition"; + + String TOTAL_LENGTH = "totalLength"; + + String TAIL_POSITION = "tailPosition"; +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/CombinedFieldMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CombinedFieldMapper.java new file mode 100644 index 0000000..38e8f42 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CombinedFieldMapper.java @@ -0,0 +1,15 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.CombinedFieldConfig; +import org.apache.ibatis.annotations.Mapper; + +/** + * @author cz + * + */ +@Mapper +public interface CombinedFieldMapper extends BaseMapper { + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java new file mode 100644 index 0000000..128b09d --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java @@ -0,0 +1,10 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.CommandEventConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface CommandEventMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java new file mode 100644 index 0000000..042eb3c --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.DatagramEventConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface DatagramEventConfigMapper extends BaseMapper { +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java new file mode 100644 index 0000000..fc95cf4 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java @@ -0,0 +1,8 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.FieldConfig; + +public interface FieldConfigMapper extends BaseMapper { + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java index 608af3a..32cc8a4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java @@ -2,48 +2,47 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.delivery.decorator.ByteDecorator; +import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @AllArgsConstructor public class FieldDecoratorManger { - private final RuleDictDao ruleDictDao; + private final RuleConfigRegistry ruleDictDao; // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 // (1)静态的业务字段是字典里面可以配置的 // (2)动态的业务字段是通过规则生成的 public String contentMerge(String ruleJson, String sceneConent, String dynamicContent) { - List ruleDictList = ruleDictDao.getRuleDictConfig(); - Map ruleDictMap = ruleDictList.stream().collect( - Collectors.toMap(RuleDict::getId, e -> e)); - List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); - for (Map ruleMap : ruleMapList) { - String ruleType = String.valueOf(ruleMap.get("ruleType")); - ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); - NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); - byteDecorator.nodeDecoratorRule(nodeDecoratorParm); - } +// List ruleDictList = ruleDictDao.getRuleDictConfig(); +// Map ruleDictMap = ruleDictList.stream().collect( +// Collectors.toMap(RuleDict::getId, e -> e)); +// List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); +// for (Map ruleMap : ruleMapList) { +// String ruleType = String.valueOf(ruleMap.get("ruleType")); +// ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); +// NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); +// byteDecorator.nodeDecoratorRule(nodeDecoratorParm); +// } return null; } - - private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { - NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() - .contents(sceneConent) - .dynamicContent(dynamicContent) - .ruletypeId(ruletypeId) - .ruleDictMap(ruleDictMap) - .build(); - return nodeDecoratorParm; - } +// +// private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { +// NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() +// .contents(sceneConent) +// .dynamicContent(dynamicContent) +// .ruletypeId(ruletypeId) +// .ruleDictMap(ruleDictMap) +// .build(); +// return nodeDecoratorParm; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java index 652970c..b204ac3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java @@ -1,56 +1,56 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@AllArgsConstructor -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", - JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Component; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Component("logicalDecorator") +//@AllArgsConstructor +//@Slf4j +//public class LogicalShiftDecorator implements ByteDecorator { +// +//// private final FieldRuleEngineMapper fieldRuleEngineMapper; +//// +//// //字节位移 +//// @Override +//// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +//// String logicalValue = ""; +//// RuleEvaluator fieldRuleEngine = new RuleEvaluator(); +//// try { +//// Map env2 = new HashMap(); +//// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +//// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +//// for (String contentId : contentIdList) { +//// RuleDict ruleDict = ruleDictMap.get(contentId); +//// if (ruleDict.getCode().contains("#")) { +//// //使用动态的值 +//// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +//// } +//// env2.put(ruleDict.getName(), ruleDict.getCode()); +//// } +//// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +//// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +//// return null; +//// } +//// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +//// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +//// return values; +//// } catch (Exception ex) { +//// log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", +//// JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +//// return null; +//// } +//// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java index 346468f..822fead 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@AllArgsConstructor -@Slf4j -public class OperationDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("optionDecorator") +//@AllArgsConstructor +//@Slf4j +//public class OperationDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //混合运算,有常量或者乘除的缩放 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java index 50fb0a7..7a8bccb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@AllArgsConstructor -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +////精度计算 +//@AllArgsConstructor +//@Registry("precisionDecorator") +//@Slf4j +//public class PrecisionDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java index da39235..27f9cc7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java @@ -1,54 +1,53 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@AllArgsConstructor -@Slf4j -public class RuleDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("ruleDecorator") +//@AllArgsConstructor +//@Slf4j +//public class RuleDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //吃我一套正则表达式 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (Exception ex) { +// log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java index 7f5cbf3..c043f97 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java @@ -2,6 +2,6 @@ import java.util.Map; -public interface ComandeEventService { +public interface ComandeEventService{ Map loadComandeEventConfig(String protocolId,String scene); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java index 476ad84..aaf1837 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java @@ -2,46 +2,46 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.dao.CommandEventDao; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @Slf4j @AllArgsConstructor -public class ComandeEventServiceImpl implements ComandeEventService { +public class ComandeEventServiceImpl implements ComandeEventRegistry { - private final CommandEventDao commandEventDao; + // private final CommandEventDao commandEventDao; // 加密bean 固定字段出现变化的字段解析,业务字段的有序内容 @Override - public Map loadComandeEventConfig(String protocolId,String sceneName) { - CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); - if (ObjectUtil.isEmpty(commandEventConfig)) { - log.error("协议{},没有配置成功接收回复配置,清排查原因"); - return null; - } - String replyJson = commandEventConfig.getReplyContentJson(); - List> replyMapList = JSONArray.parseObject(replyJson, List.class); - List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); - Map fixMap = fixList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); - List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) - .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) - .collect(Collectors.toList()); - Map commandConfigMap = new HashMap<>(); - commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); - commandConfigMap.put("fixContent", fixMap); - commandConfigMap.put("bizContent", contentList); - return commandConfigMap; + public Map loadComandeEventConfig(String protocolId, String sceneName) { +// CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); +// if (ObjectUtil.isEmpty(commandEventConfig)) { +// log.error("协议{},没有配置成功接收回复配置,清排查原因"); +// return null; +// } +// String replyJson = commandEventConfig.getReplyContentJson(); +// List> replyMapList = JSONArray.parseObject(replyJson, List.class); +// List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); +// Map fixMap = fixList.stream() +// .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); +// List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) +// .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) +// .collect(Collectors.toList()); +// Map commandConfigMap = new HashMap<>(); +// commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); +// commandConfigMap.put("fixContent", fixMap); +// commandConfigMap.put("bizContent", contentList); +// return commandConfigMap; + return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 128b09d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java deleted file mode 100644 index 4016b0b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface DatagramEventMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java deleted file mode 100644 index 597c306..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.apache.ibatis.annotations.Mapper; - -public interface FieldConfigMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java deleted file mode 100644 index a31680a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.PreRuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface PreRuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java deleted file mode 100644 index 9060a69..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface ProtocolConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java deleted file mode 100644 index 6fa6936..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java deleted file mode 100644 index 582a705..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleDict; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleDictMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java deleted file mode 100644 index 6e302c8..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.CommandEventMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Optional; - -@Component -public class CommandEventDao { - - @Resource - private CommandEventMapper commandEventMapper; - - public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId) - .eq("scene", sceneName) - .eq("enabled", 1); - List commandEventConfig = commandEventMapper.selectList(queryWrapper); - Optional optionalEventConfig = commandEventConfig.stream().findFirst(); - return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java deleted file mode 100644 index 9137e4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.FieldConfigMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class FieldConfigDao { - - @Resource - private FieldConfigMapper fieldConfigMapper; - - public FieldConfig getFieldConfigById(String fieldId) { - FieldConfig fieldConfig = fieldConfigMapper.selectById(fieldId); - return fieldConfig; - } - - public List getFieldConfigs(String protocolId,Integer isFixed) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",isFixed); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - - public List getStorageFieldConfig(String protocolId) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",1) - .eq("is_storage",1); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java deleted file mode 100644 index 67bff6b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.mapper.PreRuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class PreRuleConfigDao { - - @Resource - private PreRuleConfigMapper preRuleConfigMapper; - - public List getPreRuleList(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return preRuleConfigMapper.selectList(queryWrapper); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java deleted file mode 100644 index d69ea85..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.RuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleConfigDao { - - @Resource - private RuleConfigMapper ruleConfigMapper; - - public RuleConfig getNextRuleConfig(String ruleFields) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("parse_rule_json", ruleFields); - return ruleConfigMapper.selectOne(queryWrapper); - } - - - public List getRuleConfigById(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return ruleConfigMapper.selectList(queryWrapper); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java deleted file mode 100644 index 932c185..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.RuleDictMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleDictDao { - - @Resource - private RuleDictMapper ruleDictMapper; - - public List getRuleDictConfig() { - List ruleDictList = ruleDictMapper.selectList(null); - return ruleDictList; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java index 9f9e279..43bc4d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java @@ -10,20 +10,15 @@ import io.netty.channel.socket.nio.NioServerSocketChannel; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import javax.annotation.PreDestroy; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static cn.hutool.core.util.ClassUtil.getClasses; /** * SensorhubServer netty服务端 */ @Slf4j -@Service +@Component public class SensorhubServer { /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java index 2c79ff5..9a28c36 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java @@ -11,13 +11,13 @@ import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioSocketChannel; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClient 客户端 */ @Slf4j -@Service +@Registry public final class SensorhubClient { public static void main(String[] args) throws Exception { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java index 9774be0..477c3f7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java @@ -6,12 +6,12 @@ import io.netty.channel.socket.SocketChannel; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientChannelInitialHandler */ -@Service +@Registry public class SensorhubClientChannelInitialHandler extends ChannelInitializer { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java index 346f4b3..73560e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java @@ -5,13 +5,13 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientHandler */ @Slf4j -@Service +@Registry public class SensorhubClientHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java index 5c1c6f2..d990af5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java @@ -4,12 +4,12 @@ import com.casic.missiles.pojo.Msg; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** * SensorhubServerHandler */ -@Service +@Component public class SensorhubServerHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 67283ae..af3172c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,41 +1,37 @@ package com.casic.missiles.parser; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultProtocolConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.*; +import com.casic.missiles.registry.FieldConfigRegistry; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; -import java.nio.charset.Charset; import java.util.HashMap; import java.util.List; import java.util.Map; -@Service("genericProtocolParser") +/** + * @author + */ +@Component("genericProtocolParser") @Slf4j -@AllArgsConstructor +@RequiredArgsConstructor public class GenericProtocolParser implements ProtocolParser { - private final LeadingCodeMatcher leadingCodeMatcher; private final List frameStructDispenserList; - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorInstanceSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; // 匹配首字母前导码=> 帧结构匹配前导码=> // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 @@ -44,18 +40,19 @@ public Boolean doParseProtocol(ByteBuf byteBuf) { String protocolContent = ByteBufUtil.hexDump(byteBuf); //匹配前导码 - List preCodeConfigs = leadingCodeMatcher.matchLeadingCode(protocolContent); + List preCodeConfigs = LeadingCodeMatcher.matchFrameLeadingCode(protocolContent); //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 if (preCodeConfigs.size() == 0) { - return rematch(byteBuf,protocolContent); + return rematch(byteBuf, protocolContent); } - //暂时先取第一个 + //暂时先取第一个,提升速度,使用享元模式, 减少类的创建销毁与构建 ProtocolConfig protocolConfig = preCodeConfigs.get(0); + AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); ByteBuf wholeDatagramByte = null; //通过匹配帧结构获取完整的数据包 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, preCodeConfigs.get(0))) != null) { + if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, protocolFactory)) != null) { break; } } @@ -68,76 +65,78 @@ * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 */ - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId, wholeDatagramByte); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap, protocolId); - //选取规则对应的流程实例 - DatagramEventConfig datagramEventConfig = processorInstanceSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); + //进行规则字段解析,进行匹配规则 + RuleConfig ruleConfig = getRuleConfig(protocolFactory, wholeDatagramByte); + if (ruleConfig == null) { + return false; + } //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, wholeDatagramByte); + ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte); + //以下进行业务的规则解析,同时选定流程实例 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); + DatagramEventProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain, + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText, protocolId); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain); //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); + datagramEventProvider.storeData(bizDataMap); return true; } - private Boolean rematch(ByteBuf byteBuf,String protocolContent) { + /** + * 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 + */ + private Boolean rematch(ByteBuf byteBuf, String protocolContent) { //重置位判断 byteBuf.resetReaderIndex(); //判断重置是否前移,如果没有前移,则直接判为匹配失败 if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { return false; } else { + //递归执行 return doParseProtocol(byteBuf); } } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; + //获取匹配规则->匹配规则 + private RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + //取出其中参与逻辑provider并判空 + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); + String rulePrepareFields = protocolConfig.getRulePrepareFields(); + //固定字段 + if (StringUtils.isNotEmpty(rulePrepareFields)) { + //获取统一固定字段解析 + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + //获取该协议的字段配置,用于协议规则匹配 + List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); + //获取规则 + RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, + rulePrepareFields, protocolFieldConfigs); + return ruleConfig; + } + return null; } - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + //数据构建,获取固定字段的store和业务字段store + private Map buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + Map bizDataMap = new HashMap<>(); + Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); + Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); + bizDataMap.putAll(ruleStoreObjectMap); + bizDataMap.putAll(protocolStoreObjectMap); return bizDataMap; } - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java index 8a46e32..16ce2e5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java @@ -3,6 +3,7 @@ import io.netty.buffer.ByteBuf; public interface ProtocolParser { + Boolean doParseProtocol(ByteBuf byteBuf); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java new file mode 100644 index 0000000..f7814af --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java @@ -0,0 +1,35 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.ProtocolConfigProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.ProtocolConfig; + +/** + * 存放基本协议的的加载信息 + */ +public class AbstractProtocolConfigFactory { + private final ProtocolConfigProvider protocolConfigProvider; + private final ProtocolFieldConfigProvider protocolFieldConfigProvider; + private final RuleConfigProvider ruleConfigProvider; + + public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { + this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); + this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); + this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); + } + + public ProtocolConfigProvider getProtocolConfigProvider() { + return protocolConfigProvider; + } + + public ProtocolFieldConfigProvider getProtocolFieldConfigProvider() { + return protocolFieldConfigProvider; + } + + public RuleConfigProvider getRuleConfigProvider() { + return ruleConfigProvider; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java new file mode 100644 index 0000000..6e36147 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java @@ -0,0 +1,57 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.CombinedFieldConfigProvider; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.FieldConfigProvider; +import com.casic.missiles.parser.provider.FieldRuleConfigProvider; + +/** + * 存放规则相关的的的加载信息 + */ +public class AbstractRuleConfigFactory { + + /** + * 处理字节 + */ + private final FieldConfigProvider fieldConfigProvider; + /** + * 处理组合字节解析的解码器 + */ + private final CombinedFieldConfigProvider combinedFieldConfigProvider; + /** + * 处理负责字节解析的规则配置 + */ + private final FieldRuleConfigProvider fieldRuleConfigProvider; + /** + * 处理实例流程 + */ + private final DatagramEventProvider datagramEventProvider; + + + public AbstractRuleConfigFactory(Long ruleId) { + this.fieldConfigProvider = new FieldConfigProvider(ruleId); + this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); + this.fieldRuleConfigProvider = new FieldRuleConfigProvider(ruleId); + this.datagramEventProvider = new DatagramEventProvider(ruleId); + } + + public FieldConfigProvider getFieldConfigProvider() { + return fieldConfigProvider; + } + + public CombinedFieldConfigProvider getCombinedFieldConfigProvider() { + return combinedFieldConfigProvider; + } + + public FieldRuleConfigProvider getFieldRuleConfigProvider() { + return fieldRuleConfigProvider; + } + + public DatagramEventProvider getDatagramEventProvider() { + return datagramEventProvider; + } + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java deleted file mode 100644 index 6e1719a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.factory; - - -import com.casic.missiles.pojo.ProtocolConfig; - -import java.util.List; - -/** - * 数据库访问优化(暂时未做) - *

- * 1、初始化协议解析配置,并存放到处存放缓存,对协议基本配置进行管理 - * 2、其中流程中所有的配置都经过此类进行管理,进行调用获取,增强解析速度 - */ -public interface DatagramFactory { - - /** - * 初始化 - */ - List datagramInit(); - - /** - * 根据前导码配置匹配,模糊匹配获取所有的报文项 - */ - List match(); - - /** - * 根据前导码匹配,返回报文项 - */ - List filer(); - - /** - * 保证数据的唯一性选择器 - */ - List selectOne(); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java new file mode 100644 index 0000000..87444a0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java @@ -0,0 +1,18 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +import java.util.List; + +/** + * 直接用,还是边用边创建 + */ +public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { + + + public DefaultProtocolConfigFactory(ProtocolConfig protocolConfig) { + super(protocolConfig); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java new file mode 100644 index 0000000..cce0c7c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java @@ -0,0 +1,12 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; + +public class DefaultRuleFactory extends AbstractRuleConfigFactory { + + public DefaultRuleFactory(Long ruleId) { + super(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java deleted file mode 100644 index 9ee97e0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.casic.missiles.parser.instance; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service -@Slf4j -@AllArgsConstructor -public class GeneralProcessor { - - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; - - /** - * 统一固定字段解析=>进行规则的查询的判断 - * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 - * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 - */ - @Deprecated - public boolean parseWholeDatagram(ByteBuf buffer, ProtocolConfig protocolConfig) { - try { - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap,protocolId); - //选取规则对应的流程= - DatagramEventConfig datagramEventConfig = processorSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); - //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); - //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); - //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); - //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); - //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); - return true; - } catch (Exception ex) { - log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", - ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); - return false; - } - } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; - } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); - } - - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); - return bizDataMap; - } - - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java index 25e7ad8..6a5777e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java @@ -1,23 +1,31 @@ package com.casic.missiles.parser.instance.impl; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.mapper.DatagramEventMapper; import com.casic.missiles.pojo.DatagramEventConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.SpringContextUtil; -@Service -@AllArgsConstructor +import java.util.List; +import java.util.Optional; + +/** + * @author cz + * + */ public class DefaultProcessorInstanceSelector implements ProcessorInstanceSelector { - private final DatagramEventMapper datagramEventMapper; + private static List datagramEventConfigs; + + static { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + datagramEventConfigs = datagramEventRegistry.getDatagramEventList(); + } @Override public DatagramEventConfig getProcessorInstance(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("rule_id", protocolId); - return datagramEventMapper.selectOne(queryWrapper); + Optional optionalSelectInstance = datagramEventConfigs.stream() + .filter(e -> e.getId().equals(protocolId)).limit(1).findFirst(); + return optionalSelectInstance.isPresent() ? optionalSelectInstance.get() : null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a778671..7b56a43 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,16 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import io.netty.buffer.ByteBuf; /** - * 分析匹配情况 - * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 - * 2、匹配不成功,有后续帧,可以进行下次匹配。 - * 3、匹配不成功,无后续帧,可以进行丢弃。 + * 分析匹配情况 + * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 + * 2、匹配不成功,有后续帧,可以进行下次匹配。 + * 3、匹配不成功,无后续帧,可以进行丢弃。 */ -public interface FrameStructMatcher{ +public interface FrameStructMatcher { - ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig); + ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 05320ab..8ebea78 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,23 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.ProtocolConfigMapper; +import com.casic.missiles.parser.provider.ProtocolConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Component; import java.util.List; import java.util.stream.Collectors; -@Component -@AllArgsConstructor public class LeadingCodeMatcher { - private final ProtocolConfigMapper protocolMapper; - //** 1、首字母匹配前导码, // 2、以匹配出的前导码是否在报文中条件进行前导码的匹配二次筛选 - public List matchLeadingCode(String protocolContent){ + public static List matchFrameLeadingCode(String protocolContent){ List initialConfigs = initialMatch(protocolContent); List preCodeConfigs = initialConfigs.stream() .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) @@ -26,13 +19,16 @@ } //初始化匹配前导码内容 - private List initialMatch(String protocolContent) { - String protocolStr = protocolContent.charAt(0) + ""; - QueryWrapper queryWrapper = new QueryWrapper() - .likeRight("pre_fix", protocolStr); - List protocolConfigList = protocolMapper.selectList(queryWrapper); - return protocolConfigList; + private static List initialMatch(String protocolContent) { + String firstFrameChar = protocolContent.charAt(0) + ""; + ProtocolConfigProvider protocolConfigProvider=new ProtocolConfigProvider(firstFrameChar); + return protocolConfigProvider.getMatchList(); } + + + + + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index cf2113d..e915877 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -1,32 +1,35 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(0) -@Service +@Component public class FrameLengthMatcher implements FrameStructMatcher { - @Autowired - private FieldParser fieldParser; - //超过长度 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { String dataGramContent = ByteBufUtil.hexDump(byteBuf); - if (StringUtils.isEmpty(protocolConfig.getUnpackId()) && StringUtils.isEmpty(protocolConfig.getTailStr())) { - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + //当不存在结尾标志和拆包标志,可以直接使用长度进行匹配 + if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { if (dataGramContent.length() >= totalLength) {//等于长度返回true,超出长度,切断 - ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, protocolConfig, totalLength); + ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, totalLength); return wholeDatagramByte; } else { //读的标志位前移舍弃 @@ -38,7 +41,7 @@ return null; } - private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, Integer totalLength) { byteBuf.readBytes(totalLength); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, totalLength - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 2bfc213..d527ad0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; @@ -13,7 +13,7 @@ import lombok.AllArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.nio.charset.Charset; import java.util.Map; @@ -22,32 +22,30 @@ * 后续标志验证 */ @Order(1) -@Service +@Component @AllArgsConstructor -public class FrameMarkMatcher implements FrameStructMatcher { - - private final FieldConfigDao fieldConfigDao; - private final FieldParser fieldParser; - private final FieldResolver fieldResolverManger; +public class FrameMarkMatcher implements FrameStructMatcher, FixedPropertyEnum { //帧后续标志=>结束,进行帧的重组=>有后续,1、帧移位判别 2、继续接收帧 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig UnpackConfig = StringUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getUnpackId()); - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); - Integer upback = 0; + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); ByteBuf mergeWholeFrameByte = null; - if (!ObjectUtil.isEmpty(UnpackConfig)) { - while (hasNextFullFrame(byteBuf, protocolConfig)) { - upback = (Integer) fieldResolverManger.filedParserManger(byteBuf, UnpackConfig, null); + if (!ObjectUtil.isEmpty(unpackFlag)) { + while (hasNextFullFrame(byteBuf, protocolConfig, protocolFieldConfigProvider)) { //是否存在后续位 - if (upback == 1) {//使用esayRule + if (unpackFlag == 1) {//使用esayRule //表示可以截取 - mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolConfig, totalLength); + mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolFieldConfigProvider, protocolConfig); return mergeWholeFrameByte; } else { - byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig)); + byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig, protocolFieldConfigProvider)); } } } @@ -56,7 +54,8 @@ //选取第一个帧,将业务内容和后面部分分开 //计算数据报文-业务内容 - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolFieldConfigProvider protocolFieldConfigProvider, ProtocolConfig protocolConfig) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); //截取完整报文 byteBuf.readBytes(totalLength); ByteBuf byteBufContent = byteBuf.slice(0, byteBuf.readerIndex()); @@ -68,15 +67,15 @@ String tail = ""; System.out.println(ByteBufUtil.hexDump(byteBufContent)); //会存在多个帧拼接在一起的的情况,进行合并处理 - while (hasNextFullFrame(byteBufContent, protocolConfig)) { - Integer currentFrameLength = fieldParser.getTotalLength(protocolConfig, byteBufContent); + while (hasNextFullFrame(byteBufContent, protocolConfig, protocolFieldConfigProvider)) { + Integer currentFrameLength = protocolFieldConfigProvider.getTotalLength(byteBufContent, protocolConfig); byteBufContent.readBytes(currentFrameLength); ByteBuf currentbyteBuf = byteBufContent.slice(0, byteBufContent.readerIndex()); byteBufContent.markReaderIndex();//读的标志位前移 System.out.println(ByteBufUtil.hexDump(byteBufContent)); String hexDump = currentbyteBuf.toString(Charset.forName("ISO-8859-1")); //获取当前固定帧结构的关系map - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, currentbyteBuf); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(currentbyteBuf, protocolConfig); if (StringUtils.isEmpty(mergeFrameStr)) { //首次获取业务数据报文 mergeFrameStr += hexDump.substring(0, currentFrameFixedProperty.get("tailPosition")); @@ -95,22 +94,22 @@ /** * 获取平移到下一帧起始位置 */ - public int getNextFrameOffset(ByteBuf buffer, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, buffer); - return currentFrameFixedProperty.get("totalLength"); + public int getNextFrameOffset(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + return currentFrameFixedProperty.get(TOTAL_LENGTH); } /** * 判断是否出错进行整个帧的 */ - public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, byteBuf); + public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); //保证读取位置不在固定位置,是可变的业务内容 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("fixedPosition")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(FIXED_POSITION)) { return false; } //判断读取是否操作帧长度 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("totalLength")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(TOTAL_LENGTH)) { return false; } return true; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 76a3784..c3a1bab 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -1,50 +1,50 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.parser.instance.GeneralProcessor; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; +import io.netty.buffer.ByteBufUtil;; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(2) -@Service +@Component public class FrameTailMatcher implements FrameStructMatcher { - @Resource - private FieldConfigDao fieldConfigDao; - @Autowired - private GeneralProcessor generalProcessor; - //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig tailFieldConfig = StringUtils.isEmpty(protocolConfig.getTailStr()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getTailStr()); - if (!ObjectUtil.isEmpty(tailFieldConfig)) { - String tailStr = tailFieldConfig.getFieldName(); + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfig protocolFieldConfig = ObjectUtils.isEmpty(protocolConfig.getTailStr()) ? null : + fieldConfigProvider.getFieldConfigById(protocolConfig.getTailStr()); + if (!ObjectUtil.isEmpty(protocolFieldConfig)) { + String tailStr = protocolFieldConfig.getFieldName(); String dataGramContent = ByteBufUtil.hexDump(byteBuf); Boolean tailFlag = ByteBufUtil.hexDump(byteBuf).contains(tailStr); if (!tailFlag) { //使用esayRule return null; } else if (dataGramContent.indexOf(tailStr) < dataGramContent.length() - tailStr.length()) { Integer length = dataGramContent.indexOf(tailStr) + tailStr.length(); - ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, protocolConfig, length); + ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, length); return wholeDatagramByte; //存在粘包 } } return null; } - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer length) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, Integer length) { byteBuf.readBytes(length); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, length - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java new file mode 100644 index 0000000..5f1c177 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java @@ -0,0 +1,73 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.combined.GenericCombinedFieldResolver; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.CombinedFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class CombinedFieldConfigProvider { + + + /** + * 作为临时配置列表缓存使用 + */ + private final List combinedFieldConfigList; + private Map storeObjectMap = new HashMap<>(); + + public CombinedFieldConfigProvider(Long ruleId) { + CombinedFieldConfigRegistry combinedFieldConfigRegistry = SpringContextUtil.getBean(CombinedFieldConfigRegistry.class); + combinedFieldConfigList = combinedFieldConfigRegistry.getCombinedFieldConfigList(ruleId); + } + + public void parseDataField(RuleConfig ruleConfig, String clearZeroPlain,Map fieldConfigsMap ) { + if (showSkip()) { + return; + } + //匹配对应的数据,然后进行相关的字段解析 + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver(); + combinedFieldResolver.parseDataField(combinedFieldConfigList, byteBuf, storeObjectMap,fieldConfigsMap); + } + + + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getCombinedFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return combinedFieldConfigList.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public List getCombinedFieldConfigList() { + return combinedFieldConfigList; + } + + /* 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(combinedFieldConfigList) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java new file mode 100644 index 0000000..f3cfedc --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java @@ -0,0 +1,11 @@ +package com.casic.missiles.parser.provider; + +/** + * @author cz + * @date 2023-6-12 + */ +public class CommandEventProvider{ + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java new file mode 100644 index 0000000..70eec5e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java @@ -0,0 +1,77 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.safe.SafeStrategy; +import com.casic.missiles.parser.sender.DataSubscribeProvider; +import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class DatagramEventProvider { + + private final DatagramEventConfig processorInstance; + + public DatagramEventProvider(Long ruleId) { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + List datagramEventConfigList = + datagramEventRegistry.getDatagramEventList(ruleId); + processorInstance = this.getProcessorInstance(datagramEventConfigList); + } + + public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { + if (showSkip()) { + return null; + } + return datagramEventConfigList.get(0); + } + + // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 + public String getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap) { + String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? + processorInstance.getSafeBean() : + fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); + if (!StringUtils.isEmpty(safeName)) { + //需要加密 + SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); + String plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); + return clearComplementZero(plain); + } + return ByteBufUtil.hexDump(bizDataContent); + } + + //解密清零操作 + private String clearComplementZero(String plain) { + plain = plain.substring(0, plain.lastIndexOf("00")); + return plain; + } + + //数据发送,数据发送者暂未构建 + public void storeData(Map bizDataMap) { + DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); +// dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return ObjectUtils.isNotEmpty(processorInstance) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java new file mode 100644 index 0000000..7e1fe0a --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java @@ -0,0 +1,97 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.FieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class FieldConfigProvider { + + + private final List fieldConfigs; + private Map storeObjectMap = new HashMap<>(); +// private Map singleObjects = new ConcurrentHashMap<>(); + + public FieldConfigProvider(Long ruleId) { + FieldConfigRegistry fieldConfigRegistry = SpringContextUtil.getBean(FieldConfigRegistry.class); + fieldConfigs = fieldConfigRegistry.getFieldConfigList(ruleId); + } + + public List getFieldConfigs() { + return fieldConfigs; + } + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public Map parseDataField(RuleConfig ruleConfig, String clearZeroPlain) { + if (showSkip()) { + return null; + } + List prepareFieldConfig = prepareParseField(ruleConfig); + if (CollectionUtils.isNotEmpty(prepareFieldConfig)) { + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(fieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + return fixDataMap; + } + } + return null; + } + + /** + * 得到需要处理的业务内容 + * + * @return + */ + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return fieldConfigs.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public Map getFieldConfigsMap() { + return fieldConfigs.stream().collect( + Collectors.toMap(FieldConfig::getId, e -> e) + ); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(fieldConfigs) ? false : true; + } + + +} + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java new file mode 100644 index 0000000..817bfaf --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java @@ -0,0 +1,19 @@ +package com.casic.missiles.parser.provider; + +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.registry.FieldRuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; + +public class FieldRuleConfigProvider { + + private final List fieldRuleConfigList; + + public FieldRuleConfigProvider(Long ruleId) { + FieldRuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(FieldRuleConfigRegistry.class); + fieldRuleConfigList = ruleConfigRegistry.getFieldRuleConfigList(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java new file mode 100644 index 0000000..99a1b06 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java @@ -0,0 +1,53 @@ +package com.casic.missiles.parser.provider; + + +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.registry.ProtocolConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolConfigProvider { + + private final List protocolConfigList; + + public ProtocolConfigProvider(String firstChar) { + ProtocolConfigRegistry registry = SpringContextUtil.getBean(ProtocolConfigRegistry.class); + protocolConfigList = registry.getProtocolConfigList(firstChar); + } + + public List getMatchList() { + return protocolConfigList; + } + + /** + * 设置当前协议 + * + * @param protocolConfig + */ + public ProtocolConfigProvider(ProtocolConfig protocolConfig) { + List protocolConfigs = new ArrayList<>(); + protocolConfigs.add(protocolConfig); + protocolConfigList = protocolConfigs; + } + + /** + * 获取当前协议 + * + * @return + */ + public ProtocolConfig getCurrentProtocolConfig() { + if (this.protocolConfigList == null) { + return null; + } else { + return protocolConfigList.get(0); + } + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java new file mode 100644 index 0000000..043927d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java @@ -0,0 +1,213 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.registry.ProtocolFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolFieldConfigProvider { + + private static final String FIXED_FIELD_DS = "fixedFieldDs"; + private static final String CONTENT_FIELD_DS = "contentFieldDs"; + private static final String PROTOCOL_LENGTH = "protocolLength"; + private static final String PROTOCOL_FIELD_ID = "protocolFieldId"; + private static final String PROTOCOL_POSITION = "protocolPosition"; + + private final List protocolFieldConfigs; + private Map singleObjects = new ConcurrentHashMap<>(); + private Map storeObjectMap = new HashMap<>(); + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public ProtocolFieldConfigProvider(Long protocolId) { + ProtocolFieldConfigRegistry protocolFieldConfigRegistry = SpringContextUtil.getBean(ProtocolFieldConfigRegistry.class); + protocolFieldConfigs = protocolFieldConfigRegistry.getProtocolFieldConfigList(protocolId); + } + + public List getProtocolFieldConfigs() { + return protocolFieldConfigs; + } + + public ProtocolFieldConfig getFieldConfigById(Long fieldId) { + Optional optionalConfig = protocolFieldConfigs.stream().filter( + e -> e.getId().equals(fieldId) + ).findFirst(); + return optionalConfig.isPresent() ? optionalConfig.get() : null; + } + + public Integer getProtocolFieldValue(Long protocolFieldId, ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_FIELD_ID + protocolFieldId + ByteBufUtil.hexDump(byteBuf); + //获取缓存 + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + //加载固定长度数据集合 + Map fixDataMap = this.getProtocolDataMap(byteBuf); + ProtocolFieldConfig protocolFieldConfig = selectFieldConfig(protocolFieldId); + Integer protocolFieldValue = 0; + //获取约定字段的总长度 + if (fixDataMap.containsKey(protocolFieldConfig.getFieldName())) { + Object appointUnpackObject = fixDataMap.get(protocolFieldConfig.getFieldName()); + if (ObjectUtils.isNotEmpty(appointUnpackObject)) { + protocolFieldValue = (Integer) appointUnpackObject; + } + } + if (protocolFieldValue != null) { + //加入缓存 + if (ObjectUtils.isNotEmpty(protocolFieldValue)) { + this.singleObjects.put(catchKey, protocolFieldValue); + return protocolFieldValue; + } + } + return null; + } + + /** + * 获取帧固定位置信息 + * + * @param byteBuf + * @param protocolConfig + * @return + */ + public Map getFixedProperty(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_POSITION + protocolConfig.getId(); + if (this.singleObjects.containsKey(catchKey)) { + return (Map) singleObjects.get(catchKey); + } + Map fixedPropertyMap = new HashMap<>(); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + fixedPropertyMap = fieldParser.doGetFixedProperty(protocolFieldConfigs, this.getTotalLength(byteBuf,protocolConfig)); + if (CollectionUtils.isNotEmpty(fixedPropertyMap)) { + this.singleObjects.put(catchKey, fixedPropertyMap); + return fixedPropertyMap; + } + return fixedPropertyMap; + } + + /** + * 获取帧结构应有的总长度 + */ + public Integer getTotalLength(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_LENGTH + ByteBufUtil.hexDump(byteBuf); + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + Integer appointFrameLength = getProtocolFieldValue(protocolConfig.getTotalLengthId(), byteBuf); + if (appointFrameLength != null) { + //获取过滤的字段集合总长度 + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Integer totalFilterLength = fieldParser.getTotalFilterLength(protocolConfig, byteBuf, getFixFieldConfigMap()); + //计算总长度 + Integer totalLength = appointFrameLength + totalFilterLength; + //加入缓存 + if (ObjectUtils.isNotEmpty(totalLength)) { + this.singleObjects.put(catchKey, totalLength); + return totalLength; + } + } + return null; + } + + /** + * 获取协议有关字段解析内容 + * storeObjectMap存储代转存的数据 + * + * @return + */ + public Map getProtocolDataMap(ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(FIXED_FIELD_DS)) { + return (Map) singleObjects.get(FIXED_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(protocolFieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + this.singleObjects.put(FIXED_FIELD_DS, fixDataMap); + return fixDataMap; + } + return null; + } + + /** + * 获取业务报文内容的content字节 + * + * @param wholeDatagramByte + * @return + */ + public ByteBuf getDataContentBuf(ByteBuf wholeDatagramByte) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(CONTENT_FIELD_DS)) { + return (ByteBuf) singleObjects.get(CONTENT_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + ByteBuf bizDataByteBuf = fieldParser.getDataContentBuf(protocolFieldConfigs, wholeDatagramByte); + if (bizDataByteBuf != null) { + this.singleObjects.put(CONTENT_FIELD_DS, bizDataByteBuf); + return bizDataByteBuf; + } + return null; + } + + + private ProtocolFieldConfig selectFieldConfig(Long id) { + Optional optionalProtocolFieldConfig = this.protocolFieldConfigs.stream().filter( + e -> e.getId().equals(id) + ).findFirst(); + return optionalProtocolFieldConfig.isPresent() ? optionalProtocolFieldConfig.get() : null; + } + + + private Map getFixFieldConfigMap() { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, e -> e) + ); + return fixDataFieldMap; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(protocolFieldConfigs) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java new file mode 100644 index 0000000..dafba1c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java @@ -0,0 +1,56 @@ +package com.casic.missiles.parser.provider; + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.rule.GenericRuleResolver; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.RuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleConfigProvider { + + private final List ruleConfigs; + + public List getRuleConfigs() { + return ruleConfigs; + } + + public RuleConfigProvider(Long protocolId) { + RuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(RuleConfigRegistry.class); + ruleConfigs = ruleConfigRegistry.getRuleConfigById(protocolId); + } + + /** + * 获取规则匹配结果 + * + * @param parseFixedDataMap + * @param protocolFieldConfigs + * @return + */ + public RuleConfig doGetRule(Map parseFixedDataMap, + String ids, + List protocolFieldConfigs) { + if (showSkip()) { + return null; + } + RuleConfig ruleConfig = GenericRuleResolver.machRule(parseFixedDataMap, ids, protocolFieldConfigs, ruleConfigs); + return ruleConfig; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(ruleConfigs) ? false : true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java index 3c05891..856b399 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java @@ -1,18 +1,11 @@ package com.casic.missiles.parser.resolver; -import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.springframework.web.bind.annotation.RequestBody; -import javax.annotation.Resource; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -20,19 +13,17 @@ @Slf4j public class ByteMergeProvider { - @Resource - private FieldRuleEngineMapper fieldRuleEngineMapper; - //拿到所有的值合并到一个值 - public String resolveByteMerge(List valueList, String ruletypeId, String vaildRange) { + public static String resolveByteMerge(List valueList, String ruleTypeId, String vaildRange) { String values = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Map vaildMap = getValidRangeMap(vaildRange); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(ruletypeId); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } + //暂时不处理 +// fieldRuleEngine = fieldRuleConfigMapper.selectById(ruleTypeId); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } Map env2 = new HashMap(); for (int i = 0; i < valueList.size(); i++) { if (vaildMap.containsKey(i)) { @@ -47,7 +38,7 @@ } } - private Map getValidRangeMap(String vaildRange) { + private static Map getValidRangeMap(String vaildRange) { String[] range = vaildRange.split(","); Map vaildMap = new HashMap(); for (int i = 0; i < range.length; i++) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 8d821cd..85d6bbf 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -1,9 +1,12 @@ package com.casic.missiles.parser.resolver; +import com.casic.missiles.pojo.AbstractFieldConfig; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; import io.netty.buffer.ByteBuf; +import java.util.List; import java.util.Map; /** @@ -11,18 +14,14 @@ */ public interface FieldParser { -// Map fieldProcess(String protocolContent,); - Map dataParser(RuleConfig ruleConfig, String lightText,String protocolId); + Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength); - Map fixDataParser(String protocolId, ByteBuf buffer); + Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap); - Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf); + ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer); - ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer); - - ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer); - - Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer); + Integer getTotalFilterLength(ProtocolConfig protocolConfig, ByteBuf byteBuf, Map protocolFieldConfigMap); } + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java new file mode 100644 index 0000000..9e0c00e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java @@ -0,0 +1,52 @@ +package com.casic.missiles.parser.resolver; + +import com.casic.missiles.pojo.AbstractFieldConfig; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.util.List; + +public class FieldParserSupport { + + //分别计算bit和byte长度=> 合并长度 + protected Integer calculateLength(List fieldConfigList) { + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + Integer fixedLength = bytefixedLength + bitfixedLength / 8; + return fixedLength; + } + + //找到最大值=> 根据最大值计算业务数据下标 + protected Integer calculatePosition(List fieldConfigList) { + String rex = "[0-9]+"; + Integer max = -1; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) + && Integer.valueOf(fieldConfig.getOriginPositionByte()) > max) { + max = Integer.valueOf(fieldConfig.getOriginPositionByte()); + } + } + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) && fieldConfig.getOriginPositionByte().equals(max)) { + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + } + } + Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; + return maxFixedPosition; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java deleted file mode 100644 index dd3a6cd..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java +++ /dev/null @@ -1,170 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.ByteResolverParam; -import io.netty.buffer.ByteBuf; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -/** - * 字段解析管理总类 - */ -@Service -@Slf4j -@AllArgsConstructor -public class FieldResolver extends ByteMergeProvider { - - //1、字段截取 => 2、简单的字节解析和复杂的字节解析 - public Object filedParserManger(ByteBuf byteBuf, FieldConfig fieldConfig, Integer maxFixedPosition) { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - //最大固定位置不为空, - if (!ObjectUtil.isEmpty(maxFixedPosition)) { - orignPosition -= maxFixedPosition; - } - Object fieldValue = 0; - //待优化 - if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { - fieldValue = bitToResolver(byteBuf, fieldConfig); - } else { - ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); - fieldValue = parsingFields(fieldBytes, fieldConfig.getRuleJson()); - } - return fieldValue; - } - - //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, - //目前默认配置的规则设置暂不支持配置化,由实现完成 - private Object parsingFields(ByteBuf byteBuf, String ruleJson) { - Object fieldsResolveValue = null; - List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); - if (ObjectUtil.isEmpty(ruleMapList)) { - fieldsResolveValue = defaultResolveBuilder(byteBuf); - } else { - fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); - } - return fieldsResolveValue; - } - - private Object defaultResolveBuilder(ByteBuf byteBuf) { - Integer defaultResolveValue = 0; - for (int i = 0; i < byteBuf.writerIndex(); i++) { - defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; - } - return defaultResolveValue; - } - - //字段解析构建器(针对字节单位的) - //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 - // 字节归并结束或者规则结束=>继续根据规则进行判断 - private Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { - Object customizeResolveValue = null; - try { - List bytStrList = new ArrayList<>(); - //存放到数组里面 - for (int i = 0; i < byteBuf.writerIndex(); i++) { - bytStrList.add(byteBuf.readByte()); - } - int i = 0; - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - customizeResolveValue = this.resolveByteMerge(bytStrList, ruletypeId,vaildRange); - break; - } else { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - List tempBytStr = new ArrayList<>(); - for (int k = 0; i < bytStrList.size(); i++) { - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(k) - .value(bytStrList.get(k)) - .ruletypeId(ruletypeId).build(); - tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); - } - bytStrList = tempBytStr; - } - i++; - } - //字节归并到一起=>继续根据规则进行判断 - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(customizeResolveValue) - .ruletypeId(ruletypeId).build(); - customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(customizeResolveValue)); - return customizeResolveValue; - } catch (RuntimeException ex) { - log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); - return null; - } - } - - /** - * 1、单个字节情况表示字段 - * 2、多字节情况表示字段(暂未处理) - */ - private Object bitToResolver(ByteBuf byteBuf, FieldConfig fieldConfig) { - Object fieldValue = new Object(); - try { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - byte fields = 0x00; - if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); - } else { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); - } - - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { - if (!StringUtils.isEmpty(fieldConfig.getExactOrignPosition())) { - fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getExactOrignPosition())).byteValue() - >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); - } else { - fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); - } - } else { - fieldValue = Integer.valueOf(fields & 0xff); - } - if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { - return fieldValue; - } - List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); - int i = 0; - //字节归并到一起=>继续根据规则进行判断 - while (i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(fieldValue) - .ruletypeId(ruletypeId).build(); - fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(fieldValue)); - return fieldValue; - } catch (RuntimeException ex) { - log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); - return null; - } - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java new file mode 100644 index 0000000..1d2aeab --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java @@ -0,0 +1,36 @@ +package com.casic.missiles.parser.resolver.bytes; + +import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.mapper.FieldRuleConfigMapper; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.pojo.ByteResolverParam; +import com.googlecode.aviator.AviatorEvaluator; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; +//转换规则 +@Component("convert") +@AllArgsConstructor +@Slf4j +public class ByteRuleResolver implements ByteResolver { + + private final FieldRuleConfigMapper fieldRuleConfigMapper; + + @Override + public Object resolveOperationRule(ByteResolverParam byteResolverParam){ + FieldRuleConfig fieldRuleEngine=fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); + if(ObjectUtil.isEmpty(fieldRuleEngine)){ + return byteResolverParam.getValue(); + } + String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); + Map env2 = new HashMap(); + env2.put("value", (byte) byteResolverParam.getValue()); + String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); + return values; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java index 103821c..786b71c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java @@ -2,34 +2,34 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("logicalShift") +@Component("logicalShift") @AllArgsConstructor @Slf4j public class LogicalShiftResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //字节位移 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { Integer index = byteResolverParam.getIndex(); - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return byteResolverParam.getValue(); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java index 476747d..01149bd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("operation") +@Component("operation") @AllArgsConstructor @Slf4j public class OperationResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //混合运算,有常量或者乘除的缩放 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java index 0b82cf4..79abcce 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.casic.missiles.pojo.ByteResolverParam; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; //精度计算 -@Service("precision") +@Component("precision") @AllArgsConstructor @Slf4j public class PrecisionResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java deleted file mode 100644 index 5c3f332..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; -//转换规则 -@Service("convert") -@AllArgsConstructor -@Slf4j -public class RuleResolver implements ByteResolver { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam){ - RuleEvaluator fieldRuleEngine=fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); - if(ObjectUtil.isEmpty(fieldRuleEngine)){ - return byteResolverParam.getValue(); - } - String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); - Map env2 = new HashMap(); - env2.put("value", (byte) byteResolverParam.getValue()); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java new file mode 100644 index 0000000..d3bbd91 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java @@ -0,0 +1,15 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; + +import java.util.List; +import java.util.Map; +// 前导码匹配->长度字段 +public interface AbstractCombinedFieldProcessor { + + Map invoke(Map map, ByteBuf byteBuf, List combinedFieldConfigList, + Map fieldConfigsMap, Map storeObjectMap); + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java new file mode 100644 index 0000000..03c8480 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java @@ -0,0 +1,59 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-13 + */ +//依次递增进行数据的解析, +public class GenericCombinedFieldResolver { + + + //通过查询,字段长度长度随机 + public void parseDataField(List combinedFieldConfigList, ByteBuf byteBuf, + Map storeObjectMap, Map fieldConfigsMap) { + Integer frameLength = Integer.valueOf(ByteBufUtil.hexDump(byteBuf)); + //添加前置处理器 + com.casic.missiles.util.ClassUtil classUtil = new com.casic.missiles.util.ClassUtil(); + List abstractCombinedProcessors = classUtil.getSubClassList(AbstractCombinedFieldProcessor.class); + + Map fieldFixedMap = combinedFieldLeadCodeMap(combinedFieldConfigList); + //frameLength + Map combinedProcessorFields = null; + while (byteBuf.readableBytes() < frameLength) { + //一直处理 + for (AbstractCombinedFieldProcessor abstractCombinedProcessor : abstractCombinedProcessors) { + combinedProcessorFields = abstractCombinedProcessor.invoke(combinedProcessorFields, byteBuf, + combinedFieldConfigList, + fieldConfigsMap, storeObjectMap); + if (combinedProcessorFields == null || byteBuf.readableBytes() < frameLength) { + return; + } + } + + } + } + + /** + * 取出前导码匹配集合 + */ + private Map combinedFieldLeadCodeMap(List combinedFieldConfigList) { + Map fieldFixedMap = combinedFieldConfigList + .stream() + .collect(Collectors.toMap(CombinedFieldConfig::getPrefixCode, e -> e)); + return fieldFixedMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java new file mode 100644 index 0000000..643a934 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java @@ -0,0 +1,100 @@ +package com.casic.missiles.parser.resolver.fields; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.FieldParserSupport; +import com.casic.missiles.pojo.*; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 保存使用时最基本的信息,并且使用原型模式 + */ +@Slf4j +public class DefaultProtocolFieldParser extends FieldParserSupport implements FieldParser, FixedPropertyEnum { + + //通过传入的配置和报文进行字段解析 + @Override + public Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap) { + Map dataMap = new HashMap<>(); + for (AbstractFieldConfig protocolFieldConfig : protocolFieldConfigs) { + if (!ObjectUtils.isEmpty(protocolFieldConfig.getOriginPositionByte())) { + Object fieldValue = FieldResolver.parseField(buffer, protocolFieldConfig, null); + if (protocolFieldConfig.getIsStorage() == 1) { + storeObjectMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + dataMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + } + return dataMap; + } + + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength) { + Map fixedPropertyMap = new HashMap<>(); + Integer fixedLength = calculateLength(protocolFieldConfigs); + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + fixedPropertyMap.put(FIXED_POSITION, maxFixedPosition); + fixedPropertyMap.put(TOTAL_LENGTH, totalLength); + fixedPropertyMap.put(TAIL_POSITION, totalLength - fixedLength + maxFixedPosition); + return fixedPropertyMap; + } + + //** 获取业务内容的byteBuf + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer) { + //计算固定长度 + Integer fixedLength = calculateLength(protocolFieldConfigs); + //总长度获取 + String lightText = buffer.toString(Charset.forName("ISO-8859-1")); + Integer totalLength = lightText.length(); + //计算固定长度最大长度 + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + //计算数据报文内容 + ByteBuf bizDataFields = buffer.slice(maxFixedPosition - 1, (totalLength - fixedLength)); + return bizDataFields; + } + + /** + * 获取过滤字段的长度 + */ + @Override + public Integer getTotalFilterLength(ProtocolConfig protocolConfig, + ByteBuf byteBuf, + Map protocolFieldConfigMap) { + if (ByteBufUtil.hexDump(byteBuf).equals("")) { + return 0; + } + int totalFilterLength = 0; + String filterFields = protocolConfig.getTotalLengthFilterFields(); + try { + if (!StringUtils.isEmpty(filterFields)) { + String[] filterFieldList = filterFields.split(","); + for (String filterFieldId : filterFieldList) { + if (StringUtils.isNotEmpty(filterFieldId)) { + ProtocolFieldConfig fieldConfig = protocolFieldConfigMap.get(Long.valueOf(filterFieldId)); + //这里都是按字节计算,没有对位进行区分,可能会出现错误 + // 如果对位有需求,需要进一步跟进 + totalFilterLength += fieldConfig.getOffsetLength(); + } + } + } + return totalFilterLength; + } catch (Exception ex) { + log.error("报文确认分发阶段,获取报文总长度过滤长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); + } + return totalFilterLength; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java new file mode 100644 index 0000000..d51e887 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java @@ -0,0 +1,169 @@ +package com.casic.missiles.parser.resolver.fields; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.parser.resolver.ByteMergeProvider; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.AbstractFieldConfig; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.pojo.ByteResolverParam; +import io.netty.buffer.ByteBuf; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * 字段解析管理总类 + */ +@Slf4j +public class FieldResolver extends ByteMergeProvider { + + //1、字段截取 => 2、简单的字节解析和复杂的字节解析 + public static Object parseField(ByteBuf byteBuf,AbstractFieldConfig fieldConfig, Integer maxFixedPosition) { + Integer orignPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + //最大固定位置不为空, + if (!ObjectUtil.isEmpty(maxFixedPosition)) { + orignPosition -= maxFixedPosition; + } + Object fieldValue = 0; + //待优化 + if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { + fieldValue = doParseBitField(byteBuf, fieldConfig); + } else { + ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); + fieldValue = doParseByteField(fieldBytes, fieldConfig.getRuleJson()); + } + return fieldValue; + } + + //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, + //目前默认配置的规则设置暂不支持配置化,由实现完成 + private static Object doParseByteField(ByteBuf byteBuf, String ruleJson) { + Object fieldsResolveValue = null; + List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); + if (ObjectUtil.isEmpty(ruleMapList)) { + fieldsResolveValue = defaultResolveBuilder(byteBuf); + } else { + fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); + } + return fieldsResolveValue; + } + + private static Object defaultResolveBuilder(ByteBuf byteBuf) { + Integer defaultResolveValue = 0; + for (int i = 0; i < byteBuf.writerIndex(); i++) { + defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; + } + return defaultResolveValue; + } + + //字段解析构建器(针对字节单位的) + //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 + // 字节归并结束或者规则结束=>继续根据规则进行判断 + private static Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { + Object customizeResolveValue = null; + try { + List bytStrList = new ArrayList<>(); + //存放到数组里面 + for (int i = 0; i < byteBuf.writerIndex(); i++) { + bytStrList.add(byteBuf.readByte()); + } + int i = 0; + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { + if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + customizeResolveValue = resolveByteMerge(bytStrList, ruletypeId, vaildRange); + break; + } else { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + List tempBytStr = new ArrayList<>(); + for (int k = 0; i < bytStrList.size(); i++) { + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(k) + .value(bytStrList.get(k)) + .ruletypeId(ruletypeId).build(); + tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); + } + bytStrList = tempBytStr; + } + i++; + } + //字节归并到一起=>继续根据规则进行判断 + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(null) + .value(customizeResolveValue) + .ruletypeId(ruletypeId).build(); + customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); + i++; + } + System.out.println(JSON.toJSON(customizeResolveValue)); + return customizeResolveValue; + } catch (RuntimeException ex) { + log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); + return null; + } + } + + /** + * 1、单个字节情况表示字段 + * 2、多字节情况表示字段(暂未处理) + */ + private static Object doParseBitField(ByteBuf byteBuf,AbstractFieldConfig fieldConfig) { + Object fieldValue = new Object(); + try { + Integer orignPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + byte fields = 0x00; + if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { + fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); + } else { + fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); + } + + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { + if (!StringUtils.isEmpty(fieldConfig.getOriginPositionBit())) { + fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getOriginPositionBit())).byteValue() + >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); + } else { + fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); + } + } else { + fieldValue = Integer.valueOf(fields & 0xff); + } + if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { + return fieldValue; + } + List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); + int i = 0; + //字节归并到一起=>继续根据规则进行判断 + while (i < ruleMapList.size()) { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(null) + .value(fieldValue) + .ruletypeId(ruletypeId).build(); + fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); + i++; + } + System.out.println(JSON.toJSON(fieldValue)); + return fieldValue; + } catch (RuntimeException ex) { + log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); + return null; + } + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java deleted file mode 100644 index 35ae3d0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java +++ /dev/null @@ -1,183 +0,0 @@ -package com.casic.missiles.parser.resolver.fields; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufAllocator; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; -import org.springframework.util.ObjectUtils; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service("standard") -@AllArgsConstructor -@Slf4j -public class StandardFieldParser implements FieldParser { - - private final FieldConfigDao fieldConfigDao; - private final FieldResolver fieldResolver; - - //数据解析 - @Override - public Map dataParser(RuleConfig ruleConfig, String lightText, String protocolId) { - String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); - ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); - bufferContent.writeBytes(lightText.getBytes(Charset.forName("ISO-8859-1"))); - Map dataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - for (String dataFieldId : dataFieldIds) { - FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(dataFieldId); - if (!ObjectUtils.isEmpty(fieldConfig)) { - dataMap.put(fieldConfig.getFieldName(), String.valueOf(fieldResolver.filedParserManger(bufferContent, fieldConfig, maxFixedPosition))); - } - } - return dataMap; - } - - //数据解析 - @Override - public Map fixDataParser(String protocolId, ByteBuf buffer) { - List dataFieldIdList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Map dataMap = new HashMap<>(); - for (FieldConfig dataField : dataFieldIdList) { - if (!ObjectUtils.isEmpty(dataField.getOrignPosition())) { - Object fieldValue = (Integer) fieldResolver.filedParserManger(buffer, dataField, null); - dataMap.put(dataField.getFieldName(), fieldValue); - } - } - return dataMap; - } - - @Override - public Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf) { - if (ByteBufUtil.hexDump(byteBuf).equals("")) { - return 0; - } - String filterFields = protocolConfig.getTotalLengthFilterField(); - Integer totalLength = 0; - try { - FieldConfig totalFieldConfig = fieldConfigDao.getFieldConfigById(protocolConfig.getTotalLengthId()); - int totalFilterLength = 0; - if (!StringUtils.isEmpty(filterFields)) { - String[] filterFieldList = filterFields.split(","); - for (String filterField : filterFieldList) { - FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(filterField); - //这里都是按字节计算,没有对位进行区分,可能会出现错误 - - // 如果对位有需求,需要进一步跟进 - totalFilterLength += fieldConfig.getOffsetLength(); - } - } - totalLength = (Integer) fieldResolver.filedParserManger(byteBuf, totalFieldConfig, null) + totalFilterLength; - } catch (Exception ex) { - log.error("报文确认分发阶段,获取报文总长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); - } - return totalLength; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer) { - //业务内容 - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - String protocolId = String.valueOf(protocolConfig.getId()); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - //计算固定长度 - Integer fixedLength = calculateLength(fieldConfigList); -// Integer totalLength = this.getTotalLength(protocolConfig, buffer); - //总长度获取 - Integer totalLength = lightText.length(); - //计算固定长度最大长度 - Integer maxFixedPosition = calculatePosition(fieldConfigList); -// buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - //计算数据报文内容 - ByteBuf bizDataFields = buffer.slice(maxFixedPosition-1, (totalLength - fixedLength)); - return bizDataFields; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer) { - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - String protocolId = String.valueOf(protocolConfig.getId()); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer fixedLength = calculateLength(fieldConfigList); -// Integer totalLength = this.getTotalLength(protocolConfig, buffer); - Integer totalLength = lightText.length(); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - ByteBuf fixDataFields = buffer.slice(0, maxFixedPosition); - return fixDataFields; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer) { - String protocolId = String.valueOf(protocolConfig.getId()); - Map fixedPropertyMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer fixedLength = calculateLength(fieldConfigList); - Integer totalLength = this.getTotalLength(protocolConfig, buffer); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - fixedPropertyMap.put("fixedPosition", maxFixedPosition); - fixedPropertyMap.put("totalLength", totalLength); - fixedPropertyMap.put("tailPosition", totalLength - fixedLength + maxFixedPosition); - return fixedPropertyMap; - } - - //分别计算bit和byte长度=> 合并长度 - private Integer calculateLength(List fieldConfigList) { - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (FieldConfig fieldConfig : fieldConfigList) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - Integer fixedLength = bytefixedLength + bitfixedLength / 8; - return fixedLength; - } - - //找到最大值=> 根据最大值计算业务数据下标 - private Integer calculatePosition(List fieldConfigList) { - String rex = "[0-9]+"; - Integer max = -1; - for (FieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOrignPosition()) - && Integer.valueOf(fieldConfig.getOrignPosition()) > max) { - max = Integer.valueOf(fieldConfig.getOrignPosition()); - } - } - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (FieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOrignPosition()) && fieldConfig.getOrignPosition().equals(max)) { - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - } - } - Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; - return maxFixedPosition; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java new file mode 100644 index 0000000..d4ec6c7 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java @@ -0,0 +1,76 @@ +package com.casic.missiles.parser.rule; + +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import org.apache.commons.lang3.StringUtils; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class GenericRuleResolver { + + //根据前置字段的值,找到指定的规则 + //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 + //=>循环判断=>通过规则得到业务字段 + public static RuleConfig machRule(Map fixDataMap, + String ids, + List protocolFieldConfigs, + List ruleConfigs) { + List preRuleConfigList = getPreRuleList(ids, protocolFieldConfigs); + //获取前置规则字段 + final Map metaDataMap = getPreRuleFields(preRuleConfigList, fixDataMap); + //准备固定的字段集合 + Map fixDataFieldMap = getFixDataFieldMap(protocolFieldConfigs); + return RuleResolverCore.doMachRule(ruleConfigs, metaDataMap, fixDataMap, fixDataFieldMap); + } + + private static Map getFixDataFieldMap(List protocolFieldConfigs) { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, ProtocolFieldConfig::getFieldName) + ); + return fixDataFieldMap; + } + + + /** + * 查询前置规则的字段配置 + * + * @param ids + * @return + */ + private static List getPreRuleList(String ids, List protocolFieldConfigs) { + String[] idList = ids.split(","); + Map prepareMaps = new HashMap<>(); + for (String id : idList) { + if (StringUtils.isNotEmpty(id)) { + prepareMaps.put(Long.valueOf(id), ""); + } + } + List preRuleConfigList = protocolFieldConfigs + .stream() + .filter(e -> prepareMaps.containsKey(e.getId())) + .collect(Collectors.toList()); + return preRuleConfigList; + } + + /** + * 获取前置规则解析字段 + */ + private static Map getPreRuleFields(List preRuleFieldConfigList, Map fixDataMap) { + Map ruleFieldMap = new HashMap<>(); + preRuleFieldConfigList.stream() + .forEach( + preRuleFieldConfig -> { + String fieldName = preRuleFieldConfig.getFieldName(); + if (fixDataMap.containsKey(fieldName)) { + ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); + } + } + ); + return ruleFieldMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java new file mode 100644 index 0000000..baae7e8 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -0,0 +1,68 @@ +package com.casic.missiles.parser.rule; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.casic.missiles.pojo.RuleConfig; + +import java.util.*; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleResolverCore { + + + public static RuleConfig doMachRule(List ruleConfigList, Map metaDataMap, + Map fixDataMap, + Map fixDataFieldMap) { + Optional ruleConfigOptional = ruleConfigList.stream() + .filter(ruleConfig -> machRuleConfig( + JSON.parseObject(ruleConfig.getMatchRuleJson(), Map.class), metaDataMap)) + .findFirst(); + if (ObjectUtil.isEmpty(ruleConfigOptional)) { + return null; + } + String[] ruleFields = ruleConfigOptional.get().getDataFieldIds().split(","); + Map ruleMetaDataMap = getRuleFields(ruleFields, fixDataMap, fixDataFieldMap); + //递归选定解析规则,进行规则解析 + if (!ruleConfigOptional.get().getIsFinishMatch().equals("1")) { + //递归选定规则 + doMachRule(ruleConfigList, ruleMetaDataMap, fixDataMap, fixDataFieldMap); + } + return ruleConfigOptional.get(); + } + + + private static Map getRuleFields(String[] preRuleConfigList, Map fixedDataMap, + Map fixedFieldMap) { + Map ruleFieldMap = new HashMap<>(); + for (String preRuleConfigId : preRuleConfigList) { + String fieldName = fixedFieldMap.get(preRuleConfigId); + if (fixedDataMap.containsKey(fieldName)) { + ruleFieldMap.put(fieldName, String.valueOf(fixedDataMap.get(fieldName))); + } + } + return ruleFieldMap; + } + + + //匹配规则配置 + private static Boolean machRuleConfig(Map ruleMap, Map metaDataMap) { + if (ruleMap == null || metaDataMap == null) { + return null; + } + //所有的字段在规则里面必须有有配置 + for (String key : metaDataMap.keySet()) { + if (ruleMap.containsKey(key)) { + if (!ruleMap.get(key).equals(metaDataMap.get(key))) { + return false; + } + } else { + return false; + } + } + return true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java deleted file mode 100644 index 664088d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java +++ /dev/null @@ -1,92 +0,0 @@ -package com.casic.missiles.parser.rule; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.mapper.dao.PreRuleConfigDao; -import com.casic.missiles.mapper.dao.RuleConfigDao; -import lombok.AllArgsConstructor; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.*; -import java.util.stream.Collectors; - -@Service -@AllArgsConstructor -public class RulerProvider { - - private final FieldConfigDao fieldConfigDao; - private final PreRuleConfigDao preRuleConfigDao; - private final RuleConfigDao ruleConfigDao; - - //根据前置字段的值,找到指定的规则 - //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 - //=>循环判断=>通过规则得到业务字段 - public RuleConfig ruleConfig(Map fixDataMap, String protocolId) { - //批量获取规则 - List preRuleConfigList = preRuleConfigDao.getPreRuleList(protocolId); - //获取固定字段 - Map fixFieldMap = getAllFieldMap(protocolId); - //获取前置规则字段 - final String preRuleFields = getPreRuleFields(preRuleConfigList, fixDataMap, fixFieldMap); - List ruleConfigList = ruleConfigDao.getRuleConfigById(protocolId); - Optional ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig ->preRuleFields.equals( ruleConfig.getParseRuleJson())).findFirst(); - //递归选定解析规则,进行规则解析 - while (!ObjectUtil.isEmpty(ruleConfigOptional) && !ruleConfigOptional.get().getIsBizField().equals("1")) { - String ruleFields = getRuleFields(ruleConfigOptional.get().getDataFieldIds().split(","), fixDataMap, fixFieldMap); - ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig -> ruleConfig.getParseRuleJson().equals(ruleFields)).findFirst(); - } - return ruleConfigOptional.get(); - } - - /** - * 获取前置规则解析字段 - */ - private String getPreRuleFields(List preRuleConfigList, Map fixDataMap, Map fixFieldMap) { - Map ruleFieldMap= new HashMap<>(); - preRuleConfigList.stream() - .forEach( - preRuleConfig -> { - String fieldName = fixFieldMap.get(Long.valueOf(preRuleConfig.getRuleFieldId())); - if (fixDataMap.containsKey(fieldName)) { - ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); - } - } - ); - return JSONObject.toJSONString(ruleFieldMap); - } - - private Map getAllFieldMap(String protocolId) { - List fieldList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Map fixFieldMap = fieldList.stream().collect( - Collectors.toMap(FieldConfig::getId, FieldConfig::getFieldName) - ); - return fixFieldMap; - } - - private String getRuleFields(String[] preRuleConfigList, Map fixDataMap, Map fixFieldMap) { - Map ruleFieldMap= new HashMap<>(); - for (String preRuleConfigId : preRuleConfigList) { - String fieldName = fixFieldMap.get(preRuleConfigId); - if (fixDataMap.containsKey(fieldName)) { - ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); - } - } - return JSONObject.toJSONString(ruleFieldMap); - } - - //弃置 - private String ListToString(List ruleFieldList) { - String ruleFields = ""; - for (String ruleField : ruleFieldList) { - ruleFields += ruleField + ","; - } - ruleFields = StringUtils.isEmpty(ruleFields) ? ruleFields : ruleFields.substring(0, ruleFields.length() - 1); - return ruleFields; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java index 6177e10..bfa87a5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java @@ -2,7 +2,7 @@ public interface SafeStrategy { - String decryption(byte[] bytes); + String decryption(String cipher); String encryption(String lightText); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java index 618716c..6236302 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java @@ -9,9 +9,9 @@ //十六进制的字符串转换成字节数组 byte[] bytes = hexStrToBinaryStr(msg); //计算CRC8 - byte crc8 = CRC8(bytes, 0, bytes.length); - String crc8ToStr = "" + Integer.toHexString(0xff & crc8); - return crc8ToStr; +// String crc8ToStr = "" + Integer.toHexString(0xff & crc8); +// return crc8ToStr; + return null; } /** @@ -33,50 +33,5 @@ return bytes; } - /** - * CRC8 校验 多项式 x8+x2+x+1 - * - * @param b - * @param off - * @param len - * @return - */ - public static byte CRC8(final byte[] b, final int off, final int len) { - byte result = 0x00; - for (int i = 0; i < len; i++) { - result = CHECKSUM_TABLE[(result ^ (b[i + off] & 0xFF)) & 0xFF]; - } - return (byte) (result & 0xFFL); - } - - private final static byte[] CHECKSUM_TABLE = {(byte) 0x00, (byte) 0x07, (byte) 0x0e, (byte) 0x09, (byte) 0x1c, (byte) 0x1b, - (byte) 0x12, (byte) 0x15, (byte) 0x38, (byte) 0x3f, (byte) 0x36, (byte) 0x31, (byte) 0x24, (byte) 0x23, (byte) 0x2a, - (byte) 0x2d, (byte) 0x70, (byte) 0x77, (byte) 0x7e, (byte) 0x79, (byte) 0x6c, (byte) 0x6b, (byte) 0x62, (byte) 0x65, - (byte) 0x48, (byte) 0x4f, (byte) 0x46, (byte) 0x41, (byte) 0x54, (byte) 0x53, (byte) 0x5a, (byte) 0x5d, (byte) 0xe0, - (byte) 0xe7, (byte) 0xee, (byte) 0xe9, (byte) 0xfc, (byte) 0xfb, (byte) 0xf2, (byte) 0xf5, (byte) 0xd8, (byte) 0xdf, - (byte) 0xd6, (byte) 0xd1, (byte) 0xc4, (byte) 0xc3, (byte) 0xca, (byte) 0xcd, (byte) 0x90, (byte) 0x97, (byte) 0x9e, - (byte) 0x99, (byte) 0x8c, (byte) 0x8b, (byte) 0x82, (byte) 0x85, (byte) 0xa8, (byte) 0xaf, (byte) 0xa6, (byte) 0xa1, - (byte) 0xb4, (byte) 0xb3, (byte) 0xba, (byte) 0xbd, (byte) 0xc7, (byte) 0xc0, (byte) 0xc9, (byte) 0xce, (byte) 0xdb, - (byte) 0xdc, (byte) 0xd5, (byte) 0xd2, (byte) 0xff, (byte) 0xf8, (byte) 0xf1, (byte) 0xf6, (byte) 0xe3, (byte) 0xe4, - (byte) 0xed, (byte) 0xea, (byte) 0xb7, (byte) 0xb0, (byte) 0xb9, (byte) 0xbe, (byte) 0xab, (byte) 0xac, (byte) 0xa5, - (byte) 0xa2, (byte) 0x8f, (byte) 0x88, (byte) 0x81, (byte) 0x86, (byte) 0x93, (byte) 0x94, (byte) 0x9d, (byte) 0x9a, - (byte) 0x27, (byte) 0x20, (byte) 0x29, (byte) 0x2e, (byte) 0x3b, (byte) 0x3c, (byte) 0x35, (byte) 0x32, (byte) 0x1f, - (byte) 0x18, (byte) 0x11, (byte) 0x16, (byte) 0x03, (byte) 0x04, (byte) 0x0d, (byte) 0x0a, (byte) 0x57, (byte) 0x50, - (byte) 0x59, (byte) 0x5e, (byte) 0x4b, (byte) 0x4c, (byte) 0x45, (byte) 0x42, (byte) 0x6f, (byte) 0x68, (byte) 0x61, - (byte) 0x66, (byte) 0x73, (byte) 0x74, (byte) 0x7d, (byte) 0x7a, (byte) 0x89, (byte) 0x8e, (byte) 0x87, (byte) 0x80, - (byte) 0x95, (byte) 0x92, (byte) 0x9b, (byte) 0x9c, (byte) 0xb1, (byte) 0xb6, (byte) 0xbf, (byte) 0xb8, (byte) 0xad, - (byte) 0xaa, (byte) 0xa3, (byte) 0xa4, (byte) 0xf9, (byte) 0xfe, (byte) 0xf7, (byte) 0xf0, (byte) 0xe5, (byte) 0xe2, - (byte) 0xeb, (byte) 0xec, (byte) 0xc1, (byte) 0xc6, (byte) 0xcf, (byte) 0xc8, (byte) 0xdd, (byte) 0xda, (byte) 0xd3, - (byte) 0xd4, (byte) 0x69, (byte) 0x6e, (byte) 0x67, (byte) 0x60, (byte) 0x75, (byte) 0x72, (byte) 0x7b, (byte) 0x7c, - (byte) 0x51, (byte) 0x56, (byte) 0x5f, (byte) 0x58, (byte) 0x4d, (byte) 0x4a, (byte) 0x43, (byte) 0x44, (byte) 0x19, - (byte) 0x1e, (byte) 0x17, (byte) 0x10, (byte) 0x05, (byte) 0x02, (byte) 0x0b, (byte) 0x0c, (byte) 0x21, (byte) 0x26, - (byte) 0x2f, (byte) 0x28, (byte) 0x3d, (byte) 0x3a, (byte) 0x33, (byte) 0x34, (byte) 0x4e, (byte) 0x49, (byte) 0x40, - (byte) 0x47, (byte) 0x52, (byte) 0x55, (byte) 0x5c, (byte) 0x5b, (byte) 0x76, (byte) 0x71, (byte) 0x78, (byte) 0x7f, - (byte) 0x6a, (byte) 0x6d, (byte) 0x64, (byte) 0x63, (byte) 0x3e, (byte) 0x39, (byte) 0x30, (byte) 0x37, (byte) 0x22, - (byte) 0x25, (byte) 0x2c, (byte) 0x2b, (byte) 0x06, (byte) 0x01, (byte) 0x08, (byte) 0x0f, (byte) 0x1a, (byte) 0x1d, - (byte) 0x14, (byte) 0x13, (byte) 0xae, (byte) 0xa9, (byte) 0xa0, (byte) 0xa7, (byte) 0xb2, (byte) 0xb5, (byte) 0xbc, - (byte) 0xbb, (byte) 0x96, (byte) 0x91, (byte) 0x98, (byte) 0x9f, (byte) 0x8a, (byte) 0x8d, (byte) 0x84, (byte) 0x83, - (byte) 0xde, (byte) 0xd9, (byte) 0xd0, (byte) 0xd7, (byte) 0xc2, (byte) 0xc5, (byte) 0xcc, (byte) 0xcb, (byte) 0xe6, - (byte) 0xe1, (byte) 0xe8, (byte) 0xef, (byte) 0xfa, (byte) 0xfd, (byte) 0xf4, (byte) 0xf3}; } \ No newline at end of file diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java index 27c2838..6e078a3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java @@ -1,9 +1,6 @@ package com.casic.missiles.parser.safe.impl; -import cn.hutool.core.util.CharsetUtil; -import cn.hutool.crypto.symmetric.SM4; -import cn.hutool.crypto.symmetric.SymmetricCrypto; - +import com.casic.missiles.parser.safe.SafeStrategy; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; @@ -11,19 +8,44 @@ import org.bouncycastle.crypto.engines.SM4Engine; import org.bouncycastle.crypto.params.KeyParameter; import org.bouncycastle.util.encoders.Hex; - -import static cn.hutool.crypto.Mode.ECB; -import static cn.hutool.crypto.Padding.NoPadding; +import org.springframework.stereotype.Component; /** * SM4算法工具类 */ @Slf4j -public class Sm4 { +@Component("sm4") +public class Sm4 implements SafeStrategy { //加解密的字节快大小 public static final int BlockSize = 16; + @Override + public String decryption(String cipher) { + byte[] keyByte = { + 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 + }; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(keyByte); + byte[] in = Hex.decode(cipher); + byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); + String plain = EcbDecrypt(in, keyBytes); + return plain; + } + + @Override + public String encryption(String cipher) { + byte[] keyByte = { + 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 + }; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(keyByte); + byte[] in = Hex.decode(cipher); + byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); + String plain = EcbDecrypt(in, keyBytes); + return plain; + } + /** * SM4ECB加密算法,对内 * @@ -32,8 +54,6 @@ * @return */ private static byte[] ecb_encrypt(byte[] in, byte[] keyBytes) { - - SM4Engine sm4Engine = new SM4Engine(); sm4Engine.init(true, new KeyParameter(keyBytes)); byte[] out = new byte[in.length]; @@ -58,27 +78,6 @@ return cipher; } - - /** - * hutool 解密SM4 - * - * @param encodeContent - * @return - */ - public static String decode(String encodeContent) { - String key = "24ad182507479a5da3ad94d9d78ea203"; - try { - SymmetricCrypto sm4 = new SM4(ECB, NoPadding, key.getBytes()); - String decryptStr = sm4.decryptStr(encodeContent, CharsetUtil.CHARSET_UTF_8); - return decryptStr; - } catch (Exception e) { - e.printStackTrace(); - log.error("SM4解密失败"); - } - return null; - } - - /** * SM4的ECB加密算法 * @@ -129,20 +128,6 @@ return plain; } - /** - * SM4的ECB解密算法 - * - * @param cipher 输入的密文字符串 - * @param key 密钥 - * @return - */ - public static String EcbDecrypt(String cipher, String key) { - byte[] in = Hex.decode(cipher); - byte[] keyBytes = Hex.decode(key); - - String plain = EcbDecrypt(in, keyBytes); - return plain; - } /** * 主函数 @@ -151,28 +136,24 @@ */ public static void main(String[] args) { byte[] ciphertext = { + 0x4B, (byte) 0x8C, (byte) 0x9D, 0x08, (byte) 0xE4, (byte) 0xD3, 0x64, 0x42, (byte) 0xB9, (byte) 0xA5, (byte) 0xFE, (byte) 0xCD, (byte) 0x91, 0x1B, 0x38, (byte) 0xAC, (byte) 0xE9, 0x1C, (byte) 0xCD, 0x53, 0x02, (byte) 0xD7, 0x0C, (byte) 0x9B, (byte) 0x96, 0x30, 0x62, (byte) 0xE8, (byte) 0xFB, (byte) 0xEF, (byte) 0xB9, (byte) 0xFF, (byte) 0xDE, 0x19, (byte) 0x80, 0x35, 0x3E, (byte) 0x90, 0x4F, 0x2F, 0x12, 0x2B, 0x19, (byte) 0x8B, 0x6C, 0x7A, (byte) 0x85, (byte) 0xA1, (byte) 0xB1, (byte) 0x86, (byte) 0xA3, 0x7A, 0x46, 0x0C, 0x2F, (byte) 0x94, 0x4F, 0x7F, 0x2C, 0x56, 0x14, (byte) 0xF3, (byte) 0x89, (byte) 0xC3, - 0x3F, 0x20, (byte) 0xF9, (byte) 0x87, (byte) 0xA1, 0x60, (byte) 0xD9, (byte) 0xA8, (byte) 0xFD, (byte) 0xD7, (byte) 0x9B, 0x4B, 0x26, 0x06, 0x30, 0x44}; + 0x3F, 0x20, (byte) 0xF9, (byte) 0x87, (byte) 0xA1, 0x60, (byte) 0xD9, (byte) 0xA8, (byte) 0xFD, (byte) 0xD7, (byte) 0x9B, 0x4B, 0x26, 0x06, 0x30, 0x44 + }; ByteBuf in = ByteBufAllocator.DEFAULT.heapBuffer(); in.writeBytes(ciphertext); - byte[] keyByte = { 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 }; ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); - key.writeBytes(ciphertext); - String resCipherData = decode(ByteBufUtil.hexDump(in)); - ByteBuf out = ByteBufAllocator.DEFAULT.heapBuffer(); -// out.writeBytes(resCipherData); -// System.out.println(hexBytes); - System.out.println(resCipherData.toString()); -// String resPlainData = EcbDecrypt(resCipherData, key); -// System.out.println("原始明文:" + data); -// System.out.println("解密后明文:" + resPlainData); + key.writeBytes(keyByte); +// String resCipherData = EcbDecrypt(ByteBufUtil.hexDump(in), ByteBufUtil.hexDump(key)); +// System.out.println(resCipherData); } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java index 1395a51..ac5f957 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java @@ -1,7 +1,7 @@ package com.casic.missiles.parser.safe.impl; import io.netty.buffer.ByteBufUtil; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** *

@@ -14,9 +14,8 @@ * @author hyl * @version v1.0: Tea.java, v 0.1 2021/3/12 13:48 $ */ -@Service("tea") -///tea算法类 - +//tea算法类 +@Component("tea") public class Tea { public static byte[] MyTea_Encrypt(byte[] MyTeaContent, int ByteLen, byte[] MyTeakey) { @@ -99,7 +98,6 @@ // for(int i32Index = 0; i32Index < 8; i32Index++) { // System.out.print("0x" + Integer.toHexString(MyContent[i32Index]) + " "); // } - // System.out.println("密钥为:"); // for(int i32Index = 0; i32Index < 16; i32Index++) { // System.out.print("0x" + Integer.toHexString(MyKeys[i32Index]) + " "); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java index bdd0721..bd1516a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java @@ -3,7 +3,7 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.parser.sender.DataSubscribeProvider; import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponents; import org.springframework.web.util.UriComponentsBuilder; @@ -12,7 +12,7 @@ import java.util.Collections; import java.util.Map; -@Service("functionCallback") +@Component("functionCallback") public class FunctionCallback implements DataSubscribeProvider { @Resource diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java index 0b44fb9..7526de2 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.Map; -@Service("middleware") +@Component("middleware") public class MiddlewareSubscribe implements DataSubscribeProvider { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java index 5dcee3f..e2f1192 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.Map; -@Service("nosql") +@Component("nosql") public class NoSqlSubscribe implements DataSubscribeProvider { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java b/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java new file mode 100644 index 0000000..81a5324 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java @@ -0,0 +1,86 @@ +package com.casic.missiles.pojo; + +import lombok.Data; + +/** + * 协议 + */ +@Data +public class Msg { + + /** + * 前导码 + */ + private String preamble; + + /** + * 版本号 + */ + private String version; + + /** + * 内容长度 + */ + private int leng; + + /** + * 设备ID + */ + private String deviceId; + + /** + * 通讯方式 + */ + private Integer connType; + + /** + * 加密方式 + */ + private Integer encryType; + + /** + * 目标地址 + */ + private String destAddr; + + /** + * PDUType + */ + private String PDUType; + + /** + * 操作类型 + */ + private Integer operateType; + + /** + * 传输控制位 PDUType.bit7=0时,表示存在后续的访问;当PDUType.bit7=1时,表示无后续的访问。 + */ + private Integer transControlFlag; + + /** + * 设备类型 + */ + private Integer deviceType; + + /** + * 序号 + */ + private Integer seq; + + /** + * tagList + */ + private String tagList; + + /** + * OidList + */ + private String OidList; + + /** + * CRC + */ + private String CRC; + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java index 40a5265..97cc984 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java @@ -40,7 +40,7 @@ String httpContent = msg.toString(Charset.defaultCharset()); log.info(" String : " + msg.toString(Charset.defaultCharset())); String majorContent = httpContent.substring(httpContent.indexOf("{"), httpContent.lastIndexOf("}") + 1); - String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("serviceData")).get("Value")); + String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("RegistryData")).get("Value")); log.info("----------------------------------" + values); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); bufferContent.writeBytes(values.getBytes(Charset.forName("ISO-8859-1"))); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java index 1b132a7..e3ced4b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java @@ -35,7 +35,7 @@ String httpContent = msg.toString(Charset.defaultCharset()); log.info(" String : " + msg.toString(Charset.defaultCharset())); String majorContent = httpContent.substring(httpContent.indexOf("{"), httpContent.lastIndexOf("}") + 1); - String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("serviceData")).get("Value")); + String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("RegistryData")).get("Value")); log.info("----------------------------------" + values); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); bufferContent.writeBytes(values.getBytes(Charset.forName("ISO-8859-1"))); diff --git a/sensorhub-core/src/main/resources/application.properties b/sensorhub-core/src/main/resources/application.properties deleted file mode 100644 index 8b13789..0000000 --- a/sensorhub-core/src/main/resources/application.properties +++ /dev/null @@ -1 +0,0 @@ - diff --git a/sensorhub-core/src/main/resources/config/application-dev.yml b/sensorhub-core/src/main/resources/config/application-dev.yml index 4f897a8..dcc4c2d 100644 --- a/sensorhub-core/src/main/resources/config/application-dev.yml +++ b/sensorhub-core/src/main/resources/config/application-dev.yml @@ -4,9 +4,9 @@ spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true + url: jdbc:mysql://127.0.0.1:3306/sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true username: root - password: Casic203 + password: root session: store-type: redis redis: diff --git a/sensorhub-core/src/main/resources/config/application.yml b/sensorhub-core/src/main/resources/config/application.yml index ae89f9d..7965da1 100644 --- a/sensorhub-core/src/main/resources/config/application.yml +++ b/sensorhub-core/src/main/resources/config/application.yml @@ -30,6 +30,13 @@ port: 6379 password: ew5T4K3#203lwh config-prefix: 'Casic:' +#代码生成器配置 +code: + generate: + #作者 + author: cz + #待生成对象表名 + table-name: bussiness_field_config,combined_field_config sensorhub: config: port: 7091 diff --git a/sensorhub-support/pom.xml b/sensorhub-support/pom.xml index 9a71296..761601c 100644 --- a/sensorhub-support/pom.xml +++ b/sensorhub-support/pom.xml @@ -42,6 +42,12 @@ ${redis.version} + + com.baomidou + mybatis-plus-generator + ${mybatis-plus-generator.version} + + org.reflections diff --git a/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java b/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java new file mode 100644 index 0000000..515ca53 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java @@ -0,0 +1,14 @@ +package com.casic.missiles.enums; + +/** + * @author + * @date + */ +public interface FixedPropertyEnum { + + String FIXED_POSITION = "fixedPosition"; + + String TOTAL_LENGTH = "totalLength"; + + String TAIL_POSITION = "tailPosition"; +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/CombinedFieldMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CombinedFieldMapper.java new file mode 100644 index 0000000..38e8f42 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CombinedFieldMapper.java @@ -0,0 +1,15 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.CombinedFieldConfig; +import org.apache.ibatis.annotations.Mapper; + +/** + * @author cz + * + */ +@Mapper +public interface CombinedFieldMapper extends BaseMapper { + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java new file mode 100644 index 0000000..128b09d --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java @@ -0,0 +1,10 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.CommandEventConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface CommandEventMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java new file mode 100644 index 0000000..042eb3c --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.DatagramEventConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface DatagramEventConfigMapper extends BaseMapper { +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java new file mode 100644 index 0000000..fc95cf4 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java @@ -0,0 +1,8 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.FieldConfig; + +public interface FieldConfigMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldRuleConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldRuleConfigMapper.java new file mode 100644 index 0000000..b310a08 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldRuleConfigMapper.java @@ -0,0 +1,10 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.FieldRuleConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface FieldRuleConfigMapper extends BaseMapper { + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java index 608af3a..32cc8a4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java @@ -2,48 +2,47 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.delivery.decorator.ByteDecorator; +import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @AllArgsConstructor public class FieldDecoratorManger { - private final RuleDictDao ruleDictDao; + private final RuleConfigRegistry ruleDictDao; // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 // (1)静态的业务字段是字典里面可以配置的 // (2)动态的业务字段是通过规则生成的 public String contentMerge(String ruleJson, String sceneConent, String dynamicContent) { - List ruleDictList = ruleDictDao.getRuleDictConfig(); - Map ruleDictMap = ruleDictList.stream().collect( - Collectors.toMap(RuleDict::getId, e -> e)); - List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); - for (Map ruleMap : ruleMapList) { - String ruleType = String.valueOf(ruleMap.get("ruleType")); - ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); - NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); - byteDecorator.nodeDecoratorRule(nodeDecoratorParm); - } +// List ruleDictList = ruleDictDao.getRuleDictConfig(); +// Map ruleDictMap = ruleDictList.stream().collect( +// Collectors.toMap(RuleDict::getId, e -> e)); +// List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); +// for (Map ruleMap : ruleMapList) { +// String ruleType = String.valueOf(ruleMap.get("ruleType")); +// ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); +// NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); +// byteDecorator.nodeDecoratorRule(nodeDecoratorParm); +// } return null; } - - private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { - NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() - .contents(sceneConent) - .dynamicContent(dynamicContent) - .ruletypeId(ruletypeId) - .ruleDictMap(ruleDictMap) - .build(); - return nodeDecoratorParm; - } +// +// private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { +// NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() +// .contents(sceneConent) +// .dynamicContent(dynamicContent) +// .ruletypeId(ruletypeId) +// .ruleDictMap(ruleDictMap) +// .build(); +// return nodeDecoratorParm; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java index 652970c..b204ac3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java @@ -1,56 +1,56 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@AllArgsConstructor -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", - JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Component; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Component("logicalDecorator") +//@AllArgsConstructor +//@Slf4j +//public class LogicalShiftDecorator implements ByteDecorator { +// +//// private final FieldRuleEngineMapper fieldRuleEngineMapper; +//// +//// //字节位移 +//// @Override +//// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +//// String logicalValue = ""; +//// RuleEvaluator fieldRuleEngine = new RuleEvaluator(); +//// try { +//// Map env2 = new HashMap(); +//// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +//// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +//// for (String contentId : contentIdList) { +//// RuleDict ruleDict = ruleDictMap.get(contentId); +//// if (ruleDict.getCode().contains("#")) { +//// //使用动态的值 +//// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +//// } +//// env2.put(ruleDict.getName(), ruleDict.getCode()); +//// } +//// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +//// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +//// return null; +//// } +//// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +//// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +//// return values; +//// } catch (Exception ex) { +//// log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", +//// JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +//// return null; +//// } +//// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java index 346468f..822fead 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@AllArgsConstructor -@Slf4j -public class OperationDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("optionDecorator") +//@AllArgsConstructor +//@Slf4j +//public class OperationDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //混合运算,有常量或者乘除的缩放 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java index 50fb0a7..7a8bccb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@AllArgsConstructor -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +////精度计算 +//@AllArgsConstructor +//@Registry("precisionDecorator") +//@Slf4j +//public class PrecisionDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java index da39235..27f9cc7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java @@ -1,54 +1,53 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@AllArgsConstructor -@Slf4j -public class RuleDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("ruleDecorator") +//@AllArgsConstructor +//@Slf4j +//public class RuleDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //吃我一套正则表达式 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (Exception ex) { +// log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java index 7f5cbf3..c043f97 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java @@ -2,6 +2,6 @@ import java.util.Map; -public interface ComandeEventService { +public interface ComandeEventService{ Map loadComandeEventConfig(String protocolId,String scene); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java index 476ad84..aaf1837 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java @@ -2,46 +2,46 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.dao.CommandEventDao; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @Slf4j @AllArgsConstructor -public class ComandeEventServiceImpl implements ComandeEventService { +public class ComandeEventServiceImpl implements ComandeEventRegistry { - private final CommandEventDao commandEventDao; + // private final CommandEventDao commandEventDao; // 加密bean 固定字段出现变化的字段解析,业务字段的有序内容 @Override - public Map loadComandeEventConfig(String protocolId,String sceneName) { - CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); - if (ObjectUtil.isEmpty(commandEventConfig)) { - log.error("协议{},没有配置成功接收回复配置,清排查原因"); - return null; - } - String replyJson = commandEventConfig.getReplyContentJson(); - List> replyMapList = JSONArray.parseObject(replyJson, List.class); - List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); - Map fixMap = fixList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); - List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) - .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) - .collect(Collectors.toList()); - Map commandConfigMap = new HashMap<>(); - commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); - commandConfigMap.put("fixContent", fixMap); - commandConfigMap.put("bizContent", contentList); - return commandConfigMap; + public Map loadComandeEventConfig(String protocolId, String sceneName) { +// CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); +// if (ObjectUtil.isEmpty(commandEventConfig)) { +// log.error("协议{},没有配置成功接收回复配置,清排查原因"); +// return null; +// } +// String replyJson = commandEventConfig.getReplyContentJson(); +// List> replyMapList = JSONArray.parseObject(replyJson, List.class); +// List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); +// Map fixMap = fixList.stream() +// .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); +// List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) +// .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) +// .collect(Collectors.toList()); +// Map commandConfigMap = new HashMap<>(); +// commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); +// commandConfigMap.put("fixContent", fixMap); +// commandConfigMap.put("bizContent", contentList); +// return commandConfigMap; + return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 128b09d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java deleted file mode 100644 index 4016b0b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface DatagramEventMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java deleted file mode 100644 index 597c306..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.apache.ibatis.annotations.Mapper; - -public interface FieldConfigMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java deleted file mode 100644 index a31680a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.PreRuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface PreRuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java deleted file mode 100644 index 9060a69..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface ProtocolConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java deleted file mode 100644 index 6fa6936..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java deleted file mode 100644 index 582a705..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleDict; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleDictMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java deleted file mode 100644 index 6e302c8..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.CommandEventMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Optional; - -@Component -public class CommandEventDao { - - @Resource - private CommandEventMapper commandEventMapper; - - public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId) - .eq("scene", sceneName) - .eq("enabled", 1); - List commandEventConfig = commandEventMapper.selectList(queryWrapper); - Optional optionalEventConfig = commandEventConfig.stream().findFirst(); - return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java deleted file mode 100644 index 9137e4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.FieldConfigMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class FieldConfigDao { - - @Resource - private FieldConfigMapper fieldConfigMapper; - - public FieldConfig getFieldConfigById(String fieldId) { - FieldConfig fieldConfig = fieldConfigMapper.selectById(fieldId); - return fieldConfig; - } - - public List getFieldConfigs(String protocolId,Integer isFixed) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",isFixed); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - - public List getStorageFieldConfig(String protocolId) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",1) - .eq("is_storage",1); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java deleted file mode 100644 index 67bff6b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.mapper.PreRuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class PreRuleConfigDao { - - @Resource - private PreRuleConfigMapper preRuleConfigMapper; - - public List getPreRuleList(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return preRuleConfigMapper.selectList(queryWrapper); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java deleted file mode 100644 index d69ea85..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.RuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleConfigDao { - - @Resource - private RuleConfigMapper ruleConfigMapper; - - public RuleConfig getNextRuleConfig(String ruleFields) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("parse_rule_json", ruleFields); - return ruleConfigMapper.selectOne(queryWrapper); - } - - - public List getRuleConfigById(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return ruleConfigMapper.selectList(queryWrapper); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java deleted file mode 100644 index 932c185..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.RuleDictMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleDictDao { - - @Resource - private RuleDictMapper ruleDictMapper; - - public List getRuleDictConfig() { - List ruleDictList = ruleDictMapper.selectList(null); - return ruleDictList; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java index 9f9e279..43bc4d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java @@ -10,20 +10,15 @@ import io.netty.channel.socket.nio.NioServerSocketChannel; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import javax.annotation.PreDestroy; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static cn.hutool.core.util.ClassUtil.getClasses; /** * SensorhubServer netty服务端 */ @Slf4j -@Service +@Component public class SensorhubServer { /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java index 2c79ff5..9a28c36 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java @@ -11,13 +11,13 @@ import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioSocketChannel; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClient 客户端 */ @Slf4j -@Service +@Registry public final class SensorhubClient { public static void main(String[] args) throws Exception { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java index 9774be0..477c3f7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java @@ -6,12 +6,12 @@ import io.netty.channel.socket.SocketChannel; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientChannelInitialHandler */ -@Service +@Registry public class SensorhubClientChannelInitialHandler extends ChannelInitializer { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java index 346f4b3..73560e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java @@ -5,13 +5,13 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientHandler */ @Slf4j -@Service +@Registry public class SensorhubClientHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java index 5c1c6f2..d990af5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java @@ -4,12 +4,12 @@ import com.casic.missiles.pojo.Msg; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** * SensorhubServerHandler */ -@Service +@Component public class SensorhubServerHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 67283ae..af3172c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,41 +1,37 @@ package com.casic.missiles.parser; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultProtocolConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.*; +import com.casic.missiles.registry.FieldConfigRegistry; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; -import java.nio.charset.Charset; import java.util.HashMap; import java.util.List; import java.util.Map; -@Service("genericProtocolParser") +/** + * @author + */ +@Component("genericProtocolParser") @Slf4j -@AllArgsConstructor +@RequiredArgsConstructor public class GenericProtocolParser implements ProtocolParser { - private final LeadingCodeMatcher leadingCodeMatcher; private final List frameStructDispenserList; - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorInstanceSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; // 匹配首字母前导码=> 帧结构匹配前导码=> // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 @@ -44,18 +40,19 @@ public Boolean doParseProtocol(ByteBuf byteBuf) { String protocolContent = ByteBufUtil.hexDump(byteBuf); //匹配前导码 - List preCodeConfigs = leadingCodeMatcher.matchLeadingCode(protocolContent); + List preCodeConfigs = LeadingCodeMatcher.matchFrameLeadingCode(protocolContent); //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 if (preCodeConfigs.size() == 0) { - return rematch(byteBuf,protocolContent); + return rematch(byteBuf, protocolContent); } - //暂时先取第一个 + //暂时先取第一个,提升速度,使用享元模式, 减少类的创建销毁与构建 ProtocolConfig protocolConfig = preCodeConfigs.get(0); + AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); ByteBuf wholeDatagramByte = null; //通过匹配帧结构获取完整的数据包 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, preCodeConfigs.get(0))) != null) { + if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, protocolFactory)) != null) { break; } } @@ -68,76 +65,78 @@ * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 */ - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId, wholeDatagramByte); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap, protocolId); - //选取规则对应的流程实例 - DatagramEventConfig datagramEventConfig = processorInstanceSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); + //进行规则字段解析,进行匹配规则 + RuleConfig ruleConfig = getRuleConfig(protocolFactory, wholeDatagramByte); + if (ruleConfig == null) { + return false; + } //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, wholeDatagramByte); + ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte); + //以下进行业务的规则解析,同时选定流程实例 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); + DatagramEventProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain, + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText, protocolId); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain); //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); + datagramEventProvider.storeData(bizDataMap); return true; } - private Boolean rematch(ByteBuf byteBuf,String protocolContent) { + /** + * 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 + */ + private Boolean rematch(ByteBuf byteBuf, String protocolContent) { //重置位判断 byteBuf.resetReaderIndex(); //判断重置是否前移,如果没有前移,则直接判为匹配失败 if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { return false; } else { + //递归执行 return doParseProtocol(byteBuf); } } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; + //获取匹配规则->匹配规则 + private RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + //取出其中参与逻辑provider并判空 + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); + String rulePrepareFields = protocolConfig.getRulePrepareFields(); + //固定字段 + if (StringUtils.isNotEmpty(rulePrepareFields)) { + //获取统一固定字段解析 + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + //获取该协议的字段配置,用于协议规则匹配 + List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); + //获取规则 + RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, + rulePrepareFields, protocolFieldConfigs); + return ruleConfig; + } + return null; } - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + //数据构建,获取固定字段的store和业务字段store + private Map buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + Map bizDataMap = new HashMap<>(); + Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); + Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); + bizDataMap.putAll(ruleStoreObjectMap); + bizDataMap.putAll(protocolStoreObjectMap); return bizDataMap; } - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java index 8a46e32..16ce2e5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java @@ -3,6 +3,7 @@ import io.netty.buffer.ByteBuf; public interface ProtocolParser { + Boolean doParseProtocol(ByteBuf byteBuf); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java new file mode 100644 index 0000000..f7814af --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java @@ -0,0 +1,35 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.ProtocolConfigProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.ProtocolConfig; + +/** + * 存放基本协议的的加载信息 + */ +public class AbstractProtocolConfigFactory { + private final ProtocolConfigProvider protocolConfigProvider; + private final ProtocolFieldConfigProvider protocolFieldConfigProvider; + private final RuleConfigProvider ruleConfigProvider; + + public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { + this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); + this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); + this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); + } + + public ProtocolConfigProvider getProtocolConfigProvider() { + return protocolConfigProvider; + } + + public ProtocolFieldConfigProvider getProtocolFieldConfigProvider() { + return protocolFieldConfigProvider; + } + + public RuleConfigProvider getRuleConfigProvider() { + return ruleConfigProvider; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java new file mode 100644 index 0000000..6e36147 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java @@ -0,0 +1,57 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.CombinedFieldConfigProvider; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.FieldConfigProvider; +import com.casic.missiles.parser.provider.FieldRuleConfigProvider; + +/** + * 存放规则相关的的的加载信息 + */ +public class AbstractRuleConfigFactory { + + /** + * 处理字节 + */ + private final FieldConfigProvider fieldConfigProvider; + /** + * 处理组合字节解析的解码器 + */ + private final CombinedFieldConfigProvider combinedFieldConfigProvider; + /** + * 处理负责字节解析的规则配置 + */ + private final FieldRuleConfigProvider fieldRuleConfigProvider; + /** + * 处理实例流程 + */ + private final DatagramEventProvider datagramEventProvider; + + + public AbstractRuleConfigFactory(Long ruleId) { + this.fieldConfigProvider = new FieldConfigProvider(ruleId); + this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); + this.fieldRuleConfigProvider = new FieldRuleConfigProvider(ruleId); + this.datagramEventProvider = new DatagramEventProvider(ruleId); + } + + public FieldConfigProvider getFieldConfigProvider() { + return fieldConfigProvider; + } + + public CombinedFieldConfigProvider getCombinedFieldConfigProvider() { + return combinedFieldConfigProvider; + } + + public FieldRuleConfigProvider getFieldRuleConfigProvider() { + return fieldRuleConfigProvider; + } + + public DatagramEventProvider getDatagramEventProvider() { + return datagramEventProvider; + } + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java deleted file mode 100644 index 6e1719a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.factory; - - -import com.casic.missiles.pojo.ProtocolConfig; - -import java.util.List; - -/** - * 数据库访问优化(暂时未做) - *

- * 1、初始化协议解析配置,并存放到处存放缓存,对协议基本配置进行管理 - * 2、其中流程中所有的配置都经过此类进行管理,进行调用获取,增强解析速度 - */ -public interface DatagramFactory { - - /** - * 初始化 - */ - List datagramInit(); - - /** - * 根据前导码配置匹配,模糊匹配获取所有的报文项 - */ - List match(); - - /** - * 根据前导码匹配,返回报文项 - */ - List filer(); - - /** - * 保证数据的唯一性选择器 - */ - List selectOne(); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java new file mode 100644 index 0000000..87444a0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java @@ -0,0 +1,18 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +import java.util.List; + +/** + * 直接用,还是边用边创建 + */ +public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { + + + public DefaultProtocolConfigFactory(ProtocolConfig protocolConfig) { + super(protocolConfig); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java new file mode 100644 index 0000000..cce0c7c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java @@ -0,0 +1,12 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; + +public class DefaultRuleFactory extends AbstractRuleConfigFactory { + + public DefaultRuleFactory(Long ruleId) { + super(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java deleted file mode 100644 index 9ee97e0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.casic.missiles.parser.instance; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service -@Slf4j -@AllArgsConstructor -public class GeneralProcessor { - - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; - - /** - * 统一固定字段解析=>进行规则的查询的判断 - * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 - * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 - */ - @Deprecated - public boolean parseWholeDatagram(ByteBuf buffer, ProtocolConfig protocolConfig) { - try { - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap,protocolId); - //选取规则对应的流程= - DatagramEventConfig datagramEventConfig = processorSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); - //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); - //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); - //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); - //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); - //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); - return true; - } catch (Exception ex) { - log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", - ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); - return false; - } - } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; - } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); - } - - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); - return bizDataMap; - } - - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java index 25e7ad8..6a5777e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java @@ -1,23 +1,31 @@ package com.casic.missiles.parser.instance.impl; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.mapper.DatagramEventMapper; import com.casic.missiles.pojo.DatagramEventConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.SpringContextUtil; -@Service -@AllArgsConstructor +import java.util.List; +import java.util.Optional; + +/** + * @author cz + * + */ public class DefaultProcessorInstanceSelector implements ProcessorInstanceSelector { - private final DatagramEventMapper datagramEventMapper; + private static List datagramEventConfigs; + + static { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + datagramEventConfigs = datagramEventRegistry.getDatagramEventList(); + } @Override public DatagramEventConfig getProcessorInstance(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("rule_id", protocolId); - return datagramEventMapper.selectOne(queryWrapper); + Optional optionalSelectInstance = datagramEventConfigs.stream() + .filter(e -> e.getId().equals(protocolId)).limit(1).findFirst(); + return optionalSelectInstance.isPresent() ? optionalSelectInstance.get() : null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a778671..7b56a43 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,16 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import io.netty.buffer.ByteBuf; /** - * 分析匹配情况 - * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 - * 2、匹配不成功,有后续帧,可以进行下次匹配。 - * 3、匹配不成功,无后续帧,可以进行丢弃。 + * 分析匹配情况 + * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 + * 2、匹配不成功,有后续帧,可以进行下次匹配。 + * 3、匹配不成功,无后续帧,可以进行丢弃。 */ -public interface FrameStructMatcher{ +public interface FrameStructMatcher { - ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig); + ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 05320ab..8ebea78 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,23 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.ProtocolConfigMapper; +import com.casic.missiles.parser.provider.ProtocolConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Component; import java.util.List; import java.util.stream.Collectors; -@Component -@AllArgsConstructor public class LeadingCodeMatcher { - private final ProtocolConfigMapper protocolMapper; - //** 1、首字母匹配前导码, // 2、以匹配出的前导码是否在报文中条件进行前导码的匹配二次筛选 - public List matchLeadingCode(String protocolContent){ + public static List matchFrameLeadingCode(String protocolContent){ List initialConfigs = initialMatch(protocolContent); List preCodeConfigs = initialConfigs.stream() .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) @@ -26,13 +19,16 @@ } //初始化匹配前导码内容 - private List initialMatch(String protocolContent) { - String protocolStr = protocolContent.charAt(0) + ""; - QueryWrapper queryWrapper = new QueryWrapper() - .likeRight("pre_fix", protocolStr); - List protocolConfigList = protocolMapper.selectList(queryWrapper); - return protocolConfigList; + private static List initialMatch(String protocolContent) { + String firstFrameChar = protocolContent.charAt(0) + ""; + ProtocolConfigProvider protocolConfigProvider=new ProtocolConfigProvider(firstFrameChar); + return protocolConfigProvider.getMatchList(); } + + + + + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index cf2113d..e915877 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -1,32 +1,35 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(0) -@Service +@Component public class FrameLengthMatcher implements FrameStructMatcher { - @Autowired - private FieldParser fieldParser; - //超过长度 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { String dataGramContent = ByteBufUtil.hexDump(byteBuf); - if (StringUtils.isEmpty(protocolConfig.getUnpackId()) && StringUtils.isEmpty(protocolConfig.getTailStr())) { - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + //当不存在结尾标志和拆包标志,可以直接使用长度进行匹配 + if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { if (dataGramContent.length() >= totalLength) {//等于长度返回true,超出长度,切断 - ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, protocolConfig, totalLength); + ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, totalLength); return wholeDatagramByte; } else { //读的标志位前移舍弃 @@ -38,7 +41,7 @@ return null; } - private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, Integer totalLength) { byteBuf.readBytes(totalLength); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, totalLength - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 2bfc213..d527ad0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; @@ -13,7 +13,7 @@ import lombok.AllArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.nio.charset.Charset; import java.util.Map; @@ -22,32 +22,30 @@ * 后续标志验证 */ @Order(1) -@Service +@Component @AllArgsConstructor -public class FrameMarkMatcher implements FrameStructMatcher { - - private final FieldConfigDao fieldConfigDao; - private final FieldParser fieldParser; - private final FieldResolver fieldResolverManger; +public class FrameMarkMatcher implements FrameStructMatcher, FixedPropertyEnum { //帧后续标志=>结束,进行帧的重组=>有后续,1、帧移位判别 2、继续接收帧 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig UnpackConfig = StringUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getUnpackId()); - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); - Integer upback = 0; + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); ByteBuf mergeWholeFrameByte = null; - if (!ObjectUtil.isEmpty(UnpackConfig)) { - while (hasNextFullFrame(byteBuf, protocolConfig)) { - upback = (Integer) fieldResolverManger.filedParserManger(byteBuf, UnpackConfig, null); + if (!ObjectUtil.isEmpty(unpackFlag)) { + while (hasNextFullFrame(byteBuf, protocolConfig, protocolFieldConfigProvider)) { //是否存在后续位 - if (upback == 1) {//使用esayRule + if (unpackFlag == 1) {//使用esayRule //表示可以截取 - mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolConfig, totalLength); + mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolFieldConfigProvider, protocolConfig); return mergeWholeFrameByte; } else { - byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig)); + byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig, protocolFieldConfigProvider)); } } } @@ -56,7 +54,8 @@ //选取第一个帧,将业务内容和后面部分分开 //计算数据报文-业务内容 - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolFieldConfigProvider protocolFieldConfigProvider, ProtocolConfig protocolConfig) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); //截取完整报文 byteBuf.readBytes(totalLength); ByteBuf byteBufContent = byteBuf.slice(0, byteBuf.readerIndex()); @@ -68,15 +67,15 @@ String tail = ""; System.out.println(ByteBufUtil.hexDump(byteBufContent)); //会存在多个帧拼接在一起的的情况,进行合并处理 - while (hasNextFullFrame(byteBufContent, protocolConfig)) { - Integer currentFrameLength = fieldParser.getTotalLength(protocolConfig, byteBufContent); + while (hasNextFullFrame(byteBufContent, protocolConfig, protocolFieldConfigProvider)) { + Integer currentFrameLength = protocolFieldConfigProvider.getTotalLength(byteBufContent, protocolConfig); byteBufContent.readBytes(currentFrameLength); ByteBuf currentbyteBuf = byteBufContent.slice(0, byteBufContent.readerIndex()); byteBufContent.markReaderIndex();//读的标志位前移 System.out.println(ByteBufUtil.hexDump(byteBufContent)); String hexDump = currentbyteBuf.toString(Charset.forName("ISO-8859-1")); //获取当前固定帧结构的关系map - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, currentbyteBuf); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(currentbyteBuf, protocolConfig); if (StringUtils.isEmpty(mergeFrameStr)) { //首次获取业务数据报文 mergeFrameStr += hexDump.substring(0, currentFrameFixedProperty.get("tailPosition")); @@ -95,22 +94,22 @@ /** * 获取平移到下一帧起始位置 */ - public int getNextFrameOffset(ByteBuf buffer, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, buffer); - return currentFrameFixedProperty.get("totalLength"); + public int getNextFrameOffset(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + return currentFrameFixedProperty.get(TOTAL_LENGTH); } /** * 判断是否出错进行整个帧的 */ - public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, byteBuf); + public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); //保证读取位置不在固定位置,是可变的业务内容 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("fixedPosition")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(FIXED_POSITION)) { return false; } //判断读取是否操作帧长度 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("totalLength")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(TOTAL_LENGTH)) { return false; } return true; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 76a3784..c3a1bab 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -1,50 +1,50 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.parser.instance.GeneralProcessor; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; +import io.netty.buffer.ByteBufUtil;; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(2) -@Service +@Component public class FrameTailMatcher implements FrameStructMatcher { - @Resource - private FieldConfigDao fieldConfigDao; - @Autowired - private GeneralProcessor generalProcessor; - //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig tailFieldConfig = StringUtils.isEmpty(protocolConfig.getTailStr()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getTailStr()); - if (!ObjectUtil.isEmpty(tailFieldConfig)) { - String tailStr = tailFieldConfig.getFieldName(); + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfig protocolFieldConfig = ObjectUtils.isEmpty(protocolConfig.getTailStr()) ? null : + fieldConfigProvider.getFieldConfigById(protocolConfig.getTailStr()); + if (!ObjectUtil.isEmpty(protocolFieldConfig)) { + String tailStr = protocolFieldConfig.getFieldName(); String dataGramContent = ByteBufUtil.hexDump(byteBuf); Boolean tailFlag = ByteBufUtil.hexDump(byteBuf).contains(tailStr); if (!tailFlag) { //使用esayRule return null; } else if (dataGramContent.indexOf(tailStr) < dataGramContent.length() - tailStr.length()) { Integer length = dataGramContent.indexOf(tailStr) + tailStr.length(); - ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, protocolConfig, length); + ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, length); return wholeDatagramByte; //存在粘包 } } return null; } - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer length) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, Integer length) { byteBuf.readBytes(length); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, length - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java new file mode 100644 index 0000000..5f1c177 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java @@ -0,0 +1,73 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.combined.GenericCombinedFieldResolver; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.CombinedFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class CombinedFieldConfigProvider { + + + /** + * 作为临时配置列表缓存使用 + */ + private final List combinedFieldConfigList; + private Map storeObjectMap = new HashMap<>(); + + public CombinedFieldConfigProvider(Long ruleId) { + CombinedFieldConfigRegistry combinedFieldConfigRegistry = SpringContextUtil.getBean(CombinedFieldConfigRegistry.class); + combinedFieldConfigList = combinedFieldConfigRegistry.getCombinedFieldConfigList(ruleId); + } + + public void parseDataField(RuleConfig ruleConfig, String clearZeroPlain,Map fieldConfigsMap ) { + if (showSkip()) { + return; + } + //匹配对应的数据,然后进行相关的字段解析 + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver(); + combinedFieldResolver.parseDataField(combinedFieldConfigList, byteBuf, storeObjectMap,fieldConfigsMap); + } + + + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getCombinedFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return combinedFieldConfigList.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public List getCombinedFieldConfigList() { + return combinedFieldConfigList; + } + + /* 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(combinedFieldConfigList) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java new file mode 100644 index 0000000..f3cfedc --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java @@ -0,0 +1,11 @@ +package com.casic.missiles.parser.provider; + +/** + * @author cz + * @date 2023-6-12 + */ +public class CommandEventProvider{ + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java new file mode 100644 index 0000000..70eec5e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java @@ -0,0 +1,77 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.safe.SafeStrategy; +import com.casic.missiles.parser.sender.DataSubscribeProvider; +import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class DatagramEventProvider { + + private final DatagramEventConfig processorInstance; + + public DatagramEventProvider(Long ruleId) { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + List datagramEventConfigList = + datagramEventRegistry.getDatagramEventList(ruleId); + processorInstance = this.getProcessorInstance(datagramEventConfigList); + } + + public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { + if (showSkip()) { + return null; + } + return datagramEventConfigList.get(0); + } + + // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 + public String getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap) { + String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? + processorInstance.getSafeBean() : + fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); + if (!StringUtils.isEmpty(safeName)) { + //需要加密 + SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); + String plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); + return clearComplementZero(plain); + } + return ByteBufUtil.hexDump(bizDataContent); + } + + //解密清零操作 + private String clearComplementZero(String plain) { + plain = plain.substring(0, plain.lastIndexOf("00")); + return plain; + } + + //数据发送,数据发送者暂未构建 + public void storeData(Map bizDataMap) { + DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); +// dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return ObjectUtils.isNotEmpty(processorInstance) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java new file mode 100644 index 0000000..7e1fe0a --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java @@ -0,0 +1,97 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.FieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class FieldConfigProvider { + + + private final List fieldConfigs; + private Map storeObjectMap = new HashMap<>(); +// private Map singleObjects = new ConcurrentHashMap<>(); + + public FieldConfigProvider(Long ruleId) { + FieldConfigRegistry fieldConfigRegistry = SpringContextUtil.getBean(FieldConfigRegistry.class); + fieldConfigs = fieldConfigRegistry.getFieldConfigList(ruleId); + } + + public List getFieldConfigs() { + return fieldConfigs; + } + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public Map parseDataField(RuleConfig ruleConfig, String clearZeroPlain) { + if (showSkip()) { + return null; + } + List prepareFieldConfig = prepareParseField(ruleConfig); + if (CollectionUtils.isNotEmpty(prepareFieldConfig)) { + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(fieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + return fixDataMap; + } + } + return null; + } + + /** + * 得到需要处理的业务内容 + * + * @return + */ + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return fieldConfigs.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public Map getFieldConfigsMap() { + return fieldConfigs.stream().collect( + Collectors.toMap(FieldConfig::getId, e -> e) + ); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(fieldConfigs) ? false : true; + } + + +} + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java new file mode 100644 index 0000000..817bfaf --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java @@ -0,0 +1,19 @@ +package com.casic.missiles.parser.provider; + +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.registry.FieldRuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; + +public class FieldRuleConfigProvider { + + private final List fieldRuleConfigList; + + public FieldRuleConfigProvider(Long ruleId) { + FieldRuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(FieldRuleConfigRegistry.class); + fieldRuleConfigList = ruleConfigRegistry.getFieldRuleConfigList(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java new file mode 100644 index 0000000..99a1b06 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java @@ -0,0 +1,53 @@ +package com.casic.missiles.parser.provider; + + +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.registry.ProtocolConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolConfigProvider { + + private final List protocolConfigList; + + public ProtocolConfigProvider(String firstChar) { + ProtocolConfigRegistry registry = SpringContextUtil.getBean(ProtocolConfigRegistry.class); + protocolConfigList = registry.getProtocolConfigList(firstChar); + } + + public List getMatchList() { + return protocolConfigList; + } + + /** + * 设置当前协议 + * + * @param protocolConfig + */ + public ProtocolConfigProvider(ProtocolConfig protocolConfig) { + List protocolConfigs = new ArrayList<>(); + protocolConfigs.add(protocolConfig); + protocolConfigList = protocolConfigs; + } + + /** + * 获取当前协议 + * + * @return + */ + public ProtocolConfig getCurrentProtocolConfig() { + if (this.protocolConfigList == null) { + return null; + } else { + return protocolConfigList.get(0); + } + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java new file mode 100644 index 0000000..043927d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java @@ -0,0 +1,213 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.registry.ProtocolFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolFieldConfigProvider { + + private static final String FIXED_FIELD_DS = "fixedFieldDs"; + private static final String CONTENT_FIELD_DS = "contentFieldDs"; + private static final String PROTOCOL_LENGTH = "protocolLength"; + private static final String PROTOCOL_FIELD_ID = "protocolFieldId"; + private static final String PROTOCOL_POSITION = "protocolPosition"; + + private final List protocolFieldConfigs; + private Map singleObjects = new ConcurrentHashMap<>(); + private Map storeObjectMap = new HashMap<>(); + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public ProtocolFieldConfigProvider(Long protocolId) { + ProtocolFieldConfigRegistry protocolFieldConfigRegistry = SpringContextUtil.getBean(ProtocolFieldConfigRegistry.class); + protocolFieldConfigs = protocolFieldConfigRegistry.getProtocolFieldConfigList(protocolId); + } + + public List getProtocolFieldConfigs() { + return protocolFieldConfigs; + } + + public ProtocolFieldConfig getFieldConfigById(Long fieldId) { + Optional optionalConfig = protocolFieldConfigs.stream().filter( + e -> e.getId().equals(fieldId) + ).findFirst(); + return optionalConfig.isPresent() ? optionalConfig.get() : null; + } + + public Integer getProtocolFieldValue(Long protocolFieldId, ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_FIELD_ID + protocolFieldId + ByteBufUtil.hexDump(byteBuf); + //获取缓存 + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + //加载固定长度数据集合 + Map fixDataMap = this.getProtocolDataMap(byteBuf); + ProtocolFieldConfig protocolFieldConfig = selectFieldConfig(protocolFieldId); + Integer protocolFieldValue = 0; + //获取约定字段的总长度 + if (fixDataMap.containsKey(protocolFieldConfig.getFieldName())) { + Object appointUnpackObject = fixDataMap.get(protocolFieldConfig.getFieldName()); + if (ObjectUtils.isNotEmpty(appointUnpackObject)) { + protocolFieldValue = (Integer) appointUnpackObject; + } + } + if (protocolFieldValue != null) { + //加入缓存 + if (ObjectUtils.isNotEmpty(protocolFieldValue)) { + this.singleObjects.put(catchKey, protocolFieldValue); + return protocolFieldValue; + } + } + return null; + } + + /** + * 获取帧固定位置信息 + * + * @param byteBuf + * @param protocolConfig + * @return + */ + public Map getFixedProperty(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_POSITION + protocolConfig.getId(); + if (this.singleObjects.containsKey(catchKey)) { + return (Map) singleObjects.get(catchKey); + } + Map fixedPropertyMap = new HashMap<>(); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + fixedPropertyMap = fieldParser.doGetFixedProperty(protocolFieldConfigs, this.getTotalLength(byteBuf,protocolConfig)); + if (CollectionUtils.isNotEmpty(fixedPropertyMap)) { + this.singleObjects.put(catchKey, fixedPropertyMap); + return fixedPropertyMap; + } + return fixedPropertyMap; + } + + /** + * 获取帧结构应有的总长度 + */ + public Integer getTotalLength(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_LENGTH + ByteBufUtil.hexDump(byteBuf); + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + Integer appointFrameLength = getProtocolFieldValue(protocolConfig.getTotalLengthId(), byteBuf); + if (appointFrameLength != null) { + //获取过滤的字段集合总长度 + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Integer totalFilterLength = fieldParser.getTotalFilterLength(protocolConfig, byteBuf, getFixFieldConfigMap()); + //计算总长度 + Integer totalLength = appointFrameLength + totalFilterLength; + //加入缓存 + if (ObjectUtils.isNotEmpty(totalLength)) { + this.singleObjects.put(catchKey, totalLength); + return totalLength; + } + } + return null; + } + + /** + * 获取协议有关字段解析内容 + * storeObjectMap存储代转存的数据 + * + * @return + */ + public Map getProtocolDataMap(ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(FIXED_FIELD_DS)) { + return (Map) singleObjects.get(FIXED_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(protocolFieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + this.singleObjects.put(FIXED_FIELD_DS, fixDataMap); + return fixDataMap; + } + return null; + } + + /** + * 获取业务报文内容的content字节 + * + * @param wholeDatagramByte + * @return + */ + public ByteBuf getDataContentBuf(ByteBuf wholeDatagramByte) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(CONTENT_FIELD_DS)) { + return (ByteBuf) singleObjects.get(CONTENT_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + ByteBuf bizDataByteBuf = fieldParser.getDataContentBuf(protocolFieldConfigs, wholeDatagramByte); + if (bizDataByteBuf != null) { + this.singleObjects.put(CONTENT_FIELD_DS, bizDataByteBuf); + return bizDataByteBuf; + } + return null; + } + + + private ProtocolFieldConfig selectFieldConfig(Long id) { + Optional optionalProtocolFieldConfig = this.protocolFieldConfigs.stream().filter( + e -> e.getId().equals(id) + ).findFirst(); + return optionalProtocolFieldConfig.isPresent() ? optionalProtocolFieldConfig.get() : null; + } + + + private Map getFixFieldConfigMap() { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, e -> e) + ); + return fixDataFieldMap; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(protocolFieldConfigs) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java new file mode 100644 index 0000000..dafba1c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java @@ -0,0 +1,56 @@ +package com.casic.missiles.parser.provider; + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.rule.GenericRuleResolver; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.RuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleConfigProvider { + + private final List ruleConfigs; + + public List getRuleConfigs() { + return ruleConfigs; + } + + public RuleConfigProvider(Long protocolId) { + RuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(RuleConfigRegistry.class); + ruleConfigs = ruleConfigRegistry.getRuleConfigById(protocolId); + } + + /** + * 获取规则匹配结果 + * + * @param parseFixedDataMap + * @param protocolFieldConfigs + * @return + */ + public RuleConfig doGetRule(Map parseFixedDataMap, + String ids, + List protocolFieldConfigs) { + if (showSkip()) { + return null; + } + RuleConfig ruleConfig = GenericRuleResolver.machRule(parseFixedDataMap, ids, protocolFieldConfigs, ruleConfigs); + return ruleConfig; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(ruleConfigs) ? false : true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java index 3c05891..856b399 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java @@ -1,18 +1,11 @@ package com.casic.missiles.parser.resolver; -import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.springframework.web.bind.annotation.RequestBody; -import javax.annotation.Resource; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -20,19 +13,17 @@ @Slf4j public class ByteMergeProvider { - @Resource - private FieldRuleEngineMapper fieldRuleEngineMapper; - //拿到所有的值合并到一个值 - public String resolveByteMerge(List valueList, String ruletypeId, String vaildRange) { + public static String resolveByteMerge(List valueList, String ruleTypeId, String vaildRange) { String values = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Map vaildMap = getValidRangeMap(vaildRange); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(ruletypeId); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } + //暂时不处理 +// fieldRuleEngine = fieldRuleConfigMapper.selectById(ruleTypeId); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } Map env2 = new HashMap(); for (int i = 0; i < valueList.size(); i++) { if (vaildMap.containsKey(i)) { @@ -47,7 +38,7 @@ } } - private Map getValidRangeMap(String vaildRange) { + private static Map getValidRangeMap(String vaildRange) { String[] range = vaildRange.split(","); Map vaildMap = new HashMap(); for (int i = 0; i < range.length; i++) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 8d821cd..85d6bbf 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -1,9 +1,12 @@ package com.casic.missiles.parser.resolver; +import com.casic.missiles.pojo.AbstractFieldConfig; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; import io.netty.buffer.ByteBuf; +import java.util.List; import java.util.Map; /** @@ -11,18 +14,14 @@ */ public interface FieldParser { -// Map fieldProcess(String protocolContent,); - Map dataParser(RuleConfig ruleConfig, String lightText,String protocolId); + Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength); - Map fixDataParser(String protocolId, ByteBuf buffer); + Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap); - Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf); + ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer); - ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer); - - ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer); - - Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer); + Integer getTotalFilterLength(ProtocolConfig protocolConfig, ByteBuf byteBuf, Map protocolFieldConfigMap); } + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java new file mode 100644 index 0000000..9e0c00e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java @@ -0,0 +1,52 @@ +package com.casic.missiles.parser.resolver; + +import com.casic.missiles.pojo.AbstractFieldConfig; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.util.List; + +public class FieldParserSupport { + + //分别计算bit和byte长度=> 合并长度 + protected Integer calculateLength(List fieldConfigList) { + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + Integer fixedLength = bytefixedLength + bitfixedLength / 8; + return fixedLength; + } + + //找到最大值=> 根据最大值计算业务数据下标 + protected Integer calculatePosition(List fieldConfigList) { + String rex = "[0-9]+"; + Integer max = -1; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) + && Integer.valueOf(fieldConfig.getOriginPositionByte()) > max) { + max = Integer.valueOf(fieldConfig.getOriginPositionByte()); + } + } + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) && fieldConfig.getOriginPositionByte().equals(max)) { + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + } + } + Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; + return maxFixedPosition; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java deleted file mode 100644 index dd3a6cd..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java +++ /dev/null @@ -1,170 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.ByteResolverParam; -import io.netty.buffer.ByteBuf; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -/** - * 字段解析管理总类 - */ -@Service -@Slf4j -@AllArgsConstructor -public class FieldResolver extends ByteMergeProvider { - - //1、字段截取 => 2、简单的字节解析和复杂的字节解析 - public Object filedParserManger(ByteBuf byteBuf, FieldConfig fieldConfig, Integer maxFixedPosition) { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - //最大固定位置不为空, - if (!ObjectUtil.isEmpty(maxFixedPosition)) { - orignPosition -= maxFixedPosition; - } - Object fieldValue = 0; - //待优化 - if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { - fieldValue = bitToResolver(byteBuf, fieldConfig); - } else { - ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); - fieldValue = parsingFields(fieldBytes, fieldConfig.getRuleJson()); - } - return fieldValue; - } - - //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, - //目前默认配置的规则设置暂不支持配置化,由实现完成 - private Object parsingFields(ByteBuf byteBuf, String ruleJson) { - Object fieldsResolveValue = null; - List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); - if (ObjectUtil.isEmpty(ruleMapList)) { - fieldsResolveValue = defaultResolveBuilder(byteBuf); - } else { - fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); - } - return fieldsResolveValue; - } - - private Object defaultResolveBuilder(ByteBuf byteBuf) { - Integer defaultResolveValue = 0; - for (int i = 0; i < byteBuf.writerIndex(); i++) { - defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; - } - return defaultResolveValue; - } - - //字段解析构建器(针对字节单位的) - //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 - // 字节归并结束或者规则结束=>继续根据规则进行判断 - private Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { - Object customizeResolveValue = null; - try { - List bytStrList = new ArrayList<>(); - //存放到数组里面 - for (int i = 0; i < byteBuf.writerIndex(); i++) { - bytStrList.add(byteBuf.readByte()); - } - int i = 0; - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - customizeResolveValue = this.resolveByteMerge(bytStrList, ruletypeId,vaildRange); - break; - } else { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - List tempBytStr = new ArrayList<>(); - for (int k = 0; i < bytStrList.size(); i++) { - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(k) - .value(bytStrList.get(k)) - .ruletypeId(ruletypeId).build(); - tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); - } - bytStrList = tempBytStr; - } - i++; - } - //字节归并到一起=>继续根据规则进行判断 - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(customizeResolveValue) - .ruletypeId(ruletypeId).build(); - customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(customizeResolveValue)); - return customizeResolveValue; - } catch (RuntimeException ex) { - log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); - return null; - } - } - - /** - * 1、单个字节情况表示字段 - * 2、多字节情况表示字段(暂未处理) - */ - private Object bitToResolver(ByteBuf byteBuf, FieldConfig fieldConfig) { - Object fieldValue = new Object(); - try { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - byte fields = 0x00; - if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); - } else { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); - } - - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { - if (!StringUtils.isEmpty(fieldConfig.getExactOrignPosition())) { - fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getExactOrignPosition())).byteValue() - >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); - } else { - fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); - } - } else { - fieldValue = Integer.valueOf(fields & 0xff); - } - if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { - return fieldValue; - } - List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); - int i = 0; - //字节归并到一起=>继续根据规则进行判断 - while (i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(fieldValue) - .ruletypeId(ruletypeId).build(); - fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(fieldValue)); - return fieldValue; - } catch (RuntimeException ex) { - log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); - return null; - } - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java new file mode 100644 index 0000000..1d2aeab --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java @@ -0,0 +1,36 @@ +package com.casic.missiles.parser.resolver.bytes; + +import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.mapper.FieldRuleConfigMapper; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.pojo.ByteResolverParam; +import com.googlecode.aviator.AviatorEvaluator; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; +//转换规则 +@Component("convert") +@AllArgsConstructor +@Slf4j +public class ByteRuleResolver implements ByteResolver { + + private final FieldRuleConfigMapper fieldRuleConfigMapper; + + @Override + public Object resolveOperationRule(ByteResolverParam byteResolverParam){ + FieldRuleConfig fieldRuleEngine=fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); + if(ObjectUtil.isEmpty(fieldRuleEngine)){ + return byteResolverParam.getValue(); + } + String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); + Map env2 = new HashMap(); + env2.put("value", (byte) byteResolverParam.getValue()); + String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); + return values; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java index 103821c..786b71c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java @@ -2,34 +2,34 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("logicalShift") +@Component("logicalShift") @AllArgsConstructor @Slf4j public class LogicalShiftResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //字节位移 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { Integer index = byteResolverParam.getIndex(); - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return byteResolverParam.getValue(); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java index 476747d..01149bd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("operation") +@Component("operation") @AllArgsConstructor @Slf4j public class OperationResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //混合运算,有常量或者乘除的缩放 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java index 0b82cf4..79abcce 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.casic.missiles.pojo.ByteResolverParam; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; //精度计算 -@Service("precision") +@Component("precision") @AllArgsConstructor @Slf4j public class PrecisionResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java deleted file mode 100644 index 5c3f332..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; -//转换规则 -@Service("convert") -@AllArgsConstructor -@Slf4j -public class RuleResolver implements ByteResolver { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam){ - RuleEvaluator fieldRuleEngine=fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); - if(ObjectUtil.isEmpty(fieldRuleEngine)){ - return byteResolverParam.getValue(); - } - String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); - Map env2 = new HashMap(); - env2.put("value", (byte) byteResolverParam.getValue()); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java new file mode 100644 index 0000000..d3bbd91 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java @@ -0,0 +1,15 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; + +import java.util.List; +import java.util.Map; +// 前导码匹配->长度字段 +public interface AbstractCombinedFieldProcessor { + + Map invoke(Map map, ByteBuf byteBuf, List combinedFieldConfigList, + Map fieldConfigsMap, Map storeObjectMap); + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java new file mode 100644 index 0000000..03c8480 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java @@ -0,0 +1,59 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-13 + */ +//依次递增进行数据的解析, +public class GenericCombinedFieldResolver { + + + //通过查询,字段长度长度随机 + public void parseDataField(List combinedFieldConfigList, ByteBuf byteBuf, + Map storeObjectMap, Map fieldConfigsMap) { + Integer frameLength = Integer.valueOf(ByteBufUtil.hexDump(byteBuf)); + //添加前置处理器 + com.casic.missiles.util.ClassUtil classUtil = new com.casic.missiles.util.ClassUtil(); + List abstractCombinedProcessors = classUtil.getSubClassList(AbstractCombinedFieldProcessor.class); + + Map fieldFixedMap = combinedFieldLeadCodeMap(combinedFieldConfigList); + //frameLength + Map combinedProcessorFields = null; + while (byteBuf.readableBytes() < frameLength) { + //一直处理 + for (AbstractCombinedFieldProcessor abstractCombinedProcessor : abstractCombinedProcessors) { + combinedProcessorFields = abstractCombinedProcessor.invoke(combinedProcessorFields, byteBuf, + combinedFieldConfigList, + fieldConfigsMap, storeObjectMap); + if (combinedProcessorFields == null || byteBuf.readableBytes() < frameLength) { + return; + } + } + + } + } + + /** + * 取出前导码匹配集合 + */ + private Map combinedFieldLeadCodeMap(List combinedFieldConfigList) { + Map fieldFixedMap = combinedFieldConfigList + .stream() + .collect(Collectors.toMap(CombinedFieldConfig::getPrefixCode, e -> e)); + return fieldFixedMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java new file mode 100644 index 0000000..643a934 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java @@ -0,0 +1,100 @@ +package com.casic.missiles.parser.resolver.fields; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.FieldParserSupport; +import com.casic.missiles.pojo.*; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 保存使用时最基本的信息,并且使用原型模式 + */ +@Slf4j +public class DefaultProtocolFieldParser extends FieldParserSupport implements FieldParser, FixedPropertyEnum { + + //通过传入的配置和报文进行字段解析 + @Override + public Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap) { + Map dataMap = new HashMap<>(); + for (AbstractFieldConfig protocolFieldConfig : protocolFieldConfigs) { + if (!ObjectUtils.isEmpty(protocolFieldConfig.getOriginPositionByte())) { + Object fieldValue = FieldResolver.parseField(buffer, protocolFieldConfig, null); + if (protocolFieldConfig.getIsStorage() == 1) { + storeObjectMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + dataMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + } + return dataMap; + } + + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength) { + Map fixedPropertyMap = new HashMap<>(); + Integer fixedLength = calculateLength(protocolFieldConfigs); + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + fixedPropertyMap.put(FIXED_POSITION, maxFixedPosition); + fixedPropertyMap.put(TOTAL_LENGTH, totalLength); + fixedPropertyMap.put(TAIL_POSITION, totalLength - fixedLength + maxFixedPosition); + return fixedPropertyMap; + } + + //** 获取业务内容的byteBuf + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer) { + //计算固定长度 + Integer fixedLength = calculateLength(protocolFieldConfigs); + //总长度获取 + String lightText = buffer.toString(Charset.forName("ISO-8859-1")); + Integer totalLength = lightText.length(); + //计算固定长度最大长度 + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + //计算数据报文内容 + ByteBuf bizDataFields = buffer.slice(maxFixedPosition - 1, (totalLength - fixedLength)); + return bizDataFields; + } + + /** + * 获取过滤字段的长度 + */ + @Override + public Integer getTotalFilterLength(ProtocolConfig protocolConfig, + ByteBuf byteBuf, + Map protocolFieldConfigMap) { + if (ByteBufUtil.hexDump(byteBuf).equals("")) { + return 0; + } + int totalFilterLength = 0; + String filterFields = protocolConfig.getTotalLengthFilterFields(); + try { + if (!StringUtils.isEmpty(filterFields)) { + String[] filterFieldList = filterFields.split(","); + for (String filterFieldId : filterFieldList) { + if (StringUtils.isNotEmpty(filterFieldId)) { + ProtocolFieldConfig fieldConfig = protocolFieldConfigMap.get(Long.valueOf(filterFieldId)); + //这里都是按字节计算,没有对位进行区分,可能会出现错误 + // 如果对位有需求,需要进一步跟进 + totalFilterLength += fieldConfig.getOffsetLength(); + } + } + } + return totalFilterLength; + } catch (Exception ex) { + log.error("报文确认分发阶段,获取报文总长度过滤长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); + } + return totalFilterLength; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java new file mode 100644 index 0000000..d51e887 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java @@ -0,0 +1,169 @@ +package com.casic.missiles.parser.resolver.fields; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.parser.resolver.ByteMergeProvider; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.AbstractFieldConfig; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.pojo.ByteResolverParam; +import io.netty.buffer.ByteBuf; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * 字段解析管理总类 + */ +@Slf4j +public class FieldResolver extends ByteMergeProvider { + + //1、字段截取 => 2、简单的字节解析和复杂的字节解析 + public static Object parseField(ByteBuf byteBuf,AbstractFieldConfig fieldConfig, Integer maxFixedPosition) { + Integer orignPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + //最大固定位置不为空, + if (!ObjectUtil.isEmpty(maxFixedPosition)) { + orignPosition -= maxFixedPosition; + } + Object fieldValue = 0; + //待优化 + if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { + fieldValue = doParseBitField(byteBuf, fieldConfig); + } else { + ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); + fieldValue = doParseByteField(fieldBytes, fieldConfig.getRuleJson()); + } + return fieldValue; + } + + //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, + //目前默认配置的规则设置暂不支持配置化,由实现完成 + private static Object doParseByteField(ByteBuf byteBuf, String ruleJson) { + Object fieldsResolveValue = null; + List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); + if (ObjectUtil.isEmpty(ruleMapList)) { + fieldsResolveValue = defaultResolveBuilder(byteBuf); + } else { + fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); + } + return fieldsResolveValue; + } + + private static Object defaultResolveBuilder(ByteBuf byteBuf) { + Integer defaultResolveValue = 0; + for (int i = 0; i < byteBuf.writerIndex(); i++) { + defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; + } + return defaultResolveValue; + } + + //字段解析构建器(针对字节单位的) + //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 + // 字节归并结束或者规则结束=>继续根据规则进行判断 + private static Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { + Object customizeResolveValue = null; + try { + List bytStrList = new ArrayList<>(); + //存放到数组里面 + for (int i = 0; i < byteBuf.writerIndex(); i++) { + bytStrList.add(byteBuf.readByte()); + } + int i = 0; + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { + if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + customizeResolveValue = resolveByteMerge(bytStrList, ruletypeId, vaildRange); + break; + } else { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + List tempBytStr = new ArrayList<>(); + for (int k = 0; i < bytStrList.size(); i++) { + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(k) + .value(bytStrList.get(k)) + .ruletypeId(ruletypeId).build(); + tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); + } + bytStrList = tempBytStr; + } + i++; + } + //字节归并到一起=>继续根据规则进行判断 + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(null) + .value(customizeResolveValue) + .ruletypeId(ruletypeId).build(); + customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); + i++; + } + System.out.println(JSON.toJSON(customizeResolveValue)); + return customizeResolveValue; + } catch (RuntimeException ex) { + log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); + return null; + } + } + + /** + * 1、单个字节情况表示字段 + * 2、多字节情况表示字段(暂未处理) + */ + private static Object doParseBitField(ByteBuf byteBuf,AbstractFieldConfig fieldConfig) { + Object fieldValue = new Object(); + try { + Integer orignPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + byte fields = 0x00; + if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { + fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); + } else { + fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); + } + + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { + if (!StringUtils.isEmpty(fieldConfig.getOriginPositionBit())) { + fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getOriginPositionBit())).byteValue() + >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); + } else { + fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); + } + } else { + fieldValue = Integer.valueOf(fields & 0xff); + } + if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { + return fieldValue; + } + List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); + int i = 0; + //字节归并到一起=>继续根据规则进行判断 + while (i < ruleMapList.size()) { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(null) + .value(fieldValue) + .ruletypeId(ruletypeId).build(); + fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); + i++; + } + System.out.println(JSON.toJSON(fieldValue)); + return fieldValue; + } catch (RuntimeException ex) { + log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); + return null; + } + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java deleted file mode 100644 index 35ae3d0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java +++ /dev/null @@ -1,183 +0,0 @@ -package com.casic.missiles.parser.resolver.fields; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufAllocator; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; -import org.springframework.util.ObjectUtils; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service("standard") -@AllArgsConstructor -@Slf4j -public class StandardFieldParser implements FieldParser { - - private final FieldConfigDao fieldConfigDao; - private final FieldResolver fieldResolver; - - //数据解析 - @Override - public Map dataParser(RuleConfig ruleConfig, String lightText, String protocolId) { - String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); - ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); - bufferContent.writeBytes(lightText.getBytes(Charset.forName("ISO-8859-1"))); - Map dataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - for (String dataFieldId : dataFieldIds) { - FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(dataFieldId); - if (!ObjectUtils.isEmpty(fieldConfig)) { - dataMap.put(fieldConfig.getFieldName(), String.valueOf(fieldResolver.filedParserManger(bufferContent, fieldConfig, maxFixedPosition))); - } - } - return dataMap; - } - - //数据解析 - @Override - public Map fixDataParser(String protocolId, ByteBuf buffer) { - List dataFieldIdList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Map dataMap = new HashMap<>(); - for (FieldConfig dataField : dataFieldIdList) { - if (!ObjectUtils.isEmpty(dataField.getOrignPosition())) { - Object fieldValue = (Integer) fieldResolver.filedParserManger(buffer, dataField, null); - dataMap.put(dataField.getFieldName(), fieldValue); - } - } - return dataMap; - } - - @Override - public Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf) { - if (ByteBufUtil.hexDump(byteBuf).equals("")) { - return 0; - } - String filterFields = protocolConfig.getTotalLengthFilterField(); - Integer totalLength = 0; - try { - FieldConfig totalFieldConfig = fieldConfigDao.getFieldConfigById(protocolConfig.getTotalLengthId()); - int totalFilterLength = 0; - if (!StringUtils.isEmpty(filterFields)) { - String[] filterFieldList = filterFields.split(","); - for (String filterField : filterFieldList) { - FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(filterField); - //这里都是按字节计算,没有对位进行区分,可能会出现错误 - - // 如果对位有需求,需要进一步跟进 - totalFilterLength += fieldConfig.getOffsetLength(); - } - } - totalLength = (Integer) fieldResolver.filedParserManger(byteBuf, totalFieldConfig, null) + totalFilterLength; - } catch (Exception ex) { - log.error("报文确认分发阶段,获取报文总长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); - } - return totalLength; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer) { - //业务内容 - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - String protocolId = String.valueOf(protocolConfig.getId()); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - //计算固定长度 - Integer fixedLength = calculateLength(fieldConfigList); -// Integer totalLength = this.getTotalLength(protocolConfig, buffer); - //总长度获取 - Integer totalLength = lightText.length(); - //计算固定长度最大长度 - Integer maxFixedPosition = calculatePosition(fieldConfigList); -// buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - //计算数据报文内容 - ByteBuf bizDataFields = buffer.slice(maxFixedPosition-1, (totalLength - fixedLength)); - return bizDataFields; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer) { - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - String protocolId = String.valueOf(protocolConfig.getId()); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer fixedLength = calculateLength(fieldConfigList); -// Integer totalLength = this.getTotalLength(protocolConfig, buffer); - Integer totalLength = lightText.length(); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - ByteBuf fixDataFields = buffer.slice(0, maxFixedPosition); - return fixDataFields; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer) { - String protocolId = String.valueOf(protocolConfig.getId()); - Map fixedPropertyMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer fixedLength = calculateLength(fieldConfigList); - Integer totalLength = this.getTotalLength(protocolConfig, buffer); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - fixedPropertyMap.put("fixedPosition", maxFixedPosition); - fixedPropertyMap.put("totalLength", totalLength); - fixedPropertyMap.put("tailPosition", totalLength - fixedLength + maxFixedPosition); - return fixedPropertyMap; - } - - //分别计算bit和byte长度=> 合并长度 - private Integer calculateLength(List fieldConfigList) { - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (FieldConfig fieldConfig : fieldConfigList) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - Integer fixedLength = bytefixedLength + bitfixedLength / 8; - return fixedLength; - } - - //找到最大值=> 根据最大值计算业务数据下标 - private Integer calculatePosition(List fieldConfigList) { - String rex = "[0-9]+"; - Integer max = -1; - for (FieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOrignPosition()) - && Integer.valueOf(fieldConfig.getOrignPosition()) > max) { - max = Integer.valueOf(fieldConfig.getOrignPosition()); - } - } - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (FieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOrignPosition()) && fieldConfig.getOrignPosition().equals(max)) { - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - } - } - Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; - return maxFixedPosition; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java new file mode 100644 index 0000000..d4ec6c7 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java @@ -0,0 +1,76 @@ +package com.casic.missiles.parser.rule; + +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import org.apache.commons.lang3.StringUtils; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class GenericRuleResolver { + + //根据前置字段的值,找到指定的规则 + //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 + //=>循环判断=>通过规则得到业务字段 + public static RuleConfig machRule(Map fixDataMap, + String ids, + List protocolFieldConfigs, + List ruleConfigs) { + List preRuleConfigList = getPreRuleList(ids, protocolFieldConfigs); + //获取前置规则字段 + final Map metaDataMap = getPreRuleFields(preRuleConfigList, fixDataMap); + //准备固定的字段集合 + Map fixDataFieldMap = getFixDataFieldMap(protocolFieldConfigs); + return RuleResolverCore.doMachRule(ruleConfigs, metaDataMap, fixDataMap, fixDataFieldMap); + } + + private static Map getFixDataFieldMap(List protocolFieldConfigs) { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, ProtocolFieldConfig::getFieldName) + ); + return fixDataFieldMap; + } + + + /** + * 查询前置规则的字段配置 + * + * @param ids + * @return + */ + private static List getPreRuleList(String ids, List protocolFieldConfigs) { + String[] idList = ids.split(","); + Map prepareMaps = new HashMap<>(); + for (String id : idList) { + if (StringUtils.isNotEmpty(id)) { + prepareMaps.put(Long.valueOf(id), ""); + } + } + List preRuleConfigList = protocolFieldConfigs + .stream() + .filter(e -> prepareMaps.containsKey(e.getId())) + .collect(Collectors.toList()); + return preRuleConfigList; + } + + /** + * 获取前置规则解析字段 + */ + private static Map getPreRuleFields(List preRuleFieldConfigList, Map fixDataMap) { + Map ruleFieldMap = new HashMap<>(); + preRuleFieldConfigList.stream() + .forEach( + preRuleFieldConfig -> { + String fieldName = preRuleFieldConfig.getFieldName(); + if (fixDataMap.containsKey(fieldName)) { + ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); + } + } + ); + return ruleFieldMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java new file mode 100644 index 0000000..baae7e8 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -0,0 +1,68 @@ +package com.casic.missiles.parser.rule; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.casic.missiles.pojo.RuleConfig; + +import java.util.*; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleResolverCore { + + + public static RuleConfig doMachRule(List ruleConfigList, Map metaDataMap, + Map fixDataMap, + Map fixDataFieldMap) { + Optional ruleConfigOptional = ruleConfigList.stream() + .filter(ruleConfig -> machRuleConfig( + JSON.parseObject(ruleConfig.getMatchRuleJson(), Map.class), metaDataMap)) + .findFirst(); + if (ObjectUtil.isEmpty(ruleConfigOptional)) { + return null; + } + String[] ruleFields = ruleConfigOptional.get().getDataFieldIds().split(","); + Map ruleMetaDataMap = getRuleFields(ruleFields, fixDataMap, fixDataFieldMap); + //递归选定解析规则,进行规则解析 + if (!ruleConfigOptional.get().getIsFinishMatch().equals("1")) { + //递归选定规则 + doMachRule(ruleConfigList, ruleMetaDataMap, fixDataMap, fixDataFieldMap); + } + return ruleConfigOptional.get(); + } + + + private static Map getRuleFields(String[] preRuleConfigList, Map fixedDataMap, + Map fixedFieldMap) { + Map ruleFieldMap = new HashMap<>(); + for (String preRuleConfigId : preRuleConfigList) { + String fieldName = fixedFieldMap.get(preRuleConfigId); + if (fixedDataMap.containsKey(fieldName)) { + ruleFieldMap.put(fieldName, String.valueOf(fixedDataMap.get(fieldName))); + } + } + return ruleFieldMap; + } + + + //匹配规则配置 + private static Boolean machRuleConfig(Map ruleMap, Map metaDataMap) { + if (ruleMap == null || metaDataMap == null) { + return null; + } + //所有的字段在规则里面必须有有配置 + for (String key : metaDataMap.keySet()) { + if (ruleMap.containsKey(key)) { + if (!ruleMap.get(key).equals(metaDataMap.get(key))) { + return false; + } + } else { + return false; + } + } + return true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java deleted file mode 100644 index 664088d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java +++ /dev/null @@ -1,92 +0,0 @@ -package com.casic.missiles.parser.rule; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.mapper.dao.PreRuleConfigDao; -import com.casic.missiles.mapper.dao.RuleConfigDao; -import lombok.AllArgsConstructor; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.*; -import java.util.stream.Collectors; - -@Service -@AllArgsConstructor -public class RulerProvider { - - private final FieldConfigDao fieldConfigDao; - private final PreRuleConfigDao preRuleConfigDao; - private final RuleConfigDao ruleConfigDao; - - //根据前置字段的值,找到指定的规则 - //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 - //=>循环判断=>通过规则得到业务字段 - public RuleConfig ruleConfig(Map fixDataMap, String protocolId) { - //批量获取规则 - List preRuleConfigList = preRuleConfigDao.getPreRuleList(protocolId); - //获取固定字段 - Map fixFieldMap = getAllFieldMap(protocolId); - //获取前置规则字段 - final String preRuleFields = getPreRuleFields(preRuleConfigList, fixDataMap, fixFieldMap); - List ruleConfigList = ruleConfigDao.getRuleConfigById(protocolId); - Optional ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig ->preRuleFields.equals( ruleConfig.getParseRuleJson())).findFirst(); - //递归选定解析规则,进行规则解析 - while (!ObjectUtil.isEmpty(ruleConfigOptional) && !ruleConfigOptional.get().getIsBizField().equals("1")) { - String ruleFields = getRuleFields(ruleConfigOptional.get().getDataFieldIds().split(","), fixDataMap, fixFieldMap); - ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig -> ruleConfig.getParseRuleJson().equals(ruleFields)).findFirst(); - } - return ruleConfigOptional.get(); - } - - /** - * 获取前置规则解析字段 - */ - private String getPreRuleFields(List preRuleConfigList, Map fixDataMap, Map fixFieldMap) { - Map ruleFieldMap= new HashMap<>(); - preRuleConfigList.stream() - .forEach( - preRuleConfig -> { - String fieldName = fixFieldMap.get(Long.valueOf(preRuleConfig.getRuleFieldId())); - if (fixDataMap.containsKey(fieldName)) { - ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); - } - } - ); - return JSONObject.toJSONString(ruleFieldMap); - } - - private Map getAllFieldMap(String protocolId) { - List fieldList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Map fixFieldMap = fieldList.stream().collect( - Collectors.toMap(FieldConfig::getId, FieldConfig::getFieldName) - ); - return fixFieldMap; - } - - private String getRuleFields(String[] preRuleConfigList, Map fixDataMap, Map fixFieldMap) { - Map ruleFieldMap= new HashMap<>(); - for (String preRuleConfigId : preRuleConfigList) { - String fieldName = fixFieldMap.get(preRuleConfigId); - if (fixDataMap.containsKey(fieldName)) { - ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); - } - } - return JSONObject.toJSONString(ruleFieldMap); - } - - //弃置 - private String ListToString(List ruleFieldList) { - String ruleFields = ""; - for (String ruleField : ruleFieldList) { - ruleFields += ruleField + ","; - } - ruleFields = StringUtils.isEmpty(ruleFields) ? ruleFields : ruleFields.substring(0, ruleFields.length() - 1); - return ruleFields; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java index 6177e10..bfa87a5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java @@ -2,7 +2,7 @@ public interface SafeStrategy { - String decryption(byte[] bytes); + String decryption(String cipher); String encryption(String lightText); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java index 618716c..6236302 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java @@ -9,9 +9,9 @@ //十六进制的字符串转换成字节数组 byte[] bytes = hexStrToBinaryStr(msg); //计算CRC8 - byte crc8 = CRC8(bytes, 0, bytes.length); - String crc8ToStr = "" + Integer.toHexString(0xff & crc8); - return crc8ToStr; +// String crc8ToStr = "" + Integer.toHexString(0xff & crc8); +// return crc8ToStr; + return null; } /** @@ -33,50 +33,5 @@ return bytes; } - /** - * CRC8 校验 多项式 x8+x2+x+1 - * - * @param b - * @param off - * @param len - * @return - */ - public static byte CRC8(final byte[] b, final int off, final int len) { - byte result = 0x00; - for (int i = 0; i < len; i++) { - result = CHECKSUM_TABLE[(result ^ (b[i + off] & 0xFF)) & 0xFF]; - } - return (byte) (result & 0xFFL); - } - - private final static byte[] CHECKSUM_TABLE = {(byte) 0x00, (byte) 0x07, (byte) 0x0e, (byte) 0x09, (byte) 0x1c, (byte) 0x1b, - (byte) 0x12, (byte) 0x15, (byte) 0x38, (byte) 0x3f, (byte) 0x36, (byte) 0x31, (byte) 0x24, (byte) 0x23, (byte) 0x2a, - (byte) 0x2d, (byte) 0x70, (byte) 0x77, (byte) 0x7e, (byte) 0x79, (byte) 0x6c, (byte) 0x6b, (byte) 0x62, (byte) 0x65, - (byte) 0x48, (byte) 0x4f, (byte) 0x46, (byte) 0x41, (byte) 0x54, (byte) 0x53, (byte) 0x5a, (byte) 0x5d, (byte) 0xe0, - (byte) 0xe7, (byte) 0xee, (byte) 0xe9, (byte) 0xfc, (byte) 0xfb, (byte) 0xf2, (byte) 0xf5, (byte) 0xd8, (byte) 0xdf, - (byte) 0xd6, (byte) 0xd1, (byte) 0xc4, (byte) 0xc3, (byte) 0xca, (byte) 0xcd, (byte) 0x90, (byte) 0x97, (byte) 0x9e, - (byte) 0x99, (byte) 0x8c, (byte) 0x8b, (byte) 0x82, (byte) 0x85, (byte) 0xa8, (byte) 0xaf, (byte) 0xa6, (byte) 0xa1, - (byte) 0xb4, (byte) 0xb3, (byte) 0xba, (byte) 0xbd, (byte) 0xc7, (byte) 0xc0, (byte) 0xc9, (byte) 0xce, (byte) 0xdb, - (byte) 0xdc, (byte) 0xd5, (byte) 0xd2, (byte) 0xff, (byte) 0xf8, (byte) 0xf1, (byte) 0xf6, (byte) 0xe3, (byte) 0xe4, - (byte) 0xed, (byte) 0xea, (byte) 0xb7, (byte) 0xb0, (byte) 0xb9, (byte) 0xbe, (byte) 0xab, (byte) 0xac, (byte) 0xa5, - (byte) 0xa2, (byte) 0x8f, (byte) 0x88, (byte) 0x81, (byte) 0x86, (byte) 0x93, (byte) 0x94, (byte) 0x9d, (byte) 0x9a, - (byte) 0x27, (byte) 0x20, (byte) 0x29, (byte) 0x2e, (byte) 0x3b, (byte) 0x3c, (byte) 0x35, (byte) 0x32, (byte) 0x1f, - (byte) 0x18, (byte) 0x11, (byte) 0x16, (byte) 0x03, (byte) 0x04, (byte) 0x0d, (byte) 0x0a, (byte) 0x57, (byte) 0x50, - (byte) 0x59, (byte) 0x5e, (byte) 0x4b, (byte) 0x4c, (byte) 0x45, (byte) 0x42, (byte) 0x6f, (byte) 0x68, (byte) 0x61, - (byte) 0x66, (byte) 0x73, (byte) 0x74, (byte) 0x7d, (byte) 0x7a, (byte) 0x89, (byte) 0x8e, (byte) 0x87, (byte) 0x80, - (byte) 0x95, (byte) 0x92, (byte) 0x9b, (byte) 0x9c, (byte) 0xb1, (byte) 0xb6, (byte) 0xbf, (byte) 0xb8, (byte) 0xad, - (byte) 0xaa, (byte) 0xa3, (byte) 0xa4, (byte) 0xf9, (byte) 0xfe, (byte) 0xf7, (byte) 0xf0, (byte) 0xe5, (byte) 0xe2, - (byte) 0xeb, (byte) 0xec, (byte) 0xc1, (byte) 0xc6, (byte) 0xcf, (byte) 0xc8, (byte) 0xdd, (byte) 0xda, (byte) 0xd3, - (byte) 0xd4, (byte) 0x69, (byte) 0x6e, (byte) 0x67, (byte) 0x60, (byte) 0x75, (byte) 0x72, (byte) 0x7b, (byte) 0x7c, - (byte) 0x51, (byte) 0x56, (byte) 0x5f, (byte) 0x58, (byte) 0x4d, (byte) 0x4a, (byte) 0x43, (byte) 0x44, (byte) 0x19, - (byte) 0x1e, (byte) 0x17, (byte) 0x10, (byte) 0x05, (byte) 0x02, (byte) 0x0b, (byte) 0x0c, (byte) 0x21, (byte) 0x26, - (byte) 0x2f, (byte) 0x28, (byte) 0x3d, (byte) 0x3a, (byte) 0x33, (byte) 0x34, (byte) 0x4e, (byte) 0x49, (byte) 0x40, - (byte) 0x47, (byte) 0x52, (byte) 0x55, (byte) 0x5c, (byte) 0x5b, (byte) 0x76, (byte) 0x71, (byte) 0x78, (byte) 0x7f, - (byte) 0x6a, (byte) 0x6d, (byte) 0x64, (byte) 0x63, (byte) 0x3e, (byte) 0x39, (byte) 0x30, (byte) 0x37, (byte) 0x22, - (byte) 0x25, (byte) 0x2c, (byte) 0x2b, (byte) 0x06, (byte) 0x01, (byte) 0x08, (byte) 0x0f, (byte) 0x1a, (byte) 0x1d, - (byte) 0x14, (byte) 0x13, (byte) 0xae, (byte) 0xa9, (byte) 0xa0, (byte) 0xa7, (byte) 0xb2, (byte) 0xb5, (byte) 0xbc, - (byte) 0xbb, (byte) 0x96, (byte) 0x91, (byte) 0x98, (byte) 0x9f, (byte) 0x8a, (byte) 0x8d, (byte) 0x84, (byte) 0x83, - (byte) 0xde, (byte) 0xd9, (byte) 0xd0, (byte) 0xd7, (byte) 0xc2, (byte) 0xc5, (byte) 0xcc, (byte) 0xcb, (byte) 0xe6, - (byte) 0xe1, (byte) 0xe8, (byte) 0xef, (byte) 0xfa, (byte) 0xfd, (byte) 0xf4, (byte) 0xf3}; } \ No newline at end of file diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java index 27c2838..6e078a3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java @@ -1,9 +1,6 @@ package com.casic.missiles.parser.safe.impl; -import cn.hutool.core.util.CharsetUtil; -import cn.hutool.crypto.symmetric.SM4; -import cn.hutool.crypto.symmetric.SymmetricCrypto; - +import com.casic.missiles.parser.safe.SafeStrategy; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; @@ -11,19 +8,44 @@ import org.bouncycastle.crypto.engines.SM4Engine; import org.bouncycastle.crypto.params.KeyParameter; import org.bouncycastle.util.encoders.Hex; - -import static cn.hutool.crypto.Mode.ECB; -import static cn.hutool.crypto.Padding.NoPadding; +import org.springframework.stereotype.Component; /** * SM4算法工具类 */ @Slf4j -public class Sm4 { +@Component("sm4") +public class Sm4 implements SafeStrategy { //加解密的字节快大小 public static final int BlockSize = 16; + @Override + public String decryption(String cipher) { + byte[] keyByte = { + 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 + }; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(keyByte); + byte[] in = Hex.decode(cipher); + byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); + String plain = EcbDecrypt(in, keyBytes); + return plain; + } + + @Override + public String encryption(String cipher) { + byte[] keyByte = { + 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 + }; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(keyByte); + byte[] in = Hex.decode(cipher); + byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); + String plain = EcbDecrypt(in, keyBytes); + return plain; + } + /** * SM4ECB加密算法,对内 * @@ -32,8 +54,6 @@ * @return */ private static byte[] ecb_encrypt(byte[] in, byte[] keyBytes) { - - SM4Engine sm4Engine = new SM4Engine(); sm4Engine.init(true, new KeyParameter(keyBytes)); byte[] out = new byte[in.length]; @@ -58,27 +78,6 @@ return cipher; } - - /** - * hutool 解密SM4 - * - * @param encodeContent - * @return - */ - public static String decode(String encodeContent) { - String key = "24ad182507479a5da3ad94d9d78ea203"; - try { - SymmetricCrypto sm4 = new SM4(ECB, NoPadding, key.getBytes()); - String decryptStr = sm4.decryptStr(encodeContent, CharsetUtil.CHARSET_UTF_8); - return decryptStr; - } catch (Exception e) { - e.printStackTrace(); - log.error("SM4解密失败"); - } - return null; - } - - /** * SM4的ECB加密算法 * @@ -129,20 +128,6 @@ return plain; } - /** - * SM4的ECB解密算法 - * - * @param cipher 输入的密文字符串 - * @param key 密钥 - * @return - */ - public static String EcbDecrypt(String cipher, String key) { - byte[] in = Hex.decode(cipher); - byte[] keyBytes = Hex.decode(key); - - String plain = EcbDecrypt(in, keyBytes); - return plain; - } /** * 主函数 @@ -151,28 +136,24 @@ */ public static void main(String[] args) { byte[] ciphertext = { + 0x4B, (byte) 0x8C, (byte) 0x9D, 0x08, (byte) 0xE4, (byte) 0xD3, 0x64, 0x42, (byte) 0xB9, (byte) 0xA5, (byte) 0xFE, (byte) 0xCD, (byte) 0x91, 0x1B, 0x38, (byte) 0xAC, (byte) 0xE9, 0x1C, (byte) 0xCD, 0x53, 0x02, (byte) 0xD7, 0x0C, (byte) 0x9B, (byte) 0x96, 0x30, 0x62, (byte) 0xE8, (byte) 0xFB, (byte) 0xEF, (byte) 0xB9, (byte) 0xFF, (byte) 0xDE, 0x19, (byte) 0x80, 0x35, 0x3E, (byte) 0x90, 0x4F, 0x2F, 0x12, 0x2B, 0x19, (byte) 0x8B, 0x6C, 0x7A, (byte) 0x85, (byte) 0xA1, (byte) 0xB1, (byte) 0x86, (byte) 0xA3, 0x7A, 0x46, 0x0C, 0x2F, (byte) 0x94, 0x4F, 0x7F, 0x2C, 0x56, 0x14, (byte) 0xF3, (byte) 0x89, (byte) 0xC3, - 0x3F, 0x20, (byte) 0xF9, (byte) 0x87, (byte) 0xA1, 0x60, (byte) 0xD9, (byte) 0xA8, (byte) 0xFD, (byte) 0xD7, (byte) 0x9B, 0x4B, 0x26, 0x06, 0x30, 0x44}; + 0x3F, 0x20, (byte) 0xF9, (byte) 0x87, (byte) 0xA1, 0x60, (byte) 0xD9, (byte) 0xA8, (byte) 0xFD, (byte) 0xD7, (byte) 0x9B, 0x4B, 0x26, 0x06, 0x30, 0x44 + }; ByteBuf in = ByteBufAllocator.DEFAULT.heapBuffer(); in.writeBytes(ciphertext); - byte[] keyByte = { 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 }; ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); - key.writeBytes(ciphertext); - String resCipherData = decode(ByteBufUtil.hexDump(in)); - ByteBuf out = ByteBufAllocator.DEFAULT.heapBuffer(); -// out.writeBytes(resCipherData); -// System.out.println(hexBytes); - System.out.println(resCipherData.toString()); -// String resPlainData = EcbDecrypt(resCipherData, key); -// System.out.println("原始明文:" + data); -// System.out.println("解密后明文:" + resPlainData); + key.writeBytes(keyByte); +// String resCipherData = EcbDecrypt(ByteBufUtil.hexDump(in), ByteBufUtil.hexDump(key)); +// System.out.println(resCipherData); } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java index 1395a51..ac5f957 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java @@ -1,7 +1,7 @@ package com.casic.missiles.parser.safe.impl; import io.netty.buffer.ByteBufUtil; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** *

@@ -14,9 +14,8 @@ * @author hyl * @version v1.0: Tea.java, v 0.1 2021/3/12 13:48 $ */ -@Service("tea") -///tea算法类 - +//tea算法类 +@Component("tea") public class Tea { public static byte[] MyTea_Encrypt(byte[] MyTeaContent, int ByteLen, byte[] MyTeakey) { @@ -99,7 +98,6 @@ // for(int i32Index = 0; i32Index < 8; i32Index++) { // System.out.print("0x" + Integer.toHexString(MyContent[i32Index]) + " "); // } - // System.out.println("密钥为:"); // for(int i32Index = 0; i32Index < 16; i32Index++) { // System.out.print("0x" + Integer.toHexString(MyKeys[i32Index]) + " "); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java index bdd0721..bd1516a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java @@ -3,7 +3,7 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.parser.sender.DataSubscribeProvider; import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponents; import org.springframework.web.util.UriComponentsBuilder; @@ -12,7 +12,7 @@ import java.util.Collections; import java.util.Map; -@Service("functionCallback") +@Component("functionCallback") public class FunctionCallback implements DataSubscribeProvider { @Resource diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java index 0b44fb9..7526de2 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.Map; -@Service("middleware") +@Component("middleware") public class MiddlewareSubscribe implements DataSubscribeProvider { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java index 5dcee3f..e2f1192 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.Map; -@Service("nosql") +@Component("nosql") public class NoSqlSubscribe implements DataSubscribeProvider { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java b/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java new file mode 100644 index 0000000..81a5324 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java @@ -0,0 +1,86 @@ +package com.casic.missiles.pojo; + +import lombok.Data; + +/** + * 协议 + */ +@Data +public class Msg { + + /** + * 前导码 + */ + private String preamble; + + /** + * 版本号 + */ + private String version; + + /** + * 内容长度 + */ + private int leng; + + /** + * 设备ID + */ + private String deviceId; + + /** + * 通讯方式 + */ + private Integer connType; + + /** + * 加密方式 + */ + private Integer encryType; + + /** + * 目标地址 + */ + private String destAddr; + + /** + * PDUType + */ + private String PDUType; + + /** + * 操作类型 + */ + private Integer operateType; + + /** + * 传输控制位 PDUType.bit7=0时,表示存在后续的访问;当PDUType.bit7=1时,表示无后续的访问。 + */ + private Integer transControlFlag; + + /** + * 设备类型 + */ + private Integer deviceType; + + /** + * 序号 + */ + private Integer seq; + + /** + * tagList + */ + private String tagList; + + /** + * OidList + */ + private String OidList; + + /** + * CRC + */ + private String CRC; + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java index 40a5265..97cc984 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java @@ -40,7 +40,7 @@ String httpContent = msg.toString(Charset.defaultCharset()); log.info(" String : " + msg.toString(Charset.defaultCharset())); String majorContent = httpContent.substring(httpContent.indexOf("{"), httpContent.lastIndexOf("}") + 1); - String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("serviceData")).get("Value")); + String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("RegistryData")).get("Value")); log.info("----------------------------------" + values); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); bufferContent.writeBytes(values.getBytes(Charset.forName("ISO-8859-1"))); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java index 1b132a7..e3ced4b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java @@ -35,7 +35,7 @@ String httpContent = msg.toString(Charset.defaultCharset()); log.info(" String : " + msg.toString(Charset.defaultCharset())); String majorContent = httpContent.substring(httpContent.indexOf("{"), httpContent.lastIndexOf("}") + 1); - String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("serviceData")).get("Value")); + String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("RegistryData")).get("Value")); log.info("----------------------------------" + values); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); bufferContent.writeBytes(values.getBytes(Charset.forName("ISO-8859-1"))); diff --git a/sensorhub-core/src/main/resources/application.properties b/sensorhub-core/src/main/resources/application.properties deleted file mode 100644 index 8b13789..0000000 --- a/sensorhub-core/src/main/resources/application.properties +++ /dev/null @@ -1 +0,0 @@ - diff --git a/sensorhub-core/src/main/resources/config/application-dev.yml b/sensorhub-core/src/main/resources/config/application-dev.yml index 4f897a8..dcc4c2d 100644 --- a/sensorhub-core/src/main/resources/config/application-dev.yml +++ b/sensorhub-core/src/main/resources/config/application-dev.yml @@ -4,9 +4,9 @@ spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true + url: jdbc:mysql://127.0.0.1:3306/sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true username: root - password: Casic203 + password: root session: store-type: redis redis: diff --git a/sensorhub-core/src/main/resources/config/application.yml b/sensorhub-core/src/main/resources/config/application.yml index ae89f9d..7965da1 100644 --- a/sensorhub-core/src/main/resources/config/application.yml +++ b/sensorhub-core/src/main/resources/config/application.yml @@ -30,6 +30,13 @@ port: 6379 password: ew5T4K3#203lwh config-prefix: 'Casic:' +#代码生成器配置 +code: + generate: + #作者 + author: cz + #待生成对象表名 + table-name: bussiness_field_config,combined_field_config sensorhub: config: port: 7091 diff --git a/sensorhub-support/pom.xml b/sensorhub-support/pom.xml index 9a71296..761601c 100644 --- a/sensorhub-support/pom.xml +++ b/sensorhub-support/pom.xml @@ -42,6 +42,12 @@ ${redis.version} + + com.baomidou + mybatis-plus-generator + ${mybatis-plus-generator.version} + + org.reflections diff --git a/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java b/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java new file mode 100644 index 0000000..515ca53 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java @@ -0,0 +1,14 @@ +package com.casic.missiles.enums; + +/** + * @author + * @date + */ +public interface FixedPropertyEnum { + + String FIXED_POSITION = "fixedPosition"; + + String TOTAL_LENGTH = "totalLength"; + + String TAIL_POSITION = "tailPosition"; +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/CombinedFieldMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CombinedFieldMapper.java new file mode 100644 index 0000000..38e8f42 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CombinedFieldMapper.java @@ -0,0 +1,15 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.CombinedFieldConfig; +import org.apache.ibatis.annotations.Mapper; + +/** + * @author cz + * + */ +@Mapper +public interface CombinedFieldMapper extends BaseMapper { + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java new file mode 100644 index 0000000..128b09d --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java @@ -0,0 +1,10 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.CommandEventConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface CommandEventMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java new file mode 100644 index 0000000..042eb3c --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.DatagramEventConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface DatagramEventConfigMapper extends BaseMapper { +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java new file mode 100644 index 0000000..fc95cf4 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java @@ -0,0 +1,8 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.FieldConfig; + +public interface FieldConfigMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldRuleConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldRuleConfigMapper.java new file mode 100644 index 0000000..b310a08 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldRuleConfigMapper.java @@ -0,0 +1,10 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.FieldRuleConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface FieldRuleConfigMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java new file mode 100644 index 0000000..9060a69 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.ProtocolConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface ProtocolConfigMapper extends BaseMapper { +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java index 608af3a..32cc8a4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java @@ -2,48 +2,47 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.delivery.decorator.ByteDecorator; +import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @AllArgsConstructor public class FieldDecoratorManger { - private final RuleDictDao ruleDictDao; + private final RuleConfigRegistry ruleDictDao; // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 // (1)静态的业务字段是字典里面可以配置的 // (2)动态的业务字段是通过规则生成的 public String contentMerge(String ruleJson, String sceneConent, String dynamicContent) { - List ruleDictList = ruleDictDao.getRuleDictConfig(); - Map ruleDictMap = ruleDictList.stream().collect( - Collectors.toMap(RuleDict::getId, e -> e)); - List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); - for (Map ruleMap : ruleMapList) { - String ruleType = String.valueOf(ruleMap.get("ruleType")); - ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); - NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); - byteDecorator.nodeDecoratorRule(nodeDecoratorParm); - } +// List ruleDictList = ruleDictDao.getRuleDictConfig(); +// Map ruleDictMap = ruleDictList.stream().collect( +// Collectors.toMap(RuleDict::getId, e -> e)); +// List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); +// for (Map ruleMap : ruleMapList) { +// String ruleType = String.valueOf(ruleMap.get("ruleType")); +// ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); +// NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); +// byteDecorator.nodeDecoratorRule(nodeDecoratorParm); +// } return null; } - - private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { - NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() - .contents(sceneConent) - .dynamicContent(dynamicContent) - .ruletypeId(ruletypeId) - .ruleDictMap(ruleDictMap) - .build(); - return nodeDecoratorParm; - } +// +// private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { +// NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() +// .contents(sceneConent) +// .dynamicContent(dynamicContent) +// .ruletypeId(ruletypeId) +// .ruleDictMap(ruleDictMap) +// .build(); +// return nodeDecoratorParm; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java index 652970c..b204ac3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java @@ -1,56 +1,56 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@AllArgsConstructor -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", - JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Component; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Component("logicalDecorator") +//@AllArgsConstructor +//@Slf4j +//public class LogicalShiftDecorator implements ByteDecorator { +// +//// private final FieldRuleEngineMapper fieldRuleEngineMapper; +//// +//// //字节位移 +//// @Override +//// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +//// String logicalValue = ""; +//// RuleEvaluator fieldRuleEngine = new RuleEvaluator(); +//// try { +//// Map env2 = new HashMap(); +//// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +//// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +//// for (String contentId : contentIdList) { +//// RuleDict ruleDict = ruleDictMap.get(contentId); +//// if (ruleDict.getCode().contains("#")) { +//// //使用动态的值 +//// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +//// } +//// env2.put(ruleDict.getName(), ruleDict.getCode()); +//// } +//// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +//// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +//// return null; +//// } +//// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +//// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +//// return values; +//// } catch (Exception ex) { +//// log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", +//// JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +//// return null; +//// } +//// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java index 346468f..822fead 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@AllArgsConstructor -@Slf4j -public class OperationDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("optionDecorator") +//@AllArgsConstructor +//@Slf4j +//public class OperationDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //混合运算,有常量或者乘除的缩放 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java index 50fb0a7..7a8bccb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@AllArgsConstructor -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +////精度计算 +//@AllArgsConstructor +//@Registry("precisionDecorator") +//@Slf4j +//public class PrecisionDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java index da39235..27f9cc7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java @@ -1,54 +1,53 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@AllArgsConstructor -@Slf4j -public class RuleDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("ruleDecorator") +//@AllArgsConstructor +//@Slf4j +//public class RuleDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //吃我一套正则表达式 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (Exception ex) { +// log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java index 7f5cbf3..c043f97 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java @@ -2,6 +2,6 @@ import java.util.Map; -public interface ComandeEventService { +public interface ComandeEventService{ Map loadComandeEventConfig(String protocolId,String scene); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java index 476ad84..aaf1837 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java @@ -2,46 +2,46 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.dao.CommandEventDao; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @Slf4j @AllArgsConstructor -public class ComandeEventServiceImpl implements ComandeEventService { +public class ComandeEventServiceImpl implements ComandeEventRegistry { - private final CommandEventDao commandEventDao; + // private final CommandEventDao commandEventDao; // 加密bean 固定字段出现变化的字段解析,业务字段的有序内容 @Override - public Map loadComandeEventConfig(String protocolId,String sceneName) { - CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); - if (ObjectUtil.isEmpty(commandEventConfig)) { - log.error("协议{},没有配置成功接收回复配置,清排查原因"); - return null; - } - String replyJson = commandEventConfig.getReplyContentJson(); - List> replyMapList = JSONArray.parseObject(replyJson, List.class); - List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); - Map fixMap = fixList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); - List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) - .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) - .collect(Collectors.toList()); - Map commandConfigMap = new HashMap<>(); - commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); - commandConfigMap.put("fixContent", fixMap); - commandConfigMap.put("bizContent", contentList); - return commandConfigMap; + public Map loadComandeEventConfig(String protocolId, String sceneName) { +// CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); +// if (ObjectUtil.isEmpty(commandEventConfig)) { +// log.error("协议{},没有配置成功接收回复配置,清排查原因"); +// return null; +// } +// String replyJson = commandEventConfig.getReplyContentJson(); +// List> replyMapList = JSONArray.parseObject(replyJson, List.class); +// List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); +// Map fixMap = fixList.stream() +// .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); +// List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) +// .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) +// .collect(Collectors.toList()); +// Map commandConfigMap = new HashMap<>(); +// commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); +// commandConfigMap.put("fixContent", fixMap); +// commandConfigMap.put("bizContent", contentList); +// return commandConfigMap; + return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 128b09d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java deleted file mode 100644 index 4016b0b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface DatagramEventMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java deleted file mode 100644 index 597c306..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.apache.ibatis.annotations.Mapper; - -public interface FieldConfigMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java deleted file mode 100644 index a31680a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.PreRuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface PreRuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java deleted file mode 100644 index 9060a69..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface ProtocolConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java deleted file mode 100644 index 6fa6936..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java deleted file mode 100644 index 582a705..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleDict; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleDictMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java deleted file mode 100644 index 6e302c8..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.CommandEventMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Optional; - -@Component -public class CommandEventDao { - - @Resource - private CommandEventMapper commandEventMapper; - - public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId) - .eq("scene", sceneName) - .eq("enabled", 1); - List commandEventConfig = commandEventMapper.selectList(queryWrapper); - Optional optionalEventConfig = commandEventConfig.stream().findFirst(); - return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java deleted file mode 100644 index 9137e4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.FieldConfigMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class FieldConfigDao { - - @Resource - private FieldConfigMapper fieldConfigMapper; - - public FieldConfig getFieldConfigById(String fieldId) { - FieldConfig fieldConfig = fieldConfigMapper.selectById(fieldId); - return fieldConfig; - } - - public List getFieldConfigs(String protocolId,Integer isFixed) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",isFixed); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - - public List getStorageFieldConfig(String protocolId) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",1) - .eq("is_storage",1); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java deleted file mode 100644 index 67bff6b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.mapper.PreRuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class PreRuleConfigDao { - - @Resource - private PreRuleConfigMapper preRuleConfigMapper; - - public List getPreRuleList(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return preRuleConfigMapper.selectList(queryWrapper); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java deleted file mode 100644 index d69ea85..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.RuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleConfigDao { - - @Resource - private RuleConfigMapper ruleConfigMapper; - - public RuleConfig getNextRuleConfig(String ruleFields) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("parse_rule_json", ruleFields); - return ruleConfigMapper.selectOne(queryWrapper); - } - - - public List getRuleConfigById(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return ruleConfigMapper.selectList(queryWrapper); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java deleted file mode 100644 index 932c185..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.RuleDictMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleDictDao { - - @Resource - private RuleDictMapper ruleDictMapper; - - public List getRuleDictConfig() { - List ruleDictList = ruleDictMapper.selectList(null); - return ruleDictList; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java index 9f9e279..43bc4d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java @@ -10,20 +10,15 @@ import io.netty.channel.socket.nio.NioServerSocketChannel; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import javax.annotation.PreDestroy; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static cn.hutool.core.util.ClassUtil.getClasses; /** * SensorhubServer netty服务端 */ @Slf4j -@Service +@Component public class SensorhubServer { /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java index 2c79ff5..9a28c36 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java @@ -11,13 +11,13 @@ import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioSocketChannel; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClient 客户端 */ @Slf4j -@Service +@Registry public final class SensorhubClient { public static void main(String[] args) throws Exception { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java index 9774be0..477c3f7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java @@ -6,12 +6,12 @@ import io.netty.channel.socket.SocketChannel; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientChannelInitialHandler */ -@Service +@Registry public class SensorhubClientChannelInitialHandler extends ChannelInitializer { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java index 346f4b3..73560e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java @@ -5,13 +5,13 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientHandler */ @Slf4j -@Service +@Registry public class SensorhubClientHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java index 5c1c6f2..d990af5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java @@ -4,12 +4,12 @@ import com.casic.missiles.pojo.Msg; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** * SensorhubServerHandler */ -@Service +@Component public class SensorhubServerHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 67283ae..af3172c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,41 +1,37 @@ package com.casic.missiles.parser; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultProtocolConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.*; +import com.casic.missiles.registry.FieldConfigRegistry; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; -import java.nio.charset.Charset; import java.util.HashMap; import java.util.List; import java.util.Map; -@Service("genericProtocolParser") +/** + * @author + */ +@Component("genericProtocolParser") @Slf4j -@AllArgsConstructor +@RequiredArgsConstructor public class GenericProtocolParser implements ProtocolParser { - private final LeadingCodeMatcher leadingCodeMatcher; private final List frameStructDispenserList; - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorInstanceSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; // 匹配首字母前导码=> 帧结构匹配前导码=> // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 @@ -44,18 +40,19 @@ public Boolean doParseProtocol(ByteBuf byteBuf) { String protocolContent = ByteBufUtil.hexDump(byteBuf); //匹配前导码 - List preCodeConfigs = leadingCodeMatcher.matchLeadingCode(protocolContent); + List preCodeConfigs = LeadingCodeMatcher.matchFrameLeadingCode(protocolContent); //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 if (preCodeConfigs.size() == 0) { - return rematch(byteBuf,protocolContent); + return rematch(byteBuf, protocolContent); } - //暂时先取第一个 + //暂时先取第一个,提升速度,使用享元模式, 减少类的创建销毁与构建 ProtocolConfig protocolConfig = preCodeConfigs.get(0); + AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); ByteBuf wholeDatagramByte = null; //通过匹配帧结构获取完整的数据包 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, preCodeConfigs.get(0))) != null) { + if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, protocolFactory)) != null) { break; } } @@ -68,76 +65,78 @@ * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 */ - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId, wholeDatagramByte); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap, protocolId); - //选取规则对应的流程实例 - DatagramEventConfig datagramEventConfig = processorInstanceSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); + //进行规则字段解析,进行匹配规则 + RuleConfig ruleConfig = getRuleConfig(protocolFactory, wholeDatagramByte); + if (ruleConfig == null) { + return false; + } //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, wholeDatagramByte); + ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte); + //以下进行业务的规则解析,同时选定流程实例 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); + DatagramEventProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain, + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText, protocolId); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain); //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); + datagramEventProvider.storeData(bizDataMap); return true; } - private Boolean rematch(ByteBuf byteBuf,String protocolContent) { + /** + * 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 + */ + private Boolean rematch(ByteBuf byteBuf, String protocolContent) { //重置位判断 byteBuf.resetReaderIndex(); //判断重置是否前移,如果没有前移,则直接判为匹配失败 if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { return false; } else { + //递归执行 return doParseProtocol(byteBuf); } } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; + //获取匹配规则->匹配规则 + private RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + //取出其中参与逻辑provider并判空 + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); + String rulePrepareFields = protocolConfig.getRulePrepareFields(); + //固定字段 + if (StringUtils.isNotEmpty(rulePrepareFields)) { + //获取统一固定字段解析 + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + //获取该协议的字段配置,用于协议规则匹配 + List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); + //获取规则 + RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, + rulePrepareFields, protocolFieldConfigs); + return ruleConfig; + } + return null; } - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + //数据构建,获取固定字段的store和业务字段store + private Map buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + Map bizDataMap = new HashMap<>(); + Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); + Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); + bizDataMap.putAll(ruleStoreObjectMap); + bizDataMap.putAll(protocolStoreObjectMap); return bizDataMap; } - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java index 8a46e32..16ce2e5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java @@ -3,6 +3,7 @@ import io.netty.buffer.ByteBuf; public interface ProtocolParser { + Boolean doParseProtocol(ByteBuf byteBuf); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java new file mode 100644 index 0000000..f7814af --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java @@ -0,0 +1,35 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.ProtocolConfigProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.ProtocolConfig; + +/** + * 存放基本协议的的加载信息 + */ +public class AbstractProtocolConfigFactory { + private final ProtocolConfigProvider protocolConfigProvider; + private final ProtocolFieldConfigProvider protocolFieldConfigProvider; + private final RuleConfigProvider ruleConfigProvider; + + public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { + this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); + this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); + this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); + } + + public ProtocolConfigProvider getProtocolConfigProvider() { + return protocolConfigProvider; + } + + public ProtocolFieldConfigProvider getProtocolFieldConfigProvider() { + return protocolFieldConfigProvider; + } + + public RuleConfigProvider getRuleConfigProvider() { + return ruleConfigProvider; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java new file mode 100644 index 0000000..6e36147 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java @@ -0,0 +1,57 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.CombinedFieldConfigProvider; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.FieldConfigProvider; +import com.casic.missiles.parser.provider.FieldRuleConfigProvider; + +/** + * 存放规则相关的的的加载信息 + */ +public class AbstractRuleConfigFactory { + + /** + * 处理字节 + */ + private final FieldConfigProvider fieldConfigProvider; + /** + * 处理组合字节解析的解码器 + */ + private final CombinedFieldConfigProvider combinedFieldConfigProvider; + /** + * 处理负责字节解析的规则配置 + */ + private final FieldRuleConfigProvider fieldRuleConfigProvider; + /** + * 处理实例流程 + */ + private final DatagramEventProvider datagramEventProvider; + + + public AbstractRuleConfigFactory(Long ruleId) { + this.fieldConfigProvider = new FieldConfigProvider(ruleId); + this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); + this.fieldRuleConfigProvider = new FieldRuleConfigProvider(ruleId); + this.datagramEventProvider = new DatagramEventProvider(ruleId); + } + + public FieldConfigProvider getFieldConfigProvider() { + return fieldConfigProvider; + } + + public CombinedFieldConfigProvider getCombinedFieldConfigProvider() { + return combinedFieldConfigProvider; + } + + public FieldRuleConfigProvider getFieldRuleConfigProvider() { + return fieldRuleConfigProvider; + } + + public DatagramEventProvider getDatagramEventProvider() { + return datagramEventProvider; + } + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java deleted file mode 100644 index 6e1719a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.factory; - - -import com.casic.missiles.pojo.ProtocolConfig; - -import java.util.List; - -/** - * 数据库访问优化(暂时未做) - *

- * 1、初始化协议解析配置,并存放到处存放缓存,对协议基本配置进行管理 - * 2、其中流程中所有的配置都经过此类进行管理,进行调用获取,增强解析速度 - */ -public interface DatagramFactory { - - /** - * 初始化 - */ - List datagramInit(); - - /** - * 根据前导码配置匹配,模糊匹配获取所有的报文项 - */ - List match(); - - /** - * 根据前导码匹配,返回报文项 - */ - List filer(); - - /** - * 保证数据的唯一性选择器 - */ - List selectOne(); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java new file mode 100644 index 0000000..87444a0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java @@ -0,0 +1,18 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +import java.util.List; + +/** + * 直接用,还是边用边创建 + */ +public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { + + + public DefaultProtocolConfigFactory(ProtocolConfig protocolConfig) { + super(protocolConfig); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java new file mode 100644 index 0000000..cce0c7c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java @@ -0,0 +1,12 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; + +public class DefaultRuleFactory extends AbstractRuleConfigFactory { + + public DefaultRuleFactory(Long ruleId) { + super(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java deleted file mode 100644 index 9ee97e0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.casic.missiles.parser.instance; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service -@Slf4j -@AllArgsConstructor -public class GeneralProcessor { - - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; - - /** - * 统一固定字段解析=>进行规则的查询的判断 - * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 - * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 - */ - @Deprecated - public boolean parseWholeDatagram(ByteBuf buffer, ProtocolConfig protocolConfig) { - try { - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap,protocolId); - //选取规则对应的流程= - DatagramEventConfig datagramEventConfig = processorSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); - //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); - //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); - //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); - //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); - //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); - return true; - } catch (Exception ex) { - log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", - ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); - return false; - } - } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; - } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); - } - - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); - return bizDataMap; - } - - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java index 25e7ad8..6a5777e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java @@ -1,23 +1,31 @@ package com.casic.missiles.parser.instance.impl; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.mapper.DatagramEventMapper; import com.casic.missiles.pojo.DatagramEventConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.SpringContextUtil; -@Service -@AllArgsConstructor +import java.util.List; +import java.util.Optional; + +/** + * @author cz + * + */ public class DefaultProcessorInstanceSelector implements ProcessorInstanceSelector { - private final DatagramEventMapper datagramEventMapper; + private static List datagramEventConfigs; + + static { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + datagramEventConfigs = datagramEventRegistry.getDatagramEventList(); + } @Override public DatagramEventConfig getProcessorInstance(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("rule_id", protocolId); - return datagramEventMapper.selectOne(queryWrapper); + Optional optionalSelectInstance = datagramEventConfigs.stream() + .filter(e -> e.getId().equals(protocolId)).limit(1).findFirst(); + return optionalSelectInstance.isPresent() ? optionalSelectInstance.get() : null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a778671..7b56a43 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,16 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import io.netty.buffer.ByteBuf; /** - * 分析匹配情况 - * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 - * 2、匹配不成功,有后续帧,可以进行下次匹配。 - * 3、匹配不成功,无后续帧,可以进行丢弃。 + * 分析匹配情况 + * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 + * 2、匹配不成功,有后续帧,可以进行下次匹配。 + * 3、匹配不成功,无后续帧,可以进行丢弃。 */ -public interface FrameStructMatcher{ +public interface FrameStructMatcher { - ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig); + ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 05320ab..8ebea78 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,23 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.ProtocolConfigMapper; +import com.casic.missiles.parser.provider.ProtocolConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Component; import java.util.List; import java.util.stream.Collectors; -@Component -@AllArgsConstructor public class LeadingCodeMatcher { - private final ProtocolConfigMapper protocolMapper; - //** 1、首字母匹配前导码, // 2、以匹配出的前导码是否在报文中条件进行前导码的匹配二次筛选 - public List matchLeadingCode(String protocolContent){ + public static List matchFrameLeadingCode(String protocolContent){ List initialConfigs = initialMatch(protocolContent); List preCodeConfigs = initialConfigs.stream() .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) @@ -26,13 +19,16 @@ } //初始化匹配前导码内容 - private List initialMatch(String protocolContent) { - String protocolStr = protocolContent.charAt(0) + ""; - QueryWrapper queryWrapper = new QueryWrapper() - .likeRight("pre_fix", protocolStr); - List protocolConfigList = protocolMapper.selectList(queryWrapper); - return protocolConfigList; + private static List initialMatch(String protocolContent) { + String firstFrameChar = protocolContent.charAt(0) + ""; + ProtocolConfigProvider protocolConfigProvider=new ProtocolConfigProvider(firstFrameChar); + return protocolConfigProvider.getMatchList(); } + + + + + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index cf2113d..e915877 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -1,32 +1,35 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(0) -@Service +@Component public class FrameLengthMatcher implements FrameStructMatcher { - @Autowired - private FieldParser fieldParser; - //超过长度 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { String dataGramContent = ByteBufUtil.hexDump(byteBuf); - if (StringUtils.isEmpty(protocolConfig.getUnpackId()) && StringUtils.isEmpty(protocolConfig.getTailStr())) { - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + //当不存在结尾标志和拆包标志,可以直接使用长度进行匹配 + if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { if (dataGramContent.length() >= totalLength) {//等于长度返回true,超出长度,切断 - ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, protocolConfig, totalLength); + ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, totalLength); return wholeDatagramByte; } else { //读的标志位前移舍弃 @@ -38,7 +41,7 @@ return null; } - private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, Integer totalLength) { byteBuf.readBytes(totalLength); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, totalLength - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 2bfc213..d527ad0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; @@ -13,7 +13,7 @@ import lombok.AllArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.nio.charset.Charset; import java.util.Map; @@ -22,32 +22,30 @@ * 后续标志验证 */ @Order(1) -@Service +@Component @AllArgsConstructor -public class FrameMarkMatcher implements FrameStructMatcher { - - private final FieldConfigDao fieldConfigDao; - private final FieldParser fieldParser; - private final FieldResolver fieldResolverManger; +public class FrameMarkMatcher implements FrameStructMatcher, FixedPropertyEnum { //帧后续标志=>结束,进行帧的重组=>有后续,1、帧移位判别 2、继续接收帧 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig UnpackConfig = StringUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getUnpackId()); - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); - Integer upback = 0; + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); ByteBuf mergeWholeFrameByte = null; - if (!ObjectUtil.isEmpty(UnpackConfig)) { - while (hasNextFullFrame(byteBuf, protocolConfig)) { - upback = (Integer) fieldResolverManger.filedParserManger(byteBuf, UnpackConfig, null); + if (!ObjectUtil.isEmpty(unpackFlag)) { + while (hasNextFullFrame(byteBuf, protocolConfig, protocolFieldConfigProvider)) { //是否存在后续位 - if (upback == 1) {//使用esayRule + if (unpackFlag == 1) {//使用esayRule //表示可以截取 - mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolConfig, totalLength); + mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolFieldConfigProvider, protocolConfig); return mergeWholeFrameByte; } else { - byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig)); + byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig, protocolFieldConfigProvider)); } } } @@ -56,7 +54,8 @@ //选取第一个帧,将业务内容和后面部分分开 //计算数据报文-业务内容 - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolFieldConfigProvider protocolFieldConfigProvider, ProtocolConfig protocolConfig) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); //截取完整报文 byteBuf.readBytes(totalLength); ByteBuf byteBufContent = byteBuf.slice(0, byteBuf.readerIndex()); @@ -68,15 +67,15 @@ String tail = ""; System.out.println(ByteBufUtil.hexDump(byteBufContent)); //会存在多个帧拼接在一起的的情况,进行合并处理 - while (hasNextFullFrame(byteBufContent, protocolConfig)) { - Integer currentFrameLength = fieldParser.getTotalLength(protocolConfig, byteBufContent); + while (hasNextFullFrame(byteBufContent, protocolConfig, protocolFieldConfigProvider)) { + Integer currentFrameLength = protocolFieldConfigProvider.getTotalLength(byteBufContent, protocolConfig); byteBufContent.readBytes(currentFrameLength); ByteBuf currentbyteBuf = byteBufContent.slice(0, byteBufContent.readerIndex()); byteBufContent.markReaderIndex();//读的标志位前移 System.out.println(ByteBufUtil.hexDump(byteBufContent)); String hexDump = currentbyteBuf.toString(Charset.forName("ISO-8859-1")); //获取当前固定帧结构的关系map - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, currentbyteBuf); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(currentbyteBuf, protocolConfig); if (StringUtils.isEmpty(mergeFrameStr)) { //首次获取业务数据报文 mergeFrameStr += hexDump.substring(0, currentFrameFixedProperty.get("tailPosition")); @@ -95,22 +94,22 @@ /** * 获取平移到下一帧起始位置 */ - public int getNextFrameOffset(ByteBuf buffer, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, buffer); - return currentFrameFixedProperty.get("totalLength"); + public int getNextFrameOffset(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + return currentFrameFixedProperty.get(TOTAL_LENGTH); } /** * 判断是否出错进行整个帧的 */ - public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, byteBuf); + public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); //保证读取位置不在固定位置,是可变的业务内容 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("fixedPosition")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(FIXED_POSITION)) { return false; } //判断读取是否操作帧长度 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("totalLength")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(TOTAL_LENGTH)) { return false; } return true; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 76a3784..c3a1bab 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -1,50 +1,50 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.parser.instance.GeneralProcessor; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; +import io.netty.buffer.ByteBufUtil;; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(2) -@Service +@Component public class FrameTailMatcher implements FrameStructMatcher { - @Resource - private FieldConfigDao fieldConfigDao; - @Autowired - private GeneralProcessor generalProcessor; - //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig tailFieldConfig = StringUtils.isEmpty(protocolConfig.getTailStr()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getTailStr()); - if (!ObjectUtil.isEmpty(tailFieldConfig)) { - String tailStr = tailFieldConfig.getFieldName(); + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfig protocolFieldConfig = ObjectUtils.isEmpty(protocolConfig.getTailStr()) ? null : + fieldConfigProvider.getFieldConfigById(protocolConfig.getTailStr()); + if (!ObjectUtil.isEmpty(protocolFieldConfig)) { + String tailStr = protocolFieldConfig.getFieldName(); String dataGramContent = ByteBufUtil.hexDump(byteBuf); Boolean tailFlag = ByteBufUtil.hexDump(byteBuf).contains(tailStr); if (!tailFlag) { //使用esayRule return null; } else if (dataGramContent.indexOf(tailStr) < dataGramContent.length() - tailStr.length()) { Integer length = dataGramContent.indexOf(tailStr) + tailStr.length(); - ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, protocolConfig, length); + ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, length); return wholeDatagramByte; //存在粘包 } } return null; } - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer length) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, Integer length) { byteBuf.readBytes(length); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, length - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java new file mode 100644 index 0000000..5f1c177 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java @@ -0,0 +1,73 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.combined.GenericCombinedFieldResolver; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.CombinedFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class CombinedFieldConfigProvider { + + + /** + * 作为临时配置列表缓存使用 + */ + private final List combinedFieldConfigList; + private Map storeObjectMap = new HashMap<>(); + + public CombinedFieldConfigProvider(Long ruleId) { + CombinedFieldConfigRegistry combinedFieldConfigRegistry = SpringContextUtil.getBean(CombinedFieldConfigRegistry.class); + combinedFieldConfigList = combinedFieldConfigRegistry.getCombinedFieldConfigList(ruleId); + } + + public void parseDataField(RuleConfig ruleConfig, String clearZeroPlain,Map fieldConfigsMap ) { + if (showSkip()) { + return; + } + //匹配对应的数据,然后进行相关的字段解析 + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver(); + combinedFieldResolver.parseDataField(combinedFieldConfigList, byteBuf, storeObjectMap,fieldConfigsMap); + } + + + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getCombinedFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return combinedFieldConfigList.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public List getCombinedFieldConfigList() { + return combinedFieldConfigList; + } + + /* 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(combinedFieldConfigList) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java new file mode 100644 index 0000000..f3cfedc --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java @@ -0,0 +1,11 @@ +package com.casic.missiles.parser.provider; + +/** + * @author cz + * @date 2023-6-12 + */ +public class CommandEventProvider{ + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java new file mode 100644 index 0000000..70eec5e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java @@ -0,0 +1,77 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.safe.SafeStrategy; +import com.casic.missiles.parser.sender.DataSubscribeProvider; +import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class DatagramEventProvider { + + private final DatagramEventConfig processorInstance; + + public DatagramEventProvider(Long ruleId) { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + List datagramEventConfigList = + datagramEventRegistry.getDatagramEventList(ruleId); + processorInstance = this.getProcessorInstance(datagramEventConfigList); + } + + public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { + if (showSkip()) { + return null; + } + return datagramEventConfigList.get(0); + } + + // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 + public String getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap) { + String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? + processorInstance.getSafeBean() : + fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); + if (!StringUtils.isEmpty(safeName)) { + //需要加密 + SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); + String plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); + return clearComplementZero(plain); + } + return ByteBufUtil.hexDump(bizDataContent); + } + + //解密清零操作 + private String clearComplementZero(String plain) { + plain = plain.substring(0, plain.lastIndexOf("00")); + return plain; + } + + //数据发送,数据发送者暂未构建 + public void storeData(Map bizDataMap) { + DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); +// dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return ObjectUtils.isNotEmpty(processorInstance) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java new file mode 100644 index 0000000..7e1fe0a --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java @@ -0,0 +1,97 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.FieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class FieldConfigProvider { + + + private final List fieldConfigs; + private Map storeObjectMap = new HashMap<>(); +// private Map singleObjects = new ConcurrentHashMap<>(); + + public FieldConfigProvider(Long ruleId) { + FieldConfigRegistry fieldConfigRegistry = SpringContextUtil.getBean(FieldConfigRegistry.class); + fieldConfigs = fieldConfigRegistry.getFieldConfigList(ruleId); + } + + public List getFieldConfigs() { + return fieldConfigs; + } + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public Map parseDataField(RuleConfig ruleConfig, String clearZeroPlain) { + if (showSkip()) { + return null; + } + List prepareFieldConfig = prepareParseField(ruleConfig); + if (CollectionUtils.isNotEmpty(prepareFieldConfig)) { + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(fieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + return fixDataMap; + } + } + return null; + } + + /** + * 得到需要处理的业务内容 + * + * @return + */ + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return fieldConfigs.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public Map getFieldConfigsMap() { + return fieldConfigs.stream().collect( + Collectors.toMap(FieldConfig::getId, e -> e) + ); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(fieldConfigs) ? false : true; + } + + +} + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java new file mode 100644 index 0000000..817bfaf --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java @@ -0,0 +1,19 @@ +package com.casic.missiles.parser.provider; + +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.registry.FieldRuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; + +public class FieldRuleConfigProvider { + + private final List fieldRuleConfigList; + + public FieldRuleConfigProvider(Long ruleId) { + FieldRuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(FieldRuleConfigRegistry.class); + fieldRuleConfigList = ruleConfigRegistry.getFieldRuleConfigList(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java new file mode 100644 index 0000000..99a1b06 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java @@ -0,0 +1,53 @@ +package com.casic.missiles.parser.provider; + + +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.registry.ProtocolConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolConfigProvider { + + private final List protocolConfigList; + + public ProtocolConfigProvider(String firstChar) { + ProtocolConfigRegistry registry = SpringContextUtil.getBean(ProtocolConfigRegistry.class); + protocolConfigList = registry.getProtocolConfigList(firstChar); + } + + public List getMatchList() { + return protocolConfigList; + } + + /** + * 设置当前协议 + * + * @param protocolConfig + */ + public ProtocolConfigProvider(ProtocolConfig protocolConfig) { + List protocolConfigs = new ArrayList<>(); + protocolConfigs.add(protocolConfig); + protocolConfigList = protocolConfigs; + } + + /** + * 获取当前协议 + * + * @return + */ + public ProtocolConfig getCurrentProtocolConfig() { + if (this.protocolConfigList == null) { + return null; + } else { + return protocolConfigList.get(0); + } + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java new file mode 100644 index 0000000..043927d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java @@ -0,0 +1,213 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.registry.ProtocolFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolFieldConfigProvider { + + private static final String FIXED_FIELD_DS = "fixedFieldDs"; + private static final String CONTENT_FIELD_DS = "contentFieldDs"; + private static final String PROTOCOL_LENGTH = "protocolLength"; + private static final String PROTOCOL_FIELD_ID = "protocolFieldId"; + private static final String PROTOCOL_POSITION = "protocolPosition"; + + private final List protocolFieldConfigs; + private Map singleObjects = new ConcurrentHashMap<>(); + private Map storeObjectMap = new HashMap<>(); + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public ProtocolFieldConfigProvider(Long protocolId) { + ProtocolFieldConfigRegistry protocolFieldConfigRegistry = SpringContextUtil.getBean(ProtocolFieldConfigRegistry.class); + protocolFieldConfigs = protocolFieldConfigRegistry.getProtocolFieldConfigList(protocolId); + } + + public List getProtocolFieldConfigs() { + return protocolFieldConfigs; + } + + public ProtocolFieldConfig getFieldConfigById(Long fieldId) { + Optional optionalConfig = protocolFieldConfigs.stream().filter( + e -> e.getId().equals(fieldId) + ).findFirst(); + return optionalConfig.isPresent() ? optionalConfig.get() : null; + } + + public Integer getProtocolFieldValue(Long protocolFieldId, ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_FIELD_ID + protocolFieldId + ByteBufUtil.hexDump(byteBuf); + //获取缓存 + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + //加载固定长度数据集合 + Map fixDataMap = this.getProtocolDataMap(byteBuf); + ProtocolFieldConfig protocolFieldConfig = selectFieldConfig(protocolFieldId); + Integer protocolFieldValue = 0; + //获取约定字段的总长度 + if (fixDataMap.containsKey(protocolFieldConfig.getFieldName())) { + Object appointUnpackObject = fixDataMap.get(protocolFieldConfig.getFieldName()); + if (ObjectUtils.isNotEmpty(appointUnpackObject)) { + protocolFieldValue = (Integer) appointUnpackObject; + } + } + if (protocolFieldValue != null) { + //加入缓存 + if (ObjectUtils.isNotEmpty(protocolFieldValue)) { + this.singleObjects.put(catchKey, protocolFieldValue); + return protocolFieldValue; + } + } + return null; + } + + /** + * 获取帧固定位置信息 + * + * @param byteBuf + * @param protocolConfig + * @return + */ + public Map getFixedProperty(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_POSITION + protocolConfig.getId(); + if (this.singleObjects.containsKey(catchKey)) { + return (Map) singleObjects.get(catchKey); + } + Map fixedPropertyMap = new HashMap<>(); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + fixedPropertyMap = fieldParser.doGetFixedProperty(protocolFieldConfigs, this.getTotalLength(byteBuf,protocolConfig)); + if (CollectionUtils.isNotEmpty(fixedPropertyMap)) { + this.singleObjects.put(catchKey, fixedPropertyMap); + return fixedPropertyMap; + } + return fixedPropertyMap; + } + + /** + * 获取帧结构应有的总长度 + */ + public Integer getTotalLength(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_LENGTH + ByteBufUtil.hexDump(byteBuf); + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + Integer appointFrameLength = getProtocolFieldValue(protocolConfig.getTotalLengthId(), byteBuf); + if (appointFrameLength != null) { + //获取过滤的字段集合总长度 + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Integer totalFilterLength = fieldParser.getTotalFilterLength(protocolConfig, byteBuf, getFixFieldConfigMap()); + //计算总长度 + Integer totalLength = appointFrameLength + totalFilterLength; + //加入缓存 + if (ObjectUtils.isNotEmpty(totalLength)) { + this.singleObjects.put(catchKey, totalLength); + return totalLength; + } + } + return null; + } + + /** + * 获取协议有关字段解析内容 + * storeObjectMap存储代转存的数据 + * + * @return + */ + public Map getProtocolDataMap(ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(FIXED_FIELD_DS)) { + return (Map) singleObjects.get(FIXED_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(protocolFieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + this.singleObjects.put(FIXED_FIELD_DS, fixDataMap); + return fixDataMap; + } + return null; + } + + /** + * 获取业务报文内容的content字节 + * + * @param wholeDatagramByte + * @return + */ + public ByteBuf getDataContentBuf(ByteBuf wholeDatagramByte) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(CONTENT_FIELD_DS)) { + return (ByteBuf) singleObjects.get(CONTENT_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + ByteBuf bizDataByteBuf = fieldParser.getDataContentBuf(protocolFieldConfigs, wholeDatagramByte); + if (bizDataByteBuf != null) { + this.singleObjects.put(CONTENT_FIELD_DS, bizDataByteBuf); + return bizDataByteBuf; + } + return null; + } + + + private ProtocolFieldConfig selectFieldConfig(Long id) { + Optional optionalProtocolFieldConfig = this.protocolFieldConfigs.stream().filter( + e -> e.getId().equals(id) + ).findFirst(); + return optionalProtocolFieldConfig.isPresent() ? optionalProtocolFieldConfig.get() : null; + } + + + private Map getFixFieldConfigMap() { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, e -> e) + ); + return fixDataFieldMap; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(protocolFieldConfigs) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java new file mode 100644 index 0000000..dafba1c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java @@ -0,0 +1,56 @@ +package com.casic.missiles.parser.provider; + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.rule.GenericRuleResolver; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.RuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleConfigProvider { + + private final List ruleConfigs; + + public List getRuleConfigs() { + return ruleConfigs; + } + + public RuleConfigProvider(Long protocolId) { + RuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(RuleConfigRegistry.class); + ruleConfigs = ruleConfigRegistry.getRuleConfigById(protocolId); + } + + /** + * 获取规则匹配结果 + * + * @param parseFixedDataMap + * @param protocolFieldConfigs + * @return + */ + public RuleConfig doGetRule(Map parseFixedDataMap, + String ids, + List protocolFieldConfigs) { + if (showSkip()) { + return null; + } + RuleConfig ruleConfig = GenericRuleResolver.machRule(parseFixedDataMap, ids, protocolFieldConfigs, ruleConfigs); + return ruleConfig; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(ruleConfigs) ? false : true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java index 3c05891..856b399 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java @@ -1,18 +1,11 @@ package com.casic.missiles.parser.resolver; -import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.springframework.web.bind.annotation.RequestBody; -import javax.annotation.Resource; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -20,19 +13,17 @@ @Slf4j public class ByteMergeProvider { - @Resource - private FieldRuleEngineMapper fieldRuleEngineMapper; - //拿到所有的值合并到一个值 - public String resolveByteMerge(List valueList, String ruletypeId, String vaildRange) { + public static String resolveByteMerge(List valueList, String ruleTypeId, String vaildRange) { String values = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Map vaildMap = getValidRangeMap(vaildRange); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(ruletypeId); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } + //暂时不处理 +// fieldRuleEngine = fieldRuleConfigMapper.selectById(ruleTypeId); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } Map env2 = new HashMap(); for (int i = 0; i < valueList.size(); i++) { if (vaildMap.containsKey(i)) { @@ -47,7 +38,7 @@ } } - private Map getValidRangeMap(String vaildRange) { + private static Map getValidRangeMap(String vaildRange) { String[] range = vaildRange.split(","); Map vaildMap = new HashMap(); for (int i = 0; i < range.length; i++) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 8d821cd..85d6bbf 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -1,9 +1,12 @@ package com.casic.missiles.parser.resolver; +import com.casic.missiles.pojo.AbstractFieldConfig; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; import io.netty.buffer.ByteBuf; +import java.util.List; import java.util.Map; /** @@ -11,18 +14,14 @@ */ public interface FieldParser { -// Map fieldProcess(String protocolContent,); - Map dataParser(RuleConfig ruleConfig, String lightText,String protocolId); + Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength); - Map fixDataParser(String protocolId, ByteBuf buffer); + Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap); - Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf); + ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer); - ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer); - - ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer); - - Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer); + Integer getTotalFilterLength(ProtocolConfig protocolConfig, ByteBuf byteBuf, Map protocolFieldConfigMap); } + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java new file mode 100644 index 0000000..9e0c00e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java @@ -0,0 +1,52 @@ +package com.casic.missiles.parser.resolver; + +import com.casic.missiles.pojo.AbstractFieldConfig; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.util.List; + +public class FieldParserSupport { + + //分别计算bit和byte长度=> 合并长度 + protected Integer calculateLength(List fieldConfigList) { + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + Integer fixedLength = bytefixedLength + bitfixedLength / 8; + return fixedLength; + } + + //找到最大值=> 根据最大值计算业务数据下标 + protected Integer calculatePosition(List fieldConfigList) { + String rex = "[0-9]+"; + Integer max = -1; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) + && Integer.valueOf(fieldConfig.getOriginPositionByte()) > max) { + max = Integer.valueOf(fieldConfig.getOriginPositionByte()); + } + } + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) && fieldConfig.getOriginPositionByte().equals(max)) { + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + } + } + Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; + return maxFixedPosition; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java deleted file mode 100644 index dd3a6cd..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java +++ /dev/null @@ -1,170 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.ByteResolverParam; -import io.netty.buffer.ByteBuf; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -/** - * 字段解析管理总类 - */ -@Service -@Slf4j -@AllArgsConstructor -public class FieldResolver extends ByteMergeProvider { - - //1、字段截取 => 2、简单的字节解析和复杂的字节解析 - public Object filedParserManger(ByteBuf byteBuf, FieldConfig fieldConfig, Integer maxFixedPosition) { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - //最大固定位置不为空, - if (!ObjectUtil.isEmpty(maxFixedPosition)) { - orignPosition -= maxFixedPosition; - } - Object fieldValue = 0; - //待优化 - if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { - fieldValue = bitToResolver(byteBuf, fieldConfig); - } else { - ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); - fieldValue = parsingFields(fieldBytes, fieldConfig.getRuleJson()); - } - return fieldValue; - } - - //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, - //目前默认配置的规则设置暂不支持配置化,由实现完成 - private Object parsingFields(ByteBuf byteBuf, String ruleJson) { - Object fieldsResolveValue = null; - List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); - if (ObjectUtil.isEmpty(ruleMapList)) { - fieldsResolveValue = defaultResolveBuilder(byteBuf); - } else { - fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); - } - return fieldsResolveValue; - } - - private Object defaultResolveBuilder(ByteBuf byteBuf) { - Integer defaultResolveValue = 0; - for (int i = 0; i < byteBuf.writerIndex(); i++) { - defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; - } - return defaultResolveValue; - } - - //字段解析构建器(针对字节单位的) - //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 - // 字节归并结束或者规则结束=>继续根据规则进行判断 - private Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { - Object customizeResolveValue = null; - try { - List bytStrList = new ArrayList<>(); - //存放到数组里面 - for (int i = 0; i < byteBuf.writerIndex(); i++) { - bytStrList.add(byteBuf.readByte()); - } - int i = 0; - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - customizeResolveValue = this.resolveByteMerge(bytStrList, ruletypeId,vaildRange); - break; - } else { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - List tempBytStr = new ArrayList<>(); - for (int k = 0; i < bytStrList.size(); i++) { - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(k) - .value(bytStrList.get(k)) - .ruletypeId(ruletypeId).build(); - tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); - } - bytStrList = tempBytStr; - } - i++; - } - //字节归并到一起=>继续根据规则进行判断 - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(customizeResolveValue) - .ruletypeId(ruletypeId).build(); - customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(customizeResolveValue)); - return customizeResolveValue; - } catch (RuntimeException ex) { - log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); - return null; - } - } - - /** - * 1、单个字节情况表示字段 - * 2、多字节情况表示字段(暂未处理) - */ - private Object bitToResolver(ByteBuf byteBuf, FieldConfig fieldConfig) { - Object fieldValue = new Object(); - try { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - byte fields = 0x00; - if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); - } else { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); - } - - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { - if (!StringUtils.isEmpty(fieldConfig.getExactOrignPosition())) { - fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getExactOrignPosition())).byteValue() - >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); - } else { - fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); - } - } else { - fieldValue = Integer.valueOf(fields & 0xff); - } - if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { - return fieldValue; - } - List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); - int i = 0; - //字节归并到一起=>继续根据规则进行判断 - while (i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(fieldValue) - .ruletypeId(ruletypeId).build(); - fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(fieldValue)); - return fieldValue; - } catch (RuntimeException ex) { - log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); - return null; - } - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java new file mode 100644 index 0000000..1d2aeab --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java @@ -0,0 +1,36 @@ +package com.casic.missiles.parser.resolver.bytes; + +import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.mapper.FieldRuleConfigMapper; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.pojo.ByteResolverParam; +import com.googlecode.aviator.AviatorEvaluator; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; +//转换规则 +@Component("convert") +@AllArgsConstructor +@Slf4j +public class ByteRuleResolver implements ByteResolver { + + private final FieldRuleConfigMapper fieldRuleConfigMapper; + + @Override + public Object resolveOperationRule(ByteResolverParam byteResolverParam){ + FieldRuleConfig fieldRuleEngine=fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); + if(ObjectUtil.isEmpty(fieldRuleEngine)){ + return byteResolverParam.getValue(); + } + String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); + Map env2 = new HashMap(); + env2.put("value", (byte) byteResolverParam.getValue()); + String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); + return values; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java index 103821c..786b71c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java @@ -2,34 +2,34 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("logicalShift") +@Component("logicalShift") @AllArgsConstructor @Slf4j public class LogicalShiftResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //字节位移 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { Integer index = byteResolverParam.getIndex(); - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return byteResolverParam.getValue(); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java index 476747d..01149bd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("operation") +@Component("operation") @AllArgsConstructor @Slf4j public class OperationResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //混合运算,有常量或者乘除的缩放 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java index 0b82cf4..79abcce 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.casic.missiles.pojo.ByteResolverParam; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; //精度计算 -@Service("precision") +@Component("precision") @AllArgsConstructor @Slf4j public class PrecisionResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java deleted file mode 100644 index 5c3f332..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; -//转换规则 -@Service("convert") -@AllArgsConstructor -@Slf4j -public class RuleResolver implements ByteResolver { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam){ - RuleEvaluator fieldRuleEngine=fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); - if(ObjectUtil.isEmpty(fieldRuleEngine)){ - return byteResolverParam.getValue(); - } - String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); - Map env2 = new HashMap(); - env2.put("value", (byte) byteResolverParam.getValue()); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java new file mode 100644 index 0000000..d3bbd91 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java @@ -0,0 +1,15 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; + +import java.util.List; +import java.util.Map; +// 前导码匹配->长度字段 +public interface AbstractCombinedFieldProcessor { + + Map invoke(Map map, ByteBuf byteBuf, List combinedFieldConfigList, + Map fieldConfigsMap, Map storeObjectMap); + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java new file mode 100644 index 0000000..03c8480 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java @@ -0,0 +1,59 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-13 + */ +//依次递增进行数据的解析, +public class GenericCombinedFieldResolver { + + + //通过查询,字段长度长度随机 + public void parseDataField(List combinedFieldConfigList, ByteBuf byteBuf, + Map storeObjectMap, Map fieldConfigsMap) { + Integer frameLength = Integer.valueOf(ByteBufUtil.hexDump(byteBuf)); + //添加前置处理器 + com.casic.missiles.util.ClassUtil classUtil = new com.casic.missiles.util.ClassUtil(); + List abstractCombinedProcessors = classUtil.getSubClassList(AbstractCombinedFieldProcessor.class); + + Map fieldFixedMap = combinedFieldLeadCodeMap(combinedFieldConfigList); + //frameLength + Map combinedProcessorFields = null; + while (byteBuf.readableBytes() < frameLength) { + //一直处理 + for (AbstractCombinedFieldProcessor abstractCombinedProcessor : abstractCombinedProcessors) { + combinedProcessorFields = abstractCombinedProcessor.invoke(combinedProcessorFields, byteBuf, + combinedFieldConfigList, + fieldConfigsMap, storeObjectMap); + if (combinedProcessorFields == null || byteBuf.readableBytes() < frameLength) { + return; + } + } + + } + } + + /** + * 取出前导码匹配集合 + */ + private Map combinedFieldLeadCodeMap(List combinedFieldConfigList) { + Map fieldFixedMap = combinedFieldConfigList + .stream() + .collect(Collectors.toMap(CombinedFieldConfig::getPrefixCode, e -> e)); + return fieldFixedMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java new file mode 100644 index 0000000..643a934 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java @@ -0,0 +1,100 @@ +package com.casic.missiles.parser.resolver.fields; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.FieldParserSupport; +import com.casic.missiles.pojo.*; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 保存使用时最基本的信息,并且使用原型模式 + */ +@Slf4j +public class DefaultProtocolFieldParser extends FieldParserSupport implements FieldParser, FixedPropertyEnum { + + //通过传入的配置和报文进行字段解析 + @Override + public Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap) { + Map dataMap = new HashMap<>(); + for (AbstractFieldConfig protocolFieldConfig : protocolFieldConfigs) { + if (!ObjectUtils.isEmpty(protocolFieldConfig.getOriginPositionByte())) { + Object fieldValue = FieldResolver.parseField(buffer, protocolFieldConfig, null); + if (protocolFieldConfig.getIsStorage() == 1) { + storeObjectMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + dataMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + } + return dataMap; + } + + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength) { + Map fixedPropertyMap = new HashMap<>(); + Integer fixedLength = calculateLength(protocolFieldConfigs); + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + fixedPropertyMap.put(FIXED_POSITION, maxFixedPosition); + fixedPropertyMap.put(TOTAL_LENGTH, totalLength); + fixedPropertyMap.put(TAIL_POSITION, totalLength - fixedLength + maxFixedPosition); + return fixedPropertyMap; + } + + //** 获取业务内容的byteBuf + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer) { + //计算固定长度 + Integer fixedLength = calculateLength(protocolFieldConfigs); + //总长度获取 + String lightText = buffer.toString(Charset.forName("ISO-8859-1")); + Integer totalLength = lightText.length(); + //计算固定长度最大长度 + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + //计算数据报文内容 + ByteBuf bizDataFields = buffer.slice(maxFixedPosition - 1, (totalLength - fixedLength)); + return bizDataFields; + } + + /** + * 获取过滤字段的长度 + */ + @Override + public Integer getTotalFilterLength(ProtocolConfig protocolConfig, + ByteBuf byteBuf, + Map protocolFieldConfigMap) { + if (ByteBufUtil.hexDump(byteBuf).equals("")) { + return 0; + } + int totalFilterLength = 0; + String filterFields = protocolConfig.getTotalLengthFilterFields(); + try { + if (!StringUtils.isEmpty(filterFields)) { + String[] filterFieldList = filterFields.split(","); + for (String filterFieldId : filterFieldList) { + if (StringUtils.isNotEmpty(filterFieldId)) { + ProtocolFieldConfig fieldConfig = protocolFieldConfigMap.get(Long.valueOf(filterFieldId)); + //这里都是按字节计算,没有对位进行区分,可能会出现错误 + // 如果对位有需求,需要进一步跟进 + totalFilterLength += fieldConfig.getOffsetLength(); + } + } + } + return totalFilterLength; + } catch (Exception ex) { + log.error("报文确认分发阶段,获取报文总长度过滤长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); + } + return totalFilterLength; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java new file mode 100644 index 0000000..d51e887 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java @@ -0,0 +1,169 @@ +package com.casic.missiles.parser.resolver.fields; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.parser.resolver.ByteMergeProvider; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.AbstractFieldConfig; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.pojo.ByteResolverParam; +import io.netty.buffer.ByteBuf; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * 字段解析管理总类 + */ +@Slf4j +public class FieldResolver extends ByteMergeProvider { + + //1、字段截取 => 2、简单的字节解析和复杂的字节解析 + public static Object parseField(ByteBuf byteBuf,AbstractFieldConfig fieldConfig, Integer maxFixedPosition) { + Integer orignPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + //最大固定位置不为空, + if (!ObjectUtil.isEmpty(maxFixedPosition)) { + orignPosition -= maxFixedPosition; + } + Object fieldValue = 0; + //待优化 + if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { + fieldValue = doParseBitField(byteBuf, fieldConfig); + } else { + ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); + fieldValue = doParseByteField(fieldBytes, fieldConfig.getRuleJson()); + } + return fieldValue; + } + + //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, + //目前默认配置的规则设置暂不支持配置化,由实现完成 + private static Object doParseByteField(ByteBuf byteBuf, String ruleJson) { + Object fieldsResolveValue = null; + List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); + if (ObjectUtil.isEmpty(ruleMapList)) { + fieldsResolveValue = defaultResolveBuilder(byteBuf); + } else { + fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); + } + return fieldsResolveValue; + } + + private static Object defaultResolveBuilder(ByteBuf byteBuf) { + Integer defaultResolveValue = 0; + for (int i = 0; i < byteBuf.writerIndex(); i++) { + defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; + } + return defaultResolveValue; + } + + //字段解析构建器(针对字节单位的) + //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 + // 字节归并结束或者规则结束=>继续根据规则进行判断 + private static Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { + Object customizeResolveValue = null; + try { + List bytStrList = new ArrayList<>(); + //存放到数组里面 + for (int i = 0; i < byteBuf.writerIndex(); i++) { + bytStrList.add(byteBuf.readByte()); + } + int i = 0; + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { + if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + customizeResolveValue = resolveByteMerge(bytStrList, ruletypeId, vaildRange); + break; + } else { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + List tempBytStr = new ArrayList<>(); + for (int k = 0; i < bytStrList.size(); i++) { + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(k) + .value(bytStrList.get(k)) + .ruletypeId(ruletypeId).build(); + tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); + } + bytStrList = tempBytStr; + } + i++; + } + //字节归并到一起=>继续根据规则进行判断 + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(null) + .value(customizeResolveValue) + .ruletypeId(ruletypeId).build(); + customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); + i++; + } + System.out.println(JSON.toJSON(customizeResolveValue)); + return customizeResolveValue; + } catch (RuntimeException ex) { + log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); + return null; + } + } + + /** + * 1、单个字节情况表示字段 + * 2、多字节情况表示字段(暂未处理) + */ + private static Object doParseBitField(ByteBuf byteBuf,AbstractFieldConfig fieldConfig) { + Object fieldValue = new Object(); + try { + Integer orignPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + byte fields = 0x00; + if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { + fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); + } else { + fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); + } + + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { + if (!StringUtils.isEmpty(fieldConfig.getOriginPositionBit())) { + fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getOriginPositionBit())).byteValue() + >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); + } else { + fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); + } + } else { + fieldValue = Integer.valueOf(fields & 0xff); + } + if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { + return fieldValue; + } + List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); + int i = 0; + //字节归并到一起=>继续根据规则进行判断 + while (i < ruleMapList.size()) { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(null) + .value(fieldValue) + .ruletypeId(ruletypeId).build(); + fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); + i++; + } + System.out.println(JSON.toJSON(fieldValue)); + return fieldValue; + } catch (RuntimeException ex) { + log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); + return null; + } + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java deleted file mode 100644 index 35ae3d0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java +++ /dev/null @@ -1,183 +0,0 @@ -package com.casic.missiles.parser.resolver.fields; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufAllocator; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; -import org.springframework.util.ObjectUtils; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service("standard") -@AllArgsConstructor -@Slf4j -public class StandardFieldParser implements FieldParser { - - private final FieldConfigDao fieldConfigDao; - private final FieldResolver fieldResolver; - - //数据解析 - @Override - public Map dataParser(RuleConfig ruleConfig, String lightText, String protocolId) { - String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); - ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); - bufferContent.writeBytes(lightText.getBytes(Charset.forName("ISO-8859-1"))); - Map dataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - for (String dataFieldId : dataFieldIds) { - FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(dataFieldId); - if (!ObjectUtils.isEmpty(fieldConfig)) { - dataMap.put(fieldConfig.getFieldName(), String.valueOf(fieldResolver.filedParserManger(bufferContent, fieldConfig, maxFixedPosition))); - } - } - return dataMap; - } - - //数据解析 - @Override - public Map fixDataParser(String protocolId, ByteBuf buffer) { - List dataFieldIdList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Map dataMap = new HashMap<>(); - for (FieldConfig dataField : dataFieldIdList) { - if (!ObjectUtils.isEmpty(dataField.getOrignPosition())) { - Object fieldValue = (Integer) fieldResolver.filedParserManger(buffer, dataField, null); - dataMap.put(dataField.getFieldName(), fieldValue); - } - } - return dataMap; - } - - @Override - public Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf) { - if (ByteBufUtil.hexDump(byteBuf).equals("")) { - return 0; - } - String filterFields = protocolConfig.getTotalLengthFilterField(); - Integer totalLength = 0; - try { - FieldConfig totalFieldConfig = fieldConfigDao.getFieldConfigById(protocolConfig.getTotalLengthId()); - int totalFilterLength = 0; - if (!StringUtils.isEmpty(filterFields)) { - String[] filterFieldList = filterFields.split(","); - for (String filterField : filterFieldList) { - FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(filterField); - //这里都是按字节计算,没有对位进行区分,可能会出现错误 - - // 如果对位有需求,需要进一步跟进 - totalFilterLength += fieldConfig.getOffsetLength(); - } - } - totalLength = (Integer) fieldResolver.filedParserManger(byteBuf, totalFieldConfig, null) + totalFilterLength; - } catch (Exception ex) { - log.error("报文确认分发阶段,获取报文总长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); - } - return totalLength; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer) { - //业务内容 - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - String protocolId = String.valueOf(protocolConfig.getId()); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - //计算固定长度 - Integer fixedLength = calculateLength(fieldConfigList); -// Integer totalLength = this.getTotalLength(protocolConfig, buffer); - //总长度获取 - Integer totalLength = lightText.length(); - //计算固定长度最大长度 - Integer maxFixedPosition = calculatePosition(fieldConfigList); -// buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - //计算数据报文内容 - ByteBuf bizDataFields = buffer.slice(maxFixedPosition-1, (totalLength - fixedLength)); - return bizDataFields; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer) { - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - String protocolId = String.valueOf(protocolConfig.getId()); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer fixedLength = calculateLength(fieldConfigList); -// Integer totalLength = this.getTotalLength(protocolConfig, buffer); - Integer totalLength = lightText.length(); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - ByteBuf fixDataFields = buffer.slice(0, maxFixedPosition); - return fixDataFields; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer) { - String protocolId = String.valueOf(protocolConfig.getId()); - Map fixedPropertyMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer fixedLength = calculateLength(fieldConfigList); - Integer totalLength = this.getTotalLength(protocolConfig, buffer); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - fixedPropertyMap.put("fixedPosition", maxFixedPosition); - fixedPropertyMap.put("totalLength", totalLength); - fixedPropertyMap.put("tailPosition", totalLength - fixedLength + maxFixedPosition); - return fixedPropertyMap; - } - - //分别计算bit和byte长度=> 合并长度 - private Integer calculateLength(List fieldConfigList) { - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (FieldConfig fieldConfig : fieldConfigList) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - Integer fixedLength = bytefixedLength + bitfixedLength / 8; - return fixedLength; - } - - //找到最大值=> 根据最大值计算业务数据下标 - private Integer calculatePosition(List fieldConfigList) { - String rex = "[0-9]+"; - Integer max = -1; - for (FieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOrignPosition()) - && Integer.valueOf(fieldConfig.getOrignPosition()) > max) { - max = Integer.valueOf(fieldConfig.getOrignPosition()); - } - } - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (FieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOrignPosition()) && fieldConfig.getOrignPosition().equals(max)) { - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - } - } - Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; - return maxFixedPosition; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java new file mode 100644 index 0000000..d4ec6c7 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java @@ -0,0 +1,76 @@ +package com.casic.missiles.parser.rule; + +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import org.apache.commons.lang3.StringUtils; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class GenericRuleResolver { + + //根据前置字段的值,找到指定的规则 + //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 + //=>循环判断=>通过规则得到业务字段 + public static RuleConfig machRule(Map fixDataMap, + String ids, + List protocolFieldConfigs, + List ruleConfigs) { + List preRuleConfigList = getPreRuleList(ids, protocolFieldConfigs); + //获取前置规则字段 + final Map metaDataMap = getPreRuleFields(preRuleConfigList, fixDataMap); + //准备固定的字段集合 + Map fixDataFieldMap = getFixDataFieldMap(protocolFieldConfigs); + return RuleResolverCore.doMachRule(ruleConfigs, metaDataMap, fixDataMap, fixDataFieldMap); + } + + private static Map getFixDataFieldMap(List protocolFieldConfigs) { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, ProtocolFieldConfig::getFieldName) + ); + return fixDataFieldMap; + } + + + /** + * 查询前置规则的字段配置 + * + * @param ids + * @return + */ + private static List getPreRuleList(String ids, List protocolFieldConfigs) { + String[] idList = ids.split(","); + Map prepareMaps = new HashMap<>(); + for (String id : idList) { + if (StringUtils.isNotEmpty(id)) { + prepareMaps.put(Long.valueOf(id), ""); + } + } + List preRuleConfigList = protocolFieldConfigs + .stream() + .filter(e -> prepareMaps.containsKey(e.getId())) + .collect(Collectors.toList()); + return preRuleConfigList; + } + + /** + * 获取前置规则解析字段 + */ + private static Map getPreRuleFields(List preRuleFieldConfigList, Map fixDataMap) { + Map ruleFieldMap = new HashMap<>(); + preRuleFieldConfigList.stream() + .forEach( + preRuleFieldConfig -> { + String fieldName = preRuleFieldConfig.getFieldName(); + if (fixDataMap.containsKey(fieldName)) { + ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); + } + } + ); + return ruleFieldMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java new file mode 100644 index 0000000..baae7e8 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -0,0 +1,68 @@ +package com.casic.missiles.parser.rule; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.casic.missiles.pojo.RuleConfig; + +import java.util.*; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleResolverCore { + + + public static RuleConfig doMachRule(List ruleConfigList, Map metaDataMap, + Map fixDataMap, + Map fixDataFieldMap) { + Optional ruleConfigOptional = ruleConfigList.stream() + .filter(ruleConfig -> machRuleConfig( + JSON.parseObject(ruleConfig.getMatchRuleJson(), Map.class), metaDataMap)) + .findFirst(); + if (ObjectUtil.isEmpty(ruleConfigOptional)) { + return null; + } + String[] ruleFields = ruleConfigOptional.get().getDataFieldIds().split(","); + Map ruleMetaDataMap = getRuleFields(ruleFields, fixDataMap, fixDataFieldMap); + //递归选定解析规则,进行规则解析 + if (!ruleConfigOptional.get().getIsFinishMatch().equals("1")) { + //递归选定规则 + doMachRule(ruleConfigList, ruleMetaDataMap, fixDataMap, fixDataFieldMap); + } + return ruleConfigOptional.get(); + } + + + private static Map getRuleFields(String[] preRuleConfigList, Map fixedDataMap, + Map fixedFieldMap) { + Map ruleFieldMap = new HashMap<>(); + for (String preRuleConfigId : preRuleConfigList) { + String fieldName = fixedFieldMap.get(preRuleConfigId); + if (fixedDataMap.containsKey(fieldName)) { + ruleFieldMap.put(fieldName, String.valueOf(fixedDataMap.get(fieldName))); + } + } + return ruleFieldMap; + } + + + //匹配规则配置 + private static Boolean machRuleConfig(Map ruleMap, Map metaDataMap) { + if (ruleMap == null || metaDataMap == null) { + return null; + } + //所有的字段在规则里面必须有有配置 + for (String key : metaDataMap.keySet()) { + if (ruleMap.containsKey(key)) { + if (!ruleMap.get(key).equals(metaDataMap.get(key))) { + return false; + } + } else { + return false; + } + } + return true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java deleted file mode 100644 index 664088d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java +++ /dev/null @@ -1,92 +0,0 @@ -package com.casic.missiles.parser.rule; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.mapper.dao.PreRuleConfigDao; -import com.casic.missiles.mapper.dao.RuleConfigDao; -import lombok.AllArgsConstructor; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.*; -import java.util.stream.Collectors; - -@Service -@AllArgsConstructor -public class RulerProvider { - - private final FieldConfigDao fieldConfigDao; - private final PreRuleConfigDao preRuleConfigDao; - private final RuleConfigDao ruleConfigDao; - - //根据前置字段的值,找到指定的规则 - //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 - //=>循环判断=>通过规则得到业务字段 - public RuleConfig ruleConfig(Map fixDataMap, String protocolId) { - //批量获取规则 - List preRuleConfigList = preRuleConfigDao.getPreRuleList(protocolId); - //获取固定字段 - Map fixFieldMap = getAllFieldMap(protocolId); - //获取前置规则字段 - final String preRuleFields = getPreRuleFields(preRuleConfigList, fixDataMap, fixFieldMap); - List ruleConfigList = ruleConfigDao.getRuleConfigById(protocolId); - Optional ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig ->preRuleFields.equals( ruleConfig.getParseRuleJson())).findFirst(); - //递归选定解析规则,进行规则解析 - while (!ObjectUtil.isEmpty(ruleConfigOptional) && !ruleConfigOptional.get().getIsBizField().equals("1")) { - String ruleFields = getRuleFields(ruleConfigOptional.get().getDataFieldIds().split(","), fixDataMap, fixFieldMap); - ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig -> ruleConfig.getParseRuleJson().equals(ruleFields)).findFirst(); - } - return ruleConfigOptional.get(); - } - - /** - * 获取前置规则解析字段 - */ - private String getPreRuleFields(List preRuleConfigList, Map fixDataMap, Map fixFieldMap) { - Map ruleFieldMap= new HashMap<>(); - preRuleConfigList.stream() - .forEach( - preRuleConfig -> { - String fieldName = fixFieldMap.get(Long.valueOf(preRuleConfig.getRuleFieldId())); - if (fixDataMap.containsKey(fieldName)) { - ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); - } - } - ); - return JSONObject.toJSONString(ruleFieldMap); - } - - private Map getAllFieldMap(String protocolId) { - List fieldList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Map fixFieldMap = fieldList.stream().collect( - Collectors.toMap(FieldConfig::getId, FieldConfig::getFieldName) - ); - return fixFieldMap; - } - - private String getRuleFields(String[] preRuleConfigList, Map fixDataMap, Map fixFieldMap) { - Map ruleFieldMap= new HashMap<>(); - for (String preRuleConfigId : preRuleConfigList) { - String fieldName = fixFieldMap.get(preRuleConfigId); - if (fixDataMap.containsKey(fieldName)) { - ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); - } - } - return JSONObject.toJSONString(ruleFieldMap); - } - - //弃置 - private String ListToString(List ruleFieldList) { - String ruleFields = ""; - for (String ruleField : ruleFieldList) { - ruleFields += ruleField + ","; - } - ruleFields = StringUtils.isEmpty(ruleFields) ? ruleFields : ruleFields.substring(0, ruleFields.length() - 1); - return ruleFields; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java index 6177e10..bfa87a5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java @@ -2,7 +2,7 @@ public interface SafeStrategy { - String decryption(byte[] bytes); + String decryption(String cipher); String encryption(String lightText); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java index 618716c..6236302 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java @@ -9,9 +9,9 @@ //十六进制的字符串转换成字节数组 byte[] bytes = hexStrToBinaryStr(msg); //计算CRC8 - byte crc8 = CRC8(bytes, 0, bytes.length); - String crc8ToStr = "" + Integer.toHexString(0xff & crc8); - return crc8ToStr; +// String crc8ToStr = "" + Integer.toHexString(0xff & crc8); +// return crc8ToStr; + return null; } /** @@ -33,50 +33,5 @@ return bytes; } - /** - * CRC8 校验 多项式 x8+x2+x+1 - * - * @param b - * @param off - * @param len - * @return - */ - public static byte CRC8(final byte[] b, final int off, final int len) { - byte result = 0x00; - for (int i = 0; i < len; i++) { - result = CHECKSUM_TABLE[(result ^ (b[i + off] & 0xFF)) & 0xFF]; - } - return (byte) (result & 0xFFL); - } - - private final static byte[] CHECKSUM_TABLE = {(byte) 0x00, (byte) 0x07, (byte) 0x0e, (byte) 0x09, (byte) 0x1c, (byte) 0x1b, - (byte) 0x12, (byte) 0x15, (byte) 0x38, (byte) 0x3f, (byte) 0x36, (byte) 0x31, (byte) 0x24, (byte) 0x23, (byte) 0x2a, - (byte) 0x2d, (byte) 0x70, (byte) 0x77, (byte) 0x7e, (byte) 0x79, (byte) 0x6c, (byte) 0x6b, (byte) 0x62, (byte) 0x65, - (byte) 0x48, (byte) 0x4f, (byte) 0x46, (byte) 0x41, (byte) 0x54, (byte) 0x53, (byte) 0x5a, (byte) 0x5d, (byte) 0xe0, - (byte) 0xe7, (byte) 0xee, (byte) 0xe9, (byte) 0xfc, (byte) 0xfb, (byte) 0xf2, (byte) 0xf5, (byte) 0xd8, (byte) 0xdf, - (byte) 0xd6, (byte) 0xd1, (byte) 0xc4, (byte) 0xc3, (byte) 0xca, (byte) 0xcd, (byte) 0x90, (byte) 0x97, (byte) 0x9e, - (byte) 0x99, (byte) 0x8c, (byte) 0x8b, (byte) 0x82, (byte) 0x85, (byte) 0xa8, (byte) 0xaf, (byte) 0xa6, (byte) 0xa1, - (byte) 0xb4, (byte) 0xb3, (byte) 0xba, (byte) 0xbd, (byte) 0xc7, (byte) 0xc0, (byte) 0xc9, (byte) 0xce, (byte) 0xdb, - (byte) 0xdc, (byte) 0xd5, (byte) 0xd2, (byte) 0xff, (byte) 0xf8, (byte) 0xf1, (byte) 0xf6, (byte) 0xe3, (byte) 0xe4, - (byte) 0xed, (byte) 0xea, (byte) 0xb7, (byte) 0xb0, (byte) 0xb9, (byte) 0xbe, (byte) 0xab, (byte) 0xac, (byte) 0xa5, - (byte) 0xa2, (byte) 0x8f, (byte) 0x88, (byte) 0x81, (byte) 0x86, (byte) 0x93, (byte) 0x94, (byte) 0x9d, (byte) 0x9a, - (byte) 0x27, (byte) 0x20, (byte) 0x29, (byte) 0x2e, (byte) 0x3b, (byte) 0x3c, (byte) 0x35, (byte) 0x32, (byte) 0x1f, - (byte) 0x18, (byte) 0x11, (byte) 0x16, (byte) 0x03, (byte) 0x04, (byte) 0x0d, (byte) 0x0a, (byte) 0x57, (byte) 0x50, - (byte) 0x59, (byte) 0x5e, (byte) 0x4b, (byte) 0x4c, (byte) 0x45, (byte) 0x42, (byte) 0x6f, (byte) 0x68, (byte) 0x61, - (byte) 0x66, (byte) 0x73, (byte) 0x74, (byte) 0x7d, (byte) 0x7a, (byte) 0x89, (byte) 0x8e, (byte) 0x87, (byte) 0x80, - (byte) 0x95, (byte) 0x92, (byte) 0x9b, (byte) 0x9c, (byte) 0xb1, (byte) 0xb6, (byte) 0xbf, (byte) 0xb8, (byte) 0xad, - (byte) 0xaa, (byte) 0xa3, (byte) 0xa4, (byte) 0xf9, (byte) 0xfe, (byte) 0xf7, (byte) 0xf0, (byte) 0xe5, (byte) 0xe2, - (byte) 0xeb, (byte) 0xec, (byte) 0xc1, (byte) 0xc6, (byte) 0xcf, (byte) 0xc8, (byte) 0xdd, (byte) 0xda, (byte) 0xd3, - (byte) 0xd4, (byte) 0x69, (byte) 0x6e, (byte) 0x67, (byte) 0x60, (byte) 0x75, (byte) 0x72, (byte) 0x7b, (byte) 0x7c, - (byte) 0x51, (byte) 0x56, (byte) 0x5f, (byte) 0x58, (byte) 0x4d, (byte) 0x4a, (byte) 0x43, (byte) 0x44, (byte) 0x19, - (byte) 0x1e, (byte) 0x17, (byte) 0x10, (byte) 0x05, (byte) 0x02, (byte) 0x0b, (byte) 0x0c, (byte) 0x21, (byte) 0x26, - (byte) 0x2f, (byte) 0x28, (byte) 0x3d, (byte) 0x3a, (byte) 0x33, (byte) 0x34, (byte) 0x4e, (byte) 0x49, (byte) 0x40, - (byte) 0x47, (byte) 0x52, (byte) 0x55, (byte) 0x5c, (byte) 0x5b, (byte) 0x76, (byte) 0x71, (byte) 0x78, (byte) 0x7f, - (byte) 0x6a, (byte) 0x6d, (byte) 0x64, (byte) 0x63, (byte) 0x3e, (byte) 0x39, (byte) 0x30, (byte) 0x37, (byte) 0x22, - (byte) 0x25, (byte) 0x2c, (byte) 0x2b, (byte) 0x06, (byte) 0x01, (byte) 0x08, (byte) 0x0f, (byte) 0x1a, (byte) 0x1d, - (byte) 0x14, (byte) 0x13, (byte) 0xae, (byte) 0xa9, (byte) 0xa0, (byte) 0xa7, (byte) 0xb2, (byte) 0xb5, (byte) 0xbc, - (byte) 0xbb, (byte) 0x96, (byte) 0x91, (byte) 0x98, (byte) 0x9f, (byte) 0x8a, (byte) 0x8d, (byte) 0x84, (byte) 0x83, - (byte) 0xde, (byte) 0xd9, (byte) 0xd0, (byte) 0xd7, (byte) 0xc2, (byte) 0xc5, (byte) 0xcc, (byte) 0xcb, (byte) 0xe6, - (byte) 0xe1, (byte) 0xe8, (byte) 0xef, (byte) 0xfa, (byte) 0xfd, (byte) 0xf4, (byte) 0xf3}; } \ No newline at end of file diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java index 27c2838..6e078a3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java @@ -1,9 +1,6 @@ package com.casic.missiles.parser.safe.impl; -import cn.hutool.core.util.CharsetUtil; -import cn.hutool.crypto.symmetric.SM4; -import cn.hutool.crypto.symmetric.SymmetricCrypto; - +import com.casic.missiles.parser.safe.SafeStrategy; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; @@ -11,19 +8,44 @@ import org.bouncycastle.crypto.engines.SM4Engine; import org.bouncycastle.crypto.params.KeyParameter; import org.bouncycastle.util.encoders.Hex; - -import static cn.hutool.crypto.Mode.ECB; -import static cn.hutool.crypto.Padding.NoPadding; +import org.springframework.stereotype.Component; /** * SM4算法工具类 */ @Slf4j -public class Sm4 { +@Component("sm4") +public class Sm4 implements SafeStrategy { //加解密的字节快大小 public static final int BlockSize = 16; + @Override + public String decryption(String cipher) { + byte[] keyByte = { + 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 + }; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(keyByte); + byte[] in = Hex.decode(cipher); + byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); + String plain = EcbDecrypt(in, keyBytes); + return plain; + } + + @Override + public String encryption(String cipher) { + byte[] keyByte = { + 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 + }; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(keyByte); + byte[] in = Hex.decode(cipher); + byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); + String plain = EcbDecrypt(in, keyBytes); + return plain; + } + /** * SM4ECB加密算法,对内 * @@ -32,8 +54,6 @@ * @return */ private static byte[] ecb_encrypt(byte[] in, byte[] keyBytes) { - - SM4Engine sm4Engine = new SM4Engine(); sm4Engine.init(true, new KeyParameter(keyBytes)); byte[] out = new byte[in.length]; @@ -58,27 +78,6 @@ return cipher; } - - /** - * hutool 解密SM4 - * - * @param encodeContent - * @return - */ - public static String decode(String encodeContent) { - String key = "24ad182507479a5da3ad94d9d78ea203"; - try { - SymmetricCrypto sm4 = new SM4(ECB, NoPadding, key.getBytes()); - String decryptStr = sm4.decryptStr(encodeContent, CharsetUtil.CHARSET_UTF_8); - return decryptStr; - } catch (Exception e) { - e.printStackTrace(); - log.error("SM4解密失败"); - } - return null; - } - - /** * SM4的ECB加密算法 * @@ -129,20 +128,6 @@ return plain; } - /** - * SM4的ECB解密算法 - * - * @param cipher 输入的密文字符串 - * @param key 密钥 - * @return - */ - public static String EcbDecrypt(String cipher, String key) { - byte[] in = Hex.decode(cipher); - byte[] keyBytes = Hex.decode(key); - - String plain = EcbDecrypt(in, keyBytes); - return plain; - } /** * 主函数 @@ -151,28 +136,24 @@ */ public static void main(String[] args) { byte[] ciphertext = { + 0x4B, (byte) 0x8C, (byte) 0x9D, 0x08, (byte) 0xE4, (byte) 0xD3, 0x64, 0x42, (byte) 0xB9, (byte) 0xA5, (byte) 0xFE, (byte) 0xCD, (byte) 0x91, 0x1B, 0x38, (byte) 0xAC, (byte) 0xE9, 0x1C, (byte) 0xCD, 0x53, 0x02, (byte) 0xD7, 0x0C, (byte) 0x9B, (byte) 0x96, 0x30, 0x62, (byte) 0xE8, (byte) 0xFB, (byte) 0xEF, (byte) 0xB9, (byte) 0xFF, (byte) 0xDE, 0x19, (byte) 0x80, 0x35, 0x3E, (byte) 0x90, 0x4F, 0x2F, 0x12, 0x2B, 0x19, (byte) 0x8B, 0x6C, 0x7A, (byte) 0x85, (byte) 0xA1, (byte) 0xB1, (byte) 0x86, (byte) 0xA3, 0x7A, 0x46, 0x0C, 0x2F, (byte) 0x94, 0x4F, 0x7F, 0x2C, 0x56, 0x14, (byte) 0xF3, (byte) 0x89, (byte) 0xC3, - 0x3F, 0x20, (byte) 0xF9, (byte) 0x87, (byte) 0xA1, 0x60, (byte) 0xD9, (byte) 0xA8, (byte) 0xFD, (byte) 0xD7, (byte) 0x9B, 0x4B, 0x26, 0x06, 0x30, 0x44}; + 0x3F, 0x20, (byte) 0xF9, (byte) 0x87, (byte) 0xA1, 0x60, (byte) 0xD9, (byte) 0xA8, (byte) 0xFD, (byte) 0xD7, (byte) 0x9B, 0x4B, 0x26, 0x06, 0x30, 0x44 + }; ByteBuf in = ByteBufAllocator.DEFAULT.heapBuffer(); in.writeBytes(ciphertext); - byte[] keyByte = { 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 }; ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); - key.writeBytes(ciphertext); - String resCipherData = decode(ByteBufUtil.hexDump(in)); - ByteBuf out = ByteBufAllocator.DEFAULT.heapBuffer(); -// out.writeBytes(resCipherData); -// System.out.println(hexBytes); - System.out.println(resCipherData.toString()); -// String resPlainData = EcbDecrypt(resCipherData, key); -// System.out.println("原始明文:" + data); -// System.out.println("解密后明文:" + resPlainData); + key.writeBytes(keyByte); +// String resCipherData = EcbDecrypt(ByteBufUtil.hexDump(in), ByteBufUtil.hexDump(key)); +// System.out.println(resCipherData); } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java index 1395a51..ac5f957 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java @@ -1,7 +1,7 @@ package com.casic.missiles.parser.safe.impl; import io.netty.buffer.ByteBufUtil; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** *

@@ -14,9 +14,8 @@ * @author hyl * @version v1.0: Tea.java, v 0.1 2021/3/12 13:48 $ */ -@Service("tea") -///tea算法类 - +//tea算法类 +@Component("tea") public class Tea { public static byte[] MyTea_Encrypt(byte[] MyTeaContent, int ByteLen, byte[] MyTeakey) { @@ -99,7 +98,6 @@ // for(int i32Index = 0; i32Index < 8; i32Index++) { // System.out.print("0x" + Integer.toHexString(MyContent[i32Index]) + " "); // } - // System.out.println("密钥为:"); // for(int i32Index = 0; i32Index < 16; i32Index++) { // System.out.print("0x" + Integer.toHexString(MyKeys[i32Index]) + " "); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java index bdd0721..bd1516a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java @@ -3,7 +3,7 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.parser.sender.DataSubscribeProvider; import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponents; import org.springframework.web.util.UriComponentsBuilder; @@ -12,7 +12,7 @@ import java.util.Collections; import java.util.Map; -@Service("functionCallback") +@Component("functionCallback") public class FunctionCallback implements DataSubscribeProvider { @Resource diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java index 0b44fb9..7526de2 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.Map; -@Service("middleware") +@Component("middleware") public class MiddlewareSubscribe implements DataSubscribeProvider { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java index 5dcee3f..e2f1192 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.Map; -@Service("nosql") +@Component("nosql") public class NoSqlSubscribe implements DataSubscribeProvider { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java b/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java new file mode 100644 index 0000000..81a5324 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java @@ -0,0 +1,86 @@ +package com.casic.missiles.pojo; + +import lombok.Data; + +/** + * 协议 + */ +@Data +public class Msg { + + /** + * 前导码 + */ + private String preamble; + + /** + * 版本号 + */ + private String version; + + /** + * 内容长度 + */ + private int leng; + + /** + * 设备ID + */ + private String deviceId; + + /** + * 通讯方式 + */ + private Integer connType; + + /** + * 加密方式 + */ + private Integer encryType; + + /** + * 目标地址 + */ + private String destAddr; + + /** + * PDUType + */ + private String PDUType; + + /** + * 操作类型 + */ + private Integer operateType; + + /** + * 传输控制位 PDUType.bit7=0时,表示存在后续的访问;当PDUType.bit7=1时,表示无后续的访问。 + */ + private Integer transControlFlag; + + /** + * 设备类型 + */ + private Integer deviceType; + + /** + * 序号 + */ + private Integer seq; + + /** + * tagList + */ + private String tagList; + + /** + * OidList + */ + private String OidList; + + /** + * CRC + */ + private String CRC; + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java index 40a5265..97cc984 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java @@ -40,7 +40,7 @@ String httpContent = msg.toString(Charset.defaultCharset()); log.info(" String : " + msg.toString(Charset.defaultCharset())); String majorContent = httpContent.substring(httpContent.indexOf("{"), httpContent.lastIndexOf("}") + 1); - String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("serviceData")).get("Value")); + String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("RegistryData")).get("Value")); log.info("----------------------------------" + values); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); bufferContent.writeBytes(values.getBytes(Charset.forName("ISO-8859-1"))); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java index 1b132a7..e3ced4b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java @@ -35,7 +35,7 @@ String httpContent = msg.toString(Charset.defaultCharset()); log.info(" String : " + msg.toString(Charset.defaultCharset())); String majorContent = httpContent.substring(httpContent.indexOf("{"), httpContent.lastIndexOf("}") + 1); - String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("serviceData")).get("Value")); + String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("RegistryData")).get("Value")); log.info("----------------------------------" + values); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); bufferContent.writeBytes(values.getBytes(Charset.forName("ISO-8859-1"))); diff --git a/sensorhub-core/src/main/resources/application.properties b/sensorhub-core/src/main/resources/application.properties deleted file mode 100644 index 8b13789..0000000 --- a/sensorhub-core/src/main/resources/application.properties +++ /dev/null @@ -1 +0,0 @@ - diff --git a/sensorhub-core/src/main/resources/config/application-dev.yml b/sensorhub-core/src/main/resources/config/application-dev.yml index 4f897a8..dcc4c2d 100644 --- a/sensorhub-core/src/main/resources/config/application-dev.yml +++ b/sensorhub-core/src/main/resources/config/application-dev.yml @@ -4,9 +4,9 @@ spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true + url: jdbc:mysql://127.0.0.1:3306/sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true username: root - password: Casic203 + password: root session: store-type: redis redis: diff --git a/sensorhub-core/src/main/resources/config/application.yml b/sensorhub-core/src/main/resources/config/application.yml index ae89f9d..7965da1 100644 --- a/sensorhub-core/src/main/resources/config/application.yml +++ b/sensorhub-core/src/main/resources/config/application.yml @@ -30,6 +30,13 @@ port: 6379 password: ew5T4K3#203lwh config-prefix: 'Casic:' +#代码生成器配置 +code: + generate: + #作者 + author: cz + #待生成对象表名 + table-name: bussiness_field_config,combined_field_config sensorhub: config: port: 7091 diff --git a/sensorhub-support/pom.xml b/sensorhub-support/pom.xml index 9a71296..761601c 100644 --- a/sensorhub-support/pom.xml +++ b/sensorhub-support/pom.xml @@ -42,6 +42,12 @@ ${redis.version} + + com.baomidou + mybatis-plus-generator + ${mybatis-plus-generator.version} + + org.reflections diff --git a/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java b/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java new file mode 100644 index 0000000..515ca53 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java @@ -0,0 +1,14 @@ +package com.casic.missiles.enums; + +/** + * @author + * @date + */ +public interface FixedPropertyEnum { + + String FIXED_POSITION = "fixedPosition"; + + String TOTAL_LENGTH = "totalLength"; + + String TAIL_POSITION = "tailPosition"; +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/CombinedFieldMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CombinedFieldMapper.java new file mode 100644 index 0000000..38e8f42 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CombinedFieldMapper.java @@ -0,0 +1,15 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.CombinedFieldConfig; +import org.apache.ibatis.annotations.Mapper; + +/** + * @author cz + * + */ +@Mapper +public interface CombinedFieldMapper extends BaseMapper { + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java new file mode 100644 index 0000000..128b09d --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java @@ -0,0 +1,10 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.CommandEventConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface CommandEventMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java new file mode 100644 index 0000000..042eb3c --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.DatagramEventConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface DatagramEventConfigMapper extends BaseMapper { +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java new file mode 100644 index 0000000..fc95cf4 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java @@ -0,0 +1,8 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.FieldConfig; + +public interface FieldConfigMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldRuleConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldRuleConfigMapper.java new file mode 100644 index 0000000..b310a08 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldRuleConfigMapper.java @@ -0,0 +1,10 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.FieldRuleConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface FieldRuleConfigMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java new file mode 100644 index 0000000..9060a69 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.ProtocolConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface ProtocolConfigMapper extends BaseMapper { +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolFieldConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolFieldConfigMapper.java new file mode 100644 index 0000000..1b47180 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolFieldConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +public interface ProtocolFieldConfigMapper extends BaseMapper { + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java index 608af3a..32cc8a4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java @@ -2,48 +2,47 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.delivery.decorator.ByteDecorator; +import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @AllArgsConstructor public class FieldDecoratorManger { - private final RuleDictDao ruleDictDao; + private final RuleConfigRegistry ruleDictDao; // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 // (1)静态的业务字段是字典里面可以配置的 // (2)动态的业务字段是通过规则生成的 public String contentMerge(String ruleJson, String sceneConent, String dynamicContent) { - List ruleDictList = ruleDictDao.getRuleDictConfig(); - Map ruleDictMap = ruleDictList.stream().collect( - Collectors.toMap(RuleDict::getId, e -> e)); - List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); - for (Map ruleMap : ruleMapList) { - String ruleType = String.valueOf(ruleMap.get("ruleType")); - ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); - NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); - byteDecorator.nodeDecoratorRule(nodeDecoratorParm); - } +// List ruleDictList = ruleDictDao.getRuleDictConfig(); +// Map ruleDictMap = ruleDictList.stream().collect( +// Collectors.toMap(RuleDict::getId, e -> e)); +// List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); +// for (Map ruleMap : ruleMapList) { +// String ruleType = String.valueOf(ruleMap.get("ruleType")); +// ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); +// NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); +// byteDecorator.nodeDecoratorRule(nodeDecoratorParm); +// } return null; } - - private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { - NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() - .contents(sceneConent) - .dynamicContent(dynamicContent) - .ruletypeId(ruletypeId) - .ruleDictMap(ruleDictMap) - .build(); - return nodeDecoratorParm; - } +// +// private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { +// NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() +// .contents(sceneConent) +// .dynamicContent(dynamicContent) +// .ruletypeId(ruletypeId) +// .ruleDictMap(ruleDictMap) +// .build(); +// return nodeDecoratorParm; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java index 652970c..b204ac3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java @@ -1,56 +1,56 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@AllArgsConstructor -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", - JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Component; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Component("logicalDecorator") +//@AllArgsConstructor +//@Slf4j +//public class LogicalShiftDecorator implements ByteDecorator { +// +//// private final FieldRuleEngineMapper fieldRuleEngineMapper; +//// +//// //字节位移 +//// @Override +//// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +//// String logicalValue = ""; +//// RuleEvaluator fieldRuleEngine = new RuleEvaluator(); +//// try { +//// Map env2 = new HashMap(); +//// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +//// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +//// for (String contentId : contentIdList) { +//// RuleDict ruleDict = ruleDictMap.get(contentId); +//// if (ruleDict.getCode().contains("#")) { +//// //使用动态的值 +//// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +//// } +//// env2.put(ruleDict.getName(), ruleDict.getCode()); +//// } +//// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +//// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +//// return null; +//// } +//// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +//// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +//// return values; +//// } catch (Exception ex) { +//// log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", +//// JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +//// return null; +//// } +//// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java index 346468f..822fead 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@AllArgsConstructor -@Slf4j -public class OperationDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("optionDecorator") +//@AllArgsConstructor +//@Slf4j +//public class OperationDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //混合运算,有常量或者乘除的缩放 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java index 50fb0a7..7a8bccb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@AllArgsConstructor -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +////精度计算 +//@AllArgsConstructor +//@Registry("precisionDecorator") +//@Slf4j +//public class PrecisionDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java index da39235..27f9cc7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java @@ -1,54 +1,53 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@AllArgsConstructor -@Slf4j -public class RuleDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("ruleDecorator") +//@AllArgsConstructor +//@Slf4j +//public class RuleDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //吃我一套正则表达式 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (Exception ex) { +// log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java index 7f5cbf3..c043f97 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java @@ -2,6 +2,6 @@ import java.util.Map; -public interface ComandeEventService { +public interface ComandeEventService{ Map loadComandeEventConfig(String protocolId,String scene); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java index 476ad84..aaf1837 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java @@ -2,46 +2,46 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.dao.CommandEventDao; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @Slf4j @AllArgsConstructor -public class ComandeEventServiceImpl implements ComandeEventService { +public class ComandeEventServiceImpl implements ComandeEventRegistry { - private final CommandEventDao commandEventDao; + // private final CommandEventDao commandEventDao; // 加密bean 固定字段出现变化的字段解析,业务字段的有序内容 @Override - public Map loadComandeEventConfig(String protocolId,String sceneName) { - CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); - if (ObjectUtil.isEmpty(commandEventConfig)) { - log.error("协议{},没有配置成功接收回复配置,清排查原因"); - return null; - } - String replyJson = commandEventConfig.getReplyContentJson(); - List> replyMapList = JSONArray.parseObject(replyJson, List.class); - List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); - Map fixMap = fixList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); - List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) - .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) - .collect(Collectors.toList()); - Map commandConfigMap = new HashMap<>(); - commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); - commandConfigMap.put("fixContent", fixMap); - commandConfigMap.put("bizContent", contentList); - return commandConfigMap; + public Map loadComandeEventConfig(String protocolId, String sceneName) { +// CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); +// if (ObjectUtil.isEmpty(commandEventConfig)) { +// log.error("协议{},没有配置成功接收回复配置,清排查原因"); +// return null; +// } +// String replyJson = commandEventConfig.getReplyContentJson(); +// List> replyMapList = JSONArray.parseObject(replyJson, List.class); +// List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); +// Map fixMap = fixList.stream() +// .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); +// List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) +// .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) +// .collect(Collectors.toList()); +// Map commandConfigMap = new HashMap<>(); +// commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); +// commandConfigMap.put("fixContent", fixMap); +// commandConfigMap.put("bizContent", contentList); +// return commandConfigMap; + return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 128b09d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java deleted file mode 100644 index 4016b0b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface DatagramEventMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java deleted file mode 100644 index 597c306..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.apache.ibatis.annotations.Mapper; - -public interface FieldConfigMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java deleted file mode 100644 index a31680a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.PreRuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface PreRuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java deleted file mode 100644 index 9060a69..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface ProtocolConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java deleted file mode 100644 index 6fa6936..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java deleted file mode 100644 index 582a705..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleDict; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleDictMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java deleted file mode 100644 index 6e302c8..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.CommandEventMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Optional; - -@Component -public class CommandEventDao { - - @Resource - private CommandEventMapper commandEventMapper; - - public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId) - .eq("scene", sceneName) - .eq("enabled", 1); - List commandEventConfig = commandEventMapper.selectList(queryWrapper); - Optional optionalEventConfig = commandEventConfig.stream().findFirst(); - return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java deleted file mode 100644 index 9137e4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.FieldConfigMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class FieldConfigDao { - - @Resource - private FieldConfigMapper fieldConfigMapper; - - public FieldConfig getFieldConfigById(String fieldId) { - FieldConfig fieldConfig = fieldConfigMapper.selectById(fieldId); - return fieldConfig; - } - - public List getFieldConfigs(String protocolId,Integer isFixed) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",isFixed); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - - public List getStorageFieldConfig(String protocolId) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",1) - .eq("is_storage",1); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java deleted file mode 100644 index 67bff6b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.mapper.PreRuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class PreRuleConfigDao { - - @Resource - private PreRuleConfigMapper preRuleConfigMapper; - - public List getPreRuleList(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return preRuleConfigMapper.selectList(queryWrapper); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java deleted file mode 100644 index d69ea85..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.RuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleConfigDao { - - @Resource - private RuleConfigMapper ruleConfigMapper; - - public RuleConfig getNextRuleConfig(String ruleFields) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("parse_rule_json", ruleFields); - return ruleConfigMapper.selectOne(queryWrapper); - } - - - public List getRuleConfigById(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return ruleConfigMapper.selectList(queryWrapper); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java deleted file mode 100644 index 932c185..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.RuleDictMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleDictDao { - - @Resource - private RuleDictMapper ruleDictMapper; - - public List getRuleDictConfig() { - List ruleDictList = ruleDictMapper.selectList(null); - return ruleDictList; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java index 9f9e279..43bc4d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java @@ -10,20 +10,15 @@ import io.netty.channel.socket.nio.NioServerSocketChannel; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import javax.annotation.PreDestroy; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static cn.hutool.core.util.ClassUtil.getClasses; /** * SensorhubServer netty服务端 */ @Slf4j -@Service +@Component public class SensorhubServer { /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java index 2c79ff5..9a28c36 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java @@ -11,13 +11,13 @@ import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioSocketChannel; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClient 客户端 */ @Slf4j -@Service +@Registry public final class SensorhubClient { public static void main(String[] args) throws Exception { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java index 9774be0..477c3f7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java @@ -6,12 +6,12 @@ import io.netty.channel.socket.SocketChannel; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientChannelInitialHandler */ -@Service +@Registry public class SensorhubClientChannelInitialHandler extends ChannelInitializer { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java index 346f4b3..73560e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java @@ -5,13 +5,13 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientHandler */ @Slf4j -@Service +@Registry public class SensorhubClientHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java index 5c1c6f2..d990af5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java @@ -4,12 +4,12 @@ import com.casic.missiles.pojo.Msg; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** * SensorhubServerHandler */ -@Service +@Component public class SensorhubServerHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 67283ae..af3172c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,41 +1,37 @@ package com.casic.missiles.parser; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultProtocolConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.*; +import com.casic.missiles.registry.FieldConfigRegistry; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; -import java.nio.charset.Charset; import java.util.HashMap; import java.util.List; import java.util.Map; -@Service("genericProtocolParser") +/** + * @author + */ +@Component("genericProtocolParser") @Slf4j -@AllArgsConstructor +@RequiredArgsConstructor public class GenericProtocolParser implements ProtocolParser { - private final LeadingCodeMatcher leadingCodeMatcher; private final List frameStructDispenserList; - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorInstanceSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; // 匹配首字母前导码=> 帧结构匹配前导码=> // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 @@ -44,18 +40,19 @@ public Boolean doParseProtocol(ByteBuf byteBuf) { String protocolContent = ByteBufUtil.hexDump(byteBuf); //匹配前导码 - List preCodeConfigs = leadingCodeMatcher.matchLeadingCode(protocolContent); + List preCodeConfigs = LeadingCodeMatcher.matchFrameLeadingCode(protocolContent); //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 if (preCodeConfigs.size() == 0) { - return rematch(byteBuf,protocolContent); + return rematch(byteBuf, protocolContent); } - //暂时先取第一个 + //暂时先取第一个,提升速度,使用享元模式, 减少类的创建销毁与构建 ProtocolConfig protocolConfig = preCodeConfigs.get(0); + AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); ByteBuf wholeDatagramByte = null; //通过匹配帧结构获取完整的数据包 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, preCodeConfigs.get(0))) != null) { + if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, protocolFactory)) != null) { break; } } @@ -68,76 +65,78 @@ * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 */ - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId, wholeDatagramByte); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap, protocolId); - //选取规则对应的流程实例 - DatagramEventConfig datagramEventConfig = processorInstanceSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); + //进行规则字段解析,进行匹配规则 + RuleConfig ruleConfig = getRuleConfig(protocolFactory, wholeDatagramByte); + if (ruleConfig == null) { + return false; + } //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, wholeDatagramByte); + ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte); + //以下进行业务的规则解析,同时选定流程实例 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); + DatagramEventProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain, + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText, protocolId); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain); //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); + datagramEventProvider.storeData(bizDataMap); return true; } - private Boolean rematch(ByteBuf byteBuf,String protocolContent) { + /** + * 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 + */ + private Boolean rematch(ByteBuf byteBuf, String protocolContent) { //重置位判断 byteBuf.resetReaderIndex(); //判断重置是否前移,如果没有前移,则直接判为匹配失败 if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { return false; } else { + //递归执行 return doParseProtocol(byteBuf); } } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; + //获取匹配规则->匹配规则 + private RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + //取出其中参与逻辑provider并判空 + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); + String rulePrepareFields = protocolConfig.getRulePrepareFields(); + //固定字段 + if (StringUtils.isNotEmpty(rulePrepareFields)) { + //获取统一固定字段解析 + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + //获取该协议的字段配置,用于协议规则匹配 + List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); + //获取规则 + RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, + rulePrepareFields, protocolFieldConfigs); + return ruleConfig; + } + return null; } - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + //数据构建,获取固定字段的store和业务字段store + private Map buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + Map bizDataMap = new HashMap<>(); + Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); + Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); + bizDataMap.putAll(ruleStoreObjectMap); + bizDataMap.putAll(protocolStoreObjectMap); return bizDataMap; } - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java index 8a46e32..16ce2e5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java @@ -3,6 +3,7 @@ import io.netty.buffer.ByteBuf; public interface ProtocolParser { + Boolean doParseProtocol(ByteBuf byteBuf); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java new file mode 100644 index 0000000..f7814af --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java @@ -0,0 +1,35 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.ProtocolConfigProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.ProtocolConfig; + +/** + * 存放基本协议的的加载信息 + */ +public class AbstractProtocolConfigFactory { + private final ProtocolConfigProvider protocolConfigProvider; + private final ProtocolFieldConfigProvider protocolFieldConfigProvider; + private final RuleConfigProvider ruleConfigProvider; + + public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { + this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); + this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); + this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); + } + + public ProtocolConfigProvider getProtocolConfigProvider() { + return protocolConfigProvider; + } + + public ProtocolFieldConfigProvider getProtocolFieldConfigProvider() { + return protocolFieldConfigProvider; + } + + public RuleConfigProvider getRuleConfigProvider() { + return ruleConfigProvider; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java new file mode 100644 index 0000000..6e36147 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java @@ -0,0 +1,57 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.CombinedFieldConfigProvider; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.FieldConfigProvider; +import com.casic.missiles.parser.provider.FieldRuleConfigProvider; + +/** + * 存放规则相关的的的加载信息 + */ +public class AbstractRuleConfigFactory { + + /** + * 处理字节 + */ + private final FieldConfigProvider fieldConfigProvider; + /** + * 处理组合字节解析的解码器 + */ + private final CombinedFieldConfigProvider combinedFieldConfigProvider; + /** + * 处理负责字节解析的规则配置 + */ + private final FieldRuleConfigProvider fieldRuleConfigProvider; + /** + * 处理实例流程 + */ + private final DatagramEventProvider datagramEventProvider; + + + public AbstractRuleConfigFactory(Long ruleId) { + this.fieldConfigProvider = new FieldConfigProvider(ruleId); + this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); + this.fieldRuleConfigProvider = new FieldRuleConfigProvider(ruleId); + this.datagramEventProvider = new DatagramEventProvider(ruleId); + } + + public FieldConfigProvider getFieldConfigProvider() { + return fieldConfigProvider; + } + + public CombinedFieldConfigProvider getCombinedFieldConfigProvider() { + return combinedFieldConfigProvider; + } + + public FieldRuleConfigProvider getFieldRuleConfigProvider() { + return fieldRuleConfigProvider; + } + + public DatagramEventProvider getDatagramEventProvider() { + return datagramEventProvider; + } + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java deleted file mode 100644 index 6e1719a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.factory; - - -import com.casic.missiles.pojo.ProtocolConfig; - -import java.util.List; - -/** - * 数据库访问优化(暂时未做) - *

- * 1、初始化协议解析配置,并存放到处存放缓存,对协议基本配置进行管理 - * 2、其中流程中所有的配置都经过此类进行管理,进行调用获取,增强解析速度 - */ -public interface DatagramFactory { - - /** - * 初始化 - */ - List datagramInit(); - - /** - * 根据前导码配置匹配,模糊匹配获取所有的报文项 - */ - List match(); - - /** - * 根据前导码匹配,返回报文项 - */ - List filer(); - - /** - * 保证数据的唯一性选择器 - */ - List selectOne(); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java new file mode 100644 index 0000000..87444a0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java @@ -0,0 +1,18 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +import java.util.List; + +/** + * 直接用,还是边用边创建 + */ +public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { + + + public DefaultProtocolConfigFactory(ProtocolConfig protocolConfig) { + super(protocolConfig); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java new file mode 100644 index 0000000..cce0c7c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java @@ -0,0 +1,12 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; + +public class DefaultRuleFactory extends AbstractRuleConfigFactory { + + public DefaultRuleFactory(Long ruleId) { + super(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java deleted file mode 100644 index 9ee97e0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.casic.missiles.parser.instance; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service -@Slf4j -@AllArgsConstructor -public class GeneralProcessor { - - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; - - /** - * 统一固定字段解析=>进行规则的查询的判断 - * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 - * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 - */ - @Deprecated - public boolean parseWholeDatagram(ByteBuf buffer, ProtocolConfig protocolConfig) { - try { - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap,protocolId); - //选取规则对应的流程= - DatagramEventConfig datagramEventConfig = processorSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); - //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); - //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); - //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); - //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); - //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); - return true; - } catch (Exception ex) { - log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", - ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); - return false; - } - } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; - } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); - } - - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); - return bizDataMap; - } - - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java index 25e7ad8..6a5777e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java @@ -1,23 +1,31 @@ package com.casic.missiles.parser.instance.impl; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.mapper.DatagramEventMapper; import com.casic.missiles.pojo.DatagramEventConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.SpringContextUtil; -@Service -@AllArgsConstructor +import java.util.List; +import java.util.Optional; + +/** + * @author cz + * + */ public class DefaultProcessorInstanceSelector implements ProcessorInstanceSelector { - private final DatagramEventMapper datagramEventMapper; + private static List datagramEventConfigs; + + static { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + datagramEventConfigs = datagramEventRegistry.getDatagramEventList(); + } @Override public DatagramEventConfig getProcessorInstance(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("rule_id", protocolId); - return datagramEventMapper.selectOne(queryWrapper); + Optional optionalSelectInstance = datagramEventConfigs.stream() + .filter(e -> e.getId().equals(protocolId)).limit(1).findFirst(); + return optionalSelectInstance.isPresent() ? optionalSelectInstance.get() : null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a778671..7b56a43 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,16 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import io.netty.buffer.ByteBuf; /** - * 分析匹配情况 - * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 - * 2、匹配不成功,有后续帧,可以进行下次匹配。 - * 3、匹配不成功,无后续帧,可以进行丢弃。 + * 分析匹配情况 + * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 + * 2、匹配不成功,有后续帧,可以进行下次匹配。 + * 3、匹配不成功,无后续帧,可以进行丢弃。 */ -public interface FrameStructMatcher{ +public interface FrameStructMatcher { - ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig); + ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 05320ab..8ebea78 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,23 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.ProtocolConfigMapper; +import com.casic.missiles.parser.provider.ProtocolConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Component; import java.util.List; import java.util.stream.Collectors; -@Component -@AllArgsConstructor public class LeadingCodeMatcher { - private final ProtocolConfigMapper protocolMapper; - //** 1、首字母匹配前导码, // 2、以匹配出的前导码是否在报文中条件进行前导码的匹配二次筛选 - public List matchLeadingCode(String protocolContent){ + public static List matchFrameLeadingCode(String protocolContent){ List initialConfigs = initialMatch(protocolContent); List preCodeConfigs = initialConfigs.stream() .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) @@ -26,13 +19,16 @@ } //初始化匹配前导码内容 - private List initialMatch(String protocolContent) { - String protocolStr = protocolContent.charAt(0) + ""; - QueryWrapper queryWrapper = new QueryWrapper() - .likeRight("pre_fix", protocolStr); - List protocolConfigList = protocolMapper.selectList(queryWrapper); - return protocolConfigList; + private static List initialMatch(String protocolContent) { + String firstFrameChar = protocolContent.charAt(0) + ""; + ProtocolConfigProvider protocolConfigProvider=new ProtocolConfigProvider(firstFrameChar); + return protocolConfigProvider.getMatchList(); } + + + + + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index cf2113d..e915877 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -1,32 +1,35 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(0) -@Service +@Component public class FrameLengthMatcher implements FrameStructMatcher { - @Autowired - private FieldParser fieldParser; - //超过长度 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { String dataGramContent = ByteBufUtil.hexDump(byteBuf); - if (StringUtils.isEmpty(protocolConfig.getUnpackId()) && StringUtils.isEmpty(protocolConfig.getTailStr())) { - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + //当不存在结尾标志和拆包标志,可以直接使用长度进行匹配 + if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { if (dataGramContent.length() >= totalLength) {//等于长度返回true,超出长度,切断 - ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, protocolConfig, totalLength); + ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, totalLength); return wholeDatagramByte; } else { //读的标志位前移舍弃 @@ -38,7 +41,7 @@ return null; } - private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, Integer totalLength) { byteBuf.readBytes(totalLength); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, totalLength - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 2bfc213..d527ad0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; @@ -13,7 +13,7 @@ import lombok.AllArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.nio.charset.Charset; import java.util.Map; @@ -22,32 +22,30 @@ * 后续标志验证 */ @Order(1) -@Service +@Component @AllArgsConstructor -public class FrameMarkMatcher implements FrameStructMatcher { - - private final FieldConfigDao fieldConfigDao; - private final FieldParser fieldParser; - private final FieldResolver fieldResolverManger; +public class FrameMarkMatcher implements FrameStructMatcher, FixedPropertyEnum { //帧后续标志=>结束,进行帧的重组=>有后续,1、帧移位判别 2、继续接收帧 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig UnpackConfig = StringUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getUnpackId()); - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); - Integer upback = 0; + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); ByteBuf mergeWholeFrameByte = null; - if (!ObjectUtil.isEmpty(UnpackConfig)) { - while (hasNextFullFrame(byteBuf, protocolConfig)) { - upback = (Integer) fieldResolverManger.filedParserManger(byteBuf, UnpackConfig, null); + if (!ObjectUtil.isEmpty(unpackFlag)) { + while (hasNextFullFrame(byteBuf, protocolConfig, protocolFieldConfigProvider)) { //是否存在后续位 - if (upback == 1) {//使用esayRule + if (unpackFlag == 1) {//使用esayRule //表示可以截取 - mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolConfig, totalLength); + mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolFieldConfigProvider, protocolConfig); return mergeWholeFrameByte; } else { - byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig)); + byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig, protocolFieldConfigProvider)); } } } @@ -56,7 +54,8 @@ //选取第一个帧,将业务内容和后面部分分开 //计算数据报文-业务内容 - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolFieldConfigProvider protocolFieldConfigProvider, ProtocolConfig protocolConfig) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); //截取完整报文 byteBuf.readBytes(totalLength); ByteBuf byteBufContent = byteBuf.slice(0, byteBuf.readerIndex()); @@ -68,15 +67,15 @@ String tail = ""; System.out.println(ByteBufUtil.hexDump(byteBufContent)); //会存在多个帧拼接在一起的的情况,进行合并处理 - while (hasNextFullFrame(byteBufContent, protocolConfig)) { - Integer currentFrameLength = fieldParser.getTotalLength(protocolConfig, byteBufContent); + while (hasNextFullFrame(byteBufContent, protocolConfig, protocolFieldConfigProvider)) { + Integer currentFrameLength = protocolFieldConfigProvider.getTotalLength(byteBufContent, protocolConfig); byteBufContent.readBytes(currentFrameLength); ByteBuf currentbyteBuf = byteBufContent.slice(0, byteBufContent.readerIndex()); byteBufContent.markReaderIndex();//读的标志位前移 System.out.println(ByteBufUtil.hexDump(byteBufContent)); String hexDump = currentbyteBuf.toString(Charset.forName("ISO-8859-1")); //获取当前固定帧结构的关系map - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, currentbyteBuf); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(currentbyteBuf, protocolConfig); if (StringUtils.isEmpty(mergeFrameStr)) { //首次获取业务数据报文 mergeFrameStr += hexDump.substring(0, currentFrameFixedProperty.get("tailPosition")); @@ -95,22 +94,22 @@ /** * 获取平移到下一帧起始位置 */ - public int getNextFrameOffset(ByteBuf buffer, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, buffer); - return currentFrameFixedProperty.get("totalLength"); + public int getNextFrameOffset(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + return currentFrameFixedProperty.get(TOTAL_LENGTH); } /** * 判断是否出错进行整个帧的 */ - public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, byteBuf); + public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); //保证读取位置不在固定位置,是可变的业务内容 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("fixedPosition")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(FIXED_POSITION)) { return false; } //判断读取是否操作帧长度 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("totalLength")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(TOTAL_LENGTH)) { return false; } return true; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 76a3784..c3a1bab 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -1,50 +1,50 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.parser.instance.GeneralProcessor; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; +import io.netty.buffer.ByteBufUtil;; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(2) -@Service +@Component public class FrameTailMatcher implements FrameStructMatcher { - @Resource - private FieldConfigDao fieldConfigDao; - @Autowired - private GeneralProcessor generalProcessor; - //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig tailFieldConfig = StringUtils.isEmpty(protocolConfig.getTailStr()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getTailStr()); - if (!ObjectUtil.isEmpty(tailFieldConfig)) { - String tailStr = tailFieldConfig.getFieldName(); + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfig protocolFieldConfig = ObjectUtils.isEmpty(protocolConfig.getTailStr()) ? null : + fieldConfigProvider.getFieldConfigById(protocolConfig.getTailStr()); + if (!ObjectUtil.isEmpty(protocolFieldConfig)) { + String tailStr = protocolFieldConfig.getFieldName(); String dataGramContent = ByteBufUtil.hexDump(byteBuf); Boolean tailFlag = ByteBufUtil.hexDump(byteBuf).contains(tailStr); if (!tailFlag) { //使用esayRule return null; } else if (dataGramContent.indexOf(tailStr) < dataGramContent.length() - tailStr.length()) { Integer length = dataGramContent.indexOf(tailStr) + tailStr.length(); - ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, protocolConfig, length); + ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, length); return wholeDatagramByte; //存在粘包 } } return null; } - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer length) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, Integer length) { byteBuf.readBytes(length); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, length - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java new file mode 100644 index 0000000..5f1c177 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java @@ -0,0 +1,73 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.combined.GenericCombinedFieldResolver; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.CombinedFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class CombinedFieldConfigProvider { + + + /** + * 作为临时配置列表缓存使用 + */ + private final List combinedFieldConfigList; + private Map storeObjectMap = new HashMap<>(); + + public CombinedFieldConfigProvider(Long ruleId) { + CombinedFieldConfigRegistry combinedFieldConfigRegistry = SpringContextUtil.getBean(CombinedFieldConfigRegistry.class); + combinedFieldConfigList = combinedFieldConfigRegistry.getCombinedFieldConfigList(ruleId); + } + + public void parseDataField(RuleConfig ruleConfig, String clearZeroPlain,Map fieldConfigsMap ) { + if (showSkip()) { + return; + } + //匹配对应的数据,然后进行相关的字段解析 + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver(); + combinedFieldResolver.parseDataField(combinedFieldConfigList, byteBuf, storeObjectMap,fieldConfigsMap); + } + + + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getCombinedFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return combinedFieldConfigList.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public List getCombinedFieldConfigList() { + return combinedFieldConfigList; + } + + /* 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(combinedFieldConfigList) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java new file mode 100644 index 0000000..f3cfedc --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java @@ -0,0 +1,11 @@ +package com.casic.missiles.parser.provider; + +/** + * @author cz + * @date 2023-6-12 + */ +public class CommandEventProvider{ + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java new file mode 100644 index 0000000..70eec5e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java @@ -0,0 +1,77 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.safe.SafeStrategy; +import com.casic.missiles.parser.sender.DataSubscribeProvider; +import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class DatagramEventProvider { + + private final DatagramEventConfig processorInstance; + + public DatagramEventProvider(Long ruleId) { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + List datagramEventConfigList = + datagramEventRegistry.getDatagramEventList(ruleId); + processorInstance = this.getProcessorInstance(datagramEventConfigList); + } + + public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { + if (showSkip()) { + return null; + } + return datagramEventConfigList.get(0); + } + + // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 + public String getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap) { + String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? + processorInstance.getSafeBean() : + fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); + if (!StringUtils.isEmpty(safeName)) { + //需要加密 + SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); + String plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); + return clearComplementZero(plain); + } + return ByteBufUtil.hexDump(bizDataContent); + } + + //解密清零操作 + private String clearComplementZero(String plain) { + plain = plain.substring(0, plain.lastIndexOf("00")); + return plain; + } + + //数据发送,数据发送者暂未构建 + public void storeData(Map bizDataMap) { + DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); +// dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return ObjectUtils.isNotEmpty(processorInstance) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java new file mode 100644 index 0000000..7e1fe0a --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java @@ -0,0 +1,97 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.FieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class FieldConfigProvider { + + + private final List fieldConfigs; + private Map storeObjectMap = new HashMap<>(); +// private Map singleObjects = new ConcurrentHashMap<>(); + + public FieldConfigProvider(Long ruleId) { + FieldConfigRegistry fieldConfigRegistry = SpringContextUtil.getBean(FieldConfigRegistry.class); + fieldConfigs = fieldConfigRegistry.getFieldConfigList(ruleId); + } + + public List getFieldConfigs() { + return fieldConfigs; + } + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public Map parseDataField(RuleConfig ruleConfig, String clearZeroPlain) { + if (showSkip()) { + return null; + } + List prepareFieldConfig = prepareParseField(ruleConfig); + if (CollectionUtils.isNotEmpty(prepareFieldConfig)) { + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(fieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + return fixDataMap; + } + } + return null; + } + + /** + * 得到需要处理的业务内容 + * + * @return + */ + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return fieldConfigs.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public Map getFieldConfigsMap() { + return fieldConfigs.stream().collect( + Collectors.toMap(FieldConfig::getId, e -> e) + ); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(fieldConfigs) ? false : true; + } + + +} + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java new file mode 100644 index 0000000..817bfaf --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java @@ -0,0 +1,19 @@ +package com.casic.missiles.parser.provider; + +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.registry.FieldRuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; + +public class FieldRuleConfigProvider { + + private final List fieldRuleConfigList; + + public FieldRuleConfigProvider(Long ruleId) { + FieldRuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(FieldRuleConfigRegistry.class); + fieldRuleConfigList = ruleConfigRegistry.getFieldRuleConfigList(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java new file mode 100644 index 0000000..99a1b06 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java @@ -0,0 +1,53 @@ +package com.casic.missiles.parser.provider; + + +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.registry.ProtocolConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolConfigProvider { + + private final List protocolConfigList; + + public ProtocolConfigProvider(String firstChar) { + ProtocolConfigRegistry registry = SpringContextUtil.getBean(ProtocolConfigRegistry.class); + protocolConfigList = registry.getProtocolConfigList(firstChar); + } + + public List getMatchList() { + return protocolConfigList; + } + + /** + * 设置当前协议 + * + * @param protocolConfig + */ + public ProtocolConfigProvider(ProtocolConfig protocolConfig) { + List protocolConfigs = new ArrayList<>(); + protocolConfigs.add(protocolConfig); + protocolConfigList = protocolConfigs; + } + + /** + * 获取当前协议 + * + * @return + */ + public ProtocolConfig getCurrentProtocolConfig() { + if (this.protocolConfigList == null) { + return null; + } else { + return protocolConfigList.get(0); + } + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java new file mode 100644 index 0000000..043927d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java @@ -0,0 +1,213 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.registry.ProtocolFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolFieldConfigProvider { + + private static final String FIXED_FIELD_DS = "fixedFieldDs"; + private static final String CONTENT_FIELD_DS = "contentFieldDs"; + private static final String PROTOCOL_LENGTH = "protocolLength"; + private static final String PROTOCOL_FIELD_ID = "protocolFieldId"; + private static final String PROTOCOL_POSITION = "protocolPosition"; + + private final List protocolFieldConfigs; + private Map singleObjects = new ConcurrentHashMap<>(); + private Map storeObjectMap = new HashMap<>(); + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public ProtocolFieldConfigProvider(Long protocolId) { + ProtocolFieldConfigRegistry protocolFieldConfigRegistry = SpringContextUtil.getBean(ProtocolFieldConfigRegistry.class); + protocolFieldConfigs = protocolFieldConfigRegistry.getProtocolFieldConfigList(protocolId); + } + + public List getProtocolFieldConfigs() { + return protocolFieldConfigs; + } + + public ProtocolFieldConfig getFieldConfigById(Long fieldId) { + Optional optionalConfig = protocolFieldConfigs.stream().filter( + e -> e.getId().equals(fieldId) + ).findFirst(); + return optionalConfig.isPresent() ? optionalConfig.get() : null; + } + + public Integer getProtocolFieldValue(Long protocolFieldId, ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_FIELD_ID + protocolFieldId + ByteBufUtil.hexDump(byteBuf); + //获取缓存 + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + //加载固定长度数据集合 + Map fixDataMap = this.getProtocolDataMap(byteBuf); + ProtocolFieldConfig protocolFieldConfig = selectFieldConfig(protocolFieldId); + Integer protocolFieldValue = 0; + //获取约定字段的总长度 + if (fixDataMap.containsKey(protocolFieldConfig.getFieldName())) { + Object appointUnpackObject = fixDataMap.get(protocolFieldConfig.getFieldName()); + if (ObjectUtils.isNotEmpty(appointUnpackObject)) { + protocolFieldValue = (Integer) appointUnpackObject; + } + } + if (protocolFieldValue != null) { + //加入缓存 + if (ObjectUtils.isNotEmpty(protocolFieldValue)) { + this.singleObjects.put(catchKey, protocolFieldValue); + return protocolFieldValue; + } + } + return null; + } + + /** + * 获取帧固定位置信息 + * + * @param byteBuf + * @param protocolConfig + * @return + */ + public Map getFixedProperty(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_POSITION + protocolConfig.getId(); + if (this.singleObjects.containsKey(catchKey)) { + return (Map) singleObjects.get(catchKey); + } + Map fixedPropertyMap = new HashMap<>(); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + fixedPropertyMap = fieldParser.doGetFixedProperty(protocolFieldConfigs, this.getTotalLength(byteBuf,protocolConfig)); + if (CollectionUtils.isNotEmpty(fixedPropertyMap)) { + this.singleObjects.put(catchKey, fixedPropertyMap); + return fixedPropertyMap; + } + return fixedPropertyMap; + } + + /** + * 获取帧结构应有的总长度 + */ + public Integer getTotalLength(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_LENGTH + ByteBufUtil.hexDump(byteBuf); + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + Integer appointFrameLength = getProtocolFieldValue(protocolConfig.getTotalLengthId(), byteBuf); + if (appointFrameLength != null) { + //获取过滤的字段集合总长度 + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Integer totalFilterLength = fieldParser.getTotalFilterLength(protocolConfig, byteBuf, getFixFieldConfigMap()); + //计算总长度 + Integer totalLength = appointFrameLength + totalFilterLength; + //加入缓存 + if (ObjectUtils.isNotEmpty(totalLength)) { + this.singleObjects.put(catchKey, totalLength); + return totalLength; + } + } + return null; + } + + /** + * 获取协议有关字段解析内容 + * storeObjectMap存储代转存的数据 + * + * @return + */ + public Map getProtocolDataMap(ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(FIXED_FIELD_DS)) { + return (Map) singleObjects.get(FIXED_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(protocolFieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + this.singleObjects.put(FIXED_FIELD_DS, fixDataMap); + return fixDataMap; + } + return null; + } + + /** + * 获取业务报文内容的content字节 + * + * @param wholeDatagramByte + * @return + */ + public ByteBuf getDataContentBuf(ByteBuf wholeDatagramByte) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(CONTENT_FIELD_DS)) { + return (ByteBuf) singleObjects.get(CONTENT_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + ByteBuf bizDataByteBuf = fieldParser.getDataContentBuf(protocolFieldConfigs, wholeDatagramByte); + if (bizDataByteBuf != null) { + this.singleObjects.put(CONTENT_FIELD_DS, bizDataByteBuf); + return bizDataByteBuf; + } + return null; + } + + + private ProtocolFieldConfig selectFieldConfig(Long id) { + Optional optionalProtocolFieldConfig = this.protocolFieldConfigs.stream().filter( + e -> e.getId().equals(id) + ).findFirst(); + return optionalProtocolFieldConfig.isPresent() ? optionalProtocolFieldConfig.get() : null; + } + + + private Map getFixFieldConfigMap() { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, e -> e) + ); + return fixDataFieldMap; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(protocolFieldConfigs) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java new file mode 100644 index 0000000..dafba1c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java @@ -0,0 +1,56 @@ +package com.casic.missiles.parser.provider; + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.rule.GenericRuleResolver; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.RuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleConfigProvider { + + private final List ruleConfigs; + + public List getRuleConfigs() { + return ruleConfigs; + } + + public RuleConfigProvider(Long protocolId) { + RuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(RuleConfigRegistry.class); + ruleConfigs = ruleConfigRegistry.getRuleConfigById(protocolId); + } + + /** + * 获取规则匹配结果 + * + * @param parseFixedDataMap + * @param protocolFieldConfigs + * @return + */ + public RuleConfig doGetRule(Map parseFixedDataMap, + String ids, + List protocolFieldConfigs) { + if (showSkip()) { + return null; + } + RuleConfig ruleConfig = GenericRuleResolver.machRule(parseFixedDataMap, ids, protocolFieldConfigs, ruleConfigs); + return ruleConfig; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(ruleConfigs) ? false : true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java index 3c05891..856b399 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java @@ -1,18 +1,11 @@ package com.casic.missiles.parser.resolver; -import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.springframework.web.bind.annotation.RequestBody; -import javax.annotation.Resource; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -20,19 +13,17 @@ @Slf4j public class ByteMergeProvider { - @Resource - private FieldRuleEngineMapper fieldRuleEngineMapper; - //拿到所有的值合并到一个值 - public String resolveByteMerge(List valueList, String ruletypeId, String vaildRange) { + public static String resolveByteMerge(List valueList, String ruleTypeId, String vaildRange) { String values = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Map vaildMap = getValidRangeMap(vaildRange); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(ruletypeId); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } + //暂时不处理 +// fieldRuleEngine = fieldRuleConfigMapper.selectById(ruleTypeId); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } Map env2 = new HashMap(); for (int i = 0; i < valueList.size(); i++) { if (vaildMap.containsKey(i)) { @@ -47,7 +38,7 @@ } } - private Map getValidRangeMap(String vaildRange) { + private static Map getValidRangeMap(String vaildRange) { String[] range = vaildRange.split(","); Map vaildMap = new HashMap(); for (int i = 0; i < range.length; i++) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 8d821cd..85d6bbf 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -1,9 +1,12 @@ package com.casic.missiles.parser.resolver; +import com.casic.missiles.pojo.AbstractFieldConfig; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; import io.netty.buffer.ByteBuf; +import java.util.List; import java.util.Map; /** @@ -11,18 +14,14 @@ */ public interface FieldParser { -// Map fieldProcess(String protocolContent,); - Map dataParser(RuleConfig ruleConfig, String lightText,String protocolId); + Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength); - Map fixDataParser(String protocolId, ByteBuf buffer); + Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap); - Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf); + ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer); - ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer); - - ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer); - - Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer); + Integer getTotalFilterLength(ProtocolConfig protocolConfig, ByteBuf byteBuf, Map protocolFieldConfigMap); } + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java new file mode 100644 index 0000000..9e0c00e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java @@ -0,0 +1,52 @@ +package com.casic.missiles.parser.resolver; + +import com.casic.missiles.pojo.AbstractFieldConfig; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.util.List; + +public class FieldParserSupport { + + //分别计算bit和byte长度=> 合并长度 + protected Integer calculateLength(List fieldConfigList) { + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + Integer fixedLength = bytefixedLength + bitfixedLength / 8; + return fixedLength; + } + + //找到最大值=> 根据最大值计算业务数据下标 + protected Integer calculatePosition(List fieldConfigList) { + String rex = "[0-9]+"; + Integer max = -1; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) + && Integer.valueOf(fieldConfig.getOriginPositionByte()) > max) { + max = Integer.valueOf(fieldConfig.getOriginPositionByte()); + } + } + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) && fieldConfig.getOriginPositionByte().equals(max)) { + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + } + } + Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; + return maxFixedPosition; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java deleted file mode 100644 index dd3a6cd..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java +++ /dev/null @@ -1,170 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.ByteResolverParam; -import io.netty.buffer.ByteBuf; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -/** - * 字段解析管理总类 - */ -@Service -@Slf4j -@AllArgsConstructor -public class FieldResolver extends ByteMergeProvider { - - //1、字段截取 => 2、简单的字节解析和复杂的字节解析 - public Object filedParserManger(ByteBuf byteBuf, FieldConfig fieldConfig, Integer maxFixedPosition) { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - //最大固定位置不为空, - if (!ObjectUtil.isEmpty(maxFixedPosition)) { - orignPosition -= maxFixedPosition; - } - Object fieldValue = 0; - //待优化 - if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { - fieldValue = bitToResolver(byteBuf, fieldConfig); - } else { - ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); - fieldValue = parsingFields(fieldBytes, fieldConfig.getRuleJson()); - } - return fieldValue; - } - - //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, - //目前默认配置的规则设置暂不支持配置化,由实现完成 - private Object parsingFields(ByteBuf byteBuf, String ruleJson) { - Object fieldsResolveValue = null; - List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); - if (ObjectUtil.isEmpty(ruleMapList)) { - fieldsResolveValue = defaultResolveBuilder(byteBuf); - } else { - fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); - } - return fieldsResolveValue; - } - - private Object defaultResolveBuilder(ByteBuf byteBuf) { - Integer defaultResolveValue = 0; - for (int i = 0; i < byteBuf.writerIndex(); i++) { - defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; - } - return defaultResolveValue; - } - - //字段解析构建器(针对字节单位的) - //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 - // 字节归并结束或者规则结束=>继续根据规则进行判断 - private Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { - Object customizeResolveValue = null; - try { - List bytStrList = new ArrayList<>(); - //存放到数组里面 - for (int i = 0; i < byteBuf.writerIndex(); i++) { - bytStrList.add(byteBuf.readByte()); - } - int i = 0; - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - customizeResolveValue = this.resolveByteMerge(bytStrList, ruletypeId,vaildRange); - break; - } else { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - List tempBytStr = new ArrayList<>(); - for (int k = 0; i < bytStrList.size(); i++) { - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(k) - .value(bytStrList.get(k)) - .ruletypeId(ruletypeId).build(); - tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); - } - bytStrList = tempBytStr; - } - i++; - } - //字节归并到一起=>继续根据规则进行判断 - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(customizeResolveValue) - .ruletypeId(ruletypeId).build(); - customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(customizeResolveValue)); - return customizeResolveValue; - } catch (RuntimeException ex) { - log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); - return null; - } - } - - /** - * 1、单个字节情况表示字段 - * 2、多字节情况表示字段(暂未处理) - */ - private Object bitToResolver(ByteBuf byteBuf, FieldConfig fieldConfig) { - Object fieldValue = new Object(); - try { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - byte fields = 0x00; - if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); - } else { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); - } - - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { - if (!StringUtils.isEmpty(fieldConfig.getExactOrignPosition())) { - fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getExactOrignPosition())).byteValue() - >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); - } else { - fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); - } - } else { - fieldValue = Integer.valueOf(fields & 0xff); - } - if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { - return fieldValue; - } - List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); - int i = 0; - //字节归并到一起=>继续根据规则进行判断 - while (i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(fieldValue) - .ruletypeId(ruletypeId).build(); - fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(fieldValue)); - return fieldValue; - } catch (RuntimeException ex) { - log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); - return null; - } - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java new file mode 100644 index 0000000..1d2aeab --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java @@ -0,0 +1,36 @@ +package com.casic.missiles.parser.resolver.bytes; + +import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.mapper.FieldRuleConfigMapper; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.pojo.ByteResolverParam; +import com.googlecode.aviator.AviatorEvaluator; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; +//转换规则 +@Component("convert") +@AllArgsConstructor +@Slf4j +public class ByteRuleResolver implements ByteResolver { + + private final FieldRuleConfigMapper fieldRuleConfigMapper; + + @Override + public Object resolveOperationRule(ByteResolverParam byteResolverParam){ + FieldRuleConfig fieldRuleEngine=fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); + if(ObjectUtil.isEmpty(fieldRuleEngine)){ + return byteResolverParam.getValue(); + } + String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); + Map env2 = new HashMap(); + env2.put("value", (byte) byteResolverParam.getValue()); + String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); + return values; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java index 103821c..786b71c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java @@ -2,34 +2,34 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("logicalShift") +@Component("logicalShift") @AllArgsConstructor @Slf4j public class LogicalShiftResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //字节位移 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { Integer index = byteResolverParam.getIndex(); - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return byteResolverParam.getValue(); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java index 476747d..01149bd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("operation") +@Component("operation") @AllArgsConstructor @Slf4j public class OperationResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //混合运算,有常量或者乘除的缩放 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java index 0b82cf4..79abcce 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.casic.missiles.pojo.ByteResolverParam; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; //精度计算 -@Service("precision") +@Component("precision") @AllArgsConstructor @Slf4j public class PrecisionResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java deleted file mode 100644 index 5c3f332..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; -//转换规则 -@Service("convert") -@AllArgsConstructor -@Slf4j -public class RuleResolver implements ByteResolver { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam){ - RuleEvaluator fieldRuleEngine=fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); - if(ObjectUtil.isEmpty(fieldRuleEngine)){ - return byteResolverParam.getValue(); - } - String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); - Map env2 = new HashMap(); - env2.put("value", (byte) byteResolverParam.getValue()); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java new file mode 100644 index 0000000..d3bbd91 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java @@ -0,0 +1,15 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; + +import java.util.List; +import java.util.Map; +// 前导码匹配->长度字段 +public interface AbstractCombinedFieldProcessor { + + Map invoke(Map map, ByteBuf byteBuf, List combinedFieldConfigList, + Map fieldConfigsMap, Map storeObjectMap); + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java new file mode 100644 index 0000000..03c8480 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java @@ -0,0 +1,59 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-13 + */ +//依次递增进行数据的解析, +public class GenericCombinedFieldResolver { + + + //通过查询,字段长度长度随机 + public void parseDataField(List combinedFieldConfigList, ByteBuf byteBuf, + Map storeObjectMap, Map fieldConfigsMap) { + Integer frameLength = Integer.valueOf(ByteBufUtil.hexDump(byteBuf)); + //添加前置处理器 + com.casic.missiles.util.ClassUtil classUtil = new com.casic.missiles.util.ClassUtil(); + List abstractCombinedProcessors = classUtil.getSubClassList(AbstractCombinedFieldProcessor.class); + + Map fieldFixedMap = combinedFieldLeadCodeMap(combinedFieldConfigList); + //frameLength + Map combinedProcessorFields = null; + while (byteBuf.readableBytes() < frameLength) { + //一直处理 + for (AbstractCombinedFieldProcessor abstractCombinedProcessor : abstractCombinedProcessors) { + combinedProcessorFields = abstractCombinedProcessor.invoke(combinedProcessorFields, byteBuf, + combinedFieldConfigList, + fieldConfigsMap, storeObjectMap); + if (combinedProcessorFields == null || byteBuf.readableBytes() < frameLength) { + return; + } + } + + } + } + + /** + * 取出前导码匹配集合 + */ + private Map combinedFieldLeadCodeMap(List combinedFieldConfigList) { + Map fieldFixedMap = combinedFieldConfigList + .stream() + .collect(Collectors.toMap(CombinedFieldConfig::getPrefixCode, e -> e)); + return fieldFixedMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java new file mode 100644 index 0000000..643a934 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java @@ -0,0 +1,100 @@ +package com.casic.missiles.parser.resolver.fields; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.FieldParserSupport; +import com.casic.missiles.pojo.*; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 保存使用时最基本的信息,并且使用原型模式 + */ +@Slf4j +public class DefaultProtocolFieldParser extends FieldParserSupport implements FieldParser, FixedPropertyEnum { + + //通过传入的配置和报文进行字段解析 + @Override + public Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap) { + Map dataMap = new HashMap<>(); + for (AbstractFieldConfig protocolFieldConfig : protocolFieldConfigs) { + if (!ObjectUtils.isEmpty(protocolFieldConfig.getOriginPositionByte())) { + Object fieldValue = FieldResolver.parseField(buffer, protocolFieldConfig, null); + if (protocolFieldConfig.getIsStorage() == 1) { + storeObjectMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + dataMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + } + return dataMap; + } + + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength) { + Map fixedPropertyMap = new HashMap<>(); + Integer fixedLength = calculateLength(protocolFieldConfigs); + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + fixedPropertyMap.put(FIXED_POSITION, maxFixedPosition); + fixedPropertyMap.put(TOTAL_LENGTH, totalLength); + fixedPropertyMap.put(TAIL_POSITION, totalLength - fixedLength + maxFixedPosition); + return fixedPropertyMap; + } + + //** 获取业务内容的byteBuf + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer) { + //计算固定长度 + Integer fixedLength = calculateLength(protocolFieldConfigs); + //总长度获取 + String lightText = buffer.toString(Charset.forName("ISO-8859-1")); + Integer totalLength = lightText.length(); + //计算固定长度最大长度 + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + //计算数据报文内容 + ByteBuf bizDataFields = buffer.slice(maxFixedPosition - 1, (totalLength - fixedLength)); + return bizDataFields; + } + + /** + * 获取过滤字段的长度 + */ + @Override + public Integer getTotalFilterLength(ProtocolConfig protocolConfig, + ByteBuf byteBuf, + Map protocolFieldConfigMap) { + if (ByteBufUtil.hexDump(byteBuf).equals("")) { + return 0; + } + int totalFilterLength = 0; + String filterFields = protocolConfig.getTotalLengthFilterFields(); + try { + if (!StringUtils.isEmpty(filterFields)) { + String[] filterFieldList = filterFields.split(","); + for (String filterFieldId : filterFieldList) { + if (StringUtils.isNotEmpty(filterFieldId)) { + ProtocolFieldConfig fieldConfig = protocolFieldConfigMap.get(Long.valueOf(filterFieldId)); + //这里都是按字节计算,没有对位进行区分,可能会出现错误 + // 如果对位有需求,需要进一步跟进 + totalFilterLength += fieldConfig.getOffsetLength(); + } + } + } + return totalFilterLength; + } catch (Exception ex) { + log.error("报文确认分发阶段,获取报文总长度过滤长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); + } + return totalFilterLength; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java new file mode 100644 index 0000000..d51e887 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java @@ -0,0 +1,169 @@ +package com.casic.missiles.parser.resolver.fields; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.parser.resolver.ByteMergeProvider; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.AbstractFieldConfig; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.pojo.ByteResolverParam; +import io.netty.buffer.ByteBuf; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * 字段解析管理总类 + */ +@Slf4j +public class FieldResolver extends ByteMergeProvider { + + //1、字段截取 => 2、简单的字节解析和复杂的字节解析 + public static Object parseField(ByteBuf byteBuf,AbstractFieldConfig fieldConfig, Integer maxFixedPosition) { + Integer orignPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + //最大固定位置不为空, + if (!ObjectUtil.isEmpty(maxFixedPosition)) { + orignPosition -= maxFixedPosition; + } + Object fieldValue = 0; + //待优化 + if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { + fieldValue = doParseBitField(byteBuf, fieldConfig); + } else { + ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); + fieldValue = doParseByteField(fieldBytes, fieldConfig.getRuleJson()); + } + return fieldValue; + } + + //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, + //目前默认配置的规则设置暂不支持配置化,由实现完成 + private static Object doParseByteField(ByteBuf byteBuf, String ruleJson) { + Object fieldsResolveValue = null; + List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); + if (ObjectUtil.isEmpty(ruleMapList)) { + fieldsResolveValue = defaultResolveBuilder(byteBuf); + } else { + fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); + } + return fieldsResolveValue; + } + + private static Object defaultResolveBuilder(ByteBuf byteBuf) { + Integer defaultResolveValue = 0; + for (int i = 0; i < byteBuf.writerIndex(); i++) { + defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; + } + return defaultResolveValue; + } + + //字段解析构建器(针对字节单位的) + //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 + // 字节归并结束或者规则结束=>继续根据规则进行判断 + private static Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { + Object customizeResolveValue = null; + try { + List bytStrList = new ArrayList<>(); + //存放到数组里面 + for (int i = 0; i < byteBuf.writerIndex(); i++) { + bytStrList.add(byteBuf.readByte()); + } + int i = 0; + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { + if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + customizeResolveValue = resolveByteMerge(bytStrList, ruletypeId, vaildRange); + break; + } else { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + List tempBytStr = new ArrayList<>(); + for (int k = 0; i < bytStrList.size(); i++) { + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(k) + .value(bytStrList.get(k)) + .ruletypeId(ruletypeId).build(); + tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); + } + bytStrList = tempBytStr; + } + i++; + } + //字节归并到一起=>继续根据规则进行判断 + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(null) + .value(customizeResolveValue) + .ruletypeId(ruletypeId).build(); + customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); + i++; + } + System.out.println(JSON.toJSON(customizeResolveValue)); + return customizeResolveValue; + } catch (RuntimeException ex) { + log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); + return null; + } + } + + /** + * 1、单个字节情况表示字段 + * 2、多字节情况表示字段(暂未处理) + */ + private static Object doParseBitField(ByteBuf byteBuf,AbstractFieldConfig fieldConfig) { + Object fieldValue = new Object(); + try { + Integer orignPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + byte fields = 0x00; + if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { + fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); + } else { + fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); + } + + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { + if (!StringUtils.isEmpty(fieldConfig.getOriginPositionBit())) { + fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getOriginPositionBit())).byteValue() + >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); + } else { + fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); + } + } else { + fieldValue = Integer.valueOf(fields & 0xff); + } + if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { + return fieldValue; + } + List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); + int i = 0; + //字节归并到一起=>继续根据规则进行判断 + while (i < ruleMapList.size()) { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(null) + .value(fieldValue) + .ruletypeId(ruletypeId).build(); + fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); + i++; + } + System.out.println(JSON.toJSON(fieldValue)); + return fieldValue; + } catch (RuntimeException ex) { + log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); + return null; + } + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java deleted file mode 100644 index 35ae3d0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java +++ /dev/null @@ -1,183 +0,0 @@ -package com.casic.missiles.parser.resolver.fields; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufAllocator; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; -import org.springframework.util.ObjectUtils; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service("standard") -@AllArgsConstructor -@Slf4j -public class StandardFieldParser implements FieldParser { - - private final FieldConfigDao fieldConfigDao; - private final FieldResolver fieldResolver; - - //数据解析 - @Override - public Map dataParser(RuleConfig ruleConfig, String lightText, String protocolId) { - String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); - ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); - bufferContent.writeBytes(lightText.getBytes(Charset.forName("ISO-8859-1"))); - Map dataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - for (String dataFieldId : dataFieldIds) { - FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(dataFieldId); - if (!ObjectUtils.isEmpty(fieldConfig)) { - dataMap.put(fieldConfig.getFieldName(), String.valueOf(fieldResolver.filedParserManger(bufferContent, fieldConfig, maxFixedPosition))); - } - } - return dataMap; - } - - //数据解析 - @Override - public Map fixDataParser(String protocolId, ByteBuf buffer) { - List dataFieldIdList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Map dataMap = new HashMap<>(); - for (FieldConfig dataField : dataFieldIdList) { - if (!ObjectUtils.isEmpty(dataField.getOrignPosition())) { - Object fieldValue = (Integer) fieldResolver.filedParserManger(buffer, dataField, null); - dataMap.put(dataField.getFieldName(), fieldValue); - } - } - return dataMap; - } - - @Override - public Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf) { - if (ByteBufUtil.hexDump(byteBuf).equals("")) { - return 0; - } - String filterFields = protocolConfig.getTotalLengthFilterField(); - Integer totalLength = 0; - try { - FieldConfig totalFieldConfig = fieldConfigDao.getFieldConfigById(protocolConfig.getTotalLengthId()); - int totalFilterLength = 0; - if (!StringUtils.isEmpty(filterFields)) { - String[] filterFieldList = filterFields.split(","); - for (String filterField : filterFieldList) { - FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(filterField); - //这里都是按字节计算,没有对位进行区分,可能会出现错误 - - // 如果对位有需求,需要进一步跟进 - totalFilterLength += fieldConfig.getOffsetLength(); - } - } - totalLength = (Integer) fieldResolver.filedParserManger(byteBuf, totalFieldConfig, null) + totalFilterLength; - } catch (Exception ex) { - log.error("报文确认分发阶段,获取报文总长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); - } - return totalLength; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer) { - //业务内容 - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - String protocolId = String.valueOf(protocolConfig.getId()); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - //计算固定长度 - Integer fixedLength = calculateLength(fieldConfigList); -// Integer totalLength = this.getTotalLength(protocolConfig, buffer); - //总长度获取 - Integer totalLength = lightText.length(); - //计算固定长度最大长度 - Integer maxFixedPosition = calculatePosition(fieldConfigList); -// buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - //计算数据报文内容 - ByteBuf bizDataFields = buffer.slice(maxFixedPosition-1, (totalLength - fixedLength)); - return bizDataFields; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer) { - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - String protocolId = String.valueOf(protocolConfig.getId()); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer fixedLength = calculateLength(fieldConfigList); -// Integer totalLength = this.getTotalLength(protocolConfig, buffer); - Integer totalLength = lightText.length(); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - ByteBuf fixDataFields = buffer.slice(0, maxFixedPosition); - return fixDataFields; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer) { - String protocolId = String.valueOf(protocolConfig.getId()); - Map fixedPropertyMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer fixedLength = calculateLength(fieldConfigList); - Integer totalLength = this.getTotalLength(protocolConfig, buffer); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - fixedPropertyMap.put("fixedPosition", maxFixedPosition); - fixedPropertyMap.put("totalLength", totalLength); - fixedPropertyMap.put("tailPosition", totalLength - fixedLength + maxFixedPosition); - return fixedPropertyMap; - } - - //分别计算bit和byte长度=> 合并长度 - private Integer calculateLength(List fieldConfigList) { - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (FieldConfig fieldConfig : fieldConfigList) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - Integer fixedLength = bytefixedLength + bitfixedLength / 8; - return fixedLength; - } - - //找到最大值=> 根据最大值计算业务数据下标 - private Integer calculatePosition(List fieldConfigList) { - String rex = "[0-9]+"; - Integer max = -1; - for (FieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOrignPosition()) - && Integer.valueOf(fieldConfig.getOrignPosition()) > max) { - max = Integer.valueOf(fieldConfig.getOrignPosition()); - } - } - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (FieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOrignPosition()) && fieldConfig.getOrignPosition().equals(max)) { - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - } - } - Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; - return maxFixedPosition; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java new file mode 100644 index 0000000..d4ec6c7 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java @@ -0,0 +1,76 @@ +package com.casic.missiles.parser.rule; + +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import org.apache.commons.lang3.StringUtils; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class GenericRuleResolver { + + //根据前置字段的值,找到指定的规则 + //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 + //=>循环判断=>通过规则得到业务字段 + public static RuleConfig machRule(Map fixDataMap, + String ids, + List protocolFieldConfigs, + List ruleConfigs) { + List preRuleConfigList = getPreRuleList(ids, protocolFieldConfigs); + //获取前置规则字段 + final Map metaDataMap = getPreRuleFields(preRuleConfigList, fixDataMap); + //准备固定的字段集合 + Map fixDataFieldMap = getFixDataFieldMap(protocolFieldConfigs); + return RuleResolverCore.doMachRule(ruleConfigs, metaDataMap, fixDataMap, fixDataFieldMap); + } + + private static Map getFixDataFieldMap(List protocolFieldConfigs) { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, ProtocolFieldConfig::getFieldName) + ); + return fixDataFieldMap; + } + + + /** + * 查询前置规则的字段配置 + * + * @param ids + * @return + */ + private static List getPreRuleList(String ids, List protocolFieldConfigs) { + String[] idList = ids.split(","); + Map prepareMaps = new HashMap<>(); + for (String id : idList) { + if (StringUtils.isNotEmpty(id)) { + prepareMaps.put(Long.valueOf(id), ""); + } + } + List preRuleConfigList = protocolFieldConfigs + .stream() + .filter(e -> prepareMaps.containsKey(e.getId())) + .collect(Collectors.toList()); + return preRuleConfigList; + } + + /** + * 获取前置规则解析字段 + */ + private static Map getPreRuleFields(List preRuleFieldConfigList, Map fixDataMap) { + Map ruleFieldMap = new HashMap<>(); + preRuleFieldConfigList.stream() + .forEach( + preRuleFieldConfig -> { + String fieldName = preRuleFieldConfig.getFieldName(); + if (fixDataMap.containsKey(fieldName)) { + ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); + } + } + ); + return ruleFieldMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java new file mode 100644 index 0000000..baae7e8 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -0,0 +1,68 @@ +package com.casic.missiles.parser.rule; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.casic.missiles.pojo.RuleConfig; + +import java.util.*; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleResolverCore { + + + public static RuleConfig doMachRule(List ruleConfigList, Map metaDataMap, + Map fixDataMap, + Map fixDataFieldMap) { + Optional ruleConfigOptional = ruleConfigList.stream() + .filter(ruleConfig -> machRuleConfig( + JSON.parseObject(ruleConfig.getMatchRuleJson(), Map.class), metaDataMap)) + .findFirst(); + if (ObjectUtil.isEmpty(ruleConfigOptional)) { + return null; + } + String[] ruleFields = ruleConfigOptional.get().getDataFieldIds().split(","); + Map ruleMetaDataMap = getRuleFields(ruleFields, fixDataMap, fixDataFieldMap); + //递归选定解析规则,进行规则解析 + if (!ruleConfigOptional.get().getIsFinishMatch().equals("1")) { + //递归选定规则 + doMachRule(ruleConfigList, ruleMetaDataMap, fixDataMap, fixDataFieldMap); + } + return ruleConfigOptional.get(); + } + + + private static Map getRuleFields(String[] preRuleConfigList, Map fixedDataMap, + Map fixedFieldMap) { + Map ruleFieldMap = new HashMap<>(); + for (String preRuleConfigId : preRuleConfigList) { + String fieldName = fixedFieldMap.get(preRuleConfigId); + if (fixedDataMap.containsKey(fieldName)) { + ruleFieldMap.put(fieldName, String.valueOf(fixedDataMap.get(fieldName))); + } + } + return ruleFieldMap; + } + + + //匹配规则配置 + private static Boolean machRuleConfig(Map ruleMap, Map metaDataMap) { + if (ruleMap == null || metaDataMap == null) { + return null; + } + //所有的字段在规则里面必须有有配置 + for (String key : metaDataMap.keySet()) { + if (ruleMap.containsKey(key)) { + if (!ruleMap.get(key).equals(metaDataMap.get(key))) { + return false; + } + } else { + return false; + } + } + return true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java deleted file mode 100644 index 664088d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java +++ /dev/null @@ -1,92 +0,0 @@ -package com.casic.missiles.parser.rule; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.mapper.dao.PreRuleConfigDao; -import com.casic.missiles.mapper.dao.RuleConfigDao; -import lombok.AllArgsConstructor; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.*; -import java.util.stream.Collectors; - -@Service -@AllArgsConstructor -public class RulerProvider { - - private final FieldConfigDao fieldConfigDao; - private final PreRuleConfigDao preRuleConfigDao; - private final RuleConfigDao ruleConfigDao; - - //根据前置字段的值,找到指定的规则 - //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 - //=>循环判断=>通过规则得到业务字段 - public RuleConfig ruleConfig(Map fixDataMap, String protocolId) { - //批量获取规则 - List preRuleConfigList = preRuleConfigDao.getPreRuleList(protocolId); - //获取固定字段 - Map fixFieldMap = getAllFieldMap(protocolId); - //获取前置规则字段 - final String preRuleFields = getPreRuleFields(preRuleConfigList, fixDataMap, fixFieldMap); - List ruleConfigList = ruleConfigDao.getRuleConfigById(protocolId); - Optional ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig ->preRuleFields.equals( ruleConfig.getParseRuleJson())).findFirst(); - //递归选定解析规则,进行规则解析 - while (!ObjectUtil.isEmpty(ruleConfigOptional) && !ruleConfigOptional.get().getIsBizField().equals("1")) { - String ruleFields = getRuleFields(ruleConfigOptional.get().getDataFieldIds().split(","), fixDataMap, fixFieldMap); - ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig -> ruleConfig.getParseRuleJson().equals(ruleFields)).findFirst(); - } - return ruleConfigOptional.get(); - } - - /** - * 获取前置规则解析字段 - */ - private String getPreRuleFields(List preRuleConfigList, Map fixDataMap, Map fixFieldMap) { - Map ruleFieldMap= new HashMap<>(); - preRuleConfigList.stream() - .forEach( - preRuleConfig -> { - String fieldName = fixFieldMap.get(Long.valueOf(preRuleConfig.getRuleFieldId())); - if (fixDataMap.containsKey(fieldName)) { - ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); - } - } - ); - return JSONObject.toJSONString(ruleFieldMap); - } - - private Map getAllFieldMap(String protocolId) { - List fieldList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Map fixFieldMap = fieldList.stream().collect( - Collectors.toMap(FieldConfig::getId, FieldConfig::getFieldName) - ); - return fixFieldMap; - } - - private String getRuleFields(String[] preRuleConfigList, Map fixDataMap, Map fixFieldMap) { - Map ruleFieldMap= new HashMap<>(); - for (String preRuleConfigId : preRuleConfigList) { - String fieldName = fixFieldMap.get(preRuleConfigId); - if (fixDataMap.containsKey(fieldName)) { - ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); - } - } - return JSONObject.toJSONString(ruleFieldMap); - } - - //弃置 - private String ListToString(List ruleFieldList) { - String ruleFields = ""; - for (String ruleField : ruleFieldList) { - ruleFields += ruleField + ","; - } - ruleFields = StringUtils.isEmpty(ruleFields) ? ruleFields : ruleFields.substring(0, ruleFields.length() - 1); - return ruleFields; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java index 6177e10..bfa87a5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java @@ -2,7 +2,7 @@ public interface SafeStrategy { - String decryption(byte[] bytes); + String decryption(String cipher); String encryption(String lightText); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java index 618716c..6236302 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java @@ -9,9 +9,9 @@ //十六进制的字符串转换成字节数组 byte[] bytes = hexStrToBinaryStr(msg); //计算CRC8 - byte crc8 = CRC8(bytes, 0, bytes.length); - String crc8ToStr = "" + Integer.toHexString(0xff & crc8); - return crc8ToStr; +// String crc8ToStr = "" + Integer.toHexString(0xff & crc8); +// return crc8ToStr; + return null; } /** @@ -33,50 +33,5 @@ return bytes; } - /** - * CRC8 校验 多项式 x8+x2+x+1 - * - * @param b - * @param off - * @param len - * @return - */ - public static byte CRC8(final byte[] b, final int off, final int len) { - byte result = 0x00; - for (int i = 0; i < len; i++) { - result = CHECKSUM_TABLE[(result ^ (b[i + off] & 0xFF)) & 0xFF]; - } - return (byte) (result & 0xFFL); - } - - private final static byte[] CHECKSUM_TABLE = {(byte) 0x00, (byte) 0x07, (byte) 0x0e, (byte) 0x09, (byte) 0x1c, (byte) 0x1b, - (byte) 0x12, (byte) 0x15, (byte) 0x38, (byte) 0x3f, (byte) 0x36, (byte) 0x31, (byte) 0x24, (byte) 0x23, (byte) 0x2a, - (byte) 0x2d, (byte) 0x70, (byte) 0x77, (byte) 0x7e, (byte) 0x79, (byte) 0x6c, (byte) 0x6b, (byte) 0x62, (byte) 0x65, - (byte) 0x48, (byte) 0x4f, (byte) 0x46, (byte) 0x41, (byte) 0x54, (byte) 0x53, (byte) 0x5a, (byte) 0x5d, (byte) 0xe0, - (byte) 0xe7, (byte) 0xee, (byte) 0xe9, (byte) 0xfc, (byte) 0xfb, (byte) 0xf2, (byte) 0xf5, (byte) 0xd8, (byte) 0xdf, - (byte) 0xd6, (byte) 0xd1, (byte) 0xc4, (byte) 0xc3, (byte) 0xca, (byte) 0xcd, (byte) 0x90, (byte) 0x97, (byte) 0x9e, - (byte) 0x99, (byte) 0x8c, (byte) 0x8b, (byte) 0x82, (byte) 0x85, (byte) 0xa8, (byte) 0xaf, (byte) 0xa6, (byte) 0xa1, - (byte) 0xb4, (byte) 0xb3, (byte) 0xba, (byte) 0xbd, (byte) 0xc7, (byte) 0xc0, (byte) 0xc9, (byte) 0xce, (byte) 0xdb, - (byte) 0xdc, (byte) 0xd5, (byte) 0xd2, (byte) 0xff, (byte) 0xf8, (byte) 0xf1, (byte) 0xf6, (byte) 0xe3, (byte) 0xe4, - (byte) 0xed, (byte) 0xea, (byte) 0xb7, (byte) 0xb0, (byte) 0xb9, (byte) 0xbe, (byte) 0xab, (byte) 0xac, (byte) 0xa5, - (byte) 0xa2, (byte) 0x8f, (byte) 0x88, (byte) 0x81, (byte) 0x86, (byte) 0x93, (byte) 0x94, (byte) 0x9d, (byte) 0x9a, - (byte) 0x27, (byte) 0x20, (byte) 0x29, (byte) 0x2e, (byte) 0x3b, (byte) 0x3c, (byte) 0x35, (byte) 0x32, (byte) 0x1f, - (byte) 0x18, (byte) 0x11, (byte) 0x16, (byte) 0x03, (byte) 0x04, (byte) 0x0d, (byte) 0x0a, (byte) 0x57, (byte) 0x50, - (byte) 0x59, (byte) 0x5e, (byte) 0x4b, (byte) 0x4c, (byte) 0x45, (byte) 0x42, (byte) 0x6f, (byte) 0x68, (byte) 0x61, - (byte) 0x66, (byte) 0x73, (byte) 0x74, (byte) 0x7d, (byte) 0x7a, (byte) 0x89, (byte) 0x8e, (byte) 0x87, (byte) 0x80, - (byte) 0x95, (byte) 0x92, (byte) 0x9b, (byte) 0x9c, (byte) 0xb1, (byte) 0xb6, (byte) 0xbf, (byte) 0xb8, (byte) 0xad, - (byte) 0xaa, (byte) 0xa3, (byte) 0xa4, (byte) 0xf9, (byte) 0xfe, (byte) 0xf7, (byte) 0xf0, (byte) 0xe5, (byte) 0xe2, - (byte) 0xeb, (byte) 0xec, (byte) 0xc1, (byte) 0xc6, (byte) 0xcf, (byte) 0xc8, (byte) 0xdd, (byte) 0xda, (byte) 0xd3, - (byte) 0xd4, (byte) 0x69, (byte) 0x6e, (byte) 0x67, (byte) 0x60, (byte) 0x75, (byte) 0x72, (byte) 0x7b, (byte) 0x7c, - (byte) 0x51, (byte) 0x56, (byte) 0x5f, (byte) 0x58, (byte) 0x4d, (byte) 0x4a, (byte) 0x43, (byte) 0x44, (byte) 0x19, - (byte) 0x1e, (byte) 0x17, (byte) 0x10, (byte) 0x05, (byte) 0x02, (byte) 0x0b, (byte) 0x0c, (byte) 0x21, (byte) 0x26, - (byte) 0x2f, (byte) 0x28, (byte) 0x3d, (byte) 0x3a, (byte) 0x33, (byte) 0x34, (byte) 0x4e, (byte) 0x49, (byte) 0x40, - (byte) 0x47, (byte) 0x52, (byte) 0x55, (byte) 0x5c, (byte) 0x5b, (byte) 0x76, (byte) 0x71, (byte) 0x78, (byte) 0x7f, - (byte) 0x6a, (byte) 0x6d, (byte) 0x64, (byte) 0x63, (byte) 0x3e, (byte) 0x39, (byte) 0x30, (byte) 0x37, (byte) 0x22, - (byte) 0x25, (byte) 0x2c, (byte) 0x2b, (byte) 0x06, (byte) 0x01, (byte) 0x08, (byte) 0x0f, (byte) 0x1a, (byte) 0x1d, - (byte) 0x14, (byte) 0x13, (byte) 0xae, (byte) 0xa9, (byte) 0xa0, (byte) 0xa7, (byte) 0xb2, (byte) 0xb5, (byte) 0xbc, - (byte) 0xbb, (byte) 0x96, (byte) 0x91, (byte) 0x98, (byte) 0x9f, (byte) 0x8a, (byte) 0x8d, (byte) 0x84, (byte) 0x83, - (byte) 0xde, (byte) 0xd9, (byte) 0xd0, (byte) 0xd7, (byte) 0xc2, (byte) 0xc5, (byte) 0xcc, (byte) 0xcb, (byte) 0xe6, - (byte) 0xe1, (byte) 0xe8, (byte) 0xef, (byte) 0xfa, (byte) 0xfd, (byte) 0xf4, (byte) 0xf3}; } \ No newline at end of file diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java index 27c2838..6e078a3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java @@ -1,9 +1,6 @@ package com.casic.missiles.parser.safe.impl; -import cn.hutool.core.util.CharsetUtil; -import cn.hutool.crypto.symmetric.SM4; -import cn.hutool.crypto.symmetric.SymmetricCrypto; - +import com.casic.missiles.parser.safe.SafeStrategy; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; @@ -11,19 +8,44 @@ import org.bouncycastle.crypto.engines.SM4Engine; import org.bouncycastle.crypto.params.KeyParameter; import org.bouncycastle.util.encoders.Hex; - -import static cn.hutool.crypto.Mode.ECB; -import static cn.hutool.crypto.Padding.NoPadding; +import org.springframework.stereotype.Component; /** * SM4算法工具类 */ @Slf4j -public class Sm4 { +@Component("sm4") +public class Sm4 implements SafeStrategy { //加解密的字节快大小 public static final int BlockSize = 16; + @Override + public String decryption(String cipher) { + byte[] keyByte = { + 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 + }; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(keyByte); + byte[] in = Hex.decode(cipher); + byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); + String plain = EcbDecrypt(in, keyBytes); + return plain; + } + + @Override + public String encryption(String cipher) { + byte[] keyByte = { + 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 + }; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(keyByte); + byte[] in = Hex.decode(cipher); + byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); + String plain = EcbDecrypt(in, keyBytes); + return plain; + } + /** * SM4ECB加密算法,对内 * @@ -32,8 +54,6 @@ * @return */ private static byte[] ecb_encrypt(byte[] in, byte[] keyBytes) { - - SM4Engine sm4Engine = new SM4Engine(); sm4Engine.init(true, new KeyParameter(keyBytes)); byte[] out = new byte[in.length]; @@ -58,27 +78,6 @@ return cipher; } - - /** - * hutool 解密SM4 - * - * @param encodeContent - * @return - */ - public static String decode(String encodeContent) { - String key = "24ad182507479a5da3ad94d9d78ea203"; - try { - SymmetricCrypto sm4 = new SM4(ECB, NoPadding, key.getBytes()); - String decryptStr = sm4.decryptStr(encodeContent, CharsetUtil.CHARSET_UTF_8); - return decryptStr; - } catch (Exception e) { - e.printStackTrace(); - log.error("SM4解密失败"); - } - return null; - } - - /** * SM4的ECB加密算法 * @@ -129,20 +128,6 @@ return plain; } - /** - * SM4的ECB解密算法 - * - * @param cipher 输入的密文字符串 - * @param key 密钥 - * @return - */ - public static String EcbDecrypt(String cipher, String key) { - byte[] in = Hex.decode(cipher); - byte[] keyBytes = Hex.decode(key); - - String plain = EcbDecrypt(in, keyBytes); - return plain; - } /** * 主函数 @@ -151,28 +136,24 @@ */ public static void main(String[] args) { byte[] ciphertext = { + 0x4B, (byte) 0x8C, (byte) 0x9D, 0x08, (byte) 0xE4, (byte) 0xD3, 0x64, 0x42, (byte) 0xB9, (byte) 0xA5, (byte) 0xFE, (byte) 0xCD, (byte) 0x91, 0x1B, 0x38, (byte) 0xAC, (byte) 0xE9, 0x1C, (byte) 0xCD, 0x53, 0x02, (byte) 0xD7, 0x0C, (byte) 0x9B, (byte) 0x96, 0x30, 0x62, (byte) 0xE8, (byte) 0xFB, (byte) 0xEF, (byte) 0xB9, (byte) 0xFF, (byte) 0xDE, 0x19, (byte) 0x80, 0x35, 0x3E, (byte) 0x90, 0x4F, 0x2F, 0x12, 0x2B, 0x19, (byte) 0x8B, 0x6C, 0x7A, (byte) 0x85, (byte) 0xA1, (byte) 0xB1, (byte) 0x86, (byte) 0xA3, 0x7A, 0x46, 0x0C, 0x2F, (byte) 0x94, 0x4F, 0x7F, 0x2C, 0x56, 0x14, (byte) 0xF3, (byte) 0x89, (byte) 0xC3, - 0x3F, 0x20, (byte) 0xF9, (byte) 0x87, (byte) 0xA1, 0x60, (byte) 0xD9, (byte) 0xA8, (byte) 0xFD, (byte) 0xD7, (byte) 0x9B, 0x4B, 0x26, 0x06, 0x30, 0x44}; + 0x3F, 0x20, (byte) 0xF9, (byte) 0x87, (byte) 0xA1, 0x60, (byte) 0xD9, (byte) 0xA8, (byte) 0xFD, (byte) 0xD7, (byte) 0x9B, 0x4B, 0x26, 0x06, 0x30, 0x44 + }; ByteBuf in = ByteBufAllocator.DEFAULT.heapBuffer(); in.writeBytes(ciphertext); - byte[] keyByte = { 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 }; ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); - key.writeBytes(ciphertext); - String resCipherData = decode(ByteBufUtil.hexDump(in)); - ByteBuf out = ByteBufAllocator.DEFAULT.heapBuffer(); -// out.writeBytes(resCipherData); -// System.out.println(hexBytes); - System.out.println(resCipherData.toString()); -// String resPlainData = EcbDecrypt(resCipherData, key); -// System.out.println("原始明文:" + data); -// System.out.println("解密后明文:" + resPlainData); + key.writeBytes(keyByte); +// String resCipherData = EcbDecrypt(ByteBufUtil.hexDump(in), ByteBufUtil.hexDump(key)); +// System.out.println(resCipherData); } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java index 1395a51..ac5f957 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java @@ -1,7 +1,7 @@ package com.casic.missiles.parser.safe.impl; import io.netty.buffer.ByteBufUtil; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** *

@@ -14,9 +14,8 @@ * @author hyl * @version v1.0: Tea.java, v 0.1 2021/3/12 13:48 $ */ -@Service("tea") -///tea算法类 - +//tea算法类 +@Component("tea") public class Tea { public static byte[] MyTea_Encrypt(byte[] MyTeaContent, int ByteLen, byte[] MyTeakey) { @@ -99,7 +98,6 @@ // for(int i32Index = 0; i32Index < 8; i32Index++) { // System.out.print("0x" + Integer.toHexString(MyContent[i32Index]) + " "); // } - // System.out.println("密钥为:"); // for(int i32Index = 0; i32Index < 16; i32Index++) { // System.out.print("0x" + Integer.toHexString(MyKeys[i32Index]) + " "); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java index bdd0721..bd1516a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java @@ -3,7 +3,7 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.parser.sender.DataSubscribeProvider; import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponents; import org.springframework.web.util.UriComponentsBuilder; @@ -12,7 +12,7 @@ import java.util.Collections; import java.util.Map; -@Service("functionCallback") +@Component("functionCallback") public class FunctionCallback implements DataSubscribeProvider { @Resource diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java index 0b44fb9..7526de2 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.Map; -@Service("middleware") +@Component("middleware") public class MiddlewareSubscribe implements DataSubscribeProvider { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java index 5dcee3f..e2f1192 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.Map; -@Service("nosql") +@Component("nosql") public class NoSqlSubscribe implements DataSubscribeProvider { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java b/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java new file mode 100644 index 0000000..81a5324 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java @@ -0,0 +1,86 @@ +package com.casic.missiles.pojo; + +import lombok.Data; + +/** + * 协议 + */ +@Data +public class Msg { + + /** + * 前导码 + */ + private String preamble; + + /** + * 版本号 + */ + private String version; + + /** + * 内容长度 + */ + private int leng; + + /** + * 设备ID + */ + private String deviceId; + + /** + * 通讯方式 + */ + private Integer connType; + + /** + * 加密方式 + */ + private Integer encryType; + + /** + * 目标地址 + */ + private String destAddr; + + /** + * PDUType + */ + private String PDUType; + + /** + * 操作类型 + */ + private Integer operateType; + + /** + * 传输控制位 PDUType.bit7=0时,表示存在后续的访问;当PDUType.bit7=1时,表示无后续的访问。 + */ + private Integer transControlFlag; + + /** + * 设备类型 + */ + private Integer deviceType; + + /** + * 序号 + */ + private Integer seq; + + /** + * tagList + */ + private String tagList; + + /** + * OidList + */ + private String OidList; + + /** + * CRC + */ + private String CRC; + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java index 40a5265..97cc984 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java @@ -40,7 +40,7 @@ String httpContent = msg.toString(Charset.defaultCharset()); log.info(" String : " + msg.toString(Charset.defaultCharset())); String majorContent = httpContent.substring(httpContent.indexOf("{"), httpContent.lastIndexOf("}") + 1); - String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("serviceData")).get("Value")); + String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("RegistryData")).get("Value")); log.info("----------------------------------" + values); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); bufferContent.writeBytes(values.getBytes(Charset.forName("ISO-8859-1"))); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java index 1b132a7..e3ced4b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java @@ -35,7 +35,7 @@ String httpContent = msg.toString(Charset.defaultCharset()); log.info(" String : " + msg.toString(Charset.defaultCharset())); String majorContent = httpContent.substring(httpContent.indexOf("{"), httpContent.lastIndexOf("}") + 1); - String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("serviceData")).get("Value")); + String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("RegistryData")).get("Value")); log.info("----------------------------------" + values); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); bufferContent.writeBytes(values.getBytes(Charset.forName("ISO-8859-1"))); diff --git a/sensorhub-core/src/main/resources/application.properties b/sensorhub-core/src/main/resources/application.properties deleted file mode 100644 index 8b13789..0000000 --- a/sensorhub-core/src/main/resources/application.properties +++ /dev/null @@ -1 +0,0 @@ - diff --git a/sensorhub-core/src/main/resources/config/application-dev.yml b/sensorhub-core/src/main/resources/config/application-dev.yml index 4f897a8..dcc4c2d 100644 --- a/sensorhub-core/src/main/resources/config/application-dev.yml +++ b/sensorhub-core/src/main/resources/config/application-dev.yml @@ -4,9 +4,9 @@ spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true + url: jdbc:mysql://127.0.0.1:3306/sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true username: root - password: Casic203 + password: root session: store-type: redis redis: diff --git a/sensorhub-core/src/main/resources/config/application.yml b/sensorhub-core/src/main/resources/config/application.yml index ae89f9d..7965da1 100644 --- a/sensorhub-core/src/main/resources/config/application.yml +++ b/sensorhub-core/src/main/resources/config/application.yml @@ -30,6 +30,13 @@ port: 6379 password: ew5T4K3#203lwh config-prefix: 'Casic:' +#代码生成器配置 +code: + generate: + #作者 + author: cz + #待生成对象表名 + table-name: bussiness_field_config,combined_field_config sensorhub: config: port: 7091 diff --git a/sensorhub-support/pom.xml b/sensorhub-support/pom.xml index 9a71296..761601c 100644 --- a/sensorhub-support/pom.xml +++ b/sensorhub-support/pom.xml @@ -42,6 +42,12 @@ ${redis.version} + + com.baomidou + mybatis-plus-generator + ${mybatis-plus-generator.version} + + org.reflections diff --git a/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java b/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java new file mode 100644 index 0000000..515ca53 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java @@ -0,0 +1,14 @@ +package com.casic.missiles.enums; + +/** + * @author + * @date + */ +public interface FixedPropertyEnum { + + String FIXED_POSITION = "fixedPosition"; + + String TOTAL_LENGTH = "totalLength"; + + String TAIL_POSITION = "tailPosition"; +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/CombinedFieldMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CombinedFieldMapper.java new file mode 100644 index 0000000..38e8f42 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CombinedFieldMapper.java @@ -0,0 +1,15 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.CombinedFieldConfig; +import org.apache.ibatis.annotations.Mapper; + +/** + * @author cz + * + */ +@Mapper +public interface CombinedFieldMapper extends BaseMapper { + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java new file mode 100644 index 0000000..128b09d --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java @@ -0,0 +1,10 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.CommandEventConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface CommandEventMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java new file mode 100644 index 0000000..042eb3c --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.DatagramEventConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface DatagramEventConfigMapper extends BaseMapper { +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java new file mode 100644 index 0000000..fc95cf4 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java @@ -0,0 +1,8 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.FieldConfig; + +public interface FieldConfigMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldRuleConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldRuleConfigMapper.java new file mode 100644 index 0000000..b310a08 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldRuleConfigMapper.java @@ -0,0 +1,10 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.FieldRuleConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface FieldRuleConfigMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java new file mode 100644 index 0000000..9060a69 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.ProtocolConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface ProtocolConfigMapper extends BaseMapper { +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolFieldConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolFieldConfigMapper.java new file mode 100644 index 0000000..1b47180 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolFieldConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +public interface ProtocolFieldConfigMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java new file mode 100644 index 0000000..6fa6936 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.RuleConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface RuleConfigMapper extends BaseMapper { +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java index 608af3a..32cc8a4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java @@ -2,48 +2,47 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.delivery.decorator.ByteDecorator; +import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @AllArgsConstructor public class FieldDecoratorManger { - private final RuleDictDao ruleDictDao; + private final RuleConfigRegistry ruleDictDao; // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 // (1)静态的业务字段是字典里面可以配置的 // (2)动态的业务字段是通过规则生成的 public String contentMerge(String ruleJson, String sceneConent, String dynamicContent) { - List ruleDictList = ruleDictDao.getRuleDictConfig(); - Map ruleDictMap = ruleDictList.stream().collect( - Collectors.toMap(RuleDict::getId, e -> e)); - List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); - for (Map ruleMap : ruleMapList) { - String ruleType = String.valueOf(ruleMap.get("ruleType")); - ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); - NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); - byteDecorator.nodeDecoratorRule(nodeDecoratorParm); - } +// List ruleDictList = ruleDictDao.getRuleDictConfig(); +// Map ruleDictMap = ruleDictList.stream().collect( +// Collectors.toMap(RuleDict::getId, e -> e)); +// List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); +// for (Map ruleMap : ruleMapList) { +// String ruleType = String.valueOf(ruleMap.get("ruleType")); +// ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); +// NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); +// byteDecorator.nodeDecoratorRule(nodeDecoratorParm); +// } return null; } - - private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { - NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() - .contents(sceneConent) - .dynamicContent(dynamicContent) - .ruletypeId(ruletypeId) - .ruleDictMap(ruleDictMap) - .build(); - return nodeDecoratorParm; - } +// +// private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { +// NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() +// .contents(sceneConent) +// .dynamicContent(dynamicContent) +// .ruletypeId(ruletypeId) +// .ruleDictMap(ruleDictMap) +// .build(); +// return nodeDecoratorParm; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java index 652970c..b204ac3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java @@ -1,56 +1,56 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@AllArgsConstructor -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", - JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Component; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Component("logicalDecorator") +//@AllArgsConstructor +//@Slf4j +//public class LogicalShiftDecorator implements ByteDecorator { +// +//// private final FieldRuleEngineMapper fieldRuleEngineMapper; +//// +//// //字节位移 +//// @Override +//// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +//// String logicalValue = ""; +//// RuleEvaluator fieldRuleEngine = new RuleEvaluator(); +//// try { +//// Map env2 = new HashMap(); +//// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +//// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +//// for (String contentId : contentIdList) { +//// RuleDict ruleDict = ruleDictMap.get(contentId); +//// if (ruleDict.getCode().contains("#")) { +//// //使用动态的值 +//// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +//// } +//// env2.put(ruleDict.getName(), ruleDict.getCode()); +//// } +//// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +//// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +//// return null; +//// } +//// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +//// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +//// return values; +//// } catch (Exception ex) { +//// log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", +//// JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +//// return null; +//// } +//// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java index 346468f..822fead 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@AllArgsConstructor -@Slf4j -public class OperationDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("optionDecorator") +//@AllArgsConstructor +//@Slf4j +//public class OperationDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //混合运算,有常量或者乘除的缩放 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java index 50fb0a7..7a8bccb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@AllArgsConstructor -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +////精度计算 +//@AllArgsConstructor +//@Registry("precisionDecorator") +//@Slf4j +//public class PrecisionDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java index da39235..27f9cc7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java @@ -1,54 +1,53 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@AllArgsConstructor -@Slf4j -public class RuleDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("ruleDecorator") +//@AllArgsConstructor +//@Slf4j +//public class RuleDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //吃我一套正则表达式 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (Exception ex) { +// log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java index 7f5cbf3..c043f97 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java @@ -2,6 +2,6 @@ import java.util.Map; -public interface ComandeEventService { +public interface ComandeEventService{ Map loadComandeEventConfig(String protocolId,String scene); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java index 476ad84..aaf1837 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java @@ -2,46 +2,46 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.dao.CommandEventDao; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @Slf4j @AllArgsConstructor -public class ComandeEventServiceImpl implements ComandeEventService { +public class ComandeEventServiceImpl implements ComandeEventRegistry { - private final CommandEventDao commandEventDao; + // private final CommandEventDao commandEventDao; // 加密bean 固定字段出现变化的字段解析,业务字段的有序内容 @Override - public Map loadComandeEventConfig(String protocolId,String sceneName) { - CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); - if (ObjectUtil.isEmpty(commandEventConfig)) { - log.error("协议{},没有配置成功接收回复配置,清排查原因"); - return null; - } - String replyJson = commandEventConfig.getReplyContentJson(); - List> replyMapList = JSONArray.parseObject(replyJson, List.class); - List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); - Map fixMap = fixList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); - List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) - .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) - .collect(Collectors.toList()); - Map commandConfigMap = new HashMap<>(); - commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); - commandConfigMap.put("fixContent", fixMap); - commandConfigMap.put("bizContent", contentList); - return commandConfigMap; + public Map loadComandeEventConfig(String protocolId, String sceneName) { +// CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); +// if (ObjectUtil.isEmpty(commandEventConfig)) { +// log.error("协议{},没有配置成功接收回复配置,清排查原因"); +// return null; +// } +// String replyJson = commandEventConfig.getReplyContentJson(); +// List> replyMapList = JSONArray.parseObject(replyJson, List.class); +// List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); +// Map fixMap = fixList.stream() +// .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); +// List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) +// .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) +// .collect(Collectors.toList()); +// Map commandConfigMap = new HashMap<>(); +// commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); +// commandConfigMap.put("fixContent", fixMap); +// commandConfigMap.put("bizContent", contentList); +// return commandConfigMap; + return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 128b09d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java deleted file mode 100644 index 4016b0b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface DatagramEventMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java deleted file mode 100644 index 597c306..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.apache.ibatis.annotations.Mapper; - -public interface FieldConfigMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java deleted file mode 100644 index a31680a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.PreRuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface PreRuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java deleted file mode 100644 index 9060a69..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface ProtocolConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java deleted file mode 100644 index 6fa6936..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java deleted file mode 100644 index 582a705..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleDict; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleDictMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java deleted file mode 100644 index 6e302c8..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.CommandEventMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Optional; - -@Component -public class CommandEventDao { - - @Resource - private CommandEventMapper commandEventMapper; - - public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId) - .eq("scene", sceneName) - .eq("enabled", 1); - List commandEventConfig = commandEventMapper.selectList(queryWrapper); - Optional optionalEventConfig = commandEventConfig.stream().findFirst(); - return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java deleted file mode 100644 index 9137e4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.FieldConfigMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class FieldConfigDao { - - @Resource - private FieldConfigMapper fieldConfigMapper; - - public FieldConfig getFieldConfigById(String fieldId) { - FieldConfig fieldConfig = fieldConfigMapper.selectById(fieldId); - return fieldConfig; - } - - public List getFieldConfigs(String protocolId,Integer isFixed) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",isFixed); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - - public List getStorageFieldConfig(String protocolId) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",1) - .eq("is_storage",1); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java deleted file mode 100644 index 67bff6b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.mapper.PreRuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class PreRuleConfigDao { - - @Resource - private PreRuleConfigMapper preRuleConfigMapper; - - public List getPreRuleList(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return preRuleConfigMapper.selectList(queryWrapper); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java deleted file mode 100644 index d69ea85..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.RuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleConfigDao { - - @Resource - private RuleConfigMapper ruleConfigMapper; - - public RuleConfig getNextRuleConfig(String ruleFields) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("parse_rule_json", ruleFields); - return ruleConfigMapper.selectOne(queryWrapper); - } - - - public List getRuleConfigById(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return ruleConfigMapper.selectList(queryWrapper); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java deleted file mode 100644 index 932c185..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.RuleDictMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleDictDao { - - @Resource - private RuleDictMapper ruleDictMapper; - - public List getRuleDictConfig() { - List ruleDictList = ruleDictMapper.selectList(null); - return ruleDictList; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java index 9f9e279..43bc4d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java @@ -10,20 +10,15 @@ import io.netty.channel.socket.nio.NioServerSocketChannel; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import javax.annotation.PreDestroy; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static cn.hutool.core.util.ClassUtil.getClasses; /** * SensorhubServer netty服务端 */ @Slf4j -@Service +@Component public class SensorhubServer { /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java index 2c79ff5..9a28c36 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java @@ -11,13 +11,13 @@ import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioSocketChannel; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClient 客户端 */ @Slf4j -@Service +@Registry public final class SensorhubClient { public static void main(String[] args) throws Exception { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java index 9774be0..477c3f7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java @@ -6,12 +6,12 @@ import io.netty.channel.socket.SocketChannel; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientChannelInitialHandler */ -@Service +@Registry public class SensorhubClientChannelInitialHandler extends ChannelInitializer { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java index 346f4b3..73560e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java @@ -5,13 +5,13 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientHandler */ @Slf4j -@Service +@Registry public class SensorhubClientHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java index 5c1c6f2..d990af5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java @@ -4,12 +4,12 @@ import com.casic.missiles.pojo.Msg; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** * SensorhubServerHandler */ -@Service +@Component public class SensorhubServerHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 67283ae..af3172c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,41 +1,37 @@ package com.casic.missiles.parser; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultProtocolConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.*; +import com.casic.missiles.registry.FieldConfigRegistry; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; -import java.nio.charset.Charset; import java.util.HashMap; import java.util.List; import java.util.Map; -@Service("genericProtocolParser") +/** + * @author + */ +@Component("genericProtocolParser") @Slf4j -@AllArgsConstructor +@RequiredArgsConstructor public class GenericProtocolParser implements ProtocolParser { - private final LeadingCodeMatcher leadingCodeMatcher; private final List frameStructDispenserList; - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorInstanceSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; // 匹配首字母前导码=> 帧结构匹配前导码=> // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 @@ -44,18 +40,19 @@ public Boolean doParseProtocol(ByteBuf byteBuf) { String protocolContent = ByteBufUtil.hexDump(byteBuf); //匹配前导码 - List preCodeConfigs = leadingCodeMatcher.matchLeadingCode(protocolContent); + List preCodeConfigs = LeadingCodeMatcher.matchFrameLeadingCode(protocolContent); //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 if (preCodeConfigs.size() == 0) { - return rematch(byteBuf,protocolContent); + return rematch(byteBuf, protocolContent); } - //暂时先取第一个 + //暂时先取第一个,提升速度,使用享元模式, 减少类的创建销毁与构建 ProtocolConfig protocolConfig = preCodeConfigs.get(0); + AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); ByteBuf wholeDatagramByte = null; //通过匹配帧结构获取完整的数据包 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, preCodeConfigs.get(0))) != null) { + if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, protocolFactory)) != null) { break; } } @@ -68,76 +65,78 @@ * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 */ - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId, wholeDatagramByte); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap, protocolId); - //选取规则对应的流程实例 - DatagramEventConfig datagramEventConfig = processorInstanceSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); + //进行规则字段解析,进行匹配规则 + RuleConfig ruleConfig = getRuleConfig(protocolFactory, wholeDatagramByte); + if (ruleConfig == null) { + return false; + } //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, wholeDatagramByte); + ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte); + //以下进行业务的规则解析,同时选定流程实例 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); + DatagramEventProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain, + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText, protocolId); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain); //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); + datagramEventProvider.storeData(bizDataMap); return true; } - private Boolean rematch(ByteBuf byteBuf,String protocolContent) { + /** + * 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 + */ + private Boolean rematch(ByteBuf byteBuf, String protocolContent) { //重置位判断 byteBuf.resetReaderIndex(); //判断重置是否前移,如果没有前移,则直接判为匹配失败 if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { return false; } else { + //递归执行 return doParseProtocol(byteBuf); } } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; + //获取匹配规则->匹配规则 + private RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + //取出其中参与逻辑provider并判空 + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); + String rulePrepareFields = protocolConfig.getRulePrepareFields(); + //固定字段 + if (StringUtils.isNotEmpty(rulePrepareFields)) { + //获取统一固定字段解析 + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + //获取该协议的字段配置,用于协议规则匹配 + List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); + //获取规则 + RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, + rulePrepareFields, protocolFieldConfigs); + return ruleConfig; + } + return null; } - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + //数据构建,获取固定字段的store和业务字段store + private Map buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + Map bizDataMap = new HashMap<>(); + Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); + Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); + bizDataMap.putAll(ruleStoreObjectMap); + bizDataMap.putAll(protocolStoreObjectMap); return bizDataMap; } - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java index 8a46e32..16ce2e5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java @@ -3,6 +3,7 @@ import io.netty.buffer.ByteBuf; public interface ProtocolParser { + Boolean doParseProtocol(ByteBuf byteBuf); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java new file mode 100644 index 0000000..f7814af --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java @@ -0,0 +1,35 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.ProtocolConfigProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.ProtocolConfig; + +/** + * 存放基本协议的的加载信息 + */ +public class AbstractProtocolConfigFactory { + private final ProtocolConfigProvider protocolConfigProvider; + private final ProtocolFieldConfigProvider protocolFieldConfigProvider; + private final RuleConfigProvider ruleConfigProvider; + + public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { + this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); + this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); + this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); + } + + public ProtocolConfigProvider getProtocolConfigProvider() { + return protocolConfigProvider; + } + + public ProtocolFieldConfigProvider getProtocolFieldConfigProvider() { + return protocolFieldConfigProvider; + } + + public RuleConfigProvider getRuleConfigProvider() { + return ruleConfigProvider; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java new file mode 100644 index 0000000..6e36147 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java @@ -0,0 +1,57 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.CombinedFieldConfigProvider; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.FieldConfigProvider; +import com.casic.missiles.parser.provider.FieldRuleConfigProvider; + +/** + * 存放规则相关的的的加载信息 + */ +public class AbstractRuleConfigFactory { + + /** + * 处理字节 + */ + private final FieldConfigProvider fieldConfigProvider; + /** + * 处理组合字节解析的解码器 + */ + private final CombinedFieldConfigProvider combinedFieldConfigProvider; + /** + * 处理负责字节解析的规则配置 + */ + private final FieldRuleConfigProvider fieldRuleConfigProvider; + /** + * 处理实例流程 + */ + private final DatagramEventProvider datagramEventProvider; + + + public AbstractRuleConfigFactory(Long ruleId) { + this.fieldConfigProvider = new FieldConfigProvider(ruleId); + this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); + this.fieldRuleConfigProvider = new FieldRuleConfigProvider(ruleId); + this.datagramEventProvider = new DatagramEventProvider(ruleId); + } + + public FieldConfigProvider getFieldConfigProvider() { + return fieldConfigProvider; + } + + public CombinedFieldConfigProvider getCombinedFieldConfigProvider() { + return combinedFieldConfigProvider; + } + + public FieldRuleConfigProvider getFieldRuleConfigProvider() { + return fieldRuleConfigProvider; + } + + public DatagramEventProvider getDatagramEventProvider() { + return datagramEventProvider; + } + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java deleted file mode 100644 index 6e1719a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.factory; - - -import com.casic.missiles.pojo.ProtocolConfig; - -import java.util.List; - -/** - * 数据库访问优化(暂时未做) - *

- * 1、初始化协议解析配置,并存放到处存放缓存,对协议基本配置进行管理 - * 2、其中流程中所有的配置都经过此类进行管理,进行调用获取,增强解析速度 - */ -public interface DatagramFactory { - - /** - * 初始化 - */ - List datagramInit(); - - /** - * 根据前导码配置匹配,模糊匹配获取所有的报文项 - */ - List match(); - - /** - * 根据前导码匹配,返回报文项 - */ - List filer(); - - /** - * 保证数据的唯一性选择器 - */ - List selectOne(); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java new file mode 100644 index 0000000..87444a0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java @@ -0,0 +1,18 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +import java.util.List; + +/** + * 直接用,还是边用边创建 + */ +public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { + + + public DefaultProtocolConfigFactory(ProtocolConfig protocolConfig) { + super(protocolConfig); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java new file mode 100644 index 0000000..cce0c7c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java @@ -0,0 +1,12 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; + +public class DefaultRuleFactory extends AbstractRuleConfigFactory { + + public DefaultRuleFactory(Long ruleId) { + super(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java deleted file mode 100644 index 9ee97e0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.casic.missiles.parser.instance; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service -@Slf4j -@AllArgsConstructor -public class GeneralProcessor { - - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; - - /** - * 统一固定字段解析=>进行规则的查询的判断 - * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 - * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 - */ - @Deprecated - public boolean parseWholeDatagram(ByteBuf buffer, ProtocolConfig protocolConfig) { - try { - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap,protocolId); - //选取规则对应的流程= - DatagramEventConfig datagramEventConfig = processorSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); - //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); - //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); - //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); - //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); - //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); - return true; - } catch (Exception ex) { - log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", - ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); - return false; - } - } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; - } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); - } - - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); - return bizDataMap; - } - - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java index 25e7ad8..6a5777e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java @@ -1,23 +1,31 @@ package com.casic.missiles.parser.instance.impl; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.mapper.DatagramEventMapper; import com.casic.missiles.pojo.DatagramEventConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.SpringContextUtil; -@Service -@AllArgsConstructor +import java.util.List; +import java.util.Optional; + +/** + * @author cz + * + */ public class DefaultProcessorInstanceSelector implements ProcessorInstanceSelector { - private final DatagramEventMapper datagramEventMapper; + private static List datagramEventConfigs; + + static { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + datagramEventConfigs = datagramEventRegistry.getDatagramEventList(); + } @Override public DatagramEventConfig getProcessorInstance(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("rule_id", protocolId); - return datagramEventMapper.selectOne(queryWrapper); + Optional optionalSelectInstance = datagramEventConfigs.stream() + .filter(e -> e.getId().equals(protocolId)).limit(1).findFirst(); + return optionalSelectInstance.isPresent() ? optionalSelectInstance.get() : null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a778671..7b56a43 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,16 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import io.netty.buffer.ByteBuf; /** - * 分析匹配情况 - * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 - * 2、匹配不成功,有后续帧,可以进行下次匹配。 - * 3、匹配不成功,无后续帧,可以进行丢弃。 + * 分析匹配情况 + * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 + * 2、匹配不成功,有后续帧,可以进行下次匹配。 + * 3、匹配不成功,无后续帧,可以进行丢弃。 */ -public interface FrameStructMatcher{ +public interface FrameStructMatcher { - ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig); + ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 05320ab..8ebea78 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,23 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.ProtocolConfigMapper; +import com.casic.missiles.parser.provider.ProtocolConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Component; import java.util.List; import java.util.stream.Collectors; -@Component -@AllArgsConstructor public class LeadingCodeMatcher { - private final ProtocolConfigMapper protocolMapper; - //** 1、首字母匹配前导码, // 2、以匹配出的前导码是否在报文中条件进行前导码的匹配二次筛选 - public List matchLeadingCode(String protocolContent){ + public static List matchFrameLeadingCode(String protocolContent){ List initialConfigs = initialMatch(protocolContent); List preCodeConfigs = initialConfigs.stream() .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) @@ -26,13 +19,16 @@ } //初始化匹配前导码内容 - private List initialMatch(String protocolContent) { - String protocolStr = protocolContent.charAt(0) + ""; - QueryWrapper queryWrapper = new QueryWrapper() - .likeRight("pre_fix", protocolStr); - List protocolConfigList = protocolMapper.selectList(queryWrapper); - return protocolConfigList; + private static List initialMatch(String protocolContent) { + String firstFrameChar = protocolContent.charAt(0) + ""; + ProtocolConfigProvider protocolConfigProvider=new ProtocolConfigProvider(firstFrameChar); + return protocolConfigProvider.getMatchList(); } + + + + + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index cf2113d..e915877 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -1,32 +1,35 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(0) -@Service +@Component public class FrameLengthMatcher implements FrameStructMatcher { - @Autowired - private FieldParser fieldParser; - //超过长度 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { String dataGramContent = ByteBufUtil.hexDump(byteBuf); - if (StringUtils.isEmpty(protocolConfig.getUnpackId()) && StringUtils.isEmpty(protocolConfig.getTailStr())) { - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + //当不存在结尾标志和拆包标志,可以直接使用长度进行匹配 + if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { if (dataGramContent.length() >= totalLength) {//等于长度返回true,超出长度,切断 - ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, protocolConfig, totalLength); + ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, totalLength); return wholeDatagramByte; } else { //读的标志位前移舍弃 @@ -38,7 +41,7 @@ return null; } - private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, Integer totalLength) { byteBuf.readBytes(totalLength); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, totalLength - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 2bfc213..d527ad0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; @@ -13,7 +13,7 @@ import lombok.AllArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.nio.charset.Charset; import java.util.Map; @@ -22,32 +22,30 @@ * 后续标志验证 */ @Order(1) -@Service +@Component @AllArgsConstructor -public class FrameMarkMatcher implements FrameStructMatcher { - - private final FieldConfigDao fieldConfigDao; - private final FieldParser fieldParser; - private final FieldResolver fieldResolverManger; +public class FrameMarkMatcher implements FrameStructMatcher, FixedPropertyEnum { //帧后续标志=>结束,进行帧的重组=>有后续,1、帧移位判别 2、继续接收帧 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig UnpackConfig = StringUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getUnpackId()); - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); - Integer upback = 0; + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); ByteBuf mergeWholeFrameByte = null; - if (!ObjectUtil.isEmpty(UnpackConfig)) { - while (hasNextFullFrame(byteBuf, protocolConfig)) { - upback = (Integer) fieldResolverManger.filedParserManger(byteBuf, UnpackConfig, null); + if (!ObjectUtil.isEmpty(unpackFlag)) { + while (hasNextFullFrame(byteBuf, protocolConfig, protocolFieldConfigProvider)) { //是否存在后续位 - if (upback == 1) {//使用esayRule + if (unpackFlag == 1) {//使用esayRule //表示可以截取 - mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolConfig, totalLength); + mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolFieldConfigProvider, protocolConfig); return mergeWholeFrameByte; } else { - byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig)); + byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig, protocolFieldConfigProvider)); } } } @@ -56,7 +54,8 @@ //选取第一个帧,将业务内容和后面部分分开 //计算数据报文-业务内容 - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolFieldConfigProvider protocolFieldConfigProvider, ProtocolConfig protocolConfig) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); //截取完整报文 byteBuf.readBytes(totalLength); ByteBuf byteBufContent = byteBuf.slice(0, byteBuf.readerIndex()); @@ -68,15 +67,15 @@ String tail = ""; System.out.println(ByteBufUtil.hexDump(byteBufContent)); //会存在多个帧拼接在一起的的情况,进行合并处理 - while (hasNextFullFrame(byteBufContent, protocolConfig)) { - Integer currentFrameLength = fieldParser.getTotalLength(protocolConfig, byteBufContent); + while (hasNextFullFrame(byteBufContent, protocolConfig, protocolFieldConfigProvider)) { + Integer currentFrameLength = protocolFieldConfigProvider.getTotalLength(byteBufContent, protocolConfig); byteBufContent.readBytes(currentFrameLength); ByteBuf currentbyteBuf = byteBufContent.slice(0, byteBufContent.readerIndex()); byteBufContent.markReaderIndex();//读的标志位前移 System.out.println(ByteBufUtil.hexDump(byteBufContent)); String hexDump = currentbyteBuf.toString(Charset.forName("ISO-8859-1")); //获取当前固定帧结构的关系map - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, currentbyteBuf); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(currentbyteBuf, protocolConfig); if (StringUtils.isEmpty(mergeFrameStr)) { //首次获取业务数据报文 mergeFrameStr += hexDump.substring(0, currentFrameFixedProperty.get("tailPosition")); @@ -95,22 +94,22 @@ /** * 获取平移到下一帧起始位置 */ - public int getNextFrameOffset(ByteBuf buffer, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, buffer); - return currentFrameFixedProperty.get("totalLength"); + public int getNextFrameOffset(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + return currentFrameFixedProperty.get(TOTAL_LENGTH); } /** * 判断是否出错进行整个帧的 */ - public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, byteBuf); + public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); //保证读取位置不在固定位置,是可变的业务内容 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("fixedPosition")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(FIXED_POSITION)) { return false; } //判断读取是否操作帧长度 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("totalLength")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(TOTAL_LENGTH)) { return false; } return true; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 76a3784..c3a1bab 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -1,50 +1,50 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.parser.instance.GeneralProcessor; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; +import io.netty.buffer.ByteBufUtil;; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(2) -@Service +@Component public class FrameTailMatcher implements FrameStructMatcher { - @Resource - private FieldConfigDao fieldConfigDao; - @Autowired - private GeneralProcessor generalProcessor; - //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig tailFieldConfig = StringUtils.isEmpty(protocolConfig.getTailStr()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getTailStr()); - if (!ObjectUtil.isEmpty(tailFieldConfig)) { - String tailStr = tailFieldConfig.getFieldName(); + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfig protocolFieldConfig = ObjectUtils.isEmpty(protocolConfig.getTailStr()) ? null : + fieldConfigProvider.getFieldConfigById(protocolConfig.getTailStr()); + if (!ObjectUtil.isEmpty(protocolFieldConfig)) { + String tailStr = protocolFieldConfig.getFieldName(); String dataGramContent = ByteBufUtil.hexDump(byteBuf); Boolean tailFlag = ByteBufUtil.hexDump(byteBuf).contains(tailStr); if (!tailFlag) { //使用esayRule return null; } else if (dataGramContent.indexOf(tailStr) < dataGramContent.length() - tailStr.length()) { Integer length = dataGramContent.indexOf(tailStr) + tailStr.length(); - ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, protocolConfig, length); + ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, length); return wholeDatagramByte; //存在粘包 } } return null; } - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer length) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, Integer length) { byteBuf.readBytes(length); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, length - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java new file mode 100644 index 0000000..5f1c177 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java @@ -0,0 +1,73 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.combined.GenericCombinedFieldResolver; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.CombinedFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class CombinedFieldConfigProvider { + + + /** + * 作为临时配置列表缓存使用 + */ + private final List combinedFieldConfigList; + private Map storeObjectMap = new HashMap<>(); + + public CombinedFieldConfigProvider(Long ruleId) { + CombinedFieldConfigRegistry combinedFieldConfigRegistry = SpringContextUtil.getBean(CombinedFieldConfigRegistry.class); + combinedFieldConfigList = combinedFieldConfigRegistry.getCombinedFieldConfigList(ruleId); + } + + public void parseDataField(RuleConfig ruleConfig, String clearZeroPlain,Map fieldConfigsMap ) { + if (showSkip()) { + return; + } + //匹配对应的数据,然后进行相关的字段解析 + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver(); + combinedFieldResolver.parseDataField(combinedFieldConfigList, byteBuf, storeObjectMap,fieldConfigsMap); + } + + + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getCombinedFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return combinedFieldConfigList.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public List getCombinedFieldConfigList() { + return combinedFieldConfigList; + } + + /* 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(combinedFieldConfigList) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java new file mode 100644 index 0000000..f3cfedc --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java @@ -0,0 +1,11 @@ +package com.casic.missiles.parser.provider; + +/** + * @author cz + * @date 2023-6-12 + */ +public class CommandEventProvider{ + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java new file mode 100644 index 0000000..70eec5e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java @@ -0,0 +1,77 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.safe.SafeStrategy; +import com.casic.missiles.parser.sender.DataSubscribeProvider; +import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class DatagramEventProvider { + + private final DatagramEventConfig processorInstance; + + public DatagramEventProvider(Long ruleId) { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + List datagramEventConfigList = + datagramEventRegistry.getDatagramEventList(ruleId); + processorInstance = this.getProcessorInstance(datagramEventConfigList); + } + + public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { + if (showSkip()) { + return null; + } + return datagramEventConfigList.get(0); + } + + // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 + public String getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap) { + String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? + processorInstance.getSafeBean() : + fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); + if (!StringUtils.isEmpty(safeName)) { + //需要加密 + SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); + String plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); + return clearComplementZero(plain); + } + return ByteBufUtil.hexDump(bizDataContent); + } + + //解密清零操作 + private String clearComplementZero(String plain) { + plain = plain.substring(0, plain.lastIndexOf("00")); + return plain; + } + + //数据发送,数据发送者暂未构建 + public void storeData(Map bizDataMap) { + DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); +// dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return ObjectUtils.isNotEmpty(processorInstance) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java new file mode 100644 index 0000000..7e1fe0a --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java @@ -0,0 +1,97 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.FieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class FieldConfigProvider { + + + private final List fieldConfigs; + private Map storeObjectMap = new HashMap<>(); +// private Map singleObjects = new ConcurrentHashMap<>(); + + public FieldConfigProvider(Long ruleId) { + FieldConfigRegistry fieldConfigRegistry = SpringContextUtil.getBean(FieldConfigRegistry.class); + fieldConfigs = fieldConfigRegistry.getFieldConfigList(ruleId); + } + + public List getFieldConfigs() { + return fieldConfigs; + } + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public Map parseDataField(RuleConfig ruleConfig, String clearZeroPlain) { + if (showSkip()) { + return null; + } + List prepareFieldConfig = prepareParseField(ruleConfig); + if (CollectionUtils.isNotEmpty(prepareFieldConfig)) { + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(fieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + return fixDataMap; + } + } + return null; + } + + /** + * 得到需要处理的业务内容 + * + * @return + */ + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return fieldConfigs.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public Map getFieldConfigsMap() { + return fieldConfigs.stream().collect( + Collectors.toMap(FieldConfig::getId, e -> e) + ); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(fieldConfigs) ? false : true; + } + + +} + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java new file mode 100644 index 0000000..817bfaf --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java @@ -0,0 +1,19 @@ +package com.casic.missiles.parser.provider; + +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.registry.FieldRuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; + +public class FieldRuleConfigProvider { + + private final List fieldRuleConfigList; + + public FieldRuleConfigProvider(Long ruleId) { + FieldRuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(FieldRuleConfigRegistry.class); + fieldRuleConfigList = ruleConfigRegistry.getFieldRuleConfigList(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java new file mode 100644 index 0000000..99a1b06 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java @@ -0,0 +1,53 @@ +package com.casic.missiles.parser.provider; + + +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.registry.ProtocolConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolConfigProvider { + + private final List protocolConfigList; + + public ProtocolConfigProvider(String firstChar) { + ProtocolConfigRegistry registry = SpringContextUtil.getBean(ProtocolConfigRegistry.class); + protocolConfigList = registry.getProtocolConfigList(firstChar); + } + + public List getMatchList() { + return protocolConfigList; + } + + /** + * 设置当前协议 + * + * @param protocolConfig + */ + public ProtocolConfigProvider(ProtocolConfig protocolConfig) { + List protocolConfigs = new ArrayList<>(); + protocolConfigs.add(protocolConfig); + protocolConfigList = protocolConfigs; + } + + /** + * 获取当前协议 + * + * @return + */ + public ProtocolConfig getCurrentProtocolConfig() { + if (this.protocolConfigList == null) { + return null; + } else { + return protocolConfigList.get(0); + } + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java new file mode 100644 index 0000000..043927d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java @@ -0,0 +1,213 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.registry.ProtocolFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolFieldConfigProvider { + + private static final String FIXED_FIELD_DS = "fixedFieldDs"; + private static final String CONTENT_FIELD_DS = "contentFieldDs"; + private static final String PROTOCOL_LENGTH = "protocolLength"; + private static final String PROTOCOL_FIELD_ID = "protocolFieldId"; + private static final String PROTOCOL_POSITION = "protocolPosition"; + + private final List protocolFieldConfigs; + private Map singleObjects = new ConcurrentHashMap<>(); + private Map storeObjectMap = new HashMap<>(); + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public ProtocolFieldConfigProvider(Long protocolId) { + ProtocolFieldConfigRegistry protocolFieldConfigRegistry = SpringContextUtil.getBean(ProtocolFieldConfigRegistry.class); + protocolFieldConfigs = protocolFieldConfigRegistry.getProtocolFieldConfigList(protocolId); + } + + public List getProtocolFieldConfigs() { + return protocolFieldConfigs; + } + + public ProtocolFieldConfig getFieldConfigById(Long fieldId) { + Optional optionalConfig = protocolFieldConfigs.stream().filter( + e -> e.getId().equals(fieldId) + ).findFirst(); + return optionalConfig.isPresent() ? optionalConfig.get() : null; + } + + public Integer getProtocolFieldValue(Long protocolFieldId, ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_FIELD_ID + protocolFieldId + ByteBufUtil.hexDump(byteBuf); + //获取缓存 + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + //加载固定长度数据集合 + Map fixDataMap = this.getProtocolDataMap(byteBuf); + ProtocolFieldConfig protocolFieldConfig = selectFieldConfig(protocolFieldId); + Integer protocolFieldValue = 0; + //获取约定字段的总长度 + if (fixDataMap.containsKey(protocolFieldConfig.getFieldName())) { + Object appointUnpackObject = fixDataMap.get(protocolFieldConfig.getFieldName()); + if (ObjectUtils.isNotEmpty(appointUnpackObject)) { + protocolFieldValue = (Integer) appointUnpackObject; + } + } + if (protocolFieldValue != null) { + //加入缓存 + if (ObjectUtils.isNotEmpty(protocolFieldValue)) { + this.singleObjects.put(catchKey, protocolFieldValue); + return protocolFieldValue; + } + } + return null; + } + + /** + * 获取帧固定位置信息 + * + * @param byteBuf + * @param protocolConfig + * @return + */ + public Map getFixedProperty(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_POSITION + protocolConfig.getId(); + if (this.singleObjects.containsKey(catchKey)) { + return (Map) singleObjects.get(catchKey); + } + Map fixedPropertyMap = new HashMap<>(); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + fixedPropertyMap = fieldParser.doGetFixedProperty(protocolFieldConfigs, this.getTotalLength(byteBuf,protocolConfig)); + if (CollectionUtils.isNotEmpty(fixedPropertyMap)) { + this.singleObjects.put(catchKey, fixedPropertyMap); + return fixedPropertyMap; + } + return fixedPropertyMap; + } + + /** + * 获取帧结构应有的总长度 + */ + public Integer getTotalLength(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_LENGTH + ByteBufUtil.hexDump(byteBuf); + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + Integer appointFrameLength = getProtocolFieldValue(protocolConfig.getTotalLengthId(), byteBuf); + if (appointFrameLength != null) { + //获取过滤的字段集合总长度 + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Integer totalFilterLength = fieldParser.getTotalFilterLength(protocolConfig, byteBuf, getFixFieldConfigMap()); + //计算总长度 + Integer totalLength = appointFrameLength + totalFilterLength; + //加入缓存 + if (ObjectUtils.isNotEmpty(totalLength)) { + this.singleObjects.put(catchKey, totalLength); + return totalLength; + } + } + return null; + } + + /** + * 获取协议有关字段解析内容 + * storeObjectMap存储代转存的数据 + * + * @return + */ + public Map getProtocolDataMap(ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(FIXED_FIELD_DS)) { + return (Map) singleObjects.get(FIXED_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(protocolFieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + this.singleObjects.put(FIXED_FIELD_DS, fixDataMap); + return fixDataMap; + } + return null; + } + + /** + * 获取业务报文内容的content字节 + * + * @param wholeDatagramByte + * @return + */ + public ByteBuf getDataContentBuf(ByteBuf wholeDatagramByte) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(CONTENT_FIELD_DS)) { + return (ByteBuf) singleObjects.get(CONTENT_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + ByteBuf bizDataByteBuf = fieldParser.getDataContentBuf(protocolFieldConfigs, wholeDatagramByte); + if (bizDataByteBuf != null) { + this.singleObjects.put(CONTENT_FIELD_DS, bizDataByteBuf); + return bizDataByteBuf; + } + return null; + } + + + private ProtocolFieldConfig selectFieldConfig(Long id) { + Optional optionalProtocolFieldConfig = this.protocolFieldConfigs.stream().filter( + e -> e.getId().equals(id) + ).findFirst(); + return optionalProtocolFieldConfig.isPresent() ? optionalProtocolFieldConfig.get() : null; + } + + + private Map getFixFieldConfigMap() { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, e -> e) + ); + return fixDataFieldMap; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(protocolFieldConfigs) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java new file mode 100644 index 0000000..dafba1c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java @@ -0,0 +1,56 @@ +package com.casic.missiles.parser.provider; + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.rule.GenericRuleResolver; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.RuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleConfigProvider { + + private final List ruleConfigs; + + public List getRuleConfigs() { + return ruleConfigs; + } + + public RuleConfigProvider(Long protocolId) { + RuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(RuleConfigRegistry.class); + ruleConfigs = ruleConfigRegistry.getRuleConfigById(protocolId); + } + + /** + * 获取规则匹配结果 + * + * @param parseFixedDataMap + * @param protocolFieldConfigs + * @return + */ + public RuleConfig doGetRule(Map parseFixedDataMap, + String ids, + List protocolFieldConfigs) { + if (showSkip()) { + return null; + } + RuleConfig ruleConfig = GenericRuleResolver.machRule(parseFixedDataMap, ids, protocolFieldConfigs, ruleConfigs); + return ruleConfig; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(ruleConfigs) ? false : true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java index 3c05891..856b399 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java @@ -1,18 +1,11 @@ package com.casic.missiles.parser.resolver; -import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.springframework.web.bind.annotation.RequestBody; -import javax.annotation.Resource; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -20,19 +13,17 @@ @Slf4j public class ByteMergeProvider { - @Resource - private FieldRuleEngineMapper fieldRuleEngineMapper; - //拿到所有的值合并到一个值 - public String resolveByteMerge(List valueList, String ruletypeId, String vaildRange) { + public static String resolveByteMerge(List valueList, String ruleTypeId, String vaildRange) { String values = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Map vaildMap = getValidRangeMap(vaildRange); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(ruletypeId); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } + //暂时不处理 +// fieldRuleEngine = fieldRuleConfigMapper.selectById(ruleTypeId); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } Map env2 = new HashMap(); for (int i = 0; i < valueList.size(); i++) { if (vaildMap.containsKey(i)) { @@ -47,7 +38,7 @@ } } - private Map getValidRangeMap(String vaildRange) { + private static Map getValidRangeMap(String vaildRange) { String[] range = vaildRange.split(","); Map vaildMap = new HashMap(); for (int i = 0; i < range.length; i++) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 8d821cd..85d6bbf 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -1,9 +1,12 @@ package com.casic.missiles.parser.resolver; +import com.casic.missiles.pojo.AbstractFieldConfig; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; import io.netty.buffer.ByteBuf; +import java.util.List; import java.util.Map; /** @@ -11,18 +14,14 @@ */ public interface FieldParser { -// Map fieldProcess(String protocolContent,); - Map dataParser(RuleConfig ruleConfig, String lightText,String protocolId); + Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength); - Map fixDataParser(String protocolId, ByteBuf buffer); + Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap); - Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf); + ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer); - ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer); - - ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer); - - Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer); + Integer getTotalFilterLength(ProtocolConfig protocolConfig, ByteBuf byteBuf, Map protocolFieldConfigMap); } + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java new file mode 100644 index 0000000..9e0c00e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java @@ -0,0 +1,52 @@ +package com.casic.missiles.parser.resolver; + +import com.casic.missiles.pojo.AbstractFieldConfig; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.util.List; + +public class FieldParserSupport { + + //分别计算bit和byte长度=> 合并长度 + protected Integer calculateLength(List fieldConfigList) { + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + Integer fixedLength = bytefixedLength + bitfixedLength / 8; + return fixedLength; + } + + //找到最大值=> 根据最大值计算业务数据下标 + protected Integer calculatePosition(List fieldConfigList) { + String rex = "[0-9]+"; + Integer max = -1; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) + && Integer.valueOf(fieldConfig.getOriginPositionByte()) > max) { + max = Integer.valueOf(fieldConfig.getOriginPositionByte()); + } + } + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) && fieldConfig.getOriginPositionByte().equals(max)) { + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + } + } + Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; + return maxFixedPosition; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java deleted file mode 100644 index dd3a6cd..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java +++ /dev/null @@ -1,170 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.ByteResolverParam; -import io.netty.buffer.ByteBuf; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -/** - * 字段解析管理总类 - */ -@Service -@Slf4j -@AllArgsConstructor -public class FieldResolver extends ByteMergeProvider { - - //1、字段截取 => 2、简单的字节解析和复杂的字节解析 - public Object filedParserManger(ByteBuf byteBuf, FieldConfig fieldConfig, Integer maxFixedPosition) { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - //最大固定位置不为空, - if (!ObjectUtil.isEmpty(maxFixedPosition)) { - orignPosition -= maxFixedPosition; - } - Object fieldValue = 0; - //待优化 - if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { - fieldValue = bitToResolver(byteBuf, fieldConfig); - } else { - ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); - fieldValue = parsingFields(fieldBytes, fieldConfig.getRuleJson()); - } - return fieldValue; - } - - //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, - //目前默认配置的规则设置暂不支持配置化,由实现完成 - private Object parsingFields(ByteBuf byteBuf, String ruleJson) { - Object fieldsResolveValue = null; - List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); - if (ObjectUtil.isEmpty(ruleMapList)) { - fieldsResolveValue = defaultResolveBuilder(byteBuf); - } else { - fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); - } - return fieldsResolveValue; - } - - private Object defaultResolveBuilder(ByteBuf byteBuf) { - Integer defaultResolveValue = 0; - for (int i = 0; i < byteBuf.writerIndex(); i++) { - defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; - } - return defaultResolveValue; - } - - //字段解析构建器(针对字节单位的) - //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 - // 字节归并结束或者规则结束=>继续根据规则进行判断 - private Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { - Object customizeResolveValue = null; - try { - List bytStrList = new ArrayList<>(); - //存放到数组里面 - for (int i = 0; i < byteBuf.writerIndex(); i++) { - bytStrList.add(byteBuf.readByte()); - } - int i = 0; - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - customizeResolveValue = this.resolveByteMerge(bytStrList, ruletypeId,vaildRange); - break; - } else { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - List tempBytStr = new ArrayList<>(); - for (int k = 0; i < bytStrList.size(); i++) { - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(k) - .value(bytStrList.get(k)) - .ruletypeId(ruletypeId).build(); - tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); - } - bytStrList = tempBytStr; - } - i++; - } - //字节归并到一起=>继续根据规则进行判断 - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(customizeResolveValue) - .ruletypeId(ruletypeId).build(); - customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(customizeResolveValue)); - return customizeResolveValue; - } catch (RuntimeException ex) { - log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); - return null; - } - } - - /** - * 1、单个字节情况表示字段 - * 2、多字节情况表示字段(暂未处理) - */ - private Object bitToResolver(ByteBuf byteBuf, FieldConfig fieldConfig) { - Object fieldValue = new Object(); - try { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - byte fields = 0x00; - if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); - } else { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); - } - - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { - if (!StringUtils.isEmpty(fieldConfig.getExactOrignPosition())) { - fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getExactOrignPosition())).byteValue() - >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); - } else { - fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); - } - } else { - fieldValue = Integer.valueOf(fields & 0xff); - } - if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { - return fieldValue; - } - List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); - int i = 0; - //字节归并到一起=>继续根据规则进行判断 - while (i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(fieldValue) - .ruletypeId(ruletypeId).build(); - fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(fieldValue)); - return fieldValue; - } catch (RuntimeException ex) { - log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); - return null; - } - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java new file mode 100644 index 0000000..1d2aeab --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java @@ -0,0 +1,36 @@ +package com.casic.missiles.parser.resolver.bytes; + +import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.mapper.FieldRuleConfigMapper; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.pojo.ByteResolverParam; +import com.googlecode.aviator.AviatorEvaluator; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; +//转换规则 +@Component("convert") +@AllArgsConstructor +@Slf4j +public class ByteRuleResolver implements ByteResolver { + + private final FieldRuleConfigMapper fieldRuleConfigMapper; + + @Override + public Object resolveOperationRule(ByteResolverParam byteResolverParam){ + FieldRuleConfig fieldRuleEngine=fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); + if(ObjectUtil.isEmpty(fieldRuleEngine)){ + return byteResolverParam.getValue(); + } + String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); + Map env2 = new HashMap(); + env2.put("value", (byte) byteResolverParam.getValue()); + String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); + return values; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java index 103821c..786b71c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java @@ -2,34 +2,34 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("logicalShift") +@Component("logicalShift") @AllArgsConstructor @Slf4j public class LogicalShiftResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //字节位移 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { Integer index = byteResolverParam.getIndex(); - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return byteResolverParam.getValue(); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java index 476747d..01149bd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("operation") +@Component("operation") @AllArgsConstructor @Slf4j public class OperationResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //混合运算,有常量或者乘除的缩放 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java index 0b82cf4..79abcce 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.casic.missiles.pojo.ByteResolverParam; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; //精度计算 -@Service("precision") +@Component("precision") @AllArgsConstructor @Slf4j public class PrecisionResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java deleted file mode 100644 index 5c3f332..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; -//转换规则 -@Service("convert") -@AllArgsConstructor -@Slf4j -public class RuleResolver implements ByteResolver { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam){ - RuleEvaluator fieldRuleEngine=fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); - if(ObjectUtil.isEmpty(fieldRuleEngine)){ - return byteResolverParam.getValue(); - } - String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); - Map env2 = new HashMap(); - env2.put("value", (byte) byteResolverParam.getValue()); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java new file mode 100644 index 0000000..d3bbd91 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java @@ -0,0 +1,15 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; + +import java.util.List; +import java.util.Map; +// 前导码匹配->长度字段 +public interface AbstractCombinedFieldProcessor { + + Map invoke(Map map, ByteBuf byteBuf, List combinedFieldConfigList, + Map fieldConfigsMap, Map storeObjectMap); + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java new file mode 100644 index 0000000..03c8480 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java @@ -0,0 +1,59 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-13 + */ +//依次递增进行数据的解析, +public class GenericCombinedFieldResolver { + + + //通过查询,字段长度长度随机 + public void parseDataField(List combinedFieldConfigList, ByteBuf byteBuf, + Map storeObjectMap, Map fieldConfigsMap) { + Integer frameLength = Integer.valueOf(ByteBufUtil.hexDump(byteBuf)); + //添加前置处理器 + com.casic.missiles.util.ClassUtil classUtil = new com.casic.missiles.util.ClassUtil(); + List abstractCombinedProcessors = classUtil.getSubClassList(AbstractCombinedFieldProcessor.class); + + Map fieldFixedMap = combinedFieldLeadCodeMap(combinedFieldConfigList); + //frameLength + Map combinedProcessorFields = null; + while (byteBuf.readableBytes() < frameLength) { + //一直处理 + for (AbstractCombinedFieldProcessor abstractCombinedProcessor : abstractCombinedProcessors) { + combinedProcessorFields = abstractCombinedProcessor.invoke(combinedProcessorFields, byteBuf, + combinedFieldConfigList, + fieldConfigsMap, storeObjectMap); + if (combinedProcessorFields == null || byteBuf.readableBytes() < frameLength) { + return; + } + } + + } + } + + /** + * 取出前导码匹配集合 + */ + private Map combinedFieldLeadCodeMap(List combinedFieldConfigList) { + Map fieldFixedMap = combinedFieldConfigList + .stream() + .collect(Collectors.toMap(CombinedFieldConfig::getPrefixCode, e -> e)); + return fieldFixedMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java new file mode 100644 index 0000000..643a934 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java @@ -0,0 +1,100 @@ +package com.casic.missiles.parser.resolver.fields; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.FieldParserSupport; +import com.casic.missiles.pojo.*; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 保存使用时最基本的信息,并且使用原型模式 + */ +@Slf4j +public class DefaultProtocolFieldParser extends FieldParserSupport implements FieldParser, FixedPropertyEnum { + + //通过传入的配置和报文进行字段解析 + @Override + public Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap) { + Map dataMap = new HashMap<>(); + for (AbstractFieldConfig protocolFieldConfig : protocolFieldConfigs) { + if (!ObjectUtils.isEmpty(protocolFieldConfig.getOriginPositionByte())) { + Object fieldValue = FieldResolver.parseField(buffer, protocolFieldConfig, null); + if (protocolFieldConfig.getIsStorage() == 1) { + storeObjectMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + dataMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + } + return dataMap; + } + + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength) { + Map fixedPropertyMap = new HashMap<>(); + Integer fixedLength = calculateLength(protocolFieldConfigs); + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + fixedPropertyMap.put(FIXED_POSITION, maxFixedPosition); + fixedPropertyMap.put(TOTAL_LENGTH, totalLength); + fixedPropertyMap.put(TAIL_POSITION, totalLength - fixedLength + maxFixedPosition); + return fixedPropertyMap; + } + + //** 获取业务内容的byteBuf + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer) { + //计算固定长度 + Integer fixedLength = calculateLength(protocolFieldConfigs); + //总长度获取 + String lightText = buffer.toString(Charset.forName("ISO-8859-1")); + Integer totalLength = lightText.length(); + //计算固定长度最大长度 + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + //计算数据报文内容 + ByteBuf bizDataFields = buffer.slice(maxFixedPosition - 1, (totalLength - fixedLength)); + return bizDataFields; + } + + /** + * 获取过滤字段的长度 + */ + @Override + public Integer getTotalFilterLength(ProtocolConfig protocolConfig, + ByteBuf byteBuf, + Map protocolFieldConfigMap) { + if (ByteBufUtil.hexDump(byteBuf).equals("")) { + return 0; + } + int totalFilterLength = 0; + String filterFields = protocolConfig.getTotalLengthFilterFields(); + try { + if (!StringUtils.isEmpty(filterFields)) { + String[] filterFieldList = filterFields.split(","); + for (String filterFieldId : filterFieldList) { + if (StringUtils.isNotEmpty(filterFieldId)) { + ProtocolFieldConfig fieldConfig = protocolFieldConfigMap.get(Long.valueOf(filterFieldId)); + //这里都是按字节计算,没有对位进行区分,可能会出现错误 + // 如果对位有需求,需要进一步跟进 + totalFilterLength += fieldConfig.getOffsetLength(); + } + } + } + return totalFilterLength; + } catch (Exception ex) { + log.error("报文确认分发阶段,获取报文总长度过滤长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); + } + return totalFilterLength; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java new file mode 100644 index 0000000..d51e887 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java @@ -0,0 +1,169 @@ +package com.casic.missiles.parser.resolver.fields; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.parser.resolver.ByteMergeProvider; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.AbstractFieldConfig; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.pojo.ByteResolverParam; +import io.netty.buffer.ByteBuf; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * 字段解析管理总类 + */ +@Slf4j +public class FieldResolver extends ByteMergeProvider { + + //1、字段截取 => 2、简单的字节解析和复杂的字节解析 + public static Object parseField(ByteBuf byteBuf,AbstractFieldConfig fieldConfig, Integer maxFixedPosition) { + Integer orignPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + //最大固定位置不为空, + if (!ObjectUtil.isEmpty(maxFixedPosition)) { + orignPosition -= maxFixedPosition; + } + Object fieldValue = 0; + //待优化 + if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { + fieldValue = doParseBitField(byteBuf, fieldConfig); + } else { + ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); + fieldValue = doParseByteField(fieldBytes, fieldConfig.getRuleJson()); + } + return fieldValue; + } + + //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, + //目前默认配置的规则设置暂不支持配置化,由实现完成 + private static Object doParseByteField(ByteBuf byteBuf, String ruleJson) { + Object fieldsResolveValue = null; + List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); + if (ObjectUtil.isEmpty(ruleMapList)) { + fieldsResolveValue = defaultResolveBuilder(byteBuf); + } else { + fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); + } + return fieldsResolveValue; + } + + private static Object defaultResolveBuilder(ByteBuf byteBuf) { + Integer defaultResolveValue = 0; + for (int i = 0; i < byteBuf.writerIndex(); i++) { + defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; + } + return defaultResolveValue; + } + + //字段解析构建器(针对字节单位的) + //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 + // 字节归并结束或者规则结束=>继续根据规则进行判断 + private static Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { + Object customizeResolveValue = null; + try { + List bytStrList = new ArrayList<>(); + //存放到数组里面 + for (int i = 0; i < byteBuf.writerIndex(); i++) { + bytStrList.add(byteBuf.readByte()); + } + int i = 0; + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { + if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + customizeResolveValue = resolveByteMerge(bytStrList, ruletypeId, vaildRange); + break; + } else { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + List tempBytStr = new ArrayList<>(); + for (int k = 0; i < bytStrList.size(); i++) { + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(k) + .value(bytStrList.get(k)) + .ruletypeId(ruletypeId).build(); + tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); + } + bytStrList = tempBytStr; + } + i++; + } + //字节归并到一起=>继续根据规则进行判断 + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(null) + .value(customizeResolveValue) + .ruletypeId(ruletypeId).build(); + customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); + i++; + } + System.out.println(JSON.toJSON(customizeResolveValue)); + return customizeResolveValue; + } catch (RuntimeException ex) { + log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); + return null; + } + } + + /** + * 1、单个字节情况表示字段 + * 2、多字节情况表示字段(暂未处理) + */ + private static Object doParseBitField(ByteBuf byteBuf,AbstractFieldConfig fieldConfig) { + Object fieldValue = new Object(); + try { + Integer orignPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + byte fields = 0x00; + if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { + fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); + } else { + fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); + } + + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { + if (!StringUtils.isEmpty(fieldConfig.getOriginPositionBit())) { + fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getOriginPositionBit())).byteValue() + >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); + } else { + fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); + } + } else { + fieldValue = Integer.valueOf(fields & 0xff); + } + if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { + return fieldValue; + } + List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); + int i = 0; + //字节归并到一起=>继续根据规则进行判断 + while (i < ruleMapList.size()) { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(null) + .value(fieldValue) + .ruletypeId(ruletypeId).build(); + fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); + i++; + } + System.out.println(JSON.toJSON(fieldValue)); + return fieldValue; + } catch (RuntimeException ex) { + log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); + return null; + } + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java deleted file mode 100644 index 35ae3d0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java +++ /dev/null @@ -1,183 +0,0 @@ -package com.casic.missiles.parser.resolver.fields; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufAllocator; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; -import org.springframework.util.ObjectUtils; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service("standard") -@AllArgsConstructor -@Slf4j -public class StandardFieldParser implements FieldParser { - - private final FieldConfigDao fieldConfigDao; - private final FieldResolver fieldResolver; - - //数据解析 - @Override - public Map dataParser(RuleConfig ruleConfig, String lightText, String protocolId) { - String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); - ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); - bufferContent.writeBytes(lightText.getBytes(Charset.forName("ISO-8859-1"))); - Map dataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - for (String dataFieldId : dataFieldIds) { - FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(dataFieldId); - if (!ObjectUtils.isEmpty(fieldConfig)) { - dataMap.put(fieldConfig.getFieldName(), String.valueOf(fieldResolver.filedParserManger(bufferContent, fieldConfig, maxFixedPosition))); - } - } - return dataMap; - } - - //数据解析 - @Override - public Map fixDataParser(String protocolId, ByteBuf buffer) { - List dataFieldIdList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Map dataMap = new HashMap<>(); - for (FieldConfig dataField : dataFieldIdList) { - if (!ObjectUtils.isEmpty(dataField.getOrignPosition())) { - Object fieldValue = (Integer) fieldResolver.filedParserManger(buffer, dataField, null); - dataMap.put(dataField.getFieldName(), fieldValue); - } - } - return dataMap; - } - - @Override - public Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf) { - if (ByteBufUtil.hexDump(byteBuf).equals("")) { - return 0; - } - String filterFields = protocolConfig.getTotalLengthFilterField(); - Integer totalLength = 0; - try { - FieldConfig totalFieldConfig = fieldConfigDao.getFieldConfigById(protocolConfig.getTotalLengthId()); - int totalFilterLength = 0; - if (!StringUtils.isEmpty(filterFields)) { - String[] filterFieldList = filterFields.split(","); - for (String filterField : filterFieldList) { - FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(filterField); - //这里都是按字节计算,没有对位进行区分,可能会出现错误 - - // 如果对位有需求,需要进一步跟进 - totalFilterLength += fieldConfig.getOffsetLength(); - } - } - totalLength = (Integer) fieldResolver.filedParserManger(byteBuf, totalFieldConfig, null) + totalFilterLength; - } catch (Exception ex) { - log.error("报文确认分发阶段,获取报文总长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); - } - return totalLength; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer) { - //业务内容 - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - String protocolId = String.valueOf(protocolConfig.getId()); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - //计算固定长度 - Integer fixedLength = calculateLength(fieldConfigList); -// Integer totalLength = this.getTotalLength(protocolConfig, buffer); - //总长度获取 - Integer totalLength = lightText.length(); - //计算固定长度最大长度 - Integer maxFixedPosition = calculatePosition(fieldConfigList); -// buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - //计算数据报文内容 - ByteBuf bizDataFields = buffer.slice(maxFixedPosition-1, (totalLength - fixedLength)); - return bizDataFields; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer) { - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - String protocolId = String.valueOf(protocolConfig.getId()); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer fixedLength = calculateLength(fieldConfigList); -// Integer totalLength = this.getTotalLength(protocolConfig, buffer); - Integer totalLength = lightText.length(); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - ByteBuf fixDataFields = buffer.slice(0, maxFixedPosition); - return fixDataFields; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer) { - String protocolId = String.valueOf(protocolConfig.getId()); - Map fixedPropertyMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer fixedLength = calculateLength(fieldConfigList); - Integer totalLength = this.getTotalLength(protocolConfig, buffer); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - fixedPropertyMap.put("fixedPosition", maxFixedPosition); - fixedPropertyMap.put("totalLength", totalLength); - fixedPropertyMap.put("tailPosition", totalLength - fixedLength + maxFixedPosition); - return fixedPropertyMap; - } - - //分别计算bit和byte长度=> 合并长度 - private Integer calculateLength(List fieldConfigList) { - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (FieldConfig fieldConfig : fieldConfigList) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - Integer fixedLength = bytefixedLength + bitfixedLength / 8; - return fixedLength; - } - - //找到最大值=> 根据最大值计算业务数据下标 - private Integer calculatePosition(List fieldConfigList) { - String rex = "[0-9]+"; - Integer max = -1; - for (FieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOrignPosition()) - && Integer.valueOf(fieldConfig.getOrignPosition()) > max) { - max = Integer.valueOf(fieldConfig.getOrignPosition()); - } - } - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (FieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOrignPosition()) && fieldConfig.getOrignPosition().equals(max)) { - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - } - } - Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; - return maxFixedPosition; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java new file mode 100644 index 0000000..d4ec6c7 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java @@ -0,0 +1,76 @@ +package com.casic.missiles.parser.rule; + +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import org.apache.commons.lang3.StringUtils; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class GenericRuleResolver { + + //根据前置字段的值,找到指定的规则 + //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 + //=>循环判断=>通过规则得到业务字段 + public static RuleConfig machRule(Map fixDataMap, + String ids, + List protocolFieldConfigs, + List ruleConfigs) { + List preRuleConfigList = getPreRuleList(ids, protocolFieldConfigs); + //获取前置规则字段 + final Map metaDataMap = getPreRuleFields(preRuleConfigList, fixDataMap); + //准备固定的字段集合 + Map fixDataFieldMap = getFixDataFieldMap(protocolFieldConfigs); + return RuleResolverCore.doMachRule(ruleConfigs, metaDataMap, fixDataMap, fixDataFieldMap); + } + + private static Map getFixDataFieldMap(List protocolFieldConfigs) { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, ProtocolFieldConfig::getFieldName) + ); + return fixDataFieldMap; + } + + + /** + * 查询前置规则的字段配置 + * + * @param ids + * @return + */ + private static List getPreRuleList(String ids, List protocolFieldConfigs) { + String[] idList = ids.split(","); + Map prepareMaps = new HashMap<>(); + for (String id : idList) { + if (StringUtils.isNotEmpty(id)) { + prepareMaps.put(Long.valueOf(id), ""); + } + } + List preRuleConfigList = protocolFieldConfigs + .stream() + .filter(e -> prepareMaps.containsKey(e.getId())) + .collect(Collectors.toList()); + return preRuleConfigList; + } + + /** + * 获取前置规则解析字段 + */ + private static Map getPreRuleFields(List preRuleFieldConfigList, Map fixDataMap) { + Map ruleFieldMap = new HashMap<>(); + preRuleFieldConfigList.stream() + .forEach( + preRuleFieldConfig -> { + String fieldName = preRuleFieldConfig.getFieldName(); + if (fixDataMap.containsKey(fieldName)) { + ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); + } + } + ); + return ruleFieldMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java new file mode 100644 index 0000000..baae7e8 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -0,0 +1,68 @@ +package com.casic.missiles.parser.rule; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.casic.missiles.pojo.RuleConfig; + +import java.util.*; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleResolverCore { + + + public static RuleConfig doMachRule(List ruleConfigList, Map metaDataMap, + Map fixDataMap, + Map fixDataFieldMap) { + Optional ruleConfigOptional = ruleConfigList.stream() + .filter(ruleConfig -> machRuleConfig( + JSON.parseObject(ruleConfig.getMatchRuleJson(), Map.class), metaDataMap)) + .findFirst(); + if (ObjectUtil.isEmpty(ruleConfigOptional)) { + return null; + } + String[] ruleFields = ruleConfigOptional.get().getDataFieldIds().split(","); + Map ruleMetaDataMap = getRuleFields(ruleFields, fixDataMap, fixDataFieldMap); + //递归选定解析规则,进行规则解析 + if (!ruleConfigOptional.get().getIsFinishMatch().equals("1")) { + //递归选定规则 + doMachRule(ruleConfigList, ruleMetaDataMap, fixDataMap, fixDataFieldMap); + } + return ruleConfigOptional.get(); + } + + + private static Map getRuleFields(String[] preRuleConfigList, Map fixedDataMap, + Map fixedFieldMap) { + Map ruleFieldMap = new HashMap<>(); + for (String preRuleConfigId : preRuleConfigList) { + String fieldName = fixedFieldMap.get(preRuleConfigId); + if (fixedDataMap.containsKey(fieldName)) { + ruleFieldMap.put(fieldName, String.valueOf(fixedDataMap.get(fieldName))); + } + } + return ruleFieldMap; + } + + + //匹配规则配置 + private static Boolean machRuleConfig(Map ruleMap, Map metaDataMap) { + if (ruleMap == null || metaDataMap == null) { + return null; + } + //所有的字段在规则里面必须有有配置 + for (String key : metaDataMap.keySet()) { + if (ruleMap.containsKey(key)) { + if (!ruleMap.get(key).equals(metaDataMap.get(key))) { + return false; + } + } else { + return false; + } + } + return true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java deleted file mode 100644 index 664088d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java +++ /dev/null @@ -1,92 +0,0 @@ -package com.casic.missiles.parser.rule; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.mapper.dao.PreRuleConfigDao; -import com.casic.missiles.mapper.dao.RuleConfigDao; -import lombok.AllArgsConstructor; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.*; -import java.util.stream.Collectors; - -@Service -@AllArgsConstructor -public class RulerProvider { - - private final FieldConfigDao fieldConfigDao; - private final PreRuleConfigDao preRuleConfigDao; - private final RuleConfigDao ruleConfigDao; - - //根据前置字段的值,找到指定的规则 - //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 - //=>循环判断=>通过规则得到业务字段 - public RuleConfig ruleConfig(Map fixDataMap, String protocolId) { - //批量获取规则 - List preRuleConfigList = preRuleConfigDao.getPreRuleList(protocolId); - //获取固定字段 - Map fixFieldMap = getAllFieldMap(protocolId); - //获取前置规则字段 - final String preRuleFields = getPreRuleFields(preRuleConfigList, fixDataMap, fixFieldMap); - List ruleConfigList = ruleConfigDao.getRuleConfigById(protocolId); - Optional ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig ->preRuleFields.equals( ruleConfig.getParseRuleJson())).findFirst(); - //递归选定解析规则,进行规则解析 - while (!ObjectUtil.isEmpty(ruleConfigOptional) && !ruleConfigOptional.get().getIsBizField().equals("1")) { - String ruleFields = getRuleFields(ruleConfigOptional.get().getDataFieldIds().split(","), fixDataMap, fixFieldMap); - ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig -> ruleConfig.getParseRuleJson().equals(ruleFields)).findFirst(); - } - return ruleConfigOptional.get(); - } - - /** - * 获取前置规则解析字段 - */ - private String getPreRuleFields(List preRuleConfigList, Map fixDataMap, Map fixFieldMap) { - Map ruleFieldMap= new HashMap<>(); - preRuleConfigList.stream() - .forEach( - preRuleConfig -> { - String fieldName = fixFieldMap.get(Long.valueOf(preRuleConfig.getRuleFieldId())); - if (fixDataMap.containsKey(fieldName)) { - ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); - } - } - ); - return JSONObject.toJSONString(ruleFieldMap); - } - - private Map getAllFieldMap(String protocolId) { - List fieldList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Map fixFieldMap = fieldList.stream().collect( - Collectors.toMap(FieldConfig::getId, FieldConfig::getFieldName) - ); - return fixFieldMap; - } - - private String getRuleFields(String[] preRuleConfigList, Map fixDataMap, Map fixFieldMap) { - Map ruleFieldMap= new HashMap<>(); - for (String preRuleConfigId : preRuleConfigList) { - String fieldName = fixFieldMap.get(preRuleConfigId); - if (fixDataMap.containsKey(fieldName)) { - ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); - } - } - return JSONObject.toJSONString(ruleFieldMap); - } - - //弃置 - private String ListToString(List ruleFieldList) { - String ruleFields = ""; - for (String ruleField : ruleFieldList) { - ruleFields += ruleField + ","; - } - ruleFields = StringUtils.isEmpty(ruleFields) ? ruleFields : ruleFields.substring(0, ruleFields.length() - 1); - return ruleFields; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java index 6177e10..bfa87a5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java @@ -2,7 +2,7 @@ public interface SafeStrategy { - String decryption(byte[] bytes); + String decryption(String cipher); String encryption(String lightText); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java index 618716c..6236302 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java @@ -9,9 +9,9 @@ //十六进制的字符串转换成字节数组 byte[] bytes = hexStrToBinaryStr(msg); //计算CRC8 - byte crc8 = CRC8(bytes, 0, bytes.length); - String crc8ToStr = "" + Integer.toHexString(0xff & crc8); - return crc8ToStr; +// String crc8ToStr = "" + Integer.toHexString(0xff & crc8); +// return crc8ToStr; + return null; } /** @@ -33,50 +33,5 @@ return bytes; } - /** - * CRC8 校验 多项式 x8+x2+x+1 - * - * @param b - * @param off - * @param len - * @return - */ - public static byte CRC8(final byte[] b, final int off, final int len) { - byte result = 0x00; - for (int i = 0; i < len; i++) { - result = CHECKSUM_TABLE[(result ^ (b[i + off] & 0xFF)) & 0xFF]; - } - return (byte) (result & 0xFFL); - } - - private final static byte[] CHECKSUM_TABLE = {(byte) 0x00, (byte) 0x07, (byte) 0x0e, (byte) 0x09, (byte) 0x1c, (byte) 0x1b, - (byte) 0x12, (byte) 0x15, (byte) 0x38, (byte) 0x3f, (byte) 0x36, (byte) 0x31, (byte) 0x24, (byte) 0x23, (byte) 0x2a, - (byte) 0x2d, (byte) 0x70, (byte) 0x77, (byte) 0x7e, (byte) 0x79, (byte) 0x6c, (byte) 0x6b, (byte) 0x62, (byte) 0x65, - (byte) 0x48, (byte) 0x4f, (byte) 0x46, (byte) 0x41, (byte) 0x54, (byte) 0x53, (byte) 0x5a, (byte) 0x5d, (byte) 0xe0, - (byte) 0xe7, (byte) 0xee, (byte) 0xe9, (byte) 0xfc, (byte) 0xfb, (byte) 0xf2, (byte) 0xf5, (byte) 0xd8, (byte) 0xdf, - (byte) 0xd6, (byte) 0xd1, (byte) 0xc4, (byte) 0xc3, (byte) 0xca, (byte) 0xcd, (byte) 0x90, (byte) 0x97, (byte) 0x9e, - (byte) 0x99, (byte) 0x8c, (byte) 0x8b, (byte) 0x82, (byte) 0x85, (byte) 0xa8, (byte) 0xaf, (byte) 0xa6, (byte) 0xa1, - (byte) 0xb4, (byte) 0xb3, (byte) 0xba, (byte) 0xbd, (byte) 0xc7, (byte) 0xc0, (byte) 0xc9, (byte) 0xce, (byte) 0xdb, - (byte) 0xdc, (byte) 0xd5, (byte) 0xd2, (byte) 0xff, (byte) 0xf8, (byte) 0xf1, (byte) 0xf6, (byte) 0xe3, (byte) 0xe4, - (byte) 0xed, (byte) 0xea, (byte) 0xb7, (byte) 0xb0, (byte) 0xb9, (byte) 0xbe, (byte) 0xab, (byte) 0xac, (byte) 0xa5, - (byte) 0xa2, (byte) 0x8f, (byte) 0x88, (byte) 0x81, (byte) 0x86, (byte) 0x93, (byte) 0x94, (byte) 0x9d, (byte) 0x9a, - (byte) 0x27, (byte) 0x20, (byte) 0x29, (byte) 0x2e, (byte) 0x3b, (byte) 0x3c, (byte) 0x35, (byte) 0x32, (byte) 0x1f, - (byte) 0x18, (byte) 0x11, (byte) 0x16, (byte) 0x03, (byte) 0x04, (byte) 0x0d, (byte) 0x0a, (byte) 0x57, (byte) 0x50, - (byte) 0x59, (byte) 0x5e, (byte) 0x4b, (byte) 0x4c, (byte) 0x45, (byte) 0x42, (byte) 0x6f, (byte) 0x68, (byte) 0x61, - (byte) 0x66, (byte) 0x73, (byte) 0x74, (byte) 0x7d, (byte) 0x7a, (byte) 0x89, (byte) 0x8e, (byte) 0x87, (byte) 0x80, - (byte) 0x95, (byte) 0x92, (byte) 0x9b, (byte) 0x9c, (byte) 0xb1, (byte) 0xb6, (byte) 0xbf, (byte) 0xb8, (byte) 0xad, - (byte) 0xaa, (byte) 0xa3, (byte) 0xa4, (byte) 0xf9, (byte) 0xfe, (byte) 0xf7, (byte) 0xf0, (byte) 0xe5, (byte) 0xe2, - (byte) 0xeb, (byte) 0xec, (byte) 0xc1, (byte) 0xc6, (byte) 0xcf, (byte) 0xc8, (byte) 0xdd, (byte) 0xda, (byte) 0xd3, - (byte) 0xd4, (byte) 0x69, (byte) 0x6e, (byte) 0x67, (byte) 0x60, (byte) 0x75, (byte) 0x72, (byte) 0x7b, (byte) 0x7c, - (byte) 0x51, (byte) 0x56, (byte) 0x5f, (byte) 0x58, (byte) 0x4d, (byte) 0x4a, (byte) 0x43, (byte) 0x44, (byte) 0x19, - (byte) 0x1e, (byte) 0x17, (byte) 0x10, (byte) 0x05, (byte) 0x02, (byte) 0x0b, (byte) 0x0c, (byte) 0x21, (byte) 0x26, - (byte) 0x2f, (byte) 0x28, (byte) 0x3d, (byte) 0x3a, (byte) 0x33, (byte) 0x34, (byte) 0x4e, (byte) 0x49, (byte) 0x40, - (byte) 0x47, (byte) 0x52, (byte) 0x55, (byte) 0x5c, (byte) 0x5b, (byte) 0x76, (byte) 0x71, (byte) 0x78, (byte) 0x7f, - (byte) 0x6a, (byte) 0x6d, (byte) 0x64, (byte) 0x63, (byte) 0x3e, (byte) 0x39, (byte) 0x30, (byte) 0x37, (byte) 0x22, - (byte) 0x25, (byte) 0x2c, (byte) 0x2b, (byte) 0x06, (byte) 0x01, (byte) 0x08, (byte) 0x0f, (byte) 0x1a, (byte) 0x1d, - (byte) 0x14, (byte) 0x13, (byte) 0xae, (byte) 0xa9, (byte) 0xa0, (byte) 0xa7, (byte) 0xb2, (byte) 0xb5, (byte) 0xbc, - (byte) 0xbb, (byte) 0x96, (byte) 0x91, (byte) 0x98, (byte) 0x9f, (byte) 0x8a, (byte) 0x8d, (byte) 0x84, (byte) 0x83, - (byte) 0xde, (byte) 0xd9, (byte) 0xd0, (byte) 0xd7, (byte) 0xc2, (byte) 0xc5, (byte) 0xcc, (byte) 0xcb, (byte) 0xe6, - (byte) 0xe1, (byte) 0xe8, (byte) 0xef, (byte) 0xfa, (byte) 0xfd, (byte) 0xf4, (byte) 0xf3}; } \ No newline at end of file diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java index 27c2838..6e078a3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java @@ -1,9 +1,6 @@ package com.casic.missiles.parser.safe.impl; -import cn.hutool.core.util.CharsetUtil; -import cn.hutool.crypto.symmetric.SM4; -import cn.hutool.crypto.symmetric.SymmetricCrypto; - +import com.casic.missiles.parser.safe.SafeStrategy; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; @@ -11,19 +8,44 @@ import org.bouncycastle.crypto.engines.SM4Engine; import org.bouncycastle.crypto.params.KeyParameter; import org.bouncycastle.util.encoders.Hex; - -import static cn.hutool.crypto.Mode.ECB; -import static cn.hutool.crypto.Padding.NoPadding; +import org.springframework.stereotype.Component; /** * SM4算法工具类 */ @Slf4j -public class Sm4 { +@Component("sm4") +public class Sm4 implements SafeStrategy { //加解密的字节快大小 public static final int BlockSize = 16; + @Override + public String decryption(String cipher) { + byte[] keyByte = { + 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 + }; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(keyByte); + byte[] in = Hex.decode(cipher); + byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); + String plain = EcbDecrypt(in, keyBytes); + return plain; + } + + @Override + public String encryption(String cipher) { + byte[] keyByte = { + 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 + }; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(keyByte); + byte[] in = Hex.decode(cipher); + byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); + String plain = EcbDecrypt(in, keyBytes); + return plain; + } + /** * SM4ECB加密算法,对内 * @@ -32,8 +54,6 @@ * @return */ private static byte[] ecb_encrypt(byte[] in, byte[] keyBytes) { - - SM4Engine sm4Engine = new SM4Engine(); sm4Engine.init(true, new KeyParameter(keyBytes)); byte[] out = new byte[in.length]; @@ -58,27 +78,6 @@ return cipher; } - - /** - * hutool 解密SM4 - * - * @param encodeContent - * @return - */ - public static String decode(String encodeContent) { - String key = "24ad182507479a5da3ad94d9d78ea203"; - try { - SymmetricCrypto sm4 = new SM4(ECB, NoPadding, key.getBytes()); - String decryptStr = sm4.decryptStr(encodeContent, CharsetUtil.CHARSET_UTF_8); - return decryptStr; - } catch (Exception e) { - e.printStackTrace(); - log.error("SM4解密失败"); - } - return null; - } - - /** * SM4的ECB加密算法 * @@ -129,20 +128,6 @@ return plain; } - /** - * SM4的ECB解密算法 - * - * @param cipher 输入的密文字符串 - * @param key 密钥 - * @return - */ - public static String EcbDecrypt(String cipher, String key) { - byte[] in = Hex.decode(cipher); - byte[] keyBytes = Hex.decode(key); - - String plain = EcbDecrypt(in, keyBytes); - return plain; - } /** * 主函数 @@ -151,28 +136,24 @@ */ public static void main(String[] args) { byte[] ciphertext = { + 0x4B, (byte) 0x8C, (byte) 0x9D, 0x08, (byte) 0xE4, (byte) 0xD3, 0x64, 0x42, (byte) 0xB9, (byte) 0xA5, (byte) 0xFE, (byte) 0xCD, (byte) 0x91, 0x1B, 0x38, (byte) 0xAC, (byte) 0xE9, 0x1C, (byte) 0xCD, 0x53, 0x02, (byte) 0xD7, 0x0C, (byte) 0x9B, (byte) 0x96, 0x30, 0x62, (byte) 0xE8, (byte) 0xFB, (byte) 0xEF, (byte) 0xB9, (byte) 0xFF, (byte) 0xDE, 0x19, (byte) 0x80, 0x35, 0x3E, (byte) 0x90, 0x4F, 0x2F, 0x12, 0x2B, 0x19, (byte) 0x8B, 0x6C, 0x7A, (byte) 0x85, (byte) 0xA1, (byte) 0xB1, (byte) 0x86, (byte) 0xA3, 0x7A, 0x46, 0x0C, 0x2F, (byte) 0x94, 0x4F, 0x7F, 0x2C, 0x56, 0x14, (byte) 0xF3, (byte) 0x89, (byte) 0xC3, - 0x3F, 0x20, (byte) 0xF9, (byte) 0x87, (byte) 0xA1, 0x60, (byte) 0xD9, (byte) 0xA8, (byte) 0xFD, (byte) 0xD7, (byte) 0x9B, 0x4B, 0x26, 0x06, 0x30, 0x44}; + 0x3F, 0x20, (byte) 0xF9, (byte) 0x87, (byte) 0xA1, 0x60, (byte) 0xD9, (byte) 0xA8, (byte) 0xFD, (byte) 0xD7, (byte) 0x9B, 0x4B, 0x26, 0x06, 0x30, 0x44 + }; ByteBuf in = ByteBufAllocator.DEFAULT.heapBuffer(); in.writeBytes(ciphertext); - byte[] keyByte = { 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 }; ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); - key.writeBytes(ciphertext); - String resCipherData = decode(ByteBufUtil.hexDump(in)); - ByteBuf out = ByteBufAllocator.DEFAULT.heapBuffer(); -// out.writeBytes(resCipherData); -// System.out.println(hexBytes); - System.out.println(resCipherData.toString()); -// String resPlainData = EcbDecrypt(resCipherData, key); -// System.out.println("原始明文:" + data); -// System.out.println("解密后明文:" + resPlainData); + key.writeBytes(keyByte); +// String resCipherData = EcbDecrypt(ByteBufUtil.hexDump(in), ByteBufUtil.hexDump(key)); +// System.out.println(resCipherData); } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java index 1395a51..ac5f957 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java @@ -1,7 +1,7 @@ package com.casic.missiles.parser.safe.impl; import io.netty.buffer.ByteBufUtil; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** *

@@ -14,9 +14,8 @@ * @author hyl * @version v1.0: Tea.java, v 0.1 2021/3/12 13:48 $ */ -@Service("tea") -///tea算法类 - +//tea算法类 +@Component("tea") public class Tea { public static byte[] MyTea_Encrypt(byte[] MyTeaContent, int ByteLen, byte[] MyTeakey) { @@ -99,7 +98,6 @@ // for(int i32Index = 0; i32Index < 8; i32Index++) { // System.out.print("0x" + Integer.toHexString(MyContent[i32Index]) + " "); // } - // System.out.println("密钥为:"); // for(int i32Index = 0; i32Index < 16; i32Index++) { // System.out.print("0x" + Integer.toHexString(MyKeys[i32Index]) + " "); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java index bdd0721..bd1516a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java @@ -3,7 +3,7 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.parser.sender.DataSubscribeProvider; import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponents; import org.springframework.web.util.UriComponentsBuilder; @@ -12,7 +12,7 @@ import java.util.Collections; import java.util.Map; -@Service("functionCallback") +@Component("functionCallback") public class FunctionCallback implements DataSubscribeProvider { @Resource diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java index 0b44fb9..7526de2 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.Map; -@Service("middleware") +@Component("middleware") public class MiddlewareSubscribe implements DataSubscribeProvider { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java index 5dcee3f..e2f1192 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.Map; -@Service("nosql") +@Component("nosql") public class NoSqlSubscribe implements DataSubscribeProvider { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java b/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java new file mode 100644 index 0000000..81a5324 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java @@ -0,0 +1,86 @@ +package com.casic.missiles.pojo; + +import lombok.Data; + +/** + * 协议 + */ +@Data +public class Msg { + + /** + * 前导码 + */ + private String preamble; + + /** + * 版本号 + */ + private String version; + + /** + * 内容长度 + */ + private int leng; + + /** + * 设备ID + */ + private String deviceId; + + /** + * 通讯方式 + */ + private Integer connType; + + /** + * 加密方式 + */ + private Integer encryType; + + /** + * 目标地址 + */ + private String destAddr; + + /** + * PDUType + */ + private String PDUType; + + /** + * 操作类型 + */ + private Integer operateType; + + /** + * 传输控制位 PDUType.bit7=0时,表示存在后续的访问;当PDUType.bit7=1时,表示无后续的访问。 + */ + private Integer transControlFlag; + + /** + * 设备类型 + */ + private Integer deviceType; + + /** + * 序号 + */ + private Integer seq; + + /** + * tagList + */ + private String tagList; + + /** + * OidList + */ + private String OidList; + + /** + * CRC + */ + private String CRC; + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java index 40a5265..97cc984 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java @@ -40,7 +40,7 @@ String httpContent = msg.toString(Charset.defaultCharset()); log.info(" String : " + msg.toString(Charset.defaultCharset())); String majorContent = httpContent.substring(httpContent.indexOf("{"), httpContent.lastIndexOf("}") + 1); - String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("serviceData")).get("Value")); + String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("RegistryData")).get("Value")); log.info("----------------------------------" + values); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); bufferContent.writeBytes(values.getBytes(Charset.forName("ISO-8859-1"))); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java index 1b132a7..e3ced4b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java @@ -35,7 +35,7 @@ String httpContent = msg.toString(Charset.defaultCharset()); log.info(" String : " + msg.toString(Charset.defaultCharset())); String majorContent = httpContent.substring(httpContent.indexOf("{"), httpContent.lastIndexOf("}") + 1); - String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("serviceData")).get("Value")); + String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("RegistryData")).get("Value")); log.info("----------------------------------" + values); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); bufferContent.writeBytes(values.getBytes(Charset.forName("ISO-8859-1"))); diff --git a/sensorhub-core/src/main/resources/application.properties b/sensorhub-core/src/main/resources/application.properties deleted file mode 100644 index 8b13789..0000000 --- a/sensorhub-core/src/main/resources/application.properties +++ /dev/null @@ -1 +0,0 @@ - diff --git a/sensorhub-core/src/main/resources/config/application-dev.yml b/sensorhub-core/src/main/resources/config/application-dev.yml index 4f897a8..dcc4c2d 100644 --- a/sensorhub-core/src/main/resources/config/application-dev.yml +++ b/sensorhub-core/src/main/resources/config/application-dev.yml @@ -4,9 +4,9 @@ spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true + url: jdbc:mysql://127.0.0.1:3306/sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true username: root - password: Casic203 + password: root session: store-type: redis redis: diff --git a/sensorhub-core/src/main/resources/config/application.yml b/sensorhub-core/src/main/resources/config/application.yml index ae89f9d..7965da1 100644 --- a/sensorhub-core/src/main/resources/config/application.yml +++ b/sensorhub-core/src/main/resources/config/application.yml @@ -30,6 +30,13 @@ port: 6379 password: ew5T4K3#203lwh config-prefix: 'Casic:' +#代码生成器配置 +code: + generate: + #作者 + author: cz + #待生成对象表名 + table-name: bussiness_field_config,combined_field_config sensorhub: config: port: 7091 diff --git a/sensorhub-support/pom.xml b/sensorhub-support/pom.xml index 9a71296..761601c 100644 --- a/sensorhub-support/pom.xml +++ b/sensorhub-support/pom.xml @@ -42,6 +42,12 @@ ${redis.version} + + com.baomidou + mybatis-plus-generator + ${mybatis-plus-generator.version} + + org.reflections diff --git a/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java b/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java new file mode 100644 index 0000000..515ca53 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java @@ -0,0 +1,14 @@ +package com.casic.missiles.enums; + +/** + * @author + * @date + */ +public interface FixedPropertyEnum { + + String FIXED_POSITION = "fixedPosition"; + + String TOTAL_LENGTH = "totalLength"; + + String TAIL_POSITION = "tailPosition"; +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/CombinedFieldMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CombinedFieldMapper.java new file mode 100644 index 0000000..38e8f42 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CombinedFieldMapper.java @@ -0,0 +1,15 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.CombinedFieldConfig; +import org.apache.ibatis.annotations.Mapper; + +/** + * @author cz + * + */ +@Mapper +public interface CombinedFieldMapper extends BaseMapper { + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java new file mode 100644 index 0000000..128b09d --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java @@ -0,0 +1,10 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.CommandEventConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface CommandEventMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java new file mode 100644 index 0000000..042eb3c --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.DatagramEventConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface DatagramEventConfigMapper extends BaseMapper { +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java new file mode 100644 index 0000000..fc95cf4 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java @@ -0,0 +1,8 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.FieldConfig; + +public interface FieldConfigMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldRuleConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldRuleConfigMapper.java new file mode 100644 index 0000000..b310a08 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldRuleConfigMapper.java @@ -0,0 +1,10 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.FieldRuleConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface FieldRuleConfigMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java new file mode 100644 index 0000000..9060a69 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.ProtocolConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface ProtocolConfigMapper extends BaseMapper { +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolFieldConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolFieldConfigMapper.java new file mode 100644 index 0000000..1b47180 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolFieldConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +public interface ProtocolFieldConfigMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java new file mode 100644 index 0000000..6fa6936 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.RuleConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface RuleConfigMapper extends BaseMapper { +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/AbstractFieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/AbstractFieldConfig.java new file mode 100644 index 0000000..ba9aea2 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/AbstractFieldConfig.java @@ -0,0 +1,38 @@ +package com.casic.missiles.pojo; + +import lombok.Data; + +@Data +public class AbstractFieldConfig { + /** + * 字段名称 + */ + private String fieldName; + /** + * 按照字段评估进行字段解析 + */ + private String ruleJson; + /** + * 起始位置(单位byte) + */ + private Integer OriginPositionByte; + /** + * 起始位置,是否需要bit位置(单位bit)小于8, 没有不需要填写 + */ + private String OriginPositionBit; + /** + * 偏移长度 + */ + private Integer offsetLength; + /** + * 偏移单位(bit/byte) + */ + private String offsetUnit; + /** + * 是否需要转存 + */ + private Integer isStorage; + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java index 608af3a..32cc8a4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java @@ -2,48 +2,47 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.delivery.decorator.ByteDecorator; +import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @AllArgsConstructor public class FieldDecoratorManger { - private final RuleDictDao ruleDictDao; + private final RuleConfigRegistry ruleDictDao; // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 // (1)静态的业务字段是字典里面可以配置的 // (2)动态的业务字段是通过规则生成的 public String contentMerge(String ruleJson, String sceneConent, String dynamicContent) { - List ruleDictList = ruleDictDao.getRuleDictConfig(); - Map ruleDictMap = ruleDictList.stream().collect( - Collectors.toMap(RuleDict::getId, e -> e)); - List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); - for (Map ruleMap : ruleMapList) { - String ruleType = String.valueOf(ruleMap.get("ruleType")); - ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); - NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); - byteDecorator.nodeDecoratorRule(nodeDecoratorParm); - } +// List ruleDictList = ruleDictDao.getRuleDictConfig(); +// Map ruleDictMap = ruleDictList.stream().collect( +// Collectors.toMap(RuleDict::getId, e -> e)); +// List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); +// for (Map ruleMap : ruleMapList) { +// String ruleType = String.valueOf(ruleMap.get("ruleType")); +// ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); +// NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); +// byteDecorator.nodeDecoratorRule(nodeDecoratorParm); +// } return null; } - - private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { - NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() - .contents(sceneConent) - .dynamicContent(dynamicContent) - .ruletypeId(ruletypeId) - .ruleDictMap(ruleDictMap) - .build(); - return nodeDecoratorParm; - } +// +// private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { +// NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() +// .contents(sceneConent) +// .dynamicContent(dynamicContent) +// .ruletypeId(ruletypeId) +// .ruleDictMap(ruleDictMap) +// .build(); +// return nodeDecoratorParm; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java index 652970c..b204ac3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java @@ -1,56 +1,56 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@AllArgsConstructor -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", - JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Component; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Component("logicalDecorator") +//@AllArgsConstructor +//@Slf4j +//public class LogicalShiftDecorator implements ByteDecorator { +// +//// private final FieldRuleEngineMapper fieldRuleEngineMapper; +//// +//// //字节位移 +//// @Override +//// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +//// String logicalValue = ""; +//// RuleEvaluator fieldRuleEngine = new RuleEvaluator(); +//// try { +//// Map env2 = new HashMap(); +//// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +//// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +//// for (String contentId : contentIdList) { +//// RuleDict ruleDict = ruleDictMap.get(contentId); +//// if (ruleDict.getCode().contains("#")) { +//// //使用动态的值 +//// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +//// } +//// env2.put(ruleDict.getName(), ruleDict.getCode()); +//// } +//// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +//// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +//// return null; +//// } +//// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +//// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +//// return values; +//// } catch (Exception ex) { +//// log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", +//// JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +//// return null; +//// } +//// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java index 346468f..822fead 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@AllArgsConstructor -@Slf4j -public class OperationDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("optionDecorator") +//@AllArgsConstructor +//@Slf4j +//public class OperationDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //混合运算,有常量或者乘除的缩放 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java index 50fb0a7..7a8bccb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@AllArgsConstructor -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +////精度计算 +//@AllArgsConstructor +//@Registry("precisionDecorator") +//@Slf4j +//public class PrecisionDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java index da39235..27f9cc7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java @@ -1,54 +1,53 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@AllArgsConstructor -@Slf4j -public class RuleDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("ruleDecorator") +//@AllArgsConstructor +//@Slf4j +//public class RuleDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //吃我一套正则表达式 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (Exception ex) { +// log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java index 7f5cbf3..c043f97 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java @@ -2,6 +2,6 @@ import java.util.Map; -public interface ComandeEventService { +public interface ComandeEventService{ Map loadComandeEventConfig(String protocolId,String scene); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java index 476ad84..aaf1837 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java @@ -2,46 +2,46 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.dao.CommandEventDao; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @Slf4j @AllArgsConstructor -public class ComandeEventServiceImpl implements ComandeEventService { +public class ComandeEventServiceImpl implements ComandeEventRegistry { - private final CommandEventDao commandEventDao; + // private final CommandEventDao commandEventDao; // 加密bean 固定字段出现变化的字段解析,业务字段的有序内容 @Override - public Map loadComandeEventConfig(String protocolId,String sceneName) { - CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); - if (ObjectUtil.isEmpty(commandEventConfig)) { - log.error("协议{},没有配置成功接收回复配置,清排查原因"); - return null; - } - String replyJson = commandEventConfig.getReplyContentJson(); - List> replyMapList = JSONArray.parseObject(replyJson, List.class); - List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); - Map fixMap = fixList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); - List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) - .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) - .collect(Collectors.toList()); - Map commandConfigMap = new HashMap<>(); - commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); - commandConfigMap.put("fixContent", fixMap); - commandConfigMap.put("bizContent", contentList); - return commandConfigMap; + public Map loadComandeEventConfig(String protocolId, String sceneName) { +// CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); +// if (ObjectUtil.isEmpty(commandEventConfig)) { +// log.error("协议{},没有配置成功接收回复配置,清排查原因"); +// return null; +// } +// String replyJson = commandEventConfig.getReplyContentJson(); +// List> replyMapList = JSONArray.parseObject(replyJson, List.class); +// List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); +// Map fixMap = fixList.stream() +// .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); +// List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) +// .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) +// .collect(Collectors.toList()); +// Map commandConfigMap = new HashMap<>(); +// commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); +// commandConfigMap.put("fixContent", fixMap); +// commandConfigMap.put("bizContent", contentList); +// return commandConfigMap; + return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 128b09d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java deleted file mode 100644 index 4016b0b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface DatagramEventMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java deleted file mode 100644 index 597c306..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.apache.ibatis.annotations.Mapper; - -public interface FieldConfigMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java deleted file mode 100644 index a31680a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.PreRuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface PreRuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java deleted file mode 100644 index 9060a69..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface ProtocolConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java deleted file mode 100644 index 6fa6936..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java deleted file mode 100644 index 582a705..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleDict; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleDictMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java deleted file mode 100644 index 6e302c8..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.CommandEventMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Optional; - -@Component -public class CommandEventDao { - - @Resource - private CommandEventMapper commandEventMapper; - - public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId) - .eq("scene", sceneName) - .eq("enabled", 1); - List commandEventConfig = commandEventMapper.selectList(queryWrapper); - Optional optionalEventConfig = commandEventConfig.stream().findFirst(); - return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java deleted file mode 100644 index 9137e4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.FieldConfigMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class FieldConfigDao { - - @Resource - private FieldConfigMapper fieldConfigMapper; - - public FieldConfig getFieldConfigById(String fieldId) { - FieldConfig fieldConfig = fieldConfigMapper.selectById(fieldId); - return fieldConfig; - } - - public List getFieldConfigs(String protocolId,Integer isFixed) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",isFixed); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - - public List getStorageFieldConfig(String protocolId) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",1) - .eq("is_storage",1); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java deleted file mode 100644 index 67bff6b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.mapper.PreRuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class PreRuleConfigDao { - - @Resource - private PreRuleConfigMapper preRuleConfigMapper; - - public List getPreRuleList(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return preRuleConfigMapper.selectList(queryWrapper); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java deleted file mode 100644 index d69ea85..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.RuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleConfigDao { - - @Resource - private RuleConfigMapper ruleConfigMapper; - - public RuleConfig getNextRuleConfig(String ruleFields) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("parse_rule_json", ruleFields); - return ruleConfigMapper.selectOne(queryWrapper); - } - - - public List getRuleConfigById(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return ruleConfigMapper.selectList(queryWrapper); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java deleted file mode 100644 index 932c185..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.RuleDictMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleDictDao { - - @Resource - private RuleDictMapper ruleDictMapper; - - public List getRuleDictConfig() { - List ruleDictList = ruleDictMapper.selectList(null); - return ruleDictList; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java index 9f9e279..43bc4d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java @@ -10,20 +10,15 @@ import io.netty.channel.socket.nio.NioServerSocketChannel; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import javax.annotation.PreDestroy; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static cn.hutool.core.util.ClassUtil.getClasses; /** * SensorhubServer netty服务端 */ @Slf4j -@Service +@Component public class SensorhubServer { /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java index 2c79ff5..9a28c36 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java @@ -11,13 +11,13 @@ import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioSocketChannel; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClient 客户端 */ @Slf4j -@Service +@Registry public final class SensorhubClient { public static void main(String[] args) throws Exception { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java index 9774be0..477c3f7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java @@ -6,12 +6,12 @@ import io.netty.channel.socket.SocketChannel; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientChannelInitialHandler */ -@Service +@Registry public class SensorhubClientChannelInitialHandler extends ChannelInitializer { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java index 346f4b3..73560e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java @@ -5,13 +5,13 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientHandler */ @Slf4j -@Service +@Registry public class SensorhubClientHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java index 5c1c6f2..d990af5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java @@ -4,12 +4,12 @@ import com.casic.missiles.pojo.Msg; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** * SensorhubServerHandler */ -@Service +@Component public class SensorhubServerHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 67283ae..af3172c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,41 +1,37 @@ package com.casic.missiles.parser; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultProtocolConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.*; +import com.casic.missiles.registry.FieldConfigRegistry; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; -import java.nio.charset.Charset; import java.util.HashMap; import java.util.List; import java.util.Map; -@Service("genericProtocolParser") +/** + * @author + */ +@Component("genericProtocolParser") @Slf4j -@AllArgsConstructor +@RequiredArgsConstructor public class GenericProtocolParser implements ProtocolParser { - private final LeadingCodeMatcher leadingCodeMatcher; private final List frameStructDispenserList; - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorInstanceSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; // 匹配首字母前导码=> 帧结构匹配前导码=> // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 @@ -44,18 +40,19 @@ public Boolean doParseProtocol(ByteBuf byteBuf) { String protocolContent = ByteBufUtil.hexDump(byteBuf); //匹配前导码 - List preCodeConfigs = leadingCodeMatcher.matchLeadingCode(protocolContent); + List preCodeConfigs = LeadingCodeMatcher.matchFrameLeadingCode(protocolContent); //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 if (preCodeConfigs.size() == 0) { - return rematch(byteBuf,protocolContent); + return rematch(byteBuf, protocolContent); } - //暂时先取第一个 + //暂时先取第一个,提升速度,使用享元模式, 减少类的创建销毁与构建 ProtocolConfig protocolConfig = preCodeConfigs.get(0); + AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); ByteBuf wholeDatagramByte = null; //通过匹配帧结构获取完整的数据包 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, preCodeConfigs.get(0))) != null) { + if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, protocolFactory)) != null) { break; } } @@ -68,76 +65,78 @@ * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 */ - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId, wholeDatagramByte); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap, protocolId); - //选取规则对应的流程实例 - DatagramEventConfig datagramEventConfig = processorInstanceSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); + //进行规则字段解析,进行匹配规则 + RuleConfig ruleConfig = getRuleConfig(protocolFactory, wholeDatagramByte); + if (ruleConfig == null) { + return false; + } //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, wholeDatagramByte); + ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte); + //以下进行业务的规则解析,同时选定流程实例 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); + DatagramEventProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain, + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText, protocolId); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain); //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); + datagramEventProvider.storeData(bizDataMap); return true; } - private Boolean rematch(ByteBuf byteBuf,String protocolContent) { + /** + * 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 + */ + private Boolean rematch(ByteBuf byteBuf, String protocolContent) { //重置位判断 byteBuf.resetReaderIndex(); //判断重置是否前移,如果没有前移,则直接判为匹配失败 if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { return false; } else { + //递归执行 return doParseProtocol(byteBuf); } } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; + //获取匹配规则->匹配规则 + private RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + //取出其中参与逻辑provider并判空 + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); + String rulePrepareFields = protocolConfig.getRulePrepareFields(); + //固定字段 + if (StringUtils.isNotEmpty(rulePrepareFields)) { + //获取统一固定字段解析 + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + //获取该协议的字段配置,用于协议规则匹配 + List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); + //获取规则 + RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, + rulePrepareFields, protocolFieldConfigs); + return ruleConfig; + } + return null; } - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + //数据构建,获取固定字段的store和业务字段store + private Map buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + Map bizDataMap = new HashMap<>(); + Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); + Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); + bizDataMap.putAll(ruleStoreObjectMap); + bizDataMap.putAll(protocolStoreObjectMap); return bizDataMap; } - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java index 8a46e32..16ce2e5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java @@ -3,6 +3,7 @@ import io.netty.buffer.ByteBuf; public interface ProtocolParser { + Boolean doParseProtocol(ByteBuf byteBuf); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java new file mode 100644 index 0000000..f7814af --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java @@ -0,0 +1,35 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.ProtocolConfigProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.ProtocolConfig; + +/** + * 存放基本协议的的加载信息 + */ +public class AbstractProtocolConfigFactory { + private final ProtocolConfigProvider protocolConfigProvider; + private final ProtocolFieldConfigProvider protocolFieldConfigProvider; + private final RuleConfigProvider ruleConfigProvider; + + public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { + this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); + this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); + this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); + } + + public ProtocolConfigProvider getProtocolConfigProvider() { + return protocolConfigProvider; + } + + public ProtocolFieldConfigProvider getProtocolFieldConfigProvider() { + return protocolFieldConfigProvider; + } + + public RuleConfigProvider getRuleConfigProvider() { + return ruleConfigProvider; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java new file mode 100644 index 0000000..6e36147 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java @@ -0,0 +1,57 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.CombinedFieldConfigProvider; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.FieldConfigProvider; +import com.casic.missiles.parser.provider.FieldRuleConfigProvider; + +/** + * 存放规则相关的的的加载信息 + */ +public class AbstractRuleConfigFactory { + + /** + * 处理字节 + */ + private final FieldConfigProvider fieldConfigProvider; + /** + * 处理组合字节解析的解码器 + */ + private final CombinedFieldConfigProvider combinedFieldConfigProvider; + /** + * 处理负责字节解析的规则配置 + */ + private final FieldRuleConfigProvider fieldRuleConfigProvider; + /** + * 处理实例流程 + */ + private final DatagramEventProvider datagramEventProvider; + + + public AbstractRuleConfigFactory(Long ruleId) { + this.fieldConfigProvider = new FieldConfigProvider(ruleId); + this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); + this.fieldRuleConfigProvider = new FieldRuleConfigProvider(ruleId); + this.datagramEventProvider = new DatagramEventProvider(ruleId); + } + + public FieldConfigProvider getFieldConfigProvider() { + return fieldConfigProvider; + } + + public CombinedFieldConfigProvider getCombinedFieldConfigProvider() { + return combinedFieldConfigProvider; + } + + public FieldRuleConfigProvider getFieldRuleConfigProvider() { + return fieldRuleConfigProvider; + } + + public DatagramEventProvider getDatagramEventProvider() { + return datagramEventProvider; + } + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java deleted file mode 100644 index 6e1719a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.factory; - - -import com.casic.missiles.pojo.ProtocolConfig; - -import java.util.List; - -/** - * 数据库访问优化(暂时未做) - *

- * 1、初始化协议解析配置,并存放到处存放缓存,对协议基本配置进行管理 - * 2、其中流程中所有的配置都经过此类进行管理,进行调用获取,增强解析速度 - */ -public interface DatagramFactory { - - /** - * 初始化 - */ - List datagramInit(); - - /** - * 根据前导码配置匹配,模糊匹配获取所有的报文项 - */ - List match(); - - /** - * 根据前导码匹配,返回报文项 - */ - List filer(); - - /** - * 保证数据的唯一性选择器 - */ - List selectOne(); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java new file mode 100644 index 0000000..87444a0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java @@ -0,0 +1,18 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +import java.util.List; + +/** + * 直接用,还是边用边创建 + */ +public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { + + + public DefaultProtocolConfigFactory(ProtocolConfig protocolConfig) { + super(protocolConfig); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java new file mode 100644 index 0000000..cce0c7c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java @@ -0,0 +1,12 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; + +public class DefaultRuleFactory extends AbstractRuleConfigFactory { + + public DefaultRuleFactory(Long ruleId) { + super(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java deleted file mode 100644 index 9ee97e0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.casic.missiles.parser.instance; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service -@Slf4j -@AllArgsConstructor -public class GeneralProcessor { - - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; - - /** - * 统一固定字段解析=>进行规则的查询的判断 - * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 - * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 - */ - @Deprecated - public boolean parseWholeDatagram(ByteBuf buffer, ProtocolConfig protocolConfig) { - try { - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap,protocolId); - //选取规则对应的流程= - DatagramEventConfig datagramEventConfig = processorSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); - //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); - //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); - //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); - //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); - //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); - return true; - } catch (Exception ex) { - log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", - ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); - return false; - } - } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; - } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); - } - - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); - return bizDataMap; - } - - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java index 25e7ad8..6a5777e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java @@ -1,23 +1,31 @@ package com.casic.missiles.parser.instance.impl; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.mapper.DatagramEventMapper; import com.casic.missiles.pojo.DatagramEventConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.SpringContextUtil; -@Service -@AllArgsConstructor +import java.util.List; +import java.util.Optional; + +/** + * @author cz + * + */ public class DefaultProcessorInstanceSelector implements ProcessorInstanceSelector { - private final DatagramEventMapper datagramEventMapper; + private static List datagramEventConfigs; + + static { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + datagramEventConfigs = datagramEventRegistry.getDatagramEventList(); + } @Override public DatagramEventConfig getProcessorInstance(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("rule_id", protocolId); - return datagramEventMapper.selectOne(queryWrapper); + Optional optionalSelectInstance = datagramEventConfigs.stream() + .filter(e -> e.getId().equals(protocolId)).limit(1).findFirst(); + return optionalSelectInstance.isPresent() ? optionalSelectInstance.get() : null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a778671..7b56a43 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,16 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import io.netty.buffer.ByteBuf; /** - * 分析匹配情况 - * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 - * 2、匹配不成功,有后续帧,可以进行下次匹配。 - * 3、匹配不成功,无后续帧,可以进行丢弃。 + * 分析匹配情况 + * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 + * 2、匹配不成功,有后续帧,可以进行下次匹配。 + * 3、匹配不成功,无后续帧,可以进行丢弃。 */ -public interface FrameStructMatcher{ +public interface FrameStructMatcher { - ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig); + ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 05320ab..8ebea78 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,23 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.ProtocolConfigMapper; +import com.casic.missiles.parser.provider.ProtocolConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Component; import java.util.List; import java.util.stream.Collectors; -@Component -@AllArgsConstructor public class LeadingCodeMatcher { - private final ProtocolConfigMapper protocolMapper; - //** 1、首字母匹配前导码, // 2、以匹配出的前导码是否在报文中条件进行前导码的匹配二次筛选 - public List matchLeadingCode(String protocolContent){ + public static List matchFrameLeadingCode(String protocolContent){ List initialConfigs = initialMatch(protocolContent); List preCodeConfigs = initialConfigs.stream() .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) @@ -26,13 +19,16 @@ } //初始化匹配前导码内容 - private List initialMatch(String protocolContent) { - String protocolStr = protocolContent.charAt(0) + ""; - QueryWrapper queryWrapper = new QueryWrapper() - .likeRight("pre_fix", protocolStr); - List protocolConfigList = protocolMapper.selectList(queryWrapper); - return protocolConfigList; + private static List initialMatch(String protocolContent) { + String firstFrameChar = protocolContent.charAt(0) + ""; + ProtocolConfigProvider protocolConfigProvider=new ProtocolConfigProvider(firstFrameChar); + return protocolConfigProvider.getMatchList(); } + + + + + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index cf2113d..e915877 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -1,32 +1,35 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(0) -@Service +@Component public class FrameLengthMatcher implements FrameStructMatcher { - @Autowired - private FieldParser fieldParser; - //超过长度 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { String dataGramContent = ByteBufUtil.hexDump(byteBuf); - if (StringUtils.isEmpty(protocolConfig.getUnpackId()) && StringUtils.isEmpty(protocolConfig.getTailStr())) { - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + //当不存在结尾标志和拆包标志,可以直接使用长度进行匹配 + if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { if (dataGramContent.length() >= totalLength) {//等于长度返回true,超出长度,切断 - ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, protocolConfig, totalLength); + ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, totalLength); return wholeDatagramByte; } else { //读的标志位前移舍弃 @@ -38,7 +41,7 @@ return null; } - private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, Integer totalLength) { byteBuf.readBytes(totalLength); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, totalLength - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 2bfc213..d527ad0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; @@ -13,7 +13,7 @@ import lombok.AllArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.nio.charset.Charset; import java.util.Map; @@ -22,32 +22,30 @@ * 后续标志验证 */ @Order(1) -@Service +@Component @AllArgsConstructor -public class FrameMarkMatcher implements FrameStructMatcher { - - private final FieldConfigDao fieldConfigDao; - private final FieldParser fieldParser; - private final FieldResolver fieldResolverManger; +public class FrameMarkMatcher implements FrameStructMatcher, FixedPropertyEnum { //帧后续标志=>结束,进行帧的重组=>有后续,1、帧移位判别 2、继续接收帧 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig UnpackConfig = StringUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getUnpackId()); - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); - Integer upback = 0; + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); ByteBuf mergeWholeFrameByte = null; - if (!ObjectUtil.isEmpty(UnpackConfig)) { - while (hasNextFullFrame(byteBuf, protocolConfig)) { - upback = (Integer) fieldResolverManger.filedParserManger(byteBuf, UnpackConfig, null); + if (!ObjectUtil.isEmpty(unpackFlag)) { + while (hasNextFullFrame(byteBuf, protocolConfig, protocolFieldConfigProvider)) { //是否存在后续位 - if (upback == 1) {//使用esayRule + if (unpackFlag == 1) {//使用esayRule //表示可以截取 - mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolConfig, totalLength); + mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolFieldConfigProvider, protocolConfig); return mergeWholeFrameByte; } else { - byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig)); + byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig, protocolFieldConfigProvider)); } } } @@ -56,7 +54,8 @@ //选取第一个帧,将业务内容和后面部分分开 //计算数据报文-业务内容 - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolFieldConfigProvider protocolFieldConfigProvider, ProtocolConfig protocolConfig) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); //截取完整报文 byteBuf.readBytes(totalLength); ByteBuf byteBufContent = byteBuf.slice(0, byteBuf.readerIndex()); @@ -68,15 +67,15 @@ String tail = ""; System.out.println(ByteBufUtil.hexDump(byteBufContent)); //会存在多个帧拼接在一起的的情况,进行合并处理 - while (hasNextFullFrame(byteBufContent, protocolConfig)) { - Integer currentFrameLength = fieldParser.getTotalLength(protocolConfig, byteBufContent); + while (hasNextFullFrame(byteBufContent, protocolConfig, protocolFieldConfigProvider)) { + Integer currentFrameLength = protocolFieldConfigProvider.getTotalLength(byteBufContent, protocolConfig); byteBufContent.readBytes(currentFrameLength); ByteBuf currentbyteBuf = byteBufContent.slice(0, byteBufContent.readerIndex()); byteBufContent.markReaderIndex();//读的标志位前移 System.out.println(ByteBufUtil.hexDump(byteBufContent)); String hexDump = currentbyteBuf.toString(Charset.forName("ISO-8859-1")); //获取当前固定帧结构的关系map - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, currentbyteBuf); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(currentbyteBuf, protocolConfig); if (StringUtils.isEmpty(mergeFrameStr)) { //首次获取业务数据报文 mergeFrameStr += hexDump.substring(0, currentFrameFixedProperty.get("tailPosition")); @@ -95,22 +94,22 @@ /** * 获取平移到下一帧起始位置 */ - public int getNextFrameOffset(ByteBuf buffer, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, buffer); - return currentFrameFixedProperty.get("totalLength"); + public int getNextFrameOffset(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + return currentFrameFixedProperty.get(TOTAL_LENGTH); } /** * 判断是否出错进行整个帧的 */ - public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, byteBuf); + public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); //保证读取位置不在固定位置,是可变的业务内容 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("fixedPosition")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(FIXED_POSITION)) { return false; } //判断读取是否操作帧长度 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("totalLength")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(TOTAL_LENGTH)) { return false; } return true; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 76a3784..c3a1bab 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -1,50 +1,50 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.parser.instance.GeneralProcessor; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; +import io.netty.buffer.ByteBufUtil;; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(2) -@Service +@Component public class FrameTailMatcher implements FrameStructMatcher { - @Resource - private FieldConfigDao fieldConfigDao; - @Autowired - private GeneralProcessor generalProcessor; - //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig tailFieldConfig = StringUtils.isEmpty(protocolConfig.getTailStr()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getTailStr()); - if (!ObjectUtil.isEmpty(tailFieldConfig)) { - String tailStr = tailFieldConfig.getFieldName(); + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfig protocolFieldConfig = ObjectUtils.isEmpty(protocolConfig.getTailStr()) ? null : + fieldConfigProvider.getFieldConfigById(protocolConfig.getTailStr()); + if (!ObjectUtil.isEmpty(protocolFieldConfig)) { + String tailStr = protocolFieldConfig.getFieldName(); String dataGramContent = ByteBufUtil.hexDump(byteBuf); Boolean tailFlag = ByteBufUtil.hexDump(byteBuf).contains(tailStr); if (!tailFlag) { //使用esayRule return null; } else if (dataGramContent.indexOf(tailStr) < dataGramContent.length() - tailStr.length()) { Integer length = dataGramContent.indexOf(tailStr) + tailStr.length(); - ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, protocolConfig, length); + ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, length); return wholeDatagramByte; //存在粘包 } } return null; } - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer length) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, Integer length) { byteBuf.readBytes(length); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, length - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java new file mode 100644 index 0000000..5f1c177 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java @@ -0,0 +1,73 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.combined.GenericCombinedFieldResolver; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.CombinedFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class CombinedFieldConfigProvider { + + + /** + * 作为临时配置列表缓存使用 + */ + private final List combinedFieldConfigList; + private Map storeObjectMap = new HashMap<>(); + + public CombinedFieldConfigProvider(Long ruleId) { + CombinedFieldConfigRegistry combinedFieldConfigRegistry = SpringContextUtil.getBean(CombinedFieldConfigRegistry.class); + combinedFieldConfigList = combinedFieldConfigRegistry.getCombinedFieldConfigList(ruleId); + } + + public void parseDataField(RuleConfig ruleConfig, String clearZeroPlain,Map fieldConfigsMap ) { + if (showSkip()) { + return; + } + //匹配对应的数据,然后进行相关的字段解析 + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver(); + combinedFieldResolver.parseDataField(combinedFieldConfigList, byteBuf, storeObjectMap,fieldConfigsMap); + } + + + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getCombinedFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return combinedFieldConfigList.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public List getCombinedFieldConfigList() { + return combinedFieldConfigList; + } + + /* 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(combinedFieldConfigList) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java new file mode 100644 index 0000000..f3cfedc --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java @@ -0,0 +1,11 @@ +package com.casic.missiles.parser.provider; + +/** + * @author cz + * @date 2023-6-12 + */ +public class CommandEventProvider{ + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java new file mode 100644 index 0000000..70eec5e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java @@ -0,0 +1,77 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.safe.SafeStrategy; +import com.casic.missiles.parser.sender.DataSubscribeProvider; +import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class DatagramEventProvider { + + private final DatagramEventConfig processorInstance; + + public DatagramEventProvider(Long ruleId) { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + List datagramEventConfigList = + datagramEventRegistry.getDatagramEventList(ruleId); + processorInstance = this.getProcessorInstance(datagramEventConfigList); + } + + public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { + if (showSkip()) { + return null; + } + return datagramEventConfigList.get(0); + } + + // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 + public String getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap) { + String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? + processorInstance.getSafeBean() : + fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); + if (!StringUtils.isEmpty(safeName)) { + //需要加密 + SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); + String plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); + return clearComplementZero(plain); + } + return ByteBufUtil.hexDump(bizDataContent); + } + + //解密清零操作 + private String clearComplementZero(String plain) { + plain = plain.substring(0, plain.lastIndexOf("00")); + return plain; + } + + //数据发送,数据发送者暂未构建 + public void storeData(Map bizDataMap) { + DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); +// dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return ObjectUtils.isNotEmpty(processorInstance) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java new file mode 100644 index 0000000..7e1fe0a --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java @@ -0,0 +1,97 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.FieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class FieldConfigProvider { + + + private final List fieldConfigs; + private Map storeObjectMap = new HashMap<>(); +// private Map singleObjects = new ConcurrentHashMap<>(); + + public FieldConfigProvider(Long ruleId) { + FieldConfigRegistry fieldConfigRegistry = SpringContextUtil.getBean(FieldConfigRegistry.class); + fieldConfigs = fieldConfigRegistry.getFieldConfigList(ruleId); + } + + public List getFieldConfigs() { + return fieldConfigs; + } + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public Map parseDataField(RuleConfig ruleConfig, String clearZeroPlain) { + if (showSkip()) { + return null; + } + List prepareFieldConfig = prepareParseField(ruleConfig); + if (CollectionUtils.isNotEmpty(prepareFieldConfig)) { + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(fieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + return fixDataMap; + } + } + return null; + } + + /** + * 得到需要处理的业务内容 + * + * @return + */ + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return fieldConfigs.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public Map getFieldConfigsMap() { + return fieldConfigs.stream().collect( + Collectors.toMap(FieldConfig::getId, e -> e) + ); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(fieldConfigs) ? false : true; + } + + +} + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java new file mode 100644 index 0000000..817bfaf --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java @@ -0,0 +1,19 @@ +package com.casic.missiles.parser.provider; + +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.registry.FieldRuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; + +public class FieldRuleConfigProvider { + + private final List fieldRuleConfigList; + + public FieldRuleConfigProvider(Long ruleId) { + FieldRuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(FieldRuleConfigRegistry.class); + fieldRuleConfigList = ruleConfigRegistry.getFieldRuleConfigList(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java new file mode 100644 index 0000000..99a1b06 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java @@ -0,0 +1,53 @@ +package com.casic.missiles.parser.provider; + + +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.registry.ProtocolConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolConfigProvider { + + private final List protocolConfigList; + + public ProtocolConfigProvider(String firstChar) { + ProtocolConfigRegistry registry = SpringContextUtil.getBean(ProtocolConfigRegistry.class); + protocolConfigList = registry.getProtocolConfigList(firstChar); + } + + public List getMatchList() { + return protocolConfigList; + } + + /** + * 设置当前协议 + * + * @param protocolConfig + */ + public ProtocolConfigProvider(ProtocolConfig protocolConfig) { + List protocolConfigs = new ArrayList<>(); + protocolConfigs.add(protocolConfig); + protocolConfigList = protocolConfigs; + } + + /** + * 获取当前协议 + * + * @return + */ + public ProtocolConfig getCurrentProtocolConfig() { + if (this.protocolConfigList == null) { + return null; + } else { + return protocolConfigList.get(0); + } + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java new file mode 100644 index 0000000..043927d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java @@ -0,0 +1,213 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.registry.ProtocolFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolFieldConfigProvider { + + private static final String FIXED_FIELD_DS = "fixedFieldDs"; + private static final String CONTENT_FIELD_DS = "contentFieldDs"; + private static final String PROTOCOL_LENGTH = "protocolLength"; + private static final String PROTOCOL_FIELD_ID = "protocolFieldId"; + private static final String PROTOCOL_POSITION = "protocolPosition"; + + private final List protocolFieldConfigs; + private Map singleObjects = new ConcurrentHashMap<>(); + private Map storeObjectMap = new HashMap<>(); + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public ProtocolFieldConfigProvider(Long protocolId) { + ProtocolFieldConfigRegistry protocolFieldConfigRegistry = SpringContextUtil.getBean(ProtocolFieldConfigRegistry.class); + protocolFieldConfigs = protocolFieldConfigRegistry.getProtocolFieldConfigList(protocolId); + } + + public List getProtocolFieldConfigs() { + return protocolFieldConfigs; + } + + public ProtocolFieldConfig getFieldConfigById(Long fieldId) { + Optional optionalConfig = protocolFieldConfigs.stream().filter( + e -> e.getId().equals(fieldId) + ).findFirst(); + return optionalConfig.isPresent() ? optionalConfig.get() : null; + } + + public Integer getProtocolFieldValue(Long protocolFieldId, ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_FIELD_ID + protocolFieldId + ByteBufUtil.hexDump(byteBuf); + //获取缓存 + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + //加载固定长度数据集合 + Map fixDataMap = this.getProtocolDataMap(byteBuf); + ProtocolFieldConfig protocolFieldConfig = selectFieldConfig(protocolFieldId); + Integer protocolFieldValue = 0; + //获取约定字段的总长度 + if (fixDataMap.containsKey(protocolFieldConfig.getFieldName())) { + Object appointUnpackObject = fixDataMap.get(protocolFieldConfig.getFieldName()); + if (ObjectUtils.isNotEmpty(appointUnpackObject)) { + protocolFieldValue = (Integer) appointUnpackObject; + } + } + if (protocolFieldValue != null) { + //加入缓存 + if (ObjectUtils.isNotEmpty(protocolFieldValue)) { + this.singleObjects.put(catchKey, protocolFieldValue); + return protocolFieldValue; + } + } + return null; + } + + /** + * 获取帧固定位置信息 + * + * @param byteBuf + * @param protocolConfig + * @return + */ + public Map getFixedProperty(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_POSITION + protocolConfig.getId(); + if (this.singleObjects.containsKey(catchKey)) { + return (Map) singleObjects.get(catchKey); + } + Map fixedPropertyMap = new HashMap<>(); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + fixedPropertyMap = fieldParser.doGetFixedProperty(protocolFieldConfigs, this.getTotalLength(byteBuf,protocolConfig)); + if (CollectionUtils.isNotEmpty(fixedPropertyMap)) { + this.singleObjects.put(catchKey, fixedPropertyMap); + return fixedPropertyMap; + } + return fixedPropertyMap; + } + + /** + * 获取帧结构应有的总长度 + */ + public Integer getTotalLength(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_LENGTH + ByteBufUtil.hexDump(byteBuf); + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + Integer appointFrameLength = getProtocolFieldValue(protocolConfig.getTotalLengthId(), byteBuf); + if (appointFrameLength != null) { + //获取过滤的字段集合总长度 + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Integer totalFilterLength = fieldParser.getTotalFilterLength(protocolConfig, byteBuf, getFixFieldConfigMap()); + //计算总长度 + Integer totalLength = appointFrameLength + totalFilterLength; + //加入缓存 + if (ObjectUtils.isNotEmpty(totalLength)) { + this.singleObjects.put(catchKey, totalLength); + return totalLength; + } + } + return null; + } + + /** + * 获取协议有关字段解析内容 + * storeObjectMap存储代转存的数据 + * + * @return + */ + public Map getProtocolDataMap(ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(FIXED_FIELD_DS)) { + return (Map) singleObjects.get(FIXED_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(protocolFieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + this.singleObjects.put(FIXED_FIELD_DS, fixDataMap); + return fixDataMap; + } + return null; + } + + /** + * 获取业务报文内容的content字节 + * + * @param wholeDatagramByte + * @return + */ + public ByteBuf getDataContentBuf(ByteBuf wholeDatagramByte) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(CONTENT_FIELD_DS)) { + return (ByteBuf) singleObjects.get(CONTENT_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + ByteBuf bizDataByteBuf = fieldParser.getDataContentBuf(protocolFieldConfigs, wholeDatagramByte); + if (bizDataByteBuf != null) { + this.singleObjects.put(CONTENT_FIELD_DS, bizDataByteBuf); + return bizDataByteBuf; + } + return null; + } + + + private ProtocolFieldConfig selectFieldConfig(Long id) { + Optional optionalProtocolFieldConfig = this.protocolFieldConfigs.stream().filter( + e -> e.getId().equals(id) + ).findFirst(); + return optionalProtocolFieldConfig.isPresent() ? optionalProtocolFieldConfig.get() : null; + } + + + private Map getFixFieldConfigMap() { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, e -> e) + ); + return fixDataFieldMap; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(protocolFieldConfigs) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java new file mode 100644 index 0000000..dafba1c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java @@ -0,0 +1,56 @@ +package com.casic.missiles.parser.provider; + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.rule.GenericRuleResolver; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.RuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleConfigProvider { + + private final List ruleConfigs; + + public List getRuleConfigs() { + return ruleConfigs; + } + + public RuleConfigProvider(Long protocolId) { + RuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(RuleConfigRegistry.class); + ruleConfigs = ruleConfigRegistry.getRuleConfigById(protocolId); + } + + /** + * 获取规则匹配结果 + * + * @param parseFixedDataMap + * @param protocolFieldConfigs + * @return + */ + public RuleConfig doGetRule(Map parseFixedDataMap, + String ids, + List protocolFieldConfigs) { + if (showSkip()) { + return null; + } + RuleConfig ruleConfig = GenericRuleResolver.machRule(parseFixedDataMap, ids, protocolFieldConfigs, ruleConfigs); + return ruleConfig; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(ruleConfigs) ? false : true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java index 3c05891..856b399 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java @@ -1,18 +1,11 @@ package com.casic.missiles.parser.resolver; -import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.springframework.web.bind.annotation.RequestBody; -import javax.annotation.Resource; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -20,19 +13,17 @@ @Slf4j public class ByteMergeProvider { - @Resource - private FieldRuleEngineMapper fieldRuleEngineMapper; - //拿到所有的值合并到一个值 - public String resolveByteMerge(List valueList, String ruletypeId, String vaildRange) { + public static String resolveByteMerge(List valueList, String ruleTypeId, String vaildRange) { String values = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Map vaildMap = getValidRangeMap(vaildRange); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(ruletypeId); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } + //暂时不处理 +// fieldRuleEngine = fieldRuleConfigMapper.selectById(ruleTypeId); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } Map env2 = new HashMap(); for (int i = 0; i < valueList.size(); i++) { if (vaildMap.containsKey(i)) { @@ -47,7 +38,7 @@ } } - private Map getValidRangeMap(String vaildRange) { + private static Map getValidRangeMap(String vaildRange) { String[] range = vaildRange.split(","); Map vaildMap = new HashMap(); for (int i = 0; i < range.length; i++) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 8d821cd..85d6bbf 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -1,9 +1,12 @@ package com.casic.missiles.parser.resolver; +import com.casic.missiles.pojo.AbstractFieldConfig; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; import io.netty.buffer.ByteBuf; +import java.util.List; import java.util.Map; /** @@ -11,18 +14,14 @@ */ public interface FieldParser { -// Map fieldProcess(String protocolContent,); - Map dataParser(RuleConfig ruleConfig, String lightText,String protocolId); + Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength); - Map fixDataParser(String protocolId, ByteBuf buffer); + Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap); - Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf); + ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer); - ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer); - - ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer); - - Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer); + Integer getTotalFilterLength(ProtocolConfig protocolConfig, ByteBuf byteBuf, Map protocolFieldConfigMap); } + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java new file mode 100644 index 0000000..9e0c00e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java @@ -0,0 +1,52 @@ +package com.casic.missiles.parser.resolver; + +import com.casic.missiles.pojo.AbstractFieldConfig; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.util.List; + +public class FieldParserSupport { + + //分别计算bit和byte长度=> 合并长度 + protected Integer calculateLength(List fieldConfigList) { + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + Integer fixedLength = bytefixedLength + bitfixedLength / 8; + return fixedLength; + } + + //找到最大值=> 根据最大值计算业务数据下标 + protected Integer calculatePosition(List fieldConfigList) { + String rex = "[0-9]+"; + Integer max = -1; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) + && Integer.valueOf(fieldConfig.getOriginPositionByte()) > max) { + max = Integer.valueOf(fieldConfig.getOriginPositionByte()); + } + } + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) && fieldConfig.getOriginPositionByte().equals(max)) { + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + } + } + Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; + return maxFixedPosition; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java deleted file mode 100644 index dd3a6cd..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java +++ /dev/null @@ -1,170 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.ByteResolverParam; -import io.netty.buffer.ByteBuf; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -/** - * 字段解析管理总类 - */ -@Service -@Slf4j -@AllArgsConstructor -public class FieldResolver extends ByteMergeProvider { - - //1、字段截取 => 2、简单的字节解析和复杂的字节解析 - public Object filedParserManger(ByteBuf byteBuf, FieldConfig fieldConfig, Integer maxFixedPosition) { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - //最大固定位置不为空, - if (!ObjectUtil.isEmpty(maxFixedPosition)) { - orignPosition -= maxFixedPosition; - } - Object fieldValue = 0; - //待优化 - if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { - fieldValue = bitToResolver(byteBuf, fieldConfig); - } else { - ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); - fieldValue = parsingFields(fieldBytes, fieldConfig.getRuleJson()); - } - return fieldValue; - } - - //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, - //目前默认配置的规则设置暂不支持配置化,由实现完成 - private Object parsingFields(ByteBuf byteBuf, String ruleJson) { - Object fieldsResolveValue = null; - List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); - if (ObjectUtil.isEmpty(ruleMapList)) { - fieldsResolveValue = defaultResolveBuilder(byteBuf); - } else { - fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); - } - return fieldsResolveValue; - } - - private Object defaultResolveBuilder(ByteBuf byteBuf) { - Integer defaultResolveValue = 0; - for (int i = 0; i < byteBuf.writerIndex(); i++) { - defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; - } - return defaultResolveValue; - } - - //字段解析构建器(针对字节单位的) - //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 - // 字节归并结束或者规则结束=>继续根据规则进行判断 - private Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { - Object customizeResolveValue = null; - try { - List bytStrList = new ArrayList<>(); - //存放到数组里面 - for (int i = 0; i < byteBuf.writerIndex(); i++) { - bytStrList.add(byteBuf.readByte()); - } - int i = 0; - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - customizeResolveValue = this.resolveByteMerge(bytStrList, ruletypeId,vaildRange); - break; - } else { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - List tempBytStr = new ArrayList<>(); - for (int k = 0; i < bytStrList.size(); i++) { - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(k) - .value(bytStrList.get(k)) - .ruletypeId(ruletypeId).build(); - tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); - } - bytStrList = tempBytStr; - } - i++; - } - //字节归并到一起=>继续根据规则进行判断 - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(customizeResolveValue) - .ruletypeId(ruletypeId).build(); - customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(customizeResolveValue)); - return customizeResolveValue; - } catch (RuntimeException ex) { - log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); - return null; - } - } - - /** - * 1、单个字节情况表示字段 - * 2、多字节情况表示字段(暂未处理) - */ - private Object bitToResolver(ByteBuf byteBuf, FieldConfig fieldConfig) { - Object fieldValue = new Object(); - try { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - byte fields = 0x00; - if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); - } else { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); - } - - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { - if (!StringUtils.isEmpty(fieldConfig.getExactOrignPosition())) { - fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getExactOrignPosition())).byteValue() - >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); - } else { - fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); - } - } else { - fieldValue = Integer.valueOf(fields & 0xff); - } - if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { - return fieldValue; - } - List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); - int i = 0; - //字节归并到一起=>继续根据规则进行判断 - while (i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(fieldValue) - .ruletypeId(ruletypeId).build(); - fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(fieldValue)); - return fieldValue; - } catch (RuntimeException ex) { - log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); - return null; - } - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java new file mode 100644 index 0000000..1d2aeab --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java @@ -0,0 +1,36 @@ +package com.casic.missiles.parser.resolver.bytes; + +import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.mapper.FieldRuleConfigMapper; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.pojo.ByteResolverParam; +import com.googlecode.aviator.AviatorEvaluator; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; +//转换规则 +@Component("convert") +@AllArgsConstructor +@Slf4j +public class ByteRuleResolver implements ByteResolver { + + private final FieldRuleConfigMapper fieldRuleConfigMapper; + + @Override + public Object resolveOperationRule(ByteResolverParam byteResolverParam){ + FieldRuleConfig fieldRuleEngine=fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); + if(ObjectUtil.isEmpty(fieldRuleEngine)){ + return byteResolverParam.getValue(); + } + String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); + Map env2 = new HashMap(); + env2.put("value", (byte) byteResolverParam.getValue()); + String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); + return values; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java index 103821c..786b71c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java @@ -2,34 +2,34 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("logicalShift") +@Component("logicalShift") @AllArgsConstructor @Slf4j public class LogicalShiftResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //字节位移 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { Integer index = byteResolverParam.getIndex(); - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return byteResolverParam.getValue(); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java index 476747d..01149bd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("operation") +@Component("operation") @AllArgsConstructor @Slf4j public class OperationResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //混合运算,有常量或者乘除的缩放 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java index 0b82cf4..79abcce 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.casic.missiles.pojo.ByteResolverParam; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; //精度计算 -@Service("precision") +@Component("precision") @AllArgsConstructor @Slf4j public class PrecisionResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java deleted file mode 100644 index 5c3f332..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; -//转换规则 -@Service("convert") -@AllArgsConstructor -@Slf4j -public class RuleResolver implements ByteResolver { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam){ - RuleEvaluator fieldRuleEngine=fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); - if(ObjectUtil.isEmpty(fieldRuleEngine)){ - return byteResolverParam.getValue(); - } - String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); - Map env2 = new HashMap(); - env2.put("value", (byte) byteResolverParam.getValue()); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java new file mode 100644 index 0000000..d3bbd91 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java @@ -0,0 +1,15 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; + +import java.util.List; +import java.util.Map; +// 前导码匹配->长度字段 +public interface AbstractCombinedFieldProcessor { + + Map invoke(Map map, ByteBuf byteBuf, List combinedFieldConfigList, + Map fieldConfigsMap, Map storeObjectMap); + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java new file mode 100644 index 0000000..03c8480 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java @@ -0,0 +1,59 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-13 + */ +//依次递增进行数据的解析, +public class GenericCombinedFieldResolver { + + + //通过查询,字段长度长度随机 + public void parseDataField(List combinedFieldConfigList, ByteBuf byteBuf, + Map storeObjectMap, Map fieldConfigsMap) { + Integer frameLength = Integer.valueOf(ByteBufUtil.hexDump(byteBuf)); + //添加前置处理器 + com.casic.missiles.util.ClassUtil classUtil = new com.casic.missiles.util.ClassUtil(); + List abstractCombinedProcessors = classUtil.getSubClassList(AbstractCombinedFieldProcessor.class); + + Map fieldFixedMap = combinedFieldLeadCodeMap(combinedFieldConfigList); + //frameLength + Map combinedProcessorFields = null; + while (byteBuf.readableBytes() < frameLength) { + //一直处理 + for (AbstractCombinedFieldProcessor abstractCombinedProcessor : abstractCombinedProcessors) { + combinedProcessorFields = abstractCombinedProcessor.invoke(combinedProcessorFields, byteBuf, + combinedFieldConfigList, + fieldConfigsMap, storeObjectMap); + if (combinedProcessorFields == null || byteBuf.readableBytes() < frameLength) { + return; + } + } + + } + } + + /** + * 取出前导码匹配集合 + */ + private Map combinedFieldLeadCodeMap(List combinedFieldConfigList) { + Map fieldFixedMap = combinedFieldConfigList + .stream() + .collect(Collectors.toMap(CombinedFieldConfig::getPrefixCode, e -> e)); + return fieldFixedMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java new file mode 100644 index 0000000..643a934 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java @@ -0,0 +1,100 @@ +package com.casic.missiles.parser.resolver.fields; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.FieldParserSupport; +import com.casic.missiles.pojo.*; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 保存使用时最基本的信息,并且使用原型模式 + */ +@Slf4j +public class DefaultProtocolFieldParser extends FieldParserSupport implements FieldParser, FixedPropertyEnum { + + //通过传入的配置和报文进行字段解析 + @Override + public Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap) { + Map dataMap = new HashMap<>(); + for (AbstractFieldConfig protocolFieldConfig : protocolFieldConfigs) { + if (!ObjectUtils.isEmpty(protocolFieldConfig.getOriginPositionByte())) { + Object fieldValue = FieldResolver.parseField(buffer, protocolFieldConfig, null); + if (protocolFieldConfig.getIsStorage() == 1) { + storeObjectMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + dataMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + } + return dataMap; + } + + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength) { + Map fixedPropertyMap = new HashMap<>(); + Integer fixedLength = calculateLength(protocolFieldConfigs); + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + fixedPropertyMap.put(FIXED_POSITION, maxFixedPosition); + fixedPropertyMap.put(TOTAL_LENGTH, totalLength); + fixedPropertyMap.put(TAIL_POSITION, totalLength - fixedLength + maxFixedPosition); + return fixedPropertyMap; + } + + //** 获取业务内容的byteBuf + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer) { + //计算固定长度 + Integer fixedLength = calculateLength(protocolFieldConfigs); + //总长度获取 + String lightText = buffer.toString(Charset.forName("ISO-8859-1")); + Integer totalLength = lightText.length(); + //计算固定长度最大长度 + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + //计算数据报文内容 + ByteBuf bizDataFields = buffer.slice(maxFixedPosition - 1, (totalLength - fixedLength)); + return bizDataFields; + } + + /** + * 获取过滤字段的长度 + */ + @Override + public Integer getTotalFilterLength(ProtocolConfig protocolConfig, + ByteBuf byteBuf, + Map protocolFieldConfigMap) { + if (ByteBufUtil.hexDump(byteBuf).equals("")) { + return 0; + } + int totalFilterLength = 0; + String filterFields = protocolConfig.getTotalLengthFilterFields(); + try { + if (!StringUtils.isEmpty(filterFields)) { + String[] filterFieldList = filterFields.split(","); + for (String filterFieldId : filterFieldList) { + if (StringUtils.isNotEmpty(filterFieldId)) { + ProtocolFieldConfig fieldConfig = protocolFieldConfigMap.get(Long.valueOf(filterFieldId)); + //这里都是按字节计算,没有对位进行区分,可能会出现错误 + // 如果对位有需求,需要进一步跟进 + totalFilterLength += fieldConfig.getOffsetLength(); + } + } + } + return totalFilterLength; + } catch (Exception ex) { + log.error("报文确认分发阶段,获取报文总长度过滤长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); + } + return totalFilterLength; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java new file mode 100644 index 0000000..d51e887 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java @@ -0,0 +1,169 @@ +package com.casic.missiles.parser.resolver.fields; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.parser.resolver.ByteMergeProvider; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.AbstractFieldConfig; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.pojo.ByteResolverParam; +import io.netty.buffer.ByteBuf; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * 字段解析管理总类 + */ +@Slf4j +public class FieldResolver extends ByteMergeProvider { + + //1、字段截取 => 2、简单的字节解析和复杂的字节解析 + public static Object parseField(ByteBuf byteBuf,AbstractFieldConfig fieldConfig, Integer maxFixedPosition) { + Integer orignPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + //最大固定位置不为空, + if (!ObjectUtil.isEmpty(maxFixedPosition)) { + orignPosition -= maxFixedPosition; + } + Object fieldValue = 0; + //待优化 + if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { + fieldValue = doParseBitField(byteBuf, fieldConfig); + } else { + ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); + fieldValue = doParseByteField(fieldBytes, fieldConfig.getRuleJson()); + } + return fieldValue; + } + + //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, + //目前默认配置的规则设置暂不支持配置化,由实现完成 + private static Object doParseByteField(ByteBuf byteBuf, String ruleJson) { + Object fieldsResolveValue = null; + List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); + if (ObjectUtil.isEmpty(ruleMapList)) { + fieldsResolveValue = defaultResolveBuilder(byteBuf); + } else { + fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); + } + return fieldsResolveValue; + } + + private static Object defaultResolveBuilder(ByteBuf byteBuf) { + Integer defaultResolveValue = 0; + for (int i = 0; i < byteBuf.writerIndex(); i++) { + defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; + } + return defaultResolveValue; + } + + //字段解析构建器(针对字节单位的) + //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 + // 字节归并结束或者规则结束=>继续根据规则进行判断 + private static Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { + Object customizeResolveValue = null; + try { + List bytStrList = new ArrayList<>(); + //存放到数组里面 + for (int i = 0; i < byteBuf.writerIndex(); i++) { + bytStrList.add(byteBuf.readByte()); + } + int i = 0; + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { + if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + customizeResolveValue = resolveByteMerge(bytStrList, ruletypeId, vaildRange); + break; + } else { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + List tempBytStr = new ArrayList<>(); + for (int k = 0; i < bytStrList.size(); i++) { + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(k) + .value(bytStrList.get(k)) + .ruletypeId(ruletypeId).build(); + tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); + } + bytStrList = tempBytStr; + } + i++; + } + //字节归并到一起=>继续根据规则进行判断 + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(null) + .value(customizeResolveValue) + .ruletypeId(ruletypeId).build(); + customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); + i++; + } + System.out.println(JSON.toJSON(customizeResolveValue)); + return customizeResolveValue; + } catch (RuntimeException ex) { + log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); + return null; + } + } + + /** + * 1、单个字节情况表示字段 + * 2、多字节情况表示字段(暂未处理) + */ + private static Object doParseBitField(ByteBuf byteBuf,AbstractFieldConfig fieldConfig) { + Object fieldValue = new Object(); + try { + Integer orignPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + byte fields = 0x00; + if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { + fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); + } else { + fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); + } + + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { + if (!StringUtils.isEmpty(fieldConfig.getOriginPositionBit())) { + fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getOriginPositionBit())).byteValue() + >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); + } else { + fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); + } + } else { + fieldValue = Integer.valueOf(fields & 0xff); + } + if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { + return fieldValue; + } + List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); + int i = 0; + //字节归并到一起=>继续根据规则进行判断 + while (i < ruleMapList.size()) { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(null) + .value(fieldValue) + .ruletypeId(ruletypeId).build(); + fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); + i++; + } + System.out.println(JSON.toJSON(fieldValue)); + return fieldValue; + } catch (RuntimeException ex) { + log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); + return null; + } + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java deleted file mode 100644 index 35ae3d0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java +++ /dev/null @@ -1,183 +0,0 @@ -package com.casic.missiles.parser.resolver.fields; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufAllocator; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; -import org.springframework.util.ObjectUtils; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service("standard") -@AllArgsConstructor -@Slf4j -public class StandardFieldParser implements FieldParser { - - private final FieldConfigDao fieldConfigDao; - private final FieldResolver fieldResolver; - - //数据解析 - @Override - public Map dataParser(RuleConfig ruleConfig, String lightText, String protocolId) { - String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); - ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); - bufferContent.writeBytes(lightText.getBytes(Charset.forName("ISO-8859-1"))); - Map dataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - for (String dataFieldId : dataFieldIds) { - FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(dataFieldId); - if (!ObjectUtils.isEmpty(fieldConfig)) { - dataMap.put(fieldConfig.getFieldName(), String.valueOf(fieldResolver.filedParserManger(bufferContent, fieldConfig, maxFixedPosition))); - } - } - return dataMap; - } - - //数据解析 - @Override - public Map fixDataParser(String protocolId, ByteBuf buffer) { - List dataFieldIdList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Map dataMap = new HashMap<>(); - for (FieldConfig dataField : dataFieldIdList) { - if (!ObjectUtils.isEmpty(dataField.getOrignPosition())) { - Object fieldValue = (Integer) fieldResolver.filedParserManger(buffer, dataField, null); - dataMap.put(dataField.getFieldName(), fieldValue); - } - } - return dataMap; - } - - @Override - public Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf) { - if (ByteBufUtil.hexDump(byteBuf).equals("")) { - return 0; - } - String filterFields = protocolConfig.getTotalLengthFilterField(); - Integer totalLength = 0; - try { - FieldConfig totalFieldConfig = fieldConfigDao.getFieldConfigById(protocolConfig.getTotalLengthId()); - int totalFilterLength = 0; - if (!StringUtils.isEmpty(filterFields)) { - String[] filterFieldList = filterFields.split(","); - for (String filterField : filterFieldList) { - FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(filterField); - //这里都是按字节计算,没有对位进行区分,可能会出现错误 - - // 如果对位有需求,需要进一步跟进 - totalFilterLength += fieldConfig.getOffsetLength(); - } - } - totalLength = (Integer) fieldResolver.filedParserManger(byteBuf, totalFieldConfig, null) + totalFilterLength; - } catch (Exception ex) { - log.error("报文确认分发阶段,获取报文总长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); - } - return totalLength; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer) { - //业务内容 - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - String protocolId = String.valueOf(protocolConfig.getId()); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - //计算固定长度 - Integer fixedLength = calculateLength(fieldConfigList); -// Integer totalLength = this.getTotalLength(protocolConfig, buffer); - //总长度获取 - Integer totalLength = lightText.length(); - //计算固定长度最大长度 - Integer maxFixedPosition = calculatePosition(fieldConfigList); -// buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - //计算数据报文内容 - ByteBuf bizDataFields = buffer.slice(maxFixedPosition-1, (totalLength - fixedLength)); - return bizDataFields; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer) { - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - String protocolId = String.valueOf(protocolConfig.getId()); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer fixedLength = calculateLength(fieldConfigList); -// Integer totalLength = this.getTotalLength(protocolConfig, buffer); - Integer totalLength = lightText.length(); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - ByteBuf fixDataFields = buffer.slice(0, maxFixedPosition); - return fixDataFields; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer) { - String protocolId = String.valueOf(protocolConfig.getId()); - Map fixedPropertyMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer fixedLength = calculateLength(fieldConfigList); - Integer totalLength = this.getTotalLength(protocolConfig, buffer); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - fixedPropertyMap.put("fixedPosition", maxFixedPosition); - fixedPropertyMap.put("totalLength", totalLength); - fixedPropertyMap.put("tailPosition", totalLength - fixedLength + maxFixedPosition); - return fixedPropertyMap; - } - - //分别计算bit和byte长度=> 合并长度 - private Integer calculateLength(List fieldConfigList) { - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (FieldConfig fieldConfig : fieldConfigList) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - Integer fixedLength = bytefixedLength + bitfixedLength / 8; - return fixedLength; - } - - //找到最大值=> 根据最大值计算业务数据下标 - private Integer calculatePosition(List fieldConfigList) { - String rex = "[0-9]+"; - Integer max = -1; - for (FieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOrignPosition()) - && Integer.valueOf(fieldConfig.getOrignPosition()) > max) { - max = Integer.valueOf(fieldConfig.getOrignPosition()); - } - } - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (FieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOrignPosition()) && fieldConfig.getOrignPosition().equals(max)) { - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - } - } - Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; - return maxFixedPosition; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java new file mode 100644 index 0000000..d4ec6c7 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java @@ -0,0 +1,76 @@ +package com.casic.missiles.parser.rule; + +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import org.apache.commons.lang3.StringUtils; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class GenericRuleResolver { + + //根据前置字段的值,找到指定的规则 + //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 + //=>循环判断=>通过规则得到业务字段 + public static RuleConfig machRule(Map fixDataMap, + String ids, + List protocolFieldConfigs, + List ruleConfigs) { + List preRuleConfigList = getPreRuleList(ids, protocolFieldConfigs); + //获取前置规则字段 + final Map metaDataMap = getPreRuleFields(preRuleConfigList, fixDataMap); + //准备固定的字段集合 + Map fixDataFieldMap = getFixDataFieldMap(protocolFieldConfigs); + return RuleResolverCore.doMachRule(ruleConfigs, metaDataMap, fixDataMap, fixDataFieldMap); + } + + private static Map getFixDataFieldMap(List protocolFieldConfigs) { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, ProtocolFieldConfig::getFieldName) + ); + return fixDataFieldMap; + } + + + /** + * 查询前置规则的字段配置 + * + * @param ids + * @return + */ + private static List getPreRuleList(String ids, List protocolFieldConfigs) { + String[] idList = ids.split(","); + Map prepareMaps = new HashMap<>(); + for (String id : idList) { + if (StringUtils.isNotEmpty(id)) { + prepareMaps.put(Long.valueOf(id), ""); + } + } + List preRuleConfigList = protocolFieldConfigs + .stream() + .filter(e -> prepareMaps.containsKey(e.getId())) + .collect(Collectors.toList()); + return preRuleConfigList; + } + + /** + * 获取前置规则解析字段 + */ + private static Map getPreRuleFields(List preRuleFieldConfigList, Map fixDataMap) { + Map ruleFieldMap = new HashMap<>(); + preRuleFieldConfigList.stream() + .forEach( + preRuleFieldConfig -> { + String fieldName = preRuleFieldConfig.getFieldName(); + if (fixDataMap.containsKey(fieldName)) { + ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); + } + } + ); + return ruleFieldMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java new file mode 100644 index 0000000..baae7e8 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -0,0 +1,68 @@ +package com.casic.missiles.parser.rule; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.casic.missiles.pojo.RuleConfig; + +import java.util.*; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleResolverCore { + + + public static RuleConfig doMachRule(List ruleConfigList, Map metaDataMap, + Map fixDataMap, + Map fixDataFieldMap) { + Optional ruleConfigOptional = ruleConfigList.stream() + .filter(ruleConfig -> machRuleConfig( + JSON.parseObject(ruleConfig.getMatchRuleJson(), Map.class), metaDataMap)) + .findFirst(); + if (ObjectUtil.isEmpty(ruleConfigOptional)) { + return null; + } + String[] ruleFields = ruleConfigOptional.get().getDataFieldIds().split(","); + Map ruleMetaDataMap = getRuleFields(ruleFields, fixDataMap, fixDataFieldMap); + //递归选定解析规则,进行规则解析 + if (!ruleConfigOptional.get().getIsFinishMatch().equals("1")) { + //递归选定规则 + doMachRule(ruleConfigList, ruleMetaDataMap, fixDataMap, fixDataFieldMap); + } + return ruleConfigOptional.get(); + } + + + private static Map getRuleFields(String[] preRuleConfigList, Map fixedDataMap, + Map fixedFieldMap) { + Map ruleFieldMap = new HashMap<>(); + for (String preRuleConfigId : preRuleConfigList) { + String fieldName = fixedFieldMap.get(preRuleConfigId); + if (fixedDataMap.containsKey(fieldName)) { + ruleFieldMap.put(fieldName, String.valueOf(fixedDataMap.get(fieldName))); + } + } + return ruleFieldMap; + } + + + //匹配规则配置 + private static Boolean machRuleConfig(Map ruleMap, Map metaDataMap) { + if (ruleMap == null || metaDataMap == null) { + return null; + } + //所有的字段在规则里面必须有有配置 + for (String key : metaDataMap.keySet()) { + if (ruleMap.containsKey(key)) { + if (!ruleMap.get(key).equals(metaDataMap.get(key))) { + return false; + } + } else { + return false; + } + } + return true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java deleted file mode 100644 index 664088d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java +++ /dev/null @@ -1,92 +0,0 @@ -package com.casic.missiles.parser.rule; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.mapper.dao.PreRuleConfigDao; -import com.casic.missiles.mapper.dao.RuleConfigDao; -import lombok.AllArgsConstructor; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.*; -import java.util.stream.Collectors; - -@Service -@AllArgsConstructor -public class RulerProvider { - - private final FieldConfigDao fieldConfigDao; - private final PreRuleConfigDao preRuleConfigDao; - private final RuleConfigDao ruleConfigDao; - - //根据前置字段的值,找到指定的规则 - //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 - //=>循环判断=>通过规则得到业务字段 - public RuleConfig ruleConfig(Map fixDataMap, String protocolId) { - //批量获取规则 - List preRuleConfigList = preRuleConfigDao.getPreRuleList(protocolId); - //获取固定字段 - Map fixFieldMap = getAllFieldMap(protocolId); - //获取前置规则字段 - final String preRuleFields = getPreRuleFields(preRuleConfigList, fixDataMap, fixFieldMap); - List ruleConfigList = ruleConfigDao.getRuleConfigById(protocolId); - Optional ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig ->preRuleFields.equals( ruleConfig.getParseRuleJson())).findFirst(); - //递归选定解析规则,进行规则解析 - while (!ObjectUtil.isEmpty(ruleConfigOptional) && !ruleConfigOptional.get().getIsBizField().equals("1")) { - String ruleFields = getRuleFields(ruleConfigOptional.get().getDataFieldIds().split(","), fixDataMap, fixFieldMap); - ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig -> ruleConfig.getParseRuleJson().equals(ruleFields)).findFirst(); - } - return ruleConfigOptional.get(); - } - - /** - * 获取前置规则解析字段 - */ - private String getPreRuleFields(List preRuleConfigList, Map fixDataMap, Map fixFieldMap) { - Map ruleFieldMap= new HashMap<>(); - preRuleConfigList.stream() - .forEach( - preRuleConfig -> { - String fieldName = fixFieldMap.get(Long.valueOf(preRuleConfig.getRuleFieldId())); - if (fixDataMap.containsKey(fieldName)) { - ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); - } - } - ); - return JSONObject.toJSONString(ruleFieldMap); - } - - private Map getAllFieldMap(String protocolId) { - List fieldList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Map fixFieldMap = fieldList.stream().collect( - Collectors.toMap(FieldConfig::getId, FieldConfig::getFieldName) - ); - return fixFieldMap; - } - - private String getRuleFields(String[] preRuleConfigList, Map fixDataMap, Map fixFieldMap) { - Map ruleFieldMap= new HashMap<>(); - for (String preRuleConfigId : preRuleConfigList) { - String fieldName = fixFieldMap.get(preRuleConfigId); - if (fixDataMap.containsKey(fieldName)) { - ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); - } - } - return JSONObject.toJSONString(ruleFieldMap); - } - - //弃置 - private String ListToString(List ruleFieldList) { - String ruleFields = ""; - for (String ruleField : ruleFieldList) { - ruleFields += ruleField + ","; - } - ruleFields = StringUtils.isEmpty(ruleFields) ? ruleFields : ruleFields.substring(0, ruleFields.length() - 1); - return ruleFields; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java index 6177e10..bfa87a5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java @@ -2,7 +2,7 @@ public interface SafeStrategy { - String decryption(byte[] bytes); + String decryption(String cipher); String encryption(String lightText); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java index 618716c..6236302 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java @@ -9,9 +9,9 @@ //十六进制的字符串转换成字节数组 byte[] bytes = hexStrToBinaryStr(msg); //计算CRC8 - byte crc8 = CRC8(bytes, 0, bytes.length); - String crc8ToStr = "" + Integer.toHexString(0xff & crc8); - return crc8ToStr; +// String crc8ToStr = "" + Integer.toHexString(0xff & crc8); +// return crc8ToStr; + return null; } /** @@ -33,50 +33,5 @@ return bytes; } - /** - * CRC8 校验 多项式 x8+x2+x+1 - * - * @param b - * @param off - * @param len - * @return - */ - public static byte CRC8(final byte[] b, final int off, final int len) { - byte result = 0x00; - for (int i = 0; i < len; i++) { - result = CHECKSUM_TABLE[(result ^ (b[i + off] & 0xFF)) & 0xFF]; - } - return (byte) (result & 0xFFL); - } - - private final static byte[] CHECKSUM_TABLE = {(byte) 0x00, (byte) 0x07, (byte) 0x0e, (byte) 0x09, (byte) 0x1c, (byte) 0x1b, - (byte) 0x12, (byte) 0x15, (byte) 0x38, (byte) 0x3f, (byte) 0x36, (byte) 0x31, (byte) 0x24, (byte) 0x23, (byte) 0x2a, - (byte) 0x2d, (byte) 0x70, (byte) 0x77, (byte) 0x7e, (byte) 0x79, (byte) 0x6c, (byte) 0x6b, (byte) 0x62, (byte) 0x65, - (byte) 0x48, (byte) 0x4f, (byte) 0x46, (byte) 0x41, (byte) 0x54, (byte) 0x53, (byte) 0x5a, (byte) 0x5d, (byte) 0xe0, - (byte) 0xe7, (byte) 0xee, (byte) 0xe9, (byte) 0xfc, (byte) 0xfb, (byte) 0xf2, (byte) 0xf5, (byte) 0xd8, (byte) 0xdf, - (byte) 0xd6, (byte) 0xd1, (byte) 0xc4, (byte) 0xc3, (byte) 0xca, (byte) 0xcd, (byte) 0x90, (byte) 0x97, (byte) 0x9e, - (byte) 0x99, (byte) 0x8c, (byte) 0x8b, (byte) 0x82, (byte) 0x85, (byte) 0xa8, (byte) 0xaf, (byte) 0xa6, (byte) 0xa1, - (byte) 0xb4, (byte) 0xb3, (byte) 0xba, (byte) 0xbd, (byte) 0xc7, (byte) 0xc0, (byte) 0xc9, (byte) 0xce, (byte) 0xdb, - (byte) 0xdc, (byte) 0xd5, (byte) 0xd2, (byte) 0xff, (byte) 0xf8, (byte) 0xf1, (byte) 0xf6, (byte) 0xe3, (byte) 0xe4, - (byte) 0xed, (byte) 0xea, (byte) 0xb7, (byte) 0xb0, (byte) 0xb9, (byte) 0xbe, (byte) 0xab, (byte) 0xac, (byte) 0xa5, - (byte) 0xa2, (byte) 0x8f, (byte) 0x88, (byte) 0x81, (byte) 0x86, (byte) 0x93, (byte) 0x94, (byte) 0x9d, (byte) 0x9a, - (byte) 0x27, (byte) 0x20, (byte) 0x29, (byte) 0x2e, (byte) 0x3b, (byte) 0x3c, (byte) 0x35, (byte) 0x32, (byte) 0x1f, - (byte) 0x18, (byte) 0x11, (byte) 0x16, (byte) 0x03, (byte) 0x04, (byte) 0x0d, (byte) 0x0a, (byte) 0x57, (byte) 0x50, - (byte) 0x59, (byte) 0x5e, (byte) 0x4b, (byte) 0x4c, (byte) 0x45, (byte) 0x42, (byte) 0x6f, (byte) 0x68, (byte) 0x61, - (byte) 0x66, (byte) 0x73, (byte) 0x74, (byte) 0x7d, (byte) 0x7a, (byte) 0x89, (byte) 0x8e, (byte) 0x87, (byte) 0x80, - (byte) 0x95, (byte) 0x92, (byte) 0x9b, (byte) 0x9c, (byte) 0xb1, (byte) 0xb6, (byte) 0xbf, (byte) 0xb8, (byte) 0xad, - (byte) 0xaa, (byte) 0xa3, (byte) 0xa4, (byte) 0xf9, (byte) 0xfe, (byte) 0xf7, (byte) 0xf0, (byte) 0xe5, (byte) 0xe2, - (byte) 0xeb, (byte) 0xec, (byte) 0xc1, (byte) 0xc6, (byte) 0xcf, (byte) 0xc8, (byte) 0xdd, (byte) 0xda, (byte) 0xd3, - (byte) 0xd4, (byte) 0x69, (byte) 0x6e, (byte) 0x67, (byte) 0x60, (byte) 0x75, (byte) 0x72, (byte) 0x7b, (byte) 0x7c, - (byte) 0x51, (byte) 0x56, (byte) 0x5f, (byte) 0x58, (byte) 0x4d, (byte) 0x4a, (byte) 0x43, (byte) 0x44, (byte) 0x19, - (byte) 0x1e, (byte) 0x17, (byte) 0x10, (byte) 0x05, (byte) 0x02, (byte) 0x0b, (byte) 0x0c, (byte) 0x21, (byte) 0x26, - (byte) 0x2f, (byte) 0x28, (byte) 0x3d, (byte) 0x3a, (byte) 0x33, (byte) 0x34, (byte) 0x4e, (byte) 0x49, (byte) 0x40, - (byte) 0x47, (byte) 0x52, (byte) 0x55, (byte) 0x5c, (byte) 0x5b, (byte) 0x76, (byte) 0x71, (byte) 0x78, (byte) 0x7f, - (byte) 0x6a, (byte) 0x6d, (byte) 0x64, (byte) 0x63, (byte) 0x3e, (byte) 0x39, (byte) 0x30, (byte) 0x37, (byte) 0x22, - (byte) 0x25, (byte) 0x2c, (byte) 0x2b, (byte) 0x06, (byte) 0x01, (byte) 0x08, (byte) 0x0f, (byte) 0x1a, (byte) 0x1d, - (byte) 0x14, (byte) 0x13, (byte) 0xae, (byte) 0xa9, (byte) 0xa0, (byte) 0xa7, (byte) 0xb2, (byte) 0xb5, (byte) 0xbc, - (byte) 0xbb, (byte) 0x96, (byte) 0x91, (byte) 0x98, (byte) 0x9f, (byte) 0x8a, (byte) 0x8d, (byte) 0x84, (byte) 0x83, - (byte) 0xde, (byte) 0xd9, (byte) 0xd0, (byte) 0xd7, (byte) 0xc2, (byte) 0xc5, (byte) 0xcc, (byte) 0xcb, (byte) 0xe6, - (byte) 0xe1, (byte) 0xe8, (byte) 0xef, (byte) 0xfa, (byte) 0xfd, (byte) 0xf4, (byte) 0xf3}; } \ No newline at end of file diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java index 27c2838..6e078a3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java @@ -1,9 +1,6 @@ package com.casic.missiles.parser.safe.impl; -import cn.hutool.core.util.CharsetUtil; -import cn.hutool.crypto.symmetric.SM4; -import cn.hutool.crypto.symmetric.SymmetricCrypto; - +import com.casic.missiles.parser.safe.SafeStrategy; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; @@ -11,19 +8,44 @@ import org.bouncycastle.crypto.engines.SM4Engine; import org.bouncycastle.crypto.params.KeyParameter; import org.bouncycastle.util.encoders.Hex; - -import static cn.hutool.crypto.Mode.ECB; -import static cn.hutool.crypto.Padding.NoPadding; +import org.springframework.stereotype.Component; /** * SM4算法工具类 */ @Slf4j -public class Sm4 { +@Component("sm4") +public class Sm4 implements SafeStrategy { //加解密的字节快大小 public static final int BlockSize = 16; + @Override + public String decryption(String cipher) { + byte[] keyByte = { + 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 + }; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(keyByte); + byte[] in = Hex.decode(cipher); + byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); + String plain = EcbDecrypt(in, keyBytes); + return plain; + } + + @Override + public String encryption(String cipher) { + byte[] keyByte = { + 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 + }; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(keyByte); + byte[] in = Hex.decode(cipher); + byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); + String plain = EcbDecrypt(in, keyBytes); + return plain; + } + /** * SM4ECB加密算法,对内 * @@ -32,8 +54,6 @@ * @return */ private static byte[] ecb_encrypt(byte[] in, byte[] keyBytes) { - - SM4Engine sm4Engine = new SM4Engine(); sm4Engine.init(true, new KeyParameter(keyBytes)); byte[] out = new byte[in.length]; @@ -58,27 +78,6 @@ return cipher; } - - /** - * hutool 解密SM4 - * - * @param encodeContent - * @return - */ - public static String decode(String encodeContent) { - String key = "24ad182507479a5da3ad94d9d78ea203"; - try { - SymmetricCrypto sm4 = new SM4(ECB, NoPadding, key.getBytes()); - String decryptStr = sm4.decryptStr(encodeContent, CharsetUtil.CHARSET_UTF_8); - return decryptStr; - } catch (Exception e) { - e.printStackTrace(); - log.error("SM4解密失败"); - } - return null; - } - - /** * SM4的ECB加密算法 * @@ -129,20 +128,6 @@ return plain; } - /** - * SM4的ECB解密算法 - * - * @param cipher 输入的密文字符串 - * @param key 密钥 - * @return - */ - public static String EcbDecrypt(String cipher, String key) { - byte[] in = Hex.decode(cipher); - byte[] keyBytes = Hex.decode(key); - - String plain = EcbDecrypt(in, keyBytes); - return plain; - } /** * 主函数 @@ -151,28 +136,24 @@ */ public static void main(String[] args) { byte[] ciphertext = { + 0x4B, (byte) 0x8C, (byte) 0x9D, 0x08, (byte) 0xE4, (byte) 0xD3, 0x64, 0x42, (byte) 0xB9, (byte) 0xA5, (byte) 0xFE, (byte) 0xCD, (byte) 0x91, 0x1B, 0x38, (byte) 0xAC, (byte) 0xE9, 0x1C, (byte) 0xCD, 0x53, 0x02, (byte) 0xD7, 0x0C, (byte) 0x9B, (byte) 0x96, 0x30, 0x62, (byte) 0xE8, (byte) 0xFB, (byte) 0xEF, (byte) 0xB9, (byte) 0xFF, (byte) 0xDE, 0x19, (byte) 0x80, 0x35, 0x3E, (byte) 0x90, 0x4F, 0x2F, 0x12, 0x2B, 0x19, (byte) 0x8B, 0x6C, 0x7A, (byte) 0x85, (byte) 0xA1, (byte) 0xB1, (byte) 0x86, (byte) 0xA3, 0x7A, 0x46, 0x0C, 0x2F, (byte) 0x94, 0x4F, 0x7F, 0x2C, 0x56, 0x14, (byte) 0xF3, (byte) 0x89, (byte) 0xC3, - 0x3F, 0x20, (byte) 0xF9, (byte) 0x87, (byte) 0xA1, 0x60, (byte) 0xD9, (byte) 0xA8, (byte) 0xFD, (byte) 0xD7, (byte) 0x9B, 0x4B, 0x26, 0x06, 0x30, 0x44}; + 0x3F, 0x20, (byte) 0xF9, (byte) 0x87, (byte) 0xA1, 0x60, (byte) 0xD9, (byte) 0xA8, (byte) 0xFD, (byte) 0xD7, (byte) 0x9B, 0x4B, 0x26, 0x06, 0x30, 0x44 + }; ByteBuf in = ByteBufAllocator.DEFAULT.heapBuffer(); in.writeBytes(ciphertext); - byte[] keyByte = { 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 }; ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); - key.writeBytes(ciphertext); - String resCipherData = decode(ByteBufUtil.hexDump(in)); - ByteBuf out = ByteBufAllocator.DEFAULT.heapBuffer(); -// out.writeBytes(resCipherData); -// System.out.println(hexBytes); - System.out.println(resCipherData.toString()); -// String resPlainData = EcbDecrypt(resCipherData, key); -// System.out.println("原始明文:" + data); -// System.out.println("解密后明文:" + resPlainData); + key.writeBytes(keyByte); +// String resCipherData = EcbDecrypt(ByteBufUtil.hexDump(in), ByteBufUtil.hexDump(key)); +// System.out.println(resCipherData); } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java index 1395a51..ac5f957 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java @@ -1,7 +1,7 @@ package com.casic.missiles.parser.safe.impl; import io.netty.buffer.ByteBufUtil; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** *

@@ -14,9 +14,8 @@ * @author hyl * @version v1.0: Tea.java, v 0.1 2021/3/12 13:48 $ */ -@Service("tea") -///tea算法类 - +//tea算法类 +@Component("tea") public class Tea { public static byte[] MyTea_Encrypt(byte[] MyTeaContent, int ByteLen, byte[] MyTeakey) { @@ -99,7 +98,6 @@ // for(int i32Index = 0; i32Index < 8; i32Index++) { // System.out.print("0x" + Integer.toHexString(MyContent[i32Index]) + " "); // } - // System.out.println("密钥为:"); // for(int i32Index = 0; i32Index < 16; i32Index++) { // System.out.print("0x" + Integer.toHexString(MyKeys[i32Index]) + " "); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java index bdd0721..bd1516a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java @@ -3,7 +3,7 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.parser.sender.DataSubscribeProvider; import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponents; import org.springframework.web.util.UriComponentsBuilder; @@ -12,7 +12,7 @@ import java.util.Collections; import java.util.Map; -@Service("functionCallback") +@Component("functionCallback") public class FunctionCallback implements DataSubscribeProvider { @Resource diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java index 0b44fb9..7526de2 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.Map; -@Service("middleware") +@Component("middleware") public class MiddlewareSubscribe implements DataSubscribeProvider { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java index 5dcee3f..e2f1192 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.Map; -@Service("nosql") +@Component("nosql") public class NoSqlSubscribe implements DataSubscribeProvider { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java b/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java new file mode 100644 index 0000000..81a5324 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java @@ -0,0 +1,86 @@ +package com.casic.missiles.pojo; + +import lombok.Data; + +/** + * 协议 + */ +@Data +public class Msg { + + /** + * 前导码 + */ + private String preamble; + + /** + * 版本号 + */ + private String version; + + /** + * 内容长度 + */ + private int leng; + + /** + * 设备ID + */ + private String deviceId; + + /** + * 通讯方式 + */ + private Integer connType; + + /** + * 加密方式 + */ + private Integer encryType; + + /** + * 目标地址 + */ + private String destAddr; + + /** + * PDUType + */ + private String PDUType; + + /** + * 操作类型 + */ + private Integer operateType; + + /** + * 传输控制位 PDUType.bit7=0时,表示存在后续的访问;当PDUType.bit7=1时,表示无后续的访问。 + */ + private Integer transControlFlag; + + /** + * 设备类型 + */ + private Integer deviceType; + + /** + * 序号 + */ + private Integer seq; + + /** + * tagList + */ + private String tagList; + + /** + * OidList + */ + private String OidList; + + /** + * CRC + */ + private String CRC; + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java index 40a5265..97cc984 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java @@ -40,7 +40,7 @@ String httpContent = msg.toString(Charset.defaultCharset()); log.info(" String : " + msg.toString(Charset.defaultCharset())); String majorContent = httpContent.substring(httpContent.indexOf("{"), httpContent.lastIndexOf("}") + 1); - String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("serviceData")).get("Value")); + String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("RegistryData")).get("Value")); log.info("----------------------------------" + values); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); bufferContent.writeBytes(values.getBytes(Charset.forName("ISO-8859-1"))); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java index 1b132a7..e3ced4b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java @@ -35,7 +35,7 @@ String httpContent = msg.toString(Charset.defaultCharset()); log.info(" String : " + msg.toString(Charset.defaultCharset())); String majorContent = httpContent.substring(httpContent.indexOf("{"), httpContent.lastIndexOf("}") + 1); - String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("serviceData")).get("Value")); + String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("RegistryData")).get("Value")); log.info("----------------------------------" + values); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); bufferContent.writeBytes(values.getBytes(Charset.forName("ISO-8859-1"))); diff --git a/sensorhub-core/src/main/resources/application.properties b/sensorhub-core/src/main/resources/application.properties deleted file mode 100644 index 8b13789..0000000 --- a/sensorhub-core/src/main/resources/application.properties +++ /dev/null @@ -1 +0,0 @@ - diff --git a/sensorhub-core/src/main/resources/config/application-dev.yml b/sensorhub-core/src/main/resources/config/application-dev.yml index 4f897a8..dcc4c2d 100644 --- a/sensorhub-core/src/main/resources/config/application-dev.yml +++ b/sensorhub-core/src/main/resources/config/application-dev.yml @@ -4,9 +4,9 @@ spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true + url: jdbc:mysql://127.0.0.1:3306/sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true username: root - password: Casic203 + password: root session: store-type: redis redis: diff --git a/sensorhub-core/src/main/resources/config/application.yml b/sensorhub-core/src/main/resources/config/application.yml index ae89f9d..7965da1 100644 --- a/sensorhub-core/src/main/resources/config/application.yml +++ b/sensorhub-core/src/main/resources/config/application.yml @@ -30,6 +30,13 @@ port: 6379 password: ew5T4K3#203lwh config-prefix: 'Casic:' +#代码生成器配置 +code: + generate: + #作者 + author: cz + #待生成对象表名 + table-name: bussiness_field_config,combined_field_config sensorhub: config: port: 7091 diff --git a/sensorhub-support/pom.xml b/sensorhub-support/pom.xml index 9a71296..761601c 100644 --- a/sensorhub-support/pom.xml +++ b/sensorhub-support/pom.xml @@ -42,6 +42,12 @@ ${redis.version} + + com.baomidou + mybatis-plus-generator + ${mybatis-plus-generator.version} + + org.reflections diff --git a/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java b/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java new file mode 100644 index 0000000..515ca53 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java @@ -0,0 +1,14 @@ +package com.casic.missiles.enums; + +/** + * @author + * @date + */ +public interface FixedPropertyEnum { + + String FIXED_POSITION = "fixedPosition"; + + String TOTAL_LENGTH = "totalLength"; + + String TAIL_POSITION = "tailPosition"; +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/CombinedFieldMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CombinedFieldMapper.java new file mode 100644 index 0000000..38e8f42 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CombinedFieldMapper.java @@ -0,0 +1,15 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.CombinedFieldConfig; +import org.apache.ibatis.annotations.Mapper; + +/** + * @author cz + * + */ +@Mapper +public interface CombinedFieldMapper extends BaseMapper { + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java new file mode 100644 index 0000000..128b09d --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java @@ -0,0 +1,10 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.CommandEventConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface CommandEventMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java new file mode 100644 index 0000000..042eb3c --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.DatagramEventConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface DatagramEventConfigMapper extends BaseMapper { +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java new file mode 100644 index 0000000..fc95cf4 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java @@ -0,0 +1,8 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.FieldConfig; + +public interface FieldConfigMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldRuleConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldRuleConfigMapper.java new file mode 100644 index 0000000..b310a08 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldRuleConfigMapper.java @@ -0,0 +1,10 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.FieldRuleConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface FieldRuleConfigMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java new file mode 100644 index 0000000..9060a69 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.ProtocolConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface ProtocolConfigMapper extends BaseMapper { +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolFieldConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolFieldConfigMapper.java new file mode 100644 index 0000000..1b47180 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolFieldConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +public interface ProtocolFieldConfigMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java new file mode 100644 index 0000000..6fa6936 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.RuleConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface RuleConfigMapper extends BaseMapper { +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/AbstractFieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/AbstractFieldConfig.java new file mode 100644 index 0000000..ba9aea2 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/AbstractFieldConfig.java @@ -0,0 +1,38 @@ +package com.casic.missiles.pojo; + +import lombok.Data; + +@Data +public class AbstractFieldConfig { + /** + * 字段名称 + */ + private String fieldName; + /** + * 按照字段评估进行字段解析 + */ + private String ruleJson; + /** + * 起始位置(单位byte) + */ + private Integer OriginPositionByte; + /** + * 起始位置,是否需要bit位置(单位bit)小于8, 没有不需要填写 + */ + private String OriginPositionBit; + /** + * 偏移长度 + */ + private Integer offsetLength; + /** + * 偏移单位(bit/byte) + */ + private String offsetUnit; + /** + * 是否需要转存 + */ + private Integer isStorage; + + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/CombinedFieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/CombinedFieldConfig.java new file mode 100644 index 0000000..4f4de6a --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/CombinedFieldConfig.java @@ -0,0 +1,41 @@ +package com.casic.missiles.pojo; + +import lombok.Data; + +import java.util.Date; + +/** + * 组合配置 + * + * @author cz + * @date 20 + */ +@Data +public class CombinedFieldConfig { + + private Long id; + private Long ruleId; + /** + * 前缀编码 + */ + private String prefixCode; + + /** + * 字段动态的id + */ + private Long dynamicLengthId; + /** + * 对应的要解析字段的ids + */ + private String dataFieldIds; + + /** + * 字段动态的id + */ + private String combinedFieldIds; + + private Date lastTime; + + private Date createTime; + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java index 608af3a..32cc8a4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java @@ -2,48 +2,47 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.delivery.decorator.ByteDecorator; +import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @AllArgsConstructor public class FieldDecoratorManger { - private final RuleDictDao ruleDictDao; + private final RuleConfigRegistry ruleDictDao; // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 // (1)静态的业务字段是字典里面可以配置的 // (2)动态的业务字段是通过规则生成的 public String contentMerge(String ruleJson, String sceneConent, String dynamicContent) { - List ruleDictList = ruleDictDao.getRuleDictConfig(); - Map ruleDictMap = ruleDictList.stream().collect( - Collectors.toMap(RuleDict::getId, e -> e)); - List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); - for (Map ruleMap : ruleMapList) { - String ruleType = String.valueOf(ruleMap.get("ruleType")); - ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); - NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); - byteDecorator.nodeDecoratorRule(nodeDecoratorParm); - } +// List ruleDictList = ruleDictDao.getRuleDictConfig(); +// Map ruleDictMap = ruleDictList.stream().collect( +// Collectors.toMap(RuleDict::getId, e -> e)); +// List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); +// for (Map ruleMap : ruleMapList) { +// String ruleType = String.valueOf(ruleMap.get("ruleType")); +// ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); +// NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); +// byteDecorator.nodeDecoratorRule(nodeDecoratorParm); +// } return null; } - - private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { - NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() - .contents(sceneConent) - .dynamicContent(dynamicContent) - .ruletypeId(ruletypeId) - .ruleDictMap(ruleDictMap) - .build(); - return nodeDecoratorParm; - } +// +// private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { +// NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() +// .contents(sceneConent) +// .dynamicContent(dynamicContent) +// .ruletypeId(ruletypeId) +// .ruleDictMap(ruleDictMap) +// .build(); +// return nodeDecoratorParm; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java index 652970c..b204ac3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java @@ -1,56 +1,56 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@AllArgsConstructor -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", - JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Component; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Component("logicalDecorator") +//@AllArgsConstructor +//@Slf4j +//public class LogicalShiftDecorator implements ByteDecorator { +// +//// private final FieldRuleEngineMapper fieldRuleEngineMapper; +//// +//// //字节位移 +//// @Override +//// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +//// String logicalValue = ""; +//// RuleEvaluator fieldRuleEngine = new RuleEvaluator(); +//// try { +//// Map env2 = new HashMap(); +//// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +//// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +//// for (String contentId : contentIdList) { +//// RuleDict ruleDict = ruleDictMap.get(contentId); +//// if (ruleDict.getCode().contains("#")) { +//// //使用动态的值 +//// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +//// } +//// env2.put(ruleDict.getName(), ruleDict.getCode()); +//// } +//// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +//// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +//// return null; +//// } +//// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +//// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +//// return values; +//// } catch (Exception ex) { +//// log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", +//// JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +//// return null; +//// } +//// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java index 346468f..822fead 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@AllArgsConstructor -@Slf4j -public class OperationDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("optionDecorator") +//@AllArgsConstructor +//@Slf4j +//public class OperationDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //混合运算,有常量或者乘除的缩放 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java index 50fb0a7..7a8bccb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@AllArgsConstructor -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +////精度计算 +//@AllArgsConstructor +//@Registry("precisionDecorator") +//@Slf4j +//public class PrecisionDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java index da39235..27f9cc7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java @@ -1,54 +1,53 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@AllArgsConstructor -@Slf4j -public class RuleDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("ruleDecorator") +//@AllArgsConstructor +//@Slf4j +//public class RuleDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //吃我一套正则表达式 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (Exception ex) { +// log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java index 7f5cbf3..c043f97 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java @@ -2,6 +2,6 @@ import java.util.Map; -public interface ComandeEventService { +public interface ComandeEventService{ Map loadComandeEventConfig(String protocolId,String scene); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java index 476ad84..aaf1837 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java @@ -2,46 +2,46 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.dao.CommandEventDao; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @Slf4j @AllArgsConstructor -public class ComandeEventServiceImpl implements ComandeEventService { +public class ComandeEventServiceImpl implements ComandeEventRegistry { - private final CommandEventDao commandEventDao; + // private final CommandEventDao commandEventDao; // 加密bean 固定字段出现变化的字段解析,业务字段的有序内容 @Override - public Map loadComandeEventConfig(String protocolId,String sceneName) { - CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); - if (ObjectUtil.isEmpty(commandEventConfig)) { - log.error("协议{},没有配置成功接收回复配置,清排查原因"); - return null; - } - String replyJson = commandEventConfig.getReplyContentJson(); - List> replyMapList = JSONArray.parseObject(replyJson, List.class); - List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); - Map fixMap = fixList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); - List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) - .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) - .collect(Collectors.toList()); - Map commandConfigMap = new HashMap<>(); - commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); - commandConfigMap.put("fixContent", fixMap); - commandConfigMap.put("bizContent", contentList); - return commandConfigMap; + public Map loadComandeEventConfig(String protocolId, String sceneName) { +// CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); +// if (ObjectUtil.isEmpty(commandEventConfig)) { +// log.error("协议{},没有配置成功接收回复配置,清排查原因"); +// return null; +// } +// String replyJson = commandEventConfig.getReplyContentJson(); +// List> replyMapList = JSONArray.parseObject(replyJson, List.class); +// List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); +// Map fixMap = fixList.stream() +// .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); +// List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) +// .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) +// .collect(Collectors.toList()); +// Map commandConfigMap = new HashMap<>(); +// commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); +// commandConfigMap.put("fixContent", fixMap); +// commandConfigMap.put("bizContent", contentList); +// return commandConfigMap; + return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 128b09d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java deleted file mode 100644 index 4016b0b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface DatagramEventMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java deleted file mode 100644 index 597c306..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.apache.ibatis.annotations.Mapper; - -public interface FieldConfigMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java deleted file mode 100644 index a31680a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.PreRuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface PreRuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java deleted file mode 100644 index 9060a69..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface ProtocolConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java deleted file mode 100644 index 6fa6936..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java deleted file mode 100644 index 582a705..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleDict; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleDictMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java deleted file mode 100644 index 6e302c8..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.CommandEventMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Optional; - -@Component -public class CommandEventDao { - - @Resource - private CommandEventMapper commandEventMapper; - - public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId) - .eq("scene", sceneName) - .eq("enabled", 1); - List commandEventConfig = commandEventMapper.selectList(queryWrapper); - Optional optionalEventConfig = commandEventConfig.stream().findFirst(); - return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java deleted file mode 100644 index 9137e4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.FieldConfigMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class FieldConfigDao { - - @Resource - private FieldConfigMapper fieldConfigMapper; - - public FieldConfig getFieldConfigById(String fieldId) { - FieldConfig fieldConfig = fieldConfigMapper.selectById(fieldId); - return fieldConfig; - } - - public List getFieldConfigs(String protocolId,Integer isFixed) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",isFixed); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - - public List getStorageFieldConfig(String protocolId) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",1) - .eq("is_storage",1); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java deleted file mode 100644 index 67bff6b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.mapper.PreRuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class PreRuleConfigDao { - - @Resource - private PreRuleConfigMapper preRuleConfigMapper; - - public List getPreRuleList(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return preRuleConfigMapper.selectList(queryWrapper); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java deleted file mode 100644 index d69ea85..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.RuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleConfigDao { - - @Resource - private RuleConfigMapper ruleConfigMapper; - - public RuleConfig getNextRuleConfig(String ruleFields) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("parse_rule_json", ruleFields); - return ruleConfigMapper.selectOne(queryWrapper); - } - - - public List getRuleConfigById(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return ruleConfigMapper.selectList(queryWrapper); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java deleted file mode 100644 index 932c185..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.RuleDictMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleDictDao { - - @Resource - private RuleDictMapper ruleDictMapper; - - public List getRuleDictConfig() { - List ruleDictList = ruleDictMapper.selectList(null); - return ruleDictList; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java index 9f9e279..43bc4d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java @@ -10,20 +10,15 @@ import io.netty.channel.socket.nio.NioServerSocketChannel; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import javax.annotation.PreDestroy; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static cn.hutool.core.util.ClassUtil.getClasses; /** * SensorhubServer netty服务端 */ @Slf4j -@Service +@Component public class SensorhubServer { /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java index 2c79ff5..9a28c36 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java @@ -11,13 +11,13 @@ import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioSocketChannel; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClient 客户端 */ @Slf4j -@Service +@Registry public final class SensorhubClient { public static void main(String[] args) throws Exception { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java index 9774be0..477c3f7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java @@ -6,12 +6,12 @@ import io.netty.channel.socket.SocketChannel; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientChannelInitialHandler */ -@Service +@Registry public class SensorhubClientChannelInitialHandler extends ChannelInitializer { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java index 346f4b3..73560e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java @@ -5,13 +5,13 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientHandler */ @Slf4j -@Service +@Registry public class SensorhubClientHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java index 5c1c6f2..d990af5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java @@ -4,12 +4,12 @@ import com.casic.missiles.pojo.Msg; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** * SensorhubServerHandler */ -@Service +@Component public class SensorhubServerHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 67283ae..af3172c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,41 +1,37 @@ package com.casic.missiles.parser; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultProtocolConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.*; +import com.casic.missiles.registry.FieldConfigRegistry; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; -import java.nio.charset.Charset; import java.util.HashMap; import java.util.List; import java.util.Map; -@Service("genericProtocolParser") +/** + * @author + */ +@Component("genericProtocolParser") @Slf4j -@AllArgsConstructor +@RequiredArgsConstructor public class GenericProtocolParser implements ProtocolParser { - private final LeadingCodeMatcher leadingCodeMatcher; private final List frameStructDispenserList; - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorInstanceSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; // 匹配首字母前导码=> 帧结构匹配前导码=> // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 @@ -44,18 +40,19 @@ public Boolean doParseProtocol(ByteBuf byteBuf) { String protocolContent = ByteBufUtil.hexDump(byteBuf); //匹配前导码 - List preCodeConfigs = leadingCodeMatcher.matchLeadingCode(protocolContent); + List preCodeConfigs = LeadingCodeMatcher.matchFrameLeadingCode(protocolContent); //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 if (preCodeConfigs.size() == 0) { - return rematch(byteBuf,protocolContent); + return rematch(byteBuf, protocolContent); } - //暂时先取第一个 + //暂时先取第一个,提升速度,使用享元模式, 减少类的创建销毁与构建 ProtocolConfig protocolConfig = preCodeConfigs.get(0); + AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); ByteBuf wholeDatagramByte = null; //通过匹配帧结构获取完整的数据包 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, preCodeConfigs.get(0))) != null) { + if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, protocolFactory)) != null) { break; } } @@ -68,76 +65,78 @@ * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 */ - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId, wholeDatagramByte); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap, protocolId); - //选取规则对应的流程实例 - DatagramEventConfig datagramEventConfig = processorInstanceSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); + //进行规则字段解析,进行匹配规则 + RuleConfig ruleConfig = getRuleConfig(protocolFactory, wholeDatagramByte); + if (ruleConfig == null) { + return false; + } //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, wholeDatagramByte); + ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte); + //以下进行业务的规则解析,同时选定流程实例 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); + DatagramEventProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain, + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText, protocolId); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain); //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); + datagramEventProvider.storeData(bizDataMap); return true; } - private Boolean rematch(ByteBuf byteBuf,String protocolContent) { + /** + * 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 + */ + private Boolean rematch(ByteBuf byteBuf, String protocolContent) { //重置位判断 byteBuf.resetReaderIndex(); //判断重置是否前移,如果没有前移,则直接判为匹配失败 if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { return false; } else { + //递归执行 return doParseProtocol(byteBuf); } } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; + //获取匹配规则->匹配规则 + private RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + //取出其中参与逻辑provider并判空 + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); + String rulePrepareFields = protocolConfig.getRulePrepareFields(); + //固定字段 + if (StringUtils.isNotEmpty(rulePrepareFields)) { + //获取统一固定字段解析 + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + //获取该协议的字段配置,用于协议规则匹配 + List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); + //获取规则 + RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, + rulePrepareFields, protocolFieldConfigs); + return ruleConfig; + } + return null; } - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + //数据构建,获取固定字段的store和业务字段store + private Map buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + Map bizDataMap = new HashMap<>(); + Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); + Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); + bizDataMap.putAll(ruleStoreObjectMap); + bizDataMap.putAll(protocolStoreObjectMap); return bizDataMap; } - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java index 8a46e32..16ce2e5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java @@ -3,6 +3,7 @@ import io.netty.buffer.ByteBuf; public interface ProtocolParser { + Boolean doParseProtocol(ByteBuf byteBuf); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java new file mode 100644 index 0000000..f7814af --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java @@ -0,0 +1,35 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.ProtocolConfigProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.ProtocolConfig; + +/** + * 存放基本协议的的加载信息 + */ +public class AbstractProtocolConfigFactory { + private final ProtocolConfigProvider protocolConfigProvider; + private final ProtocolFieldConfigProvider protocolFieldConfigProvider; + private final RuleConfigProvider ruleConfigProvider; + + public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { + this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); + this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); + this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); + } + + public ProtocolConfigProvider getProtocolConfigProvider() { + return protocolConfigProvider; + } + + public ProtocolFieldConfigProvider getProtocolFieldConfigProvider() { + return protocolFieldConfigProvider; + } + + public RuleConfigProvider getRuleConfigProvider() { + return ruleConfigProvider; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java new file mode 100644 index 0000000..6e36147 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java @@ -0,0 +1,57 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.CombinedFieldConfigProvider; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.FieldConfigProvider; +import com.casic.missiles.parser.provider.FieldRuleConfigProvider; + +/** + * 存放规则相关的的的加载信息 + */ +public class AbstractRuleConfigFactory { + + /** + * 处理字节 + */ + private final FieldConfigProvider fieldConfigProvider; + /** + * 处理组合字节解析的解码器 + */ + private final CombinedFieldConfigProvider combinedFieldConfigProvider; + /** + * 处理负责字节解析的规则配置 + */ + private final FieldRuleConfigProvider fieldRuleConfigProvider; + /** + * 处理实例流程 + */ + private final DatagramEventProvider datagramEventProvider; + + + public AbstractRuleConfigFactory(Long ruleId) { + this.fieldConfigProvider = new FieldConfigProvider(ruleId); + this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); + this.fieldRuleConfigProvider = new FieldRuleConfigProvider(ruleId); + this.datagramEventProvider = new DatagramEventProvider(ruleId); + } + + public FieldConfigProvider getFieldConfigProvider() { + return fieldConfigProvider; + } + + public CombinedFieldConfigProvider getCombinedFieldConfigProvider() { + return combinedFieldConfigProvider; + } + + public FieldRuleConfigProvider getFieldRuleConfigProvider() { + return fieldRuleConfigProvider; + } + + public DatagramEventProvider getDatagramEventProvider() { + return datagramEventProvider; + } + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java deleted file mode 100644 index 6e1719a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.factory; - - -import com.casic.missiles.pojo.ProtocolConfig; - -import java.util.List; - -/** - * 数据库访问优化(暂时未做) - *

- * 1、初始化协议解析配置,并存放到处存放缓存,对协议基本配置进行管理 - * 2、其中流程中所有的配置都经过此类进行管理,进行调用获取,增强解析速度 - */ -public interface DatagramFactory { - - /** - * 初始化 - */ - List datagramInit(); - - /** - * 根据前导码配置匹配,模糊匹配获取所有的报文项 - */ - List match(); - - /** - * 根据前导码匹配,返回报文项 - */ - List filer(); - - /** - * 保证数据的唯一性选择器 - */ - List selectOne(); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java new file mode 100644 index 0000000..87444a0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java @@ -0,0 +1,18 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +import java.util.List; + +/** + * 直接用,还是边用边创建 + */ +public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { + + + public DefaultProtocolConfigFactory(ProtocolConfig protocolConfig) { + super(protocolConfig); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java new file mode 100644 index 0000000..cce0c7c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java @@ -0,0 +1,12 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; + +public class DefaultRuleFactory extends AbstractRuleConfigFactory { + + public DefaultRuleFactory(Long ruleId) { + super(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java deleted file mode 100644 index 9ee97e0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.casic.missiles.parser.instance; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service -@Slf4j -@AllArgsConstructor -public class GeneralProcessor { - - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; - - /** - * 统一固定字段解析=>进行规则的查询的判断 - * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 - * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 - */ - @Deprecated - public boolean parseWholeDatagram(ByteBuf buffer, ProtocolConfig protocolConfig) { - try { - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap,protocolId); - //选取规则对应的流程= - DatagramEventConfig datagramEventConfig = processorSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); - //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); - //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); - //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); - //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); - //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); - return true; - } catch (Exception ex) { - log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", - ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); - return false; - } - } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; - } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); - } - - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); - return bizDataMap; - } - - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java index 25e7ad8..6a5777e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java @@ -1,23 +1,31 @@ package com.casic.missiles.parser.instance.impl; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.mapper.DatagramEventMapper; import com.casic.missiles.pojo.DatagramEventConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.SpringContextUtil; -@Service -@AllArgsConstructor +import java.util.List; +import java.util.Optional; + +/** + * @author cz + * + */ public class DefaultProcessorInstanceSelector implements ProcessorInstanceSelector { - private final DatagramEventMapper datagramEventMapper; + private static List datagramEventConfigs; + + static { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + datagramEventConfigs = datagramEventRegistry.getDatagramEventList(); + } @Override public DatagramEventConfig getProcessorInstance(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("rule_id", protocolId); - return datagramEventMapper.selectOne(queryWrapper); + Optional optionalSelectInstance = datagramEventConfigs.stream() + .filter(e -> e.getId().equals(protocolId)).limit(1).findFirst(); + return optionalSelectInstance.isPresent() ? optionalSelectInstance.get() : null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a778671..7b56a43 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,16 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import io.netty.buffer.ByteBuf; /** - * 分析匹配情况 - * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 - * 2、匹配不成功,有后续帧,可以进行下次匹配。 - * 3、匹配不成功,无后续帧,可以进行丢弃。 + * 分析匹配情况 + * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 + * 2、匹配不成功,有后续帧,可以进行下次匹配。 + * 3、匹配不成功,无后续帧,可以进行丢弃。 */ -public interface FrameStructMatcher{ +public interface FrameStructMatcher { - ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig); + ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 05320ab..8ebea78 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,23 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.ProtocolConfigMapper; +import com.casic.missiles.parser.provider.ProtocolConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Component; import java.util.List; import java.util.stream.Collectors; -@Component -@AllArgsConstructor public class LeadingCodeMatcher { - private final ProtocolConfigMapper protocolMapper; - //** 1、首字母匹配前导码, // 2、以匹配出的前导码是否在报文中条件进行前导码的匹配二次筛选 - public List matchLeadingCode(String protocolContent){ + public static List matchFrameLeadingCode(String protocolContent){ List initialConfigs = initialMatch(protocolContent); List preCodeConfigs = initialConfigs.stream() .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) @@ -26,13 +19,16 @@ } //初始化匹配前导码内容 - private List initialMatch(String protocolContent) { - String protocolStr = protocolContent.charAt(0) + ""; - QueryWrapper queryWrapper = new QueryWrapper() - .likeRight("pre_fix", protocolStr); - List protocolConfigList = protocolMapper.selectList(queryWrapper); - return protocolConfigList; + private static List initialMatch(String protocolContent) { + String firstFrameChar = protocolContent.charAt(0) + ""; + ProtocolConfigProvider protocolConfigProvider=new ProtocolConfigProvider(firstFrameChar); + return protocolConfigProvider.getMatchList(); } + + + + + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index cf2113d..e915877 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -1,32 +1,35 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(0) -@Service +@Component public class FrameLengthMatcher implements FrameStructMatcher { - @Autowired - private FieldParser fieldParser; - //超过长度 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { String dataGramContent = ByteBufUtil.hexDump(byteBuf); - if (StringUtils.isEmpty(protocolConfig.getUnpackId()) && StringUtils.isEmpty(protocolConfig.getTailStr())) { - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + //当不存在结尾标志和拆包标志,可以直接使用长度进行匹配 + if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { if (dataGramContent.length() >= totalLength) {//等于长度返回true,超出长度,切断 - ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, protocolConfig, totalLength); + ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, totalLength); return wholeDatagramByte; } else { //读的标志位前移舍弃 @@ -38,7 +41,7 @@ return null; } - private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, Integer totalLength) { byteBuf.readBytes(totalLength); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, totalLength - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 2bfc213..d527ad0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; @@ -13,7 +13,7 @@ import lombok.AllArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.nio.charset.Charset; import java.util.Map; @@ -22,32 +22,30 @@ * 后续标志验证 */ @Order(1) -@Service +@Component @AllArgsConstructor -public class FrameMarkMatcher implements FrameStructMatcher { - - private final FieldConfigDao fieldConfigDao; - private final FieldParser fieldParser; - private final FieldResolver fieldResolverManger; +public class FrameMarkMatcher implements FrameStructMatcher, FixedPropertyEnum { //帧后续标志=>结束,进行帧的重组=>有后续,1、帧移位判别 2、继续接收帧 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig UnpackConfig = StringUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getUnpackId()); - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); - Integer upback = 0; + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); ByteBuf mergeWholeFrameByte = null; - if (!ObjectUtil.isEmpty(UnpackConfig)) { - while (hasNextFullFrame(byteBuf, protocolConfig)) { - upback = (Integer) fieldResolverManger.filedParserManger(byteBuf, UnpackConfig, null); + if (!ObjectUtil.isEmpty(unpackFlag)) { + while (hasNextFullFrame(byteBuf, protocolConfig, protocolFieldConfigProvider)) { //是否存在后续位 - if (upback == 1) {//使用esayRule + if (unpackFlag == 1) {//使用esayRule //表示可以截取 - mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolConfig, totalLength); + mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolFieldConfigProvider, protocolConfig); return mergeWholeFrameByte; } else { - byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig)); + byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig, protocolFieldConfigProvider)); } } } @@ -56,7 +54,8 @@ //选取第一个帧,将业务内容和后面部分分开 //计算数据报文-业务内容 - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolFieldConfigProvider protocolFieldConfigProvider, ProtocolConfig protocolConfig) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); //截取完整报文 byteBuf.readBytes(totalLength); ByteBuf byteBufContent = byteBuf.slice(0, byteBuf.readerIndex()); @@ -68,15 +67,15 @@ String tail = ""; System.out.println(ByteBufUtil.hexDump(byteBufContent)); //会存在多个帧拼接在一起的的情况,进行合并处理 - while (hasNextFullFrame(byteBufContent, protocolConfig)) { - Integer currentFrameLength = fieldParser.getTotalLength(protocolConfig, byteBufContent); + while (hasNextFullFrame(byteBufContent, protocolConfig, protocolFieldConfigProvider)) { + Integer currentFrameLength = protocolFieldConfigProvider.getTotalLength(byteBufContent, protocolConfig); byteBufContent.readBytes(currentFrameLength); ByteBuf currentbyteBuf = byteBufContent.slice(0, byteBufContent.readerIndex()); byteBufContent.markReaderIndex();//读的标志位前移 System.out.println(ByteBufUtil.hexDump(byteBufContent)); String hexDump = currentbyteBuf.toString(Charset.forName("ISO-8859-1")); //获取当前固定帧结构的关系map - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, currentbyteBuf); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(currentbyteBuf, protocolConfig); if (StringUtils.isEmpty(mergeFrameStr)) { //首次获取业务数据报文 mergeFrameStr += hexDump.substring(0, currentFrameFixedProperty.get("tailPosition")); @@ -95,22 +94,22 @@ /** * 获取平移到下一帧起始位置 */ - public int getNextFrameOffset(ByteBuf buffer, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, buffer); - return currentFrameFixedProperty.get("totalLength"); + public int getNextFrameOffset(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + return currentFrameFixedProperty.get(TOTAL_LENGTH); } /** * 判断是否出错进行整个帧的 */ - public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, byteBuf); + public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); //保证读取位置不在固定位置,是可变的业务内容 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("fixedPosition")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(FIXED_POSITION)) { return false; } //判断读取是否操作帧长度 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("totalLength")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(TOTAL_LENGTH)) { return false; } return true; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 76a3784..c3a1bab 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -1,50 +1,50 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.parser.instance.GeneralProcessor; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; +import io.netty.buffer.ByteBufUtil;; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(2) -@Service +@Component public class FrameTailMatcher implements FrameStructMatcher { - @Resource - private FieldConfigDao fieldConfigDao; - @Autowired - private GeneralProcessor generalProcessor; - //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig tailFieldConfig = StringUtils.isEmpty(protocolConfig.getTailStr()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getTailStr()); - if (!ObjectUtil.isEmpty(tailFieldConfig)) { - String tailStr = tailFieldConfig.getFieldName(); + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfig protocolFieldConfig = ObjectUtils.isEmpty(protocolConfig.getTailStr()) ? null : + fieldConfigProvider.getFieldConfigById(protocolConfig.getTailStr()); + if (!ObjectUtil.isEmpty(protocolFieldConfig)) { + String tailStr = protocolFieldConfig.getFieldName(); String dataGramContent = ByteBufUtil.hexDump(byteBuf); Boolean tailFlag = ByteBufUtil.hexDump(byteBuf).contains(tailStr); if (!tailFlag) { //使用esayRule return null; } else if (dataGramContent.indexOf(tailStr) < dataGramContent.length() - tailStr.length()) { Integer length = dataGramContent.indexOf(tailStr) + tailStr.length(); - ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, protocolConfig, length); + ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, length); return wholeDatagramByte; //存在粘包 } } return null; } - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer length) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, Integer length) { byteBuf.readBytes(length); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, length - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java new file mode 100644 index 0000000..5f1c177 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java @@ -0,0 +1,73 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.combined.GenericCombinedFieldResolver; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.CombinedFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class CombinedFieldConfigProvider { + + + /** + * 作为临时配置列表缓存使用 + */ + private final List combinedFieldConfigList; + private Map storeObjectMap = new HashMap<>(); + + public CombinedFieldConfigProvider(Long ruleId) { + CombinedFieldConfigRegistry combinedFieldConfigRegistry = SpringContextUtil.getBean(CombinedFieldConfigRegistry.class); + combinedFieldConfigList = combinedFieldConfigRegistry.getCombinedFieldConfigList(ruleId); + } + + public void parseDataField(RuleConfig ruleConfig, String clearZeroPlain,Map fieldConfigsMap ) { + if (showSkip()) { + return; + } + //匹配对应的数据,然后进行相关的字段解析 + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver(); + combinedFieldResolver.parseDataField(combinedFieldConfigList, byteBuf, storeObjectMap,fieldConfigsMap); + } + + + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getCombinedFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return combinedFieldConfigList.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public List getCombinedFieldConfigList() { + return combinedFieldConfigList; + } + + /* 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(combinedFieldConfigList) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java new file mode 100644 index 0000000..f3cfedc --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java @@ -0,0 +1,11 @@ +package com.casic.missiles.parser.provider; + +/** + * @author cz + * @date 2023-6-12 + */ +public class CommandEventProvider{ + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java new file mode 100644 index 0000000..70eec5e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java @@ -0,0 +1,77 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.safe.SafeStrategy; +import com.casic.missiles.parser.sender.DataSubscribeProvider; +import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class DatagramEventProvider { + + private final DatagramEventConfig processorInstance; + + public DatagramEventProvider(Long ruleId) { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + List datagramEventConfigList = + datagramEventRegistry.getDatagramEventList(ruleId); + processorInstance = this.getProcessorInstance(datagramEventConfigList); + } + + public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { + if (showSkip()) { + return null; + } + return datagramEventConfigList.get(0); + } + + // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 + public String getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap) { + String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? + processorInstance.getSafeBean() : + fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); + if (!StringUtils.isEmpty(safeName)) { + //需要加密 + SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); + String plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); + return clearComplementZero(plain); + } + return ByteBufUtil.hexDump(bizDataContent); + } + + //解密清零操作 + private String clearComplementZero(String plain) { + plain = plain.substring(0, plain.lastIndexOf("00")); + return plain; + } + + //数据发送,数据发送者暂未构建 + public void storeData(Map bizDataMap) { + DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); +// dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return ObjectUtils.isNotEmpty(processorInstance) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java new file mode 100644 index 0000000..7e1fe0a --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java @@ -0,0 +1,97 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.FieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class FieldConfigProvider { + + + private final List fieldConfigs; + private Map storeObjectMap = new HashMap<>(); +// private Map singleObjects = new ConcurrentHashMap<>(); + + public FieldConfigProvider(Long ruleId) { + FieldConfigRegistry fieldConfigRegistry = SpringContextUtil.getBean(FieldConfigRegistry.class); + fieldConfigs = fieldConfigRegistry.getFieldConfigList(ruleId); + } + + public List getFieldConfigs() { + return fieldConfigs; + } + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public Map parseDataField(RuleConfig ruleConfig, String clearZeroPlain) { + if (showSkip()) { + return null; + } + List prepareFieldConfig = prepareParseField(ruleConfig); + if (CollectionUtils.isNotEmpty(prepareFieldConfig)) { + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(fieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + return fixDataMap; + } + } + return null; + } + + /** + * 得到需要处理的业务内容 + * + * @return + */ + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return fieldConfigs.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public Map getFieldConfigsMap() { + return fieldConfigs.stream().collect( + Collectors.toMap(FieldConfig::getId, e -> e) + ); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(fieldConfigs) ? false : true; + } + + +} + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java new file mode 100644 index 0000000..817bfaf --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java @@ -0,0 +1,19 @@ +package com.casic.missiles.parser.provider; + +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.registry.FieldRuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; + +public class FieldRuleConfigProvider { + + private final List fieldRuleConfigList; + + public FieldRuleConfigProvider(Long ruleId) { + FieldRuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(FieldRuleConfigRegistry.class); + fieldRuleConfigList = ruleConfigRegistry.getFieldRuleConfigList(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java new file mode 100644 index 0000000..99a1b06 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java @@ -0,0 +1,53 @@ +package com.casic.missiles.parser.provider; + + +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.registry.ProtocolConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolConfigProvider { + + private final List protocolConfigList; + + public ProtocolConfigProvider(String firstChar) { + ProtocolConfigRegistry registry = SpringContextUtil.getBean(ProtocolConfigRegistry.class); + protocolConfigList = registry.getProtocolConfigList(firstChar); + } + + public List getMatchList() { + return protocolConfigList; + } + + /** + * 设置当前协议 + * + * @param protocolConfig + */ + public ProtocolConfigProvider(ProtocolConfig protocolConfig) { + List protocolConfigs = new ArrayList<>(); + protocolConfigs.add(protocolConfig); + protocolConfigList = protocolConfigs; + } + + /** + * 获取当前协议 + * + * @return + */ + public ProtocolConfig getCurrentProtocolConfig() { + if (this.protocolConfigList == null) { + return null; + } else { + return protocolConfigList.get(0); + } + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java new file mode 100644 index 0000000..043927d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java @@ -0,0 +1,213 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.registry.ProtocolFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolFieldConfigProvider { + + private static final String FIXED_FIELD_DS = "fixedFieldDs"; + private static final String CONTENT_FIELD_DS = "contentFieldDs"; + private static final String PROTOCOL_LENGTH = "protocolLength"; + private static final String PROTOCOL_FIELD_ID = "protocolFieldId"; + private static final String PROTOCOL_POSITION = "protocolPosition"; + + private final List protocolFieldConfigs; + private Map singleObjects = new ConcurrentHashMap<>(); + private Map storeObjectMap = new HashMap<>(); + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public ProtocolFieldConfigProvider(Long protocolId) { + ProtocolFieldConfigRegistry protocolFieldConfigRegistry = SpringContextUtil.getBean(ProtocolFieldConfigRegistry.class); + protocolFieldConfigs = protocolFieldConfigRegistry.getProtocolFieldConfigList(protocolId); + } + + public List getProtocolFieldConfigs() { + return protocolFieldConfigs; + } + + public ProtocolFieldConfig getFieldConfigById(Long fieldId) { + Optional optionalConfig = protocolFieldConfigs.stream().filter( + e -> e.getId().equals(fieldId) + ).findFirst(); + return optionalConfig.isPresent() ? optionalConfig.get() : null; + } + + public Integer getProtocolFieldValue(Long protocolFieldId, ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_FIELD_ID + protocolFieldId + ByteBufUtil.hexDump(byteBuf); + //获取缓存 + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + //加载固定长度数据集合 + Map fixDataMap = this.getProtocolDataMap(byteBuf); + ProtocolFieldConfig protocolFieldConfig = selectFieldConfig(protocolFieldId); + Integer protocolFieldValue = 0; + //获取约定字段的总长度 + if (fixDataMap.containsKey(protocolFieldConfig.getFieldName())) { + Object appointUnpackObject = fixDataMap.get(protocolFieldConfig.getFieldName()); + if (ObjectUtils.isNotEmpty(appointUnpackObject)) { + protocolFieldValue = (Integer) appointUnpackObject; + } + } + if (protocolFieldValue != null) { + //加入缓存 + if (ObjectUtils.isNotEmpty(protocolFieldValue)) { + this.singleObjects.put(catchKey, protocolFieldValue); + return protocolFieldValue; + } + } + return null; + } + + /** + * 获取帧固定位置信息 + * + * @param byteBuf + * @param protocolConfig + * @return + */ + public Map getFixedProperty(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_POSITION + protocolConfig.getId(); + if (this.singleObjects.containsKey(catchKey)) { + return (Map) singleObjects.get(catchKey); + } + Map fixedPropertyMap = new HashMap<>(); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + fixedPropertyMap = fieldParser.doGetFixedProperty(protocolFieldConfigs, this.getTotalLength(byteBuf,protocolConfig)); + if (CollectionUtils.isNotEmpty(fixedPropertyMap)) { + this.singleObjects.put(catchKey, fixedPropertyMap); + return fixedPropertyMap; + } + return fixedPropertyMap; + } + + /** + * 获取帧结构应有的总长度 + */ + public Integer getTotalLength(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_LENGTH + ByteBufUtil.hexDump(byteBuf); + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + Integer appointFrameLength = getProtocolFieldValue(protocolConfig.getTotalLengthId(), byteBuf); + if (appointFrameLength != null) { + //获取过滤的字段集合总长度 + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Integer totalFilterLength = fieldParser.getTotalFilterLength(protocolConfig, byteBuf, getFixFieldConfigMap()); + //计算总长度 + Integer totalLength = appointFrameLength + totalFilterLength; + //加入缓存 + if (ObjectUtils.isNotEmpty(totalLength)) { + this.singleObjects.put(catchKey, totalLength); + return totalLength; + } + } + return null; + } + + /** + * 获取协议有关字段解析内容 + * storeObjectMap存储代转存的数据 + * + * @return + */ + public Map getProtocolDataMap(ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(FIXED_FIELD_DS)) { + return (Map) singleObjects.get(FIXED_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(protocolFieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + this.singleObjects.put(FIXED_FIELD_DS, fixDataMap); + return fixDataMap; + } + return null; + } + + /** + * 获取业务报文内容的content字节 + * + * @param wholeDatagramByte + * @return + */ + public ByteBuf getDataContentBuf(ByteBuf wholeDatagramByte) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(CONTENT_FIELD_DS)) { + return (ByteBuf) singleObjects.get(CONTENT_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + ByteBuf bizDataByteBuf = fieldParser.getDataContentBuf(protocolFieldConfigs, wholeDatagramByte); + if (bizDataByteBuf != null) { + this.singleObjects.put(CONTENT_FIELD_DS, bizDataByteBuf); + return bizDataByteBuf; + } + return null; + } + + + private ProtocolFieldConfig selectFieldConfig(Long id) { + Optional optionalProtocolFieldConfig = this.protocolFieldConfigs.stream().filter( + e -> e.getId().equals(id) + ).findFirst(); + return optionalProtocolFieldConfig.isPresent() ? optionalProtocolFieldConfig.get() : null; + } + + + private Map getFixFieldConfigMap() { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, e -> e) + ); + return fixDataFieldMap; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(protocolFieldConfigs) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java new file mode 100644 index 0000000..dafba1c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java @@ -0,0 +1,56 @@ +package com.casic.missiles.parser.provider; + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.rule.GenericRuleResolver; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.RuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleConfigProvider { + + private final List ruleConfigs; + + public List getRuleConfigs() { + return ruleConfigs; + } + + public RuleConfigProvider(Long protocolId) { + RuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(RuleConfigRegistry.class); + ruleConfigs = ruleConfigRegistry.getRuleConfigById(protocolId); + } + + /** + * 获取规则匹配结果 + * + * @param parseFixedDataMap + * @param protocolFieldConfigs + * @return + */ + public RuleConfig doGetRule(Map parseFixedDataMap, + String ids, + List protocolFieldConfigs) { + if (showSkip()) { + return null; + } + RuleConfig ruleConfig = GenericRuleResolver.machRule(parseFixedDataMap, ids, protocolFieldConfigs, ruleConfigs); + return ruleConfig; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(ruleConfigs) ? false : true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java index 3c05891..856b399 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java @@ -1,18 +1,11 @@ package com.casic.missiles.parser.resolver; -import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.springframework.web.bind.annotation.RequestBody; -import javax.annotation.Resource; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -20,19 +13,17 @@ @Slf4j public class ByteMergeProvider { - @Resource - private FieldRuleEngineMapper fieldRuleEngineMapper; - //拿到所有的值合并到一个值 - public String resolveByteMerge(List valueList, String ruletypeId, String vaildRange) { + public static String resolveByteMerge(List valueList, String ruleTypeId, String vaildRange) { String values = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Map vaildMap = getValidRangeMap(vaildRange); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(ruletypeId); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } + //暂时不处理 +// fieldRuleEngine = fieldRuleConfigMapper.selectById(ruleTypeId); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } Map env2 = new HashMap(); for (int i = 0; i < valueList.size(); i++) { if (vaildMap.containsKey(i)) { @@ -47,7 +38,7 @@ } } - private Map getValidRangeMap(String vaildRange) { + private static Map getValidRangeMap(String vaildRange) { String[] range = vaildRange.split(","); Map vaildMap = new HashMap(); for (int i = 0; i < range.length; i++) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 8d821cd..85d6bbf 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -1,9 +1,12 @@ package com.casic.missiles.parser.resolver; +import com.casic.missiles.pojo.AbstractFieldConfig; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; import io.netty.buffer.ByteBuf; +import java.util.List; import java.util.Map; /** @@ -11,18 +14,14 @@ */ public interface FieldParser { -// Map fieldProcess(String protocolContent,); - Map dataParser(RuleConfig ruleConfig, String lightText,String protocolId); + Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength); - Map fixDataParser(String protocolId, ByteBuf buffer); + Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap); - Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf); + ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer); - ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer); - - ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer); - - Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer); + Integer getTotalFilterLength(ProtocolConfig protocolConfig, ByteBuf byteBuf, Map protocolFieldConfigMap); } + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java new file mode 100644 index 0000000..9e0c00e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java @@ -0,0 +1,52 @@ +package com.casic.missiles.parser.resolver; + +import com.casic.missiles.pojo.AbstractFieldConfig; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.util.List; + +public class FieldParserSupport { + + //分别计算bit和byte长度=> 合并长度 + protected Integer calculateLength(List fieldConfigList) { + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + Integer fixedLength = bytefixedLength + bitfixedLength / 8; + return fixedLength; + } + + //找到最大值=> 根据最大值计算业务数据下标 + protected Integer calculatePosition(List fieldConfigList) { + String rex = "[0-9]+"; + Integer max = -1; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) + && Integer.valueOf(fieldConfig.getOriginPositionByte()) > max) { + max = Integer.valueOf(fieldConfig.getOriginPositionByte()); + } + } + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) && fieldConfig.getOriginPositionByte().equals(max)) { + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + } + } + Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; + return maxFixedPosition; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java deleted file mode 100644 index dd3a6cd..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java +++ /dev/null @@ -1,170 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.ByteResolverParam; -import io.netty.buffer.ByteBuf; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -/** - * 字段解析管理总类 - */ -@Service -@Slf4j -@AllArgsConstructor -public class FieldResolver extends ByteMergeProvider { - - //1、字段截取 => 2、简单的字节解析和复杂的字节解析 - public Object filedParserManger(ByteBuf byteBuf, FieldConfig fieldConfig, Integer maxFixedPosition) { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - //最大固定位置不为空, - if (!ObjectUtil.isEmpty(maxFixedPosition)) { - orignPosition -= maxFixedPosition; - } - Object fieldValue = 0; - //待优化 - if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { - fieldValue = bitToResolver(byteBuf, fieldConfig); - } else { - ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); - fieldValue = parsingFields(fieldBytes, fieldConfig.getRuleJson()); - } - return fieldValue; - } - - //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, - //目前默认配置的规则设置暂不支持配置化,由实现完成 - private Object parsingFields(ByteBuf byteBuf, String ruleJson) { - Object fieldsResolveValue = null; - List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); - if (ObjectUtil.isEmpty(ruleMapList)) { - fieldsResolveValue = defaultResolveBuilder(byteBuf); - } else { - fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); - } - return fieldsResolveValue; - } - - private Object defaultResolveBuilder(ByteBuf byteBuf) { - Integer defaultResolveValue = 0; - for (int i = 0; i < byteBuf.writerIndex(); i++) { - defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; - } - return defaultResolveValue; - } - - //字段解析构建器(针对字节单位的) - //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 - // 字节归并结束或者规则结束=>继续根据规则进行判断 - private Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { - Object customizeResolveValue = null; - try { - List bytStrList = new ArrayList<>(); - //存放到数组里面 - for (int i = 0; i < byteBuf.writerIndex(); i++) { - bytStrList.add(byteBuf.readByte()); - } - int i = 0; - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - customizeResolveValue = this.resolveByteMerge(bytStrList, ruletypeId,vaildRange); - break; - } else { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - List tempBytStr = new ArrayList<>(); - for (int k = 0; i < bytStrList.size(); i++) { - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(k) - .value(bytStrList.get(k)) - .ruletypeId(ruletypeId).build(); - tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); - } - bytStrList = tempBytStr; - } - i++; - } - //字节归并到一起=>继续根据规则进行判断 - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(customizeResolveValue) - .ruletypeId(ruletypeId).build(); - customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(customizeResolveValue)); - return customizeResolveValue; - } catch (RuntimeException ex) { - log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); - return null; - } - } - - /** - * 1、单个字节情况表示字段 - * 2、多字节情况表示字段(暂未处理) - */ - private Object bitToResolver(ByteBuf byteBuf, FieldConfig fieldConfig) { - Object fieldValue = new Object(); - try { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - byte fields = 0x00; - if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); - } else { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); - } - - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { - if (!StringUtils.isEmpty(fieldConfig.getExactOrignPosition())) { - fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getExactOrignPosition())).byteValue() - >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); - } else { - fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); - } - } else { - fieldValue = Integer.valueOf(fields & 0xff); - } - if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { - return fieldValue; - } - List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); - int i = 0; - //字节归并到一起=>继续根据规则进行判断 - while (i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(fieldValue) - .ruletypeId(ruletypeId).build(); - fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(fieldValue)); - return fieldValue; - } catch (RuntimeException ex) { - log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); - return null; - } - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java new file mode 100644 index 0000000..1d2aeab --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java @@ -0,0 +1,36 @@ +package com.casic.missiles.parser.resolver.bytes; + +import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.mapper.FieldRuleConfigMapper; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.pojo.ByteResolverParam; +import com.googlecode.aviator.AviatorEvaluator; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; +//转换规则 +@Component("convert") +@AllArgsConstructor +@Slf4j +public class ByteRuleResolver implements ByteResolver { + + private final FieldRuleConfigMapper fieldRuleConfigMapper; + + @Override + public Object resolveOperationRule(ByteResolverParam byteResolverParam){ + FieldRuleConfig fieldRuleEngine=fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); + if(ObjectUtil.isEmpty(fieldRuleEngine)){ + return byteResolverParam.getValue(); + } + String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); + Map env2 = new HashMap(); + env2.put("value", (byte) byteResolverParam.getValue()); + String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); + return values; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java index 103821c..786b71c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java @@ -2,34 +2,34 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("logicalShift") +@Component("logicalShift") @AllArgsConstructor @Slf4j public class LogicalShiftResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //字节位移 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { Integer index = byteResolverParam.getIndex(); - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return byteResolverParam.getValue(); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java index 476747d..01149bd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("operation") +@Component("operation") @AllArgsConstructor @Slf4j public class OperationResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //混合运算,有常量或者乘除的缩放 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java index 0b82cf4..79abcce 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.casic.missiles.pojo.ByteResolverParam; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; //精度计算 -@Service("precision") +@Component("precision") @AllArgsConstructor @Slf4j public class PrecisionResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java deleted file mode 100644 index 5c3f332..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; -//转换规则 -@Service("convert") -@AllArgsConstructor -@Slf4j -public class RuleResolver implements ByteResolver { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam){ - RuleEvaluator fieldRuleEngine=fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); - if(ObjectUtil.isEmpty(fieldRuleEngine)){ - return byteResolverParam.getValue(); - } - String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); - Map env2 = new HashMap(); - env2.put("value", (byte) byteResolverParam.getValue()); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java new file mode 100644 index 0000000..d3bbd91 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java @@ -0,0 +1,15 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; + +import java.util.List; +import java.util.Map; +// 前导码匹配->长度字段 +public interface AbstractCombinedFieldProcessor { + + Map invoke(Map map, ByteBuf byteBuf, List combinedFieldConfigList, + Map fieldConfigsMap, Map storeObjectMap); + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java new file mode 100644 index 0000000..03c8480 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java @@ -0,0 +1,59 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-13 + */ +//依次递增进行数据的解析, +public class GenericCombinedFieldResolver { + + + //通过查询,字段长度长度随机 + public void parseDataField(List combinedFieldConfigList, ByteBuf byteBuf, + Map storeObjectMap, Map fieldConfigsMap) { + Integer frameLength = Integer.valueOf(ByteBufUtil.hexDump(byteBuf)); + //添加前置处理器 + com.casic.missiles.util.ClassUtil classUtil = new com.casic.missiles.util.ClassUtil(); + List abstractCombinedProcessors = classUtil.getSubClassList(AbstractCombinedFieldProcessor.class); + + Map fieldFixedMap = combinedFieldLeadCodeMap(combinedFieldConfigList); + //frameLength + Map combinedProcessorFields = null; + while (byteBuf.readableBytes() < frameLength) { + //一直处理 + for (AbstractCombinedFieldProcessor abstractCombinedProcessor : abstractCombinedProcessors) { + combinedProcessorFields = abstractCombinedProcessor.invoke(combinedProcessorFields, byteBuf, + combinedFieldConfigList, + fieldConfigsMap, storeObjectMap); + if (combinedProcessorFields == null || byteBuf.readableBytes() < frameLength) { + return; + } + } + + } + } + + /** + * 取出前导码匹配集合 + */ + private Map combinedFieldLeadCodeMap(List combinedFieldConfigList) { + Map fieldFixedMap = combinedFieldConfigList + .stream() + .collect(Collectors.toMap(CombinedFieldConfig::getPrefixCode, e -> e)); + return fieldFixedMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java new file mode 100644 index 0000000..643a934 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java @@ -0,0 +1,100 @@ +package com.casic.missiles.parser.resolver.fields; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.FieldParserSupport; +import com.casic.missiles.pojo.*; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 保存使用时最基本的信息,并且使用原型模式 + */ +@Slf4j +public class DefaultProtocolFieldParser extends FieldParserSupport implements FieldParser, FixedPropertyEnum { + + //通过传入的配置和报文进行字段解析 + @Override + public Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap) { + Map dataMap = new HashMap<>(); + for (AbstractFieldConfig protocolFieldConfig : protocolFieldConfigs) { + if (!ObjectUtils.isEmpty(protocolFieldConfig.getOriginPositionByte())) { + Object fieldValue = FieldResolver.parseField(buffer, protocolFieldConfig, null); + if (protocolFieldConfig.getIsStorage() == 1) { + storeObjectMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + dataMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + } + return dataMap; + } + + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength) { + Map fixedPropertyMap = new HashMap<>(); + Integer fixedLength = calculateLength(protocolFieldConfigs); + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + fixedPropertyMap.put(FIXED_POSITION, maxFixedPosition); + fixedPropertyMap.put(TOTAL_LENGTH, totalLength); + fixedPropertyMap.put(TAIL_POSITION, totalLength - fixedLength + maxFixedPosition); + return fixedPropertyMap; + } + + //** 获取业务内容的byteBuf + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer) { + //计算固定长度 + Integer fixedLength = calculateLength(protocolFieldConfigs); + //总长度获取 + String lightText = buffer.toString(Charset.forName("ISO-8859-1")); + Integer totalLength = lightText.length(); + //计算固定长度最大长度 + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + //计算数据报文内容 + ByteBuf bizDataFields = buffer.slice(maxFixedPosition - 1, (totalLength - fixedLength)); + return bizDataFields; + } + + /** + * 获取过滤字段的长度 + */ + @Override + public Integer getTotalFilterLength(ProtocolConfig protocolConfig, + ByteBuf byteBuf, + Map protocolFieldConfigMap) { + if (ByteBufUtil.hexDump(byteBuf).equals("")) { + return 0; + } + int totalFilterLength = 0; + String filterFields = protocolConfig.getTotalLengthFilterFields(); + try { + if (!StringUtils.isEmpty(filterFields)) { + String[] filterFieldList = filterFields.split(","); + for (String filterFieldId : filterFieldList) { + if (StringUtils.isNotEmpty(filterFieldId)) { + ProtocolFieldConfig fieldConfig = protocolFieldConfigMap.get(Long.valueOf(filterFieldId)); + //这里都是按字节计算,没有对位进行区分,可能会出现错误 + // 如果对位有需求,需要进一步跟进 + totalFilterLength += fieldConfig.getOffsetLength(); + } + } + } + return totalFilterLength; + } catch (Exception ex) { + log.error("报文确认分发阶段,获取报文总长度过滤长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); + } + return totalFilterLength; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java new file mode 100644 index 0000000..d51e887 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java @@ -0,0 +1,169 @@ +package com.casic.missiles.parser.resolver.fields; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.parser.resolver.ByteMergeProvider; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.AbstractFieldConfig; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.pojo.ByteResolverParam; +import io.netty.buffer.ByteBuf; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * 字段解析管理总类 + */ +@Slf4j +public class FieldResolver extends ByteMergeProvider { + + //1、字段截取 => 2、简单的字节解析和复杂的字节解析 + public static Object parseField(ByteBuf byteBuf,AbstractFieldConfig fieldConfig, Integer maxFixedPosition) { + Integer orignPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + //最大固定位置不为空, + if (!ObjectUtil.isEmpty(maxFixedPosition)) { + orignPosition -= maxFixedPosition; + } + Object fieldValue = 0; + //待优化 + if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { + fieldValue = doParseBitField(byteBuf, fieldConfig); + } else { + ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); + fieldValue = doParseByteField(fieldBytes, fieldConfig.getRuleJson()); + } + return fieldValue; + } + + //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, + //目前默认配置的规则设置暂不支持配置化,由实现完成 + private static Object doParseByteField(ByteBuf byteBuf, String ruleJson) { + Object fieldsResolveValue = null; + List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); + if (ObjectUtil.isEmpty(ruleMapList)) { + fieldsResolveValue = defaultResolveBuilder(byteBuf); + } else { + fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); + } + return fieldsResolveValue; + } + + private static Object defaultResolveBuilder(ByteBuf byteBuf) { + Integer defaultResolveValue = 0; + for (int i = 0; i < byteBuf.writerIndex(); i++) { + defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; + } + return defaultResolveValue; + } + + //字段解析构建器(针对字节单位的) + //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 + // 字节归并结束或者规则结束=>继续根据规则进行判断 + private static Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { + Object customizeResolveValue = null; + try { + List bytStrList = new ArrayList<>(); + //存放到数组里面 + for (int i = 0; i < byteBuf.writerIndex(); i++) { + bytStrList.add(byteBuf.readByte()); + } + int i = 0; + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { + if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + customizeResolveValue = resolveByteMerge(bytStrList, ruletypeId, vaildRange); + break; + } else { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + List tempBytStr = new ArrayList<>(); + for (int k = 0; i < bytStrList.size(); i++) { + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(k) + .value(bytStrList.get(k)) + .ruletypeId(ruletypeId).build(); + tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); + } + bytStrList = tempBytStr; + } + i++; + } + //字节归并到一起=>继续根据规则进行判断 + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(null) + .value(customizeResolveValue) + .ruletypeId(ruletypeId).build(); + customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); + i++; + } + System.out.println(JSON.toJSON(customizeResolveValue)); + return customizeResolveValue; + } catch (RuntimeException ex) { + log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); + return null; + } + } + + /** + * 1、单个字节情况表示字段 + * 2、多字节情况表示字段(暂未处理) + */ + private static Object doParseBitField(ByteBuf byteBuf,AbstractFieldConfig fieldConfig) { + Object fieldValue = new Object(); + try { + Integer orignPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + byte fields = 0x00; + if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { + fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); + } else { + fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); + } + + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { + if (!StringUtils.isEmpty(fieldConfig.getOriginPositionBit())) { + fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getOriginPositionBit())).byteValue() + >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); + } else { + fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); + } + } else { + fieldValue = Integer.valueOf(fields & 0xff); + } + if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { + return fieldValue; + } + List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); + int i = 0; + //字节归并到一起=>继续根据规则进行判断 + while (i < ruleMapList.size()) { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(null) + .value(fieldValue) + .ruletypeId(ruletypeId).build(); + fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); + i++; + } + System.out.println(JSON.toJSON(fieldValue)); + return fieldValue; + } catch (RuntimeException ex) { + log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); + return null; + } + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java deleted file mode 100644 index 35ae3d0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java +++ /dev/null @@ -1,183 +0,0 @@ -package com.casic.missiles.parser.resolver.fields; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufAllocator; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; -import org.springframework.util.ObjectUtils; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service("standard") -@AllArgsConstructor -@Slf4j -public class StandardFieldParser implements FieldParser { - - private final FieldConfigDao fieldConfigDao; - private final FieldResolver fieldResolver; - - //数据解析 - @Override - public Map dataParser(RuleConfig ruleConfig, String lightText, String protocolId) { - String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); - ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); - bufferContent.writeBytes(lightText.getBytes(Charset.forName("ISO-8859-1"))); - Map dataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - for (String dataFieldId : dataFieldIds) { - FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(dataFieldId); - if (!ObjectUtils.isEmpty(fieldConfig)) { - dataMap.put(fieldConfig.getFieldName(), String.valueOf(fieldResolver.filedParserManger(bufferContent, fieldConfig, maxFixedPosition))); - } - } - return dataMap; - } - - //数据解析 - @Override - public Map fixDataParser(String protocolId, ByteBuf buffer) { - List dataFieldIdList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Map dataMap = new HashMap<>(); - for (FieldConfig dataField : dataFieldIdList) { - if (!ObjectUtils.isEmpty(dataField.getOrignPosition())) { - Object fieldValue = (Integer) fieldResolver.filedParserManger(buffer, dataField, null); - dataMap.put(dataField.getFieldName(), fieldValue); - } - } - return dataMap; - } - - @Override - public Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf) { - if (ByteBufUtil.hexDump(byteBuf).equals("")) { - return 0; - } - String filterFields = protocolConfig.getTotalLengthFilterField(); - Integer totalLength = 0; - try { - FieldConfig totalFieldConfig = fieldConfigDao.getFieldConfigById(protocolConfig.getTotalLengthId()); - int totalFilterLength = 0; - if (!StringUtils.isEmpty(filterFields)) { - String[] filterFieldList = filterFields.split(","); - for (String filterField : filterFieldList) { - FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(filterField); - //这里都是按字节计算,没有对位进行区分,可能会出现错误 - - // 如果对位有需求,需要进一步跟进 - totalFilterLength += fieldConfig.getOffsetLength(); - } - } - totalLength = (Integer) fieldResolver.filedParserManger(byteBuf, totalFieldConfig, null) + totalFilterLength; - } catch (Exception ex) { - log.error("报文确认分发阶段,获取报文总长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); - } - return totalLength; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer) { - //业务内容 - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - String protocolId = String.valueOf(protocolConfig.getId()); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - //计算固定长度 - Integer fixedLength = calculateLength(fieldConfigList); -// Integer totalLength = this.getTotalLength(protocolConfig, buffer); - //总长度获取 - Integer totalLength = lightText.length(); - //计算固定长度最大长度 - Integer maxFixedPosition = calculatePosition(fieldConfigList); -// buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - //计算数据报文内容 - ByteBuf bizDataFields = buffer.slice(maxFixedPosition-1, (totalLength - fixedLength)); - return bizDataFields; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer) { - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - String protocolId = String.valueOf(protocolConfig.getId()); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer fixedLength = calculateLength(fieldConfigList); -// Integer totalLength = this.getTotalLength(protocolConfig, buffer); - Integer totalLength = lightText.length(); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - ByteBuf fixDataFields = buffer.slice(0, maxFixedPosition); - return fixDataFields; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer) { - String protocolId = String.valueOf(protocolConfig.getId()); - Map fixedPropertyMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer fixedLength = calculateLength(fieldConfigList); - Integer totalLength = this.getTotalLength(protocolConfig, buffer); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - fixedPropertyMap.put("fixedPosition", maxFixedPosition); - fixedPropertyMap.put("totalLength", totalLength); - fixedPropertyMap.put("tailPosition", totalLength - fixedLength + maxFixedPosition); - return fixedPropertyMap; - } - - //分别计算bit和byte长度=> 合并长度 - private Integer calculateLength(List fieldConfigList) { - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (FieldConfig fieldConfig : fieldConfigList) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - Integer fixedLength = bytefixedLength + bitfixedLength / 8; - return fixedLength; - } - - //找到最大值=> 根据最大值计算业务数据下标 - private Integer calculatePosition(List fieldConfigList) { - String rex = "[0-9]+"; - Integer max = -1; - for (FieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOrignPosition()) - && Integer.valueOf(fieldConfig.getOrignPosition()) > max) { - max = Integer.valueOf(fieldConfig.getOrignPosition()); - } - } - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (FieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOrignPosition()) && fieldConfig.getOrignPosition().equals(max)) { - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - } - } - Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; - return maxFixedPosition; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java new file mode 100644 index 0000000..d4ec6c7 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java @@ -0,0 +1,76 @@ +package com.casic.missiles.parser.rule; + +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import org.apache.commons.lang3.StringUtils; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class GenericRuleResolver { + + //根据前置字段的值,找到指定的规则 + //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 + //=>循环判断=>通过规则得到业务字段 + public static RuleConfig machRule(Map fixDataMap, + String ids, + List protocolFieldConfigs, + List ruleConfigs) { + List preRuleConfigList = getPreRuleList(ids, protocolFieldConfigs); + //获取前置规则字段 + final Map metaDataMap = getPreRuleFields(preRuleConfigList, fixDataMap); + //准备固定的字段集合 + Map fixDataFieldMap = getFixDataFieldMap(protocolFieldConfigs); + return RuleResolverCore.doMachRule(ruleConfigs, metaDataMap, fixDataMap, fixDataFieldMap); + } + + private static Map getFixDataFieldMap(List protocolFieldConfigs) { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, ProtocolFieldConfig::getFieldName) + ); + return fixDataFieldMap; + } + + + /** + * 查询前置规则的字段配置 + * + * @param ids + * @return + */ + private static List getPreRuleList(String ids, List protocolFieldConfigs) { + String[] idList = ids.split(","); + Map prepareMaps = new HashMap<>(); + for (String id : idList) { + if (StringUtils.isNotEmpty(id)) { + prepareMaps.put(Long.valueOf(id), ""); + } + } + List preRuleConfigList = protocolFieldConfigs + .stream() + .filter(e -> prepareMaps.containsKey(e.getId())) + .collect(Collectors.toList()); + return preRuleConfigList; + } + + /** + * 获取前置规则解析字段 + */ + private static Map getPreRuleFields(List preRuleFieldConfigList, Map fixDataMap) { + Map ruleFieldMap = new HashMap<>(); + preRuleFieldConfigList.stream() + .forEach( + preRuleFieldConfig -> { + String fieldName = preRuleFieldConfig.getFieldName(); + if (fixDataMap.containsKey(fieldName)) { + ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); + } + } + ); + return ruleFieldMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java new file mode 100644 index 0000000..baae7e8 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -0,0 +1,68 @@ +package com.casic.missiles.parser.rule; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.casic.missiles.pojo.RuleConfig; + +import java.util.*; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleResolverCore { + + + public static RuleConfig doMachRule(List ruleConfigList, Map metaDataMap, + Map fixDataMap, + Map fixDataFieldMap) { + Optional ruleConfigOptional = ruleConfigList.stream() + .filter(ruleConfig -> machRuleConfig( + JSON.parseObject(ruleConfig.getMatchRuleJson(), Map.class), metaDataMap)) + .findFirst(); + if (ObjectUtil.isEmpty(ruleConfigOptional)) { + return null; + } + String[] ruleFields = ruleConfigOptional.get().getDataFieldIds().split(","); + Map ruleMetaDataMap = getRuleFields(ruleFields, fixDataMap, fixDataFieldMap); + //递归选定解析规则,进行规则解析 + if (!ruleConfigOptional.get().getIsFinishMatch().equals("1")) { + //递归选定规则 + doMachRule(ruleConfigList, ruleMetaDataMap, fixDataMap, fixDataFieldMap); + } + return ruleConfigOptional.get(); + } + + + private static Map getRuleFields(String[] preRuleConfigList, Map fixedDataMap, + Map fixedFieldMap) { + Map ruleFieldMap = new HashMap<>(); + for (String preRuleConfigId : preRuleConfigList) { + String fieldName = fixedFieldMap.get(preRuleConfigId); + if (fixedDataMap.containsKey(fieldName)) { + ruleFieldMap.put(fieldName, String.valueOf(fixedDataMap.get(fieldName))); + } + } + return ruleFieldMap; + } + + + //匹配规则配置 + private static Boolean machRuleConfig(Map ruleMap, Map metaDataMap) { + if (ruleMap == null || metaDataMap == null) { + return null; + } + //所有的字段在规则里面必须有有配置 + for (String key : metaDataMap.keySet()) { + if (ruleMap.containsKey(key)) { + if (!ruleMap.get(key).equals(metaDataMap.get(key))) { + return false; + } + } else { + return false; + } + } + return true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java deleted file mode 100644 index 664088d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java +++ /dev/null @@ -1,92 +0,0 @@ -package com.casic.missiles.parser.rule; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.mapper.dao.PreRuleConfigDao; -import com.casic.missiles.mapper.dao.RuleConfigDao; -import lombok.AllArgsConstructor; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.*; -import java.util.stream.Collectors; - -@Service -@AllArgsConstructor -public class RulerProvider { - - private final FieldConfigDao fieldConfigDao; - private final PreRuleConfigDao preRuleConfigDao; - private final RuleConfigDao ruleConfigDao; - - //根据前置字段的值,找到指定的规则 - //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 - //=>循环判断=>通过规则得到业务字段 - public RuleConfig ruleConfig(Map fixDataMap, String protocolId) { - //批量获取规则 - List preRuleConfigList = preRuleConfigDao.getPreRuleList(protocolId); - //获取固定字段 - Map fixFieldMap = getAllFieldMap(protocolId); - //获取前置规则字段 - final String preRuleFields = getPreRuleFields(preRuleConfigList, fixDataMap, fixFieldMap); - List ruleConfigList = ruleConfigDao.getRuleConfigById(protocolId); - Optional ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig ->preRuleFields.equals( ruleConfig.getParseRuleJson())).findFirst(); - //递归选定解析规则,进行规则解析 - while (!ObjectUtil.isEmpty(ruleConfigOptional) && !ruleConfigOptional.get().getIsBizField().equals("1")) { - String ruleFields = getRuleFields(ruleConfigOptional.get().getDataFieldIds().split(","), fixDataMap, fixFieldMap); - ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig -> ruleConfig.getParseRuleJson().equals(ruleFields)).findFirst(); - } - return ruleConfigOptional.get(); - } - - /** - * 获取前置规则解析字段 - */ - private String getPreRuleFields(List preRuleConfigList, Map fixDataMap, Map fixFieldMap) { - Map ruleFieldMap= new HashMap<>(); - preRuleConfigList.stream() - .forEach( - preRuleConfig -> { - String fieldName = fixFieldMap.get(Long.valueOf(preRuleConfig.getRuleFieldId())); - if (fixDataMap.containsKey(fieldName)) { - ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); - } - } - ); - return JSONObject.toJSONString(ruleFieldMap); - } - - private Map getAllFieldMap(String protocolId) { - List fieldList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Map fixFieldMap = fieldList.stream().collect( - Collectors.toMap(FieldConfig::getId, FieldConfig::getFieldName) - ); - return fixFieldMap; - } - - private String getRuleFields(String[] preRuleConfigList, Map fixDataMap, Map fixFieldMap) { - Map ruleFieldMap= new HashMap<>(); - for (String preRuleConfigId : preRuleConfigList) { - String fieldName = fixFieldMap.get(preRuleConfigId); - if (fixDataMap.containsKey(fieldName)) { - ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); - } - } - return JSONObject.toJSONString(ruleFieldMap); - } - - //弃置 - private String ListToString(List ruleFieldList) { - String ruleFields = ""; - for (String ruleField : ruleFieldList) { - ruleFields += ruleField + ","; - } - ruleFields = StringUtils.isEmpty(ruleFields) ? ruleFields : ruleFields.substring(0, ruleFields.length() - 1); - return ruleFields; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java index 6177e10..bfa87a5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java @@ -2,7 +2,7 @@ public interface SafeStrategy { - String decryption(byte[] bytes); + String decryption(String cipher); String encryption(String lightText); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java index 618716c..6236302 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java @@ -9,9 +9,9 @@ //十六进制的字符串转换成字节数组 byte[] bytes = hexStrToBinaryStr(msg); //计算CRC8 - byte crc8 = CRC8(bytes, 0, bytes.length); - String crc8ToStr = "" + Integer.toHexString(0xff & crc8); - return crc8ToStr; +// String crc8ToStr = "" + Integer.toHexString(0xff & crc8); +// return crc8ToStr; + return null; } /** @@ -33,50 +33,5 @@ return bytes; } - /** - * CRC8 校验 多项式 x8+x2+x+1 - * - * @param b - * @param off - * @param len - * @return - */ - public static byte CRC8(final byte[] b, final int off, final int len) { - byte result = 0x00; - for (int i = 0; i < len; i++) { - result = CHECKSUM_TABLE[(result ^ (b[i + off] & 0xFF)) & 0xFF]; - } - return (byte) (result & 0xFFL); - } - - private final static byte[] CHECKSUM_TABLE = {(byte) 0x00, (byte) 0x07, (byte) 0x0e, (byte) 0x09, (byte) 0x1c, (byte) 0x1b, - (byte) 0x12, (byte) 0x15, (byte) 0x38, (byte) 0x3f, (byte) 0x36, (byte) 0x31, (byte) 0x24, (byte) 0x23, (byte) 0x2a, - (byte) 0x2d, (byte) 0x70, (byte) 0x77, (byte) 0x7e, (byte) 0x79, (byte) 0x6c, (byte) 0x6b, (byte) 0x62, (byte) 0x65, - (byte) 0x48, (byte) 0x4f, (byte) 0x46, (byte) 0x41, (byte) 0x54, (byte) 0x53, (byte) 0x5a, (byte) 0x5d, (byte) 0xe0, - (byte) 0xe7, (byte) 0xee, (byte) 0xe9, (byte) 0xfc, (byte) 0xfb, (byte) 0xf2, (byte) 0xf5, (byte) 0xd8, (byte) 0xdf, - (byte) 0xd6, (byte) 0xd1, (byte) 0xc4, (byte) 0xc3, (byte) 0xca, (byte) 0xcd, (byte) 0x90, (byte) 0x97, (byte) 0x9e, - (byte) 0x99, (byte) 0x8c, (byte) 0x8b, (byte) 0x82, (byte) 0x85, (byte) 0xa8, (byte) 0xaf, (byte) 0xa6, (byte) 0xa1, - (byte) 0xb4, (byte) 0xb3, (byte) 0xba, (byte) 0xbd, (byte) 0xc7, (byte) 0xc0, (byte) 0xc9, (byte) 0xce, (byte) 0xdb, - (byte) 0xdc, (byte) 0xd5, (byte) 0xd2, (byte) 0xff, (byte) 0xf8, (byte) 0xf1, (byte) 0xf6, (byte) 0xe3, (byte) 0xe4, - (byte) 0xed, (byte) 0xea, (byte) 0xb7, (byte) 0xb0, (byte) 0xb9, (byte) 0xbe, (byte) 0xab, (byte) 0xac, (byte) 0xa5, - (byte) 0xa2, (byte) 0x8f, (byte) 0x88, (byte) 0x81, (byte) 0x86, (byte) 0x93, (byte) 0x94, (byte) 0x9d, (byte) 0x9a, - (byte) 0x27, (byte) 0x20, (byte) 0x29, (byte) 0x2e, (byte) 0x3b, (byte) 0x3c, (byte) 0x35, (byte) 0x32, (byte) 0x1f, - (byte) 0x18, (byte) 0x11, (byte) 0x16, (byte) 0x03, (byte) 0x04, (byte) 0x0d, (byte) 0x0a, (byte) 0x57, (byte) 0x50, - (byte) 0x59, (byte) 0x5e, (byte) 0x4b, (byte) 0x4c, (byte) 0x45, (byte) 0x42, (byte) 0x6f, (byte) 0x68, (byte) 0x61, - (byte) 0x66, (byte) 0x73, (byte) 0x74, (byte) 0x7d, (byte) 0x7a, (byte) 0x89, (byte) 0x8e, (byte) 0x87, (byte) 0x80, - (byte) 0x95, (byte) 0x92, (byte) 0x9b, (byte) 0x9c, (byte) 0xb1, (byte) 0xb6, (byte) 0xbf, (byte) 0xb8, (byte) 0xad, - (byte) 0xaa, (byte) 0xa3, (byte) 0xa4, (byte) 0xf9, (byte) 0xfe, (byte) 0xf7, (byte) 0xf0, (byte) 0xe5, (byte) 0xe2, - (byte) 0xeb, (byte) 0xec, (byte) 0xc1, (byte) 0xc6, (byte) 0xcf, (byte) 0xc8, (byte) 0xdd, (byte) 0xda, (byte) 0xd3, - (byte) 0xd4, (byte) 0x69, (byte) 0x6e, (byte) 0x67, (byte) 0x60, (byte) 0x75, (byte) 0x72, (byte) 0x7b, (byte) 0x7c, - (byte) 0x51, (byte) 0x56, (byte) 0x5f, (byte) 0x58, (byte) 0x4d, (byte) 0x4a, (byte) 0x43, (byte) 0x44, (byte) 0x19, - (byte) 0x1e, (byte) 0x17, (byte) 0x10, (byte) 0x05, (byte) 0x02, (byte) 0x0b, (byte) 0x0c, (byte) 0x21, (byte) 0x26, - (byte) 0x2f, (byte) 0x28, (byte) 0x3d, (byte) 0x3a, (byte) 0x33, (byte) 0x34, (byte) 0x4e, (byte) 0x49, (byte) 0x40, - (byte) 0x47, (byte) 0x52, (byte) 0x55, (byte) 0x5c, (byte) 0x5b, (byte) 0x76, (byte) 0x71, (byte) 0x78, (byte) 0x7f, - (byte) 0x6a, (byte) 0x6d, (byte) 0x64, (byte) 0x63, (byte) 0x3e, (byte) 0x39, (byte) 0x30, (byte) 0x37, (byte) 0x22, - (byte) 0x25, (byte) 0x2c, (byte) 0x2b, (byte) 0x06, (byte) 0x01, (byte) 0x08, (byte) 0x0f, (byte) 0x1a, (byte) 0x1d, - (byte) 0x14, (byte) 0x13, (byte) 0xae, (byte) 0xa9, (byte) 0xa0, (byte) 0xa7, (byte) 0xb2, (byte) 0xb5, (byte) 0xbc, - (byte) 0xbb, (byte) 0x96, (byte) 0x91, (byte) 0x98, (byte) 0x9f, (byte) 0x8a, (byte) 0x8d, (byte) 0x84, (byte) 0x83, - (byte) 0xde, (byte) 0xd9, (byte) 0xd0, (byte) 0xd7, (byte) 0xc2, (byte) 0xc5, (byte) 0xcc, (byte) 0xcb, (byte) 0xe6, - (byte) 0xe1, (byte) 0xe8, (byte) 0xef, (byte) 0xfa, (byte) 0xfd, (byte) 0xf4, (byte) 0xf3}; } \ No newline at end of file diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java index 27c2838..6e078a3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java @@ -1,9 +1,6 @@ package com.casic.missiles.parser.safe.impl; -import cn.hutool.core.util.CharsetUtil; -import cn.hutool.crypto.symmetric.SM4; -import cn.hutool.crypto.symmetric.SymmetricCrypto; - +import com.casic.missiles.parser.safe.SafeStrategy; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; @@ -11,19 +8,44 @@ import org.bouncycastle.crypto.engines.SM4Engine; import org.bouncycastle.crypto.params.KeyParameter; import org.bouncycastle.util.encoders.Hex; - -import static cn.hutool.crypto.Mode.ECB; -import static cn.hutool.crypto.Padding.NoPadding; +import org.springframework.stereotype.Component; /** * SM4算法工具类 */ @Slf4j -public class Sm4 { +@Component("sm4") +public class Sm4 implements SafeStrategy { //加解密的字节快大小 public static final int BlockSize = 16; + @Override + public String decryption(String cipher) { + byte[] keyByte = { + 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 + }; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(keyByte); + byte[] in = Hex.decode(cipher); + byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); + String plain = EcbDecrypt(in, keyBytes); + return plain; + } + + @Override + public String encryption(String cipher) { + byte[] keyByte = { + 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 + }; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(keyByte); + byte[] in = Hex.decode(cipher); + byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); + String plain = EcbDecrypt(in, keyBytes); + return plain; + } + /** * SM4ECB加密算法,对内 * @@ -32,8 +54,6 @@ * @return */ private static byte[] ecb_encrypt(byte[] in, byte[] keyBytes) { - - SM4Engine sm4Engine = new SM4Engine(); sm4Engine.init(true, new KeyParameter(keyBytes)); byte[] out = new byte[in.length]; @@ -58,27 +78,6 @@ return cipher; } - - /** - * hutool 解密SM4 - * - * @param encodeContent - * @return - */ - public static String decode(String encodeContent) { - String key = "24ad182507479a5da3ad94d9d78ea203"; - try { - SymmetricCrypto sm4 = new SM4(ECB, NoPadding, key.getBytes()); - String decryptStr = sm4.decryptStr(encodeContent, CharsetUtil.CHARSET_UTF_8); - return decryptStr; - } catch (Exception e) { - e.printStackTrace(); - log.error("SM4解密失败"); - } - return null; - } - - /** * SM4的ECB加密算法 * @@ -129,20 +128,6 @@ return plain; } - /** - * SM4的ECB解密算法 - * - * @param cipher 输入的密文字符串 - * @param key 密钥 - * @return - */ - public static String EcbDecrypt(String cipher, String key) { - byte[] in = Hex.decode(cipher); - byte[] keyBytes = Hex.decode(key); - - String plain = EcbDecrypt(in, keyBytes); - return plain; - } /** * 主函数 @@ -151,28 +136,24 @@ */ public static void main(String[] args) { byte[] ciphertext = { + 0x4B, (byte) 0x8C, (byte) 0x9D, 0x08, (byte) 0xE4, (byte) 0xD3, 0x64, 0x42, (byte) 0xB9, (byte) 0xA5, (byte) 0xFE, (byte) 0xCD, (byte) 0x91, 0x1B, 0x38, (byte) 0xAC, (byte) 0xE9, 0x1C, (byte) 0xCD, 0x53, 0x02, (byte) 0xD7, 0x0C, (byte) 0x9B, (byte) 0x96, 0x30, 0x62, (byte) 0xE8, (byte) 0xFB, (byte) 0xEF, (byte) 0xB9, (byte) 0xFF, (byte) 0xDE, 0x19, (byte) 0x80, 0x35, 0x3E, (byte) 0x90, 0x4F, 0x2F, 0x12, 0x2B, 0x19, (byte) 0x8B, 0x6C, 0x7A, (byte) 0x85, (byte) 0xA1, (byte) 0xB1, (byte) 0x86, (byte) 0xA3, 0x7A, 0x46, 0x0C, 0x2F, (byte) 0x94, 0x4F, 0x7F, 0x2C, 0x56, 0x14, (byte) 0xF3, (byte) 0x89, (byte) 0xC3, - 0x3F, 0x20, (byte) 0xF9, (byte) 0x87, (byte) 0xA1, 0x60, (byte) 0xD9, (byte) 0xA8, (byte) 0xFD, (byte) 0xD7, (byte) 0x9B, 0x4B, 0x26, 0x06, 0x30, 0x44}; + 0x3F, 0x20, (byte) 0xF9, (byte) 0x87, (byte) 0xA1, 0x60, (byte) 0xD9, (byte) 0xA8, (byte) 0xFD, (byte) 0xD7, (byte) 0x9B, 0x4B, 0x26, 0x06, 0x30, 0x44 + }; ByteBuf in = ByteBufAllocator.DEFAULT.heapBuffer(); in.writeBytes(ciphertext); - byte[] keyByte = { 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 }; ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); - key.writeBytes(ciphertext); - String resCipherData = decode(ByteBufUtil.hexDump(in)); - ByteBuf out = ByteBufAllocator.DEFAULT.heapBuffer(); -// out.writeBytes(resCipherData); -// System.out.println(hexBytes); - System.out.println(resCipherData.toString()); -// String resPlainData = EcbDecrypt(resCipherData, key); -// System.out.println("原始明文:" + data); -// System.out.println("解密后明文:" + resPlainData); + key.writeBytes(keyByte); +// String resCipherData = EcbDecrypt(ByteBufUtil.hexDump(in), ByteBufUtil.hexDump(key)); +// System.out.println(resCipherData); } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java index 1395a51..ac5f957 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java @@ -1,7 +1,7 @@ package com.casic.missiles.parser.safe.impl; import io.netty.buffer.ByteBufUtil; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** *

@@ -14,9 +14,8 @@ * @author hyl * @version v1.0: Tea.java, v 0.1 2021/3/12 13:48 $ */ -@Service("tea") -///tea算法类 - +//tea算法类 +@Component("tea") public class Tea { public static byte[] MyTea_Encrypt(byte[] MyTeaContent, int ByteLen, byte[] MyTeakey) { @@ -99,7 +98,6 @@ // for(int i32Index = 0; i32Index < 8; i32Index++) { // System.out.print("0x" + Integer.toHexString(MyContent[i32Index]) + " "); // } - // System.out.println("密钥为:"); // for(int i32Index = 0; i32Index < 16; i32Index++) { // System.out.print("0x" + Integer.toHexString(MyKeys[i32Index]) + " "); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java index bdd0721..bd1516a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java @@ -3,7 +3,7 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.parser.sender.DataSubscribeProvider; import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponents; import org.springframework.web.util.UriComponentsBuilder; @@ -12,7 +12,7 @@ import java.util.Collections; import java.util.Map; -@Service("functionCallback") +@Component("functionCallback") public class FunctionCallback implements DataSubscribeProvider { @Resource diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java index 0b44fb9..7526de2 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.Map; -@Service("middleware") +@Component("middleware") public class MiddlewareSubscribe implements DataSubscribeProvider { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java index 5dcee3f..e2f1192 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.Map; -@Service("nosql") +@Component("nosql") public class NoSqlSubscribe implements DataSubscribeProvider { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java b/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java new file mode 100644 index 0000000..81a5324 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java @@ -0,0 +1,86 @@ +package com.casic.missiles.pojo; + +import lombok.Data; + +/** + * 协议 + */ +@Data +public class Msg { + + /** + * 前导码 + */ + private String preamble; + + /** + * 版本号 + */ + private String version; + + /** + * 内容长度 + */ + private int leng; + + /** + * 设备ID + */ + private String deviceId; + + /** + * 通讯方式 + */ + private Integer connType; + + /** + * 加密方式 + */ + private Integer encryType; + + /** + * 目标地址 + */ + private String destAddr; + + /** + * PDUType + */ + private String PDUType; + + /** + * 操作类型 + */ + private Integer operateType; + + /** + * 传输控制位 PDUType.bit7=0时,表示存在后续的访问;当PDUType.bit7=1时,表示无后续的访问。 + */ + private Integer transControlFlag; + + /** + * 设备类型 + */ + private Integer deviceType; + + /** + * 序号 + */ + private Integer seq; + + /** + * tagList + */ + private String tagList; + + /** + * OidList + */ + private String OidList; + + /** + * CRC + */ + private String CRC; + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java index 40a5265..97cc984 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java @@ -40,7 +40,7 @@ String httpContent = msg.toString(Charset.defaultCharset()); log.info(" String : " + msg.toString(Charset.defaultCharset())); String majorContent = httpContent.substring(httpContent.indexOf("{"), httpContent.lastIndexOf("}") + 1); - String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("serviceData")).get("Value")); + String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("RegistryData")).get("Value")); log.info("----------------------------------" + values); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); bufferContent.writeBytes(values.getBytes(Charset.forName("ISO-8859-1"))); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java index 1b132a7..e3ced4b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java @@ -35,7 +35,7 @@ String httpContent = msg.toString(Charset.defaultCharset()); log.info(" String : " + msg.toString(Charset.defaultCharset())); String majorContent = httpContent.substring(httpContent.indexOf("{"), httpContent.lastIndexOf("}") + 1); - String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("serviceData")).get("Value")); + String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("RegistryData")).get("Value")); log.info("----------------------------------" + values); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); bufferContent.writeBytes(values.getBytes(Charset.forName("ISO-8859-1"))); diff --git a/sensorhub-core/src/main/resources/application.properties b/sensorhub-core/src/main/resources/application.properties deleted file mode 100644 index 8b13789..0000000 --- a/sensorhub-core/src/main/resources/application.properties +++ /dev/null @@ -1 +0,0 @@ - diff --git a/sensorhub-core/src/main/resources/config/application-dev.yml b/sensorhub-core/src/main/resources/config/application-dev.yml index 4f897a8..dcc4c2d 100644 --- a/sensorhub-core/src/main/resources/config/application-dev.yml +++ b/sensorhub-core/src/main/resources/config/application-dev.yml @@ -4,9 +4,9 @@ spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true + url: jdbc:mysql://127.0.0.1:3306/sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true username: root - password: Casic203 + password: root session: store-type: redis redis: diff --git a/sensorhub-core/src/main/resources/config/application.yml b/sensorhub-core/src/main/resources/config/application.yml index ae89f9d..7965da1 100644 --- a/sensorhub-core/src/main/resources/config/application.yml +++ b/sensorhub-core/src/main/resources/config/application.yml @@ -30,6 +30,13 @@ port: 6379 password: ew5T4K3#203lwh config-prefix: 'Casic:' +#代码生成器配置 +code: + generate: + #作者 + author: cz + #待生成对象表名 + table-name: bussiness_field_config,combined_field_config sensorhub: config: port: 7091 diff --git a/sensorhub-support/pom.xml b/sensorhub-support/pom.xml index 9a71296..761601c 100644 --- a/sensorhub-support/pom.xml +++ b/sensorhub-support/pom.xml @@ -42,6 +42,12 @@ ${redis.version} + + com.baomidou + mybatis-plus-generator + ${mybatis-plus-generator.version} + + org.reflections diff --git a/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java b/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java new file mode 100644 index 0000000..515ca53 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java @@ -0,0 +1,14 @@ +package com.casic.missiles.enums; + +/** + * @author + * @date + */ +public interface FixedPropertyEnum { + + String FIXED_POSITION = "fixedPosition"; + + String TOTAL_LENGTH = "totalLength"; + + String TAIL_POSITION = "tailPosition"; +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/CombinedFieldMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CombinedFieldMapper.java new file mode 100644 index 0000000..38e8f42 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CombinedFieldMapper.java @@ -0,0 +1,15 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.CombinedFieldConfig; +import org.apache.ibatis.annotations.Mapper; + +/** + * @author cz + * + */ +@Mapper +public interface CombinedFieldMapper extends BaseMapper { + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java new file mode 100644 index 0000000..128b09d --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java @@ -0,0 +1,10 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.CommandEventConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface CommandEventMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java new file mode 100644 index 0000000..042eb3c --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.DatagramEventConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface DatagramEventConfigMapper extends BaseMapper { +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java new file mode 100644 index 0000000..fc95cf4 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java @@ -0,0 +1,8 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.FieldConfig; + +public interface FieldConfigMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldRuleConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldRuleConfigMapper.java new file mode 100644 index 0000000..b310a08 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldRuleConfigMapper.java @@ -0,0 +1,10 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.FieldRuleConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface FieldRuleConfigMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java new file mode 100644 index 0000000..9060a69 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.ProtocolConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface ProtocolConfigMapper extends BaseMapper { +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolFieldConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolFieldConfigMapper.java new file mode 100644 index 0000000..1b47180 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolFieldConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +public interface ProtocolFieldConfigMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java new file mode 100644 index 0000000..6fa6936 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.RuleConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface RuleConfigMapper extends BaseMapper { +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/AbstractFieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/AbstractFieldConfig.java new file mode 100644 index 0000000..ba9aea2 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/AbstractFieldConfig.java @@ -0,0 +1,38 @@ +package com.casic.missiles.pojo; + +import lombok.Data; + +@Data +public class AbstractFieldConfig { + /** + * 字段名称 + */ + private String fieldName; + /** + * 按照字段评估进行字段解析 + */ + private String ruleJson; + /** + * 起始位置(单位byte) + */ + private Integer OriginPositionByte; + /** + * 起始位置,是否需要bit位置(单位bit)小于8, 没有不需要填写 + */ + private String OriginPositionBit; + /** + * 偏移长度 + */ + private Integer offsetLength; + /** + * 偏移单位(bit/byte) + */ + private String offsetUnit; + /** + * 是否需要转存 + */ + private Integer isStorage; + + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/CombinedFieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/CombinedFieldConfig.java new file mode 100644 index 0000000..4f4de6a --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/CombinedFieldConfig.java @@ -0,0 +1,41 @@ +package com.casic.missiles.pojo; + +import lombok.Data; + +import java.util.Date; + +/** + * 组合配置 + * + * @author cz + * @date 20 + */ +@Data +public class CombinedFieldConfig { + + private Long id; + private Long ruleId; + /** + * 前缀编码 + */ + private String prefixCode; + + /** + * 字段动态的id + */ + private Long dynamicLengthId; + /** + * 对应的要解析字段的ids + */ + private String dataFieldIds; + + /** + * 字段动态的id + */ + private String combinedFieldIds; + + private Date lastTime; + + private Date createTime; + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldConfig.java index a07d20d..8304dc6 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldConfig.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldConfig.java @@ -5,31 +5,28 @@ import java.util.Date; +/** + * @author cz + * 1、该表与实际解析的内容实例解析有关 + * 2、该表字段是随机出现的,和帧结构无关,无法预料的 + * 3、该表字段解析根据FieldEvaluatorConfig进行字段解析 + */ @Data -@TableName("field_config") -public class FieldConfig { +@TableName("business_field_config") +public class FieldConfig extends AbstractFieldConfig { private Long id; -// private String preFieldConfig; - private Long protocolId; - - private String isFixed; - private String uploadDeliveryChange; - - private String replyRule; - private String ruleJson; - + /** + * 协议配置id + */ + private Long ruleId; + /** + * 字段名称 + */ private String fieldName; - private String isStorage; - private Integer orignPosition; - private String exactOrignPosition; - - private Integer offsetLength; - private String offsetUnit; private String ownerId; private Date createTime; private Date lastTime; - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java index 608af3a..32cc8a4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java @@ -2,48 +2,47 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.delivery.decorator.ByteDecorator; +import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @AllArgsConstructor public class FieldDecoratorManger { - private final RuleDictDao ruleDictDao; + private final RuleConfigRegistry ruleDictDao; // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 // (1)静态的业务字段是字典里面可以配置的 // (2)动态的业务字段是通过规则生成的 public String contentMerge(String ruleJson, String sceneConent, String dynamicContent) { - List ruleDictList = ruleDictDao.getRuleDictConfig(); - Map ruleDictMap = ruleDictList.stream().collect( - Collectors.toMap(RuleDict::getId, e -> e)); - List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); - for (Map ruleMap : ruleMapList) { - String ruleType = String.valueOf(ruleMap.get("ruleType")); - ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); - NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); - byteDecorator.nodeDecoratorRule(nodeDecoratorParm); - } +// List ruleDictList = ruleDictDao.getRuleDictConfig(); +// Map ruleDictMap = ruleDictList.stream().collect( +// Collectors.toMap(RuleDict::getId, e -> e)); +// List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); +// for (Map ruleMap : ruleMapList) { +// String ruleType = String.valueOf(ruleMap.get("ruleType")); +// ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); +// NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); +// byteDecorator.nodeDecoratorRule(nodeDecoratorParm); +// } return null; } - - private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { - NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() - .contents(sceneConent) - .dynamicContent(dynamicContent) - .ruletypeId(ruletypeId) - .ruleDictMap(ruleDictMap) - .build(); - return nodeDecoratorParm; - } +// +// private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { +// NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() +// .contents(sceneConent) +// .dynamicContent(dynamicContent) +// .ruletypeId(ruletypeId) +// .ruleDictMap(ruleDictMap) +// .build(); +// return nodeDecoratorParm; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java index 652970c..b204ac3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java @@ -1,56 +1,56 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@AllArgsConstructor -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", - JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Component; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Component("logicalDecorator") +//@AllArgsConstructor +//@Slf4j +//public class LogicalShiftDecorator implements ByteDecorator { +// +//// private final FieldRuleEngineMapper fieldRuleEngineMapper; +//// +//// //字节位移 +//// @Override +//// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +//// String logicalValue = ""; +//// RuleEvaluator fieldRuleEngine = new RuleEvaluator(); +//// try { +//// Map env2 = new HashMap(); +//// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +//// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +//// for (String contentId : contentIdList) { +//// RuleDict ruleDict = ruleDictMap.get(contentId); +//// if (ruleDict.getCode().contains("#")) { +//// //使用动态的值 +//// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +//// } +//// env2.put(ruleDict.getName(), ruleDict.getCode()); +//// } +//// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +//// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +//// return null; +//// } +//// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +//// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +//// return values; +//// } catch (Exception ex) { +//// log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", +//// JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +//// return null; +//// } +//// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java index 346468f..822fead 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@AllArgsConstructor -@Slf4j -public class OperationDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("optionDecorator") +//@AllArgsConstructor +//@Slf4j +//public class OperationDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //混合运算,有常量或者乘除的缩放 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java index 50fb0a7..7a8bccb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@AllArgsConstructor -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +////精度计算 +//@AllArgsConstructor +//@Registry("precisionDecorator") +//@Slf4j +//public class PrecisionDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java index da39235..27f9cc7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java @@ -1,54 +1,53 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@AllArgsConstructor -@Slf4j -public class RuleDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("ruleDecorator") +//@AllArgsConstructor +//@Slf4j +//public class RuleDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //吃我一套正则表达式 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (Exception ex) { +// log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java index 7f5cbf3..c043f97 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java @@ -2,6 +2,6 @@ import java.util.Map; -public interface ComandeEventService { +public interface ComandeEventService{ Map loadComandeEventConfig(String protocolId,String scene); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java index 476ad84..aaf1837 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java @@ -2,46 +2,46 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.dao.CommandEventDao; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @Slf4j @AllArgsConstructor -public class ComandeEventServiceImpl implements ComandeEventService { +public class ComandeEventServiceImpl implements ComandeEventRegistry { - private final CommandEventDao commandEventDao; + // private final CommandEventDao commandEventDao; // 加密bean 固定字段出现变化的字段解析,业务字段的有序内容 @Override - public Map loadComandeEventConfig(String protocolId,String sceneName) { - CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); - if (ObjectUtil.isEmpty(commandEventConfig)) { - log.error("协议{},没有配置成功接收回复配置,清排查原因"); - return null; - } - String replyJson = commandEventConfig.getReplyContentJson(); - List> replyMapList = JSONArray.parseObject(replyJson, List.class); - List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); - Map fixMap = fixList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); - List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) - .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) - .collect(Collectors.toList()); - Map commandConfigMap = new HashMap<>(); - commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); - commandConfigMap.put("fixContent", fixMap); - commandConfigMap.put("bizContent", contentList); - return commandConfigMap; + public Map loadComandeEventConfig(String protocolId, String sceneName) { +// CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); +// if (ObjectUtil.isEmpty(commandEventConfig)) { +// log.error("协议{},没有配置成功接收回复配置,清排查原因"); +// return null; +// } +// String replyJson = commandEventConfig.getReplyContentJson(); +// List> replyMapList = JSONArray.parseObject(replyJson, List.class); +// List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); +// Map fixMap = fixList.stream() +// .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); +// List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) +// .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) +// .collect(Collectors.toList()); +// Map commandConfigMap = new HashMap<>(); +// commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); +// commandConfigMap.put("fixContent", fixMap); +// commandConfigMap.put("bizContent", contentList); +// return commandConfigMap; + return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 128b09d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java deleted file mode 100644 index 4016b0b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface DatagramEventMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java deleted file mode 100644 index 597c306..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.apache.ibatis.annotations.Mapper; - -public interface FieldConfigMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java deleted file mode 100644 index a31680a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.PreRuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface PreRuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java deleted file mode 100644 index 9060a69..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface ProtocolConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java deleted file mode 100644 index 6fa6936..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java deleted file mode 100644 index 582a705..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleDict; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleDictMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java deleted file mode 100644 index 6e302c8..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.CommandEventMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Optional; - -@Component -public class CommandEventDao { - - @Resource - private CommandEventMapper commandEventMapper; - - public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId) - .eq("scene", sceneName) - .eq("enabled", 1); - List commandEventConfig = commandEventMapper.selectList(queryWrapper); - Optional optionalEventConfig = commandEventConfig.stream().findFirst(); - return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java deleted file mode 100644 index 9137e4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.FieldConfigMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class FieldConfigDao { - - @Resource - private FieldConfigMapper fieldConfigMapper; - - public FieldConfig getFieldConfigById(String fieldId) { - FieldConfig fieldConfig = fieldConfigMapper.selectById(fieldId); - return fieldConfig; - } - - public List getFieldConfigs(String protocolId,Integer isFixed) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",isFixed); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - - public List getStorageFieldConfig(String protocolId) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",1) - .eq("is_storage",1); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java deleted file mode 100644 index 67bff6b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.mapper.PreRuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class PreRuleConfigDao { - - @Resource - private PreRuleConfigMapper preRuleConfigMapper; - - public List getPreRuleList(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return preRuleConfigMapper.selectList(queryWrapper); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java deleted file mode 100644 index d69ea85..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.RuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleConfigDao { - - @Resource - private RuleConfigMapper ruleConfigMapper; - - public RuleConfig getNextRuleConfig(String ruleFields) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("parse_rule_json", ruleFields); - return ruleConfigMapper.selectOne(queryWrapper); - } - - - public List getRuleConfigById(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return ruleConfigMapper.selectList(queryWrapper); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java deleted file mode 100644 index 932c185..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.RuleDictMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleDictDao { - - @Resource - private RuleDictMapper ruleDictMapper; - - public List getRuleDictConfig() { - List ruleDictList = ruleDictMapper.selectList(null); - return ruleDictList; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java index 9f9e279..43bc4d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java @@ -10,20 +10,15 @@ import io.netty.channel.socket.nio.NioServerSocketChannel; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import javax.annotation.PreDestroy; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static cn.hutool.core.util.ClassUtil.getClasses; /** * SensorhubServer netty服务端 */ @Slf4j -@Service +@Component public class SensorhubServer { /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java index 2c79ff5..9a28c36 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java @@ -11,13 +11,13 @@ import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioSocketChannel; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClient 客户端 */ @Slf4j -@Service +@Registry public final class SensorhubClient { public static void main(String[] args) throws Exception { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java index 9774be0..477c3f7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java @@ -6,12 +6,12 @@ import io.netty.channel.socket.SocketChannel; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientChannelInitialHandler */ -@Service +@Registry public class SensorhubClientChannelInitialHandler extends ChannelInitializer { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java index 346f4b3..73560e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java @@ -5,13 +5,13 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientHandler */ @Slf4j -@Service +@Registry public class SensorhubClientHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java index 5c1c6f2..d990af5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java @@ -4,12 +4,12 @@ import com.casic.missiles.pojo.Msg; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** * SensorhubServerHandler */ -@Service +@Component public class SensorhubServerHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 67283ae..af3172c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,41 +1,37 @@ package com.casic.missiles.parser; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultProtocolConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.*; +import com.casic.missiles.registry.FieldConfigRegistry; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; -import java.nio.charset.Charset; import java.util.HashMap; import java.util.List; import java.util.Map; -@Service("genericProtocolParser") +/** + * @author + */ +@Component("genericProtocolParser") @Slf4j -@AllArgsConstructor +@RequiredArgsConstructor public class GenericProtocolParser implements ProtocolParser { - private final LeadingCodeMatcher leadingCodeMatcher; private final List frameStructDispenserList; - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorInstanceSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; // 匹配首字母前导码=> 帧结构匹配前导码=> // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 @@ -44,18 +40,19 @@ public Boolean doParseProtocol(ByteBuf byteBuf) { String protocolContent = ByteBufUtil.hexDump(byteBuf); //匹配前导码 - List preCodeConfigs = leadingCodeMatcher.matchLeadingCode(protocolContent); + List preCodeConfigs = LeadingCodeMatcher.matchFrameLeadingCode(protocolContent); //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 if (preCodeConfigs.size() == 0) { - return rematch(byteBuf,protocolContent); + return rematch(byteBuf, protocolContent); } - //暂时先取第一个 + //暂时先取第一个,提升速度,使用享元模式, 减少类的创建销毁与构建 ProtocolConfig protocolConfig = preCodeConfigs.get(0); + AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); ByteBuf wholeDatagramByte = null; //通过匹配帧结构获取完整的数据包 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, preCodeConfigs.get(0))) != null) { + if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, protocolFactory)) != null) { break; } } @@ -68,76 +65,78 @@ * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 */ - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId, wholeDatagramByte); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap, protocolId); - //选取规则对应的流程实例 - DatagramEventConfig datagramEventConfig = processorInstanceSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); + //进行规则字段解析,进行匹配规则 + RuleConfig ruleConfig = getRuleConfig(protocolFactory, wholeDatagramByte); + if (ruleConfig == null) { + return false; + } //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, wholeDatagramByte); + ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte); + //以下进行业务的规则解析,同时选定流程实例 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); + DatagramEventProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain, + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText, protocolId); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain); //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); + datagramEventProvider.storeData(bizDataMap); return true; } - private Boolean rematch(ByteBuf byteBuf,String protocolContent) { + /** + * 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 + */ + private Boolean rematch(ByteBuf byteBuf, String protocolContent) { //重置位判断 byteBuf.resetReaderIndex(); //判断重置是否前移,如果没有前移,则直接判为匹配失败 if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { return false; } else { + //递归执行 return doParseProtocol(byteBuf); } } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; + //获取匹配规则->匹配规则 + private RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + //取出其中参与逻辑provider并判空 + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); + String rulePrepareFields = protocolConfig.getRulePrepareFields(); + //固定字段 + if (StringUtils.isNotEmpty(rulePrepareFields)) { + //获取统一固定字段解析 + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + //获取该协议的字段配置,用于协议规则匹配 + List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); + //获取规则 + RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, + rulePrepareFields, protocolFieldConfigs); + return ruleConfig; + } + return null; } - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + //数据构建,获取固定字段的store和业务字段store + private Map buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + Map bizDataMap = new HashMap<>(); + Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); + Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); + bizDataMap.putAll(ruleStoreObjectMap); + bizDataMap.putAll(protocolStoreObjectMap); return bizDataMap; } - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java index 8a46e32..16ce2e5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java @@ -3,6 +3,7 @@ import io.netty.buffer.ByteBuf; public interface ProtocolParser { + Boolean doParseProtocol(ByteBuf byteBuf); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java new file mode 100644 index 0000000..f7814af --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java @@ -0,0 +1,35 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.ProtocolConfigProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.ProtocolConfig; + +/** + * 存放基本协议的的加载信息 + */ +public class AbstractProtocolConfigFactory { + private final ProtocolConfigProvider protocolConfigProvider; + private final ProtocolFieldConfigProvider protocolFieldConfigProvider; + private final RuleConfigProvider ruleConfigProvider; + + public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { + this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); + this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); + this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); + } + + public ProtocolConfigProvider getProtocolConfigProvider() { + return protocolConfigProvider; + } + + public ProtocolFieldConfigProvider getProtocolFieldConfigProvider() { + return protocolFieldConfigProvider; + } + + public RuleConfigProvider getRuleConfigProvider() { + return ruleConfigProvider; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java new file mode 100644 index 0000000..6e36147 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java @@ -0,0 +1,57 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.CombinedFieldConfigProvider; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.FieldConfigProvider; +import com.casic.missiles.parser.provider.FieldRuleConfigProvider; + +/** + * 存放规则相关的的的加载信息 + */ +public class AbstractRuleConfigFactory { + + /** + * 处理字节 + */ + private final FieldConfigProvider fieldConfigProvider; + /** + * 处理组合字节解析的解码器 + */ + private final CombinedFieldConfigProvider combinedFieldConfigProvider; + /** + * 处理负责字节解析的规则配置 + */ + private final FieldRuleConfigProvider fieldRuleConfigProvider; + /** + * 处理实例流程 + */ + private final DatagramEventProvider datagramEventProvider; + + + public AbstractRuleConfigFactory(Long ruleId) { + this.fieldConfigProvider = new FieldConfigProvider(ruleId); + this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); + this.fieldRuleConfigProvider = new FieldRuleConfigProvider(ruleId); + this.datagramEventProvider = new DatagramEventProvider(ruleId); + } + + public FieldConfigProvider getFieldConfigProvider() { + return fieldConfigProvider; + } + + public CombinedFieldConfigProvider getCombinedFieldConfigProvider() { + return combinedFieldConfigProvider; + } + + public FieldRuleConfigProvider getFieldRuleConfigProvider() { + return fieldRuleConfigProvider; + } + + public DatagramEventProvider getDatagramEventProvider() { + return datagramEventProvider; + } + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java deleted file mode 100644 index 6e1719a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.factory; - - -import com.casic.missiles.pojo.ProtocolConfig; - -import java.util.List; - -/** - * 数据库访问优化(暂时未做) - *

- * 1、初始化协议解析配置,并存放到处存放缓存,对协议基本配置进行管理 - * 2、其中流程中所有的配置都经过此类进行管理,进行调用获取,增强解析速度 - */ -public interface DatagramFactory { - - /** - * 初始化 - */ - List datagramInit(); - - /** - * 根据前导码配置匹配,模糊匹配获取所有的报文项 - */ - List match(); - - /** - * 根据前导码匹配,返回报文项 - */ - List filer(); - - /** - * 保证数据的唯一性选择器 - */ - List selectOne(); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java new file mode 100644 index 0000000..87444a0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java @@ -0,0 +1,18 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +import java.util.List; + +/** + * 直接用,还是边用边创建 + */ +public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { + + + public DefaultProtocolConfigFactory(ProtocolConfig protocolConfig) { + super(protocolConfig); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java new file mode 100644 index 0000000..cce0c7c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java @@ -0,0 +1,12 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; + +public class DefaultRuleFactory extends AbstractRuleConfigFactory { + + public DefaultRuleFactory(Long ruleId) { + super(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java deleted file mode 100644 index 9ee97e0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.casic.missiles.parser.instance; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service -@Slf4j -@AllArgsConstructor -public class GeneralProcessor { - - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; - - /** - * 统一固定字段解析=>进行规则的查询的判断 - * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 - * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 - */ - @Deprecated - public boolean parseWholeDatagram(ByteBuf buffer, ProtocolConfig protocolConfig) { - try { - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap,protocolId); - //选取规则对应的流程= - DatagramEventConfig datagramEventConfig = processorSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); - //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); - //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); - //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); - //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); - //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); - return true; - } catch (Exception ex) { - log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", - ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); - return false; - } - } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; - } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); - } - - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); - return bizDataMap; - } - - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java index 25e7ad8..6a5777e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java @@ -1,23 +1,31 @@ package com.casic.missiles.parser.instance.impl; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.mapper.DatagramEventMapper; import com.casic.missiles.pojo.DatagramEventConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.SpringContextUtil; -@Service -@AllArgsConstructor +import java.util.List; +import java.util.Optional; + +/** + * @author cz + * + */ public class DefaultProcessorInstanceSelector implements ProcessorInstanceSelector { - private final DatagramEventMapper datagramEventMapper; + private static List datagramEventConfigs; + + static { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + datagramEventConfigs = datagramEventRegistry.getDatagramEventList(); + } @Override public DatagramEventConfig getProcessorInstance(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("rule_id", protocolId); - return datagramEventMapper.selectOne(queryWrapper); + Optional optionalSelectInstance = datagramEventConfigs.stream() + .filter(e -> e.getId().equals(protocolId)).limit(1).findFirst(); + return optionalSelectInstance.isPresent() ? optionalSelectInstance.get() : null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a778671..7b56a43 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,16 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import io.netty.buffer.ByteBuf; /** - * 分析匹配情况 - * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 - * 2、匹配不成功,有后续帧,可以进行下次匹配。 - * 3、匹配不成功,无后续帧,可以进行丢弃。 + * 分析匹配情况 + * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 + * 2、匹配不成功,有后续帧,可以进行下次匹配。 + * 3、匹配不成功,无后续帧,可以进行丢弃。 */ -public interface FrameStructMatcher{ +public interface FrameStructMatcher { - ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig); + ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 05320ab..8ebea78 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,23 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.ProtocolConfigMapper; +import com.casic.missiles.parser.provider.ProtocolConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Component; import java.util.List; import java.util.stream.Collectors; -@Component -@AllArgsConstructor public class LeadingCodeMatcher { - private final ProtocolConfigMapper protocolMapper; - //** 1、首字母匹配前导码, // 2、以匹配出的前导码是否在报文中条件进行前导码的匹配二次筛选 - public List matchLeadingCode(String protocolContent){ + public static List matchFrameLeadingCode(String protocolContent){ List initialConfigs = initialMatch(protocolContent); List preCodeConfigs = initialConfigs.stream() .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) @@ -26,13 +19,16 @@ } //初始化匹配前导码内容 - private List initialMatch(String protocolContent) { - String protocolStr = protocolContent.charAt(0) + ""; - QueryWrapper queryWrapper = new QueryWrapper() - .likeRight("pre_fix", protocolStr); - List protocolConfigList = protocolMapper.selectList(queryWrapper); - return protocolConfigList; + private static List initialMatch(String protocolContent) { + String firstFrameChar = protocolContent.charAt(0) + ""; + ProtocolConfigProvider protocolConfigProvider=new ProtocolConfigProvider(firstFrameChar); + return protocolConfigProvider.getMatchList(); } + + + + + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index cf2113d..e915877 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -1,32 +1,35 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(0) -@Service +@Component public class FrameLengthMatcher implements FrameStructMatcher { - @Autowired - private FieldParser fieldParser; - //超过长度 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { String dataGramContent = ByteBufUtil.hexDump(byteBuf); - if (StringUtils.isEmpty(protocolConfig.getUnpackId()) && StringUtils.isEmpty(protocolConfig.getTailStr())) { - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + //当不存在结尾标志和拆包标志,可以直接使用长度进行匹配 + if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { if (dataGramContent.length() >= totalLength) {//等于长度返回true,超出长度,切断 - ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, protocolConfig, totalLength); + ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, totalLength); return wholeDatagramByte; } else { //读的标志位前移舍弃 @@ -38,7 +41,7 @@ return null; } - private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, Integer totalLength) { byteBuf.readBytes(totalLength); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, totalLength - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 2bfc213..d527ad0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; @@ -13,7 +13,7 @@ import lombok.AllArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.nio.charset.Charset; import java.util.Map; @@ -22,32 +22,30 @@ * 后续标志验证 */ @Order(1) -@Service +@Component @AllArgsConstructor -public class FrameMarkMatcher implements FrameStructMatcher { - - private final FieldConfigDao fieldConfigDao; - private final FieldParser fieldParser; - private final FieldResolver fieldResolverManger; +public class FrameMarkMatcher implements FrameStructMatcher, FixedPropertyEnum { //帧后续标志=>结束,进行帧的重组=>有后续,1、帧移位判别 2、继续接收帧 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig UnpackConfig = StringUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getUnpackId()); - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); - Integer upback = 0; + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); ByteBuf mergeWholeFrameByte = null; - if (!ObjectUtil.isEmpty(UnpackConfig)) { - while (hasNextFullFrame(byteBuf, protocolConfig)) { - upback = (Integer) fieldResolverManger.filedParserManger(byteBuf, UnpackConfig, null); + if (!ObjectUtil.isEmpty(unpackFlag)) { + while (hasNextFullFrame(byteBuf, protocolConfig, protocolFieldConfigProvider)) { //是否存在后续位 - if (upback == 1) {//使用esayRule + if (unpackFlag == 1) {//使用esayRule //表示可以截取 - mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolConfig, totalLength); + mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolFieldConfigProvider, protocolConfig); return mergeWholeFrameByte; } else { - byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig)); + byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig, protocolFieldConfigProvider)); } } } @@ -56,7 +54,8 @@ //选取第一个帧,将业务内容和后面部分分开 //计算数据报文-业务内容 - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolFieldConfigProvider protocolFieldConfigProvider, ProtocolConfig protocolConfig) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); //截取完整报文 byteBuf.readBytes(totalLength); ByteBuf byteBufContent = byteBuf.slice(0, byteBuf.readerIndex()); @@ -68,15 +67,15 @@ String tail = ""; System.out.println(ByteBufUtil.hexDump(byteBufContent)); //会存在多个帧拼接在一起的的情况,进行合并处理 - while (hasNextFullFrame(byteBufContent, protocolConfig)) { - Integer currentFrameLength = fieldParser.getTotalLength(protocolConfig, byteBufContent); + while (hasNextFullFrame(byteBufContent, protocolConfig, protocolFieldConfigProvider)) { + Integer currentFrameLength = protocolFieldConfigProvider.getTotalLength(byteBufContent, protocolConfig); byteBufContent.readBytes(currentFrameLength); ByteBuf currentbyteBuf = byteBufContent.slice(0, byteBufContent.readerIndex()); byteBufContent.markReaderIndex();//读的标志位前移 System.out.println(ByteBufUtil.hexDump(byteBufContent)); String hexDump = currentbyteBuf.toString(Charset.forName("ISO-8859-1")); //获取当前固定帧结构的关系map - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, currentbyteBuf); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(currentbyteBuf, protocolConfig); if (StringUtils.isEmpty(mergeFrameStr)) { //首次获取业务数据报文 mergeFrameStr += hexDump.substring(0, currentFrameFixedProperty.get("tailPosition")); @@ -95,22 +94,22 @@ /** * 获取平移到下一帧起始位置 */ - public int getNextFrameOffset(ByteBuf buffer, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, buffer); - return currentFrameFixedProperty.get("totalLength"); + public int getNextFrameOffset(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + return currentFrameFixedProperty.get(TOTAL_LENGTH); } /** * 判断是否出错进行整个帧的 */ - public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, byteBuf); + public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); //保证读取位置不在固定位置,是可变的业务内容 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("fixedPosition")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(FIXED_POSITION)) { return false; } //判断读取是否操作帧长度 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("totalLength")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(TOTAL_LENGTH)) { return false; } return true; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 76a3784..c3a1bab 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -1,50 +1,50 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.parser.instance.GeneralProcessor; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; +import io.netty.buffer.ByteBufUtil;; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(2) -@Service +@Component public class FrameTailMatcher implements FrameStructMatcher { - @Resource - private FieldConfigDao fieldConfigDao; - @Autowired - private GeneralProcessor generalProcessor; - //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig tailFieldConfig = StringUtils.isEmpty(protocolConfig.getTailStr()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getTailStr()); - if (!ObjectUtil.isEmpty(tailFieldConfig)) { - String tailStr = tailFieldConfig.getFieldName(); + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfig protocolFieldConfig = ObjectUtils.isEmpty(protocolConfig.getTailStr()) ? null : + fieldConfigProvider.getFieldConfigById(protocolConfig.getTailStr()); + if (!ObjectUtil.isEmpty(protocolFieldConfig)) { + String tailStr = protocolFieldConfig.getFieldName(); String dataGramContent = ByteBufUtil.hexDump(byteBuf); Boolean tailFlag = ByteBufUtil.hexDump(byteBuf).contains(tailStr); if (!tailFlag) { //使用esayRule return null; } else if (dataGramContent.indexOf(tailStr) < dataGramContent.length() - tailStr.length()) { Integer length = dataGramContent.indexOf(tailStr) + tailStr.length(); - ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, protocolConfig, length); + ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, length); return wholeDatagramByte; //存在粘包 } } return null; } - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer length) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, Integer length) { byteBuf.readBytes(length); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, length - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java new file mode 100644 index 0000000..5f1c177 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java @@ -0,0 +1,73 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.combined.GenericCombinedFieldResolver; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.CombinedFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class CombinedFieldConfigProvider { + + + /** + * 作为临时配置列表缓存使用 + */ + private final List combinedFieldConfigList; + private Map storeObjectMap = new HashMap<>(); + + public CombinedFieldConfigProvider(Long ruleId) { + CombinedFieldConfigRegistry combinedFieldConfigRegistry = SpringContextUtil.getBean(CombinedFieldConfigRegistry.class); + combinedFieldConfigList = combinedFieldConfigRegistry.getCombinedFieldConfigList(ruleId); + } + + public void parseDataField(RuleConfig ruleConfig, String clearZeroPlain,Map fieldConfigsMap ) { + if (showSkip()) { + return; + } + //匹配对应的数据,然后进行相关的字段解析 + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver(); + combinedFieldResolver.parseDataField(combinedFieldConfigList, byteBuf, storeObjectMap,fieldConfigsMap); + } + + + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getCombinedFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return combinedFieldConfigList.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public List getCombinedFieldConfigList() { + return combinedFieldConfigList; + } + + /* 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(combinedFieldConfigList) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java new file mode 100644 index 0000000..f3cfedc --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java @@ -0,0 +1,11 @@ +package com.casic.missiles.parser.provider; + +/** + * @author cz + * @date 2023-6-12 + */ +public class CommandEventProvider{ + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java new file mode 100644 index 0000000..70eec5e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java @@ -0,0 +1,77 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.safe.SafeStrategy; +import com.casic.missiles.parser.sender.DataSubscribeProvider; +import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class DatagramEventProvider { + + private final DatagramEventConfig processorInstance; + + public DatagramEventProvider(Long ruleId) { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + List datagramEventConfigList = + datagramEventRegistry.getDatagramEventList(ruleId); + processorInstance = this.getProcessorInstance(datagramEventConfigList); + } + + public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { + if (showSkip()) { + return null; + } + return datagramEventConfigList.get(0); + } + + // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 + public String getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap) { + String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? + processorInstance.getSafeBean() : + fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); + if (!StringUtils.isEmpty(safeName)) { + //需要加密 + SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); + String plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); + return clearComplementZero(plain); + } + return ByteBufUtil.hexDump(bizDataContent); + } + + //解密清零操作 + private String clearComplementZero(String plain) { + plain = plain.substring(0, plain.lastIndexOf("00")); + return plain; + } + + //数据发送,数据发送者暂未构建 + public void storeData(Map bizDataMap) { + DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); +// dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return ObjectUtils.isNotEmpty(processorInstance) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java new file mode 100644 index 0000000..7e1fe0a --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java @@ -0,0 +1,97 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.FieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class FieldConfigProvider { + + + private final List fieldConfigs; + private Map storeObjectMap = new HashMap<>(); +// private Map singleObjects = new ConcurrentHashMap<>(); + + public FieldConfigProvider(Long ruleId) { + FieldConfigRegistry fieldConfigRegistry = SpringContextUtil.getBean(FieldConfigRegistry.class); + fieldConfigs = fieldConfigRegistry.getFieldConfigList(ruleId); + } + + public List getFieldConfigs() { + return fieldConfigs; + } + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public Map parseDataField(RuleConfig ruleConfig, String clearZeroPlain) { + if (showSkip()) { + return null; + } + List prepareFieldConfig = prepareParseField(ruleConfig); + if (CollectionUtils.isNotEmpty(prepareFieldConfig)) { + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(fieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + return fixDataMap; + } + } + return null; + } + + /** + * 得到需要处理的业务内容 + * + * @return + */ + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return fieldConfigs.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public Map getFieldConfigsMap() { + return fieldConfigs.stream().collect( + Collectors.toMap(FieldConfig::getId, e -> e) + ); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(fieldConfigs) ? false : true; + } + + +} + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java new file mode 100644 index 0000000..817bfaf --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java @@ -0,0 +1,19 @@ +package com.casic.missiles.parser.provider; + +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.registry.FieldRuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; + +public class FieldRuleConfigProvider { + + private final List fieldRuleConfigList; + + public FieldRuleConfigProvider(Long ruleId) { + FieldRuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(FieldRuleConfigRegistry.class); + fieldRuleConfigList = ruleConfigRegistry.getFieldRuleConfigList(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java new file mode 100644 index 0000000..99a1b06 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java @@ -0,0 +1,53 @@ +package com.casic.missiles.parser.provider; + + +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.registry.ProtocolConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolConfigProvider { + + private final List protocolConfigList; + + public ProtocolConfigProvider(String firstChar) { + ProtocolConfigRegistry registry = SpringContextUtil.getBean(ProtocolConfigRegistry.class); + protocolConfigList = registry.getProtocolConfigList(firstChar); + } + + public List getMatchList() { + return protocolConfigList; + } + + /** + * 设置当前协议 + * + * @param protocolConfig + */ + public ProtocolConfigProvider(ProtocolConfig protocolConfig) { + List protocolConfigs = new ArrayList<>(); + protocolConfigs.add(protocolConfig); + protocolConfigList = protocolConfigs; + } + + /** + * 获取当前协议 + * + * @return + */ + public ProtocolConfig getCurrentProtocolConfig() { + if (this.protocolConfigList == null) { + return null; + } else { + return protocolConfigList.get(0); + } + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java new file mode 100644 index 0000000..043927d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java @@ -0,0 +1,213 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.registry.ProtocolFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolFieldConfigProvider { + + private static final String FIXED_FIELD_DS = "fixedFieldDs"; + private static final String CONTENT_FIELD_DS = "contentFieldDs"; + private static final String PROTOCOL_LENGTH = "protocolLength"; + private static final String PROTOCOL_FIELD_ID = "protocolFieldId"; + private static final String PROTOCOL_POSITION = "protocolPosition"; + + private final List protocolFieldConfigs; + private Map singleObjects = new ConcurrentHashMap<>(); + private Map storeObjectMap = new HashMap<>(); + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public ProtocolFieldConfigProvider(Long protocolId) { + ProtocolFieldConfigRegistry protocolFieldConfigRegistry = SpringContextUtil.getBean(ProtocolFieldConfigRegistry.class); + protocolFieldConfigs = protocolFieldConfigRegistry.getProtocolFieldConfigList(protocolId); + } + + public List getProtocolFieldConfigs() { + return protocolFieldConfigs; + } + + public ProtocolFieldConfig getFieldConfigById(Long fieldId) { + Optional optionalConfig = protocolFieldConfigs.stream().filter( + e -> e.getId().equals(fieldId) + ).findFirst(); + return optionalConfig.isPresent() ? optionalConfig.get() : null; + } + + public Integer getProtocolFieldValue(Long protocolFieldId, ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_FIELD_ID + protocolFieldId + ByteBufUtil.hexDump(byteBuf); + //获取缓存 + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + //加载固定长度数据集合 + Map fixDataMap = this.getProtocolDataMap(byteBuf); + ProtocolFieldConfig protocolFieldConfig = selectFieldConfig(protocolFieldId); + Integer protocolFieldValue = 0; + //获取约定字段的总长度 + if (fixDataMap.containsKey(protocolFieldConfig.getFieldName())) { + Object appointUnpackObject = fixDataMap.get(protocolFieldConfig.getFieldName()); + if (ObjectUtils.isNotEmpty(appointUnpackObject)) { + protocolFieldValue = (Integer) appointUnpackObject; + } + } + if (protocolFieldValue != null) { + //加入缓存 + if (ObjectUtils.isNotEmpty(protocolFieldValue)) { + this.singleObjects.put(catchKey, protocolFieldValue); + return protocolFieldValue; + } + } + return null; + } + + /** + * 获取帧固定位置信息 + * + * @param byteBuf + * @param protocolConfig + * @return + */ + public Map getFixedProperty(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_POSITION + protocolConfig.getId(); + if (this.singleObjects.containsKey(catchKey)) { + return (Map) singleObjects.get(catchKey); + } + Map fixedPropertyMap = new HashMap<>(); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + fixedPropertyMap = fieldParser.doGetFixedProperty(protocolFieldConfigs, this.getTotalLength(byteBuf,protocolConfig)); + if (CollectionUtils.isNotEmpty(fixedPropertyMap)) { + this.singleObjects.put(catchKey, fixedPropertyMap); + return fixedPropertyMap; + } + return fixedPropertyMap; + } + + /** + * 获取帧结构应有的总长度 + */ + public Integer getTotalLength(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_LENGTH + ByteBufUtil.hexDump(byteBuf); + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + Integer appointFrameLength = getProtocolFieldValue(protocolConfig.getTotalLengthId(), byteBuf); + if (appointFrameLength != null) { + //获取过滤的字段集合总长度 + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Integer totalFilterLength = fieldParser.getTotalFilterLength(protocolConfig, byteBuf, getFixFieldConfigMap()); + //计算总长度 + Integer totalLength = appointFrameLength + totalFilterLength; + //加入缓存 + if (ObjectUtils.isNotEmpty(totalLength)) { + this.singleObjects.put(catchKey, totalLength); + return totalLength; + } + } + return null; + } + + /** + * 获取协议有关字段解析内容 + * storeObjectMap存储代转存的数据 + * + * @return + */ + public Map getProtocolDataMap(ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(FIXED_FIELD_DS)) { + return (Map) singleObjects.get(FIXED_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(protocolFieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + this.singleObjects.put(FIXED_FIELD_DS, fixDataMap); + return fixDataMap; + } + return null; + } + + /** + * 获取业务报文内容的content字节 + * + * @param wholeDatagramByte + * @return + */ + public ByteBuf getDataContentBuf(ByteBuf wholeDatagramByte) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(CONTENT_FIELD_DS)) { + return (ByteBuf) singleObjects.get(CONTENT_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + ByteBuf bizDataByteBuf = fieldParser.getDataContentBuf(protocolFieldConfigs, wholeDatagramByte); + if (bizDataByteBuf != null) { + this.singleObjects.put(CONTENT_FIELD_DS, bizDataByteBuf); + return bizDataByteBuf; + } + return null; + } + + + private ProtocolFieldConfig selectFieldConfig(Long id) { + Optional optionalProtocolFieldConfig = this.protocolFieldConfigs.stream().filter( + e -> e.getId().equals(id) + ).findFirst(); + return optionalProtocolFieldConfig.isPresent() ? optionalProtocolFieldConfig.get() : null; + } + + + private Map getFixFieldConfigMap() { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, e -> e) + ); + return fixDataFieldMap; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(protocolFieldConfigs) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java new file mode 100644 index 0000000..dafba1c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java @@ -0,0 +1,56 @@ +package com.casic.missiles.parser.provider; + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.rule.GenericRuleResolver; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.RuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleConfigProvider { + + private final List ruleConfigs; + + public List getRuleConfigs() { + return ruleConfigs; + } + + public RuleConfigProvider(Long protocolId) { + RuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(RuleConfigRegistry.class); + ruleConfigs = ruleConfigRegistry.getRuleConfigById(protocolId); + } + + /** + * 获取规则匹配结果 + * + * @param parseFixedDataMap + * @param protocolFieldConfigs + * @return + */ + public RuleConfig doGetRule(Map parseFixedDataMap, + String ids, + List protocolFieldConfigs) { + if (showSkip()) { + return null; + } + RuleConfig ruleConfig = GenericRuleResolver.machRule(parseFixedDataMap, ids, protocolFieldConfigs, ruleConfigs); + return ruleConfig; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(ruleConfigs) ? false : true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java index 3c05891..856b399 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java @@ -1,18 +1,11 @@ package com.casic.missiles.parser.resolver; -import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.springframework.web.bind.annotation.RequestBody; -import javax.annotation.Resource; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -20,19 +13,17 @@ @Slf4j public class ByteMergeProvider { - @Resource - private FieldRuleEngineMapper fieldRuleEngineMapper; - //拿到所有的值合并到一个值 - public String resolveByteMerge(List valueList, String ruletypeId, String vaildRange) { + public static String resolveByteMerge(List valueList, String ruleTypeId, String vaildRange) { String values = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Map vaildMap = getValidRangeMap(vaildRange); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(ruletypeId); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } + //暂时不处理 +// fieldRuleEngine = fieldRuleConfigMapper.selectById(ruleTypeId); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } Map env2 = new HashMap(); for (int i = 0; i < valueList.size(); i++) { if (vaildMap.containsKey(i)) { @@ -47,7 +38,7 @@ } } - private Map getValidRangeMap(String vaildRange) { + private static Map getValidRangeMap(String vaildRange) { String[] range = vaildRange.split(","); Map vaildMap = new HashMap(); for (int i = 0; i < range.length; i++) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 8d821cd..85d6bbf 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -1,9 +1,12 @@ package com.casic.missiles.parser.resolver; +import com.casic.missiles.pojo.AbstractFieldConfig; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; import io.netty.buffer.ByteBuf; +import java.util.List; import java.util.Map; /** @@ -11,18 +14,14 @@ */ public interface FieldParser { -// Map fieldProcess(String protocolContent,); - Map dataParser(RuleConfig ruleConfig, String lightText,String protocolId); + Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength); - Map fixDataParser(String protocolId, ByteBuf buffer); + Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap); - Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf); + ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer); - ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer); - - ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer); - - Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer); + Integer getTotalFilterLength(ProtocolConfig protocolConfig, ByteBuf byteBuf, Map protocolFieldConfigMap); } + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java new file mode 100644 index 0000000..9e0c00e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java @@ -0,0 +1,52 @@ +package com.casic.missiles.parser.resolver; + +import com.casic.missiles.pojo.AbstractFieldConfig; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.util.List; + +public class FieldParserSupport { + + //分别计算bit和byte长度=> 合并长度 + protected Integer calculateLength(List fieldConfigList) { + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + Integer fixedLength = bytefixedLength + bitfixedLength / 8; + return fixedLength; + } + + //找到最大值=> 根据最大值计算业务数据下标 + protected Integer calculatePosition(List fieldConfigList) { + String rex = "[0-9]+"; + Integer max = -1; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) + && Integer.valueOf(fieldConfig.getOriginPositionByte()) > max) { + max = Integer.valueOf(fieldConfig.getOriginPositionByte()); + } + } + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) && fieldConfig.getOriginPositionByte().equals(max)) { + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + } + } + Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; + return maxFixedPosition; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java deleted file mode 100644 index dd3a6cd..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java +++ /dev/null @@ -1,170 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.ByteResolverParam; -import io.netty.buffer.ByteBuf; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -/** - * 字段解析管理总类 - */ -@Service -@Slf4j -@AllArgsConstructor -public class FieldResolver extends ByteMergeProvider { - - //1、字段截取 => 2、简单的字节解析和复杂的字节解析 - public Object filedParserManger(ByteBuf byteBuf, FieldConfig fieldConfig, Integer maxFixedPosition) { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - //最大固定位置不为空, - if (!ObjectUtil.isEmpty(maxFixedPosition)) { - orignPosition -= maxFixedPosition; - } - Object fieldValue = 0; - //待优化 - if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { - fieldValue = bitToResolver(byteBuf, fieldConfig); - } else { - ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); - fieldValue = parsingFields(fieldBytes, fieldConfig.getRuleJson()); - } - return fieldValue; - } - - //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, - //目前默认配置的规则设置暂不支持配置化,由实现完成 - private Object parsingFields(ByteBuf byteBuf, String ruleJson) { - Object fieldsResolveValue = null; - List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); - if (ObjectUtil.isEmpty(ruleMapList)) { - fieldsResolveValue = defaultResolveBuilder(byteBuf); - } else { - fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); - } - return fieldsResolveValue; - } - - private Object defaultResolveBuilder(ByteBuf byteBuf) { - Integer defaultResolveValue = 0; - for (int i = 0; i < byteBuf.writerIndex(); i++) { - defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; - } - return defaultResolveValue; - } - - //字段解析构建器(针对字节单位的) - //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 - // 字节归并结束或者规则结束=>继续根据规则进行判断 - private Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { - Object customizeResolveValue = null; - try { - List bytStrList = new ArrayList<>(); - //存放到数组里面 - for (int i = 0; i < byteBuf.writerIndex(); i++) { - bytStrList.add(byteBuf.readByte()); - } - int i = 0; - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - customizeResolveValue = this.resolveByteMerge(bytStrList, ruletypeId,vaildRange); - break; - } else { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - List tempBytStr = new ArrayList<>(); - for (int k = 0; i < bytStrList.size(); i++) { - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(k) - .value(bytStrList.get(k)) - .ruletypeId(ruletypeId).build(); - tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); - } - bytStrList = tempBytStr; - } - i++; - } - //字节归并到一起=>继续根据规则进行判断 - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(customizeResolveValue) - .ruletypeId(ruletypeId).build(); - customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(customizeResolveValue)); - return customizeResolveValue; - } catch (RuntimeException ex) { - log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); - return null; - } - } - - /** - * 1、单个字节情况表示字段 - * 2、多字节情况表示字段(暂未处理) - */ - private Object bitToResolver(ByteBuf byteBuf, FieldConfig fieldConfig) { - Object fieldValue = new Object(); - try { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - byte fields = 0x00; - if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); - } else { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); - } - - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { - if (!StringUtils.isEmpty(fieldConfig.getExactOrignPosition())) { - fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getExactOrignPosition())).byteValue() - >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); - } else { - fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); - } - } else { - fieldValue = Integer.valueOf(fields & 0xff); - } - if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { - return fieldValue; - } - List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); - int i = 0; - //字节归并到一起=>继续根据规则进行判断 - while (i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(fieldValue) - .ruletypeId(ruletypeId).build(); - fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(fieldValue)); - return fieldValue; - } catch (RuntimeException ex) { - log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); - return null; - } - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java new file mode 100644 index 0000000..1d2aeab --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java @@ -0,0 +1,36 @@ +package com.casic.missiles.parser.resolver.bytes; + +import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.mapper.FieldRuleConfigMapper; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.pojo.ByteResolverParam; +import com.googlecode.aviator.AviatorEvaluator; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; +//转换规则 +@Component("convert") +@AllArgsConstructor +@Slf4j +public class ByteRuleResolver implements ByteResolver { + + private final FieldRuleConfigMapper fieldRuleConfigMapper; + + @Override + public Object resolveOperationRule(ByteResolverParam byteResolverParam){ + FieldRuleConfig fieldRuleEngine=fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); + if(ObjectUtil.isEmpty(fieldRuleEngine)){ + return byteResolverParam.getValue(); + } + String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); + Map env2 = new HashMap(); + env2.put("value", (byte) byteResolverParam.getValue()); + String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); + return values; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java index 103821c..786b71c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java @@ -2,34 +2,34 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("logicalShift") +@Component("logicalShift") @AllArgsConstructor @Slf4j public class LogicalShiftResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //字节位移 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { Integer index = byteResolverParam.getIndex(); - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return byteResolverParam.getValue(); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java index 476747d..01149bd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("operation") +@Component("operation") @AllArgsConstructor @Slf4j public class OperationResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //混合运算,有常量或者乘除的缩放 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java index 0b82cf4..79abcce 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.casic.missiles.pojo.ByteResolverParam; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; //精度计算 -@Service("precision") +@Component("precision") @AllArgsConstructor @Slf4j public class PrecisionResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java deleted file mode 100644 index 5c3f332..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; -//转换规则 -@Service("convert") -@AllArgsConstructor -@Slf4j -public class RuleResolver implements ByteResolver { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam){ - RuleEvaluator fieldRuleEngine=fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); - if(ObjectUtil.isEmpty(fieldRuleEngine)){ - return byteResolverParam.getValue(); - } - String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); - Map env2 = new HashMap(); - env2.put("value", (byte) byteResolverParam.getValue()); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java new file mode 100644 index 0000000..d3bbd91 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java @@ -0,0 +1,15 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; + +import java.util.List; +import java.util.Map; +// 前导码匹配->长度字段 +public interface AbstractCombinedFieldProcessor { + + Map invoke(Map map, ByteBuf byteBuf, List combinedFieldConfigList, + Map fieldConfigsMap, Map storeObjectMap); + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java new file mode 100644 index 0000000..03c8480 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java @@ -0,0 +1,59 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-13 + */ +//依次递增进行数据的解析, +public class GenericCombinedFieldResolver { + + + //通过查询,字段长度长度随机 + public void parseDataField(List combinedFieldConfigList, ByteBuf byteBuf, + Map storeObjectMap, Map fieldConfigsMap) { + Integer frameLength = Integer.valueOf(ByteBufUtil.hexDump(byteBuf)); + //添加前置处理器 + com.casic.missiles.util.ClassUtil classUtil = new com.casic.missiles.util.ClassUtil(); + List abstractCombinedProcessors = classUtil.getSubClassList(AbstractCombinedFieldProcessor.class); + + Map fieldFixedMap = combinedFieldLeadCodeMap(combinedFieldConfigList); + //frameLength + Map combinedProcessorFields = null; + while (byteBuf.readableBytes() < frameLength) { + //一直处理 + for (AbstractCombinedFieldProcessor abstractCombinedProcessor : abstractCombinedProcessors) { + combinedProcessorFields = abstractCombinedProcessor.invoke(combinedProcessorFields, byteBuf, + combinedFieldConfigList, + fieldConfigsMap, storeObjectMap); + if (combinedProcessorFields == null || byteBuf.readableBytes() < frameLength) { + return; + } + } + + } + } + + /** + * 取出前导码匹配集合 + */ + private Map combinedFieldLeadCodeMap(List combinedFieldConfigList) { + Map fieldFixedMap = combinedFieldConfigList + .stream() + .collect(Collectors.toMap(CombinedFieldConfig::getPrefixCode, e -> e)); + return fieldFixedMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java new file mode 100644 index 0000000..643a934 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java @@ -0,0 +1,100 @@ +package com.casic.missiles.parser.resolver.fields; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.FieldParserSupport; +import com.casic.missiles.pojo.*; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 保存使用时最基本的信息,并且使用原型模式 + */ +@Slf4j +public class DefaultProtocolFieldParser extends FieldParserSupport implements FieldParser, FixedPropertyEnum { + + //通过传入的配置和报文进行字段解析 + @Override + public Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap) { + Map dataMap = new HashMap<>(); + for (AbstractFieldConfig protocolFieldConfig : protocolFieldConfigs) { + if (!ObjectUtils.isEmpty(protocolFieldConfig.getOriginPositionByte())) { + Object fieldValue = FieldResolver.parseField(buffer, protocolFieldConfig, null); + if (protocolFieldConfig.getIsStorage() == 1) { + storeObjectMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + dataMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + } + return dataMap; + } + + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength) { + Map fixedPropertyMap = new HashMap<>(); + Integer fixedLength = calculateLength(protocolFieldConfigs); + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + fixedPropertyMap.put(FIXED_POSITION, maxFixedPosition); + fixedPropertyMap.put(TOTAL_LENGTH, totalLength); + fixedPropertyMap.put(TAIL_POSITION, totalLength - fixedLength + maxFixedPosition); + return fixedPropertyMap; + } + + //** 获取业务内容的byteBuf + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer) { + //计算固定长度 + Integer fixedLength = calculateLength(protocolFieldConfigs); + //总长度获取 + String lightText = buffer.toString(Charset.forName("ISO-8859-1")); + Integer totalLength = lightText.length(); + //计算固定长度最大长度 + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + //计算数据报文内容 + ByteBuf bizDataFields = buffer.slice(maxFixedPosition - 1, (totalLength - fixedLength)); + return bizDataFields; + } + + /** + * 获取过滤字段的长度 + */ + @Override + public Integer getTotalFilterLength(ProtocolConfig protocolConfig, + ByteBuf byteBuf, + Map protocolFieldConfigMap) { + if (ByteBufUtil.hexDump(byteBuf).equals("")) { + return 0; + } + int totalFilterLength = 0; + String filterFields = protocolConfig.getTotalLengthFilterFields(); + try { + if (!StringUtils.isEmpty(filterFields)) { + String[] filterFieldList = filterFields.split(","); + for (String filterFieldId : filterFieldList) { + if (StringUtils.isNotEmpty(filterFieldId)) { + ProtocolFieldConfig fieldConfig = protocolFieldConfigMap.get(Long.valueOf(filterFieldId)); + //这里都是按字节计算,没有对位进行区分,可能会出现错误 + // 如果对位有需求,需要进一步跟进 + totalFilterLength += fieldConfig.getOffsetLength(); + } + } + } + return totalFilterLength; + } catch (Exception ex) { + log.error("报文确认分发阶段,获取报文总长度过滤长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); + } + return totalFilterLength; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java new file mode 100644 index 0000000..d51e887 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java @@ -0,0 +1,169 @@ +package com.casic.missiles.parser.resolver.fields; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.parser.resolver.ByteMergeProvider; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.AbstractFieldConfig; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.pojo.ByteResolverParam; +import io.netty.buffer.ByteBuf; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * 字段解析管理总类 + */ +@Slf4j +public class FieldResolver extends ByteMergeProvider { + + //1、字段截取 => 2、简单的字节解析和复杂的字节解析 + public static Object parseField(ByteBuf byteBuf,AbstractFieldConfig fieldConfig, Integer maxFixedPosition) { + Integer orignPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + //最大固定位置不为空, + if (!ObjectUtil.isEmpty(maxFixedPosition)) { + orignPosition -= maxFixedPosition; + } + Object fieldValue = 0; + //待优化 + if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { + fieldValue = doParseBitField(byteBuf, fieldConfig); + } else { + ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); + fieldValue = doParseByteField(fieldBytes, fieldConfig.getRuleJson()); + } + return fieldValue; + } + + //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, + //目前默认配置的规则设置暂不支持配置化,由实现完成 + private static Object doParseByteField(ByteBuf byteBuf, String ruleJson) { + Object fieldsResolveValue = null; + List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); + if (ObjectUtil.isEmpty(ruleMapList)) { + fieldsResolveValue = defaultResolveBuilder(byteBuf); + } else { + fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); + } + return fieldsResolveValue; + } + + private static Object defaultResolveBuilder(ByteBuf byteBuf) { + Integer defaultResolveValue = 0; + for (int i = 0; i < byteBuf.writerIndex(); i++) { + defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; + } + return defaultResolveValue; + } + + //字段解析构建器(针对字节单位的) + //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 + // 字节归并结束或者规则结束=>继续根据规则进行判断 + private static Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { + Object customizeResolveValue = null; + try { + List bytStrList = new ArrayList<>(); + //存放到数组里面 + for (int i = 0; i < byteBuf.writerIndex(); i++) { + bytStrList.add(byteBuf.readByte()); + } + int i = 0; + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { + if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + customizeResolveValue = resolveByteMerge(bytStrList, ruletypeId, vaildRange); + break; + } else { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + List tempBytStr = new ArrayList<>(); + for (int k = 0; i < bytStrList.size(); i++) { + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(k) + .value(bytStrList.get(k)) + .ruletypeId(ruletypeId).build(); + tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); + } + bytStrList = tempBytStr; + } + i++; + } + //字节归并到一起=>继续根据规则进行判断 + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(null) + .value(customizeResolveValue) + .ruletypeId(ruletypeId).build(); + customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); + i++; + } + System.out.println(JSON.toJSON(customizeResolveValue)); + return customizeResolveValue; + } catch (RuntimeException ex) { + log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); + return null; + } + } + + /** + * 1、单个字节情况表示字段 + * 2、多字节情况表示字段(暂未处理) + */ + private static Object doParseBitField(ByteBuf byteBuf,AbstractFieldConfig fieldConfig) { + Object fieldValue = new Object(); + try { + Integer orignPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + byte fields = 0x00; + if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { + fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); + } else { + fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); + } + + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { + if (!StringUtils.isEmpty(fieldConfig.getOriginPositionBit())) { + fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getOriginPositionBit())).byteValue() + >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); + } else { + fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); + } + } else { + fieldValue = Integer.valueOf(fields & 0xff); + } + if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { + return fieldValue; + } + List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); + int i = 0; + //字节归并到一起=>继续根据规则进行判断 + while (i < ruleMapList.size()) { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(null) + .value(fieldValue) + .ruletypeId(ruletypeId).build(); + fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); + i++; + } + System.out.println(JSON.toJSON(fieldValue)); + return fieldValue; + } catch (RuntimeException ex) { + log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); + return null; + } + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java deleted file mode 100644 index 35ae3d0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java +++ /dev/null @@ -1,183 +0,0 @@ -package com.casic.missiles.parser.resolver.fields; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufAllocator; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; -import org.springframework.util.ObjectUtils; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service("standard") -@AllArgsConstructor -@Slf4j -public class StandardFieldParser implements FieldParser { - - private final FieldConfigDao fieldConfigDao; - private final FieldResolver fieldResolver; - - //数据解析 - @Override - public Map dataParser(RuleConfig ruleConfig, String lightText, String protocolId) { - String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); - ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); - bufferContent.writeBytes(lightText.getBytes(Charset.forName("ISO-8859-1"))); - Map dataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - for (String dataFieldId : dataFieldIds) { - FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(dataFieldId); - if (!ObjectUtils.isEmpty(fieldConfig)) { - dataMap.put(fieldConfig.getFieldName(), String.valueOf(fieldResolver.filedParserManger(bufferContent, fieldConfig, maxFixedPosition))); - } - } - return dataMap; - } - - //数据解析 - @Override - public Map fixDataParser(String protocolId, ByteBuf buffer) { - List dataFieldIdList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Map dataMap = new HashMap<>(); - for (FieldConfig dataField : dataFieldIdList) { - if (!ObjectUtils.isEmpty(dataField.getOrignPosition())) { - Object fieldValue = (Integer) fieldResolver.filedParserManger(buffer, dataField, null); - dataMap.put(dataField.getFieldName(), fieldValue); - } - } - return dataMap; - } - - @Override - public Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf) { - if (ByteBufUtil.hexDump(byteBuf).equals("")) { - return 0; - } - String filterFields = protocolConfig.getTotalLengthFilterField(); - Integer totalLength = 0; - try { - FieldConfig totalFieldConfig = fieldConfigDao.getFieldConfigById(protocolConfig.getTotalLengthId()); - int totalFilterLength = 0; - if (!StringUtils.isEmpty(filterFields)) { - String[] filterFieldList = filterFields.split(","); - for (String filterField : filterFieldList) { - FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(filterField); - //这里都是按字节计算,没有对位进行区分,可能会出现错误 - - // 如果对位有需求,需要进一步跟进 - totalFilterLength += fieldConfig.getOffsetLength(); - } - } - totalLength = (Integer) fieldResolver.filedParserManger(byteBuf, totalFieldConfig, null) + totalFilterLength; - } catch (Exception ex) { - log.error("报文确认分发阶段,获取报文总长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); - } - return totalLength; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer) { - //业务内容 - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - String protocolId = String.valueOf(protocolConfig.getId()); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - //计算固定长度 - Integer fixedLength = calculateLength(fieldConfigList); -// Integer totalLength = this.getTotalLength(protocolConfig, buffer); - //总长度获取 - Integer totalLength = lightText.length(); - //计算固定长度最大长度 - Integer maxFixedPosition = calculatePosition(fieldConfigList); -// buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - //计算数据报文内容 - ByteBuf bizDataFields = buffer.slice(maxFixedPosition-1, (totalLength - fixedLength)); - return bizDataFields; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer) { - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - String protocolId = String.valueOf(protocolConfig.getId()); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer fixedLength = calculateLength(fieldConfigList); -// Integer totalLength = this.getTotalLength(protocolConfig, buffer); - Integer totalLength = lightText.length(); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - ByteBuf fixDataFields = buffer.slice(0, maxFixedPosition); - return fixDataFields; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer) { - String protocolId = String.valueOf(protocolConfig.getId()); - Map fixedPropertyMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer fixedLength = calculateLength(fieldConfigList); - Integer totalLength = this.getTotalLength(protocolConfig, buffer); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - fixedPropertyMap.put("fixedPosition", maxFixedPosition); - fixedPropertyMap.put("totalLength", totalLength); - fixedPropertyMap.put("tailPosition", totalLength - fixedLength + maxFixedPosition); - return fixedPropertyMap; - } - - //分别计算bit和byte长度=> 合并长度 - private Integer calculateLength(List fieldConfigList) { - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (FieldConfig fieldConfig : fieldConfigList) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - Integer fixedLength = bytefixedLength + bitfixedLength / 8; - return fixedLength; - } - - //找到最大值=> 根据最大值计算业务数据下标 - private Integer calculatePosition(List fieldConfigList) { - String rex = "[0-9]+"; - Integer max = -1; - for (FieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOrignPosition()) - && Integer.valueOf(fieldConfig.getOrignPosition()) > max) { - max = Integer.valueOf(fieldConfig.getOrignPosition()); - } - } - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (FieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOrignPosition()) && fieldConfig.getOrignPosition().equals(max)) { - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - } - } - Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; - return maxFixedPosition; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java new file mode 100644 index 0000000..d4ec6c7 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java @@ -0,0 +1,76 @@ +package com.casic.missiles.parser.rule; + +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import org.apache.commons.lang3.StringUtils; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class GenericRuleResolver { + + //根据前置字段的值,找到指定的规则 + //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 + //=>循环判断=>通过规则得到业务字段 + public static RuleConfig machRule(Map fixDataMap, + String ids, + List protocolFieldConfigs, + List ruleConfigs) { + List preRuleConfigList = getPreRuleList(ids, protocolFieldConfigs); + //获取前置规则字段 + final Map metaDataMap = getPreRuleFields(preRuleConfigList, fixDataMap); + //准备固定的字段集合 + Map fixDataFieldMap = getFixDataFieldMap(protocolFieldConfigs); + return RuleResolverCore.doMachRule(ruleConfigs, metaDataMap, fixDataMap, fixDataFieldMap); + } + + private static Map getFixDataFieldMap(List protocolFieldConfigs) { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, ProtocolFieldConfig::getFieldName) + ); + return fixDataFieldMap; + } + + + /** + * 查询前置规则的字段配置 + * + * @param ids + * @return + */ + private static List getPreRuleList(String ids, List protocolFieldConfigs) { + String[] idList = ids.split(","); + Map prepareMaps = new HashMap<>(); + for (String id : idList) { + if (StringUtils.isNotEmpty(id)) { + prepareMaps.put(Long.valueOf(id), ""); + } + } + List preRuleConfigList = protocolFieldConfigs + .stream() + .filter(e -> prepareMaps.containsKey(e.getId())) + .collect(Collectors.toList()); + return preRuleConfigList; + } + + /** + * 获取前置规则解析字段 + */ + private static Map getPreRuleFields(List preRuleFieldConfigList, Map fixDataMap) { + Map ruleFieldMap = new HashMap<>(); + preRuleFieldConfigList.stream() + .forEach( + preRuleFieldConfig -> { + String fieldName = preRuleFieldConfig.getFieldName(); + if (fixDataMap.containsKey(fieldName)) { + ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); + } + } + ); + return ruleFieldMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java new file mode 100644 index 0000000..baae7e8 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -0,0 +1,68 @@ +package com.casic.missiles.parser.rule; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.casic.missiles.pojo.RuleConfig; + +import java.util.*; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleResolverCore { + + + public static RuleConfig doMachRule(List ruleConfigList, Map metaDataMap, + Map fixDataMap, + Map fixDataFieldMap) { + Optional ruleConfigOptional = ruleConfigList.stream() + .filter(ruleConfig -> machRuleConfig( + JSON.parseObject(ruleConfig.getMatchRuleJson(), Map.class), metaDataMap)) + .findFirst(); + if (ObjectUtil.isEmpty(ruleConfigOptional)) { + return null; + } + String[] ruleFields = ruleConfigOptional.get().getDataFieldIds().split(","); + Map ruleMetaDataMap = getRuleFields(ruleFields, fixDataMap, fixDataFieldMap); + //递归选定解析规则,进行规则解析 + if (!ruleConfigOptional.get().getIsFinishMatch().equals("1")) { + //递归选定规则 + doMachRule(ruleConfigList, ruleMetaDataMap, fixDataMap, fixDataFieldMap); + } + return ruleConfigOptional.get(); + } + + + private static Map getRuleFields(String[] preRuleConfigList, Map fixedDataMap, + Map fixedFieldMap) { + Map ruleFieldMap = new HashMap<>(); + for (String preRuleConfigId : preRuleConfigList) { + String fieldName = fixedFieldMap.get(preRuleConfigId); + if (fixedDataMap.containsKey(fieldName)) { + ruleFieldMap.put(fieldName, String.valueOf(fixedDataMap.get(fieldName))); + } + } + return ruleFieldMap; + } + + + //匹配规则配置 + private static Boolean machRuleConfig(Map ruleMap, Map metaDataMap) { + if (ruleMap == null || metaDataMap == null) { + return null; + } + //所有的字段在规则里面必须有有配置 + for (String key : metaDataMap.keySet()) { + if (ruleMap.containsKey(key)) { + if (!ruleMap.get(key).equals(metaDataMap.get(key))) { + return false; + } + } else { + return false; + } + } + return true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java deleted file mode 100644 index 664088d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java +++ /dev/null @@ -1,92 +0,0 @@ -package com.casic.missiles.parser.rule; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.mapper.dao.PreRuleConfigDao; -import com.casic.missiles.mapper.dao.RuleConfigDao; -import lombok.AllArgsConstructor; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.*; -import java.util.stream.Collectors; - -@Service -@AllArgsConstructor -public class RulerProvider { - - private final FieldConfigDao fieldConfigDao; - private final PreRuleConfigDao preRuleConfigDao; - private final RuleConfigDao ruleConfigDao; - - //根据前置字段的值,找到指定的规则 - //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 - //=>循环判断=>通过规则得到业务字段 - public RuleConfig ruleConfig(Map fixDataMap, String protocolId) { - //批量获取规则 - List preRuleConfigList = preRuleConfigDao.getPreRuleList(protocolId); - //获取固定字段 - Map fixFieldMap = getAllFieldMap(protocolId); - //获取前置规则字段 - final String preRuleFields = getPreRuleFields(preRuleConfigList, fixDataMap, fixFieldMap); - List ruleConfigList = ruleConfigDao.getRuleConfigById(protocolId); - Optional ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig ->preRuleFields.equals( ruleConfig.getParseRuleJson())).findFirst(); - //递归选定解析规则,进行规则解析 - while (!ObjectUtil.isEmpty(ruleConfigOptional) && !ruleConfigOptional.get().getIsBizField().equals("1")) { - String ruleFields = getRuleFields(ruleConfigOptional.get().getDataFieldIds().split(","), fixDataMap, fixFieldMap); - ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig -> ruleConfig.getParseRuleJson().equals(ruleFields)).findFirst(); - } - return ruleConfigOptional.get(); - } - - /** - * 获取前置规则解析字段 - */ - private String getPreRuleFields(List preRuleConfigList, Map fixDataMap, Map fixFieldMap) { - Map ruleFieldMap= new HashMap<>(); - preRuleConfigList.stream() - .forEach( - preRuleConfig -> { - String fieldName = fixFieldMap.get(Long.valueOf(preRuleConfig.getRuleFieldId())); - if (fixDataMap.containsKey(fieldName)) { - ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); - } - } - ); - return JSONObject.toJSONString(ruleFieldMap); - } - - private Map getAllFieldMap(String protocolId) { - List fieldList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Map fixFieldMap = fieldList.stream().collect( - Collectors.toMap(FieldConfig::getId, FieldConfig::getFieldName) - ); - return fixFieldMap; - } - - private String getRuleFields(String[] preRuleConfigList, Map fixDataMap, Map fixFieldMap) { - Map ruleFieldMap= new HashMap<>(); - for (String preRuleConfigId : preRuleConfigList) { - String fieldName = fixFieldMap.get(preRuleConfigId); - if (fixDataMap.containsKey(fieldName)) { - ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); - } - } - return JSONObject.toJSONString(ruleFieldMap); - } - - //弃置 - private String ListToString(List ruleFieldList) { - String ruleFields = ""; - for (String ruleField : ruleFieldList) { - ruleFields += ruleField + ","; - } - ruleFields = StringUtils.isEmpty(ruleFields) ? ruleFields : ruleFields.substring(0, ruleFields.length() - 1); - return ruleFields; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java index 6177e10..bfa87a5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java @@ -2,7 +2,7 @@ public interface SafeStrategy { - String decryption(byte[] bytes); + String decryption(String cipher); String encryption(String lightText); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java index 618716c..6236302 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java @@ -9,9 +9,9 @@ //十六进制的字符串转换成字节数组 byte[] bytes = hexStrToBinaryStr(msg); //计算CRC8 - byte crc8 = CRC8(bytes, 0, bytes.length); - String crc8ToStr = "" + Integer.toHexString(0xff & crc8); - return crc8ToStr; +// String crc8ToStr = "" + Integer.toHexString(0xff & crc8); +// return crc8ToStr; + return null; } /** @@ -33,50 +33,5 @@ return bytes; } - /** - * CRC8 校验 多项式 x8+x2+x+1 - * - * @param b - * @param off - * @param len - * @return - */ - public static byte CRC8(final byte[] b, final int off, final int len) { - byte result = 0x00; - for (int i = 0; i < len; i++) { - result = CHECKSUM_TABLE[(result ^ (b[i + off] & 0xFF)) & 0xFF]; - } - return (byte) (result & 0xFFL); - } - - private final static byte[] CHECKSUM_TABLE = {(byte) 0x00, (byte) 0x07, (byte) 0x0e, (byte) 0x09, (byte) 0x1c, (byte) 0x1b, - (byte) 0x12, (byte) 0x15, (byte) 0x38, (byte) 0x3f, (byte) 0x36, (byte) 0x31, (byte) 0x24, (byte) 0x23, (byte) 0x2a, - (byte) 0x2d, (byte) 0x70, (byte) 0x77, (byte) 0x7e, (byte) 0x79, (byte) 0x6c, (byte) 0x6b, (byte) 0x62, (byte) 0x65, - (byte) 0x48, (byte) 0x4f, (byte) 0x46, (byte) 0x41, (byte) 0x54, (byte) 0x53, (byte) 0x5a, (byte) 0x5d, (byte) 0xe0, - (byte) 0xe7, (byte) 0xee, (byte) 0xe9, (byte) 0xfc, (byte) 0xfb, (byte) 0xf2, (byte) 0xf5, (byte) 0xd8, (byte) 0xdf, - (byte) 0xd6, (byte) 0xd1, (byte) 0xc4, (byte) 0xc3, (byte) 0xca, (byte) 0xcd, (byte) 0x90, (byte) 0x97, (byte) 0x9e, - (byte) 0x99, (byte) 0x8c, (byte) 0x8b, (byte) 0x82, (byte) 0x85, (byte) 0xa8, (byte) 0xaf, (byte) 0xa6, (byte) 0xa1, - (byte) 0xb4, (byte) 0xb3, (byte) 0xba, (byte) 0xbd, (byte) 0xc7, (byte) 0xc0, (byte) 0xc9, (byte) 0xce, (byte) 0xdb, - (byte) 0xdc, (byte) 0xd5, (byte) 0xd2, (byte) 0xff, (byte) 0xf8, (byte) 0xf1, (byte) 0xf6, (byte) 0xe3, (byte) 0xe4, - (byte) 0xed, (byte) 0xea, (byte) 0xb7, (byte) 0xb0, (byte) 0xb9, (byte) 0xbe, (byte) 0xab, (byte) 0xac, (byte) 0xa5, - (byte) 0xa2, (byte) 0x8f, (byte) 0x88, (byte) 0x81, (byte) 0x86, (byte) 0x93, (byte) 0x94, (byte) 0x9d, (byte) 0x9a, - (byte) 0x27, (byte) 0x20, (byte) 0x29, (byte) 0x2e, (byte) 0x3b, (byte) 0x3c, (byte) 0x35, (byte) 0x32, (byte) 0x1f, - (byte) 0x18, (byte) 0x11, (byte) 0x16, (byte) 0x03, (byte) 0x04, (byte) 0x0d, (byte) 0x0a, (byte) 0x57, (byte) 0x50, - (byte) 0x59, (byte) 0x5e, (byte) 0x4b, (byte) 0x4c, (byte) 0x45, (byte) 0x42, (byte) 0x6f, (byte) 0x68, (byte) 0x61, - (byte) 0x66, (byte) 0x73, (byte) 0x74, (byte) 0x7d, (byte) 0x7a, (byte) 0x89, (byte) 0x8e, (byte) 0x87, (byte) 0x80, - (byte) 0x95, (byte) 0x92, (byte) 0x9b, (byte) 0x9c, (byte) 0xb1, (byte) 0xb6, (byte) 0xbf, (byte) 0xb8, (byte) 0xad, - (byte) 0xaa, (byte) 0xa3, (byte) 0xa4, (byte) 0xf9, (byte) 0xfe, (byte) 0xf7, (byte) 0xf0, (byte) 0xe5, (byte) 0xe2, - (byte) 0xeb, (byte) 0xec, (byte) 0xc1, (byte) 0xc6, (byte) 0xcf, (byte) 0xc8, (byte) 0xdd, (byte) 0xda, (byte) 0xd3, - (byte) 0xd4, (byte) 0x69, (byte) 0x6e, (byte) 0x67, (byte) 0x60, (byte) 0x75, (byte) 0x72, (byte) 0x7b, (byte) 0x7c, - (byte) 0x51, (byte) 0x56, (byte) 0x5f, (byte) 0x58, (byte) 0x4d, (byte) 0x4a, (byte) 0x43, (byte) 0x44, (byte) 0x19, - (byte) 0x1e, (byte) 0x17, (byte) 0x10, (byte) 0x05, (byte) 0x02, (byte) 0x0b, (byte) 0x0c, (byte) 0x21, (byte) 0x26, - (byte) 0x2f, (byte) 0x28, (byte) 0x3d, (byte) 0x3a, (byte) 0x33, (byte) 0x34, (byte) 0x4e, (byte) 0x49, (byte) 0x40, - (byte) 0x47, (byte) 0x52, (byte) 0x55, (byte) 0x5c, (byte) 0x5b, (byte) 0x76, (byte) 0x71, (byte) 0x78, (byte) 0x7f, - (byte) 0x6a, (byte) 0x6d, (byte) 0x64, (byte) 0x63, (byte) 0x3e, (byte) 0x39, (byte) 0x30, (byte) 0x37, (byte) 0x22, - (byte) 0x25, (byte) 0x2c, (byte) 0x2b, (byte) 0x06, (byte) 0x01, (byte) 0x08, (byte) 0x0f, (byte) 0x1a, (byte) 0x1d, - (byte) 0x14, (byte) 0x13, (byte) 0xae, (byte) 0xa9, (byte) 0xa0, (byte) 0xa7, (byte) 0xb2, (byte) 0xb5, (byte) 0xbc, - (byte) 0xbb, (byte) 0x96, (byte) 0x91, (byte) 0x98, (byte) 0x9f, (byte) 0x8a, (byte) 0x8d, (byte) 0x84, (byte) 0x83, - (byte) 0xde, (byte) 0xd9, (byte) 0xd0, (byte) 0xd7, (byte) 0xc2, (byte) 0xc5, (byte) 0xcc, (byte) 0xcb, (byte) 0xe6, - (byte) 0xe1, (byte) 0xe8, (byte) 0xef, (byte) 0xfa, (byte) 0xfd, (byte) 0xf4, (byte) 0xf3}; } \ No newline at end of file diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java index 27c2838..6e078a3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java @@ -1,9 +1,6 @@ package com.casic.missiles.parser.safe.impl; -import cn.hutool.core.util.CharsetUtil; -import cn.hutool.crypto.symmetric.SM4; -import cn.hutool.crypto.symmetric.SymmetricCrypto; - +import com.casic.missiles.parser.safe.SafeStrategy; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; @@ -11,19 +8,44 @@ import org.bouncycastle.crypto.engines.SM4Engine; import org.bouncycastle.crypto.params.KeyParameter; import org.bouncycastle.util.encoders.Hex; - -import static cn.hutool.crypto.Mode.ECB; -import static cn.hutool.crypto.Padding.NoPadding; +import org.springframework.stereotype.Component; /** * SM4算法工具类 */ @Slf4j -public class Sm4 { +@Component("sm4") +public class Sm4 implements SafeStrategy { //加解密的字节快大小 public static final int BlockSize = 16; + @Override + public String decryption(String cipher) { + byte[] keyByte = { + 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 + }; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(keyByte); + byte[] in = Hex.decode(cipher); + byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); + String plain = EcbDecrypt(in, keyBytes); + return plain; + } + + @Override + public String encryption(String cipher) { + byte[] keyByte = { + 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 + }; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(keyByte); + byte[] in = Hex.decode(cipher); + byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); + String plain = EcbDecrypt(in, keyBytes); + return plain; + } + /** * SM4ECB加密算法,对内 * @@ -32,8 +54,6 @@ * @return */ private static byte[] ecb_encrypt(byte[] in, byte[] keyBytes) { - - SM4Engine sm4Engine = new SM4Engine(); sm4Engine.init(true, new KeyParameter(keyBytes)); byte[] out = new byte[in.length]; @@ -58,27 +78,6 @@ return cipher; } - - /** - * hutool 解密SM4 - * - * @param encodeContent - * @return - */ - public static String decode(String encodeContent) { - String key = "24ad182507479a5da3ad94d9d78ea203"; - try { - SymmetricCrypto sm4 = new SM4(ECB, NoPadding, key.getBytes()); - String decryptStr = sm4.decryptStr(encodeContent, CharsetUtil.CHARSET_UTF_8); - return decryptStr; - } catch (Exception e) { - e.printStackTrace(); - log.error("SM4解密失败"); - } - return null; - } - - /** * SM4的ECB加密算法 * @@ -129,20 +128,6 @@ return plain; } - /** - * SM4的ECB解密算法 - * - * @param cipher 输入的密文字符串 - * @param key 密钥 - * @return - */ - public static String EcbDecrypt(String cipher, String key) { - byte[] in = Hex.decode(cipher); - byte[] keyBytes = Hex.decode(key); - - String plain = EcbDecrypt(in, keyBytes); - return plain; - } /** * 主函数 @@ -151,28 +136,24 @@ */ public static void main(String[] args) { byte[] ciphertext = { + 0x4B, (byte) 0x8C, (byte) 0x9D, 0x08, (byte) 0xE4, (byte) 0xD3, 0x64, 0x42, (byte) 0xB9, (byte) 0xA5, (byte) 0xFE, (byte) 0xCD, (byte) 0x91, 0x1B, 0x38, (byte) 0xAC, (byte) 0xE9, 0x1C, (byte) 0xCD, 0x53, 0x02, (byte) 0xD7, 0x0C, (byte) 0x9B, (byte) 0x96, 0x30, 0x62, (byte) 0xE8, (byte) 0xFB, (byte) 0xEF, (byte) 0xB9, (byte) 0xFF, (byte) 0xDE, 0x19, (byte) 0x80, 0x35, 0x3E, (byte) 0x90, 0x4F, 0x2F, 0x12, 0x2B, 0x19, (byte) 0x8B, 0x6C, 0x7A, (byte) 0x85, (byte) 0xA1, (byte) 0xB1, (byte) 0x86, (byte) 0xA3, 0x7A, 0x46, 0x0C, 0x2F, (byte) 0x94, 0x4F, 0x7F, 0x2C, 0x56, 0x14, (byte) 0xF3, (byte) 0x89, (byte) 0xC3, - 0x3F, 0x20, (byte) 0xF9, (byte) 0x87, (byte) 0xA1, 0x60, (byte) 0xD9, (byte) 0xA8, (byte) 0xFD, (byte) 0xD7, (byte) 0x9B, 0x4B, 0x26, 0x06, 0x30, 0x44}; + 0x3F, 0x20, (byte) 0xF9, (byte) 0x87, (byte) 0xA1, 0x60, (byte) 0xD9, (byte) 0xA8, (byte) 0xFD, (byte) 0xD7, (byte) 0x9B, 0x4B, 0x26, 0x06, 0x30, 0x44 + }; ByteBuf in = ByteBufAllocator.DEFAULT.heapBuffer(); in.writeBytes(ciphertext); - byte[] keyByte = { 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 }; ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); - key.writeBytes(ciphertext); - String resCipherData = decode(ByteBufUtil.hexDump(in)); - ByteBuf out = ByteBufAllocator.DEFAULT.heapBuffer(); -// out.writeBytes(resCipherData); -// System.out.println(hexBytes); - System.out.println(resCipherData.toString()); -// String resPlainData = EcbDecrypt(resCipherData, key); -// System.out.println("原始明文:" + data); -// System.out.println("解密后明文:" + resPlainData); + key.writeBytes(keyByte); +// String resCipherData = EcbDecrypt(ByteBufUtil.hexDump(in), ByteBufUtil.hexDump(key)); +// System.out.println(resCipherData); } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java index 1395a51..ac5f957 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java @@ -1,7 +1,7 @@ package com.casic.missiles.parser.safe.impl; import io.netty.buffer.ByteBufUtil; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** *

@@ -14,9 +14,8 @@ * @author hyl * @version v1.0: Tea.java, v 0.1 2021/3/12 13:48 $ */ -@Service("tea") -///tea算法类 - +//tea算法类 +@Component("tea") public class Tea { public static byte[] MyTea_Encrypt(byte[] MyTeaContent, int ByteLen, byte[] MyTeakey) { @@ -99,7 +98,6 @@ // for(int i32Index = 0; i32Index < 8; i32Index++) { // System.out.print("0x" + Integer.toHexString(MyContent[i32Index]) + " "); // } - // System.out.println("密钥为:"); // for(int i32Index = 0; i32Index < 16; i32Index++) { // System.out.print("0x" + Integer.toHexString(MyKeys[i32Index]) + " "); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java index bdd0721..bd1516a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java @@ -3,7 +3,7 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.parser.sender.DataSubscribeProvider; import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponents; import org.springframework.web.util.UriComponentsBuilder; @@ -12,7 +12,7 @@ import java.util.Collections; import java.util.Map; -@Service("functionCallback") +@Component("functionCallback") public class FunctionCallback implements DataSubscribeProvider { @Resource diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java index 0b44fb9..7526de2 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.Map; -@Service("middleware") +@Component("middleware") public class MiddlewareSubscribe implements DataSubscribeProvider { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java index 5dcee3f..e2f1192 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.Map; -@Service("nosql") +@Component("nosql") public class NoSqlSubscribe implements DataSubscribeProvider { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java b/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java new file mode 100644 index 0000000..81a5324 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java @@ -0,0 +1,86 @@ +package com.casic.missiles.pojo; + +import lombok.Data; + +/** + * 协议 + */ +@Data +public class Msg { + + /** + * 前导码 + */ + private String preamble; + + /** + * 版本号 + */ + private String version; + + /** + * 内容长度 + */ + private int leng; + + /** + * 设备ID + */ + private String deviceId; + + /** + * 通讯方式 + */ + private Integer connType; + + /** + * 加密方式 + */ + private Integer encryType; + + /** + * 目标地址 + */ + private String destAddr; + + /** + * PDUType + */ + private String PDUType; + + /** + * 操作类型 + */ + private Integer operateType; + + /** + * 传输控制位 PDUType.bit7=0时,表示存在后续的访问;当PDUType.bit7=1时,表示无后续的访问。 + */ + private Integer transControlFlag; + + /** + * 设备类型 + */ + private Integer deviceType; + + /** + * 序号 + */ + private Integer seq; + + /** + * tagList + */ + private String tagList; + + /** + * OidList + */ + private String OidList; + + /** + * CRC + */ + private String CRC; + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java index 40a5265..97cc984 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java @@ -40,7 +40,7 @@ String httpContent = msg.toString(Charset.defaultCharset()); log.info(" String : " + msg.toString(Charset.defaultCharset())); String majorContent = httpContent.substring(httpContent.indexOf("{"), httpContent.lastIndexOf("}") + 1); - String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("serviceData")).get("Value")); + String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("RegistryData")).get("Value")); log.info("----------------------------------" + values); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); bufferContent.writeBytes(values.getBytes(Charset.forName("ISO-8859-1"))); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java index 1b132a7..e3ced4b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java @@ -35,7 +35,7 @@ String httpContent = msg.toString(Charset.defaultCharset()); log.info(" String : " + msg.toString(Charset.defaultCharset())); String majorContent = httpContent.substring(httpContent.indexOf("{"), httpContent.lastIndexOf("}") + 1); - String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("serviceData")).get("Value")); + String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("RegistryData")).get("Value")); log.info("----------------------------------" + values); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); bufferContent.writeBytes(values.getBytes(Charset.forName("ISO-8859-1"))); diff --git a/sensorhub-core/src/main/resources/application.properties b/sensorhub-core/src/main/resources/application.properties deleted file mode 100644 index 8b13789..0000000 --- a/sensorhub-core/src/main/resources/application.properties +++ /dev/null @@ -1 +0,0 @@ - diff --git a/sensorhub-core/src/main/resources/config/application-dev.yml b/sensorhub-core/src/main/resources/config/application-dev.yml index 4f897a8..dcc4c2d 100644 --- a/sensorhub-core/src/main/resources/config/application-dev.yml +++ b/sensorhub-core/src/main/resources/config/application-dev.yml @@ -4,9 +4,9 @@ spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true + url: jdbc:mysql://127.0.0.1:3306/sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true username: root - password: Casic203 + password: root session: store-type: redis redis: diff --git a/sensorhub-core/src/main/resources/config/application.yml b/sensorhub-core/src/main/resources/config/application.yml index ae89f9d..7965da1 100644 --- a/sensorhub-core/src/main/resources/config/application.yml +++ b/sensorhub-core/src/main/resources/config/application.yml @@ -30,6 +30,13 @@ port: 6379 password: ew5T4K3#203lwh config-prefix: 'Casic:' +#代码生成器配置 +code: + generate: + #作者 + author: cz + #待生成对象表名 + table-name: bussiness_field_config,combined_field_config sensorhub: config: port: 7091 diff --git a/sensorhub-support/pom.xml b/sensorhub-support/pom.xml index 9a71296..761601c 100644 --- a/sensorhub-support/pom.xml +++ b/sensorhub-support/pom.xml @@ -42,6 +42,12 @@ ${redis.version} + + com.baomidou + mybatis-plus-generator + ${mybatis-plus-generator.version} + + org.reflections diff --git a/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java b/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java new file mode 100644 index 0000000..515ca53 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java @@ -0,0 +1,14 @@ +package com.casic.missiles.enums; + +/** + * @author + * @date + */ +public interface FixedPropertyEnum { + + String FIXED_POSITION = "fixedPosition"; + + String TOTAL_LENGTH = "totalLength"; + + String TAIL_POSITION = "tailPosition"; +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/CombinedFieldMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CombinedFieldMapper.java new file mode 100644 index 0000000..38e8f42 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CombinedFieldMapper.java @@ -0,0 +1,15 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.CombinedFieldConfig; +import org.apache.ibatis.annotations.Mapper; + +/** + * @author cz + * + */ +@Mapper +public interface CombinedFieldMapper extends BaseMapper { + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java new file mode 100644 index 0000000..128b09d --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java @@ -0,0 +1,10 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.CommandEventConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface CommandEventMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java new file mode 100644 index 0000000..042eb3c --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.DatagramEventConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface DatagramEventConfigMapper extends BaseMapper { +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java new file mode 100644 index 0000000..fc95cf4 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java @@ -0,0 +1,8 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.FieldConfig; + +public interface FieldConfigMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldRuleConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldRuleConfigMapper.java new file mode 100644 index 0000000..b310a08 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldRuleConfigMapper.java @@ -0,0 +1,10 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.FieldRuleConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface FieldRuleConfigMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java new file mode 100644 index 0000000..9060a69 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.ProtocolConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface ProtocolConfigMapper extends BaseMapper { +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolFieldConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolFieldConfigMapper.java new file mode 100644 index 0000000..1b47180 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolFieldConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +public interface ProtocolFieldConfigMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java new file mode 100644 index 0000000..6fa6936 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.RuleConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface RuleConfigMapper extends BaseMapper { +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/AbstractFieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/AbstractFieldConfig.java new file mode 100644 index 0000000..ba9aea2 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/AbstractFieldConfig.java @@ -0,0 +1,38 @@ +package com.casic.missiles.pojo; + +import lombok.Data; + +@Data +public class AbstractFieldConfig { + /** + * 字段名称 + */ + private String fieldName; + /** + * 按照字段评估进行字段解析 + */ + private String ruleJson; + /** + * 起始位置(单位byte) + */ + private Integer OriginPositionByte; + /** + * 起始位置,是否需要bit位置(单位bit)小于8, 没有不需要填写 + */ + private String OriginPositionBit; + /** + * 偏移长度 + */ + private Integer offsetLength; + /** + * 偏移单位(bit/byte) + */ + private String offsetUnit; + /** + * 是否需要转存 + */ + private Integer isStorage; + + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/CombinedFieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/CombinedFieldConfig.java new file mode 100644 index 0000000..4f4de6a --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/CombinedFieldConfig.java @@ -0,0 +1,41 @@ +package com.casic.missiles.pojo; + +import lombok.Data; + +import java.util.Date; + +/** + * 组合配置 + * + * @author cz + * @date 20 + */ +@Data +public class CombinedFieldConfig { + + private Long id; + private Long ruleId; + /** + * 前缀编码 + */ + private String prefixCode; + + /** + * 字段动态的id + */ + private Long dynamicLengthId; + /** + * 对应的要解析字段的ids + */ + private String dataFieldIds; + + /** + * 字段动态的id + */ + private String combinedFieldIds; + + private Date lastTime; + + private Date createTime; + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldConfig.java index a07d20d..8304dc6 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldConfig.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldConfig.java @@ -5,31 +5,28 @@ import java.util.Date; +/** + * @author cz + * 1、该表与实际解析的内容实例解析有关 + * 2、该表字段是随机出现的,和帧结构无关,无法预料的 + * 3、该表字段解析根据FieldEvaluatorConfig进行字段解析 + */ @Data -@TableName("field_config") -public class FieldConfig { +@TableName("business_field_config") +public class FieldConfig extends AbstractFieldConfig { private Long id; -// private String preFieldConfig; - private Long protocolId; - - private String isFixed; - private String uploadDeliveryChange; - - private String replyRule; - private String ruleJson; - + /** + * 协议配置id + */ + private Long ruleId; + /** + * 字段名称 + */ private String fieldName; - private String isStorage; - private Integer orignPosition; - private String exactOrignPosition; - - private Integer offsetLength; - private String offsetUnit; private String ownerId; private Date createTime; private Date lastTime; - } diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldRuleConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldRuleConfig.java new file mode 100644 index 0000000..2e09879 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldRuleConfig.java @@ -0,0 +1,20 @@ +package com.casic.missiles.pojo; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +@TableName("field_rule_config") +@Data +public class FieldRuleConfig { + + private Long id; + private String name; + private String desc; + private String condition; + private String excuteOperation; + private Date lasTime; + private Date createTime; + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java index 608af3a..32cc8a4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java @@ -2,48 +2,47 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.delivery.decorator.ByteDecorator; +import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @AllArgsConstructor public class FieldDecoratorManger { - private final RuleDictDao ruleDictDao; + private final RuleConfigRegistry ruleDictDao; // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 // (1)静态的业务字段是字典里面可以配置的 // (2)动态的业务字段是通过规则生成的 public String contentMerge(String ruleJson, String sceneConent, String dynamicContent) { - List ruleDictList = ruleDictDao.getRuleDictConfig(); - Map ruleDictMap = ruleDictList.stream().collect( - Collectors.toMap(RuleDict::getId, e -> e)); - List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); - for (Map ruleMap : ruleMapList) { - String ruleType = String.valueOf(ruleMap.get("ruleType")); - ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); - NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); - byteDecorator.nodeDecoratorRule(nodeDecoratorParm); - } +// List ruleDictList = ruleDictDao.getRuleDictConfig(); +// Map ruleDictMap = ruleDictList.stream().collect( +// Collectors.toMap(RuleDict::getId, e -> e)); +// List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); +// for (Map ruleMap : ruleMapList) { +// String ruleType = String.valueOf(ruleMap.get("ruleType")); +// ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); +// NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); +// byteDecorator.nodeDecoratorRule(nodeDecoratorParm); +// } return null; } - - private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { - NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() - .contents(sceneConent) - .dynamicContent(dynamicContent) - .ruletypeId(ruletypeId) - .ruleDictMap(ruleDictMap) - .build(); - return nodeDecoratorParm; - } +// +// private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { +// NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() +// .contents(sceneConent) +// .dynamicContent(dynamicContent) +// .ruletypeId(ruletypeId) +// .ruleDictMap(ruleDictMap) +// .build(); +// return nodeDecoratorParm; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java index 652970c..b204ac3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java @@ -1,56 +1,56 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@AllArgsConstructor -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", - JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Component; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Component("logicalDecorator") +//@AllArgsConstructor +//@Slf4j +//public class LogicalShiftDecorator implements ByteDecorator { +// +//// private final FieldRuleEngineMapper fieldRuleEngineMapper; +//// +//// //字节位移 +//// @Override +//// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +//// String logicalValue = ""; +//// RuleEvaluator fieldRuleEngine = new RuleEvaluator(); +//// try { +//// Map env2 = new HashMap(); +//// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +//// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +//// for (String contentId : contentIdList) { +//// RuleDict ruleDict = ruleDictMap.get(contentId); +//// if (ruleDict.getCode().contains("#")) { +//// //使用动态的值 +//// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +//// } +//// env2.put(ruleDict.getName(), ruleDict.getCode()); +//// } +//// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +//// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +//// return null; +//// } +//// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +//// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +//// return values; +//// } catch (Exception ex) { +//// log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", +//// JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +//// return null; +//// } +//// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java index 346468f..822fead 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@AllArgsConstructor -@Slf4j -public class OperationDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("optionDecorator") +//@AllArgsConstructor +//@Slf4j +//public class OperationDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //混合运算,有常量或者乘除的缩放 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java index 50fb0a7..7a8bccb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@AllArgsConstructor -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +////精度计算 +//@AllArgsConstructor +//@Registry("precisionDecorator") +//@Slf4j +//public class PrecisionDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java index da39235..27f9cc7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java @@ -1,54 +1,53 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@AllArgsConstructor -@Slf4j -public class RuleDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("ruleDecorator") +//@AllArgsConstructor +//@Slf4j +//public class RuleDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //吃我一套正则表达式 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (Exception ex) { +// log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java index 7f5cbf3..c043f97 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java @@ -2,6 +2,6 @@ import java.util.Map; -public interface ComandeEventService { +public interface ComandeEventService{ Map loadComandeEventConfig(String protocolId,String scene); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java index 476ad84..aaf1837 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java @@ -2,46 +2,46 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.dao.CommandEventDao; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @Slf4j @AllArgsConstructor -public class ComandeEventServiceImpl implements ComandeEventService { +public class ComandeEventServiceImpl implements ComandeEventRegistry { - private final CommandEventDao commandEventDao; + // private final CommandEventDao commandEventDao; // 加密bean 固定字段出现变化的字段解析,业务字段的有序内容 @Override - public Map loadComandeEventConfig(String protocolId,String sceneName) { - CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); - if (ObjectUtil.isEmpty(commandEventConfig)) { - log.error("协议{},没有配置成功接收回复配置,清排查原因"); - return null; - } - String replyJson = commandEventConfig.getReplyContentJson(); - List> replyMapList = JSONArray.parseObject(replyJson, List.class); - List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); - Map fixMap = fixList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); - List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) - .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) - .collect(Collectors.toList()); - Map commandConfigMap = new HashMap<>(); - commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); - commandConfigMap.put("fixContent", fixMap); - commandConfigMap.put("bizContent", contentList); - return commandConfigMap; + public Map loadComandeEventConfig(String protocolId, String sceneName) { +// CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); +// if (ObjectUtil.isEmpty(commandEventConfig)) { +// log.error("协议{},没有配置成功接收回复配置,清排查原因"); +// return null; +// } +// String replyJson = commandEventConfig.getReplyContentJson(); +// List> replyMapList = JSONArray.parseObject(replyJson, List.class); +// List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); +// Map fixMap = fixList.stream() +// .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); +// List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) +// .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) +// .collect(Collectors.toList()); +// Map commandConfigMap = new HashMap<>(); +// commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); +// commandConfigMap.put("fixContent", fixMap); +// commandConfigMap.put("bizContent", contentList); +// return commandConfigMap; + return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 128b09d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java deleted file mode 100644 index 4016b0b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface DatagramEventMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java deleted file mode 100644 index 597c306..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.apache.ibatis.annotations.Mapper; - -public interface FieldConfigMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java deleted file mode 100644 index a31680a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.PreRuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface PreRuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java deleted file mode 100644 index 9060a69..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface ProtocolConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java deleted file mode 100644 index 6fa6936..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java deleted file mode 100644 index 582a705..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleDict; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleDictMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java deleted file mode 100644 index 6e302c8..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.CommandEventMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Optional; - -@Component -public class CommandEventDao { - - @Resource - private CommandEventMapper commandEventMapper; - - public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId) - .eq("scene", sceneName) - .eq("enabled", 1); - List commandEventConfig = commandEventMapper.selectList(queryWrapper); - Optional optionalEventConfig = commandEventConfig.stream().findFirst(); - return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java deleted file mode 100644 index 9137e4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.FieldConfigMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class FieldConfigDao { - - @Resource - private FieldConfigMapper fieldConfigMapper; - - public FieldConfig getFieldConfigById(String fieldId) { - FieldConfig fieldConfig = fieldConfigMapper.selectById(fieldId); - return fieldConfig; - } - - public List getFieldConfigs(String protocolId,Integer isFixed) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",isFixed); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - - public List getStorageFieldConfig(String protocolId) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",1) - .eq("is_storage",1); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java deleted file mode 100644 index 67bff6b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.mapper.PreRuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class PreRuleConfigDao { - - @Resource - private PreRuleConfigMapper preRuleConfigMapper; - - public List getPreRuleList(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return preRuleConfigMapper.selectList(queryWrapper); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java deleted file mode 100644 index d69ea85..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.RuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleConfigDao { - - @Resource - private RuleConfigMapper ruleConfigMapper; - - public RuleConfig getNextRuleConfig(String ruleFields) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("parse_rule_json", ruleFields); - return ruleConfigMapper.selectOne(queryWrapper); - } - - - public List getRuleConfigById(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return ruleConfigMapper.selectList(queryWrapper); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java deleted file mode 100644 index 932c185..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.RuleDictMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleDictDao { - - @Resource - private RuleDictMapper ruleDictMapper; - - public List getRuleDictConfig() { - List ruleDictList = ruleDictMapper.selectList(null); - return ruleDictList; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java index 9f9e279..43bc4d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java @@ -10,20 +10,15 @@ import io.netty.channel.socket.nio.NioServerSocketChannel; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import javax.annotation.PreDestroy; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static cn.hutool.core.util.ClassUtil.getClasses; /** * SensorhubServer netty服务端 */ @Slf4j -@Service +@Component public class SensorhubServer { /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java index 2c79ff5..9a28c36 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java @@ -11,13 +11,13 @@ import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioSocketChannel; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClient 客户端 */ @Slf4j -@Service +@Registry public final class SensorhubClient { public static void main(String[] args) throws Exception { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java index 9774be0..477c3f7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java @@ -6,12 +6,12 @@ import io.netty.channel.socket.SocketChannel; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientChannelInitialHandler */ -@Service +@Registry public class SensorhubClientChannelInitialHandler extends ChannelInitializer { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java index 346f4b3..73560e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java @@ -5,13 +5,13 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientHandler */ @Slf4j -@Service +@Registry public class SensorhubClientHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java index 5c1c6f2..d990af5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java @@ -4,12 +4,12 @@ import com.casic.missiles.pojo.Msg; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** * SensorhubServerHandler */ -@Service +@Component public class SensorhubServerHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 67283ae..af3172c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,41 +1,37 @@ package com.casic.missiles.parser; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultProtocolConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.*; +import com.casic.missiles.registry.FieldConfigRegistry; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; -import java.nio.charset.Charset; import java.util.HashMap; import java.util.List; import java.util.Map; -@Service("genericProtocolParser") +/** + * @author + */ +@Component("genericProtocolParser") @Slf4j -@AllArgsConstructor +@RequiredArgsConstructor public class GenericProtocolParser implements ProtocolParser { - private final LeadingCodeMatcher leadingCodeMatcher; private final List frameStructDispenserList; - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorInstanceSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; // 匹配首字母前导码=> 帧结构匹配前导码=> // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 @@ -44,18 +40,19 @@ public Boolean doParseProtocol(ByteBuf byteBuf) { String protocolContent = ByteBufUtil.hexDump(byteBuf); //匹配前导码 - List preCodeConfigs = leadingCodeMatcher.matchLeadingCode(protocolContent); + List preCodeConfigs = LeadingCodeMatcher.matchFrameLeadingCode(protocolContent); //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 if (preCodeConfigs.size() == 0) { - return rematch(byteBuf,protocolContent); + return rematch(byteBuf, protocolContent); } - //暂时先取第一个 + //暂时先取第一个,提升速度,使用享元模式, 减少类的创建销毁与构建 ProtocolConfig protocolConfig = preCodeConfigs.get(0); + AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); ByteBuf wholeDatagramByte = null; //通过匹配帧结构获取完整的数据包 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, preCodeConfigs.get(0))) != null) { + if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, protocolFactory)) != null) { break; } } @@ -68,76 +65,78 @@ * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 */ - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId, wholeDatagramByte); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap, protocolId); - //选取规则对应的流程实例 - DatagramEventConfig datagramEventConfig = processorInstanceSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); + //进行规则字段解析,进行匹配规则 + RuleConfig ruleConfig = getRuleConfig(protocolFactory, wholeDatagramByte); + if (ruleConfig == null) { + return false; + } //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, wholeDatagramByte); + ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte); + //以下进行业务的规则解析,同时选定流程实例 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); + DatagramEventProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain, + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText, protocolId); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain); //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); + datagramEventProvider.storeData(bizDataMap); return true; } - private Boolean rematch(ByteBuf byteBuf,String protocolContent) { + /** + * 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 + */ + private Boolean rematch(ByteBuf byteBuf, String protocolContent) { //重置位判断 byteBuf.resetReaderIndex(); //判断重置是否前移,如果没有前移,则直接判为匹配失败 if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { return false; } else { + //递归执行 return doParseProtocol(byteBuf); } } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; + //获取匹配规则->匹配规则 + private RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + //取出其中参与逻辑provider并判空 + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); + String rulePrepareFields = protocolConfig.getRulePrepareFields(); + //固定字段 + if (StringUtils.isNotEmpty(rulePrepareFields)) { + //获取统一固定字段解析 + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + //获取该协议的字段配置,用于协议规则匹配 + List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); + //获取规则 + RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, + rulePrepareFields, protocolFieldConfigs); + return ruleConfig; + } + return null; } - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + //数据构建,获取固定字段的store和业务字段store + private Map buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + Map bizDataMap = new HashMap<>(); + Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); + Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); + bizDataMap.putAll(ruleStoreObjectMap); + bizDataMap.putAll(protocolStoreObjectMap); return bizDataMap; } - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java index 8a46e32..16ce2e5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java @@ -3,6 +3,7 @@ import io.netty.buffer.ByteBuf; public interface ProtocolParser { + Boolean doParseProtocol(ByteBuf byteBuf); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java new file mode 100644 index 0000000..f7814af --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java @@ -0,0 +1,35 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.ProtocolConfigProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.ProtocolConfig; + +/** + * 存放基本协议的的加载信息 + */ +public class AbstractProtocolConfigFactory { + private final ProtocolConfigProvider protocolConfigProvider; + private final ProtocolFieldConfigProvider protocolFieldConfigProvider; + private final RuleConfigProvider ruleConfigProvider; + + public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { + this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); + this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); + this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); + } + + public ProtocolConfigProvider getProtocolConfigProvider() { + return protocolConfigProvider; + } + + public ProtocolFieldConfigProvider getProtocolFieldConfigProvider() { + return protocolFieldConfigProvider; + } + + public RuleConfigProvider getRuleConfigProvider() { + return ruleConfigProvider; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java new file mode 100644 index 0000000..6e36147 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java @@ -0,0 +1,57 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.CombinedFieldConfigProvider; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.FieldConfigProvider; +import com.casic.missiles.parser.provider.FieldRuleConfigProvider; + +/** + * 存放规则相关的的的加载信息 + */ +public class AbstractRuleConfigFactory { + + /** + * 处理字节 + */ + private final FieldConfigProvider fieldConfigProvider; + /** + * 处理组合字节解析的解码器 + */ + private final CombinedFieldConfigProvider combinedFieldConfigProvider; + /** + * 处理负责字节解析的规则配置 + */ + private final FieldRuleConfigProvider fieldRuleConfigProvider; + /** + * 处理实例流程 + */ + private final DatagramEventProvider datagramEventProvider; + + + public AbstractRuleConfigFactory(Long ruleId) { + this.fieldConfigProvider = new FieldConfigProvider(ruleId); + this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); + this.fieldRuleConfigProvider = new FieldRuleConfigProvider(ruleId); + this.datagramEventProvider = new DatagramEventProvider(ruleId); + } + + public FieldConfigProvider getFieldConfigProvider() { + return fieldConfigProvider; + } + + public CombinedFieldConfigProvider getCombinedFieldConfigProvider() { + return combinedFieldConfigProvider; + } + + public FieldRuleConfigProvider getFieldRuleConfigProvider() { + return fieldRuleConfigProvider; + } + + public DatagramEventProvider getDatagramEventProvider() { + return datagramEventProvider; + } + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java deleted file mode 100644 index 6e1719a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.factory; - - -import com.casic.missiles.pojo.ProtocolConfig; - -import java.util.List; - -/** - * 数据库访问优化(暂时未做) - *

- * 1、初始化协议解析配置,并存放到处存放缓存,对协议基本配置进行管理 - * 2、其中流程中所有的配置都经过此类进行管理,进行调用获取,增强解析速度 - */ -public interface DatagramFactory { - - /** - * 初始化 - */ - List datagramInit(); - - /** - * 根据前导码配置匹配,模糊匹配获取所有的报文项 - */ - List match(); - - /** - * 根据前导码匹配,返回报文项 - */ - List filer(); - - /** - * 保证数据的唯一性选择器 - */ - List selectOne(); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java new file mode 100644 index 0000000..87444a0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java @@ -0,0 +1,18 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +import java.util.List; + +/** + * 直接用,还是边用边创建 + */ +public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { + + + public DefaultProtocolConfigFactory(ProtocolConfig protocolConfig) { + super(protocolConfig); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java new file mode 100644 index 0000000..cce0c7c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java @@ -0,0 +1,12 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; + +public class DefaultRuleFactory extends AbstractRuleConfigFactory { + + public DefaultRuleFactory(Long ruleId) { + super(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java deleted file mode 100644 index 9ee97e0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.casic.missiles.parser.instance; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service -@Slf4j -@AllArgsConstructor -public class GeneralProcessor { - - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; - - /** - * 统一固定字段解析=>进行规则的查询的判断 - * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 - * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 - */ - @Deprecated - public boolean parseWholeDatagram(ByteBuf buffer, ProtocolConfig protocolConfig) { - try { - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap,protocolId); - //选取规则对应的流程= - DatagramEventConfig datagramEventConfig = processorSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); - //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); - //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); - //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); - //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); - //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); - return true; - } catch (Exception ex) { - log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", - ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); - return false; - } - } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; - } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); - } - - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); - return bizDataMap; - } - - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java index 25e7ad8..6a5777e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java @@ -1,23 +1,31 @@ package com.casic.missiles.parser.instance.impl; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.mapper.DatagramEventMapper; import com.casic.missiles.pojo.DatagramEventConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.SpringContextUtil; -@Service -@AllArgsConstructor +import java.util.List; +import java.util.Optional; + +/** + * @author cz + * + */ public class DefaultProcessorInstanceSelector implements ProcessorInstanceSelector { - private final DatagramEventMapper datagramEventMapper; + private static List datagramEventConfigs; + + static { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + datagramEventConfigs = datagramEventRegistry.getDatagramEventList(); + } @Override public DatagramEventConfig getProcessorInstance(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("rule_id", protocolId); - return datagramEventMapper.selectOne(queryWrapper); + Optional optionalSelectInstance = datagramEventConfigs.stream() + .filter(e -> e.getId().equals(protocolId)).limit(1).findFirst(); + return optionalSelectInstance.isPresent() ? optionalSelectInstance.get() : null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a778671..7b56a43 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,16 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import io.netty.buffer.ByteBuf; /** - * 分析匹配情况 - * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 - * 2、匹配不成功,有后续帧,可以进行下次匹配。 - * 3、匹配不成功,无后续帧,可以进行丢弃。 + * 分析匹配情况 + * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 + * 2、匹配不成功,有后续帧,可以进行下次匹配。 + * 3、匹配不成功,无后续帧,可以进行丢弃。 */ -public interface FrameStructMatcher{ +public interface FrameStructMatcher { - ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig); + ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 05320ab..8ebea78 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,23 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.ProtocolConfigMapper; +import com.casic.missiles.parser.provider.ProtocolConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Component; import java.util.List; import java.util.stream.Collectors; -@Component -@AllArgsConstructor public class LeadingCodeMatcher { - private final ProtocolConfigMapper protocolMapper; - //** 1、首字母匹配前导码, // 2、以匹配出的前导码是否在报文中条件进行前导码的匹配二次筛选 - public List matchLeadingCode(String protocolContent){ + public static List matchFrameLeadingCode(String protocolContent){ List initialConfigs = initialMatch(protocolContent); List preCodeConfigs = initialConfigs.stream() .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) @@ -26,13 +19,16 @@ } //初始化匹配前导码内容 - private List initialMatch(String protocolContent) { - String protocolStr = protocolContent.charAt(0) + ""; - QueryWrapper queryWrapper = new QueryWrapper() - .likeRight("pre_fix", protocolStr); - List protocolConfigList = protocolMapper.selectList(queryWrapper); - return protocolConfigList; + private static List initialMatch(String protocolContent) { + String firstFrameChar = protocolContent.charAt(0) + ""; + ProtocolConfigProvider protocolConfigProvider=new ProtocolConfigProvider(firstFrameChar); + return protocolConfigProvider.getMatchList(); } + + + + + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index cf2113d..e915877 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -1,32 +1,35 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(0) -@Service +@Component public class FrameLengthMatcher implements FrameStructMatcher { - @Autowired - private FieldParser fieldParser; - //超过长度 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { String dataGramContent = ByteBufUtil.hexDump(byteBuf); - if (StringUtils.isEmpty(protocolConfig.getUnpackId()) && StringUtils.isEmpty(protocolConfig.getTailStr())) { - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + //当不存在结尾标志和拆包标志,可以直接使用长度进行匹配 + if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { if (dataGramContent.length() >= totalLength) {//等于长度返回true,超出长度,切断 - ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, protocolConfig, totalLength); + ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, totalLength); return wholeDatagramByte; } else { //读的标志位前移舍弃 @@ -38,7 +41,7 @@ return null; } - private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, Integer totalLength) { byteBuf.readBytes(totalLength); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, totalLength - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 2bfc213..d527ad0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; @@ -13,7 +13,7 @@ import lombok.AllArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.nio.charset.Charset; import java.util.Map; @@ -22,32 +22,30 @@ * 后续标志验证 */ @Order(1) -@Service +@Component @AllArgsConstructor -public class FrameMarkMatcher implements FrameStructMatcher { - - private final FieldConfigDao fieldConfigDao; - private final FieldParser fieldParser; - private final FieldResolver fieldResolverManger; +public class FrameMarkMatcher implements FrameStructMatcher, FixedPropertyEnum { //帧后续标志=>结束,进行帧的重组=>有后续,1、帧移位判别 2、继续接收帧 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig UnpackConfig = StringUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getUnpackId()); - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); - Integer upback = 0; + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); ByteBuf mergeWholeFrameByte = null; - if (!ObjectUtil.isEmpty(UnpackConfig)) { - while (hasNextFullFrame(byteBuf, protocolConfig)) { - upback = (Integer) fieldResolverManger.filedParserManger(byteBuf, UnpackConfig, null); + if (!ObjectUtil.isEmpty(unpackFlag)) { + while (hasNextFullFrame(byteBuf, protocolConfig, protocolFieldConfigProvider)) { //是否存在后续位 - if (upback == 1) {//使用esayRule + if (unpackFlag == 1) {//使用esayRule //表示可以截取 - mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolConfig, totalLength); + mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolFieldConfigProvider, protocolConfig); return mergeWholeFrameByte; } else { - byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig)); + byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig, protocolFieldConfigProvider)); } } } @@ -56,7 +54,8 @@ //选取第一个帧,将业务内容和后面部分分开 //计算数据报文-业务内容 - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolFieldConfigProvider protocolFieldConfigProvider, ProtocolConfig protocolConfig) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); //截取完整报文 byteBuf.readBytes(totalLength); ByteBuf byteBufContent = byteBuf.slice(0, byteBuf.readerIndex()); @@ -68,15 +67,15 @@ String tail = ""; System.out.println(ByteBufUtil.hexDump(byteBufContent)); //会存在多个帧拼接在一起的的情况,进行合并处理 - while (hasNextFullFrame(byteBufContent, protocolConfig)) { - Integer currentFrameLength = fieldParser.getTotalLength(protocolConfig, byteBufContent); + while (hasNextFullFrame(byteBufContent, protocolConfig, protocolFieldConfigProvider)) { + Integer currentFrameLength = protocolFieldConfigProvider.getTotalLength(byteBufContent, protocolConfig); byteBufContent.readBytes(currentFrameLength); ByteBuf currentbyteBuf = byteBufContent.slice(0, byteBufContent.readerIndex()); byteBufContent.markReaderIndex();//读的标志位前移 System.out.println(ByteBufUtil.hexDump(byteBufContent)); String hexDump = currentbyteBuf.toString(Charset.forName("ISO-8859-1")); //获取当前固定帧结构的关系map - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, currentbyteBuf); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(currentbyteBuf, protocolConfig); if (StringUtils.isEmpty(mergeFrameStr)) { //首次获取业务数据报文 mergeFrameStr += hexDump.substring(0, currentFrameFixedProperty.get("tailPosition")); @@ -95,22 +94,22 @@ /** * 获取平移到下一帧起始位置 */ - public int getNextFrameOffset(ByteBuf buffer, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, buffer); - return currentFrameFixedProperty.get("totalLength"); + public int getNextFrameOffset(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + return currentFrameFixedProperty.get(TOTAL_LENGTH); } /** * 判断是否出错进行整个帧的 */ - public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, byteBuf); + public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); //保证读取位置不在固定位置,是可变的业务内容 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("fixedPosition")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(FIXED_POSITION)) { return false; } //判断读取是否操作帧长度 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("totalLength")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(TOTAL_LENGTH)) { return false; } return true; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 76a3784..c3a1bab 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -1,50 +1,50 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.parser.instance.GeneralProcessor; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; +import io.netty.buffer.ByteBufUtil;; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(2) -@Service +@Component public class FrameTailMatcher implements FrameStructMatcher { - @Resource - private FieldConfigDao fieldConfigDao; - @Autowired - private GeneralProcessor generalProcessor; - //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig tailFieldConfig = StringUtils.isEmpty(protocolConfig.getTailStr()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getTailStr()); - if (!ObjectUtil.isEmpty(tailFieldConfig)) { - String tailStr = tailFieldConfig.getFieldName(); + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfig protocolFieldConfig = ObjectUtils.isEmpty(protocolConfig.getTailStr()) ? null : + fieldConfigProvider.getFieldConfigById(protocolConfig.getTailStr()); + if (!ObjectUtil.isEmpty(protocolFieldConfig)) { + String tailStr = protocolFieldConfig.getFieldName(); String dataGramContent = ByteBufUtil.hexDump(byteBuf); Boolean tailFlag = ByteBufUtil.hexDump(byteBuf).contains(tailStr); if (!tailFlag) { //使用esayRule return null; } else if (dataGramContent.indexOf(tailStr) < dataGramContent.length() - tailStr.length()) { Integer length = dataGramContent.indexOf(tailStr) + tailStr.length(); - ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, protocolConfig, length); + ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, length); return wholeDatagramByte; //存在粘包 } } return null; } - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer length) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, Integer length) { byteBuf.readBytes(length); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, length - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java new file mode 100644 index 0000000..5f1c177 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java @@ -0,0 +1,73 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.combined.GenericCombinedFieldResolver; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.CombinedFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class CombinedFieldConfigProvider { + + + /** + * 作为临时配置列表缓存使用 + */ + private final List combinedFieldConfigList; + private Map storeObjectMap = new HashMap<>(); + + public CombinedFieldConfigProvider(Long ruleId) { + CombinedFieldConfigRegistry combinedFieldConfigRegistry = SpringContextUtil.getBean(CombinedFieldConfigRegistry.class); + combinedFieldConfigList = combinedFieldConfigRegistry.getCombinedFieldConfigList(ruleId); + } + + public void parseDataField(RuleConfig ruleConfig, String clearZeroPlain,Map fieldConfigsMap ) { + if (showSkip()) { + return; + } + //匹配对应的数据,然后进行相关的字段解析 + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver(); + combinedFieldResolver.parseDataField(combinedFieldConfigList, byteBuf, storeObjectMap,fieldConfigsMap); + } + + + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getCombinedFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return combinedFieldConfigList.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public List getCombinedFieldConfigList() { + return combinedFieldConfigList; + } + + /* 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(combinedFieldConfigList) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java new file mode 100644 index 0000000..f3cfedc --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java @@ -0,0 +1,11 @@ +package com.casic.missiles.parser.provider; + +/** + * @author cz + * @date 2023-6-12 + */ +public class CommandEventProvider{ + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java new file mode 100644 index 0000000..70eec5e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java @@ -0,0 +1,77 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.safe.SafeStrategy; +import com.casic.missiles.parser.sender.DataSubscribeProvider; +import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class DatagramEventProvider { + + private final DatagramEventConfig processorInstance; + + public DatagramEventProvider(Long ruleId) { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + List datagramEventConfigList = + datagramEventRegistry.getDatagramEventList(ruleId); + processorInstance = this.getProcessorInstance(datagramEventConfigList); + } + + public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { + if (showSkip()) { + return null; + } + return datagramEventConfigList.get(0); + } + + // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 + public String getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap) { + String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? + processorInstance.getSafeBean() : + fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); + if (!StringUtils.isEmpty(safeName)) { + //需要加密 + SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); + String plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); + return clearComplementZero(plain); + } + return ByteBufUtil.hexDump(bizDataContent); + } + + //解密清零操作 + private String clearComplementZero(String plain) { + plain = plain.substring(0, plain.lastIndexOf("00")); + return plain; + } + + //数据发送,数据发送者暂未构建 + public void storeData(Map bizDataMap) { + DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); +// dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return ObjectUtils.isNotEmpty(processorInstance) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java new file mode 100644 index 0000000..7e1fe0a --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java @@ -0,0 +1,97 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.FieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class FieldConfigProvider { + + + private final List fieldConfigs; + private Map storeObjectMap = new HashMap<>(); +// private Map singleObjects = new ConcurrentHashMap<>(); + + public FieldConfigProvider(Long ruleId) { + FieldConfigRegistry fieldConfigRegistry = SpringContextUtil.getBean(FieldConfigRegistry.class); + fieldConfigs = fieldConfigRegistry.getFieldConfigList(ruleId); + } + + public List getFieldConfigs() { + return fieldConfigs; + } + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public Map parseDataField(RuleConfig ruleConfig, String clearZeroPlain) { + if (showSkip()) { + return null; + } + List prepareFieldConfig = prepareParseField(ruleConfig); + if (CollectionUtils.isNotEmpty(prepareFieldConfig)) { + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(fieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + return fixDataMap; + } + } + return null; + } + + /** + * 得到需要处理的业务内容 + * + * @return + */ + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return fieldConfigs.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public Map getFieldConfigsMap() { + return fieldConfigs.stream().collect( + Collectors.toMap(FieldConfig::getId, e -> e) + ); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(fieldConfigs) ? false : true; + } + + +} + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java new file mode 100644 index 0000000..817bfaf --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java @@ -0,0 +1,19 @@ +package com.casic.missiles.parser.provider; + +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.registry.FieldRuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; + +public class FieldRuleConfigProvider { + + private final List fieldRuleConfigList; + + public FieldRuleConfigProvider(Long ruleId) { + FieldRuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(FieldRuleConfigRegistry.class); + fieldRuleConfigList = ruleConfigRegistry.getFieldRuleConfigList(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java new file mode 100644 index 0000000..99a1b06 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java @@ -0,0 +1,53 @@ +package com.casic.missiles.parser.provider; + + +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.registry.ProtocolConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolConfigProvider { + + private final List protocolConfigList; + + public ProtocolConfigProvider(String firstChar) { + ProtocolConfigRegistry registry = SpringContextUtil.getBean(ProtocolConfigRegistry.class); + protocolConfigList = registry.getProtocolConfigList(firstChar); + } + + public List getMatchList() { + return protocolConfigList; + } + + /** + * 设置当前协议 + * + * @param protocolConfig + */ + public ProtocolConfigProvider(ProtocolConfig protocolConfig) { + List protocolConfigs = new ArrayList<>(); + protocolConfigs.add(protocolConfig); + protocolConfigList = protocolConfigs; + } + + /** + * 获取当前协议 + * + * @return + */ + public ProtocolConfig getCurrentProtocolConfig() { + if (this.protocolConfigList == null) { + return null; + } else { + return protocolConfigList.get(0); + } + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java new file mode 100644 index 0000000..043927d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java @@ -0,0 +1,213 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.registry.ProtocolFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolFieldConfigProvider { + + private static final String FIXED_FIELD_DS = "fixedFieldDs"; + private static final String CONTENT_FIELD_DS = "contentFieldDs"; + private static final String PROTOCOL_LENGTH = "protocolLength"; + private static final String PROTOCOL_FIELD_ID = "protocolFieldId"; + private static final String PROTOCOL_POSITION = "protocolPosition"; + + private final List protocolFieldConfigs; + private Map singleObjects = new ConcurrentHashMap<>(); + private Map storeObjectMap = new HashMap<>(); + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public ProtocolFieldConfigProvider(Long protocolId) { + ProtocolFieldConfigRegistry protocolFieldConfigRegistry = SpringContextUtil.getBean(ProtocolFieldConfigRegistry.class); + protocolFieldConfigs = protocolFieldConfigRegistry.getProtocolFieldConfigList(protocolId); + } + + public List getProtocolFieldConfigs() { + return protocolFieldConfigs; + } + + public ProtocolFieldConfig getFieldConfigById(Long fieldId) { + Optional optionalConfig = protocolFieldConfigs.stream().filter( + e -> e.getId().equals(fieldId) + ).findFirst(); + return optionalConfig.isPresent() ? optionalConfig.get() : null; + } + + public Integer getProtocolFieldValue(Long protocolFieldId, ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_FIELD_ID + protocolFieldId + ByteBufUtil.hexDump(byteBuf); + //获取缓存 + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + //加载固定长度数据集合 + Map fixDataMap = this.getProtocolDataMap(byteBuf); + ProtocolFieldConfig protocolFieldConfig = selectFieldConfig(protocolFieldId); + Integer protocolFieldValue = 0; + //获取约定字段的总长度 + if (fixDataMap.containsKey(protocolFieldConfig.getFieldName())) { + Object appointUnpackObject = fixDataMap.get(protocolFieldConfig.getFieldName()); + if (ObjectUtils.isNotEmpty(appointUnpackObject)) { + protocolFieldValue = (Integer) appointUnpackObject; + } + } + if (protocolFieldValue != null) { + //加入缓存 + if (ObjectUtils.isNotEmpty(protocolFieldValue)) { + this.singleObjects.put(catchKey, protocolFieldValue); + return protocolFieldValue; + } + } + return null; + } + + /** + * 获取帧固定位置信息 + * + * @param byteBuf + * @param protocolConfig + * @return + */ + public Map getFixedProperty(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_POSITION + protocolConfig.getId(); + if (this.singleObjects.containsKey(catchKey)) { + return (Map) singleObjects.get(catchKey); + } + Map fixedPropertyMap = new HashMap<>(); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + fixedPropertyMap = fieldParser.doGetFixedProperty(protocolFieldConfigs, this.getTotalLength(byteBuf,protocolConfig)); + if (CollectionUtils.isNotEmpty(fixedPropertyMap)) { + this.singleObjects.put(catchKey, fixedPropertyMap); + return fixedPropertyMap; + } + return fixedPropertyMap; + } + + /** + * 获取帧结构应有的总长度 + */ + public Integer getTotalLength(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_LENGTH + ByteBufUtil.hexDump(byteBuf); + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + Integer appointFrameLength = getProtocolFieldValue(protocolConfig.getTotalLengthId(), byteBuf); + if (appointFrameLength != null) { + //获取过滤的字段集合总长度 + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Integer totalFilterLength = fieldParser.getTotalFilterLength(protocolConfig, byteBuf, getFixFieldConfigMap()); + //计算总长度 + Integer totalLength = appointFrameLength + totalFilterLength; + //加入缓存 + if (ObjectUtils.isNotEmpty(totalLength)) { + this.singleObjects.put(catchKey, totalLength); + return totalLength; + } + } + return null; + } + + /** + * 获取协议有关字段解析内容 + * storeObjectMap存储代转存的数据 + * + * @return + */ + public Map getProtocolDataMap(ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(FIXED_FIELD_DS)) { + return (Map) singleObjects.get(FIXED_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(protocolFieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + this.singleObjects.put(FIXED_FIELD_DS, fixDataMap); + return fixDataMap; + } + return null; + } + + /** + * 获取业务报文内容的content字节 + * + * @param wholeDatagramByte + * @return + */ + public ByteBuf getDataContentBuf(ByteBuf wholeDatagramByte) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(CONTENT_FIELD_DS)) { + return (ByteBuf) singleObjects.get(CONTENT_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + ByteBuf bizDataByteBuf = fieldParser.getDataContentBuf(protocolFieldConfigs, wholeDatagramByte); + if (bizDataByteBuf != null) { + this.singleObjects.put(CONTENT_FIELD_DS, bizDataByteBuf); + return bizDataByteBuf; + } + return null; + } + + + private ProtocolFieldConfig selectFieldConfig(Long id) { + Optional optionalProtocolFieldConfig = this.protocolFieldConfigs.stream().filter( + e -> e.getId().equals(id) + ).findFirst(); + return optionalProtocolFieldConfig.isPresent() ? optionalProtocolFieldConfig.get() : null; + } + + + private Map getFixFieldConfigMap() { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, e -> e) + ); + return fixDataFieldMap; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(protocolFieldConfigs) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java new file mode 100644 index 0000000..dafba1c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java @@ -0,0 +1,56 @@ +package com.casic.missiles.parser.provider; + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.rule.GenericRuleResolver; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.RuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleConfigProvider { + + private final List ruleConfigs; + + public List getRuleConfigs() { + return ruleConfigs; + } + + public RuleConfigProvider(Long protocolId) { + RuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(RuleConfigRegistry.class); + ruleConfigs = ruleConfigRegistry.getRuleConfigById(protocolId); + } + + /** + * 获取规则匹配结果 + * + * @param parseFixedDataMap + * @param protocolFieldConfigs + * @return + */ + public RuleConfig doGetRule(Map parseFixedDataMap, + String ids, + List protocolFieldConfigs) { + if (showSkip()) { + return null; + } + RuleConfig ruleConfig = GenericRuleResolver.machRule(parseFixedDataMap, ids, protocolFieldConfigs, ruleConfigs); + return ruleConfig; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(ruleConfigs) ? false : true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java index 3c05891..856b399 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java @@ -1,18 +1,11 @@ package com.casic.missiles.parser.resolver; -import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.springframework.web.bind.annotation.RequestBody; -import javax.annotation.Resource; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -20,19 +13,17 @@ @Slf4j public class ByteMergeProvider { - @Resource - private FieldRuleEngineMapper fieldRuleEngineMapper; - //拿到所有的值合并到一个值 - public String resolveByteMerge(List valueList, String ruletypeId, String vaildRange) { + public static String resolveByteMerge(List valueList, String ruleTypeId, String vaildRange) { String values = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Map vaildMap = getValidRangeMap(vaildRange); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(ruletypeId); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } + //暂时不处理 +// fieldRuleEngine = fieldRuleConfigMapper.selectById(ruleTypeId); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } Map env2 = new HashMap(); for (int i = 0; i < valueList.size(); i++) { if (vaildMap.containsKey(i)) { @@ -47,7 +38,7 @@ } } - private Map getValidRangeMap(String vaildRange) { + private static Map getValidRangeMap(String vaildRange) { String[] range = vaildRange.split(","); Map vaildMap = new HashMap(); for (int i = 0; i < range.length; i++) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 8d821cd..85d6bbf 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -1,9 +1,12 @@ package com.casic.missiles.parser.resolver; +import com.casic.missiles.pojo.AbstractFieldConfig; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; import io.netty.buffer.ByteBuf; +import java.util.List; import java.util.Map; /** @@ -11,18 +14,14 @@ */ public interface FieldParser { -// Map fieldProcess(String protocolContent,); - Map dataParser(RuleConfig ruleConfig, String lightText,String protocolId); + Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength); - Map fixDataParser(String protocolId, ByteBuf buffer); + Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap); - Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf); + ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer); - ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer); - - ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer); - - Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer); + Integer getTotalFilterLength(ProtocolConfig protocolConfig, ByteBuf byteBuf, Map protocolFieldConfigMap); } + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java new file mode 100644 index 0000000..9e0c00e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java @@ -0,0 +1,52 @@ +package com.casic.missiles.parser.resolver; + +import com.casic.missiles.pojo.AbstractFieldConfig; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.util.List; + +public class FieldParserSupport { + + //分别计算bit和byte长度=> 合并长度 + protected Integer calculateLength(List fieldConfigList) { + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + Integer fixedLength = bytefixedLength + bitfixedLength / 8; + return fixedLength; + } + + //找到最大值=> 根据最大值计算业务数据下标 + protected Integer calculatePosition(List fieldConfigList) { + String rex = "[0-9]+"; + Integer max = -1; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) + && Integer.valueOf(fieldConfig.getOriginPositionByte()) > max) { + max = Integer.valueOf(fieldConfig.getOriginPositionByte()); + } + } + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) && fieldConfig.getOriginPositionByte().equals(max)) { + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + } + } + Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; + return maxFixedPosition; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java deleted file mode 100644 index dd3a6cd..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java +++ /dev/null @@ -1,170 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.ByteResolverParam; -import io.netty.buffer.ByteBuf; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -/** - * 字段解析管理总类 - */ -@Service -@Slf4j -@AllArgsConstructor -public class FieldResolver extends ByteMergeProvider { - - //1、字段截取 => 2、简单的字节解析和复杂的字节解析 - public Object filedParserManger(ByteBuf byteBuf, FieldConfig fieldConfig, Integer maxFixedPosition) { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - //最大固定位置不为空, - if (!ObjectUtil.isEmpty(maxFixedPosition)) { - orignPosition -= maxFixedPosition; - } - Object fieldValue = 0; - //待优化 - if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { - fieldValue = bitToResolver(byteBuf, fieldConfig); - } else { - ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); - fieldValue = parsingFields(fieldBytes, fieldConfig.getRuleJson()); - } - return fieldValue; - } - - //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, - //目前默认配置的规则设置暂不支持配置化,由实现完成 - private Object parsingFields(ByteBuf byteBuf, String ruleJson) { - Object fieldsResolveValue = null; - List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); - if (ObjectUtil.isEmpty(ruleMapList)) { - fieldsResolveValue = defaultResolveBuilder(byteBuf); - } else { - fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); - } - return fieldsResolveValue; - } - - private Object defaultResolveBuilder(ByteBuf byteBuf) { - Integer defaultResolveValue = 0; - for (int i = 0; i < byteBuf.writerIndex(); i++) { - defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; - } - return defaultResolveValue; - } - - //字段解析构建器(针对字节单位的) - //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 - // 字节归并结束或者规则结束=>继续根据规则进行判断 - private Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { - Object customizeResolveValue = null; - try { - List bytStrList = new ArrayList<>(); - //存放到数组里面 - for (int i = 0; i < byteBuf.writerIndex(); i++) { - bytStrList.add(byteBuf.readByte()); - } - int i = 0; - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - customizeResolveValue = this.resolveByteMerge(bytStrList, ruletypeId,vaildRange); - break; - } else { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - List tempBytStr = new ArrayList<>(); - for (int k = 0; i < bytStrList.size(); i++) { - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(k) - .value(bytStrList.get(k)) - .ruletypeId(ruletypeId).build(); - tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); - } - bytStrList = tempBytStr; - } - i++; - } - //字节归并到一起=>继续根据规则进行判断 - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(customizeResolveValue) - .ruletypeId(ruletypeId).build(); - customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(customizeResolveValue)); - return customizeResolveValue; - } catch (RuntimeException ex) { - log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); - return null; - } - } - - /** - * 1、单个字节情况表示字段 - * 2、多字节情况表示字段(暂未处理) - */ - private Object bitToResolver(ByteBuf byteBuf, FieldConfig fieldConfig) { - Object fieldValue = new Object(); - try { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - byte fields = 0x00; - if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); - } else { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); - } - - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { - if (!StringUtils.isEmpty(fieldConfig.getExactOrignPosition())) { - fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getExactOrignPosition())).byteValue() - >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); - } else { - fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); - } - } else { - fieldValue = Integer.valueOf(fields & 0xff); - } - if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { - return fieldValue; - } - List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); - int i = 0; - //字节归并到一起=>继续根据规则进行判断 - while (i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(fieldValue) - .ruletypeId(ruletypeId).build(); - fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(fieldValue)); - return fieldValue; - } catch (RuntimeException ex) { - log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); - return null; - } - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java new file mode 100644 index 0000000..1d2aeab --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java @@ -0,0 +1,36 @@ +package com.casic.missiles.parser.resolver.bytes; + +import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.mapper.FieldRuleConfigMapper; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.pojo.ByteResolverParam; +import com.googlecode.aviator.AviatorEvaluator; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; +//转换规则 +@Component("convert") +@AllArgsConstructor +@Slf4j +public class ByteRuleResolver implements ByteResolver { + + private final FieldRuleConfigMapper fieldRuleConfigMapper; + + @Override + public Object resolveOperationRule(ByteResolverParam byteResolverParam){ + FieldRuleConfig fieldRuleEngine=fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); + if(ObjectUtil.isEmpty(fieldRuleEngine)){ + return byteResolverParam.getValue(); + } + String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); + Map env2 = new HashMap(); + env2.put("value", (byte) byteResolverParam.getValue()); + String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); + return values; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java index 103821c..786b71c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java @@ -2,34 +2,34 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("logicalShift") +@Component("logicalShift") @AllArgsConstructor @Slf4j public class LogicalShiftResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //字节位移 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { Integer index = byteResolverParam.getIndex(); - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return byteResolverParam.getValue(); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java index 476747d..01149bd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("operation") +@Component("operation") @AllArgsConstructor @Slf4j public class OperationResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //混合运算,有常量或者乘除的缩放 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java index 0b82cf4..79abcce 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.casic.missiles.pojo.ByteResolverParam; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; //精度计算 -@Service("precision") +@Component("precision") @AllArgsConstructor @Slf4j public class PrecisionResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java deleted file mode 100644 index 5c3f332..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; -//转换规则 -@Service("convert") -@AllArgsConstructor -@Slf4j -public class RuleResolver implements ByteResolver { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam){ - RuleEvaluator fieldRuleEngine=fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); - if(ObjectUtil.isEmpty(fieldRuleEngine)){ - return byteResolverParam.getValue(); - } - String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); - Map env2 = new HashMap(); - env2.put("value", (byte) byteResolverParam.getValue()); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java new file mode 100644 index 0000000..d3bbd91 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java @@ -0,0 +1,15 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; + +import java.util.List; +import java.util.Map; +// 前导码匹配->长度字段 +public interface AbstractCombinedFieldProcessor { + + Map invoke(Map map, ByteBuf byteBuf, List combinedFieldConfigList, + Map fieldConfigsMap, Map storeObjectMap); + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java new file mode 100644 index 0000000..03c8480 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java @@ -0,0 +1,59 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-13 + */ +//依次递增进行数据的解析, +public class GenericCombinedFieldResolver { + + + //通过查询,字段长度长度随机 + public void parseDataField(List combinedFieldConfigList, ByteBuf byteBuf, + Map storeObjectMap, Map fieldConfigsMap) { + Integer frameLength = Integer.valueOf(ByteBufUtil.hexDump(byteBuf)); + //添加前置处理器 + com.casic.missiles.util.ClassUtil classUtil = new com.casic.missiles.util.ClassUtil(); + List abstractCombinedProcessors = classUtil.getSubClassList(AbstractCombinedFieldProcessor.class); + + Map fieldFixedMap = combinedFieldLeadCodeMap(combinedFieldConfigList); + //frameLength + Map combinedProcessorFields = null; + while (byteBuf.readableBytes() < frameLength) { + //一直处理 + for (AbstractCombinedFieldProcessor abstractCombinedProcessor : abstractCombinedProcessors) { + combinedProcessorFields = abstractCombinedProcessor.invoke(combinedProcessorFields, byteBuf, + combinedFieldConfigList, + fieldConfigsMap, storeObjectMap); + if (combinedProcessorFields == null || byteBuf.readableBytes() < frameLength) { + return; + } + } + + } + } + + /** + * 取出前导码匹配集合 + */ + private Map combinedFieldLeadCodeMap(List combinedFieldConfigList) { + Map fieldFixedMap = combinedFieldConfigList + .stream() + .collect(Collectors.toMap(CombinedFieldConfig::getPrefixCode, e -> e)); + return fieldFixedMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java new file mode 100644 index 0000000..643a934 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java @@ -0,0 +1,100 @@ +package com.casic.missiles.parser.resolver.fields; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.FieldParserSupport; +import com.casic.missiles.pojo.*; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 保存使用时最基本的信息,并且使用原型模式 + */ +@Slf4j +public class DefaultProtocolFieldParser extends FieldParserSupport implements FieldParser, FixedPropertyEnum { + + //通过传入的配置和报文进行字段解析 + @Override + public Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap) { + Map dataMap = new HashMap<>(); + for (AbstractFieldConfig protocolFieldConfig : protocolFieldConfigs) { + if (!ObjectUtils.isEmpty(protocolFieldConfig.getOriginPositionByte())) { + Object fieldValue = FieldResolver.parseField(buffer, protocolFieldConfig, null); + if (protocolFieldConfig.getIsStorage() == 1) { + storeObjectMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + dataMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + } + return dataMap; + } + + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength) { + Map fixedPropertyMap = new HashMap<>(); + Integer fixedLength = calculateLength(protocolFieldConfigs); + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + fixedPropertyMap.put(FIXED_POSITION, maxFixedPosition); + fixedPropertyMap.put(TOTAL_LENGTH, totalLength); + fixedPropertyMap.put(TAIL_POSITION, totalLength - fixedLength + maxFixedPosition); + return fixedPropertyMap; + } + + //** 获取业务内容的byteBuf + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer) { + //计算固定长度 + Integer fixedLength = calculateLength(protocolFieldConfigs); + //总长度获取 + String lightText = buffer.toString(Charset.forName("ISO-8859-1")); + Integer totalLength = lightText.length(); + //计算固定长度最大长度 + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + //计算数据报文内容 + ByteBuf bizDataFields = buffer.slice(maxFixedPosition - 1, (totalLength - fixedLength)); + return bizDataFields; + } + + /** + * 获取过滤字段的长度 + */ + @Override + public Integer getTotalFilterLength(ProtocolConfig protocolConfig, + ByteBuf byteBuf, + Map protocolFieldConfigMap) { + if (ByteBufUtil.hexDump(byteBuf).equals("")) { + return 0; + } + int totalFilterLength = 0; + String filterFields = protocolConfig.getTotalLengthFilterFields(); + try { + if (!StringUtils.isEmpty(filterFields)) { + String[] filterFieldList = filterFields.split(","); + for (String filterFieldId : filterFieldList) { + if (StringUtils.isNotEmpty(filterFieldId)) { + ProtocolFieldConfig fieldConfig = protocolFieldConfigMap.get(Long.valueOf(filterFieldId)); + //这里都是按字节计算,没有对位进行区分,可能会出现错误 + // 如果对位有需求,需要进一步跟进 + totalFilterLength += fieldConfig.getOffsetLength(); + } + } + } + return totalFilterLength; + } catch (Exception ex) { + log.error("报文确认分发阶段,获取报文总长度过滤长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); + } + return totalFilterLength; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java new file mode 100644 index 0000000..d51e887 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java @@ -0,0 +1,169 @@ +package com.casic.missiles.parser.resolver.fields; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.parser.resolver.ByteMergeProvider; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.AbstractFieldConfig; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.pojo.ByteResolverParam; +import io.netty.buffer.ByteBuf; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * 字段解析管理总类 + */ +@Slf4j +public class FieldResolver extends ByteMergeProvider { + + //1、字段截取 => 2、简单的字节解析和复杂的字节解析 + public static Object parseField(ByteBuf byteBuf,AbstractFieldConfig fieldConfig, Integer maxFixedPosition) { + Integer orignPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + //最大固定位置不为空, + if (!ObjectUtil.isEmpty(maxFixedPosition)) { + orignPosition -= maxFixedPosition; + } + Object fieldValue = 0; + //待优化 + if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { + fieldValue = doParseBitField(byteBuf, fieldConfig); + } else { + ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); + fieldValue = doParseByteField(fieldBytes, fieldConfig.getRuleJson()); + } + return fieldValue; + } + + //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, + //目前默认配置的规则设置暂不支持配置化,由实现完成 + private static Object doParseByteField(ByteBuf byteBuf, String ruleJson) { + Object fieldsResolveValue = null; + List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); + if (ObjectUtil.isEmpty(ruleMapList)) { + fieldsResolveValue = defaultResolveBuilder(byteBuf); + } else { + fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); + } + return fieldsResolveValue; + } + + private static Object defaultResolveBuilder(ByteBuf byteBuf) { + Integer defaultResolveValue = 0; + for (int i = 0; i < byteBuf.writerIndex(); i++) { + defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; + } + return defaultResolveValue; + } + + //字段解析构建器(针对字节单位的) + //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 + // 字节归并结束或者规则结束=>继续根据规则进行判断 + private static Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { + Object customizeResolveValue = null; + try { + List bytStrList = new ArrayList<>(); + //存放到数组里面 + for (int i = 0; i < byteBuf.writerIndex(); i++) { + bytStrList.add(byteBuf.readByte()); + } + int i = 0; + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { + if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + customizeResolveValue = resolveByteMerge(bytStrList, ruletypeId, vaildRange); + break; + } else { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + List tempBytStr = new ArrayList<>(); + for (int k = 0; i < bytStrList.size(); i++) { + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(k) + .value(bytStrList.get(k)) + .ruletypeId(ruletypeId).build(); + tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); + } + bytStrList = tempBytStr; + } + i++; + } + //字节归并到一起=>继续根据规则进行判断 + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(null) + .value(customizeResolveValue) + .ruletypeId(ruletypeId).build(); + customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); + i++; + } + System.out.println(JSON.toJSON(customizeResolveValue)); + return customizeResolveValue; + } catch (RuntimeException ex) { + log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); + return null; + } + } + + /** + * 1、单个字节情况表示字段 + * 2、多字节情况表示字段(暂未处理) + */ + private static Object doParseBitField(ByteBuf byteBuf,AbstractFieldConfig fieldConfig) { + Object fieldValue = new Object(); + try { + Integer orignPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + byte fields = 0x00; + if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { + fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); + } else { + fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); + } + + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { + if (!StringUtils.isEmpty(fieldConfig.getOriginPositionBit())) { + fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getOriginPositionBit())).byteValue() + >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); + } else { + fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); + } + } else { + fieldValue = Integer.valueOf(fields & 0xff); + } + if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { + return fieldValue; + } + List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); + int i = 0; + //字节归并到一起=>继续根据规则进行判断 + while (i < ruleMapList.size()) { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(null) + .value(fieldValue) + .ruletypeId(ruletypeId).build(); + fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); + i++; + } + System.out.println(JSON.toJSON(fieldValue)); + return fieldValue; + } catch (RuntimeException ex) { + log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); + return null; + } + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java deleted file mode 100644 index 35ae3d0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java +++ /dev/null @@ -1,183 +0,0 @@ -package com.casic.missiles.parser.resolver.fields; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufAllocator; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; -import org.springframework.util.ObjectUtils; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service("standard") -@AllArgsConstructor -@Slf4j -public class StandardFieldParser implements FieldParser { - - private final FieldConfigDao fieldConfigDao; - private final FieldResolver fieldResolver; - - //数据解析 - @Override - public Map dataParser(RuleConfig ruleConfig, String lightText, String protocolId) { - String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); - ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); - bufferContent.writeBytes(lightText.getBytes(Charset.forName("ISO-8859-1"))); - Map dataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - for (String dataFieldId : dataFieldIds) { - FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(dataFieldId); - if (!ObjectUtils.isEmpty(fieldConfig)) { - dataMap.put(fieldConfig.getFieldName(), String.valueOf(fieldResolver.filedParserManger(bufferContent, fieldConfig, maxFixedPosition))); - } - } - return dataMap; - } - - //数据解析 - @Override - public Map fixDataParser(String protocolId, ByteBuf buffer) { - List dataFieldIdList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Map dataMap = new HashMap<>(); - for (FieldConfig dataField : dataFieldIdList) { - if (!ObjectUtils.isEmpty(dataField.getOrignPosition())) { - Object fieldValue = (Integer) fieldResolver.filedParserManger(buffer, dataField, null); - dataMap.put(dataField.getFieldName(), fieldValue); - } - } - return dataMap; - } - - @Override - public Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf) { - if (ByteBufUtil.hexDump(byteBuf).equals("")) { - return 0; - } - String filterFields = protocolConfig.getTotalLengthFilterField(); - Integer totalLength = 0; - try { - FieldConfig totalFieldConfig = fieldConfigDao.getFieldConfigById(protocolConfig.getTotalLengthId()); - int totalFilterLength = 0; - if (!StringUtils.isEmpty(filterFields)) { - String[] filterFieldList = filterFields.split(","); - for (String filterField : filterFieldList) { - FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(filterField); - //这里都是按字节计算,没有对位进行区分,可能会出现错误 - - // 如果对位有需求,需要进一步跟进 - totalFilterLength += fieldConfig.getOffsetLength(); - } - } - totalLength = (Integer) fieldResolver.filedParserManger(byteBuf, totalFieldConfig, null) + totalFilterLength; - } catch (Exception ex) { - log.error("报文确认分发阶段,获取报文总长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); - } - return totalLength; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer) { - //业务内容 - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - String protocolId = String.valueOf(protocolConfig.getId()); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - //计算固定长度 - Integer fixedLength = calculateLength(fieldConfigList); -// Integer totalLength = this.getTotalLength(protocolConfig, buffer); - //总长度获取 - Integer totalLength = lightText.length(); - //计算固定长度最大长度 - Integer maxFixedPosition = calculatePosition(fieldConfigList); -// buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - //计算数据报文内容 - ByteBuf bizDataFields = buffer.slice(maxFixedPosition-1, (totalLength - fixedLength)); - return bizDataFields; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer) { - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - String protocolId = String.valueOf(protocolConfig.getId()); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer fixedLength = calculateLength(fieldConfigList); -// Integer totalLength = this.getTotalLength(protocolConfig, buffer); - Integer totalLength = lightText.length(); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - ByteBuf fixDataFields = buffer.slice(0, maxFixedPosition); - return fixDataFields; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer) { - String protocolId = String.valueOf(protocolConfig.getId()); - Map fixedPropertyMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer fixedLength = calculateLength(fieldConfigList); - Integer totalLength = this.getTotalLength(protocolConfig, buffer); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - fixedPropertyMap.put("fixedPosition", maxFixedPosition); - fixedPropertyMap.put("totalLength", totalLength); - fixedPropertyMap.put("tailPosition", totalLength - fixedLength + maxFixedPosition); - return fixedPropertyMap; - } - - //分别计算bit和byte长度=> 合并长度 - private Integer calculateLength(List fieldConfigList) { - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (FieldConfig fieldConfig : fieldConfigList) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - Integer fixedLength = bytefixedLength + bitfixedLength / 8; - return fixedLength; - } - - //找到最大值=> 根据最大值计算业务数据下标 - private Integer calculatePosition(List fieldConfigList) { - String rex = "[0-9]+"; - Integer max = -1; - for (FieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOrignPosition()) - && Integer.valueOf(fieldConfig.getOrignPosition()) > max) { - max = Integer.valueOf(fieldConfig.getOrignPosition()); - } - } - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (FieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOrignPosition()) && fieldConfig.getOrignPosition().equals(max)) { - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - } - } - Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; - return maxFixedPosition; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java new file mode 100644 index 0000000..d4ec6c7 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java @@ -0,0 +1,76 @@ +package com.casic.missiles.parser.rule; + +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import org.apache.commons.lang3.StringUtils; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class GenericRuleResolver { + + //根据前置字段的值,找到指定的规则 + //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 + //=>循环判断=>通过规则得到业务字段 + public static RuleConfig machRule(Map fixDataMap, + String ids, + List protocolFieldConfigs, + List ruleConfigs) { + List preRuleConfigList = getPreRuleList(ids, protocolFieldConfigs); + //获取前置规则字段 + final Map metaDataMap = getPreRuleFields(preRuleConfigList, fixDataMap); + //准备固定的字段集合 + Map fixDataFieldMap = getFixDataFieldMap(protocolFieldConfigs); + return RuleResolverCore.doMachRule(ruleConfigs, metaDataMap, fixDataMap, fixDataFieldMap); + } + + private static Map getFixDataFieldMap(List protocolFieldConfigs) { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, ProtocolFieldConfig::getFieldName) + ); + return fixDataFieldMap; + } + + + /** + * 查询前置规则的字段配置 + * + * @param ids + * @return + */ + private static List getPreRuleList(String ids, List protocolFieldConfigs) { + String[] idList = ids.split(","); + Map prepareMaps = new HashMap<>(); + for (String id : idList) { + if (StringUtils.isNotEmpty(id)) { + prepareMaps.put(Long.valueOf(id), ""); + } + } + List preRuleConfigList = protocolFieldConfigs + .stream() + .filter(e -> prepareMaps.containsKey(e.getId())) + .collect(Collectors.toList()); + return preRuleConfigList; + } + + /** + * 获取前置规则解析字段 + */ + private static Map getPreRuleFields(List preRuleFieldConfigList, Map fixDataMap) { + Map ruleFieldMap = new HashMap<>(); + preRuleFieldConfigList.stream() + .forEach( + preRuleFieldConfig -> { + String fieldName = preRuleFieldConfig.getFieldName(); + if (fixDataMap.containsKey(fieldName)) { + ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); + } + } + ); + return ruleFieldMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java new file mode 100644 index 0000000..baae7e8 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -0,0 +1,68 @@ +package com.casic.missiles.parser.rule; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.casic.missiles.pojo.RuleConfig; + +import java.util.*; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleResolverCore { + + + public static RuleConfig doMachRule(List ruleConfigList, Map metaDataMap, + Map fixDataMap, + Map fixDataFieldMap) { + Optional ruleConfigOptional = ruleConfigList.stream() + .filter(ruleConfig -> machRuleConfig( + JSON.parseObject(ruleConfig.getMatchRuleJson(), Map.class), metaDataMap)) + .findFirst(); + if (ObjectUtil.isEmpty(ruleConfigOptional)) { + return null; + } + String[] ruleFields = ruleConfigOptional.get().getDataFieldIds().split(","); + Map ruleMetaDataMap = getRuleFields(ruleFields, fixDataMap, fixDataFieldMap); + //递归选定解析规则,进行规则解析 + if (!ruleConfigOptional.get().getIsFinishMatch().equals("1")) { + //递归选定规则 + doMachRule(ruleConfigList, ruleMetaDataMap, fixDataMap, fixDataFieldMap); + } + return ruleConfigOptional.get(); + } + + + private static Map getRuleFields(String[] preRuleConfigList, Map fixedDataMap, + Map fixedFieldMap) { + Map ruleFieldMap = new HashMap<>(); + for (String preRuleConfigId : preRuleConfigList) { + String fieldName = fixedFieldMap.get(preRuleConfigId); + if (fixedDataMap.containsKey(fieldName)) { + ruleFieldMap.put(fieldName, String.valueOf(fixedDataMap.get(fieldName))); + } + } + return ruleFieldMap; + } + + + //匹配规则配置 + private static Boolean machRuleConfig(Map ruleMap, Map metaDataMap) { + if (ruleMap == null || metaDataMap == null) { + return null; + } + //所有的字段在规则里面必须有有配置 + for (String key : metaDataMap.keySet()) { + if (ruleMap.containsKey(key)) { + if (!ruleMap.get(key).equals(metaDataMap.get(key))) { + return false; + } + } else { + return false; + } + } + return true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java deleted file mode 100644 index 664088d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java +++ /dev/null @@ -1,92 +0,0 @@ -package com.casic.missiles.parser.rule; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.mapper.dao.PreRuleConfigDao; -import com.casic.missiles.mapper.dao.RuleConfigDao; -import lombok.AllArgsConstructor; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.*; -import java.util.stream.Collectors; - -@Service -@AllArgsConstructor -public class RulerProvider { - - private final FieldConfigDao fieldConfigDao; - private final PreRuleConfigDao preRuleConfigDao; - private final RuleConfigDao ruleConfigDao; - - //根据前置字段的值,找到指定的规则 - //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 - //=>循环判断=>通过规则得到业务字段 - public RuleConfig ruleConfig(Map fixDataMap, String protocolId) { - //批量获取规则 - List preRuleConfigList = preRuleConfigDao.getPreRuleList(protocolId); - //获取固定字段 - Map fixFieldMap = getAllFieldMap(protocolId); - //获取前置规则字段 - final String preRuleFields = getPreRuleFields(preRuleConfigList, fixDataMap, fixFieldMap); - List ruleConfigList = ruleConfigDao.getRuleConfigById(protocolId); - Optional ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig ->preRuleFields.equals( ruleConfig.getParseRuleJson())).findFirst(); - //递归选定解析规则,进行规则解析 - while (!ObjectUtil.isEmpty(ruleConfigOptional) && !ruleConfigOptional.get().getIsBizField().equals("1")) { - String ruleFields = getRuleFields(ruleConfigOptional.get().getDataFieldIds().split(","), fixDataMap, fixFieldMap); - ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig -> ruleConfig.getParseRuleJson().equals(ruleFields)).findFirst(); - } - return ruleConfigOptional.get(); - } - - /** - * 获取前置规则解析字段 - */ - private String getPreRuleFields(List preRuleConfigList, Map fixDataMap, Map fixFieldMap) { - Map ruleFieldMap= new HashMap<>(); - preRuleConfigList.stream() - .forEach( - preRuleConfig -> { - String fieldName = fixFieldMap.get(Long.valueOf(preRuleConfig.getRuleFieldId())); - if (fixDataMap.containsKey(fieldName)) { - ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); - } - } - ); - return JSONObject.toJSONString(ruleFieldMap); - } - - private Map getAllFieldMap(String protocolId) { - List fieldList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Map fixFieldMap = fieldList.stream().collect( - Collectors.toMap(FieldConfig::getId, FieldConfig::getFieldName) - ); - return fixFieldMap; - } - - private String getRuleFields(String[] preRuleConfigList, Map fixDataMap, Map fixFieldMap) { - Map ruleFieldMap= new HashMap<>(); - for (String preRuleConfigId : preRuleConfigList) { - String fieldName = fixFieldMap.get(preRuleConfigId); - if (fixDataMap.containsKey(fieldName)) { - ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); - } - } - return JSONObject.toJSONString(ruleFieldMap); - } - - //弃置 - private String ListToString(List ruleFieldList) { - String ruleFields = ""; - for (String ruleField : ruleFieldList) { - ruleFields += ruleField + ","; - } - ruleFields = StringUtils.isEmpty(ruleFields) ? ruleFields : ruleFields.substring(0, ruleFields.length() - 1); - return ruleFields; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java index 6177e10..bfa87a5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java @@ -2,7 +2,7 @@ public interface SafeStrategy { - String decryption(byte[] bytes); + String decryption(String cipher); String encryption(String lightText); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java index 618716c..6236302 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java @@ -9,9 +9,9 @@ //十六进制的字符串转换成字节数组 byte[] bytes = hexStrToBinaryStr(msg); //计算CRC8 - byte crc8 = CRC8(bytes, 0, bytes.length); - String crc8ToStr = "" + Integer.toHexString(0xff & crc8); - return crc8ToStr; +// String crc8ToStr = "" + Integer.toHexString(0xff & crc8); +// return crc8ToStr; + return null; } /** @@ -33,50 +33,5 @@ return bytes; } - /** - * CRC8 校验 多项式 x8+x2+x+1 - * - * @param b - * @param off - * @param len - * @return - */ - public static byte CRC8(final byte[] b, final int off, final int len) { - byte result = 0x00; - for (int i = 0; i < len; i++) { - result = CHECKSUM_TABLE[(result ^ (b[i + off] & 0xFF)) & 0xFF]; - } - return (byte) (result & 0xFFL); - } - - private final static byte[] CHECKSUM_TABLE = {(byte) 0x00, (byte) 0x07, (byte) 0x0e, (byte) 0x09, (byte) 0x1c, (byte) 0x1b, - (byte) 0x12, (byte) 0x15, (byte) 0x38, (byte) 0x3f, (byte) 0x36, (byte) 0x31, (byte) 0x24, (byte) 0x23, (byte) 0x2a, - (byte) 0x2d, (byte) 0x70, (byte) 0x77, (byte) 0x7e, (byte) 0x79, (byte) 0x6c, (byte) 0x6b, (byte) 0x62, (byte) 0x65, - (byte) 0x48, (byte) 0x4f, (byte) 0x46, (byte) 0x41, (byte) 0x54, (byte) 0x53, (byte) 0x5a, (byte) 0x5d, (byte) 0xe0, - (byte) 0xe7, (byte) 0xee, (byte) 0xe9, (byte) 0xfc, (byte) 0xfb, (byte) 0xf2, (byte) 0xf5, (byte) 0xd8, (byte) 0xdf, - (byte) 0xd6, (byte) 0xd1, (byte) 0xc4, (byte) 0xc3, (byte) 0xca, (byte) 0xcd, (byte) 0x90, (byte) 0x97, (byte) 0x9e, - (byte) 0x99, (byte) 0x8c, (byte) 0x8b, (byte) 0x82, (byte) 0x85, (byte) 0xa8, (byte) 0xaf, (byte) 0xa6, (byte) 0xa1, - (byte) 0xb4, (byte) 0xb3, (byte) 0xba, (byte) 0xbd, (byte) 0xc7, (byte) 0xc0, (byte) 0xc9, (byte) 0xce, (byte) 0xdb, - (byte) 0xdc, (byte) 0xd5, (byte) 0xd2, (byte) 0xff, (byte) 0xf8, (byte) 0xf1, (byte) 0xf6, (byte) 0xe3, (byte) 0xe4, - (byte) 0xed, (byte) 0xea, (byte) 0xb7, (byte) 0xb0, (byte) 0xb9, (byte) 0xbe, (byte) 0xab, (byte) 0xac, (byte) 0xa5, - (byte) 0xa2, (byte) 0x8f, (byte) 0x88, (byte) 0x81, (byte) 0x86, (byte) 0x93, (byte) 0x94, (byte) 0x9d, (byte) 0x9a, - (byte) 0x27, (byte) 0x20, (byte) 0x29, (byte) 0x2e, (byte) 0x3b, (byte) 0x3c, (byte) 0x35, (byte) 0x32, (byte) 0x1f, - (byte) 0x18, (byte) 0x11, (byte) 0x16, (byte) 0x03, (byte) 0x04, (byte) 0x0d, (byte) 0x0a, (byte) 0x57, (byte) 0x50, - (byte) 0x59, (byte) 0x5e, (byte) 0x4b, (byte) 0x4c, (byte) 0x45, (byte) 0x42, (byte) 0x6f, (byte) 0x68, (byte) 0x61, - (byte) 0x66, (byte) 0x73, (byte) 0x74, (byte) 0x7d, (byte) 0x7a, (byte) 0x89, (byte) 0x8e, (byte) 0x87, (byte) 0x80, - (byte) 0x95, (byte) 0x92, (byte) 0x9b, (byte) 0x9c, (byte) 0xb1, (byte) 0xb6, (byte) 0xbf, (byte) 0xb8, (byte) 0xad, - (byte) 0xaa, (byte) 0xa3, (byte) 0xa4, (byte) 0xf9, (byte) 0xfe, (byte) 0xf7, (byte) 0xf0, (byte) 0xe5, (byte) 0xe2, - (byte) 0xeb, (byte) 0xec, (byte) 0xc1, (byte) 0xc6, (byte) 0xcf, (byte) 0xc8, (byte) 0xdd, (byte) 0xda, (byte) 0xd3, - (byte) 0xd4, (byte) 0x69, (byte) 0x6e, (byte) 0x67, (byte) 0x60, (byte) 0x75, (byte) 0x72, (byte) 0x7b, (byte) 0x7c, - (byte) 0x51, (byte) 0x56, (byte) 0x5f, (byte) 0x58, (byte) 0x4d, (byte) 0x4a, (byte) 0x43, (byte) 0x44, (byte) 0x19, - (byte) 0x1e, (byte) 0x17, (byte) 0x10, (byte) 0x05, (byte) 0x02, (byte) 0x0b, (byte) 0x0c, (byte) 0x21, (byte) 0x26, - (byte) 0x2f, (byte) 0x28, (byte) 0x3d, (byte) 0x3a, (byte) 0x33, (byte) 0x34, (byte) 0x4e, (byte) 0x49, (byte) 0x40, - (byte) 0x47, (byte) 0x52, (byte) 0x55, (byte) 0x5c, (byte) 0x5b, (byte) 0x76, (byte) 0x71, (byte) 0x78, (byte) 0x7f, - (byte) 0x6a, (byte) 0x6d, (byte) 0x64, (byte) 0x63, (byte) 0x3e, (byte) 0x39, (byte) 0x30, (byte) 0x37, (byte) 0x22, - (byte) 0x25, (byte) 0x2c, (byte) 0x2b, (byte) 0x06, (byte) 0x01, (byte) 0x08, (byte) 0x0f, (byte) 0x1a, (byte) 0x1d, - (byte) 0x14, (byte) 0x13, (byte) 0xae, (byte) 0xa9, (byte) 0xa0, (byte) 0xa7, (byte) 0xb2, (byte) 0xb5, (byte) 0xbc, - (byte) 0xbb, (byte) 0x96, (byte) 0x91, (byte) 0x98, (byte) 0x9f, (byte) 0x8a, (byte) 0x8d, (byte) 0x84, (byte) 0x83, - (byte) 0xde, (byte) 0xd9, (byte) 0xd0, (byte) 0xd7, (byte) 0xc2, (byte) 0xc5, (byte) 0xcc, (byte) 0xcb, (byte) 0xe6, - (byte) 0xe1, (byte) 0xe8, (byte) 0xef, (byte) 0xfa, (byte) 0xfd, (byte) 0xf4, (byte) 0xf3}; } \ No newline at end of file diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java index 27c2838..6e078a3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java @@ -1,9 +1,6 @@ package com.casic.missiles.parser.safe.impl; -import cn.hutool.core.util.CharsetUtil; -import cn.hutool.crypto.symmetric.SM4; -import cn.hutool.crypto.symmetric.SymmetricCrypto; - +import com.casic.missiles.parser.safe.SafeStrategy; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; @@ -11,19 +8,44 @@ import org.bouncycastle.crypto.engines.SM4Engine; import org.bouncycastle.crypto.params.KeyParameter; import org.bouncycastle.util.encoders.Hex; - -import static cn.hutool.crypto.Mode.ECB; -import static cn.hutool.crypto.Padding.NoPadding; +import org.springframework.stereotype.Component; /** * SM4算法工具类 */ @Slf4j -public class Sm4 { +@Component("sm4") +public class Sm4 implements SafeStrategy { //加解密的字节快大小 public static final int BlockSize = 16; + @Override + public String decryption(String cipher) { + byte[] keyByte = { + 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 + }; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(keyByte); + byte[] in = Hex.decode(cipher); + byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); + String plain = EcbDecrypt(in, keyBytes); + return plain; + } + + @Override + public String encryption(String cipher) { + byte[] keyByte = { + 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 + }; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(keyByte); + byte[] in = Hex.decode(cipher); + byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); + String plain = EcbDecrypt(in, keyBytes); + return plain; + } + /** * SM4ECB加密算法,对内 * @@ -32,8 +54,6 @@ * @return */ private static byte[] ecb_encrypt(byte[] in, byte[] keyBytes) { - - SM4Engine sm4Engine = new SM4Engine(); sm4Engine.init(true, new KeyParameter(keyBytes)); byte[] out = new byte[in.length]; @@ -58,27 +78,6 @@ return cipher; } - - /** - * hutool 解密SM4 - * - * @param encodeContent - * @return - */ - public static String decode(String encodeContent) { - String key = "24ad182507479a5da3ad94d9d78ea203"; - try { - SymmetricCrypto sm4 = new SM4(ECB, NoPadding, key.getBytes()); - String decryptStr = sm4.decryptStr(encodeContent, CharsetUtil.CHARSET_UTF_8); - return decryptStr; - } catch (Exception e) { - e.printStackTrace(); - log.error("SM4解密失败"); - } - return null; - } - - /** * SM4的ECB加密算法 * @@ -129,20 +128,6 @@ return plain; } - /** - * SM4的ECB解密算法 - * - * @param cipher 输入的密文字符串 - * @param key 密钥 - * @return - */ - public static String EcbDecrypt(String cipher, String key) { - byte[] in = Hex.decode(cipher); - byte[] keyBytes = Hex.decode(key); - - String plain = EcbDecrypt(in, keyBytes); - return plain; - } /** * 主函数 @@ -151,28 +136,24 @@ */ public static void main(String[] args) { byte[] ciphertext = { + 0x4B, (byte) 0x8C, (byte) 0x9D, 0x08, (byte) 0xE4, (byte) 0xD3, 0x64, 0x42, (byte) 0xB9, (byte) 0xA5, (byte) 0xFE, (byte) 0xCD, (byte) 0x91, 0x1B, 0x38, (byte) 0xAC, (byte) 0xE9, 0x1C, (byte) 0xCD, 0x53, 0x02, (byte) 0xD7, 0x0C, (byte) 0x9B, (byte) 0x96, 0x30, 0x62, (byte) 0xE8, (byte) 0xFB, (byte) 0xEF, (byte) 0xB9, (byte) 0xFF, (byte) 0xDE, 0x19, (byte) 0x80, 0x35, 0x3E, (byte) 0x90, 0x4F, 0x2F, 0x12, 0x2B, 0x19, (byte) 0x8B, 0x6C, 0x7A, (byte) 0x85, (byte) 0xA1, (byte) 0xB1, (byte) 0x86, (byte) 0xA3, 0x7A, 0x46, 0x0C, 0x2F, (byte) 0x94, 0x4F, 0x7F, 0x2C, 0x56, 0x14, (byte) 0xF3, (byte) 0x89, (byte) 0xC3, - 0x3F, 0x20, (byte) 0xF9, (byte) 0x87, (byte) 0xA1, 0x60, (byte) 0xD9, (byte) 0xA8, (byte) 0xFD, (byte) 0xD7, (byte) 0x9B, 0x4B, 0x26, 0x06, 0x30, 0x44}; + 0x3F, 0x20, (byte) 0xF9, (byte) 0x87, (byte) 0xA1, 0x60, (byte) 0xD9, (byte) 0xA8, (byte) 0xFD, (byte) 0xD7, (byte) 0x9B, 0x4B, 0x26, 0x06, 0x30, 0x44 + }; ByteBuf in = ByteBufAllocator.DEFAULT.heapBuffer(); in.writeBytes(ciphertext); - byte[] keyByte = { 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 }; ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); - key.writeBytes(ciphertext); - String resCipherData = decode(ByteBufUtil.hexDump(in)); - ByteBuf out = ByteBufAllocator.DEFAULT.heapBuffer(); -// out.writeBytes(resCipherData); -// System.out.println(hexBytes); - System.out.println(resCipherData.toString()); -// String resPlainData = EcbDecrypt(resCipherData, key); -// System.out.println("原始明文:" + data); -// System.out.println("解密后明文:" + resPlainData); + key.writeBytes(keyByte); +// String resCipherData = EcbDecrypt(ByteBufUtil.hexDump(in), ByteBufUtil.hexDump(key)); +// System.out.println(resCipherData); } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java index 1395a51..ac5f957 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java @@ -1,7 +1,7 @@ package com.casic.missiles.parser.safe.impl; import io.netty.buffer.ByteBufUtil; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** *

@@ -14,9 +14,8 @@ * @author hyl * @version v1.0: Tea.java, v 0.1 2021/3/12 13:48 $ */ -@Service("tea") -///tea算法类 - +//tea算法类 +@Component("tea") public class Tea { public static byte[] MyTea_Encrypt(byte[] MyTeaContent, int ByteLen, byte[] MyTeakey) { @@ -99,7 +98,6 @@ // for(int i32Index = 0; i32Index < 8; i32Index++) { // System.out.print("0x" + Integer.toHexString(MyContent[i32Index]) + " "); // } - // System.out.println("密钥为:"); // for(int i32Index = 0; i32Index < 16; i32Index++) { // System.out.print("0x" + Integer.toHexString(MyKeys[i32Index]) + " "); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java index bdd0721..bd1516a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java @@ -3,7 +3,7 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.parser.sender.DataSubscribeProvider; import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponents; import org.springframework.web.util.UriComponentsBuilder; @@ -12,7 +12,7 @@ import java.util.Collections; import java.util.Map; -@Service("functionCallback") +@Component("functionCallback") public class FunctionCallback implements DataSubscribeProvider { @Resource diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java index 0b44fb9..7526de2 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.Map; -@Service("middleware") +@Component("middleware") public class MiddlewareSubscribe implements DataSubscribeProvider { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java index 5dcee3f..e2f1192 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.Map; -@Service("nosql") +@Component("nosql") public class NoSqlSubscribe implements DataSubscribeProvider { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java b/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java new file mode 100644 index 0000000..81a5324 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java @@ -0,0 +1,86 @@ +package com.casic.missiles.pojo; + +import lombok.Data; + +/** + * 协议 + */ +@Data +public class Msg { + + /** + * 前导码 + */ + private String preamble; + + /** + * 版本号 + */ + private String version; + + /** + * 内容长度 + */ + private int leng; + + /** + * 设备ID + */ + private String deviceId; + + /** + * 通讯方式 + */ + private Integer connType; + + /** + * 加密方式 + */ + private Integer encryType; + + /** + * 目标地址 + */ + private String destAddr; + + /** + * PDUType + */ + private String PDUType; + + /** + * 操作类型 + */ + private Integer operateType; + + /** + * 传输控制位 PDUType.bit7=0时,表示存在后续的访问;当PDUType.bit7=1时,表示无后续的访问。 + */ + private Integer transControlFlag; + + /** + * 设备类型 + */ + private Integer deviceType; + + /** + * 序号 + */ + private Integer seq; + + /** + * tagList + */ + private String tagList; + + /** + * OidList + */ + private String OidList; + + /** + * CRC + */ + private String CRC; + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java index 40a5265..97cc984 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java @@ -40,7 +40,7 @@ String httpContent = msg.toString(Charset.defaultCharset()); log.info(" String : " + msg.toString(Charset.defaultCharset())); String majorContent = httpContent.substring(httpContent.indexOf("{"), httpContent.lastIndexOf("}") + 1); - String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("serviceData")).get("Value")); + String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("RegistryData")).get("Value")); log.info("----------------------------------" + values); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); bufferContent.writeBytes(values.getBytes(Charset.forName("ISO-8859-1"))); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java index 1b132a7..e3ced4b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java @@ -35,7 +35,7 @@ String httpContent = msg.toString(Charset.defaultCharset()); log.info(" String : " + msg.toString(Charset.defaultCharset())); String majorContent = httpContent.substring(httpContent.indexOf("{"), httpContent.lastIndexOf("}") + 1); - String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("serviceData")).get("Value")); + String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("RegistryData")).get("Value")); log.info("----------------------------------" + values); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); bufferContent.writeBytes(values.getBytes(Charset.forName("ISO-8859-1"))); diff --git a/sensorhub-core/src/main/resources/application.properties b/sensorhub-core/src/main/resources/application.properties deleted file mode 100644 index 8b13789..0000000 --- a/sensorhub-core/src/main/resources/application.properties +++ /dev/null @@ -1 +0,0 @@ - diff --git a/sensorhub-core/src/main/resources/config/application-dev.yml b/sensorhub-core/src/main/resources/config/application-dev.yml index 4f897a8..dcc4c2d 100644 --- a/sensorhub-core/src/main/resources/config/application-dev.yml +++ b/sensorhub-core/src/main/resources/config/application-dev.yml @@ -4,9 +4,9 @@ spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true + url: jdbc:mysql://127.0.0.1:3306/sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true username: root - password: Casic203 + password: root session: store-type: redis redis: diff --git a/sensorhub-core/src/main/resources/config/application.yml b/sensorhub-core/src/main/resources/config/application.yml index ae89f9d..7965da1 100644 --- a/sensorhub-core/src/main/resources/config/application.yml +++ b/sensorhub-core/src/main/resources/config/application.yml @@ -30,6 +30,13 @@ port: 6379 password: ew5T4K3#203lwh config-prefix: 'Casic:' +#代码生成器配置 +code: + generate: + #作者 + author: cz + #待生成对象表名 + table-name: bussiness_field_config,combined_field_config sensorhub: config: port: 7091 diff --git a/sensorhub-support/pom.xml b/sensorhub-support/pom.xml index 9a71296..761601c 100644 --- a/sensorhub-support/pom.xml +++ b/sensorhub-support/pom.xml @@ -42,6 +42,12 @@ ${redis.version} + + com.baomidou + mybatis-plus-generator + ${mybatis-plus-generator.version} + + org.reflections diff --git a/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java b/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java new file mode 100644 index 0000000..515ca53 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java @@ -0,0 +1,14 @@ +package com.casic.missiles.enums; + +/** + * @author + * @date + */ +public interface FixedPropertyEnum { + + String FIXED_POSITION = "fixedPosition"; + + String TOTAL_LENGTH = "totalLength"; + + String TAIL_POSITION = "tailPosition"; +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/CombinedFieldMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CombinedFieldMapper.java new file mode 100644 index 0000000..38e8f42 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CombinedFieldMapper.java @@ -0,0 +1,15 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.CombinedFieldConfig; +import org.apache.ibatis.annotations.Mapper; + +/** + * @author cz + * + */ +@Mapper +public interface CombinedFieldMapper extends BaseMapper { + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java new file mode 100644 index 0000000..128b09d --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java @@ -0,0 +1,10 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.CommandEventConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface CommandEventMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java new file mode 100644 index 0000000..042eb3c --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.DatagramEventConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface DatagramEventConfigMapper extends BaseMapper { +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java new file mode 100644 index 0000000..fc95cf4 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java @@ -0,0 +1,8 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.FieldConfig; + +public interface FieldConfigMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldRuleConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldRuleConfigMapper.java new file mode 100644 index 0000000..b310a08 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldRuleConfigMapper.java @@ -0,0 +1,10 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.FieldRuleConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface FieldRuleConfigMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java new file mode 100644 index 0000000..9060a69 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.ProtocolConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface ProtocolConfigMapper extends BaseMapper { +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolFieldConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolFieldConfigMapper.java new file mode 100644 index 0000000..1b47180 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolFieldConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +public interface ProtocolFieldConfigMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java new file mode 100644 index 0000000..6fa6936 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.RuleConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface RuleConfigMapper extends BaseMapper { +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/AbstractFieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/AbstractFieldConfig.java new file mode 100644 index 0000000..ba9aea2 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/AbstractFieldConfig.java @@ -0,0 +1,38 @@ +package com.casic.missiles.pojo; + +import lombok.Data; + +@Data +public class AbstractFieldConfig { + /** + * 字段名称 + */ + private String fieldName; + /** + * 按照字段评估进行字段解析 + */ + private String ruleJson; + /** + * 起始位置(单位byte) + */ + private Integer OriginPositionByte; + /** + * 起始位置,是否需要bit位置(单位bit)小于8, 没有不需要填写 + */ + private String OriginPositionBit; + /** + * 偏移长度 + */ + private Integer offsetLength; + /** + * 偏移单位(bit/byte) + */ + private String offsetUnit; + /** + * 是否需要转存 + */ + private Integer isStorage; + + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/CombinedFieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/CombinedFieldConfig.java new file mode 100644 index 0000000..4f4de6a --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/CombinedFieldConfig.java @@ -0,0 +1,41 @@ +package com.casic.missiles.pojo; + +import lombok.Data; + +import java.util.Date; + +/** + * 组合配置 + * + * @author cz + * @date 20 + */ +@Data +public class CombinedFieldConfig { + + private Long id; + private Long ruleId; + /** + * 前缀编码 + */ + private String prefixCode; + + /** + * 字段动态的id + */ + private Long dynamicLengthId; + /** + * 对应的要解析字段的ids + */ + private String dataFieldIds; + + /** + * 字段动态的id + */ + private String combinedFieldIds; + + private Date lastTime; + + private Date createTime; + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldConfig.java index a07d20d..8304dc6 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldConfig.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldConfig.java @@ -5,31 +5,28 @@ import java.util.Date; +/** + * @author cz + * 1、该表与实际解析的内容实例解析有关 + * 2、该表字段是随机出现的,和帧结构无关,无法预料的 + * 3、该表字段解析根据FieldEvaluatorConfig进行字段解析 + */ @Data -@TableName("field_config") -public class FieldConfig { +@TableName("business_field_config") +public class FieldConfig extends AbstractFieldConfig { private Long id; -// private String preFieldConfig; - private Long protocolId; - - private String isFixed; - private String uploadDeliveryChange; - - private String replyRule; - private String ruleJson; - + /** + * 协议配置id + */ + private Long ruleId; + /** + * 字段名称 + */ private String fieldName; - private String isStorage; - private Integer orignPosition; - private String exactOrignPosition; - - private Integer offsetLength; - private String offsetUnit; private String ownerId; private Date createTime; private Date lastTime; - } diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldRuleConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldRuleConfig.java new file mode 100644 index 0000000..2e09879 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldRuleConfig.java @@ -0,0 +1,20 @@ +package com.casic.missiles.pojo; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +@TableName("field_rule_config") +@Data +public class FieldRuleConfig { + + private Long id; + private String name; + private String desc; + private String condition; + private String excuteOperation; + private Date lasTime; + private Date createTime; + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/Msg.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/Msg.java deleted file mode 100644 index 81a5324..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/Msg.java +++ /dev/null @@ -1,86 +0,0 @@ -package com.casic.missiles.pojo; - -import lombok.Data; - -/** - * 协议 - */ -@Data -public class Msg { - - /** - * 前导码 - */ - private String preamble; - - /** - * 版本号 - */ - private String version; - - /** - * 内容长度 - */ - private int leng; - - /** - * 设备ID - */ - private String deviceId; - - /** - * 通讯方式 - */ - private Integer connType; - - /** - * 加密方式 - */ - private Integer encryType; - - /** - * 目标地址 - */ - private String destAddr; - - /** - * PDUType - */ - private String PDUType; - - /** - * 操作类型 - */ - private Integer operateType; - - /** - * 传输控制位 PDUType.bit7=0时,表示存在后续的访问;当PDUType.bit7=1时,表示无后续的访问。 - */ - private Integer transControlFlag; - - /** - * 设备类型 - */ - private Integer deviceType; - - /** - * 序号 - */ - private Integer seq; - - /** - * tagList - */ - private String tagList; - - /** - * OidList - */ - private String OidList; - - /** - * CRC - */ - private String CRC; - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java index 608af3a..32cc8a4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java @@ -2,48 +2,47 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.delivery.decorator.ByteDecorator; +import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @AllArgsConstructor public class FieldDecoratorManger { - private final RuleDictDao ruleDictDao; + private final RuleConfigRegistry ruleDictDao; // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 // (1)静态的业务字段是字典里面可以配置的 // (2)动态的业务字段是通过规则生成的 public String contentMerge(String ruleJson, String sceneConent, String dynamicContent) { - List ruleDictList = ruleDictDao.getRuleDictConfig(); - Map ruleDictMap = ruleDictList.stream().collect( - Collectors.toMap(RuleDict::getId, e -> e)); - List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); - for (Map ruleMap : ruleMapList) { - String ruleType = String.valueOf(ruleMap.get("ruleType")); - ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); - NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); - byteDecorator.nodeDecoratorRule(nodeDecoratorParm); - } +// List ruleDictList = ruleDictDao.getRuleDictConfig(); +// Map ruleDictMap = ruleDictList.stream().collect( +// Collectors.toMap(RuleDict::getId, e -> e)); +// List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); +// for (Map ruleMap : ruleMapList) { +// String ruleType = String.valueOf(ruleMap.get("ruleType")); +// ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); +// NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); +// byteDecorator.nodeDecoratorRule(nodeDecoratorParm); +// } return null; } - - private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { - NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() - .contents(sceneConent) - .dynamicContent(dynamicContent) - .ruletypeId(ruletypeId) - .ruleDictMap(ruleDictMap) - .build(); - return nodeDecoratorParm; - } +// +// private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { +// NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() +// .contents(sceneConent) +// .dynamicContent(dynamicContent) +// .ruletypeId(ruletypeId) +// .ruleDictMap(ruleDictMap) +// .build(); +// return nodeDecoratorParm; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java index 652970c..b204ac3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java @@ -1,56 +1,56 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@AllArgsConstructor -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", - JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Component; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Component("logicalDecorator") +//@AllArgsConstructor +//@Slf4j +//public class LogicalShiftDecorator implements ByteDecorator { +// +//// private final FieldRuleEngineMapper fieldRuleEngineMapper; +//// +//// //字节位移 +//// @Override +//// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +//// String logicalValue = ""; +//// RuleEvaluator fieldRuleEngine = new RuleEvaluator(); +//// try { +//// Map env2 = new HashMap(); +//// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +//// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +//// for (String contentId : contentIdList) { +//// RuleDict ruleDict = ruleDictMap.get(contentId); +//// if (ruleDict.getCode().contains("#")) { +//// //使用动态的值 +//// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +//// } +//// env2.put(ruleDict.getName(), ruleDict.getCode()); +//// } +//// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +//// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +//// return null; +//// } +//// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +//// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +//// return values; +//// } catch (Exception ex) { +//// log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", +//// JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +//// return null; +//// } +//// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java index 346468f..822fead 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@AllArgsConstructor -@Slf4j -public class OperationDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("optionDecorator") +//@AllArgsConstructor +//@Slf4j +//public class OperationDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //混合运算,有常量或者乘除的缩放 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java index 50fb0a7..7a8bccb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@AllArgsConstructor -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +////精度计算 +//@AllArgsConstructor +//@Registry("precisionDecorator") +//@Slf4j +//public class PrecisionDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java index da39235..27f9cc7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java @@ -1,54 +1,53 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@AllArgsConstructor -@Slf4j -public class RuleDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("ruleDecorator") +//@AllArgsConstructor +//@Slf4j +//public class RuleDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //吃我一套正则表达式 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (Exception ex) { +// log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java index 7f5cbf3..c043f97 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java @@ -2,6 +2,6 @@ import java.util.Map; -public interface ComandeEventService { +public interface ComandeEventService{ Map loadComandeEventConfig(String protocolId,String scene); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java index 476ad84..aaf1837 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java @@ -2,46 +2,46 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.dao.CommandEventDao; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @Slf4j @AllArgsConstructor -public class ComandeEventServiceImpl implements ComandeEventService { +public class ComandeEventServiceImpl implements ComandeEventRegistry { - private final CommandEventDao commandEventDao; + // private final CommandEventDao commandEventDao; // 加密bean 固定字段出现变化的字段解析,业务字段的有序内容 @Override - public Map loadComandeEventConfig(String protocolId,String sceneName) { - CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); - if (ObjectUtil.isEmpty(commandEventConfig)) { - log.error("协议{},没有配置成功接收回复配置,清排查原因"); - return null; - } - String replyJson = commandEventConfig.getReplyContentJson(); - List> replyMapList = JSONArray.parseObject(replyJson, List.class); - List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); - Map fixMap = fixList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); - List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) - .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) - .collect(Collectors.toList()); - Map commandConfigMap = new HashMap<>(); - commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); - commandConfigMap.put("fixContent", fixMap); - commandConfigMap.put("bizContent", contentList); - return commandConfigMap; + public Map loadComandeEventConfig(String protocolId, String sceneName) { +// CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); +// if (ObjectUtil.isEmpty(commandEventConfig)) { +// log.error("协议{},没有配置成功接收回复配置,清排查原因"); +// return null; +// } +// String replyJson = commandEventConfig.getReplyContentJson(); +// List> replyMapList = JSONArray.parseObject(replyJson, List.class); +// List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); +// Map fixMap = fixList.stream() +// .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); +// List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) +// .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) +// .collect(Collectors.toList()); +// Map commandConfigMap = new HashMap<>(); +// commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); +// commandConfigMap.put("fixContent", fixMap); +// commandConfigMap.put("bizContent", contentList); +// return commandConfigMap; + return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 128b09d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java deleted file mode 100644 index 4016b0b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface DatagramEventMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java deleted file mode 100644 index 597c306..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.apache.ibatis.annotations.Mapper; - -public interface FieldConfigMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java deleted file mode 100644 index a31680a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.PreRuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface PreRuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java deleted file mode 100644 index 9060a69..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface ProtocolConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java deleted file mode 100644 index 6fa6936..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java deleted file mode 100644 index 582a705..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleDict; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleDictMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java deleted file mode 100644 index 6e302c8..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.CommandEventMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Optional; - -@Component -public class CommandEventDao { - - @Resource - private CommandEventMapper commandEventMapper; - - public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId) - .eq("scene", sceneName) - .eq("enabled", 1); - List commandEventConfig = commandEventMapper.selectList(queryWrapper); - Optional optionalEventConfig = commandEventConfig.stream().findFirst(); - return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java deleted file mode 100644 index 9137e4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.FieldConfigMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class FieldConfigDao { - - @Resource - private FieldConfigMapper fieldConfigMapper; - - public FieldConfig getFieldConfigById(String fieldId) { - FieldConfig fieldConfig = fieldConfigMapper.selectById(fieldId); - return fieldConfig; - } - - public List getFieldConfigs(String protocolId,Integer isFixed) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",isFixed); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - - public List getStorageFieldConfig(String protocolId) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",1) - .eq("is_storage",1); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java deleted file mode 100644 index 67bff6b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.mapper.PreRuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class PreRuleConfigDao { - - @Resource - private PreRuleConfigMapper preRuleConfigMapper; - - public List getPreRuleList(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return preRuleConfigMapper.selectList(queryWrapper); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java deleted file mode 100644 index d69ea85..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.RuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleConfigDao { - - @Resource - private RuleConfigMapper ruleConfigMapper; - - public RuleConfig getNextRuleConfig(String ruleFields) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("parse_rule_json", ruleFields); - return ruleConfigMapper.selectOne(queryWrapper); - } - - - public List getRuleConfigById(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return ruleConfigMapper.selectList(queryWrapper); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java deleted file mode 100644 index 932c185..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.RuleDictMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleDictDao { - - @Resource - private RuleDictMapper ruleDictMapper; - - public List getRuleDictConfig() { - List ruleDictList = ruleDictMapper.selectList(null); - return ruleDictList; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java index 9f9e279..43bc4d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java @@ -10,20 +10,15 @@ import io.netty.channel.socket.nio.NioServerSocketChannel; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import javax.annotation.PreDestroy; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static cn.hutool.core.util.ClassUtil.getClasses; /** * SensorhubServer netty服务端 */ @Slf4j -@Service +@Component public class SensorhubServer { /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java index 2c79ff5..9a28c36 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java @@ -11,13 +11,13 @@ import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioSocketChannel; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClient 客户端 */ @Slf4j -@Service +@Registry public final class SensorhubClient { public static void main(String[] args) throws Exception { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java index 9774be0..477c3f7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java @@ -6,12 +6,12 @@ import io.netty.channel.socket.SocketChannel; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientChannelInitialHandler */ -@Service +@Registry public class SensorhubClientChannelInitialHandler extends ChannelInitializer { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java index 346f4b3..73560e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java @@ -5,13 +5,13 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientHandler */ @Slf4j -@Service +@Registry public class SensorhubClientHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java index 5c1c6f2..d990af5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java @@ -4,12 +4,12 @@ import com.casic.missiles.pojo.Msg; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** * SensorhubServerHandler */ -@Service +@Component public class SensorhubServerHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 67283ae..af3172c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,41 +1,37 @@ package com.casic.missiles.parser; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultProtocolConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.*; +import com.casic.missiles.registry.FieldConfigRegistry; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; -import java.nio.charset.Charset; import java.util.HashMap; import java.util.List; import java.util.Map; -@Service("genericProtocolParser") +/** + * @author + */ +@Component("genericProtocolParser") @Slf4j -@AllArgsConstructor +@RequiredArgsConstructor public class GenericProtocolParser implements ProtocolParser { - private final LeadingCodeMatcher leadingCodeMatcher; private final List frameStructDispenserList; - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorInstanceSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; // 匹配首字母前导码=> 帧结构匹配前导码=> // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 @@ -44,18 +40,19 @@ public Boolean doParseProtocol(ByteBuf byteBuf) { String protocolContent = ByteBufUtil.hexDump(byteBuf); //匹配前导码 - List preCodeConfigs = leadingCodeMatcher.matchLeadingCode(protocolContent); + List preCodeConfigs = LeadingCodeMatcher.matchFrameLeadingCode(protocolContent); //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 if (preCodeConfigs.size() == 0) { - return rematch(byteBuf,protocolContent); + return rematch(byteBuf, protocolContent); } - //暂时先取第一个 + //暂时先取第一个,提升速度,使用享元模式, 减少类的创建销毁与构建 ProtocolConfig protocolConfig = preCodeConfigs.get(0); + AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); ByteBuf wholeDatagramByte = null; //通过匹配帧结构获取完整的数据包 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, preCodeConfigs.get(0))) != null) { + if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, protocolFactory)) != null) { break; } } @@ -68,76 +65,78 @@ * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 */ - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId, wholeDatagramByte); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap, protocolId); - //选取规则对应的流程实例 - DatagramEventConfig datagramEventConfig = processorInstanceSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); + //进行规则字段解析,进行匹配规则 + RuleConfig ruleConfig = getRuleConfig(protocolFactory, wholeDatagramByte); + if (ruleConfig == null) { + return false; + } //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, wholeDatagramByte); + ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte); + //以下进行业务的规则解析,同时选定流程实例 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); + DatagramEventProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain, + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText, protocolId); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain); //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); + datagramEventProvider.storeData(bizDataMap); return true; } - private Boolean rematch(ByteBuf byteBuf,String protocolContent) { + /** + * 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 + */ + private Boolean rematch(ByteBuf byteBuf, String protocolContent) { //重置位判断 byteBuf.resetReaderIndex(); //判断重置是否前移,如果没有前移,则直接判为匹配失败 if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { return false; } else { + //递归执行 return doParseProtocol(byteBuf); } } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; + //获取匹配规则->匹配规则 + private RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + //取出其中参与逻辑provider并判空 + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); + String rulePrepareFields = protocolConfig.getRulePrepareFields(); + //固定字段 + if (StringUtils.isNotEmpty(rulePrepareFields)) { + //获取统一固定字段解析 + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + //获取该协议的字段配置,用于协议规则匹配 + List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); + //获取规则 + RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, + rulePrepareFields, protocolFieldConfigs); + return ruleConfig; + } + return null; } - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + //数据构建,获取固定字段的store和业务字段store + private Map buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + Map bizDataMap = new HashMap<>(); + Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); + Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); + bizDataMap.putAll(ruleStoreObjectMap); + bizDataMap.putAll(protocolStoreObjectMap); return bizDataMap; } - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java index 8a46e32..16ce2e5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java @@ -3,6 +3,7 @@ import io.netty.buffer.ByteBuf; public interface ProtocolParser { + Boolean doParseProtocol(ByteBuf byteBuf); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java new file mode 100644 index 0000000..f7814af --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java @@ -0,0 +1,35 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.ProtocolConfigProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.ProtocolConfig; + +/** + * 存放基本协议的的加载信息 + */ +public class AbstractProtocolConfigFactory { + private final ProtocolConfigProvider protocolConfigProvider; + private final ProtocolFieldConfigProvider protocolFieldConfigProvider; + private final RuleConfigProvider ruleConfigProvider; + + public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { + this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); + this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); + this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); + } + + public ProtocolConfigProvider getProtocolConfigProvider() { + return protocolConfigProvider; + } + + public ProtocolFieldConfigProvider getProtocolFieldConfigProvider() { + return protocolFieldConfigProvider; + } + + public RuleConfigProvider getRuleConfigProvider() { + return ruleConfigProvider; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java new file mode 100644 index 0000000..6e36147 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java @@ -0,0 +1,57 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.CombinedFieldConfigProvider; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.FieldConfigProvider; +import com.casic.missiles.parser.provider.FieldRuleConfigProvider; + +/** + * 存放规则相关的的的加载信息 + */ +public class AbstractRuleConfigFactory { + + /** + * 处理字节 + */ + private final FieldConfigProvider fieldConfigProvider; + /** + * 处理组合字节解析的解码器 + */ + private final CombinedFieldConfigProvider combinedFieldConfigProvider; + /** + * 处理负责字节解析的规则配置 + */ + private final FieldRuleConfigProvider fieldRuleConfigProvider; + /** + * 处理实例流程 + */ + private final DatagramEventProvider datagramEventProvider; + + + public AbstractRuleConfigFactory(Long ruleId) { + this.fieldConfigProvider = new FieldConfigProvider(ruleId); + this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); + this.fieldRuleConfigProvider = new FieldRuleConfigProvider(ruleId); + this.datagramEventProvider = new DatagramEventProvider(ruleId); + } + + public FieldConfigProvider getFieldConfigProvider() { + return fieldConfigProvider; + } + + public CombinedFieldConfigProvider getCombinedFieldConfigProvider() { + return combinedFieldConfigProvider; + } + + public FieldRuleConfigProvider getFieldRuleConfigProvider() { + return fieldRuleConfigProvider; + } + + public DatagramEventProvider getDatagramEventProvider() { + return datagramEventProvider; + } + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java deleted file mode 100644 index 6e1719a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.factory; - - -import com.casic.missiles.pojo.ProtocolConfig; - -import java.util.List; - -/** - * 数据库访问优化(暂时未做) - *

- * 1、初始化协议解析配置,并存放到处存放缓存,对协议基本配置进行管理 - * 2、其中流程中所有的配置都经过此类进行管理,进行调用获取,增强解析速度 - */ -public interface DatagramFactory { - - /** - * 初始化 - */ - List datagramInit(); - - /** - * 根据前导码配置匹配,模糊匹配获取所有的报文项 - */ - List match(); - - /** - * 根据前导码匹配,返回报文项 - */ - List filer(); - - /** - * 保证数据的唯一性选择器 - */ - List selectOne(); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java new file mode 100644 index 0000000..87444a0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java @@ -0,0 +1,18 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +import java.util.List; + +/** + * 直接用,还是边用边创建 + */ +public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { + + + public DefaultProtocolConfigFactory(ProtocolConfig protocolConfig) { + super(protocolConfig); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java new file mode 100644 index 0000000..cce0c7c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java @@ -0,0 +1,12 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; + +public class DefaultRuleFactory extends AbstractRuleConfigFactory { + + public DefaultRuleFactory(Long ruleId) { + super(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java deleted file mode 100644 index 9ee97e0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.casic.missiles.parser.instance; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service -@Slf4j -@AllArgsConstructor -public class GeneralProcessor { - - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; - - /** - * 统一固定字段解析=>进行规则的查询的判断 - * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 - * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 - */ - @Deprecated - public boolean parseWholeDatagram(ByteBuf buffer, ProtocolConfig protocolConfig) { - try { - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap,protocolId); - //选取规则对应的流程= - DatagramEventConfig datagramEventConfig = processorSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); - //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); - //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); - //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); - //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); - //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); - return true; - } catch (Exception ex) { - log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", - ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); - return false; - } - } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; - } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); - } - - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); - return bizDataMap; - } - - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java index 25e7ad8..6a5777e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java @@ -1,23 +1,31 @@ package com.casic.missiles.parser.instance.impl; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.mapper.DatagramEventMapper; import com.casic.missiles.pojo.DatagramEventConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.SpringContextUtil; -@Service -@AllArgsConstructor +import java.util.List; +import java.util.Optional; + +/** + * @author cz + * + */ public class DefaultProcessorInstanceSelector implements ProcessorInstanceSelector { - private final DatagramEventMapper datagramEventMapper; + private static List datagramEventConfigs; + + static { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + datagramEventConfigs = datagramEventRegistry.getDatagramEventList(); + } @Override public DatagramEventConfig getProcessorInstance(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("rule_id", protocolId); - return datagramEventMapper.selectOne(queryWrapper); + Optional optionalSelectInstance = datagramEventConfigs.stream() + .filter(e -> e.getId().equals(protocolId)).limit(1).findFirst(); + return optionalSelectInstance.isPresent() ? optionalSelectInstance.get() : null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a778671..7b56a43 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,16 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import io.netty.buffer.ByteBuf; /** - * 分析匹配情况 - * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 - * 2、匹配不成功,有后续帧,可以进行下次匹配。 - * 3、匹配不成功,无后续帧,可以进行丢弃。 + * 分析匹配情况 + * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 + * 2、匹配不成功,有后续帧,可以进行下次匹配。 + * 3、匹配不成功,无后续帧,可以进行丢弃。 */ -public interface FrameStructMatcher{ +public interface FrameStructMatcher { - ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig); + ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 05320ab..8ebea78 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,23 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.ProtocolConfigMapper; +import com.casic.missiles.parser.provider.ProtocolConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Component; import java.util.List; import java.util.stream.Collectors; -@Component -@AllArgsConstructor public class LeadingCodeMatcher { - private final ProtocolConfigMapper protocolMapper; - //** 1、首字母匹配前导码, // 2、以匹配出的前导码是否在报文中条件进行前导码的匹配二次筛选 - public List matchLeadingCode(String protocolContent){ + public static List matchFrameLeadingCode(String protocolContent){ List initialConfigs = initialMatch(protocolContent); List preCodeConfigs = initialConfigs.stream() .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) @@ -26,13 +19,16 @@ } //初始化匹配前导码内容 - private List initialMatch(String protocolContent) { - String protocolStr = protocolContent.charAt(0) + ""; - QueryWrapper queryWrapper = new QueryWrapper() - .likeRight("pre_fix", protocolStr); - List protocolConfigList = protocolMapper.selectList(queryWrapper); - return protocolConfigList; + private static List initialMatch(String protocolContent) { + String firstFrameChar = protocolContent.charAt(0) + ""; + ProtocolConfigProvider protocolConfigProvider=new ProtocolConfigProvider(firstFrameChar); + return protocolConfigProvider.getMatchList(); } + + + + + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index cf2113d..e915877 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -1,32 +1,35 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(0) -@Service +@Component public class FrameLengthMatcher implements FrameStructMatcher { - @Autowired - private FieldParser fieldParser; - //超过长度 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { String dataGramContent = ByteBufUtil.hexDump(byteBuf); - if (StringUtils.isEmpty(protocolConfig.getUnpackId()) && StringUtils.isEmpty(protocolConfig.getTailStr())) { - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + //当不存在结尾标志和拆包标志,可以直接使用长度进行匹配 + if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { if (dataGramContent.length() >= totalLength) {//等于长度返回true,超出长度,切断 - ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, protocolConfig, totalLength); + ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, totalLength); return wholeDatagramByte; } else { //读的标志位前移舍弃 @@ -38,7 +41,7 @@ return null; } - private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, Integer totalLength) { byteBuf.readBytes(totalLength); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, totalLength - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 2bfc213..d527ad0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; @@ -13,7 +13,7 @@ import lombok.AllArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.nio.charset.Charset; import java.util.Map; @@ -22,32 +22,30 @@ * 后续标志验证 */ @Order(1) -@Service +@Component @AllArgsConstructor -public class FrameMarkMatcher implements FrameStructMatcher { - - private final FieldConfigDao fieldConfigDao; - private final FieldParser fieldParser; - private final FieldResolver fieldResolverManger; +public class FrameMarkMatcher implements FrameStructMatcher, FixedPropertyEnum { //帧后续标志=>结束,进行帧的重组=>有后续,1、帧移位判别 2、继续接收帧 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig UnpackConfig = StringUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getUnpackId()); - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); - Integer upback = 0; + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); ByteBuf mergeWholeFrameByte = null; - if (!ObjectUtil.isEmpty(UnpackConfig)) { - while (hasNextFullFrame(byteBuf, protocolConfig)) { - upback = (Integer) fieldResolverManger.filedParserManger(byteBuf, UnpackConfig, null); + if (!ObjectUtil.isEmpty(unpackFlag)) { + while (hasNextFullFrame(byteBuf, protocolConfig, protocolFieldConfigProvider)) { //是否存在后续位 - if (upback == 1) {//使用esayRule + if (unpackFlag == 1) {//使用esayRule //表示可以截取 - mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolConfig, totalLength); + mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolFieldConfigProvider, protocolConfig); return mergeWholeFrameByte; } else { - byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig)); + byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig, protocolFieldConfigProvider)); } } } @@ -56,7 +54,8 @@ //选取第一个帧,将业务内容和后面部分分开 //计算数据报文-业务内容 - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolFieldConfigProvider protocolFieldConfigProvider, ProtocolConfig protocolConfig) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); //截取完整报文 byteBuf.readBytes(totalLength); ByteBuf byteBufContent = byteBuf.slice(0, byteBuf.readerIndex()); @@ -68,15 +67,15 @@ String tail = ""; System.out.println(ByteBufUtil.hexDump(byteBufContent)); //会存在多个帧拼接在一起的的情况,进行合并处理 - while (hasNextFullFrame(byteBufContent, protocolConfig)) { - Integer currentFrameLength = fieldParser.getTotalLength(protocolConfig, byteBufContent); + while (hasNextFullFrame(byteBufContent, protocolConfig, protocolFieldConfigProvider)) { + Integer currentFrameLength = protocolFieldConfigProvider.getTotalLength(byteBufContent, protocolConfig); byteBufContent.readBytes(currentFrameLength); ByteBuf currentbyteBuf = byteBufContent.slice(0, byteBufContent.readerIndex()); byteBufContent.markReaderIndex();//读的标志位前移 System.out.println(ByteBufUtil.hexDump(byteBufContent)); String hexDump = currentbyteBuf.toString(Charset.forName("ISO-8859-1")); //获取当前固定帧结构的关系map - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, currentbyteBuf); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(currentbyteBuf, protocolConfig); if (StringUtils.isEmpty(mergeFrameStr)) { //首次获取业务数据报文 mergeFrameStr += hexDump.substring(0, currentFrameFixedProperty.get("tailPosition")); @@ -95,22 +94,22 @@ /** * 获取平移到下一帧起始位置 */ - public int getNextFrameOffset(ByteBuf buffer, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, buffer); - return currentFrameFixedProperty.get("totalLength"); + public int getNextFrameOffset(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + return currentFrameFixedProperty.get(TOTAL_LENGTH); } /** * 判断是否出错进行整个帧的 */ - public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, byteBuf); + public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); //保证读取位置不在固定位置,是可变的业务内容 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("fixedPosition")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(FIXED_POSITION)) { return false; } //判断读取是否操作帧长度 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("totalLength")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(TOTAL_LENGTH)) { return false; } return true; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 76a3784..c3a1bab 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -1,50 +1,50 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.parser.instance.GeneralProcessor; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; +import io.netty.buffer.ByteBufUtil;; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(2) -@Service +@Component public class FrameTailMatcher implements FrameStructMatcher { - @Resource - private FieldConfigDao fieldConfigDao; - @Autowired - private GeneralProcessor generalProcessor; - //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig tailFieldConfig = StringUtils.isEmpty(protocolConfig.getTailStr()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getTailStr()); - if (!ObjectUtil.isEmpty(tailFieldConfig)) { - String tailStr = tailFieldConfig.getFieldName(); + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfig protocolFieldConfig = ObjectUtils.isEmpty(protocolConfig.getTailStr()) ? null : + fieldConfigProvider.getFieldConfigById(protocolConfig.getTailStr()); + if (!ObjectUtil.isEmpty(protocolFieldConfig)) { + String tailStr = protocolFieldConfig.getFieldName(); String dataGramContent = ByteBufUtil.hexDump(byteBuf); Boolean tailFlag = ByteBufUtil.hexDump(byteBuf).contains(tailStr); if (!tailFlag) { //使用esayRule return null; } else if (dataGramContent.indexOf(tailStr) < dataGramContent.length() - tailStr.length()) { Integer length = dataGramContent.indexOf(tailStr) + tailStr.length(); - ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, protocolConfig, length); + ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, length); return wholeDatagramByte; //存在粘包 } } return null; } - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer length) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, Integer length) { byteBuf.readBytes(length); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, length - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java new file mode 100644 index 0000000..5f1c177 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java @@ -0,0 +1,73 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.combined.GenericCombinedFieldResolver; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.CombinedFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class CombinedFieldConfigProvider { + + + /** + * 作为临时配置列表缓存使用 + */ + private final List combinedFieldConfigList; + private Map storeObjectMap = new HashMap<>(); + + public CombinedFieldConfigProvider(Long ruleId) { + CombinedFieldConfigRegistry combinedFieldConfigRegistry = SpringContextUtil.getBean(CombinedFieldConfigRegistry.class); + combinedFieldConfigList = combinedFieldConfigRegistry.getCombinedFieldConfigList(ruleId); + } + + public void parseDataField(RuleConfig ruleConfig, String clearZeroPlain,Map fieldConfigsMap ) { + if (showSkip()) { + return; + } + //匹配对应的数据,然后进行相关的字段解析 + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver(); + combinedFieldResolver.parseDataField(combinedFieldConfigList, byteBuf, storeObjectMap,fieldConfigsMap); + } + + + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getCombinedFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return combinedFieldConfigList.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public List getCombinedFieldConfigList() { + return combinedFieldConfigList; + } + + /* 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(combinedFieldConfigList) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java new file mode 100644 index 0000000..f3cfedc --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java @@ -0,0 +1,11 @@ +package com.casic.missiles.parser.provider; + +/** + * @author cz + * @date 2023-6-12 + */ +public class CommandEventProvider{ + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java new file mode 100644 index 0000000..70eec5e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java @@ -0,0 +1,77 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.safe.SafeStrategy; +import com.casic.missiles.parser.sender.DataSubscribeProvider; +import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class DatagramEventProvider { + + private final DatagramEventConfig processorInstance; + + public DatagramEventProvider(Long ruleId) { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + List datagramEventConfigList = + datagramEventRegistry.getDatagramEventList(ruleId); + processorInstance = this.getProcessorInstance(datagramEventConfigList); + } + + public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { + if (showSkip()) { + return null; + } + return datagramEventConfigList.get(0); + } + + // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 + public String getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap) { + String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? + processorInstance.getSafeBean() : + fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); + if (!StringUtils.isEmpty(safeName)) { + //需要加密 + SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); + String plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); + return clearComplementZero(plain); + } + return ByteBufUtil.hexDump(bizDataContent); + } + + //解密清零操作 + private String clearComplementZero(String plain) { + plain = plain.substring(0, plain.lastIndexOf("00")); + return plain; + } + + //数据发送,数据发送者暂未构建 + public void storeData(Map bizDataMap) { + DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); +// dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return ObjectUtils.isNotEmpty(processorInstance) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java new file mode 100644 index 0000000..7e1fe0a --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java @@ -0,0 +1,97 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.FieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class FieldConfigProvider { + + + private final List fieldConfigs; + private Map storeObjectMap = new HashMap<>(); +// private Map singleObjects = new ConcurrentHashMap<>(); + + public FieldConfigProvider(Long ruleId) { + FieldConfigRegistry fieldConfigRegistry = SpringContextUtil.getBean(FieldConfigRegistry.class); + fieldConfigs = fieldConfigRegistry.getFieldConfigList(ruleId); + } + + public List getFieldConfigs() { + return fieldConfigs; + } + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public Map parseDataField(RuleConfig ruleConfig, String clearZeroPlain) { + if (showSkip()) { + return null; + } + List prepareFieldConfig = prepareParseField(ruleConfig); + if (CollectionUtils.isNotEmpty(prepareFieldConfig)) { + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(fieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + return fixDataMap; + } + } + return null; + } + + /** + * 得到需要处理的业务内容 + * + * @return + */ + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return fieldConfigs.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public Map getFieldConfigsMap() { + return fieldConfigs.stream().collect( + Collectors.toMap(FieldConfig::getId, e -> e) + ); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(fieldConfigs) ? false : true; + } + + +} + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java new file mode 100644 index 0000000..817bfaf --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java @@ -0,0 +1,19 @@ +package com.casic.missiles.parser.provider; + +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.registry.FieldRuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; + +public class FieldRuleConfigProvider { + + private final List fieldRuleConfigList; + + public FieldRuleConfigProvider(Long ruleId) { + FieldRuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(FieldRuleConfigRegistry.class); + fieldRuleConfigList = ruleConfigRegistry.getFieldRuleConfigList(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java new file mode 100644 index 0000000..99a1b06 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java @@ -0,0 +1,53 @@ +package com.casic.missiles.parser.provider; + + +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.registry.ProtocolConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolConfigProvider { + + private final List protocolConfigList; + + public ProtocolConfigProvider(String firstChar) { + ProtocolConfigRegistry registry = SpringContextUtil.getBean(ProtocolConfigRegistry.class); + protocolConfigList = registry.getProtocolConfigList(firstChar); + } + + public List getMatchList() { + return protocolConfigList; + } + + /** + * 设置当前协议 + * + * @param protocolConfig + */ + public ProtocolConfigProvider(ProtocolConfig protocolConfig) { + List protocolConfigs = new ArrayList<>(); + protocolConfigs.add(protocolConfig); + protocolConfigList = protocolConfigs; + } + + /** + * 获取当前协议 + * + * @return + */ + public ProtocolConfig getCurrentProtocolConfig() { + if (this.protocolConfigList == null) { + return null; + } else { + return protocolConfigList.get(0); + } + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java new file mode 100644 index 0000000..043927d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java @@ -0,0 +1,213 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.registry.ProtocolFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolFieldConfigProvider { + + private static final String FIXED_FIELD_DS = "fixedFieldDs"; + private static final String CONTENT_FIELD_DS = "contentFieldDs"; + private static final String PROTOCOL_LENGTH = "protocolLength"; + private static final String PROTOCOL_FIELD_ID = "protocolFieldId"; + private static final String PROTOCOL_POSITION = "protocolPosition"; + + private final List protocolFieldConfigs; + private Map singleObjects = new ConcurrentHashMap<>(); + private Map storeObjectMap = new HashMap<>(); + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public ProtocolFieldConfigProvider(Long protocolId) { + ProtocolFieldConfigRegistry protocolFieldConfigRegistry = SpringContextUtil.getBean(ProtocolFieldConfigRegistry.class); + protocolFieldConfigs = protocolFieldConfigRegistry.getProtocolFieldConfigList(protocolId); + } + + public List getProtocolFieldConfigs() { + return protocolFieldConfigs; + } + + public ProtocolFieldConfig getFieldConfigById(Long fieldId) { + Optional optionalConfig = protocolFieldConfigs.stream().filter( + e -> e.getId().equals(fieldId) + ).findFirst(); + return optionalConfig.isPresent() ? optionalConfig.get() : null; + } + + public Integer getProtocolFieldValue(Long protocolFieldId, ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_FIELD_ID + protocolFieldId + ByteBufUtil.hexDump(byteBuf); + //获取缓存 + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + //加载固定长度数据集合 + Map fixDataMap = this.getProtocolDataMap(byteBuf); + ProtocolFieldConfig protocolFieldConfig = selectFieldConfig(protocolFieldId); + Integer protocolFieldValue = 0; + //获取约定字段的总长度 + if (fixDataMap.containsKey(protocolFieldConfig.getFieldName())) { + Object appointUnpackObject = fixDataMap.get(protocolFieldConfig.getFieldName()); + if (ObjectUtils.isNotEmpty(appointUnpackObject)) { + protocolFieldValue = (Integer) appointUnpackObject; + } + } + if (protocolFieldValue != null) { + //加入缓存 + if (ObjectUtils.isNotEmpty(protocolFieldValue)) { + this.singleObjects.put(catchKey, protocolFieldValue); + return protocolFieldValue; + } + } + return null; + } + + /** + * 获取帧固定位置信息 + * + * @param byteBuf + * @param protocolConfig + * @return + */ + public Map getFixedProperty(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_POSITION + protocolConfig.getId(); + if (this.singleObjects.containsKey(catchKey)) { + return (Map) singleObjects.get(catchKey); + } + Map fixedPropertyMap = new HashMap<>(); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + fixedPropertyMap = fieldParser.doGetFixedProperty(protocolFieldConfigs, this.getTotalLength(byteBuf,protocolConfig)); + if (CollectionUtils.isNotEmpty(fixedPropertyMap)) { + this.singleObjects.put(catchKey, fixedPropertyMap); + return fixedPropertyMap; + } + return fixedPropertyMap; + } + + /** + * 获取帧结构应有的总长度 + */ + public Integer getTotalLength(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_LENGTH + ByteBufUtil.hexDump(byteBuf); + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + Integer appointFrameLength = getProtocolFieldValue(protocolConfig.getTotalLengthId(), byteBuf); + if (appointFrameLength != null) { + //获取过滤的字段集合总长度 + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Integer totalFilterLength = fieldParser.getTotalFilterLength(protocolConfig, byteBuf, getFixFieldConfigMap()); + //计算总长度 + Integer totalLength = appointFrameLength + totalFilterLength; + //加入缓存 + if (ObjectUtils.isNotEmpty(totalLength)) { + this.singleObjects.put(catchKey, totalLength); + return totalLength; + } + } + return null; + } + + /** + * 获取协议有关字段解析内容 + * storeObjectMap存储代转存的数据 + * + * @return + */ + public Map getProtocolDataMap(ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(FIXED_FIELD_DS)) { + return (Map) singleObjects.get(FIXED_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(protocolFieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + this.singleObjects.put(FIXED_FIELD_DS, fixDataMap); + return fixDataMap; + } + return null; + } + + /** + * 获取业务报文内容的content字节 + * + * @param wholeDatagramByte + * @return + */ + public ByteBuf getDataContentBuf(ByteBuf wholeDatagramByte) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(CONTENT_FIELD_DS)) { + return (ByteBuf) singleObjects.get(CONTENT_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + ByteBuf bizDataByteBuf = fieldParser.getDataContentBuf(protocolFieldConfigs, wholeDatagramByte); + if (bizDataByteBuf != null) { + this.singleObjects.put(CONTENT_FIELD_DS, bizDataByteBuf); + return bizDataByteBuf; + } + return null; + } + + + private ProtocolFieldConfig selectFieldConfig(Long id) { + Optional optionalProtocolFieldConfig = this.protocolFieldConfigs.stream().filter( + e -> e.getId().equals(id) + ).findFirst(); + return optionalProtocolFieldConfig.isPresent() ? optionalProtocolFieldConfig.get() : null; + } + + + private Map getFixFieldConfigMap() { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, e -> e) + ); + return fixDataFieldMap; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(protocolFieldConfigs) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java new file mode 100644 index 0000000..dafba1c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java @@ -0,0 +1,56 @@ +package com.casic.missiles.parser.provider; + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.rule.GenericRuleResolver; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.RuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleConfigProvider { + + private final List ruleConfigs; + + public List getRuleConfigs() { + return ruleConfigs; + } + + public RuleConfigProvider(Long protocolId) { + RuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(RuleConfigRegistry.class); + ruleConfigs = ruleConfigRegistry.getRuleConfigById(protocolId); + } + + /** + * 获取规则匹配结果 + * + * @param parseFixedDataMap + * @param protocolFieldConfigs + * @return + */ + public RuleConfig doGetRule(Map parseFixedDataMap, + String ids, + List protocolFieldConfigs) { + if (showSkip()) { + return null; + } + RuleConfig ruleConfig = GenericRuleResolver.machRule(parseFixedDataMap, ids, protocolFieldConfigs, ruleConfigs); + return ruleConfig; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(ruleConfigs) ? false : true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java index 3c05891..856b399 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java @@ -1,18 +1,11 @@ package com.casic.missiles.parser.resolver; -import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.springframework.web.bind.annotation.RequestBody; -import javax.annotation.Resource; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -20,19 +13,17 @@ @Slf4j public class ByteMergeProvider { - @Resource - private FieldRuleEngineMapper fieldRuleEngineMapper; - //拿到所有的值合并到一个值 - public String resolveByteMerge(List valueList, String ruletypeId, String vaildRange) { + public static String resolveByteMerge(List valueList, String ruleTypeId, String vaildRange) { String values = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Map vaildMap = getValidRangeMap(vaildRange); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(ruletypeId); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } + //暂时不处理 +// fieldRuleEngine = fieldRuleConfigMapper.selectById(ruleTypeId); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } Map env2 = new HashMap(); for (int i = 0; i < valueList.size(); i++) { if (vaildMap.containsKey(i)) { @@ -47,7 +38,7 @@ } } - private Map getValidRangeMap(String vaildRange) { + private static Map getValidRangeMap(String vaildRange) { String[] range = vaildRange.split(","); Map vaildMap = new HashMap(); for (int i = 0; i < range.length; i++) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 8d821cd..85d6bbf 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -1,9 +1,12 @@ package com.casic.missiles.parser.resolver; +import com.casic.missiles.pojo.AbstractFieldConfig; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; import io.netty.buffer.ByteBuf; +import java.util.List; import java.util.Map; /** @@ -11,18 +14,14 @@ */ public interface FieldParser { -// Map fieldProcess(String protocolContent,); - Map dataParser(RuleConfig ruleConfig, String lightText,String protocolId); + Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength); - Map fixDataParser(String protocolId, ByteBuf buffer); + Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap); - Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf); + ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer); - ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer); - - ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer); - - Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer); + Integer getTotalFilterLength(ProtocolConfig protocolConfig, ByteBuf byteBuf, Map protocolFieldConfigMap); } + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java new file mode 100644 index 0000000..9e0c00e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java @@ -0,0 +1,52 @@ +package com.casic.missiles.parser.resolver; + +import com.casic.missiles.pojo.AbstractFieldConfig; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.util.List; + +public class FieldParserSupport { + + //分别计算bit和byte长度=> 合并长度 + protected Integer calculateLength(List fieldConfigList) { + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + Integer fixedLength = bytefixedLength + bitfixedLength / 8; + return fixedLength; + } + + //找到最大值=> 根据最大值计算业务数据下标 + protected Integer calculatePosition(List fieldConfigList) { + String rex = "[0-9]+"; + Integer max = -1; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) + && Integer.valueOf(fieldConfig.getOriginPositionByte()) > max) { + max = Integer.valueOf(fieldConfig.getOriginPositionByte()); + } + } + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) && fieldConfig.getOriginPositionByte().equals(max)) { + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + } + } + Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; + return maxFixedPosition; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java deleted file mode 100644 index dd3a6cd..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java +++ /dev/null @@ -1,170 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.ByteResolverParam; -import io.netty.buffer.ByteBuf; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -/** - * 字段解析管理总类 - */ -@Service -@Slf4j -@AllArgsConstructor -public class FieldResolver extends ByteMergeProvider { - - //1、字段截取 => 2、简单的字节解析和复杂的字节解析 - public Object filedParserManger(ByteBuf byteBuf, FieldConfig fieldConfig, Integer maxFixedPosition) { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - //最大固定位置不为空, - if (!ObjectUtil.isEmpty(maxFixedPosition)) { - orignPosition -= maxFixedPosition; - } - Object fieldValue = 0; - //待优化 - if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { - fieldValue = bitToResolver(byteBuf, fieldConfig); - } else { - ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); - fieldValue = parsingFields(fieldBytes, fieldConfig.getRuleJson()); - } - return fieldValue; - } - - //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, - //目前默认配置的规则设置暂不支持配置化,由实现完成 - private Object parsingFields(ByteBuf byteBuf, String ruleJson) { - Object fieldsResolveValue = null; - List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); - if (ObjectUtil.isEmpty(ruleMapList)) { - fieldsResolveValue = defaultResolveBuilder(byteBuf); - } else { - fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); - } - return fieldsResolveValue; - } - - private Object defaultResolveBuilder(ByteBuf byteBuf) { - Integer defaultResolveValue = 0; - for (int i = 0; i < byteBuf.writerIndex(); i++) { - defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; - } - return defaultResolveValue; - } - - //字段解析构建器(针对字节单位的) - //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 - // 字节归并结束或者规则结束=>继续根据规则进行判断 - private Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { - Object customizeResolveValue = null; - try { - List bytStrList = new ArrayList<>(); - //存放到数组里面 - for (int i = 0; i < byteBuf.writerIndex(); i++) { - bytStrList.add(byteBuf.readByte()); - } - int i = 0; - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - customizeResolveValue = this.resolveByteMerge(bytStrList, ruletypeId,vaildRange); - break; - } else { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - List tempBytStr = new ArrayList<>(); - for (int k = 0; i < bytStrList.size(); i++) { - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(k) - .value(bytStrList.get(k)) - .ruletypeId(ruletypeId).build(); - tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); - } - bytStrList = tempBytStr; - } - i++; - } - //字节归并到一起=>继续根据规则进行判断 - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(customizeResolveValue) - .ruletypeId(ruletypeId).build(); - customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(customizeResolveValue)); - return customizeResolveValue; - } catch (RuntimeException ex) { - log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); - return null; - } - } - - /** - * 1、单个字节情况表示字段 - * 2、多字节情况表示字段(暂未处理) - */ - private Object bitToResolver(ByteBuf byteBuf, FieldConfig fieldConfig) { - Object fieldValue = new Object(); - try { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - byte fields = 0x00; - if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); - } else { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); - } - - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { - if (!StringUtils.isEmpty(fieldConfig.getExactOrignPosition())) { - fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getExactOrignPosition())).byteValue() - >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); - } else { - fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); - } - } else { - fieldValue = Integer.valueOf(fields & 0xff); - } - if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { - return fieldValue; - } - List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); - int i = 0; - //字节归并到一起=>继续根据规则进行判断 - while (i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(fieldValue) - .ruletypeId(ruletypeId).build(); - fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(fieldValue)); - return fieldValue; - } catch (RuntimeException ex) { - log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); - return null; - } - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java new file mode 100644 index 0000000..1d2aeab --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java @@ -0,0 +1,36 @@ +package com.casic.missiles.parser.resolver.bytes; + +import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.mapper.FieldRuleConfigMapper; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.pojo.ByteResolverParam; +import com.googlecode.aviator.AviatorEvaluator; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; +//转换规则 +@Component("convert") +@AllArgsConstructor +@Slf4j +public class ByteRuleResolver implements ByteResolver { + + private final FieldRuleConfigMapper fieldRuleConfigMapper; + + @Override + public Object resolveOperationRule(ByteResolverParam byteResolverParam){ + FieldRuleConfig fieldRuleEngine=fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); + if(ObjectUtil.isEmpty(fieldRuleEngine)){ + return byteResolverParam.getValue(); + } + String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); + Map env2 = new HashMap(); + env2.put("value", (byte) byteResolverParam.getValue()); + String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); + return values; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java index 103821c..786b71c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java @@ -2,34 +2,34 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("logicalShift") +@Component("logicalShift") @AllArgsConstructor @Slf4j public class LogicalShiftResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //字节位移 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { Integer index = byteResolverParam.getIndex(); - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return byteResolverParam.getValue(); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java index 476747d..01149bd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("operation") +@Component("operation") @AllArgsConstructor @Slf4j public class OperationResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //混合运算,有常量或者乘除的缩放 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java index 0b82cf4..79abcce 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.casic.missiles.pojo.ByteResolverParam; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; //精度计算 -@Service("precision") +@Component("precision") @AllArgsConstructor @Slf4j public class PrecisionResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java deleted file mode 100644 index 5c3f332..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; -//转换规则 -@Service("convert") -@AllArgsConstructor -@Slf4j -public class RuleResolver implements ByteResolver { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam){ - RuleEvaluator fieldRuleEngine=fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); - if(ObjectUtil.isEmpty(fieldRuleEngine)){ - return byteResolverParam.getValue(); - } - String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); - Map env2 = new HashMap(); - env2.put("value", (byte) byteResolverParam.getValue()); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java new file mode 100644 index 0000000..d3bbd91 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java @@ -0,0 +1,15 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; + +import java.util.List; +import java.util.Map; +// 前导码匹配->长度字段 +public interface AbstractCombinedFieldProcessor { + + Map invoke(Map map, ByteBuf byteBuf, List combinedFieldConfigList, + Map fieldConfigsMap, Map storeObjectMap); + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java new file mode 100644 index 0000000..03c8480 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java @@ -0,0 +1,59 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-13 + */ +//依次递增进行数据的解析, +public class GenericCombinedFieldResolver { + + + //通过查询,字段长度长度随机 + public void parseDataField(List combinedFieldConfigList, ByteBuf byteBuf, + Map storeObjectMap, Map fieldConfigsMap) { + Integer frameLength = Integer.valueOf(ByteBufUtil.hexDump(byteBuf)); + //添加前置处理器 + com.casic.missiles.util.ClassUtil classUtil = new com.casic.missiles.util.ClassUtil(); + List abstractCombinedProcessors = classUtil.getSubClassList(AbstractCombinedFieldProcessor.class); + + Map fieldFixedMap = combinedFieldLeadCodeMap(combinedFieldConfigList); + //frameLength + Map combinedProcessorFields = null; + while (byteBuf.readableBytes() < frameLength) { + //一直处理 + for (AbstractCombinedFieldProcessor abstractCombinedProcessor : abstractCombinedProcessors) { + combinedProcessorFields = abstractCombinedProcessor.invoke(combinedProcessorFields, byteBuf, + combinedFieldConfigList, + fieldConfigsMap, storeObjectMap); + if (combinedProcessorFields == null || byteBuf.readableBytes() < frameLength) { + return; + } + } + + } + } + + /** + * 取出前导码匹配集合 + */ + private Map combinedFieldLeadCodeMap(List combinedFieldConfigList) { + Map fieldFixedMap = combinedFieldConfigList + .stream() + .collect(Collectors.toMap(CombinedFieldConfig::getPrefixCode, e -> e)); + return fieldFixedMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java new file mode 100644 index 0000000..643a934 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java @@ -0,0 +1,100 @@ +package com.casic.missiles.parser.resolver.fields; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.FieldParserSupport; +import com.casic.missiles.pojo.*; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 保存使用时最基本的信息,并且使用原型模式 + */ +@Slf4j +public class DefaultProtocolFieldParser extends FieldParserSupport implements FieldParser, FixedPropertyEnum { + + //通过传入的配置和报文进行字段解析 + @Override + public Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap) { + Map dataMap = new HashMap<>(); + for (AbstractFieldConfig protocolFieldConfig : protocolFieldConfigs) { + if (!ObjectUtils.isEmpty(protocolFieldConfig.getOriginPositionByte())) { + Object fieldValue = FieldResolver.parseField(buffer, protocolFieldConfig, null); + if (protocolFieldConfig.getIsStorage() == 1) { + storeObjectMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + dataMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + } + return dataMap; + } + + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength) { + Map fixedPropertyMap = new HashMap<>(); + Integer fixedLength = calculateLength(protocolFieldConfigs); + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + fixedPropertyMap.put(FIXED_POSITION, maxFixedPosition); + fixedPropertyMap.put(TOTAL_LENGTH, totalLength); + fixedPropertyMap.put(TAIL_POSITION, totalLength - fixedLength + maxFixedPosition); + return fixedPropertyMap; + } + + //** 获取业务内容的byteBuf + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer) { + //计算固定长度 + Integer fixedLength = calculateLength(protocolFieldConfigs); + //总长度获取 + String lightText = buffer.toString(Charset.forName("ISO-8859-1")); + Integer totalLength = lightText.length(); + //计算固定长度最大长度 + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + //计算数据报文内容 + ByteBuf bizDataFields = buffer.slice(maxFixedPosition - 1, (totalLength - fixedLength)); + return bizDataFields; + } + + /** + * 获取过滤字段的长度 + */ + @Override + public Integer getTotalFilterLength(ProtocolConfig protocolConfig, + ByteBuf byteBuf, + Map protocolFieldConfigMap) { + if (ByteBufUtil.hexDump(byteBuf).equals("")) { + return 0; + } + int totalFilterLength = 0; + String filterFields = protocolConfig.getTotalLengthFilterFields(); + try { + if (!StringUtils.isEmpty(filterFields)) { + String[] filterFieldList = filterFields.split(","); + for (String filterFieldId : filterFieldList) { + if (StringUtils.isNotEmpty(filterFieldId)) { + ProtocolFieldConfig fieldConfig = protocolFieldConfigMap.get(Long.valueOf(filterFieldId)); + //这里都是按字节计算,没有对位进行区分,可能会出现错误 + // 如果对位有需求,需要进一步跟进 + totalFilterLength += fieldConfig.getOffsetLength(); + } + } + } + return totalFilterLength; + } catch (Exception ex) { + log.error("报文确认分发阶段,获取报文总长度过滤长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); + } + return totalFilterLength; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java new file mode 100644 index 0000000..d51e887 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java @@ -0,0 +1,169 @@ +package com.casic.missiles.parser.resolver.fields; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.parser.resolver.ByteMergeProvider; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.AbstractFieldConfig; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.pojo.ByteResolverParam; +import io.netty.buffer.ByteBuf; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * 字段解析管理总类 + */ +@Slf4j +public class FieldResolver extends ByteMergeProvider { + + //1、字段截取 => 2、简单的字节解析和复杂的字节解析 + public static Object parseField(ByteBuf byteBuf,AbstractFieldConfig fieldConfig, Integer maxFixedPosition) { + Integer orignPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + //最大固定位置不为空, + if (!ObjectUtil.isEmpty(maxFixedPosition)) { + orignPosition -= maxFixedPosition; + } + Object fieldValue = 0; + //待优化 + if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { + fieldValue = doParseBitField(byteBuf, fieldConfig); + } else { + ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); + fieldValue = doParseByteField(fieldBytes, fieldConfig.getRuleJson()); + } + return fieldValue; + } + + //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, + //目前默认配置的规则设置暂不支持配置化,由实现完成 + private static Object doParseByteField(ByteBuf byteBuf, String ruleJson) { + Object fieldsResolveValue = null; + List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); + if (ObjectUtil.isEmpty(ruleMapList)) { + fieldsResolveValue = defaultResolveBuilder(byteBuf); + } else { + fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); + } + return fieldsResolveValue; + } + + private static Object defaultResolveBuilder(ByteBuf byteBuf) { + Integer defaultResolveValue = 0; + for (int i = 0; i < byteBuf.writerIndex(); i++) { + defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; + } + return defaultResolveValue; + } + + //字段解析构建器(针对字节单位的) + //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 + // 字节归并结束或者规则结束=>继续根据规则进行判断 + private static Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { + Object customizeResolveValue = null; + try { + List bytStrList = new ArrayList<>(); + //存放到数组里面 + for (int i = 0; i < byteBuf.writerIndex(); i++) { + bytStrList.add(byteBuf.readByte()); + } + int i = 0; + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { + if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + customizeResolveValue = resolveByteMerge(bytStrList, ruletypeId, vaildRange); + break; + } else { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + List tempBytStr = new ArrayList<>(); + for (int k = 0; i < bytStrList.size(); i++) { + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(k) + .value(bytStrList.get(k)) + .ruletypeId(ruletypeId).build(); + tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); + } + bytStrList = tempBytStr; + } + i++; + } + //字节归并到一起=>继续根据规则进行判断 + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(null) + .value(customizeResolveValue) + .ruletypeId(ruletypeId).build(); + customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); + i++; + } + System.out.println(JSON.toJSON(customizeResolveValue)); + return customizeResolveValue; + } catch (RuntimeException ex) { + log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); + return null; + } + } + + /** + * 1、单个字节情况表示字段 + * 2、多字节情况表示字段(暂未处理) + */ + private static Object doParseBitField(ByteBuf byteBuf,AbstractFieldConfig fieldConfig) { + Object fieldValue = new Object(); + try { + Integer orignPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + byte fields = 0x00; + if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { + fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); + } else { + fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); + } + + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { + if (!StringUtils.isEmpty(fieldConfig.getOriginPositionBit())) { + fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getOriginPositionBit())).byteValue() + >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); + } else { + fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); + } + } else { + fieldValue = Integer.valueOf(fields & 0xff); + } + if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { + return fieldValue; + } + List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); + int i = 0; + //字节归并到一起=>继续根据规则进行判断 + while (i < ruleMapList.size()) { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(null) + .value(fieldValue) + .ruletypeId(ruletypeId).build(); + fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); + i++; + } + System.out.println(JSON.toJSON(fieldValue)); + return fieldValue; + } catch (RuntimeException ex) { + log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); + return null; + } + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java deleted file mode 100644 index 35ae3d0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java +++ /dev/null @@ -1,183 +0,0 @@ -package com.casic.missiles.parser.resolver.fields; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufAllocator; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; -import org.springframework.util.ObjectUtils; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service("standard") -@AllArgsConstructor -@Slf4j -public class StandardFieldParser implements FieldParser { - - private final FieldConfigDao fieldConfigDao; - private final FieldResolver fieldResolver; - - //数据解析 - @Override - public Map dataParser(RuleConfig ruleConfig, String lightText, String protocolId) { - String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); - ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); - bufferContent.writeBytes(lightText.getBytes(Charset.forName("ISO-8859-1"))); - Map dataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - for (String dataFieldId : dataFieldIds) { - FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(dataFieldId); - if (!ObjectUtils.isEmpty(fieldConfig)) { - dataMap.put(fieldConfig.getFieldName(), String.valueOf(fieldResolver.filedParserManger(bufferContent, fieldConfig, maxFixedPosition))); - } - } - return dataMap; - } - - //数据解析 - @Override - public Map fixDataParser(String protocolId, ByteBuf buffer) { - List dataFieldIdList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Map dataMap = new HashMap<>(); - for (FieldConfig dataField : dataFieldIdList) { - if (!ObjectUtils.isEmpty(dataField.getOrignPosition())) { - Object fieldValue = (Integer) fieldResolver.filedParserManger(buffer, dataField, null); - dataMap.put(dataField.getFieldName(), fieldValue); - } - } - return dataMap; - } - - @Override - public Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf) { - if (ByteBufUtil.hexDump(byteBuf).equals("")) { - return 0; - } - String filterFields = protocolConfig.getTotalLengthFilterField(); - Integer totalLength = 0; - try { - FieldConfig totalFieldConfig = fieldConfigDao.getFieldConfigById(protocolConfig.getTotalLengthId()); - int totalFilterLength = 0; - if (!StringUtils.isEmpty(filterFields)) { - String[] filterFieldList = filterFields.split(","); - for (String filterField : filterFieldList) { - FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(filterField); - //这里都是按字节计算,没有对位进行区分,可能会出现错误 - - // 如果对位有需求,需要进一步跟进 - totalFilterLength += fieldConfig.getOffsetLength(); - } - } - totalLength = (Integer) fieldResolver.filedParserManger(byteBuf, totalFieldConfig, null) + totalFilterLength; - } catch (Exception ex) { - log.error("报文确认分发阶段,获取报文总长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); - } - return totalLength; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer) { - //业务内容 - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - String protocolId = String.valueOf(protocolConfig.getId()); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - //计算固定长度 - Integer fixedLength = calculateLength(fieldConfigList); -// Integer totalLength = this.getTotalLength(protocolConfig, buffer); - //总长度获取 - Integer totalLength = lightText.length(); - //计算固定长度最大长度 - Integer maxFixedPosition = calculatePosition(fieldConfigList); -// buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - //计算数据报文内容 - ByteBuf bizDataFields = buffer.slice(maxFixedPosition-1, (totalLength - fixedLength)); - return bizDataFields; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer) { - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - String protocolId = String.valueOf(protocolConfig.getId()); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer fixedLength = calculateLength(fieldConfigList); -// Integer totalLength = this.getTotalLength(protocolConfig, buffer); - Integer totalLength = lightText.length(); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - ByteBuf fixDataFields = buffer.slice(0, maxFixedPosition); - return fixDataFields; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer) { - String protocolId = String.valueOf(protocolConfig.getId()); - Map fixedPropertyMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer fixedLength = calculateLength(fieldConfigList); - Integer totalLength = this.getTotalLength(protocolConfig, buffer); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - fixedPropertyMap.put("fixedPosition", maxFixedPosition); - fixedPropertyMap.put("totalLength", totalLength); - fixedPropertyMap.put("tailPosition", totalLength - fixedLength + maxFixedPosition); - return fixedPropertyMap; - } - - //分别计算bit和byte长度=> 合并长度 - private Integer calculateLength(List fieldConfigList) { - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (FieldConfig fieldConfig : fieldConfigList) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - Integer fixedLength = bytefixedLength + bitfixedLength / 8; - return fixedLength; - } - - //找到最大值=> 根据最大值计算业务数据下标 - private Integer calculatePosition(List fieldConfigList) { - String rex = "[0-9]+"; - Integer max = -1; - for (FieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOrignPosition()) - && Integer.valueOf(fieldConfig.getOrignPosition()) > max) { - max = Integer.valueOf(fieldConfig.getOrignPosition()); - } - } - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (FieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOrignPosition()) && fieldConfig.getOrignPosition().equals(max)) { - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - } - } - Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; - return maxFixedPosition; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java new file mode 100644 index 0000000..d4ec6c7 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java @@ -0,0 +1,76 @@ +package com.casic.missiles.parser.rule; + +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import org.apache.commons.lang3.StringUtils; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class GenericRuleResolver { + + //根据前置字段的值,找到指定的规则 + //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 + //=>循环判断=>通过规则得到业务字段 + public static RuleConfig machRule(Map fixDataMap, + String ids, + List protocolFieldConfigs, + List ruleConfigs) { + List preRuleConfigList = getPreRuleList(ids, protocolFieldConfigs); + //获取前置规则字段 + final Map metaDataMap = getPreRuleFields(preRuleConfigList, fixDataMap); + //准备固定的字段集合 + Map fixDataFieldMap = getFixDataFieldMap(protocolFieldConfigs); + return RuleResolverCore.doMachRule(ruleConfigs, metaDataMap, fixDataMap, fixDataFieldMap); + } + + private static Map getFixDataFieldMap(List protocolFieldConfigs) { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, ProtocolFieldConfig::getFieldName) + ); + return fixDataFieldMap; + } + + + /** + * 查询前置规则的字段配置 + * + * @param ids + * @return + */ + private static List getPreRuleList(String ids, List protocolFieldConfigs) { + String[] idList = ids.split(","); + Map prepareMaps = new HashMap<>(); + for (String id : idList) { + if (StringUtils.isNotEmpty(id)) { + prepareMaps.put(Long.valueOf(id), ""); + } + } + List preRuleConfigList = protocolFieldConfigs + .stream() + .filter(e -> prepareMaps.containsKey(e.getId())) + .collect(Collectors.toList()); + return preRuleConfigList; + } + + /** + * 获取前置规则解析字段 + */ + private static Map getPreRuleFields(List preRuleFieldConfigList, Map fixDataMap) { + Map ruleFieldMap = new HashMap<>(); + preRuleFieldConfigList.stream() + .forEach( + preRuleFieldConfig -> { + String fieldName = preRuleFieldConfig.getFieldName(); + if (fixDataMap.containsKey(fieldName)) { + ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); + } + } + ); + return ruleFieldMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java new file mode 100644 index 0000000..baae7e8 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -0,0 +1,68 @@ +package com.casic.missiles.parser.rule; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.casic.missiles.pojo.RuleConfig; + +import java.util.*; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleResolverCore { + + + public static RuleConfig doMachRule(List ruleConfigList, Map metaDataMap, + Map fixDataMap, + Map fixDataFieldMap) { + Optional ruleConfigOptional = ruleConfigList.stream() + .filter(ruleConfig -> machRuleConfig( + JSON.parseObject(ruleConfig.getMatchRuleJson(), Map.class), metaDataMap)) + .findFirst(); + if (ObjectUtil.isEmpty(ruleConfigOptional)) { + return null; + } + String[] ruleFields = ruleConfigOptional.get().getDataFieldIds().split(","); + Map ruleMetaDataMap = getRuleFields(ruleFields, fixDataMap, fixDataFieldMap); + //递归选定解析规则,进行规则解析 + if (!ruleConfigOptional.get().getIsFinishMatch().equals("1")) { + //递归选定规则 + doMachRule(ruleConfigList, ruleMetaDataMap, fixDataMap, fixDataFieldMap); + } + return ruleConfigOptional.get(); + } + + + private static Map getRuleFields(String[] preRuleConfigList, Map fixedDataMap, + Map fixedFieldMap) { + Map ruleFieldMap = new HashMap<>(); + for (String preRuleConfigId : preRuleConfigList) { + String fieldName = fixedFieldMap.get(preRuleConfigId); + if (fixedDataMap.containsKey(fieldName)) { + ruleFieldMap.put(fieldName, String.valueOf(fixedDataMap.get(fieldName))); + } + } + return ruleFieldMap; + } + + + //匹配规则配置 + private static Boolean machRuleConfig(Map ruleMap, Map metaDataMap) { + if (ruleMap == null || metaDataMap == null) { + return null; + } + //所有的字段在规则里面必须有有配置 + for (String key : metaDataMap.keySet()) { + if (ruleMap.containsKey(key)) { + if (!ruleMap.get(key).equals(metaDataMap.get(key))) { + return false; + } + } else { + return false; + } + } + return true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java deleted file mode 100644 index 664088d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java +++ /dev/null @@ -1,92 +0,0 @@ -package com.casic.missiles.parser.rule; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.mapper.dao.PreRuleConfigDao; -import com.casic.missiles.mapper.dao.RuleConfigDao; -import lombok.AllArgsConstructor; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.*; -import java.util.stream.Collectors; - -@Service -@AllArgsConstructor -public class RulerProvider { - - private final FieldConfigDao fieldConfigDao; - private final PreRuleConfigDao preRuleConfigDao; - private final RuleConfigDao ruleConfigDao; - - //根据前置字段的值,找到指定的规则 - //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 - //=>循环判断=>通过规则得到业务字段 - public RuleConfig ruleConfig(Map fixDataMap, String protocolId) { - //批量获取规则 - List preRuleConfigList = preRuleConfigDao.getPreRuleList(protocolId); - //获取固定字段 - Map fixFieldMap = getAllFieldMap(protocolId); - //获取前置规则字段 - final String preRuleFields = getPreRuleFields(preRuleConfigList, fixDataMap, fixFieldMap); - List ruleConfigList = ruleConfigDao.getRuleConfigById(protocolId); - Optional ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig ->preRuleFields.equals( ruleConfig.getParseRuleJson())).findFirst(); - //递归选定解析规则,进行规则解析 - while (!ObjectUtil.isEmpty(ruleConfigOptional) && !ruleConfigOptional.get().getIsBizField().equals("1")) { - String ruleFields = getRuleFields(ruleConfigOptional.get().getDataFieldIds().split(","), fixDataMap, fixFieldMap); - ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig -> ruleConfig.getParseRuleJson().equals(ruleFields)).findFirst(); - } - return ruleConfigOptional.get(); - } - - /** - * 获取前置规则解析字段 - */ - private String getPreRuleFields(List preRuleConfigList, Map fixDataMap, Map fixFieldMap) { - Map ruleFieldMap= new HashMap<>(); - preRuleConfigList.stream() - .forEach( - preRuleConfig -> { - String fieldName = fixFieldMap.get(Long.valueOf(preRuleConfig.getRuleFieldId())); - if (fixDataMap.containsKey(fieldName)) { - ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); - } - } - ); - return JSONObject.toJSONString(ruleFieldMap); - } - - private Map getAllFieldMap(String protocolId) { - List fieldList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Map fixFieldMap = fieldList.stream().collect( - Collectors.toMap(FieldConfig::getId, FieldConfig::getFieldName) - ); - return fixFieldMap; - } - - private String getRuleFields(String[] preRuleConfigList, Map fixDataMap, Map fixFieldMap) { - Map ruleFieldMap= new HashMap<>(); - for (String preRuleConfigId : preRuleConfigList) { - String fieldName = fixFieldMap.get(preRuleConfigId); - if (fixDataMap.containsKey(fieldName)) { - ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); - } - } - return JSONObject.toJSONString(ruleFieldMap); - } - - //弃置 - private String ListToString(List ruleFieldList) { - String ruleFields = ""; - for (String ruleField : ruleFieldList) { - ruleFields += ruleField + ","; - } - ruleFields = StringUtils.isEmpty(ruleFields) ? ruleFields : ruleFields.substring(0, ruleFields.length() - 1); - return ruleFields; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java index 6177e10..bfa87a5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java @@ -2,7 +2,7 @@ public interface SafeStrategy { - String decryption(byte[] bytes); + String decryption(String cipher); String encryption(String lightText); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java index 618716c..6236302 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java @@ -9,9 +9,9 @@ //十六进制的字符串转换成字节数组 byte[] bytes = hexStrToBinaryStr(msg); //计算CRC8 - byte crc8 = CRC8(bytes, 0, bytes.length); - String crc8ToStr = "" + Integer.toHexString(0xff & crc8); - return crc8ToStr; +// String crc8ToStr = "" + Integer.toHexString(0xff & crc8); +// return crc8ToStr; + return null; } /** @@ -33,50 +33,5 @@ return bytes; } - /** - * CRC8 校验 多项式 x8+x2+x+1 - * - * @param b - * @param off - * @param len - * @return - */ - public static byte CRC8(final byte[] b, final int off, final int len) { - byte result = 0x00; - for (int i = 0; i < len; i++) { - result = CHECKSUM_TABLE[(result ^ (b[i + off] & 0xFF)) & 0xFF]; - } - return (byte) (result & 0xFFL); - } - - private final static byte[] CHECKSUM_TABLE = {(byte) 0x00, (byte) 0x07, (byte) 0x0e, (byte) 0x09, (byte) 0x1c, (byte) 0x1b, - (byte) 0x12, (byte) 0x15, (byte) 0x38, (byte) 0x3f, (byte) 0x36, (byte) 0x31, (byte) 0x24, (byte) 0x23, (byte) 0x2a, - (byte) 0x2d, (byte) 0x70, (byte) 0x77, (byte) 0x7e, (byte) 0x79, (byte) 0x6c, (byte) 0x6b, (byte) 0x62, (byte) 0x65, - (byte) 0x48, (byte) 0x4f, (byte) 0x46, (byte) 0x41, (byte) 0x54, (byte) 0x53, (byte) 0x5a, (byte) 0x5d, (byte) 0xe0, - (byte) 0xe7, (byte) 0xee, (byte) 0xe9, (byte) 0xfc, (byte) 0xfb, (byte) 0xf2, (byte) 0xf5, (byte) 0xd8, (byte) 0xdf, - (byte) 0xd6, (byte) 0xd1, (byte) 0xc4, (byte) 0xc3, (byte) 0xca, (byte) 0xcd, (byte) 0x90, (byte) 0x97, (byte) 0x9e, - (byte) 0x99, (byte) 0x8c, (byte) 0x8b, (byte) 0x82, (byte) 0x85, (byte) 0xa8, (byte) 0xaf, (byte) 0xa6, (byte) 0xa1, - (byte) 0xb4, (byte) 0xb3, (byte) 0xba, (byte) 0xbd, (byte) 0xc7, (byte) 0xc0, (byte) 0xc9, (byte) 0xce, (byte) 0xdb, - (byte) 0xdc, (byte) 0xd5, (byte) 0xd2, (byte) 0xff, (byte) 0xf8, (byte) 0xf1, (byte) 0xf6, (byte) 0xe3, (byte) 0xe4, - (byte) 0xed, (byte) 0xea, (byte) 0xb7, (byte) 0xb0, (byte) 0xb9, (byte) 0xbe, (byte) 0xab, (byte) 0xac, (byte) 0xa5, - (byte) 0xa2, (byte) 0x8f, (byte) 0x88, (byte) 0x81, (byte) 0x86, (byte) 0x93, (byte) 0x94, (byte) 0x9d, (byte) 0x9a, - (byte) 0x27, (byte) 0x20, (byte) 0x29, (byte) 0x2e, (byte) 0x3b, (byte) 0x3c, (byte) 0x35, (byte) 0x32, (byte) 0x1f, - (byte) 0x18, (byte) 0x11, (byte) 0x16, (byte) 0x03, (byte) 0x04, (byte) 0x0d, (byte) 0x0a, (byte) 0x57, (byte) 0x50, - (byte) 0x59, (byte) 0x5e, (byte) 0x4b, (byte) 0x4c, (byte) 0x45, (byte) 0x42, (byte) 0x6f, (byte) 0x68, (byte) 0x61, - (byte) 0x66, (byte) 0x73, (byte) 0x74, (byte) 0x7d, (byte) 0x7a, (byte) 0x89, (byte) 0x8e, (byte) 0x87, (byte) 0x80, - (byte) 0x95, (byte) 0x92, (byte) 0x9b, (byte) 0x9c, (byte) 0xb1, (byte) 0xb6, (byte) 0xbf, (byte) 0xb8, (byte) 0xad, - (byte) 0xaa, (byte) 0xa3, (byte) 0xa4, (byte) 0xf9, (byte) 0xfe, (byte) 0xf7, (byte) 0xf0, (byte) 0xe5, (byte) 0xe2, - (byte) 0xeb, (byte) 0xec, (byte) 0xc1, (byte) 0xc6, (byte) 0xcf, (byte) 0xc8, (byte) 0xdd, (byte) 0xda, (byte) 0xd3, - (byte) 0xd4, (byte) 0x69, (byte) 0x6e, (byte) 0x67, (byte) 0x60, (byte) 0x75, (byte) 0x72, (byte) 0x7b, (byte) 0x7c, - (byte) 0x51, (byte) 0x56, (byte) 0x5f, (byte) 0x58, (byte) 0x4d, (byte) 0x4a, (byte) 0x43, (byte) 0x44, (byte) 0x19, - (byte) 0x1e, (byte) 0x17, (byte) 0x10, (byte) 0x05, (byte) 0x02, (byte) 0x0b, (byte) 0x0c, (byte) 0x21, (byte) 0x26, - (byte) 0x2f, (byte) 0x28, (byte) 0x3d, (byte) 0x3a, (byte) 0x33, (byte) 0x34, (byte) 0x4e, (byte) 0x49, (byte) 0x40, - (byte) 0x47, (byte) 0x52, (byte) 0x55, (byte) 0x5c, (byte) 0x5b, (byte) 0x76, (byte) 0x71, (byte) 0x78, (byte) 0x7f, - (byte) 0x6a, (byte) 0x6d, (byte) 0x64, (byte) 0x63, (byte) 0x3e, (byte) 0x39, (byte) 0x30, (byte) 0x37, (byte) 0x22, - (byte) 0x25, (byte) 0x2c, (byte) 0x2b, (byte) 0x06, (byte) 0x01, (byte) 0x08, (byte) 0x0f, (byte) 0x1a, (byte) 0x1d, - (byte) 0x14, (byte) 0x13, (byte) 0xae, (byte) 0xa9, (byte) 0xa0, (byte) 0xa7, (byte) 0xb2, (byte) 0xb5, (byte) 0xbc, - (byte) 0xbb, (byte) 0x96, (byte) 0x91, (byte) 0x98, (byte) 0x9f, (byte) 0x8a, (byte) 0x8d, (byte) 0x84, (byte) 0x83, - (byte) 0xde, (byte) 0xd9, (byte) 0xd0, (byte) 0xd7, (byte) 0xc2, (byte) 0xc5, (byte) 0xcc, (byte) 0xcb, (byte) 0xe6, - (byte) 0xe1, (byte) 0xe8, (byte) 0xef, (byte) 0xfa, (byte) 0xfd, (byte) 0xf4, (byte) 0xf3}; } \ No newline at end of file diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java index 27c2838..6e078a3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java @@ -1,9 +1,6 @@ package com.casic.missiles.parser.safe.impl; -import cn.hutool.core.util.CharsetUtil; -import cn.hutool.crypto.symmetric.SM4; -import cn.hutool.crypto.symmetric.SymmetricCrypto; - +import com.casic.missiles.parser.safe.SafeStrategy; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; @@ -11,19 +8,44 @@ import org.bouncycastle.crypto.engines.SM4Engine; import org.bouncycastle.crypto.params.KeyParameter; import org.bouncycastle.util.encoders.Hex; - -import static cn.hutool.crypto.Mode.ECB; -import static cn.hutool.crypto.Padding.NoPadding; +import org.springframework.stereotype.Component; /** * SM4算法工具类 */ @Slf4j -public class Sm4 { +@Component("sm4") +public class Sm4 implements SafeStrategy { //加解密的字节快大小 public static final int BlockSize = 16; + @Override + public String decryption(String cipher) { + byte[] keyByte = { + 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 + }; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(keyByte); + byte[] in = Hex.decode(cipher); + byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); + String plain = EcbDecrypt(in, keyBytes); + return plain; + } + + @Override + public String encryption(String cipher) { + byte[] keyByte = { + 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 + }; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(keyByte); + byte[] in = Hex.decode(cipher); + byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); + String plain = EcbDecrypt(in, keyBytes); + return plain; + } + /** * SM4ECB加密算法,对内 * @@ -32,8 +54,6 @@ * @return */ private static byte[] ecb_encrypt(byte[] in, byte[] keyBytes) { - - SM4Engine sm4Engine = new SM4Engine(); sm4Engine.init(true, new KeyParameter(keyBytes)); byte[] out = new byte[in.length]; @@ -58,27 +78,6 @@ return cipher; } - - /** - * hutool 解密SM4 - * - * @param encodeContent - * @return - */ - public static String decode(String encodeContent) { - String key = "24ad182507479a5da3ad94d9d78ea203"; - try { - SymmetricCrypto sm4 = new SM4(ECB, NoPadding, key.getBytes()); - String decryptStr = sm4.decryptStr(encodeContent, CharsetUtil.CHARSET_UTF_8); - return decryptStr; - } catch (Exception e) { - e.printStackTrace(); - log.error("SM4解密失败"); - } - return null; - } - - /** * SM4的ECB加密算法 * @@ -129,20 +128,6 @@ return plain; } - /** - * SM4的ECB解密算法 - * - * @param cipher 输入的密文字符串 - * @param key 密钥 - * @return - */ - public static String EcbDecrypt(String cipher, String key) { - byte[] in = Hex.decode(cipher); - byte[] keyBytes = Hex.decode(key); - - String plain = EcbDecrypt(in, keyBytes); - return plain; - } /** * 主函数 @@ -151,28 +136,24 @@ */ public static void main(String[] args) { byte[] ciphertext = { + 0x4B, (byte) 0x8C, (byte) 0x9D, 0x08, (byte) 0xE4, (byte) 0xD3, 0x64, 0x42, (byte) 0xB9, (byte) 0xA5, (byte) 0xFE, (byte) 0xCD, (byte) 0x91, 0x1B, 0x38, (byte) 0xAC, (byte) 0xE9, 0x1C, (byte) 0xCD, 0x53, 0x02, (byte) 0xD7, 0x0C, (byte) 0x9B, (byte) 0x96, 0x30, 0x62, (byte) 0xE8, (byte) 0xFB, (byte) 0xEF, (byte) 0xB9, (byte) 0xFF, (byte) 0xDE, 0x19, (byte) 0x80, 0x35, 0x3E, (byte) 0x90, 0x4F, 0x2F, 0x12, 0x2B, 0x19, (byte) 0x8B, 0x6C, 0x7A, (byte) 0x85, (byte) 0xA1, (byte) 0xB1, (byte) 0x86, (byte) 0xA3, 0x7A, 0x46, 0x0C, 0x2F, (byte) 0x94, 0x4F, 0x7F, 0x2C, 0x56, 0x14, (byte) 0xF3, (byte) 0x89, (byte) 0xC3, - 0x3F, 0x20, (byte) 0xF9, (byte) 0x87, (byte) 0xA1, 0x60, (byte) 0xD9, (byte) 0xA8, (byte) 0xFD, (byte) 0xD7, (byte) 0x9B, 0x4B, 0x26, 0x06, 0x30, 0x44}; + 0x3F, 0x20, (byte) 0xF9, (byte) 0x87, (byte) 0xA1, 0x60, (byte) 0xD9, (byte) 0xA8, (byte) 0xFD, (byte) 0xD7, (byte) 0x9B, 0x4B, 0x26, 0x06, 0x30, 0x44 + }; ByteBuf in = ByteBufAllocator.DEFAULT.heapBuffer(); in.writeBytes(ciphertext); - byte[] keyByte = { 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 }; ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); - key.writeBytes(ciphertext); - String resCipherData = decode(ByteBufUtil.hexDump(in)); - ByteBuf out = ByteBufAllocator.DEFAULT.heapBuffer(); -// out.writeBytes(resCipherData); -// System.out.println(hexBytes); - System.out.println(resCipherData.toString()); -// String resPlainData = EcbDecrypt(resCipherData, key); -// System.out.println("原始明文:" + data); -// System.out.println("解密后明文:" + resPlainData); + key.writeBytes(keyByte); +// String resCipherData = EcbDecrypt(ByteBufUtil.hexDump(in), ByteBufUtil.hexDump(key)); +// System.out.println(resCipherData); } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java index 1395a51..ac5f957 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java @@ -1,7 +1,7 @@ package com.casic.missiles.parser.safe.impl; import io.netty.buffer.ByteBufUtil; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** *

@@ -14,9 +14,8 @@ * @author hyl * @version v1.0: Tea.java, v 0.1 2021/3/12 13:48 $ */ -@Service("tea") -///tea算法类 - +//tea算法类 +@Component("tea") public class Tea { public static byte[] MyTea_Encrypt(byte[] MyTeaContent, int ByteLen, byte[] MyTeakey) { @@ -99,7 +98,6 @@ // for(int i32Index = 0; i32Index < 8; i32Index++) { // System.out.print("0x" + Integer.toHexString(MyContent[i32Index]) + " "); // } - // System.out.println("密钥为:"); // for(int i32Index = 0; i32Index < 16; i32Index++) { // System.out.print("0x" + Integer.toHexString(MyKeys[i32Index]) + " "); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java index bdd0721..bd1516a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java @@ -3,7 +3,7 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.parser.sender.DataSubscribeProvider; import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponents; import org.springframework.web.util.UriComponentsBuilder; @@ -12,7 +12,7 @@ import java.util.Collections; import java.util.Map; -@Service("functionCallback") +@Component("functionCallback") public class FunctionCallback implements DataSubscribeProvider { @Resource diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java index 0b44fb9..7526de2 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.Map; -@Service("middleware") +@Component("middleware") public class MiddlewareSubscribe implements DataSubscribeProvider { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java index 5dcee3f..e2f1192 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.Map; -@Service("nosql") +@Component("nosql") public class NoSqlSubscribe implements DataSubscribeProvider { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java b/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java new file mode 100644 index 0000000..81a5324 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java @@ -0,0 +1,86 @@ +package com.casic.missiles.pojo; + +import lombok.Data; + +/** + * 协议 + */ +@Data +public class Msg { + + /** + * 前导码 + */ + private String preamble; + + /** + * 版本号 + */ + private String version; + + /** + * 内容长度 + */ + private int leng; + + /** + * 设备ID + */ + private String deviceId; + + /** + * 通讯方式 + */ + private Integer connType; + + /** + * 加密方式 + */ + private Integer encryType; + + /** + * 目标地址 + */ + private String destAddr; + + /** + * PDUType + */ + private String PDUType; + + /** + * 操作类型 + */ + private Integer operateType; + + /** + * 传输控制位 PDUType.bit7=0时,表示存在后续的访问;当PDUType.bit7=1时,表示无后续的访问。 + */ + private Integer transControlFlag; + + /** + * 设备类型 + */ + private Integer deviceType; + + /** + * 序号 + */ + private Integer seq; + + /** + * tagList + */ + private String tagList; + + /** + * OidList + */ + private String OidList; + + /** + * CRC + */ + private String CRC; + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java index 40a5265..97cc984 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java @@ -40,7 +40,7 @@ String httpContent = msg.toString(Charset.defaultCharset()); log.info(" String : " + msg.toString(Charset.defaultCharset())); String majorContent = httpContent.substring(httpContent.indexOf("{"), httpContent.lastIndexOf("}") + 1); - String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("serviceData")).get("Value")); + String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("RegistryData")).get("Value")); log.info("----------------------------------" + values); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); bufferContent.writeBytes(values.getBytes(Charset.forName("ISO-8859-1"))); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java index 1b132a7..e3ced4b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java @@ -35,7 +35,7 @@ String httpContent = msg.toString(Charset.defaultCharset()); log.info(" String : " + msg.toString(Charset.defaultCharset())); String majorContent = httpContent.substring(httpContent.indexOf("{"), httpContent.lastIndexOf("}") + 1); - String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("serviceData")).get("Value")); + String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("RegistryData")).get("Value")); log.info("----------------------------------" + values); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); bufferContent.writeBytes(values.getBytes(Charset.forName("ISO-8859-1"))); diff --git a/sensorhub-core/src/main/resources/application.properties b/sensorhub-core/src/main/resources/application.properties deleted file mode 100644 index 8b13789..0000000 --- a/sensorhub-core/src/main/resources/application.properties +++ /dev/null @@ -1 +0,0 @@ - diff --git a/sensorhub-core/src/main/resources/config/application-dev.yml b/sensorhub-core/src/main/resources/config/application-dev.yml index 4f897a8..dcc4c2d 100644 --- a/sensorhub-core/src/main/resources/config/application-dev.yml +++ b/sensorhub-core/src/main/resources/config/application-dev.yml @@ -4,9 +4,9 @@ spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true + url: jdbc:mysql://127.0.0.1:3306/sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true username: root - password: Casic203 + password: root session: store-type: redis redis: diff --git a/sensorhub-core/src/main/resources/config/application.yml b/sensorhub-core/src/main/resources/config/application.yml index ae89f9d..7965da1 100644 --- a/sensorhub-core/src/main/resources/config/application.yml +++ b/sensorhub-core/src/main/resources/config/application.yml @@ -30,6 +30,13 @@ port: 6379 password: ew5T4K3#203lwh config-prefix: 'Casic:' +#代码生成器配置 +code: + generate: + #作者 + author: cz + #待生成对象表名 + table-name: bussiness_field_config,combined_field_config sensorhub: config: port: 7091 diff --git a/sensorhub-support/pom.xml b/sensorhub-support/pom.xml index 9a71296..761601c 100644 --- a/sensorhub-support/pom.xml +++ b/sensorhub-support/pom.xml @@ -42,6 +42,12 @@ ${redis.version} + + com.baomidou + mybatis-plus-generator + ${mybatis-plus-generator.version} + + org.reflections diff --git a/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java b/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java new file mode 100644 index 0000000..515ca53 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java @@ -0,0 +1,14 @@ +package com.casic.missiles.enums; + +/** + * @author + * @date + */ +public interface FixedPropertyEnum { + + String FIXED_POSITION = "fixedPosition"; + + String TOTAL_LENGTH = "totalLength"; + + String TAIL_POSITION = "tailPosition"; +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/CombinedFieldMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CombinedFieldMapper.java new file mode 100644 index 0000000..38e8f42 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CombinedFieldMapper.java @@ -0,0 +1,15 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.CombinedFieldConfig; +import org.apache.ibatis.annotations.Mapper; + +/** + * @author cz + * + */ +@Mapper +public interface CombinedFieldMapper extends BaseMapper { + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java new file mode 100644 index 0000000..128b09d --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java @@ -0,0 +1,10 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.CommandEventConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface CommandEventMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java new file mode 100644 index 0000000..042eb3c --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.DatagramEventConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface DatagramEventConfigMapper extends BaseMapper { +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java new file mode 100644 index 0000000..fc95cf4 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java @@ -0,0 +1,8 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.FieldConfig; + +public interface FieldConfigMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldRuleConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldRuleConfigMapper.java new file mode 100644 index 0000000..b310a08 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldRuleConfigMapper.java @@ -0,0 +1,10 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.FieldRuleConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface FieldRuleConfigMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java new file mode 100644 index 0000000..9060a69 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.ProtocolConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface ProtocolConfigMapper extends BaseMapper { +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolFieldConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolFieldConfigMapper.java new file mode 100644 index 0000000..1b47180 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolFieldConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +public interface ProtocolFieldConfigMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java new file mode 100644 index 0000000..6fa6936 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.RuleConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface RuleConfigMapper extends BaseMapper { +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/AbstractFieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/AbstractFieldConfig.java new file mode 100644 index 0000000..ba9aea2 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/AbstractFieldConfig.java @@ -0,0 +1,38 @@ +package com.casic.missiles.pojo; + +import lombok.Data; + +@Data +public class AbstractFieldConfig { + /** + * 字段名称 + */ + private String fieldName; + /** + * 按照字段评估进行字段解析 + */ + private String ruleJson; + /** + * 起始位置(单位byte) + */ + private Integer OriginPositionByte; + /** + * 起始位置,是否需要bit位置(单位bit)小于8, 没有不需要填写 + */ + private String OriginPositionBit; + /** + * 偏移长度 + */ + private Integer offsetLength; + /** + * 偏移单位(bit/byte) + */ + private String offsetUnit; + /** + * 是否需要转存 + */ + private Integer isStorage; + + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/CombinedFieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/CombinedFieldConfig.java new file mode 100644 index 0000000..4f4de6a --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/CombinedFieldConfig.java @@ -0,0 +1,41 @@ +package com.casic.missiles.pojo; + +import lombok.Data; + +import java.util.Date; + +/** + * 组合配置 + * + * @author cz + * @date 20 + */ +@Data +public class CombinedFieldConfig { + + private Long id; + private Long ruleId; + /** + * 前缀编码 + */ + private String prefixCode; + + /** + * 字段动态的id + */ + private Long dynamicLengthId; + /** + * 对应的要解析字段的ids + */ + private String dataFieldIds; + + /** + * 字段动态的id + */ + private String combinedFieldIds; + + private Date lastTime; + + private Date createTime; + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldConfig.java index a07d20d..8304dc6 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldConfig.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldConfig.java @@ -5,31 +5,28 @@ import java.util.Date; +/** + * @author cz + * 1、该表与实际解析的内容实例解析有关 + * 2、该表字段是随机出现的,和帧结构无关,无法预料的 + * 3、该表字段解析根据FieldEvaluatorConfig进行字段解析 + */ @Data -@TableName("field_config") -public class FieldConfig { +@TableName("business_field_config") +public class FieldConfig extends AbstractFieldConfig { private Long id; -// private String preFieldConfig; - private Long protocolId; - - private String isFixed; - private String uploadDeliveryChange; - - private String replyRule; - private String ruleJson; - + /** + * 协议配置id + */ + private Long ruleId; + /** + * 字段名称 + */ private String fieldName; - private String isStorage; - private Integer orignPosition; - private String exactOrignPosition; - - private Integer offsetLength; - private String offsetUnit; private String ownerId; private Date createTime; private Date lastTime; - } diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldRuleConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldRuleConfig.java new file mode 100644 index 0000000..2e09879 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldRuleConfig.java @@ -0,0 +1,20 @@ +package com.casic.missiles.pojo; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +@TableName("field_rule_config") +@Data +public class FieldRuleConfig { + + private Long id; + private String name; + private String desc; + private String condition; + private String excuteOperation; + private Date lasTime; + private Date createTime; + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/Msg.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/Msg.java deleted file mode 100644 index 81a5324..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/Msg.java +++ /dev/null @@ -1,86 +0,0 @@ -package com.casic.missiles.pojo; - -import lombok.Data; - -/** - * 协议 - */ -@Data -public class Msg { - - /** - * 前导码 - */ - private String preamble; - - /** - * 版本号 - */ - private String version; - - /** - * 内容长度 - */ - private int leng; - - /** - * 设备ID - */ - private String deviceId; - - /** - * 通讯方式 - */ - private Integer connType; - - /** - * 加密方式 - */ - private Integer encryType; - - /** - * 目标地址 - */ - private String destAddr; - - /** - * PDUType - */ - private String PDUType; - - /** - * 操作类型 - */ - private Integer operateType; - - /** - * 传输控制位 PDUType.bit7=0时,表示存在后续的访问;当PDUType.bit7=1时,表示无后续的访问。 - */ - private Integer transControlFlag; - - /** - * 设备类型 - */ - private Integer deviceType; - - /** - * 序号 - */ - private Integer seq; - - /** - * tagList - */ - private String tagList; - - /** - * OidList - */ - private String OidList; - - /** - * CRC - */ - private String CRC; - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/PreRuleConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/PreRuleConfig.java deleted file mode 100644 index bfcf914..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/PreRuleConfig.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.casic.missiles.pojo; - -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -import java.util.Date; - -@Data -@TableName("pre_rule_config") -public class PreRuleConfig { - - private Long id; - private String protocolId; - private String ruleFieldId; - private String ownerId; - private Date createTime; - private Date lastTime; -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java index 608af3a..32cc8a4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java @@ -2,48 +2,47 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.delivery.decorator.ByteDecorator; +import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @AllArgsConstructor public class FieldDecoratorManger { - private final RuleDictDao ruleDictDao; + private final RuleConfigRegistry ruleDictDao; // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 // (1)静态的业务字段是字典里面可以配置的 // (2)动态的业务字段是通过规则生成的 public String contentMerge(String ruleJson, String sceneConent, String dynamicContent) { - List ruleDictList = ruleDictDao.getRuleDictConfig(); - Map ruleDictMap = ruleDictList.stream().collect( - Collectors.toMap(RuleDict::getId, e -> e)); - List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); - for (Map ruleMap : ruleMapList) { - String ruleType = String.valueOf(ruleMap.get("ruleType")); - ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); - NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); - byteDecorator.nodeDecoratorRule(nodeDecoratorParm); - } +// List ruleDictList = ruleDictDao.getRuleDictConfig(); +// Map ruleDictMap = ruleDictList.stream().collect( +// Collectors.toMap(RuleDict::getId, e -> e)); +// List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); +// for (Map ruleMap : ruleMapList) { +// String ruleType = String.valueOf(ruleMap.get("ruleType")); +// ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); +// NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); +// byteDecorator.nodeDecoratorRule(nodeDecoratorParm); +// } return null; } - - private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { - NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() - .contents(sceneConent) - .dynamicContent(dynamicContent) - .ruletypeId(ruletypeId) - .ruleDictMap(ruleDictMap) - .build(); - return nodeDecoratorParm; - } +// +// private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { +// NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() +// .contents(sceneConent) +// .dynamicContent(dynamicContent) +// .ruletypeId(ruletypeId) +// .ruleDictMap(ruleDictMap) +// .build(); +// return nodeDecoratorParm; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java index 652970c..b204ac3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java @@ -1,56 +1,56 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@AllArgsConstructor -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", - JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Component; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Component("logicalDecorator") +//@AllArgsConstructor +//@Slf4j +//public class LogicalShiftDecorator implements ByteDecorator { +// +//// private final FieldRuleEngineMapper fieldRuleEngineMapper; +//// +//// //字节位移 +//// @Override +//// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +//// String logicalValue = ""; +//// RuleEvaluator fieldRuleEngine = new RuleEvaluator(); +//// try { +//// Map env2 = new HashMap(); +//// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +//// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +//// for (String contentId : contentIdList) { +//// RuleDict ruleDict = ruleDictMap.get(contentId); +//// if (ruleDict.getCode().contains("#")) { +//// //使用动态的值 +//// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +//// } +//// env2.put(ruleDict.getName(), ruleDict.getCode()); +//// } +//// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +//// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +//// return null; +//// } +//// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +//// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +//// return values; +//// } catch (Exception ex) { +//// log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", +//// JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +//// return null; +//// } +//// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java index 346468f..822fead 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@AllArgsConstructor -@Slf4j -public class OperationDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("optionDecorator") +//@AllArgsConstructor +//@Slf4j +//public class OperationDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //混合运算,有常量或者乘除的缩放 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java index 50fb0a7..7a8bccb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@AllArgsConstructor -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +////精度计算 +//@AllArgsConstructor +//@Registry("precisionDecorator") +//@Slf4j +//public class PrecisionDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java index da39235..27f9cc7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java @@ -1,54 +1,53 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@AllArgsConstructor -@Slf4j -public class RuleDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("ruleDecorator") +//@AllArgsConstructor +//@Slf4j +//public class RuleDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //吃我一套正则表达式 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (Exception ex) { +// log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java index 7f5cbf3..c043f97 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java @@ -2,6 +2,6 @@ import java.util.Map; -public interface ComandeEventService { +public interface ComandeEventService{ Map loadComandeEventConfig(String protocolId,String scene); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java index 476ad84..aaf1837 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java @@ -2,46 +2,46 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.dao.CommandEventDao; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @Slf4j @AllArgsConstructor -public class ComandeEventServiceImpl implements ComandeEventService { +public class ComandeEventServiceImpl implements ComandeEventRegistry { - private final CommandEventDao commandEventDao; + // private final CommandEventDao commandEventDao; // 加密bean 固定字段出现变化的字段解析,业务字段的有序内容 @Override - public Map loadComandeEventConfig(String protocolId,String sceneName) { - CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); - if (ObjectUtil.isEmpty(commandEventConfig)) { - log.error("协议{},没有配置成功接收回复配置,清排查原因"); - return null; - } - String replyJson = commandEventConfig.getReplyContentJson(); - List> replyMapList = JSONArray.parseObject(replyJson, List.class); - List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); - Map fixMap = fixList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); - List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) - .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) - .collect(Collectors.toList()); - Map commandConfigMap = new HashMap<>(); - commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); - commandConfigMap.put("fixContent", fixMap); - commandConfigMap.put("bizContent", contentList); - return commandConfigMap; + public Map loadComandeEventConfig(String protocolId, String sceneName) { +// CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); +// if (ObjectUtil.isEmpty(commandEventConfig)) { +// log.error("协议{},没有配置成功接收回复配置,清排查原因"); +// return null; +// } +// String replyJson = commandEventConfig.getReplyContentJson(); +// List> replyMapList = JSONArray.parseObject(replyJson, List.class); +// List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); +// Map fixMap = fixList.stream() +// .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); +// List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) +// .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) +// .collect(Collectors.toList()); +// Map commandConfigMap = new HashMap<>(); +// commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); +// commandConfigMap.put("fixContent", fixMap); +// commandConfigMap.put("bizContent", contentList); +// return commandConfigMap; + return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 128b09d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java deleted file mode 100644 index 4016b0b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface DatagramEventMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java deleted file mode 100644 index 597c306..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.apache.ibatis.annotations.Mapper; - -public interface FieldConfigMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java deleted file mode 100644 index a31680a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.PreRuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface PreRuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java deleted file mode 100644 index 9060a69..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface ProtocolConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java deleted file mode 100644 index 6fa6936..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java deleted file mode 100644 index 582a705..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleDict; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleDictMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java deleted file mode 100644 index 6e302c8..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.CommandEventMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Optional; - -@Component -public class CommandEventDao { - - @Resource - private CommandEventMapper commandEventMapper; - - public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId) - .eq("scene", sceneName) - .eq("enabled", 1); - List commandEventConfig = commandEventMapper.selectList(queryWrapper); - Optional optionalEventConfig = commandEventConfig.stream().findFirst(); - return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java deleted file mode 100644 index 9137e4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.FieldConfigMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class FieldConfigDao { - - @Resource - private FieldConfigMapper fieldConfigMapper; - - public FieldConfig getFieldConfigById(String fieldId) { - FieldConfig fieldConfig = fieldConfigMapper.selectById(fieldId); - return fieldConfig; - } - - public List getFieldConfigs(String protocolId,Integer isFixed) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",isFixed); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - - public List getStorageFieldConfig(String protocolId) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",1) - .eq("is_storage",1); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java deleted file mode 100644 index 67bff6b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.mapper.PreRuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class PreRuleConfigDao { - - @Resource - private PreRuleConfigMapper preRuleConfigMapper; - - public List getPreRuleList(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return preRuleConfigMapper.selectList(queryWrapper); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java deleted file mode 100644 index d69ea85..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.RuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleConfigDao { - - @Resource - private RuleConfigMapper ruleConfigMapper; - - public RuleConfig getNextRuleConfig(String ruleFields) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("parse_rule_json", ruleFields); - return ruleConfigMapper.selectOne(queryWrapper); - } - - - public List getRuleConfigById(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return ruleConfigMapper.selectList(queryWrapper); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java deleted file mode 100644 index 932c185..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.RuleDictMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleDictDao { - - @Resource - private RuleDictMapper ruleDictMapper; - - public List getRuleDictConfig() { - List ruleDictList = ruleDictMapper.selectList(null); - return ruleDictList; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java index 9f9e279..43bc4d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java @@ -10,20 +10,15 @@ import io.netty.channel.socket.nio.NioServerSocketChannel; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import javax.annotation.PreDestroy; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static cn.hutool.core.util.ClassUtil.getClasses; /** * SensorhubServer netty服务端 */ @Slf4j -@Service +@Component public class SensorhubServer { /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java index 2c79ff5..9a28c36 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java @@ -11,13 +11,13 @@ import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioSocketChannel; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClient 客户端 */ @Slf4j -@Service +@Registry public final class SensorhubClient { public static void main(String[] args) throws Exception { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java index 9774be0..477c3f7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java @@ -6,12 +6,12 @@ import io.netty.channel.socket.SocketChannel; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientChannelInitialHandler */ -@Service +@Registry public class SensorhubClientChannelInitialHandler extends ChannelInitializer { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java index 346f4b3..73560e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java @@ -5,13 +5,13 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientHandler */ @Slf4j -@Service +@Registry public class SensorhubClientHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java index 5c1c6f2..d990af5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java @@ -4,12 +4,12 @@ import com.casic.missiles.pojo.Msg; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** * SensorhubServerHandler */ -@Service +@Component public class SensorhubServerHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 67283ae..af3172c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,41 +1,37 @@ package com.casic.missiles.parser; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultProtocolConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.*; +import com.casic.missiles.registry.FieldConfigRegistry; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; -import java.nio.charset.Charset; import java.util.HashMap; import java.util.List; import java.util.Map; -@Service("genericProtocolParser") +/** + * @author + */ +@Component("genericProtocolParser") @Slf4j -@AllArgsConstructor +@RequiredArgsConstructor public class GenericProtocolParser implements ProtocolParser { - private final LeadingCodeMatcher leadingCodeMatcher; private final List frameStructDispenserList; - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorInstanceSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; // 匹配首字母前导码=> 帧结构匹配前导码=> // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 @@ -44,18 +40,19 @@ public Boolean doParseProtocol(ByteBuf byteBuf) { String protocolContent = ByteBufUtil.hexDump(byteBuf); //匹配前导码 - List preCodeConfigs = leadingCodeMatcher.matchLeadingCode(protocolContent); + List preCodeConfigs = LeadingCodeMatcher.matchFrameLeadingCode(protocolContent); //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 if (preCodeConfigs.size() == 0) { - return rematch(byteBuf,protocolContent); + return rematch(byteBuf, protocolContent); } - //暂时先取第一个 + //暂时先取第一个,提升速度,使用享元模式, 减少类的创建销毁与构建 ProtocolConfig protocolConfig = preCodeConfigs.get(0); + AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); ByteBuf wholeDatagramByte = null; //通过匹配帧结构获取完整的数据包 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, preCodeConfigs.get(0))) != null) { + if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, protocolFactory)) != null) { break; } } @@ -68,76 +65,78 @@ * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 */ - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId, wholeDatagramByte); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap, protocolId); - //选取规则对应的流程实例 - DatagramEventConfig datagramEventConfig = processorInstanceSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); + //进行规则字段解析,进行匹配规则 + RuleConfig ruleConfig = getRuleConfig(protocolFactory, wholeDatagramByte); + if (ruleConfig == null) { + return false; + } //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, wholeDatagramByte); + ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte); + //以下进行业务的规则解析,同时选定流程实例 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); + DatagramEventProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain, + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText, protocolId); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain); //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); + datagramEventProvider.storeData(bizDataMap); return true; } - private Boolean rematch(ByteBuf byteBuf,String protocolContent) { + /** + * 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 + */ + private Boolean rematch(ByteBuf byteBuf, String protocolContent) { //重置位判断 byteBuf.resetReaderIndex(); //判断重置是否前移,如果没有前移,则直接判为匹配失败 if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { return false; } else { + //递归执行 return doParseProtocol(byteBuf); } } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; + //获取匹配规则->匹配规则 + private RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + //取出其中参与逻辑provider并判空 + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); + String rulePrepareFields = protocolConfig.getRulePrepareFields(); + //固定字段 + if (StringUtils.isNotEmpty(rulePrepareFields)) { + //获取统一固定字段解析 + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + //获取该协议的字段配置,用于协议规则匹配 + List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); + //获取规则 + RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, + rulePrepareFields, protocolFieldConfigs); + return ruleConfig; + } + return null; } - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + //数据构建,获取固定字段的store和业务字段store + private Map buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + Map bizDataMap = new HashMap<>(); + Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); + Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); + bizDataMap.putAll(ruleStoreObjectMap); + bizDataMap.putAll(protocolStoreObjectMap); return bizDataMap; } - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java index 8a46e32..16ce2e5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java @@ -3,6 +3,7 @@ import io.netty.buffer.ByteBuf; public interface ProtocolParser { + Boolean doParseProtocol(ByteBuf byteBuf); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java new file mode 100644 index 0000000..f7814af --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java @@ -0,0 +1,35 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.ProtocolConfigProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.ProtocolConfig; + +/** + * 存放基本协议的的加载信息 + */ +public class AbstractProtocolConfigFactory { + private final ProtocolConfigProvider protocolConfigProvider; + private final ProtocolFieldConfigProvider protocolFieldConfigProvider; + private final RuleConfigProvider ruleConfigProvider; + + public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { + this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); + this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); + this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); + } + + public ProtocolConfigProvider getProtocolConfigProvider() { + return protocolConfigProvider; + } + + public ProtocolFieldConfigProvider getProtocolFieldConfigProvider() { + return protocolFieldConfigProvider; + } + + public RuleConfigProvider getRuleConfigProvider() { + return ruleConfigProvider; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java new file mode 100644 index 0000000..6e36147 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java @@ -0,0 +1,57 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.CombinedFieldConfigProvider; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.FieldConfigProvider; +import com.casic.missiles.parser.provider.FieldRuleConfigProvider; + +/** + * 存放规则相关的的的加载信息 + */ +public class AbstractRuleConfigFactory { + + /** + * 处理字节 + */ + private final FieldConfigProvider fieldConfigProvider; + /** + * 处理组合字节解析的解码器 + */ + private final CombinedFieldConfigProvider combinedFieldConfigProvider; + /** + * 处理负责字节解析的规则配置 + */ + private final FieldRuleConfigProvider fieldRuleConfigProvider; + /** + * 处理实例流程 + */ + private final DatagramEventProvider datagramEventProvider; + + + public AbstractRuleConfigFactory(Long ruleId) { + this.fieldConfigProvider = new FieldConfigProvider(ruleId); + this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); + this.fieldRuleConfigProvider = new FieldRuleConfigProvider(ruleId); + this.datagramEventProvider = new DatagramEventProvider(ruleId); + } + + public FieldConfigProvider getFieldConfigProvider() { + return fieldConfigProvider; + } + + public CombinedFieldConfigProvider getCombinedFieldConfigProvider() { + return combinedFieldConfigProvider; + } + + public FieldRuleConfigProvider getFieldRuleConfigProvider() { + return fieldRuleConfigProvider; + } + + public DatagramEventProvider getDatagramEventProvider() { + return datagramEventProvider; + } + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java deleted file mode 100644 index 6e1719a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.factory; - - -import com.casic.missiles.pojo.ProtocolConfig; - -import java.util.List; - -/** - * 数据库访问优化(暂时未做) - *

- * 1、初始化协议解析配置,并存放到处存放缓存,对协议基本配置进行管理 - * 2、其中流程中所有的配置都经过此类进行管理,进行调用获取,增强解析速度 - */ -public interface DatagramFactory { - - /** - * 初始化 - */ - List datagramInit(); - - /** - * 根据前导码配置匹配,模糊匹配获取所有的报文项 - */ - List match(); - - /** - * 根据前导码匹配,返回报文项 - */ - List filer(); - - /** - * 保证数据的唯一性选择器 - */ - List selectOne(); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java new file mode 100644 index 0000000..87444a0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java @@ -0,0 +1,18 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +import java.util.List; + +/** + * 直接用,还是边用边创建 + */ +public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { + + + public DefaultProtocolConfigFactory(ProtocolConfig protocolConfig) { + super(protocolConfig); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java new file mode 100644 index 0000000..cce0c7c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java @@ -0,0 +1,12 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; + +public class DefaultRuleFactory extends AbstractRuleConfigFactory { + + public DefaultRuleFactory(Long ruleId) { + super(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java deleted file mode 100644 index 9ee97e0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.casic.missiles.parser.instance; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service -@Slf4j -@AllArgsConstructor -public class GeneralProcessor { - - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; - - /** - * 统一固定字段解析=>进行规则的查询的判断 - * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 - * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 - */ - @Deprecated - public boolean parseWholeDatagram(ByteBuf buffer, ProtocolConfig protocolConfig) { - try { - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap,protocolId); - //选取规则对应的流程= - DatagramEventConfig datagramEventConfig = processorSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); - //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); - //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); - //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); - //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); - //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); - return true; - } catch (Exception ex) { - log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", - ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); - return false; - } - } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; - } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); - } - - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); - return bizDataMap; - } - - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java index 25e7ad8..6a5777e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java @@ -1,23 +1,31 @@ package com.casic.missiles.parser.instance.impl; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.mapper.DatagramEventMapper; import com.casic.missiles.pojo.DatagramEventConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.SpringContextUtil; -@Service -@AllArgsConstructor +import java.util.List; +import java.util.Optional; + +/** + * @author cz + * + */ public class DefaultProcessorInstanceSelector implements ProcessorInstanceSelector { - private final DatagramEventMapper datagramEventMapper; + private static List datagramEventConfigs; + + static { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + datagramEventConfigs = datagramEventRegistry.getDatagramEventList(); + } @Override public DatagramEventConfig getProcessorInstance(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("rule_id", protocolId); - return datagramEventMapper.selectOne(queryWrapper); + Optional optionalSelectInstance = datagramEventConfigs.stream() + .filter(e -> e.getId().equals(protocolId)).limit(1).findFirst(); + return optionalSelectInstance.isPresent() ? optionalSelectInstance.get() : null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a778671..7b56a43 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,16 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import io.netty.buffer.ByteBuf; /** - * 分析匹配情况 - * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 - * 2、匹配不成功,有后续帧,可以进行下次匹配。 - * 3、匹配不成功,无后续帧,可以进行丢弃。 + * 分析匹配情况 + * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 + * 2、匹配不成功,有后续帧,可以进行下次匹配。 + * 3、匹配不成功,无后续帧,可以进行丢弃。 */ -public interface FrameStructMatcher{ +public interface FrameStructMatcher { - ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig); + ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 05320ab..8ebea78 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,23 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.ProtocolConfigMapper; +import com.casic.missiles.parser.provider.ProtocolConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Component; import java.util.List; import java.util.stream.Collectors; -@Component -@AllArgsConstructor public class LeadingCodeMatcher { - private final ProtocolConfigMapper protocolMapper; - //** 1、首字母匹配前导码, // 2、以匹配出的前导码是否在报文中条件进行前导码的匹配二次筛选 - public List matchLeadingCode(String protocolContent){ + public static List matchFrameLeadingCode(String protocolContent){ List initialConfigs = initialMatch(protocolContent); List preCodeConfigs = initialConfigs.stream() .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) @@ -26,13 +19,16 @@ } //初始化匹配前导码内容 - private List initialMatch(String protocolContent) { - String protocolStr = protocolContent.charAt(0) + ""; - QueryWrapper queryWrapper = new QueryWrapper() - .likeRight("pre_fix", protocolStr); - List protocolConfigList = protocolMapper.selectList(queryWrapper); - return protocolConfigList; + private static List initialMatch(String protocolContent) { + String firstFrameChar = protocolContent.charAt(0) + ""; + ProtocolConfigProvider protocolConfigProvider=new ProtocolConfigProvider(firstFrameChar); + return protocolConfigProvider.getMatchList(); } + + + + + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index cf2113d..e915877 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -1,32 +1,35 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(0) -@Service +@Component public class FrameLengthMatcher implements FrameStructMatcher { - @Autowired - private FieldParser fieldParser; - //超过长度 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { String dataGramContent = ByteBufUtil.hexDump(byteBuf); - if (StringUtils.isEmpty(protocolConfig.getUnpackId()) && StringUtils.isEmpty(protocolConfig.getTailStr())) { - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + //当不存在结尾标志和拆包标志,可以直接使用长度进行匹配 + if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { if (dataGramContent.length() >= totalLength) {//等于长度返回true,超出长度,切断 - ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, protocolConfig, totalLength); + ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, totalLength); return wholeDatagramByte; } else { //读的标志位前移舍弃 @@ -38,7 +41,7 @@ return null; } - private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, Integer totalLength) { byteBuf.readBytes(totalLength); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, totalLength - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 2bfc213..d527ad0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; @@ -13,7 +13,7 @@ import lombok.AllArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.nio.charset.Charset; import java.util.Map; @@ -22,32 +22,30 @@ * 后续标志验证 */ @Order(1) -@Service +@Component @AllArgsConstructor -public class FrameMarkMatcher implements FrameStructMatcher { - - private final FieldConfigDao fieldConfigDao; - private final FieldParser fieldParser; - private final FieldResolver fieldResolverManger; +public class FrameMarkMatcher implements FrameStructMatcher, FixedPropertyEnum { //帧后续标志=>结束,进行帧的重组=>有后续,1、帧移位判别 2、继续接收帧 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig UnpackConfig = StringUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getUnpackId()); - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); - Integer upback = 0; + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); ByteBuf mergeWholeFrameByte = null; - if (!ObjectUtil.isEmpty(UnpackConfig)) { - while (hasNextFullFrame(byteBuf, protocolConfig)) { - upback = (Integer) fieldResolverManger.filedParserManger(byteBuf, UnpackConfig, null); + if (!ObjectUtil.isEmpty(unpackFlag)) { + while (hasNextFullFrame(byteBuf, protocolConfig, protocolFieldConfigProvider)) { //是否存在后续位 - if (upback == 1) {//使用esayRule + if (unpackFlag == 1) {//使用esayRule //表示可以截取 - mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolConfig, totalLength); + mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolFieldConfigProvider, protocolConfig); return mergeWholeFrameByte; } else { - byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig)); + byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig, protocolFieldConfigProvider)); } } } @@ -56,7 +54,8 @@ //选取第一个帧,将业务内容和后面部分分开 //计算数据报文-业务内容 - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolFieldConfigProvider protocolFieldConfigProvider, ProtocolConfig protocolConfig) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); //截取完整报文 byteBuf.readBytes(totalLength); ByteBuf byteBufContent = byteBuf.slice(0, byteBuf.readerIndex()); @@ -68,15 +67,15 @@ String tail = ""; System.out.println(ByteBufUtil.hexDump(byteBufContent)); //会存在多个帧拼接在一起的的情况,进行合并处理 - while (hasNextFullFrame(byteBufContent, protocolConfig)) { - Integer currentFrameLength = fieldParser.getTotalLength(protocolConfig, byteBufContent); + while (hasNextFullFrame(byteBufContent, protocolConfig, protocolFieldConfigProvider)) { + Integer currentFrameLength = protocolFieldConfigProvider.getTotalLength(byteBufContent, protocolConfig); byteBufContent.readBytes(currentFrameLength); ByteBuf currentbyteBuf = byteBufContent.slice(0, byteBufContent.readerIndex()); byteBufContent.markReaderIndex();//读的标志位前移 System.out.println(ByteBufUtil.hexDump(byteBufContent)); String hexDump = currentbyteBuf.toString(Charset.forName("ISO-8859-1")); //获取当前固定帧结构的关系map - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, currentbyteBuf); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(currentbyteBuf, protocolConfig); if (StringUtils.isEmpty(mergeFrameStr)) { //首次获取业务数据报文 mergeFrameStr += hexDump.substring(0, currentFrameFixedProperty.get("tailPosition")); @@ -95,22 +94,22 @@ /** * 获取平移到下一帧起始位置 */ - public int getNextFrameOffset(ByteBuf buffer, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, buffer); - return currentFrameFixedProperty.get("totalLength"); + public int getNextFrameOffset(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + return currentFrameFixedProperty.get(TOTAL_LENGTH); } /** * 判断是否出错进行整个帧的 */ - public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, byteBuf); + public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); //保证读取位置不在固定位置,是可变的业务内容 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("fixedPosition")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(FIXED_POSITION)) { return false; } //判断读取是否操作帧长度 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("totalLength")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(TOTAL_LENGTH)) { return false; } return true; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 76a3784..c3a1bab 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -1,50 +1,50 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.parser.instance.GeneralProcessor; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; +import io.netty.buffer.ByteBufUtil;; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(2) -@Service +@Component public class FrameTailMatcher implements FrameStructMatcher { - @Resource - private FieldConfigDao fieldConfigDao; - @Autowired - private GeneralProcessor generalProcessor; - //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig tailFieldConfig = StringUtils.isEmpty(protocolConfig.getTailStr()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getTailStr()); - if (!ObjectUtil.isEmpty(tailFieldConfig)) { - String tailStr = tailFieldConfig.getFieldName(); + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfig protocolFieldConfig = ObjectUtils.isEmpty(protocolConfig.getTailStr()) ? null : + fieldConfigProvider.getFieldConfigById(protocolConfig.getTailStr()); + if (!ObjectUtil.isEmpty(protocolFieldConfig)) { + String tailStr = protocolFieldConfig.getFieldName(); String dataGramContent = ByteBufUtil.hexDump(byteBuf); Boolean tailFlag = ByteBufUtil.hexDump(byteBuf).contains(tailStr); if (!tailFlag) { //使用esayRule return null; } else if (dataGramContent.indexOf(tailStr) < dataGramContent.length() - tailStr.length()) { Integer length = dataGramContent.indexOf(tailStr) + tailStr.length(); - ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, protocolConfig, length); + ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, length); return wholeDatagramByte; //存在粘包 } } return null; } - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer length) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, Integer length) { byteBuf.readBytes(length); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, length - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java new file mode 100644 index 0000000..5f1c177 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java @@ -0,0 +1,73 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.combined.GenericCombinedFieldResolver; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.CombinedFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class CombinedFieldConfigProvider { + + + /** + * 作为临时配置列表缓存使用 + */ + private final List combinedFieldConfigList; + private Map storeObjectMap = new HashMap<>(); + + public CombinedFieldConfigProvider(Long ruleId) { + CombinedFieldConfigRegistry combinedFieldConfigRegistry = SpringContextUtil.getBean(CombinedFieldConfigRegistry.class); + combinedFieldConfigList = combinedFieldConfigRegistry.getCombinedFieldConfigList(ruleId); + } + + public void parseDataField(RuleConfig ruleConfig, String clearZeroPlain,Map fieldConfigsMap ) { + if (showSkip()) { + return; + } + //匹配对应的数据,然后进行相关的字段解析 + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver(); + combinedFieldResolver.parseDataField(combinedFieldConfigList, byteBuf, storeObjectMap,fieldConfigsMap); + } + + + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getCombinedFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return combinedFieldConfigList.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public List getCombinedFieldConfigList() { + return combinedFieldConfigList; + } + + /* 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(combinedFieldConfigList) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java new file mode 100644 index 0000000..f3cfedc --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java @@ -0,0 +1,11 @@ +package com.casic.missiles.parser.provider; + +/** + * @author cz + * @date 2023-6-12 + */ +public class CommandEventProvider{ + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java new file mode 100644 index 0000000..70eec5e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java @@ -0,0 +1,77 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.safe.SafeStrategy; +import com.casic.missiles.parser.sender.DataSubscribeProvider; +import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class DatagramEventProvider { + + private final DatagramEventConfig processorInstance; + + public DatagramEventProvider(Long ruleId) { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + List datagramEventConfigList = + datagramEventRegistry.getDatagramEventList(ruleId); + processorInstance = this.getProcessorInstance(datagramEventConfigList); + } + + public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { + if (showSkip()) { + return null; + } + return datagramEventConfigList.get(0); + } + + // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 + public String getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap) { + String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? + processorInstance.getSafeBean() : + fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); + if (!StringUtils.isEmpty(safeName)) { + //需要加密 + SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); + String plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); + return clearComplementZero(plain); + } + return ByteBufUtil.hexDump(bizDataContent); + } + + //解密清零操作 + private String clearComplementZero(String plain) { + plain = plain.substring(0, plain.lastIndexOf("00")); + return plain; + } + + //数据发送,数据发送者暂未构建 + public void storeData(Map bizDataMap) { + DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); +// dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return ObjectUtils.isNotEmpty(processorInstance) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java new file mode 100644 index 0000000..7e1fe0a --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java @@ -0,0 +1,97 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.FieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class FieldConfigProvider { + + + private final List fieldConfigs; + private Map storeObjectMap = new HashMap<>(); +// private Map singleObjects = new ConcurrentHashMap<>(); + + public FieldConfigProvider(Long ruleId) { + FieldConfigRegistry fieldConfigRegistry = SpringContextUtil.getBean(FieldConfigRegistry.class); + fieldConfigs = fieldConfigRegistry.getFieldConfigList(ruleId); + } + + public List getFieldConfigs() { + return fieldConfigs; + } + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public Map parseDataField(RuleConfig ruleConfig, String clearZeroPlain) { + if (showSkip()) { + return null; + } + List prepareFieldConfig = prepareParseField(ruleConfig); + if (CollectionUtils.isNotEmpty(prepareFieldConfig)) { + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(fieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + return fixDataMap; + } + } + return null; + } + + /** + * 得到需要处理的业务内容 + * + * @return + */ + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return fieldConfigs.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public Map getFieldConfigsMap() { + return fieldConfigs.stream().collect( + Collectors.toMap(FieldConfig::getId, e -> e) + ); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(fieldConfigs) ? false : true; + } + + +} + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java new file mode 100644 index 0000000..817bfaf --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java @@ -0,0 +1,19 @@ +package com.casic.missiles.parser.provider; + +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.registry.FieldRuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; + +public class FieldRuleConfigProvider { + + private final List fieldRuleConfigList; + + public FieldRuleConfigProvider(Long ruleId) { + FieldRuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(FieldRuleConfigRegistry.class); + fieldRuleConfigList = ruleConfigRegistry.getFieldRuleConfigList(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java new file mode 100644 index 0000000..99a1b06 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java @@ -0,0 +1,53 @@ +package com.casic.missiles.parser.provider; + + +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.registry.ProtocolConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolConfigProvider { + + private final List protocolConfigList; + + public ProtocolConfigProvider(String firstChar) { + ProtocolConfigRegistry registry = SpringContextUtil.getBean(ProtocolConfigRegistry.class); + protocolConfigList = registry.getProtocolConfigList(firstChar); + } + + public List getMatchList() { + return protocolConfigList; + } + + /** + * 设置当前协议 + * + * @param protocolConfig + */ + public ProtocolConfigProvider(ProtocolConfig protocolConfig) { + List protocolConfigs = new ArrayList<>(); + protocolConfigs.add(protocolConfig); + protocolConfigList = protocolConfigs; + } + + /** + * 获取当前协议 + * + * @return + */ + public ProtocolConfig getCurrentProtocolConfig() { + if (this.protocolConfigList == null) { + return null; + } else { + return protocolConfigList.get(0); + } + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java new file mode 100644 index 0000000..043927d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java @@ -0,0 +1,213 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.registry.ProtocolFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolFieldConfigProvider { + + private static final String FIXED_FIELD_DS = "fixedFieldDs"; + private static final String CONTENT_FIELD_DS = "contentFieldDs"; + private static final String PROTOCOL_LENGTH = "protocolLength"; + private static final String PROTOCOL_FIELD_ID = "protocolFieldId"; + private static final String PROTOCOL_POSITION = "protocolPosition"; + + private final List protocolFieldConfigs; + private Map singleObjects = new ConcurrentHashMap<>(); + private Map storeObjectMap = new HashMap<>(); + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public ProtocolFieldConfigProvider(Long protocolId) { + ProtocolFieldConfigRegistry protocolFieldConfigRegistry = SpringContextUtil.getBean(ProtocolFieldConfigRegistry.class); + protocolFieldConfigs = protocolFieldConfigRegistry.getProtocolFieldConfigList(protocolId); + } + + public List getProtocolFieldConfigs() { + return protocolFieldConfigs; + } + + public ProtocolFieldConfig getFieldConfigById(Long fieldId) { + Optional optionalConfig = protocolFieldConfigs.stream().filter( + e -> e.getId().equals(fieldId) + ).findFirst(); + return optionalConfig.isPresent() ? optionalConfig.get() : null; + } + + public Integer getProtocolFieldValue(Long protocolFieldId, ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_FIELD_ID + protocolFieldId + ByteBufUtil.hexDump(byteBuf); + //获取缓存 + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + //加载固定长度数据集合 + Map fixDataMap = this.getProtocolDataMap(byteBuf); + ProtocolFieldConfig protocolFieldConfig = selectFieldConfig(protocolFieldId); + Integer protocolFieldValue = 0; + //获取约定字段的总长度 + if (fixDataMap.containsKey(protocolFieldConfig.getFieldName())) { + Object appointUnpackObject = fixDataMap.get(protocolFieldConfig.getFieldName()); + if (ObjectUtils.isNotEmpty(appointUnpackObject)) { + protocolFieldValue = (Integer) appointUnpackObject; + } + } + if (protocolFieldValue != null) { + //加入缓存 + if (ObjectUtils.isNotEmpty(protocolFieldValue)) { + this.singleObjects.put(catchKey, protocolFieldValue); + return protocolFieldValue; + } + } + return null; + } + + /** + * 获取帧固定位置信息 + * + * @param byteBuf + * @param protocolConfig + * @return + */ + public Map getFixedProperty(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_POSITION + protocolConfig.getId(); + if (this.singleObjects.containsKey(catchKey)) { + return (Map) singleObjects.get(catchKey); + } + Map fixedPropertyMap = new HashMap<>(); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + fixedPropertyMap = fieldParser.doGetFixedProperty(protocolFieldConfigs, this.getTotalLength(byteBuf,protocolConfig)); + if (CollectionUtils.isNotEmpty(fixedPropertyMap)) { + this.singleObjects.put(catchKey, fixedPropertyMap); + return fixedPropertyMap; + } + return fixedPropertyMap; + } + + /** + * 获取帧结构应有的总长度 + */ + public Integer getTotalLength(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_LENGTH + ByteBufUtil.hexDump(byteBuf); + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + Integer appointFrameLength = getProtocolFieldValue(protocolConfig.getTotalLengthId(), byteBuf); + if (appointFrameLength != null) { + //获取过滤的字段集合总长度 + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Integer totalFilterLength = fieldParser.getTotalFilterLength(protocolConfig, byteBuf, getFixFieldConfigMap()); + //计算总长度 + Integer totalLength = appointFrameLength + totalFilterLength; + //加入缓存 + if (ObjectUtils.isNotEmpty(totalLength)) { + this.singleObjects.put(catchKey, totalLength); + return totalLength; + } + } + return null; + } + + /** + * 获取协议有关字段解析内容 + * storeObjectMap存储代转存的数据 + * + * @return + */ + public Map getProtocolDataMap(ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(FIXED_FIELD_DS)) { + return (Map) singleObjects.get(FIXED_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(protocolFieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + this.singleObjects.put(FIXED_FIELD_DS, fixDataMap); + return fixDataMap; + } + return null; + } + + /** + * 获取业务报文内容的content字节 + * + * @param wholeDatagramByte + * @return + */ + public ByteBuf getDataContentBuf(ByteBuf wholeDatagramByte) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(CONTENT_FIELD_DS)) { + return (ByteBuf) singleObjects.get(CONTENT_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + ByteBuf bizDataByteBuf = fieldParser.getDataContentBuf(protocolFieldConfigs, wholeDatagramByte); + if (bizDataByteBuf != null) { + this.singleObjects.put(CONTENT_FIELD_DS, bizDataByteBuf); + return bizDataByteBuf; + } + return null; + } + + + private ProtocolFieldConfig selectFieldConfig(Long id) { + Optional optionalProtocolFieldConfig = this.protocolFieldConfigs.stream().filter( + e -> e.getId().equals(id) + ).findFirst(); + return optionalProtocolFieldConfig.isPresent() ? optionalProtocolFieldConfig.get() : null; + } + + + private Map getFixFieldConfigMap() { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, e -> e) + ); + return fixDataFieldMap; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(protocolFieldConfigs) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java new file mode 100644 index 0000000..dafba1c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java @@ -0,0 +1,56 @@ +package com.casic.missiles.parser.provider; + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.rule.GenericRuleResolver; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.RuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleConfigProvider { + + private final List ruleConfigs; + + public List getRuleConfigs() { + return ruleConfigs; + } + + public RuleConfigProvider(Long protocolId) { + RuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(RuleConfigRegistry.class); + ruleConfigs = ruleConfigRegistry.getRuleConfigById(protocolId); + } + + /** + * 获取规则匹配结果 + * + * @param parseFixedDataMap + * @param protocolFieldConfigs + * @return + */ + public RuleConfig doGetRule(Map parseFixedDataMap, + String ids, + List protocolFieldConfigs) { + if (showSkip()) { + return null; + } + RuleConfig ruleConfig = GenericRuleResolver.machRule(parseFixedDataMap, ids, protocolFieldConfigs, ruleConfigs); + return ruleConfig; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(ruleConfigs) ? false : true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java index 3c05891..856b399 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java @@ -1,18 +1,11 @@ package com.casic.missiles.parser.resolver; -import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.springframework.web.bind.annotation.RequestBody; -import javax.annotation.Resource; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -20,19 +13,17 @@ @Slf4j public class ByteMergeProvider { - @Resource - private FieldRuleEngineMapper fieldRuleEngineMapper; - //拿到所有的值合并到一个值 - public String resolveByteMerge(List valueList, String ruletypeId, String vaildRange) { + public static String resolveByteMerge(List valueList, String ruleTypeId, String vaildRange) { String values = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Map vaildMap = getValidRangeMap(vaildRange); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(ruletypeId); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } + //暂时不处理 +// fieldRuleEngine = fieldRuleConfigMapper.selectById(ruleTypeId); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } Map env2 = new HashMap(); for (int i = 0; i < valueList.size(); i++) { if (vaildMap.containsKey(i)) { @@ -47,7 +38,7 @@ } } - private Map getValidRangeMap(String vaildRange) { + private static Map getValidRangeMap(String vaildRange) { String[] range = vaildRange.split(","); Map vaildMap = new HashMap(); for (int i = 0; i < range.length; i++) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 8d821cd..85d6bbf 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -1,9 +1,12 @@ package com.casic.missiles.parser.resolver; +import com.casic.missiles.pojo.AbstractFieldConfig; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; import io.netty.buffer.ByteBuf; +import java.util.List; import java.util.Map; /** @@ -11,18 +14,14 @@ */ public interface FieldParser { -// Map fieldProcess(String protocolContent,); - Map dataParser(RuleConfig ruleConfig, String lightText,String protocolId); + Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength); - Map fixDataParser(String protocolId, ByteBuf buffer); + Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap); - Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf); + ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer); - ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer); - - ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer); - - Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer); + Integer getTotalFilterLength(ProtocolConfig protocolConfig, ByteBuf byteBuf, Map protocolFieldConfigMap); } + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java new file mode 100644 index 0000000..9e0c00e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java @@ -0,0 +1,52 @@ +package com.casic.missiles.parser.resolver; + +import com.casic.missiles.pojo.AbstractFieldConfig; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.util.List; + +public class FieldParserSupport { + + //分别计算bit和byte长度=> 合并长度 + protected Integer calculateLength(List fieldConfigList) { + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + Integer fixedLength = bytefixedLength + bitfixedLength / 8; + return fixedLength; + } + + //找到最大值=> 根据最大值计算业务数据下标 + protected Integer calculatePosition(List fieldConfigList) { + String rex = "[0-9]+"; + Integer max = -1; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) + && Integer.valueOf(fieldConfig.getOriginPositionByte()) > max) { + max = Integer.valueOf(fieldConfig.getOriginPositionByte()); + } + } + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) && fieldConfig.getOriginPositionByte().equals(max)) { + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + } + } + Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; + return maxFixedPosition; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java deleted file mode 100644 index dd3a6cd..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java +++ /dev/null @@ -1,170 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.ByteResolverParam; -import io.netty.buffer.ByteBuf; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -/** - * 字段解析管理总类 - */ -@Service -@Slf4j -@AllArgsConstructor -public class FieldResolver extends ByteMergeProvider { - - //1、字段截取 => 2、简单的字节解析和复杂的字节解析 - public Object filedParserManger(ByteBuf byteBuf, FieldConfig fieldConfig, Integer maxFixedPosition) { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - //最大固定位置不为空, - if (!ObjectUtil.isEmpty(maxFixedPosition)) { - orignPosition -= maxFixedPosition; - } - Object fieldValue = 0; - //待优化 - if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { - fieldValue = bitToResolver(byteBuf, fieldConfig); - } else { - ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); - fieldValue = parsingFields(fieldBytes, fieldConfig.getRuleJson()); - } - return fieldValue; - } - - //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, - //目前默认配置的规则设置暂不支持配置化,由实现完成 - private Object parsingFields(ByteBuf byteBuf, String ruleJson) { - Object fieldsResolveValue = null; - List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); - if (ObjectUtil.isEmpty(ruleMapList)) { - fieldsResolveValue = defaultResolveBuilder(byteBuf); - } else { - fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); - } - return fieldsResolveValue; - } - - private Object defaultResolveBuilder(ByteBuf byteBuf) { - Integer defaultResolveValue = 0; - for (int i = 0; i < byteBuf.writerIndex(); i++) { - defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; - } - return defaultResolveValue; - } - - //字段解析构建器(针对字节单位的) - //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 - // 字节归并结束或者规则结束=>继续根据规则进行判断 - private Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { - Object customizeResolveValue = null; - try { - List bytStrList = new ArrayList<>(); - //存放到数组里面 - for (int i = 0; i < byteBuf.writerIndex(); i++) { - bytStrList.add(byteBuf.readByte()); - } - int i = 0; - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - customizeResolveValue = this.resolveByteMerge(bytStrList, ruletypeId,vaildRange); - break; - } else { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - List tempBytStr = new ArrayList<>(); - for (int k = 0; i < bytStrList.size(); i++) { - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(k) - .value(bytStrList.get(k)) - .ruletypeId(ruletypeId).build(); - tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); - } - bytStrList = tempBytStr; - } - i++; - } - //字节归并到一起=>继续根据规则进行判断 - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(customizeResolveValue) - .ruletypeId(ruletypeId).build(); - customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(customizeResolveValue)); - return customizeResolveValue; - } catch (RuntimeException ex) { - log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); - return null; - } - } - - /** - * 1、单个字节情况表示字段 - * 2、多字节情况表示字段(暂未处理) - */ - private Object bitToResolver(ByteBuf byteBuf, FieldConfig fieldConfig) { - Object fieldValue = new Object(); - try { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - byte fields = 0x00; - if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); - } else { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); - } - - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { - if (!StringUtils.isEmpty(fieldConfig.getExactOrignPosition())) { - fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getExactOrignPosition())).byteValue() - >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); - } else { - fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); - } - } else { - fieldValue = Integer.valueOf(fields & 0xff); - } - if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { - return fieldValue; - } - List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); - int i = 0; - //字节归并到一起=>继续根据规则进行判断 - while (i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(fieldValue) - .ruletypeId(ruletypeId).build(); - fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(fieldValue)); - return fieldValue; - } catch (RuntimeException ex) { - log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); - return null; - } - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java new file mode 100644 index 0000000..1d2aeab --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java @@ -0,0 +1,36 @@ +package com.casic.missiles.parser.resolver.bytes; + +import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.mapper.FieldRuleConfigMapper; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.pojo.ByteResolverParam; +import com.googlecode.aviator.AviatorEvaluator; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; +//转换规则 +@Component("convert") +@AllArgsConstructor +@Slf4j +public class ByteRuleResolver implements ByteResolver { + + private final FieldRuleConfigMapper fieldRuleConfigMapper; + + @Override + public Object resolveOperationRule(ByteResolverParam byteResolverParam){ + FieldRuleConfig fieldRuleEngine=fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); + if(ObjectUtil.isEmpty(fieldRuleEngine)){ + return byteResolverParam.getValue(); + } + String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); + Map env2 = new HashMap(); + env2.put("value", (byte) byteResolverParam.getValue()); + String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); + return values; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java index 103821c..786b71c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java @@ -2,34 +2,34 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("logicalShift") +@Component("logicalShift") @AllArgsConstructor @Slf4j public class LogicalShiftResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //字节位移 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { Integer index = byteResolverParam.getIndex(); - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return byteResolverParam.getValue(); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java index 476747d..01149bd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("operation") +@Component("operation") @AllArgsConstructor @Slf4j public class OperationResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //混合运算,有常量或者乘除的缩放 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java index 0b82cf4..79abcce 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.casic.missiles.pojo.ByteResolverParam; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; //精度计算 -@Service("precision") +@Component("precision") @AllArgsConstructor @Slf4j public class PrecisionResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java deleted file mode 100644 index 5c3f332..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; -//转换规则 -@Service("convert") -@AllArgsConstructor -@Slf4j -public class RuleResolver implements ByteResolver { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam){ - RuleEvaluator fieldRuleEngine=fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); - if(ObjectUtil.isEmpty(fieldRuleEngine)){ - return byteResolverParam.getValue(); - } - String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); - Map env2 = new HashMap(); - env2.put("value", (byte) byteResolverParam.getValue()); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java new file mode 100644 index 0000000..d3bbd91 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java @@ -0,0 +1,15 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; + +import java.util.List; +import java.util.Map; +// 前导码匹配->长度字段 +public interface AbstractCombinedFieldProcessor { + + Map invoke(Map map, ByteBuf byteBuf, List combinedFieldConfigList, + Map fieldConfigsMap, Map storeObjectMap); + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java new file mode 100644 index 0000000..03c8480 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java @@ -0,0 +1,59 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-13 + */ +//依次递增进行数据的解析, +public class GenericCombinedFieldResolver { + + + //通过查询,字段长度长度随机 + public void parseDataField(List combinedFieldConfigList, ByteBuf byteBuf, + Map storeObjectMap, Map fieldConfigsMap) { + Integer frameLength = Integer.valueOf(ByteBufUtil.hexDump(byteBuf)); + //添加前置处理器 + com.casic.missiles.util.ClassUtil classUtil = new com.casic.missiles.util.ClassUtil(); + List abstractCombinedProcessors = classUtil.getSubClassList(AbstractCombinedFieldProcessor.class); + + Map fieldFixedMap = combinedFieldLeadCodeMap(combinedFieldConfigList); + //frameLength + Map combinedProcessorFields = null; + while (byteBuf.readableBytes() < frameLength) { + //一直处理 + for (AbstractCombinedFieldProcessor abstractCombinedProcessor : abstractCombinedProcessors) { + combinedProcessorFields = abstractCombinedProcessor.invoke(combinedProcessorFields, byteBuf, + combinedFieldConfigList, + fieldConfigsMap, storeObjectMap); + if (combinedProcessorFields == null || byteBuf.readableBytes() < frameLength) { + return; + } + } + + } + } + + /** + * 取出前导码匹配集合 + */ + private Map combinedFieldLeadCodeMap(List combinedFieldConfigList) { + Map fieldFixedMap = combinedFieldConfigList + .stream() + .collect(Collectors.toMap(CombinedFieldConfig::getPrefixCode, e -> e)); + return fieldFixedMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java new file mode 100644 index 0000000..643a934 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java @@ -0,0 +1,100 @@ +package com.casic.missiles.parser.resolver.fields; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.FieldParserSupport; +import com.casic.missiles.pojo.*; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 保存使用时最基本的信息,并且使用原型模式 + */ +@Slf4j +public class DefaultProtocolFieldParser extends FieldParserSupport implements FieldParser, FixedPropertyEnum { + + //通过传入的配置和报文进行字段解析 + @Override + public Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap) { + Map dataMap = new HashMap<>(); + for (AbstractFieldConfig protocolFieldConfig : protocolFieldConfigs) { + if (!ObjectUtils.isEmpty(protocolFieldConfig.getOriginPositionByte())) { + Object fieldValue = FieldResolver.parseField(buffer, protocolFieldConfig, null); + if (protocolFieldConfig.getIsStorage() == 1) { + storeObjectMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + dataMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + } + return dataMap; + } + + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength) { + Map fixedPropertyMap = new HashMap<>(); + Integer fixedLength = calculateLength(protocolFieldConfigs); + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + fixedPropertyMap.put(FIXED_POSITION, maxFixedPosition); + fixedPropertyMap.put(TOTAL_LENGTH, totalLength); + fixedPropertyMap.put(TAIL_POSITION, totalLength - fixedLength + maxFixedPosition); + return fixedPropertyMap; + } + + //** 获取业务内容的byteBuf + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer) { + //计算固定长度 + Integer fixedLength = calculateLength(protocolFieldConfigs); + //总长度获取 + String lightText = buffer.toString(Charset.forName("ISO-8859-1")); + Integer totalLength = lightText.length(); + //计算固定长度最大长度 + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + //计算数据报文内容 + ByteBuf bizDataFields = buffer.slice(maxFixedPosition - 1, (totalLength - fixedLength)); + return bizDataFields; + } + + /** + * 获取过滤字段的长度 + */ + @Override + public Integer getTotalFilterLength(ProtocolConfig protocolConfig, + ByteBuf byteBuf, + Map protocolFieldConfigMap) { + if (ByteBufUtil.hexDump(byteBuf).equals("")) { + return 0; + } + int totalFilterLength = 0; + String filterFields = protocolConfig.getTotalLengthFilterFields(); + try { + if (!StringUtils.isEmpty(filterFields)) { + String[] filterFieldList = filterFields.split(","); + for (String filterFieldId : filterFieldList) { + if (StringUtils.isNotEmpty(filterFieldId)) { + ProtocolFieldConfig fieldConfig = protocolFieldConfigMap.get(Long.valueOf(filterFieldId)); + //这里都是按字节计算,没有对位进行区分,可能会出现错误 + // 如果对位有需求,需要进一步跟进 + totalFilterLength += fieldConfig.getOffsetLength(); + } + } + } + return totalFilterLength; + } catch (Exception ex) { + log.error("报文确认分发阶段,获取报文总长度过滤长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); + } + return totalFilterLength; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java new file mode 100644 index 0000000..d51e887 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java @@ -0,0 +1,169 @@ +package com.casic.missiles.parser.resolver.fields; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.parser.resolver.ByteMergeProvider; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.AbstractFieldConfig; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.pojo.ByteResolverParam; +import io.netty.buffer.ByteBuf; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * 字段解析管理总类 + */ +@Slf4j +public class FieldResolver extends ByteMergeProvider { + + //1、字段截取 => 2、简单的字节解析和复杂的字节解析 + public static Object parseField(ByteBuf byteBuf,AbstractFieldConfig fieldConfig, Integer maxFixedPosition) { + Integer orignPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + //最大固定位置不为空, + if (!ObjectUtil.isEmpty(maxFixedPosition)) { + orignPosition -= maxFixedPosition; + } + Object fieldValue = 0; + //待优化 + if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { + fieldValue = doParseBitField(byteBuf, fieldConfig); + } else { + ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); + fieldValue = doParseByteField(fieldBytes, fieldConfig.getRuleJson()); + } + return fieldValue; + } + + //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, + //目前默认配置的规则设置暂不支持配置化,由实现完成 + private static Object doParseByteField(ByteBuf byteBuf, String ruleJson) { + Object fieldsResolveValue = null; + List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); + if (ObjectUtil.isEmpty(ruleMapList)) { + fieldsResolveValue = defaultResolveBuilder(byteBuf); + } else { + fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); + } + return fieldsResolveValue; + } + + private static Object defaultResolveBuilder(ByteBuf byteBuf) { + Integer defaultResolveValue = 0; + for (int i = 0; i < byteBuf.writerIndex(); i++) { + defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; + } + return defaultResolveValue; + } + + //字段解析构建器(针对字节单位的) + //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 + // 字节归并结束或者规则结束=>继续根据规则进行判断 + private static Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { + Object customizeResolveValue = null; + try { + List bytStrList = new ArrayList<>(); + //存放到数组里面 + for (int i = 0; i < byteBuf.writerIndex(); i++) { + bytStrList.add(byteBuf.readByte()); + } + int i = 0; + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { + if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + customizeResolveValue = resolveByteMerge(bytStrList, ruletypeId, vaildRange); + break; + } else { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + List tempBytStr = new ArrayList<>(); + for (int k = 0; i < bytStrList.size(); i++) { + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(k) + .value(bytStrList.get(k)) + .ruletypeId(ruletypeId).build(); + tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); + } + bytStrList = tempBytStr; + } + i++; + } + //字节归并到一起=>继续根据规则进行判断 + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(null) + .value(customizeResolveValue) + .ruletypeId(ruletypeId).build(); + customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); + i++; + } + System.out.println(JSON.toJSON(customizeResolveValue)); + return customizeResolveValue; + } catch (RuntimeException ex) { + log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); + return null; + } + } + + /** + * 1、单个字节情况表示字段 + * 2、多字节情况表示字段(暂未处理) + */ + private static Object doParseBitField(ByteBuf byteBuf,AbstractFieldConfig fieldConfig) { + Object fieldValue = new Object(); + try { + Integer orignPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + byte fields = 0x00; + if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { + fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); + } else { + fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); + } + + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { + if (!StringUtils.isEmpty(fieldConfig.getOriginPositionBit())) { + fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getOriginPositionBit())).byteValue() + >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); + } else { + fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); + } + } else { + fieldValue = Integer.valueOf(fields & 0xff); + } + if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { + return fieldValue; + } + List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); + int i = 0; + //字节归并到一起=>继续根据规则进行判断 + while (i < ruleMapList.size()) { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(null) + .value(fieldValue) + .ruletypeId(ruletypeId).build(); + fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); + i++; + } + System.out.println(JSON.toJSON(fieldValue)); + return fieldValue; + } catch (RuntimeException ex) { + log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); + return null; + } + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java deleted file mode 100644 index 35ae3d0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java +++ /dev/null @@ -1,183 +0,0 @@ -package com.casic.missiles.parser.resolver.fields; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufAllocator; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; -import org.springframework.util.ObjectUtils; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service("standard") -@AllArgsConstructor -@Slf4j -public class StandardFieldParser implements FieldParser { - - private final FieldConfigDao fieldConfigDao; - private final FieldResolver fieldResolver; - - //数据解析 - @Override - public Map dataParser(RuleConfig ruleConfig, String lightText, String protocolId) { - String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); - ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); - bufferContent.writeBytes(lightText.getBytes(Charset.forName("ISO-8859-1"))); - Map dataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - for (String dataFieldId : dataFieldIds) { - FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(dataFieldId); - if (!ObjectUtils.isEmpty(fieldConfig)) { - dataMap.put(fieldConfig.getFieldName(), String.valueOf(fieldResolver.filedParserManger(bufferContent, fieldConfig, maxFixedPosition))); - } - } - return dataMap; - } - - //数据解析 - @Override - public Map fixDataParser(String protocolId, ByteBuf buffer) { - List dataFieldIdList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Map dataMap = new HashMap<>(); - for (FieldConfig dataField : dataFieldIdList) { - if (!ObjectUtils.isEmpty(dataField.getOrignPosition())) { - Object fieldValue = (Integer) fieldResolver.filedParserManger(buffer, dataField, null); - dataMap.put(dataField.getFieldName(), fieldValue); - } - } - return dataMap; - } - - @Override - public Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf) { - if (ByteBufUtil.hexDump(byteBuf).equals("")) { - return 0; - } - String filterFields = protocolConfig.getTotalLengthFilterField(); - Integer totalLength = 0; - try { - FieldConfig totalFieldConfig = fieldConfigDao.getFieldConfigById(protocolConfig.getTotalLengthId()); - int totalFilterLength = 0; - if (!StringUtils.isEmpty(filterFields)) { - String[] filterFieldList = filterFields.split(","); - for (String filterField : filterFieldList) { - FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(filterField); - //这里都是按字节计算,没有对位进行区分,可能会出现错误 - - // 如果对位有需求,需要进一步跟进 - totalFilterLength += fieldConfig.getOffsetLength(); - } - } - totalLength = (Integer) fieldResolver.filedParserManger(byteBuf, totalFieldConfig, null) + totalFilterLength; - } catch (Exception ex) { - log.error("报文确认分发阶段,获取报文总长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); - } - return totalLength; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer) { - //业务内容 - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - String protocolId = String.valueOf(protocolConfig.getId()); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - //计算固定长度 - Integer fixedLength = calculateLength(fieldConfigList); -// Integer totalLength = this.getTotalLength(protocolConfig, buffer); - //总长度获取 - Integer totalLength = lightText.length(); - //计算固定长度最大长度 - Integer maxFixedPosition = calculatePosition(fieldConfigList); -// buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - //计算数据报文内容 - ByteBuf bizDataFields = buffer.slice(maxFixedPosition-1, (totalLength - fixedLength)); - return bizDataFields; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer) { - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - String protocolId = String.valueOf(protocolConfig.getId()); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer fixedLength = calculateLength(fieldConfigList); -// Integer totalLength = this.getTotalLength(protocolConfig, buffer); - Integer totalLength = lightText.length(); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - ByteBuf fixDataFields = buffer.slice(0, maxFixedPosition); - return fixDataFields; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer) { - String protocolId = String.valueOf(protocolConfig.getId()); - Map fixedPropertyMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer fixedLength = calculateLength(fieldConfigList); - Integer totalLength = this.getTotalLength(protocolConfig, buffer); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - fixedPropertyMap.put("fixedPosition", maxFixedPosition); - fixedPropertyMap.put("totalLength", totalLength); - fixedPropertyMap.put("tailPosition", totalLength - fixedLength + maxFixedPosition); - return fixedPropertyMap; - } - - //分别计算bit和byte长度=> 合并长度 - private Integer calculateLength(List fieldConfigList) { - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (FieldConfig fieldConfig : fieldConfigList) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - Integer fixedLength = bytefixedLength + bitfixedLength / 8; - return fixedLength; - } - - //找到最大值=> 根据最大值计算业务数据下标 - private Integer calculatePosition(List fieldConfigList) { - String rex = "[0-9]+"; - Integer max = -1; - for (FieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOrignPosition()) - && Integer.valueOf(fieldConfig.getOrignPosition()) > max) { - max = Integer.valueOf(fieldConfig.getOrignPosition()); - } - } - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (FieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOrignPosition()) && fieldConfig.getOrignPosition().equals(max)) { - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - } - } - Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; - return maxFixedPosition; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java new file mode 100644 index 0000000..d4ec6c7 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java @@ -0,0 +1,76 @@ +package com.casic.missiles.parser.rule; + +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import org.apache.commons.lang3.StringUtils; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class GenericRuleResolver { + + //根据前置字段的值,找到指定的规则 + //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 + //=>循环判断=>通过规则得到业务字段 + public static RuleConfig machRule(Map fixDataMap, + String ids, + List protocolFieldConfigs, + List ruleConfigs) { + List preRuleConfigList = getPreRuleList(ids, protocolFieldConfigs); + //获取前置规则字段 + final Map metaDataMap = getPreRuleFields(preRuleConfigList, fixDataMap); + //准备固定的字段集合 + Map fixDataFieldMap = getFixDataFieldMap(protocolFieldConfigs); + return RuleResolverCore.doMachRule(ruleConfigs, metaDataMap, fixDataMap, fixDataFieldMap); + } + + private static Map getFixDataFieldMap(List protocolFieldConfigs) { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, ProtocolFieldConfig::getFieldName) + ); + return fixDataFieldMap; + } + + + /** + * 查询前置规则的字段配置 + * + * @param ids + * @return + */ + private static List getPreRuleList(String ids, List protocolFieldConfigs) { + String[] idList = ids.split(","); + Map prepareMaps = new HashMap<>(); + for (String id : idList) { + if (StringUtils.isNotEmpty(id)) { + prepareMaps.put(Long.valueOf(id), ""); + } + } + List preRuleConfigList = protocolFieldConfigs + .stream() + .filter(e -> prepareMaps.containsKey(e.getId())) + .collect(Collectors.toList()); + return preRuleConfigList; + } + + /** + * 获取前置规则解析字段 + */ + private static Map getPreRuleFields(List preRuleFieldConfigList, Map fixDataMap) { + Map ruleFieldMap = new HashMap<>(); + preRuleFieldConfigList.stream() + .forEach( + preRuleFieldConfig -> { + String fieldName = preRuleFieldConfig.getFieldName(); + if (fixDataMap.containsKey(fieldName)) { + ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); + } + } + ); + return ruleFieldMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java new file mode 100644 index 0000000..baae7e8 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -0,0 +1,68 @@ +package com.casic.missiles.parser.rule; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.casic.missiles.pojo.RuleConfig; + +import java.util.*; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleResolverCore { + + + public static RuleConfig doMachRule(List ruleConfigList, Map metaDataMap, + Map fixDataMap, + Map fixDataFieldMap) { + Optional ruleConfigOptional = ruleConfigList.stream() + .filter(ruleConfig -> machRuleConfig( + JSON.parseObject(ruleConfig.getMatchRuleJson(), Map.class), metaDataMap)) + .findFirst(); + if (ObjectUtil.isEmpty(ruleConfigOptional)) { + return null; + } + String[] ruleFields = ruleConfigOptional.get().getDataFieldIds().split(","); + Map ruleMetaDataMap = getRuleFields(ruleFields, fixDataMap, fixDataFieldMap); + //递归选定解析规则,进行规则解析 + if (!ruleConfigOptional.get().getIsFinishMatch().equals("1")) { + //递归选定规则 + doMachRule(ruleConfigList, ruleMetaDataMap, fixDataMap, fixDataFieldMap); + } + return ruleConfigOptional.get(); + } + + + private static Map getRuleFields(String[] preRuleConfigList, Map fixedDataMap, + Map fixedFieldMap) { + Map ruleFieldMap = new HashMap<>(); + for (String preRuleConfigId : preRuleConfigList) { + String fieldName = fixedFieldMap.get(preRuleConfigId); + if (fixedDataMap.containsKey(fieldName)) { + ruleFieldMap.put(fieldName, String.valueOf(fixedDataMap.get(fieldName))); + } + } + return ruleFieldMap; + } + + + //匹配规则配置 + private static Boolean machRuleConfig(Map ruleMap, Map metaDataMap) { + if (ruleMap == null || metaDataMap == null) { + return null; + } + //所有的字段在规则里面必须有有配置 + for (String key : metaDataMap.keySet()) { + if (ruleMap.containsKey(key)) { + if (!ruleMap.get(key).equals(metaDataMap.get(key))) { + return false; + } + } else { + return false; + } + } + return true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java deleted file mode 100644 index 664088d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java +++ /dev/null @@ -1,92 +0,0 @@ -package com.casic.missiles.parser.rule; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.mapper.dao.PreRuleConfigDao; -import com.casic.missiles.mapper.dao.RuleConfigDao; -import lombok.AllArgsConstructor; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.*; -import java.util.stream.Collectors; - -@Service -@AllArgsConstructor -public class RulerProvider { - - private final FieldConfigDao fieldConfigDao; - private final PreRuleConfigDao preRuleConfigDao; - private final RuleConfigDao ruleConfigDao; - - //根据前置字段的值,找到指定的规则 - //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 - //=>循环判断=>通过规则得到业务字段 - public RuleConfig ruleConfig(Map fixDataMap, String protocolId) { - //批量获取规则 - List preRuleConfigList = preRuleConfigDao.getPreRuleList(protocolId); - //获取固定字段 - Map fixFieldMap = getAllFieldMap(protocolId); - //获取前置规则字段 - final String preRuleFields = getPreRuleFields(preRuleConfigList, fixDataMap, fixFieldMap); - List ruleConfigList = ruleConfigDao.getRuleConfigById(protocolId); - Optional ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig ->preRuleFields.equals( ruleConfig.getParseRuleJson())).findFirst(); - //递归选定解析规则,进行规则解析 - while (!ObjectUtil.isEmpty(ruleConfigOptional) && !ruleConfigOptional.get().getIsBizField().equals("1")) { - String ruleFields = getRuleFields(ruleConfigOptional.get().getDataFieldIds().split(","), fixDataMap, fixFieldMap); - ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig -> ruleConfig.getParseRuleJson().equals(ruleFields)).findFirst(); - } - return ruleConfigOptional.get(); - } - - /** - * 获取前置规则解析字段 - */ - private String getPreRuleFields(List preRuleConfigList, Map fixDataMap, Map fixFieldMap) { - Map ruleFieldMap= new HashMap<>(); - preRuleConfigList.stream() - .forEach( - preRuleConfig -> { - String fieldName = fixFieldMap.get(Long.valueOf(preRuleConfig.getRuleFieldId())); - if (fixDataMap.containsKey(fieldName)) { - ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); - } - } - ); - return JSONObject.toJSONString(ruleFieldMap); - } - - private Map getAllFieldMap(String protocolId) { - List fieldList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Map fixFieldMap = fieldList.stream().collect( - Collectors.toMap(FieldConfig::getId, FieldConfig::getFieldName) - ); - return fixFieldMap; - } - - private String getRuleFields(String[] preRuleConfigList, Map fixDataMap, Map fixFieldMap) { - Map ruleFieldMap= new HashMap<>(); - for (String preRuleConfigId : preRuleConfigList) { - String fieldName = fixFieldMap.get(preRuleConfigId); - if (fixDataMap.containsKey(fieldName)) { - ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); - } - } - return JSONObject.toJSONString(ruleFieldMap); - } - - //弃置 - private String ListToString(List ruleFieldList) { - String ruleFields = ""; - for (String ruleField : ruleFieldList) { - ruleFields += ruleField + ","; - } - ruleFields = StringUtils.isEmpty(ruleFields) ? ruleFields : ruleFields.substring(0, ruleFields.length() - 1); - return ruleFields; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java index 6177e10..bfa87a5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java @@ -2,7 +2,7 @@ public interface SafeStrategy { - String decryption(byte[] bytes); + String decryption(String cipher); String encryption(String lightText); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java index 618716c..6236302 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java @@ -9,9 +9,9 @@ //十六进制的字符串转换成字节数组 byte[] bytes = hexStrToBinaryStr(msg); //计算CRC8 - byte crc8 = CRC8(bytes, 0, bytes.length); - String crc8ToStr = "" + Integer.toHexString(0xff & crc8); - return crc8ToStr; +// String crc8ToStr = "" + Integer.toHexString(0xff & crc8); +// return crc8ToStr; + return null; } /** @@ -33,50 +33,5 @@ return bytes; } - /** - * CRC8 校验 多项式 x8+x2+x+1 - * - * @param b - * @param off - * @param len - * @return - */ - public static byte CRC8(final byte[] b, final int off, final int len) { - byte result = 0x00; - for (int i = 0; i < len; i++) { - result = CHECKSUM_TABLE[(result ^ (b[i + off] & 0xFF)) & 0xFF]; - } - return (byte) (result & 0xFFL); - } - - private final static byte[] CHECKSUM_TABLE = {(byte) 0x00, (byte) 0x07, (byte) 0x0e, (byte) 0x09, (byte) 0x1c, (byte) 0x1b, - (byte) 0x12, (byte) 0x15, (byte) 0x38, (byte) 0x3f, (byte) 0x36, (byte) 0x31, (byte) 0x24, (byte) 0x23, (byte) 0x2a, - (byte) 0x2d, (byte) 0x70, (byte) 0x77, (byte) 0x7e, (byte) 0x79, (byte) 0x6c, (byte) 0x6b, (byte) 0x62, (byte) 0x65, - (byte) 0x48, (byte) 0x4f, (byte) 0x46, (byte) 0x41, (byte) 0x54, (byte) 0x53, (byte) 0x5a, (byte) 0x5d, (byte) 0xe0, - (byte) 0xe7, (byte) 0xee, (byte) 0xe9, (byte) 0xfc, (byte) 0xfb, (byte) 0xf2, (byte) 0xf5, (byte) 0xd8, (byte) 0xdf, - (byte) 0xd6, (byte) 0xd1, (byte) 0xc4, (byte) 0xc3, (byte) 0xca, (byte) 0xcd, (byte) 0x90, (byte) 0x97, (byte) 0x9e, - (byte) 0x99, (byte) 0x8c, (byte) 0x8b, (byte) 0x82, (byte) 0x85, (byte) 0xa8, (byte) 0xaf, (byte) 0xa6, (byte) 0xa1, - (byte) 0xb4, (byte) 0xb3, (byte) 0xba, (byte) 0xbd, (byte) 0xc7, (byte) 0xc0, (byte) 0xc9, (byte) 0xce, (byte) 0xdb, - (byte) 0xdc, (byte) 0xd5, (byte) 0xd2, (byte) 0xff, (byte) 0xf8, (byte) 0xf1, (byte) 0xf6, (byte) 0xe3, (byte) 0xe4, - (byte) 0xed, (byte) 0xea, (byte) 0xb7, (byte) 0xb0, (byte) 0xb9, (byte) 0xbe, (byte) 0xab, (byte) 0xac, (byte) 0xa5, - (byte) 0xa2, (byte) 0x8f, (byte) 0x88, (byte) 0x81, (byte) 0x86, (byte) 0x93, (byte) 0x94, (byte) 0x9d, (byte) 0x9a, - (byte) 0x27, (byte) 0x20, (byte) 0x29, (byte) 0x2e, (byte) 0x3b, (byte) 0x3c, (byte) 0x35, (byte) 0x32, (byte) 0x1f, - (byte) 0x18, (byte) 0x11, (byte) 0x16, (byte) 0x03, (byte) 0x04, (byte) 0x0d, (byte) 0x0a, (byte) 0x57, (byte) 0x50, - (byte) 0x59, (byte) 0x5e, (byte) 0x4b, (byte) 0x4c, (byte) 0x45, (byte) 0x42, (byte) 0x6f, (byte) 0x68, (byte) 0x61, - (byte) 0x66, (byte) 0x73, (byte) 0x74, (byte) 0x7d, (byte) 0x7a, (byte) 0x89, (byte) 0x8e, (byte) 0x87, (byte) 0x80, - (byte) 0x95, (byte) 0x92, (byte) 0x9b, (byte) 0x9c, (byte) 0xb1, (byte) 0xb6, (byte) 0xbf, (byte) 0xb8, (byte) 0xad, - (byte) 0xaa, (byte) 0xa3, (byte) 0xa4, (byte) 0xf9, (byte) 0xfe, (byte) 0xf7, (byte) 0xf0, (byte) 0xe5, (byte) 0xe2, - (byte) 0xeb, (byte) 0xec, (byte) 0xc1, (byte) 0xc6, (byte) 0xcf, (byte) 0xc8, (byte) 0xdd, (byte) 0xda, (byte) 0xd3, - (byte) 0xd4, (byte) 0x69, (byte) 0x6e, (byte) 0x67, (byte) 0x60, (byte) 0x75, (byte) 0x72, (byte) 0x7b, (byte) 0x7c, - (byte) 0x51, (byte) 0x56, (byte) 0x5f, (byte) 0x58, (byte) 0x4d, (byte) 0x4a, (byte) 0x43, (byte) 0x44, (byte) 0x19, - (byte) 0x1e, (byte) 0x17, (byte) 0x10, (byte) 0x05, (byte) 0x02, (byte) 0x0b, (byte) 0x0c, (byte) 0x21, (byte) 0x26, - (byte) 0x2f, (byte) 0x28, (byte) 0x3d, (byte) 0x3a, (byte) 0x33, (byte) 0x34, (byte) 0x4e, (byte) 0x49, (byte) 0x40, - (byte) 0x47, (byte) 0x52, (byte) 0x55, (byte) 0x5c, (byte) 0x5b, (byte) 0x76, (byte) 0x71, (byte) 0x78, (byte) 0x7f, - (byte) 0x6a, (byte) 0x6d, (byte) 0x64, (byte) 0x63, (byte) 0x3e, (byte) 0x39, (byte) 0x30, (byte) 0x37, (byte) 0x22, - (byte) 0x25, (byte) 0x2c, (byte) 0x2b, (byte) 0x06, (byte) 0x01, (byte) 0x08, (byte) 0x0f, (byte) 0x1a, (byte) 0x1d, - (byte) 0x14, (byte) 0x13, (byte) 0xae, (byte) 0xa9, (byte) 0xa0, (byte) 0xa7, (byte) 0xb2, (byte) 0xb5, (byte) 0xbc, - (byte) 0xbb, (byte) 0x96, (byte) 0x91, (byte) 0x98, (byte) 0x9f, (byte) 0x8a, (byte) 0x8d, (byte) 0x84, (byte) 0x83, - (byte) 0xde, (byte) 0xd9, (byte) 0xd0, (byte) 0xd7, (byte) 0xc2, (byte) 0xc5, (byte) 0xcc, (byte) 0xcb, (byte) 0xe6, - (byte) 0xe1, (byte) 0xe8, (byte) 0xef, (byte) 0xfa, (byte) 0xfd, (byte) 0xf4, (byte) 0xf3}; } \ No newline at end of file diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java index 27c2838..6e078a3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java @@ -1,9 +1,6 @@ package com.casic.missiles.parser.safe.impl; -import cn.hutool.core.util.CharsetUtil; -import cn.hutool.crypto.symmetric.SM4; -import cn.hutool.crypto.symmetric.SymmetricCrypto; - +import com.casic.missiles.parser.safe.SafeStrategy; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; @@ -11,19 +8,44 @@ import org.bouncycastle.crypto.engines.SM4Engine; import org.bouncycastle.crypto.params.KeyParameter; import org.bouncycastle.util.encoders.Hex; - -import static cn.hutool.crypto.Mode.ECB; -import static cn.hutool.crypto.Padding.NoPadding; +import org.springframework.stereotype.Component; /** * SM4算法工具类 */ @Slf4j -public class Sm4 { +@Component("sm4") +public class Sm4 implements SafeStrategy { //加解密的字节快大小 public static final int BlockSize = 16; + @Override + public String decryption(String cipher) { + byte[] keyByte = { + 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 + }; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(keyByte); + byte[] in = Hex.decode(cipher); + byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); + String plain = EcbDecrypt(in, keyBytes); + return plain; + } + + @Override + public String encryption(String cipher) { + byte[] keyByte = { + 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 + }; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(keyByte); + byte[] in = Hex.decode(cipher); + byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); + String plain = EcbDecrypt(in, keyBytes); + return plain; + } + /** * SM4ECB加密算法,对内 * @@ -32,8 +54,6 @@ * @return */ private static byte[] ecb_encrypt(byte[] in, byte[] keyBytes) { - - SM4Engine sm4Engine = new SM4Engine(); sm4Engine.init(true, new KeyParameter(keyBytes)); byte[] out = new byte[in.length]; @@ -58,27 +78,6 @@ return cipher; } - - /** - * hutool 解密SM4 - * - * @param encodeContent - * @return - */ - public static String decode(String encodeContent) { - String key = "24ad182507479a5da3ad94d9d78ea203"; - try { - SymmetricCrypto sm4 = new SM4(ECB, NoPadding, key.getBytes()); - String decryptStr = sm4.decryptStr(encodeContent, CharsetUtil.CHARSET_UTF_8); - return decryptStr; - } catch (Exception e) { - e.printStackTrace(); - log.error("SM4解密失败"); - } - return null; - } - - /** * SM4的ECB加密算法 * @@ -129,20 +128,6 @@ return plain; } - /** - * SM4的ECB解密算法 - * - * @param cipher 输入的密文字符串 - * @param key 密钥 - * @return - */ - public static String EcbDecrypt(String cipher, String key) { - byte[] in = Hex.decode(cipher); - byte[] keyBytes = Hex.decode(key); - - String plain = EcbDecrypt(in, keyBytes); - return plain; - } /** * 主函数 @@ -151,28 +136,24 @@ */ public static void main(String[] args) { byte[] ciphertext = { + 0x4B, (byte) 0x8C, (byte) 0x9D, 0x08, (byte) 0xE4, (byte) 0xD3, 0x64, 0x42, (byte) 0xB9, (byte) 0xA5, (byte) 0xFE, (byte) 0xCD, (byte) 0x91, 0x1B, 0x38, (byte) 0xAC, (byte) 0xE9, 0x1C, (byte) 0xCD, 0x53, 0x02, (byte) 0xD7, 0x0C, (byte) 0x9B, (byte) 0x96, 0x30, 0x62, (byte) 0xE8, (byte) 0xFB, (byte) 0xEF, (byte) 0xB9, (byte) 0xFF, (byte) 0xDE, 0x19, (byte) 0x80, 0x35, 0x3E, (byte) 0x90, 0x4F, 0x2F, 0x12, 0x2B, 0x19, (byte) 0x8B, 0x6C, 0x7A, (byte) 0x85, (byte) 0xA1, (byte) 0xB1, (byte) 0x86, (byte) 0xA3, 0x7A, 0x46, 0x0C, 0x2F, (byte) 0x94, 0x4F, 0x7F, 0x2C, 0x56, 0x14, (byte) 0xF3, (byte) 0x89, (byte) 0xC3, - 0x3F, 0x20, (byte) 0xF9, (byte) 0x87, (byte) 0xA1, 0x60, (byte) 0xD9, (byte) 0xA8, (byte) 0xFD, (byte) 0xD7, (byte) 0x9B, 0x4B, 0x26, 0x06, 0x30, 0x44}; + 0x3F, 0x20, (byte) 0xF9, (byte) 0x87, (byte) 0xA1, 0x60, (byte) 0xD9, (byte) 0xA8, (byte) 0xFD, (byte) 0xD7, (byte) 0x9B, 0x4B, 0x26, 0x06, 0x30, 0x44 + }; ByteBuf in = ByteBufAllocator.DEFAULT.heapBuffer(); in.writeBytes(ciphertext); - byte[] keyByte = { 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 }; ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); - key.writeBytes(ciphertext); - String resCipherData = decode(ByteBufUtil.hexDump(in)); - ByteBuf out = ByteBufAllocator.DEFAULT.heapBuffer(); -// out.writeBytes(resCipherData); -// System.out.println(hexBytes); - System.out.println(resCipherData.toString()); -// String resPlainData = EcbDecrypt(resCipherData, key); -// System.out.println("原始明文:" + data); -// System.out.println("解密后明文:" + resPlainData); + key.writeBytes(keyByte); +// String resCipherData = EcbDecrypt(ByteBufUtil.hexDump(in), ByteBufUtil.hexDump(key)); +// System.out.println(resCipherData); } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java index 1395a51..ac5f957 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java @@ -1,7 +1,7 @@ package com.casic.missiles.parser.safe.impl; import io.netty.buffer.ByteBufUtil; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** *

@@ -14,9 +14,8 @@ * @author hyl * @version v1.0: Tea.java, v 0.1 2021/3/12 13:48 $ */ -@Service("tea") -///tea算法类 - +//tea算法类 +@Component("tea") public class Tea { public static byte[] MyTea_Encrypt(byte[] MyTeaContent, int ByteLen, byte[] MyTeakey) { @@ -99,7 +98,6 @@ // for(int i32Index = 0; i32Index < 8; i32Index++) { // System.out.print("0x" + Integer.toHexString(MyContent[i32Index]) + " "); // } - // System.out.println("密钥为:"); // for(int i32Index = 0; i32Index < 16; i32Index++) { // System.out.print("0x" + Integer.toHexString(MyKeys[i32Index]) + " "); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java index bdd0721..bd1516a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java @@ -3,7 +3,7 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.parser.sender.DataSubscribeProvider; import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponents; import org.springframework.web.util.UriComponentsBuilder; @@ -12,7 +12,7 @@ import java.util.Collections; import java.util.Map; -@Service("functionCallback") +@Component("functionCallback") public class FunctionCallback implements DataSubscribeProvider { @Resource diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java index 0b44fb9..7526de2 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.Map; -@Service("middleware") +@Component("middleware") public class MiddlewareSubscribe implements DataSubscribeProvider { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java index 5dcee3f..e2f1192 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.Map; -@Service("nosql") +@Component("nosql") public class NoSqlSubscribe implements DataSubscribeProvider { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java b/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java new file mode 100644 index 0000000..81a5324 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java @@ -0,0 +1,86 @@ +package com.casic.missiles.pojo; + +import lombok.Data; + +/** + * 协议 + */ +@Data +public class Msg { + + /** + * 前导码 + */ + private String preamble; + + /** + * 版本号 + */ + private String version; + + /** + * 内容长度 + */ + private int leng; + + /** + * 设备ID + */ + private String deviceId; + + /** + * 通讯方式 + */ + private Integer connType; + + /** + * 加密方式 + */ + private Integer encryType; + + /** + * 目标地址 + */ + private String destAddr; + + /** + * PDUType + */ + private String PDUType; + + /** + * 操作类型 + */ + private Integer operateType; + + /** + * 传输控制位 PDUType.bit7=0时,表示存在后续的访问;当PDUType.bit7=1时,表示无后续的访问。 + */ + private Integer transControlFlag; + + /** + * 设备类型 + */ + private Integer deviceType; + + /** + * 序号 + */ + private Integer seq; + + /** + * tagList + */ + private String tagList; + + /** + * OidList + */ + private String OidList; + + /** + * CRC + */ + private String CRC; + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java index 40a5265..97cc984 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java @@ -40,7 +40,7 @@ String httpContent = msg.toString(Charset.defaultCharset()); log.info(" String : " + msg.toString(Charset.defaultCharset())); String majorContent = httpContent.substring(httpContent.indexOf("{"), httpContent.lastIndexOf("}") + 1); - String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("serviceData")).get("Value")); + String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("RegistryData")).get("Value")); log.info("----------------------------------" + values); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); bufferContent.writeBytes(values.getBytes(Charset.forName("ISO-8859-1"))); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java index 1b132a7..e3ced4b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java @@ -35,7 +35,7 @@ String httpContent = msg.toString(Charset.defaultCharset()); log.info(" String : " + msg.toString(Charset.defaultCharset())); String majorContent = httpContent.substring(httpContent.indexOf("{"), httpContent.lastIndexOf("}") + 1); - String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("serviceData")).get("Value")); + String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("RegistryData")).get("Value")); log.info("----------------------------------" + values); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); bufferContent.writeBytes(values.getBytes(Charset.forName("ISO-8859-1"))); diff --git a/sensorhub-core/src/main/resources/application.properties b/sensorhub-core/src/main/resources/application.properties deleted file mode 100644 index 8b13789..0000000 --- a/sensorhub-core/src/main/resources/application.properties +++ /dev/null @@ -1 +0,0 @@ - diff --git a/sensorhub-core/src/main/resources/config/application-dev.yml b/sensorhub-core/src/main/resources/config/application-dev.yml index 4f897a8..dcc4c2d 100644 --- a/sensorhub-core/src/main/resources/config/application-dev.yml +++ b/sensorhub-core/src/main/resources/config/application-dev.yml @@ -4,9 +4,9 @@ spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true + url: jdbc:mysql://127.0.0.1:3306/sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true username: root - password: Casic203 + password: root session: store-type: redis redis: diff --git a/sensorhub-core/src/main/resources/config/application.yml b/sensorhub-core/src/main/resources/config/application.yml index ae89f9d..7965da1 100644 --- a/sensorhub-core/src/main/resources/config/application.yml +++ b/sensorhub-core/src/main/resources/config/application.yml @@ -30,6 +30,13 @@ port: 6379 password: ew5T4K3#203lwh config-prefix: 'Casic:' +#代码生成器配置 +code: + generate: + #作者 + author: cz + #待生成对象表名 + table-name: bussiness_field_config,combined_field_config sensorhub: config: port: 7091 diff --git a/sensorhub-support/pom.xml b/sensorhub-support/pom.xml index 9a71296..761601c 100644 --- a/sensorhub-support/pom.xml +++ b/sensorhub-support/pom.xml @@ -42,6 +42,12 @@ ${redis.version} + + com.baomidou + mybatis-plus-generator + ${mybatis-plus-generator.version} + + org.reflections diff --git a/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java b/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java new file mode 100644 index 0000000..515ca53 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java @@ -0,0 +1,14 @@ +package com.casic.missiles.enums; + +/** + * @author + * @date + */ +public interface FixedPropertyEnum { + + String FIXED_POSITION = "fixedPosition"; + + String TOTAL_LENGTH = "totalLength"; + + String TAIL_POSITION = "tailPosition"; +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/CombinedFieldMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CombinedFieldMapper.java new file mode 100644 index 0000000..38e8f42 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CombinedFieldMapper.java @@ -0,0 +1,15 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.CombinedFieldConfig; +import org.apache.ibatis.annotations.Mapper; + +/** + * @author cz + * + */ +@Mapper +public interface CombinedFieldMapper extends BaseMapper { + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java new file mode 100644 index 0000000..128b09d --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java @@ -0,0 +1,10 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.CommandEventConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface CommandEventMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java new file mode 100644 index 0000000..042eb3c --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.DatagramEventConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface DatagramEventConfigMapper extends BaseMapper { +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java new file mode 100644 index 0000000..fc95cf4 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java @@ -0,0 +1,8 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.FieldConfig; + +public interface FieldConfigMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldRuleConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldRuleConfigMapper.java new file mode 100644 index 0000000..b310a08 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldRuleConfigMapper.java @@ -0,0 +1,10 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.FieldRuleConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface FieldRuleConfigMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java new file mode 100644 index 0000000..9060a69 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.ProtocolConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface ProtocolConfigMapper extends BaseMapper { +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolFieldConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolFieldConfigMapper.java new file mode 100644 index 0000000..1b47180 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolFieldConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +public interface ProtocolFieldConfigMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java new file mode 100644 index 0000000..6fa6936 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.RuleConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface RuleConfigMapper extends BaseMapper { +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/AbstractFieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/AbstractFieldConfig.java new file mode 100644 index 0000000..ba9aea2 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/AbstractFieldConfig.java @@ -0,0 +1,38 @@ +package com.casic.missiles.pojo; + +import lombok.Data; + +@Data +public class AbstractFieldConfig { + /** + * 字段名称 + */ + private String fieldName; + /** + * 按照字段评估进行字段解析 + */ + private String ruleJson; + /** + * 起始位置(单位byte) + */ + private Integer OriginPositionByte; + /** + * 起始位置,是否需要bit位置(单位bit)小于8, 没有不需要填写 + */ + private String OriginPositionBit; + /** + * 偏移长度 + */ + private Integer offsetLength; + /** + * 偏移单位(bit/byte) + */ + private String offsetUnit; + /** + * 是否需要转存 + */ + private Integer isStorage; + + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/CombinedFieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/CombinedFieldConfig.java new file mode 100644 index 0000000..4f4de6a --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/CombinedFieldConfig.java @@ -0,0 +1,41 @@ +package com.casic.missiles.pojo; + +import lombok.Data; + +import java.util.Date; + +/** + * 组合配置 + * + * @author cz + * @date 20 + */ +@Data +public class CombinedFieldConfig { + + private Long id; + private Long ruleId; + /** + * 前缀编码 + */ + private String prefixCode; + + /** + * 字段动态的id + */ + private Long dynamicLengthId; + /** + * 对应的要解析字段的ids + */ + private String dataFieldIds; + + /** + * 字段动态的id + */ + private String combinedFieldIds; + + private Date lastTime; + + private Date createTime; + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldConfig.java index a07d20d..8304dc6 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldConfig.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldConfig.java @@ -5,31 +5,28 @@ import java.util.Date; +/** + * @author cz + * 1、该表与实际解析的内容实例解析有关 + * 2、该表字段是随机出现的,和帧结构无关,无法预料的 + * 3、该表字段解析根据FieldEvaluatorConfig进行字段解析 + */ @Data -@TableName("field_config") -public class FieldConfig { +@TableName("business_field_config") +public class FieldConfig extends AbstractFieldConfig { private Long id; -// private String preFieldConfig; - private Long protocolId; - - private String isFixed; - private String uploadDeliveryChange; - - private String replyRule; - private String ruleJson; - + /** + * 协议配置id + */ + private Long ruleId; + /** + * 字段名称 + */ private String fieldName; - private String isStorage; - private Integer orignPosition; - private String exactOrignPosition; - - private Integer offsetLength; - private String offsetUnit; private String ownerId; private Date createTime; private Date lastTime; - } diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldRuleConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldRuleConfig.java new file mode 100644 index 0000000..2e09879 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldRuleConfig.java @@ -0,0 +1,20 @@ +package com.casic.missiles.pojo; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +@TableName("field_rule_config") +@Data +public class FieldRuleConfig { + + private Long id; + private String name; + private String desc; + private String condition; + private String excuteOperation; + private Date lasTime; + private Date createTime; + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/Msg.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/Msg.java deleted file mode 100644 index 81a5324..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/Msg.java +++ /dev/null @@ -1,86 +0,0 @@ -package com.casic.missiles.pojo; - -import lombok.Data; - -/** - * 协议 - */ -@Data -public class Msg { - - /** - * 前导码 - */ - private String preamble; - - /** - * 版本号 - */ - private String version; - - /** - * 内容长度 - */ - private int leng; - - /** - * 设备ID - */ - private String deviceId; - - /** - * 通讯方式 - */ - private Integer connType; - - /** - * 加密方式 - */ - private Integer encryType; - - /** - * 目标地址 - */ - private String destAddr; - - /** - * PDUType - */ - private String PDUType; - - /** - * 操作类型 - */ - private Integer operateType; - - /** - * 传输控制位 PDUType.bit7=0时,表示存在后续的访问;当PDUType.bit7=1时,表示无后续的访问。 - */ - private Integer transControlFlag; - - /** - * 设备类型 - */ - private Integer deviceType; - - /** - * 序号 - */ - private Integer seq; - - /** - * tagList - */ - private String tagList; - - /** - * OidList - */ - private String OidList; - - /** - * CRC - */ - private String CRC; - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/PreRuleConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/PreRuleConfig.java deleted file mode 100644 index bfcf914..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/PreRuleConfig.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.casic.missiles.pojo; - -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -import java.util.Date; - -@Data -@TableName("pre_rule_config") -public class PreRuleConfig { - - private Long id; - private String protocolId; - private String ruleFieldId; - private String ownerId; - private Date createTime; - private Date lastTime; -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolConfig.java index 274ad42..bdac11f 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolConfig.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolConfig.java @@ -5,18 +5,52 @@ import java.util.Date; +/** + * 协议配置表,协议配置与帧结构有关 + * 1、层级关系,协议之后是规则,规则对应设备类型的各种上数规则 + * 2、规则对应协议配置的实例流程 + * 3、每种可根据设备类型和操作类型进行上数规则进行区分 + */ @Data @TableName("protocol_config") public class ProtocolConfig { private Long id; + /** + * 前导码 + */ private String preFix; - private String unpackId; - private String totalLengthId; - private String totalLengthFilterField; + /** + * 拆包id + */ + private Long unpackId; + /** + * 总长度id + */ + private Long totalLengthId; + /** + * + */ + private String totalLengthFilterFields; + /** + * 动态长度ids + */ private String dynamicLengthId; + /** + * 动态长度json(预留字段) + */ private String dynamicLengthJson; - private String tailStr; + /** + * 规则字段所解析预准备的字段 + */ + private String rulePrepareFields; + /** + * 结尾标志 + */ + private Long tailStr; + /** + * 备注 + */ private String remark; private String ownerId; private Date createTime; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java index 608af3a..32cc8a4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java @@ -2,48 +2,47 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.delivery.decorator.ByteDecorator; +import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @AllArgsConstructor public class FieldDecoratorManger { - private final RuleDictDao ruleDictDao; + private final RuleConfigRegistry ruleDictDao; // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 // (1)静态的业务字段是字典里面可以配置的 // (2)动态的业务字段是通过规则生成的 public String contentMerge(String ruleJson, String sceneConent, String dynamicContent) { - List ruleDictList = ruleDictDao.getRuleDictConfig(); - Map ruleDictMap = ruleDictList.stream().collect( - Collectors.toMap(RuleDict::getId, e -> e)); - List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); - for (Map ruleMap : ruleMapList) { - String ruleType = String.valueOf(ruleMap.get("ruleType")); - ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); - NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); - byteDecorator.nodeDecoratorRule(nodeDecoratorParm); - } +// List ruleDictList = ruleDictDao.getRuleDictConfig(); +// Map ruleDictMap = ruleDictList.stream().collect( +// Collectors.toMap(RuleDict::getId, e -> e)); +// List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); +// for (Map ruleMap : ruleMapList) { +// String ruleType = String.valueOf(ruleMap.get("ruleType")); +// ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); +// NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); +// byteDecorator.nodeDecoratorRule(nodeDecoratorParm); +// } return null; } - - private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { - NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() - .contents(sceneConent) - .dynamicContent(dynamicContent) - .ruletypeId(ruletypeId) - .ruleDictMap(ruleDictMap) - .build(); - return nodeDecoratorParm; - } +// +// private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { +// NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() +// .contents(sceneConent) +// .dynamicContent(dynamicContent) +// .ruletypeId(ruletypeId) +// .ruleDictMap(ruleDictMap) +// .build(); +// return nodeDecoratorParm; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java index 652970c..b204ac3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java @@ -1,56 +1,56 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@AllArgsConstructor -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", - JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Component; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Component("logicalDecorator") +//@AllArgsConstructor +//@Slf4j +//public class LogicalShiftDecorator implements ByteDecorator { +// +//// private final FieldRuleEngineMapper fieldRuleEngineMapper; +//// +//// //字节位移 +//// @Override +//// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +//// String logicalValue = ""; +//// RuleEvaluator fieldRuleEngine = new RuleEvaluator(); +//// try { +//// Map env2 = new HashMap(); +//// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +//// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +//// for (String contentId : contentIdList) { +//// RuleDict ruleDict = ruleDictMap.get(contentId); +//// if (ruleDict.getCode().contains("#")) { +//// //使用动态的值 +//// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +//// } +//// env2.put(ruleDict.getName(), ruleDict.getCode()); +//// } +//// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +//// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +//// return null; +//// } +//// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +//// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +//// return values; +//// } catch (Exception ex) { +//// log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", +//// JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +//// return null; +//// } +//// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java index 346468f..822fead 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@AllArgsConstructor -@Slf4j -public class OperationDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("optionDecorator") +//@AllArgsConstructor +//@Slf4j +//public class OperationDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //混合运算,有常量或者乘除的缩放 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java index 50fb0a7..7a8bccb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@AllArgsConstructor -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +////精度计算 +//@AllArgsConstructor +//@Registry("precisionDecorator") +//@Slf4j +//public class PrecisionDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java index da39235..27f9cc7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java @@ -1,54 +1,53 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@AllArgsConstructor -@Slf4j -public class RuleDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("ruleDecorator") +//@AllArgsConstructor +//@Slf4j +//public class RuleDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //吃我一套正则表达式 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (Exception ex) { +// log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java index 7f5cbf3..c043f97 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java @@ -2,6 +2,6 @@ import java.util.Map; -public interface ComandeEventService { +public interface ComandeEventService{ Map loadComandeEventConfig(String protocolId,String scene); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java index 476ad84..aaf1837 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java @@ -2,46 +2,46 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.dao.CommandEventDao; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @Slf4j @AllArgsConstructor -public class ComandeEventServiceImpl implements ComandeEventService { +public class ComandeEventServiceImpl implements ComandeEventRegistry { - private final CommandEventDao commandEventDao; + // private final CommandEventDao commandEventDao; // 加密bean 固定字段出现变化的字段解析,业务字段的有序内容 @Override - public Map loadComandeEventConfig(String protocolId,String sceneName) { - CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); - if (ObjectUtil.isEmpty(commandEventConfig)) { - log.error("协议{},没有配置成功接收回复配置,清排查原因"); - return null; - } - String replyJson = commandEventConfig.getReplyContentJson(); - List> replyMapList = JSONArray.parseObject(replyJson, List.class); - List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); - Map fixMap = fixList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); - List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) - .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) - .collect(Collectors.toList()); - Map commandConfigMap = new HashMap<>(); - commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); - commandConfigMap.put("fixContent", fixMap); - commandConfigMap.put("bizContent", contentList); - return commandConfigMap; + public Map loadComandeEventConfig(String protocolId, String sceneName) { +// CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); +// if (ObjectUtil.isEmpty(commandEventConfig)) { +// log.error("协议{},没有配置成功接收回复配置,清排查原因"); +// return null; +// } +// String replyJson = commandEventConfig.getReplyContentJson(); +// List> replyMapList = JSONArray.parseObject(replyJson, List.class); +// List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); +// Map fixMap = fixList.stream() +// .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); +// List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) +// .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) +// .collect(Collectors.toList()); +// Map commandConfigMap = new HashMap<>(); +// commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); +// commandConfigMap.put("fixContent", fixMap); +// commandConfigMap.put("bizContent", contentList); +// return commandConfigMap; + return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 128b09d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java deleted file mode 100644 index 4016b0b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface DatagramEventMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java deleted file mode 100644 index 597c306..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.apache.ibatis.annotations.Mapper; - -public interface FieldConfigMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java deleted file mode 100644 index a31680a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.PreRuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface PreRuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java deleted file mode 100644 index 9060a69..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface ProtocolConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java deleted file mode 100644 index 6fa6936..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java deleted file mode 100644 index 582a705..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleDict; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleDictMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java deleted file mode 100644 index 6e302c8..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.CommandEventMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Optional; - -@Component -public class CommandEventDao { - - @Resource - private CommandEventMapper commandEventMapper; - - public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId) - .eq("scene", sceneName) - .eq("enabled", 1); - List commandEventConfig = commandEventMapper.selectList(queryWrapper); - Optional optionalEventConfig = commandEventConfig.stream().findFirst(); - return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java deleted file mode 100644 index 9137e4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.FieldConfigMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class FieldConfigDao { - - @Resource - private FieldConfigMapper fieldConfigMapper; - - public FieldConfig getFieldConfigById(String fieldId) { - FieldConfig fieldConfig = fieldConfigMapper.selectById(fieldId); - return fieldConfig; - } - - public List getFieldConfigs(String protocolId,Integer isFixed) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",isFixed); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - - public List getStorageFieldConfig(String protocolId) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",1) - .eq("is_storage",1); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java deleted file mode 100644 index 67bff6b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.mapper.PreRuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class PreRuleConfigDao { - - @Resource - private PreRuleConfigMapper preRuleConfigMapper; - - public List getPreRuleList(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return preRuleConfigMapper.selectList(queryWrapper); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java deleted file mode 100644 index d69ea85..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.RuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleConfigDao { - - @Resource - private RuleConfigMapper ruleConfigMapper; - - public RuleConfig getNextRuleConfig(String ruleFields) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("parse_rule_json", ruleFields); - return ruleConfigMapper.selectOne(queryWrapper); - } - - - public List getRuleConfigById(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return ruleConfigMapper.selectList(queryWrapper); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java deleted file mode 100644 index 932c185..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.RuleDictMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleDictDao { - - @Resource - private RuleDictMapper ruleDictMapper; - - public List getRuleDictConfig() { - List ruleDictList = ruleDictMapper.selectList(null); - return ruleDictList; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java index 9f9e279..43bc4d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java @@ -10,20 +10,15 @@ import io.netty.channel.socket.nio.NioServerSocketChannel; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import javax.annotation.PreDestroy; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static cn.hutool.core.util.ClassUtil.getClasses; /** * SensorhubServer netty服务端 */ @Slf4j -@Service +@Component public class SensorhubServer { /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java index 2c79ff5..9a28c36 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java @@ -11,13 +11,13 @@ import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioSocketChannel; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClient 客户端 */ @Slf4j -@Service +@Registry public final class SensorhubClient { public static void main(String[] args) throws Exception { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java index 9774be0..477c3f7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java @@ -6,12 +6,12 @@ import io.netty.channel.socket.SocketChannel; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientChannelInitialHandler */ -@Service +@Registry public class SensorhubClientChannelInitialHandler extends ChannelInitializer { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java index 346f4b3..73560e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java @@ -5,13 +5,13 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientHandler */ @Slf4j -@Service +@Registry public class SensorhubClientHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java index 5c1c6f2..d990af5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java @@ -4,12 +4,12 @@ import com.casic.missiles.pojo.Msg; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** * SensorhubServerHandler */ -@Service +@Component public class SensorhubServerHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 67283ae..af3172c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,41 +1,37 @@ package com.casic.missiles.parser; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultProtocolConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.*; +import com.casic.missiles.registry.FieldConfigRegistry; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; -import java.nio.charset.Charset; import java.util.HashMap; import java.util.List; import java.util.Map; -@Service("genericProtocolParser") +/** + * @author + */ +@Component("genericProtocolParser") @Slf4j -@AllArgsConstructor +@RequiredArgsConstructor public class GenericProtocolParser implements ProtocolParser { - private final LeadingCodeMatcher leadingCodeMatcher; private final List frameStructDispenserList; - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorInstanceSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; // 匹配首字母前导码=> 帧结构匹配前导码=> // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 @@ -44,18 +40,19 @@ public Boolean doParseProtocol(ByteBuf byteBuf) { String protocolContent = ByteBufUtil.hexDump(byteBuf); //匹配前导码 - List preCodeConfigs = leadingCodeMatcher.matchLeadingCode(protocolContent); + List preCodeConfigs = LeadingCodeMatcher.matchFrameLeadingCode(protocolContent); //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 if (preCodeConfigs.size() == 0) { - return rematch(byteBuf,protocolContent); + return rematch(byteBuf, protocolContent); } - //暂时先取第一个 + //暂时先取第一个,提升速度,使用享元模式, 减少类的创建销毁与构建 ProtocolConfig protocolConfig = preCodeConfigs.get(0); + AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); ByteBuf wholeDatagramByte = null; //通过匹配帧结构获取完整的数据包 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, preCodeConfigs.get(0))) != null) { + if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, protocolFactory)) != null) { break; } } @@ -68,76 +65,78 @@ * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 */ - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId, wholeDatagramByte); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap, protocolId); - //选取规则对应的流程实例 - DatagramEventConfig datagramEventConfig = processorInstanceSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); + //进行规则字段解析,进行匹配规则 + RuleConfig ruleConfig = getRuleConfig(protocolFactory, wholeDatagramByte); + if (ruleConfig == null) { + return false; + } //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, wholeDatagramByte); + ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte); + //以下进行业务的规则解析,同时选定流程实例 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); + DatagramEventProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain, + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText, protocolId); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain); //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); + datagramEventProvider.storeData(bizDataMap); return true; } - private Boolean rematch(ByteBuf byteBuf,String protocolContent) { + /** + * 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 + */ + private Boolean rematch(ByteBuf byteBuf, String protocolContent) { //重置位判断 byteBuf.resetReaderIndex(); //判断重置是否前移,如果没有前移,则直接判为匹配失败 if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { return false; } else { + //递归执行 return doParseProtocol(byteBuf); } } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; + //获取匹配规则->匹配规则 + private RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + //取出其中参与逻辑provider并判空 + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); + String rulePrepareFields = protocolConfig.getRulePrepareFields(); + //固定字段 + if (StringUtils.isNotEmpty(rulePrepareFields)) { + //获取统一固定字段解析 + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + //获取该协议的字段配置,用于协议规则匹配 + List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); + //获取规则 + RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, + rulePrepareFields, protocolFieldConfigs); + return ruleConfig; + } + return null; } - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + //数据构建,获取固定字段的store和业务字段store + private Map buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + Map bizDataMap = new HashMap<>(); + Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); + Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); + bizDataMap.putAll(ruleStoreObjectMap); + bizDataMap.putAll(protocolStoreObjectMap); return bizDataMap; } - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java index 8a46e32..16ce2e5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java @@ -3,6 +3,7 @@ import io.netty.buffer.ByteBuf; public interface ProtocolParser { + Boolean doParseProtocol(ByteBuf byteBuf); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java new file mode 100644 index 0000000..f7814af --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java @@ -0,0 +1,35 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.ProtocolConfigProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.ProtocolConfig; + +/** + * 存放基本协议的的加载信息 + */ +public class AbstractProtocolConfigFactory { + private final ProtocolConfigProvider protocolConfigProvider; + private final ProtocolFieldConfigProvider protocolFieldConfigProvider; + private final RuleConfigProvider ruleConfigProvider; + + public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { + this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); + this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); + this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); + } + + public ProtocolConfigProvider getProtocolConfigProvider() { + return protocolConfigProvider; + } + + public ProtocolFieldConfigProvider getProtocolFieldConfigProvider() { + return protocolFieldConfigProvider; + } + + public RuleConfigProvider getRuleConfigProvider() { + return ruleConfigProvider; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java new file mode 100644 index 0000000..6e36147 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java @@ -0,0 +1,57 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.CombinedFieldConfigProvider; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.FieldConfigProvider; +import com.casic.missiles.parser.provider.FieldRuleConfigProvider; + +/** + * 存放规则相关的的的加载信息 + */ +public class AbstractRuleConfigFactory { + + /** + * 处理字节 + */ + private final FieldConfigProvider fieldConfigProvider; + /** + * 处理组合字节解析的解码器 + */ + private final CombinedFieldConfigProvider combinedFieldConfigProvider; + /** + * 处理负责字节解析的规则配置 + */ + private final FieldRuleConfigProvider fieldRuleConfigProvider; + /** + * 处理实例流程 + */ + private final DatagramEventProvider datagramEventProvider; + + + public AbstractRuleConfigFactory(Long ruleId) { + this.fieldConfigProvider = new FieldConfigProvider(ruleId); + this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); + this.fieldRuleConfigProvider = new FieldRuleConfigProvider(ruleId); + this.datagramEventProvider = new DatagramEventProvider(ruleId); + } + + public FieldConfigProvider getFieldConfigProvider() { + return fieldConfigProvider; + } + + public CombinedFieldConfigProvider getCombinedFieldConfigProvider() { + return combinedFieldConfigProvider; + } + + public FieldRuleConfigProvider getFieldRuleConfigProvider() { + return fieldRuleConfigProvider; + } + + public DatagramEventProvider getDatagramEventProvider() { + return datagramEventProvider; + } + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java deleted file mode 100644 index 6e1719a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.factory; - - -import com.casic.missiles.pojo.ProtocolConfig; - -import java.util.List; - -/** - * 数据库访问优化(暂时未做) - *

- * 1、初始化协议解析配置,并存放到处存放缓存,对协议基本配置进行管理 - * 2、其中流程中所有的配置都经过此类进行管理,进行调用获取,增强解析速度 - */ -public interface DatagramFactory { - - /** - * 初始化 - */ - List datagramInit(); - - /** - * 根据前导码配置匹配,模糊匹配获取所有的报文项 - */ - List match(); - - /** - * 根据前导码匹配,返回报文项 - */ - List filer(); - - /** - * 保证数据的唯一性选择器 - */ - List selectOne(); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java new file mode 100644 index 0000000..87444a0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java @@ -0,0 +1,18 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +import java.util.List; + +/** + * 直接用,还是边用边创建 + */ +public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { + + + public DefaultProtocolConfigFactory(ProtocolConfig protocolConfig) { + super(protocolConfig); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java new file mode 100644 index 0000000..cce0c7c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java @@ -0,0 +1,12 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; + +public class DefaultRuleFactory extends AbstractRuleConfigFactory { + + public DefaultRuleFactory(Long ruleId) { + super(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java deleted file mode 100644 index 9ee97e0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.casic.missiles.parser.instance; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service -@Slf4j -@AllArgsConstructor -public class GeneralProcessor { - - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; - - /** - * 统一固定字段解析=>进行规则的查询的判断 - * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 - * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 - */ - @Deprecated - public boolean parseWholeDatagram(ByteBuf buffer, ProtocolConfig protocolConfig) { - try { - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap,protocolId); - //选取规则对应的流程= - DatagramEventConfig datagramEventConfig = processorSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); - //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); - //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); - //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); - //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); - //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); - return true; - } catch (Exception ex) { - log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", - ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); - return false; - } - } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; - } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); - } - - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); - return bizDataMap; - } - - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java index 25e7ad8..6a5777e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java @@ -1,23 +1,31 @@ package com.casic.missiles.parser.instance.impl; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.mapper.DatagramEventMapper; import com.casic.missiles.pojo.DatagramEventConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.SpringContextUtil; -@Service -@AllArgsConstructor +import java.util.List; +import java.util.Optional; + +/** + * @author cz + * + */ public class DefaultProcessorInstanceSelector implements ProcessorInstanceSelector { - private final DatagramEventMapper datagramEventMapper; + private static List datagramEventConfigs; + + static { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + datagramEventConfigs = datagramEventRegistry.getDatagramEventList(); + } @Override public DatagramEventConfig getProcessorInstance(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("rule_id", protocolId); - return datagramEventMapper.selectOne(queryWrapper); + Optional optionalSelectInstance = datagramEventConfigs.stream() + .filter(e -> e.getId().equals(protocolId)).limit(1).findFirst(); + return optionalSelectInstance.isPresent() ? optionalSelectInstance.get() : null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a778671..7b56a43 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,16 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import io.netty.buffer.ByteBuf; /** - * 分析匹配情况 - * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 - * 2、匹配不成功,有后续帧,可以进行下次匹配。 - * 3、匹配不成功,无后续帧,可以进行丢弃。 + * 分析匹配情况 + * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 + * 2、匹配不成功,有后续帧,可以进行下次匹配。 + * 3、匹配不成功,无后续帧,可以进行丢弃。 */ -public interface FrameStructMatcher{ +public interface FrameStructMatcher { - ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig); + ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 05320ab..8ebea78 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,23 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.ProtocolConfigMapper; +import com.casic.missiles.parser.provider.ProtocolConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Component; import java.util.List; import java.util.stream.Collectors; -@Component -@AllArgsConstructor public class LeadingCodeMatcher { - private final ProtocolConfigMapper protocolMapper; - //** 1、首字母匹配前导码, // 2、以匹配出的前导码是否在报文中条件进行前导码的匹配二次筛选 - public List matchLeadingCode(String protocolContent){ + public static List matchFrameLeadingCode(String protocolContent){ List initialConfigs = initialMatch(protocolContent); List preCodeConfigs = initialConfigs.stream() .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) @@ -26,13 +19,16 @@ } //初始化匹配前导码内容 - private List initialMatch(String protocolContent) { - String protocolStr = protocolContent.charAt(0) + ""; - QueryWrapper queryWrapper = new QueryWrapper() - .likeRight("pre_fix", protocolStr); - List protocolConfigList = protocolMapper.selectList(queryWrapper); - return protocolConfigList; + private static List initialMatch(String protocolContent) { + String firstFrameChar = protocolContent.charAt(0) + ""; + ProtocolConfigProvider protocolConfigProvider=new ProtocolConfigProvider(firstFrameChar); + return protocolConfigProvider.getMatchList(); } + + + + + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index cf2113d..e915877 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -1,32 +1,35 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(0) -@Service +@Component public class FrameLengthMatcher implements FrameStructMatcher { - @Autowired - private FieldParser fieldParser; - //超过长度 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { String dataGramContent = ByteBufUtil.hexDump(byteBuf); - if (StringUtils.isEmpty(protocolConfig.getUnpackId()) && StringUtils.isEmpty(protocolConfig.getTailStr())) { - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + //当不存在结尾标志和拆包标志,可以直接使用长度进行匹配 + if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { if (dataGramContent.length() >= totalLength) {//等于长度返回true,超出长度,切断 - ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, protocolConfig, totalLength); + ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, totalLength); return wholeDatagramByte; } else { //读的标志位前移舍弃 @@ -38,7 +41,7 @@ return null; } - private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, Integer totalLength) { byteBuf.readBytes(totalLength); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, totalLength - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 2bfc213..d527ad0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; @@ -13,7 +13,7 @@ import lombok.AllArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.nio.charset.Charset; import java.util.Map; @@ -22,32 +22,30 @@ * 后续标志验证 */ @Order(1) -@Service +@Component @AllArgsConstructor -public class FrameMarkMatcher implements FrameStructMatcher { - - private final FieldConfigDao fieldConfigDao; - private final FieldParser fieldParser; - private final FieldResolver fieldResolverManger; +public class FrameMarkMatcher implements FrameStructMatcher, FixedPropertyEnum { //帧后续标志=>结束,进行帧的重组=>有后续,1、帧移位判别 2、继续接收帧 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig UnpackConfig = StringUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getUnpackId()); - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); - Integer upback = 0; + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); ByteBuf mergeWholeFrameByte = null; - if (!ObjectUtil.isEmpty(UnpackConfig)) { - while (hasNextFullFrame(byteBuf, protocolConfig)) { - upback = (Integer) fieldResolverManger.filedParserManger(byteBuf, UnpackConfig, null); + if (!ObjectUtil.isEmpty(unpackFlag)) { + while (hasNextFullFrame(byteBuf, protocolConfig, protocolFieldConfigProvider)) { //是否存在后续位 - if (upback == 1) {//使用esayRule + if (unpackFlag == 1) {//使用esayRule //表示可以截取 - mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolConfig, totalLength); + mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolFieldConfigProvider, protocolConfig); return mergeWholeFrameByte; } else { - byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig)); + byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig, protocolFieldConfigProvider)); } } } @@ -56,7 +54,8 @@ //选取第一个帧,将业务内容和后面部分分开 //计算数据报文-业务内容 - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolFieldConfigProvider protocolFieldConfigProvider, ProtocolConfig protocolConfig) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); //截取完整报文 byteBuf.readBytes(totalLength); ByteBuf byteBufContent = byteBuf.slice(0, byteBuf.readerIndex()); @@ -68,15 +67,15 @@ String tail = ""; System.out.println(ByteBufUtil.hexDump(byteBufContent)); //会存在多个帧拼接在一起的的情况,进行合并处理 - while (hasNextFullFrame(byteBufContent, protocolConfig)) { - Integer currentFrameLength = fieldParser.getTotalLength(protocolConfig, byteBufContent); + while (hasNextFullFrame(byteBufContent, protocolConfig, protocolFieldConfigProvider)) { + Integer currentFrameLength = protocolFieldConfigProvider.getTotalLength(byteBufContent, protocolConfig); byteBufContent.readBytes(currentFrameLength); ByteBuf currentbyteBuf = byteBufContent.slice(0, byteBufContent.readerIndex()); byteBufContent.markReaderIndex();//读的标志位前移 System.out.println(ByteBufUtil.hexDump(byteBufContent)); String hexDump = currentbyteBuf.toString(Charset.forName("ISO-8859-1")); //获取当前固定帧结构的关系map - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, currentbyteBuf); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(currentbyteBuf, protocolConfig); if (StringUtils.isEmpty(mergeFrameStr)) { //首次获取业务数据报文 mergeFrameStr += hexDump.substring(0, currentFrameFixedProperty.get("tailPosition")); @@ -95,22 +94,22 @@ /** * 获取平移到下一帧起始位置 */ - public int getNextFrameOffset(ByteBuf buffer, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, buffer); - return currentFrameFixedProperty.get("totalLength"); + public int getNextFrameOffset(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + return currentFrameFixedProperty.get(TOTAL_LENGTH); } /** * 判断是否出错进行整个帧的 */ - public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, byteBuf); + public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); //保证读取位置不在固定位置,是可变的业务内容 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("fixedPosition")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(FIXED_POSITION)) { return false; } //判断读取是否操作帧长度 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("totalLength")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(TOTAL_LENGTH)) { return false; } return true; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 76a3784..c3a1bab 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -1,50 +1,50 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.parser.instance.GeneralProcessor; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; +import io.netty.buffer.ByteBufUtil;; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(2) -@Service +@Component public class FrameTailMatcher implements FrameStructMatcher { - @Resource - private FieldConfigDao fieldConfigDao; - @Autowired - private GeneralProcessor generalProcessor; - //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig tailFieldConfig = StringUtils.isEmpty(protocolConfig.getTailStr()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getTailStr()); - if (!ObjectUtil.isEmpty(tailFieldConfig)) { - String tailStr = tailFieldConfig.getFieldName(); + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfig protocolFieldConfig = ObjectUtils.isEmpty(protocolConfig.getTailStr()) ? null : + fieldConfigProvider.getFieldConfigById(protocolConfig.getTailStr()); + if (!ObjectUtil.isEmpty(protocolFieldConfig)) { + String tailStr = protocolFieldConfig.getFieldName(); String dataGramContent = ByteBufUtil.hexDump(byteBuf); Boolean tailFlag = ByteBufUtil.hexDump(byteBuf).contains(tailStr); if (!tailFlag) { //使用esayRule return null; } else if (dataGramContent.indexOf(tailStr) < dataGramContent.length() - tailStr.length()) { Integer length = dataGramContent.indexOf(tailStr) + tailStr.length(); - ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, protocolConfig, length); + ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, length); return wholeDatagramByte; //存在粘包 } } return null; } - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer length) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, Integer length) { byteBuf.readBytes(length); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, length - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java new file mode 100644 index 0000000..5f1c177 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java @@ -0,0 +1,73 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.combined.GenericCombinedFieldResolver; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.CombinedFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class CombinedFieldConfigProvider { + + + /** + * 作为临时配置列表缓存使用 + */ + private final List combinedFieldConfigList; + private Map storeObjectMap = new HashMap<>(); + + public CombinedFieldConfigProvider(Long ruleId) { + CombinedFieldConfigRegistry combinedFieldConfigRegistry = SpringContextUtil.getBean(CombinedFieldConfigRegistry.class); + combinedFieldConfigList = combinedFieldConfigRegistry.getCombinedFieldConfigList(ruleId); + } + + public void parseDataField(RuleConfig ruleConfig, String clearZeroPlain,Map fieldConfigsMap ) { + if (showSkip()) { + return; + } + //匹配对应的数据,然后进行相关的字段解析 + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver(); + combinedFieldResolver.parseDataField(combinedFieldConfigList, byteBuf, storeObjectMap,fieldConfigsMap); + } + + + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getCombinedFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return combinedFieldConfigList.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public List getCombinedFieldConfigList() { + return combinedFieldConfigList; + } + + /* 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(combinedFieldConfigList) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java new file mode 100644 index 0000000..f3cfedc --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java @@ -0,0 +1,11 @@ +package com.casic.missiles.parser.provider; + +/** + * @author cz + * @date 2023-6-12 + */ +public class CommandEventProvider{ + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java new file mode 100644 index 0000000..70eec5e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java @@ -0,0 +1,77 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.safe.SafeStrategy; +import com.casic.missiles.parser.sender.DataSubscribeProvider; +import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class DatagramEventProvider { + + private final DatagramEventConfig processorInstance; + + public DatagramEventProvider(Long ruleId) { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + List datagramEventConfigList = + datagramEventRegistry.getDatagramEventList(ruleId); + processorInstance = this.getProcessorInstance(datagramEventConfigList); + } + + public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { + if (showSkip()) { + return null; + } + return datagramEventConfigList.get(0); + } + + // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 + public String getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap) { + String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? + processorInstance.getSafeBean() : + fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); + if (!StringUtils.isEmpty(safeName)) { + //需要加密 + SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); + String plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); + return clearComplementZero(plain); + } + return ByteBufUtil.hexDump(bizDataContent); + } + + //解密清零操作 + private String clearComplementZero(String plain) { + plain = plain.substring(0, plain.lastIndexOf("00")); + return plain; + } + + //数据发送,数据发送者暂未构建 + public void storeData(Map bizDataMap) { + DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); +// dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return ObjectUtils.isNotEmpty(processorInstance) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java new file mode 100644 index 0000000..7e1fe0a --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java @@ -0,0 +1,97 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.FieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class FieldConfigProvider { + + + private final List fieldConfigs; + private Map storeObjectMap = new HashMap<>(); +// private Map singleObjects = new ConcurrentHashMap<>(); + + public FieldConfigProvider(Long ruleId) { + FieldConfigRegistry fieldConfigRegistry = SpringContextUtil.getBean(FieldConfigRegistry.class); + fieldConfigs = fieldConfigRegistry.getFieldConfigList(ruleId); + } + + public List getFieldConfigs() { + return fieldConfigs; + } + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public Map parseDataField(RuleConfig ruleConfig, String clearZeroPlain) { + if (showSkip()) { + return null; + } + List prepareFieldConfig = prepareParseField(ruleConfig); + if (CollectionUtils.isNotEmpty(prepareFieldConfig)) { + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(fieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + return fixDataMap; + } + } + return null; + } + + /** + * 得到需要处理的业务内容 + * + * @return + */ + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return fieldConfigs.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public Map getFieldConfigsMap() { + return fieldConfigs.stream().collect( + Collectors.toMap(FieldConfig::getId, e -> e) + ); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(fieldConfigs) ? false : true; + } + + +} + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java new file mode 100644 index 0000000..817bfaf --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java @@ -0,0 +1,19 @@ +package com.casic.missiles.parser.provider; + +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.registry.FieldRuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; + +public class FieldRuleConfigProvider { + + private final List fieldRuleConfigList; + + public FieldRuleConfigProvider(Long ruleId) { + FieldRuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(FieldRuleConfigRegistry.class); + fieldRuleConfigList = ruleConfigRegistry.getFieldRuleConfigList(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java new file mode 100644 index 0000000..99a1b06 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java @@ -0,0 +1,53 @@ +package com.casic.missiles.parser.provider; + + +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.registry.ProtocolConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolConfigProvider { + + private final List protocolConfigList; + + public ProtocolConfigProvider(String firstChar) { + ProtocolConfigRegistry registry = SpringContextUtil.getBean(ProtocolConfigRegistry.class); + protocolConfigList = registry.getProtocolConfigList(firstChar); + } + + public List getMatchList() { + return protocolConfigList; + } + + /** + * 设置当前协议 + * + * @param protocolConfig + */ + public ProtocolConfigProvider(ProtocolConfig protocolConfig) { + List protocolConfigs = new ArrayList<>(); + protocolConfigs.add(protocolConfig); + protocolConfigList = protocolConfigs; + } + + /** + * 获取当前协议 + * + * @return + */ + public ProtocolConfig getCurrentProtocolConfig() { + if (this.protocolConfigList == null) { + return null; + } else { + return protocolConfigList.get(0); + } + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java new file mode 100644 index 0000000..043927d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java @@ -0,0 +1,213 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.registry.ProtocolFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolFieldConfigProvider { + + private static final String FIXED_FIELD_DS = "fixedFieldDs"; + private static final String CONTENT_FIELD_DS = "contentFieldDs"; + private static final String PROTOCOL_LENGTH = "protocolLength"; + private static final String PROTOCOL_FIELD_ID = "protocolFieldId"; + private static final String PROTOCOL_POSITION = "protocolPosition"; + + private final List protocolFieldConfigs; + private Map singleObjects = new ConcurrentHashMap<>(); + private Map storeObjectMap = new HashMap<>(); + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public ProtocolFieldConfigProvider(Long protocolId) { + ProtocolFieldConfigRegistry protocolFieldConfigRegistry = SpringContextUtil.getBean(ProtocolFieldConfigRegistry.class); + protocolFieldConfigs = protocolFieldConfigRegistry.getProtocolFieldConfigList(protocolId); + } + + public List getProtocolFieldConfigs() { + return protocolFieldConfigs; + } + + public ProtocolFieldConfig getFieldConfigById(Long fieldId) { + Optional optionalConfig = protocolFieldConfigs.stream().filter( + e -> e.getId().equals(fieldId) + ).findFirst(); + return optionalConfig.isPresent() ? optionalConfig.get() : null; + } + + public Integer getProtocolFieldValue(Long protocolFieldId, ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_FIELD_ID + protocolFieldId + ByteBufUtil.hexDump(byteBuf); + //获取缓存 + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + //加载固定长度数据集合 + Map fixDataMap = this.getProtocolDataMap(byteBuf); + ProtocolFieldConfig protocolFieldConfig = selectFieldConfig(protocolFieldId); + Integer protocolFieldValue = 0; + //获取约定字段的总长度 + if (fixDataMap.containsKey(protocolFieldConfig.getFieldName())) { + Object appointUnpackObject = fixDataMap.get(protocolFieldConfig.getFieldName()); + if (ObjectUtils.isNotEmpty(appointUnpackObject)) { + protocolFieldValue = (Integer) appointUnpackObject; + } + } + if (protocolFieldValue != null) { + //加入缓存 + if (ObjectUtils.isNotEmpty(protocolFieldValue)) { + this.singleObjects.put(catchKey, protocolFieldValue); + return protocolFieldValue; + } + } + return null; + } + + /** + * 获取帧固定位置信息 + * + * @param byteBuf + * @param protocolConfig + * @return + */ + public Map getFixedProperty(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_POSITION + protocolConfig.getId(); + if (this.singleObjects.containsKey(catchKey)) { + return (Map) singleObjects.get(catchKey); + } + Map fixedPropertyMap = new HashMap<>(); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + fixedPropertyMap = fieldParser.doGetFixedProperty(protocolFieldConfigs, this.getTotalLength(byteBuf,protocolConfig)); + if (CollectionUtils.isNotEmpty(fixedPropertyMap)) { + this.singleObjects.put(catchKey, fixedPropertyMap); + return fixedPropertyMap; + } + return fixedPropertyMap; + } + + /** + * 获取帧结构应有的总长度 + */ + public Integer getTotalLength(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_LENGTH + ByteBufUtil.hexDump(byteBuf); + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + Integer appointFrameLength = getProtocolFieldValue(protocolConfig.getTotalLengthId(), byteBuf); + if (appointFrameLength != null) { + //获取过滤的字段集合总长度 + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Integer totalFilterLength = fieldParser.getTotalFilterLength(protocolConfig, byteBuf, getFixFieldConfigMap()); + //计算总长度 + Integer totalLength = appointFrameLength + totalFilterLength; + //加入缓存 + if (ObjectUtils.isNotEmpty(totalLength)) { + this.singleObjects.put(catchKey, totalLength); + return totalLength; + } + } + return null; + } + + /** + * 获取协议有关字段解析内容 + * storeObjectMap存储代转存的数据 + * + * @return + */ + public Map getProtocolDataMap(ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(FIXED_FIELD_DS)) { + return (Map) singleObjects.get(FIXED_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(protocolFieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + this.singleObjects.put(FIXED_FIELD_DS, fixDataMap); + return fixDataMap; + } + return null; + } + + /** + * 获取业务报文内容的content字节 + * + * @param wholeDatagramByte + * @return + */ + public ByteBuf getDataContentBuf(ByteBuf wholeDatagramByte) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(CONTENT_FIELD_DS)) { + return (ByteBuf) singleObjects.get(CONTENT_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + ByteBuf bizDataByteBuf = fieldParser.getDataContentBuf(protocolFieldConfigs, wholeDatagramByte); + if (bizDataByteBuf != null) { + this.singleObjects.put(CONTENT_FIELD_DS, bizDataByteBuf); + return bizDataByteBuf; + } + return null; + } + + + private ProtocolFieldConfig selectFieldConfig(Long id) { + Optional optionalProtocolFieldConfig = this.protocolFieldConfigs.stream().filter( + e -> e.getId().equals(id) + ).findFirst(); + return optionalProtocolFieldConfig.isPresent() ? optionalProtocolFieldConfig.get() : null; + } + + + private Map getFixFieldConfigMap() { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, e -> e) + ); + return fixDataFieldMap; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(protocolFieldConfigs) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java new file mode 100644 index 0000000..dafba1c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java @@ -0,0 +1,56 @@ +package com.casic.missiles.parser.provider; + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.rule.GenericRuleResolver; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.RuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleConfigProvider { + + private final List ruleConfigs; + + public List getRuleConfigs() { + return ruleConfigs; + } + + public RuleConfigProvider(Long protocolId) { + RuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(RuleConfigRegistry.class); + ruleConfigs = ruleConfigRegistry.getRuleConfigById(protocolId); + } + + /** + * 获取规则匹配结果 + * + * @param parseFixedDataMap + * @param protocolFieldConfigs + * @return + */ + public RuleConfig doGetRule(Map parseFixedDataMap, + String ids, + List protocolFieldConfigs) { + if (showSkip()) { + return null; + } + RuleConfig ruleConfig = GenericRuleResolver.machRule(parseFixedDataMap, ids, protocolFieldConfigs, ruleConfigs); + return ruleConfig; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(ruleConfigs) ? false : true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java index 3c05891..856b399 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java @@ -1,18 +1,11 @@ package com.casic.missiles.parser.resolver; -import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.springframework.web.bind.annotation.RequestBody; -import javax.annotation.Resource; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -20,19 +13,17 @@ @Slf4j public class ByteMergeProvider { - @Resource - private FieldRuleEngineMapper fieldRuleEngineMapper; - //拿到所有的值合并到一个值 - public String resolveByteMerge(List valueList, String ruletypeId, String vaildRange) { + public static String resolveByteMerge(List valueList, String ruleTypeId, String vaildRange) { String values = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Map vaildMap = getValidRangeMap(vaildRange); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(ruletypeId); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } + //暂时不处理 +// fieldRuleEngine = fieldRuleConfigMapper.selectById(ruleTypeId); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } Map env2 = new HashMap(); for (int i = 0; i < valueList.size(); i++) { if (vaildMap.containsKey(i)) { @@ -47,7 +38,7 @@ } } - private Map getValidRangeMap(String vaildRange) { + private static Map getValidRangeMap(String vaildRange) { String[] range = vaildRange.split(","); Map vaildMap = new HashMap(); for (int i = 0; i < range.length; i++) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 8d821cd..85d6bbf 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -1,9 +1,12 @@ package com.casic.missiles.parser.resolver; +import com.casic.missiles.pojo.AbstractFieldConfig; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; import io.netty.buffer.ByteBuf; +import java.util.List; import java.util.Map; /** @@ -11,18 +14,14 @@ */ public interface FieldParser { -// Map fieldProcess(String protocolContent,); - Map dataParser(RuleConfig ruleConfig, String lightText,String protocolId); + Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength); - Map fixDataParser(String protocolId, ByteBuf buffer); + Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap); - Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf); + ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer); - ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer); - - ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer); - - Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer); + Integer getTotalFilterLength(ProtocolConfig protocolConfig, ByteBuf byteBuf, Map protocolFieldConfigMap); } + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java new file mode 100644 index 0000000..9e0c00e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java @@ -0,0 +1,52 @@ +package com.casic.missiles.parser.resolver; + +import com.casic.missiles.pojo.AbstractFieldConfig; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.util.List; + +public class FieldParserSupport { + + //分别计算bit和byte长度=> 合并长度 + protected Integer calculateLength(List fieldConfigList) { + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + Integer fixedLength = bytefixedLength + bitfixedLength / 8; + return fixedLength; + } + + //找到最大值=> 根据最大值计算业务数据下标 + protected Integer calculatePosition(List fieldConfigList) { + String rex = "[0-9]+"; + Integer max = -1; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) + && Integer.valueOf(fieldConfig.getOriginPositionByte()) > max) { + max = Integer.valueOf(fieldConfig.getOriginPositionByte()); + } + } + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) && fieldConfig.getOriginPositionByte().equals(max)) { + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + } + } + Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; + return maxFixedPosition; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java deleted file mode 100644 index dd3a6cd..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java +++ /dev/null @@ -1,170 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.ByteResolverParam; -import io.netty.buffer.ByteBuf; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -/** - * 字段解析管理总类 - */ -@Service -@Slf4j -@AllArgsConstructor -public class FieldResolver extends ByteMergeProvider { - - //1、字段截取 => 2、简单的字节解析和复杂的字节解析 - public Object filedParserManger(ByteBuf byteBuf, FieldConfig fieldConfig, Integer maxFixedPosition) { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - //最大固定位置不为空, - if (!ObjectUtil.isEmpty(maxFixedPosition)) { - orignPosition -= maxFixedPosition; - } - Object fieldValue = 0; - //待优化 - if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { - fieldValue = bitToResolver(byteBuf, fieldConfig); - } else { - ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); - fieldValue = parsingFields(fieldBytes, fieldConfig.getRuleJson()); - } - return fieldValue; - } - - //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, - //目前默认配置的规则设置暂不支持配置化,由实现完成 - private Object parsingFields(ByteBuf byteBuf, String ruleJson) { - Object fieldsResolveValue = null; - List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); - if (ObjectUtil.isEmpty(ruleMapList)) { - fieldsResolveValue = defaultResolveBuilder(byteBuf); - } else { - fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); - } - return fieldsResolveValue; - } - - private Object defaultResolveBuilder(ByteBuf byteBuf) { - Integer defaultResolveValue = 0; - for (int i = 0; i < byteBuf.writerIndex(); i++) { - defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; - } - return defaultResolveValue; - } - - //字段解析构建器(针对字节单位的) - //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 - // 字节归并结束或者规则结束=>继续根据规则进行判断 - private Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { - Object customizeResolveValue = null; - try { - List bytStrList = new ArrayList<>(); - //存放到数组里面 - for (int i = 0; i < byteBuf.writerIndex(); i++) { - bytStrList.add(byteBuf.readByte()); - } - int i = 0; - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - customizeResolveValue = this.resolveByteMerge(bytStrList, ruletypeId,vaildRange); - break; - } else { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - List tempBytStr = new ArrayList<>(); - for (int k = 0; i < bytStrList.size(); i++) { - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(k) - .value(bytStrList.get(k)) - .ruletypeId(ruletypeId).build(); - tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); - } - bytStrList = tempBytStr; - } - i++; - } - //字节归并到一起=>继续根据规则进行判断 - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(customizeResolveValue) - .ruletypeId(ruletypeId).build(); - customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(customizeResolveValue)); - return customizeResolveValue; - } catch (RuntimeException ex) { - log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); - return null; - } - } - - /** - * 1、单个字节情况表示字段 - * 2、多字节情况表示字段(暂未处理) - */ - private Object bitToResolver(ByteBuf byteBuf, FieldConfig fieldConfig) { - Object fieldValue = new Object(); - try { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - byte fields = 0x00; - if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); - } else { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); - } - - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { - if (!StringUtils.isEmpty(fieldConfig.getExactOrignPosition())) { - fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getExactOrignPosition())).byteValue() - >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); - } else { - fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); - } - } else { - fieldValue = Integer.valueOf(fields & 0xff); - } - if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { - return fieldValue; - } - List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); - int i = 0; - //字节归并到一起=>继续根据规则进行判断 - while (i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(fieldValue) - .ruletypeId(ruletypeId).build(); - fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(fieldValue)); - return fieldValue; - } catch (RuntimeException ex) { - log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); - return null; - } - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java new file mode 100644 index 0000000..1d2aeab --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java @@ -0,0 +1,36 @@ +package com.casic.missiles.parser.resolver.bytes; + +import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.mapper.FieldRuleConfigMapper; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.pojo.ByteResolverParam; +import com.googlecode.aviator.AviatorEvaluator; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; +//转换规则 +@Component("convert") +@AllArgsConstructor +@Slf4j +public class ByteRuleResolver implements ByteResolver { + + private final FieldRuleConfigMapper fieldRuleConfigMapper; + + @Override + public Object resolveOperationRule(ByteResolverParam byteResolverParam){ + FieldRuleConfig fieldRuleEngine=fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); + if(ObjectUtil.isEmpty(fieldRuleEngine)){ + return byteResolverParam.getValue(); + } + String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); + Map env2 = new HashMap(); + env2.put("value", (byte) byteResolverParam.getValue()); + String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); + return values; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java index 103821c..786b71c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java @@ -2,34 +2,34 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("logicalShift") +@Component("logicalShift") @AllArgsConstructor @Slf4j public class LogicalShiftResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //字节位移 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { Integer index = byteResolverParam.getIndex(); - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return byteResolverParam.getValue(); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java index 476747d..01149bd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("operation") +@Component("operation") @AllArgsConstructor @Slf4j public class OperationResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //混合运算,有常量或者乘除的缩放 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java index 0b82cf4..79abcce 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.casic.missiles.pojo.ByteResolverParam; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; //精度计算 -@Service("precision") +@Component("precision") @AllArgsConstructor @Slf4j public class PrecisionResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java deleted file mode 100644 index 5c3f332..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; -//转换规则 -@Service("convert") -@AllArgsConstructor -@Slf4j -public class RuleResolver implements ByteResolver { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam){ - RuleEvaluator fieldRuleEngine=fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); - if(ObjectUtil.isEmpty(fieldRuleEngine)){ - return byteResolverParam.getValue(); - } - String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); - Map env2 = new HashMap(); - env2.put("value", (byte) byteResolverParam.getValue()); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java new file mode 100644 index 0000000..d3bbd91 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java @@ -0,0 +1,15 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; + +import java.util.List; +import java.util.Map; +// 前导码匹配->长度字段 +public interface AbstractCombinedFieldProcessor { + + Map invoke(Map map, ByteBuf byteBuf, List combinedFieldConfigList, + Map fieldConfigsMap, Map storeObjectMap); + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java new file mode 100644 index 0000000..03c8480 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java @@ -0,0 +1,59 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-13 + */ +//依次递增进行数据的解析, +public class GenericCombinedFieldResolver { + + + //通过查询,字段长度长度随机 + public void parseDataField(List combinedFieldConfigList, ByteBuf byteBuf, + Map storeObjectMap, Map fieldConfigsMap) { + Integer frameLength = Integer.valueOf(ByteBufUtil.hexDump(byteBuf)); + //添加前置处理器 + com.casic.missiles.util.ClassUtil classUtil = new com.casic.missiles.util.ClassUtil(); + List abstractCombinedProcessors = classUtil.getSubClassList(AbstractCombinedFieldProcessor.class); + + Map fieldFixedMap = combinedFieldLeadCodeMap(combinedFieldConfigList); + //frameLength + Map combinedProcessorFields = null; + while (byteBuf.readableBytes() < frameLength) { + //一直处理 + for (AbstractCombinedFieldProcessor abstractCombinedProcessor : abstractCombinedProcessors) { + combinedProcessorFields = abstractCombinedProcessor.invoke(combinedProcessorFields, byteBuf, + combinedFieldConfigList, + fieldConfigsMap, storeObjectMap); + if (combinedProcessorFields == null || byteBuf.readableBytes() < frameLength) { + return; + } + } + + } + } + + /** + * 取出前导码匹配集合 + */ + private Map combinedFieldLeadCodeMap(List combinedFieldConfigList) { + Map fieldFixedMap = combinedFieldConfigList + .stream() + .collect(Collectors.toMap(CombinedFieldConfig::getPrefixCode, e -> e)); + return fieldFixedMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java new file mode 100644 index 0000000..643a934 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java @@ -0,0 +1,100 @@ +package com.casic.missiles.parser.resolver.fields; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.FieldParserSupport; +import com.casic.missiles.pojo.*; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 保存使用时最基本的信息,并且使用原型模式 + */ +@Slf4j +public class DefaultProtocolFieldParser extends FieldParserSupport implements FieldParser, FixedPropertyEnum { + + //通过传入的配置和报文进行字段解析 + @Override + public Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap) { + Map dataMap = new HashMap<>(); + for (AbstractFieldConfig protocolFieldConfig : protocolFieldConfigs) { + if (!ObjectUtils.isEmpty(protocolFieldConfig.getOriginPositionByte())) { + Object fieldValue = FieldResolver.parseField(buffer, protocolFieldConfig, null); + if (protocolFieldConfig.getIsStorage() == 1) { + storeObjectMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + dataMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + } + return dataMap; + } + + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength) { + Map fixedPropertyMap = new HashMap<>(); + Integer fixedLength = calculateLength(protocolFieldConfigs); + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + fixedPropertyMap.put(FIXED_POSITION, maxFixedPosition); + fixedPropertyMap.put(TOTAL_LENGTH, totalLength); + fixedPropertyMap.put(TAIL_POSITION, totalLength - fixedLength + maxFixedPosition); + return fixedPropertyMap; + } + + //** 获取业务内容的byteBuf + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer) { + //计算固定长度 + Integer fixedLength = calculateLength(protocolFieldConfigs); + //总长度获取 + String lightText = buffer.toString(Charset.forName("ISO-8859-1")); + Integer totalLength = lightText.length(); + //计算固定长度最大长度 + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + //计算数据报文内容 + ByteBuf bizDataFields = buffer.slice(maxFixedPosition - 1, (totalLength - fixedLength)); + return bizDataFields; + } + + /** + * 获取过滤字段的长度 + */ + @Override + public Integer getTotalFilterLength(ProtocolConfig protocolConfig, + ByteBuf byteBuf, + Map protocolFieldConfigMap) { + if (ByteBufUtil.hexDump(byteBuf).equals("")) { + return 0; + } + int totalFilterLength = 0; + String filterFields = protocolConfig.getTotalLengthFilterFields(); + try { + if (!StringUtils.isEmpty(filterFields)) { + String[] filterFieldList = filterFields.split(","); + for (String filterFieldId : filterFieldList) { + if (StringUtils.isNotEmpty(filterFieldId)) { + ProtocolFieldConfig fieldConfig = protocolFieldConfigMap.get(Long.valueOf(filterFieldId)); + //这里都是按字节计算,没有对位进行区分,可能会出现错误 + // 如果对位有需求,需要进一步跟进 + totalFilterLength += fieldConfig.getOffsetLength(); + } + } + } + return totalFilterLength; + } catch (Exception ex) { + log.error("报文确认分发阶段,获取报文总长度过滤长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); + } + return totalFilterLength; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java new file mode 100644 index 0000000..d51e887 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java @@ -0,0 +1,169 @@ +package com.casic.missiles.parser.resolver.fields; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.parser.resolver.ByteMergeProvider; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.AbstractFieldConfig; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.pojo.ByteResolverParam; +import io.netty.buffer.ByteBuf; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * 字段解析管理总类 + */ +@Slf4j +public class FieldResolver extends ByteMergeProvider { + + //1、字段截取 => 2、简单的字节解析和复杂的字节解析 + public static Object parseField(ByteBuf byteBuf,AbstractFieldConfig fieldConfig, Integer maxFixedPosition) { + Integer orignPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + //最大固定位置不为空, + if (!ObjectUtil.isEmpty(maxFixedPosition)) { + orignPosition -= maxFixedPosition; + } + Object fieldValue = 0; + //待优化 + if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { + fieldValue = doParseBitField(byteBuf, fieldConfig); + } else { + ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); + fieldValue = doParseByteField(fieldBytes, fieldConfig.getRuleJson()); + } + return fieldValue; + } + + //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, + //目前默认配置的规则设置暂不支持配置化,由实现完成 + private static Object doParseByteField(ByteBuf byteBuf, String ruleJson) { + Object fieldsResolveValue = null; + List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); + if (ObjectUtil.isEmpty(ruleMapList)) { + fieldsResolveValue = defaultResolveBuilder(byteBuf); + } else { + fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); + } + return fieldsResolveValue; + } + + private static Object defaultResolveBuilder(ByteBuf byteBuf) { + Integer defaultResolveValue = 0; + for (int i = 0; i < byteBuf.writerIndex(); i++) { + defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; + } + return defaultResolveValue; + } + + //字段解析构建器(针对字节单位的) + //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 + // 字节归并结束或者规则结束=>继续根据规则进行判断 + private static Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { + Object customizeResolveValue = null; + try { + List bytStrList = new ArrayList<>(); + //存放到数组里面 + for (int i = 0; i < byteBuf.writerIndex(); i++) { + bytStrList.add(byteBuf.readByte()); + } + int i = 0; + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { + if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + customizeResolveValue = resolveByteMerge(bytStrList, ruletypeId, vaildRange); + break; + } else { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + List tempBytStr = new ArrayList<>(); + for (int k = 0; i < bytStrList.size(); i++) { + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(k) + .value(bytStrList.get(k)) + .ruletypeId(ruletypeId).build(); + tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); + } + bytStrList = tempBytStr; + } + i++; + } + //字节归并到一起=>继续根据规则进行判断 + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(null) + .value(customizeResolveValue) + .ruletypeId(ruletypeId).build(); + customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); + i++; + } + System.out.println(JSON.toJSON(customizeResolveValue)); + return customizeResolveValue; + } catch (RuntimeException ex) { + log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); + return null; + } + } + + /** + * 1、单个字节情况表示字段 + * 2、多字节情况表示字段(暂未处理) + */ + private static Object doParseBitField(ByteBuf byteBuf,AbstractFieldConfig fieldConfig) { + Object fieldValue = new Object(); + try { + Integer orignPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + byte fields = 0x00; + if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { + fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); + } else { + fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); + } + + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { + if (!StringUtils.isEmpty(fieldConfig.getOriginPositionBit())) { + fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getOriginPositionBit())).byteValue() + >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); + } else { + fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); + } + } else { + fieldValue = Integer.valueOf(fields & 0xff); + } + if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { + return fieldValue; + } + List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); + int i = 0; + //字节归并到一起=>继续根据规则进行判断 + while (i < ruleMapList.size()) { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(null) + .value(fieldValue) + .ruletypeId(ruletypeId).build(); + fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); + i++; + } + System.out.println(JSON.toJSON(fieldValue)); + return fieldValue; + } catch (RuntimeException ex) { + log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); + return null; + } + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java deleted file mode 100644 index 35ae3d0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java +++ /dev/null @@ -1,183 +0,0 @@ -package com.casic.missiles.parser.resolver.fields; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufAllocator; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; -import org.springframework.util.ObjectUtils; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service("standard") -@AllArgsConstructor -@Slf4j -public class StandardFieldParser implements FieldParser { - - private final FieldConfigDao fieldConfigDao; - private final FieldResolver fieldResolver; - - //数据解析 - @Override - public Map dataParser(RuleConfig ruleConfig, String lightText, String protocolId) { - String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); - ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); - bufferContent.writeBytes(lightText.getBytes(Charset.forName("ISO-8859-1"))); - Map dataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - for (String dataFieldId : dataFieldIds) { - FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(dataFieldId); - if (!ObjectUtils.isEmpty(fieldConfig)) { - dataMap.put(fieldConfig.getFieldName(), String.valueOf(fieldResolver.filedParserManger(bufferContent, fieldConfig, maxFixedPosition))); - } - } - return dataMap; - } - - //数据解析 - @Override - public Map fixDataParser(String protocolId, ByteBuf buffer) { - List dataFieldIdList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Map dataMap = new HashMap<>(); - for (FieldConfig dataField : dataFieldIdList) { - if (!ObjectUtils.isEmpty(dataField.getOrignPosition())) { - Object fieldValue = (Integer) fieldResolver.filedParserManger(buffer, dataField, null); - dataMap.put(dataField.getFieldName(), fieldValue); - } - } - return dataMap; - } - - @Override - public Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf) { - if (ByteBufUtil.hexDump(byteBuf).equals("")) { - return 0; - } - String filterFields = protocolConfig.getTotalLengthFilterField(); - Integer totalLength = 0; - try { - FieldConfig totalFieldConfig = fieldConfigDao.getFieldConfigById(protocolConfig.getTotalLengthId()); - int totalFilterLength = 0; - if (!StringUtils.isEmpty(filterFields)) { - String[] filterFieldList = filterFields.split(","); - for (String filterField : filterFieldList) { - FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(filterField); - //这里都是按字节计算,没有对位进行区分,可能会出现错误 - - // 如果对位有需求,需要进一步跟进 - totalFilterLength += fieldConfig.getOffsetLength(); - } - } - totalLength = (Integer) fieldResolver.filedParserManger(byteBuf, totalFieldConfig, null) + totalFilterLength; - } catch (Exception ex) { - log.error("报文确认分发阶段,获取报文总长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); - } - return totalLength; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer) { - //业务内容 - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - String protocolId = String.valueOf(protocolConfig.getId()); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - //计算固定长度 - Integer fixedLength = calculateLength(fieldConfigList); -// Integer totalLength = this.getTotalLength(protocolConfig, buffer); - //总长度获取 - Integer totalLength = lightText.length(); - //计算固定长度最大长度 - Integer maxFixedPosition = calculatePosition(fieldConfigList); -// buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - //计算数据报文内容 - ByteBuf bizDataFields = buffer.slice(maxFixedPosition-1, (totalLength - fixedLength)); - return bizDataFields; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer) { - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - String protocolId = String.valueOf(protocolConfig.getId()); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer fixedLength = calculateLength(fieldConfigList); -// Integer totalLength = this.getTotalLength(protocolConfig, buffer); - Integer totalLength = lightText.length(); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - ByteBuf fixDataFields = buffer.slice(0, maxFixedPosition); - return fixDataFields; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer) { - String protocolId = String.valueOf(protocolConfig.getId()); - Map fixedPropertyMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer fixedLength = calculateLength(fieldConfigList); - Integer totalLength = this.getTotalLength(protocolConfig, buffer); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - fixedPropertyMap.put("fixedPosition", maxFixedPosition); - fixedPropertyMap.put("totalLength", totalLength); - fixedPropertyMap.put("tailPosition", totalLength - fixedLength + maxFixedPosition); - return fixedPropertyMap; - } - - //分别计算bit和byte长度=> 合并长度 - private Integer calculateLength(List fieldConfigList) { - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (FieldConfig fieldConfig : fieldConfigList) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - Integer fixedLength = bytefixedLength + bitfixedLength / 8; - return fixedLength; - } - - //找到最大值=> 根据最大值计算业务数据下标 - private Integer calculatePosition(List fieldConfigList) { - String rex = "[0-9]+"; - Integer max = -1; - for (FieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOrignPosition()) - && Integer.valueOf(fieldConfig.getOrignPosition()) > max) { - max = Integer.valueOf(fieldConfig.getOrignPosition()); - } - } - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (FieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOrignPosition()) && fieldConfig.getOrignPosition().equals(max)) { - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - } - } - Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; - return maxFixedPosition; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java new file mode 100644 index 0000000..d4ec6c7 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java @@ -0,0 +1,76 @@ +package com.casic.missiles.parser.rule; + +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import org.apache.commons.lang3.StringUtils; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class GenericRuleResolver { + + //根据前置字段的值,找到指定的规则 + //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 + //=>循环判断=>通过规则得到业务字段 + public static RuleConfig machRule(Map fixDataMap, + String ids, + List protocolFieldConfigs, + List ruleConfigs) { + List preRuleConfigList = getPreRuleList(ids, protocolFieldConfigs); + //获取前置规则字段 + final Map metaDataMap = getPreRuleFields(preRuleConfigList, fixDataMap); + //准备固定的字段集合 + Map fixDataFieldMap = getFixDataFieldMap(protocolFieldConfigs); + return RuleResolverCore.doMachRule(ruleConfigs, metaDataMap, fixDataMap, fixDataFieldMap); + } + + private static Map getFixDataFieldMap(List protocolFieldConfigs) { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, ProtocolFieldConfig::getFieldName) + ); + return fixDataFieldMap; + } + + + /** + * 查询前置规则的字段配置 + * + * @param ids + * @return + */ + private static List getPreRuleList(String ids, List protocolFieldConfigs) { + String[] idList = ids.split(","); + Map prepareMaps = new HashMap<>(); + for (String id : idList) { + if (StringUtils.isNotEmpty(id)) { + prepareMaps.put(Long.valueOf(id), ""); + } + } + List preRuleConfigList = protocolFieldConfigs + .stream() + .filter(e -> prepareMaps.containsKey(e.getId())) + .collect(Collectors.toList()); + return preRuleConfigList; + } + + /** + * 获取前置规则解析字段 + */ + private static Map getPreRuleFields(List preRuleFieldConfigList, Map fixDataMap) { + Map ruleFieldMap = new HashMap<>(); + preRuleFieldConfigList.stream() + .forEach( + preRuleFieldConfig -> { + String fieldName = preRuleFieldConfig.getFieldName(); + if (fixDataMap.containsKey(fieldName)) { + ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); + } + } + ); + return ruleFieldMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java new file mode 100644 index 0000000..baae7e8 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -0,0 +1,68 @@ +package com.casic.missiles.parser.rule; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.casic.missiles.pojo.RuleConfig; + +import java.util.*; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleResolverCore { + + + public static RuleConfig doMachRule(List ruleConfigList, Map metaDataMap, + Map fixDataMap, + Map fixDataFieldMap) { + Optional ruleConfigOptional = ruleConfigList.stream() + .filter(ruleConfig -> machRuleConfig( + JSON.parseObject(ruleConfig.getMatchRuleJson(), Map.class), metaDataMap)) + .findFirst(); + if (ObjectUtil.isEmpty(ruleConfigOptional)) { + return null; + } + String[] ruleFields = ruleConfigOptional.get().getDataFieldIds().split(","); + Map ruleMetaDataMap = getRuleFields(ruleFields, fixDataMap, fixDataFieldMap); + //递归选定解析规则,进行规则解析 + if (!ruleConfigOptional.get().getIsFinishMatch().equals("1")) { + //递归选定规则 + doMachRule(ruleConfigList, ruleMetaDataMap, fixDataMap, fixDataFieldMap); + } + return ruleConfigOptional.get(); + } + + + private static Map getRuleFields(String[] preRuleConfigList, Map fixedDataMap, + Map fixedFieldMap) { + Map ruleFieldMap = new HashMap<>(); + for (String preRuleConfigId : preRuleConfigList) { + String fieldName = fixedFieldMap.get(preRuleConfigId); + if (fixedDataMap.containsKey(fieldName)) { + ruleFieldMap.put(fieldName, String.valueOf(fixedDataMap.get(fieldName))); + } + } + return ruleFieldMap; + } + + + //匹配规则配置 + private static Boolean machRuleConfig(Map ruleMap, Map metaDataMap) { + if (ruleMap == null || metaDataMap == null) { + return null; + } + //所有的字段在规则里面必须有有配置 + for (String key : metaDataMap.keySet()) { + if (ruleMap.containsKey(key)) { + if (!ruleMap.get(key).equals(metaDataMap.get(key))) { + return false; + } + } else { + return false; + } + } + return true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java deleted file mode 100644 index 664088d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java +++ /dev/null @@ -1,92 +0,0 @@ -package com.casic.missiles.parser.rule; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.mapper.dao.PreRuleConfigDao; -import com.casic.missiles.mapper.dao.RuleConfigDao; -import lombok.AllArgsConstructor; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.*; -import java.util.stream.Collectors; - -@Service -@AllArgsConstructor -public class RulerProvider { - - private final FieldConfigDao fieldConfigDao; - private final PreRuleConfigDao preRuleConfigDao; - private final RuleConfigDao ruleConfigDao; - - //根据前置字段的值,找到指定的规则 - //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 - //=>循环判断=>通过规则得到业务字段 - public RuleConfig ruleConfig(Map fixDataMap, String protocolId) { - //批量获取规则 - List preRuleConfigList = preRuleConfigDao.getPreRuleList(protocolId); - //获取固定字段 - Map fixFieldMap = getAllFieldMap(protocolId); - //获取前置规则字段 - final String preRuleFields = getPreRuleFields(preRuleConfigList, fixDataMap, fixFieldMap); - List ruleConfigList = ruleConfigDao.getRuleConfigById(protocolId); - Optional ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig ->preRuleFields.equals( ruleConfig.getParseRuleJson())).findFirst(); - //递归选定解析规则,进行规则解析 - while (!ObjectUtil.isEmpty(ruleConfigOptional) && !ruleConfigOptional.get().getIsBizField().equals("1")) { - String ruleFields = getRuleFields(ruleConfigOptional.get().getDataFieldIds().split(","), fixDataMap, fixFieldMap); - ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig -> ruleConfig.getParseRuleJson().equals(ruleFields)).findFirst(); - } - return ruleConfigOptional.get(); - } - - /** - * 获取前置规则解析字段 - */ - private String getPreRuleFields(List preRuleConfigList, Map fixDataMap, Map fixFieldMap) { - Map ruleFieldMap= new HashMap<>(); - preRuleConfigList.stream() - .forEach( - preRuleConfig -> { - String fieldName = fixFieldMap.get(Long.valueOf(preRuleConfig.getRuleFieldId())); - if (fixDataMap.containsKey(fieldName)) { - ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); - } - } - ); - return JSONObject.toJSONString(ruleFieldMap); - } - - private Map getAllFieldMap(String protocolId) { - List fieldList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Map fixFieldMap = fieldList.stream().collect( - Collectors.toMap(FieldConfig::getId, FieldConfig::getFieldName) - ); - return fixFieldMap; - } - - private String getRuleFields(String[] preRuleConfigList, Map fixDataMap, Map fixFieldMap) { - Map ruleFieldMap= new HashMap<>(); - for (String preRuleConfigId : preRuleConfigList) { - String fieldName = fixFieldMap.get(preRuleConfigId); - if (fixDataMap.containsKey(fieldName)) { - ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); - } - } - return JSONObject.toJSONString(ruleFieldMap); - } - - //弃置 - private String ListToString(List ruleFieldList) { - String ruleFields = ""; - for (String ruleField : ruleFieldList) { - ruleFields += ruleField + ","; - } - ruleFields = StringUtils.isEmpty(ruleFields) ? ruleFields : ruleFields.substring(0, ruleFields.length() - 1); - return ruleFields; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java index 6177e10..bfa87a5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java @@ -2,7 +2,7 @@ public interface SafeStrategy { - String decryption(byte[] bytes); + String decryption(String cipher); String encryption(String lightText); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java index 618716c..6236302 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java @@ -9,9 +9,9 @@ //十六进制的字符串转换成字节数组 byte[] bytes = hexStrToBinaryStr(msg); //计算CRC8 - byte crc8 = CRC8(bytes, 0, bytes.length); - String crc8ToStr = "" + Integer.toHexString(0xff & crc8); - return crc8ToStr; +// String crc8ToStr = "" + Integer.toHexString(0xff & crc8); +// return crc8ToStr; + return null; } /** @@ -33,50 +33,5 @@ return bytes; } - /** - * CRC8 校验 多项式 x8+x2+x+1 - * - * @param b - * @param off - * @param len - * @return - */ - public static byte CRC8(final byte[] b, final int off, final int len) { - byte result = 0x00; - for (int i = 0; i < len; i++) { - result = CHECKSUM_TABLE[(result ^ (b[i + off] & 0xFF)) & 0xFF]; - } - return (byte) (result & 0xFFL); - } - - private final static byte[] CHECKSUM_TABLE = {(byte) 0x00, (byte) 0x07, (byte) 0x0e, (byte) 0x09, (byte) 0x1c, (byte) 0x1b, - (byte) 0x12, (byte) 0x15, (byte) 0x38, (byte) 0x3f, (byte) 0x36, (byte) 0x31, (byte) 0x24, (byte) 0x23, (byte) 0x2a, - (byte) 0x2d, (byte) 0x70, (byte) 0x77, (byte) 0x7e, (byte) 0x79, (byte) 0x6c, (byte) 0x6b, (byte) 0x62, (byte) 0x65, - (byte) 0x48, (byte) 0x4f, (byte) 0x46, (byte) 0x41, (byte) 0x54, (byte) 0x53, (byte) 0x5a, (byte) 0x5d, (byte) 0xe0, - (byte) 0xe7, (byte) 0xee, (byte) 0xe9, (byte) 0xfc, (byte) 0xfb, (byte) 0xf2, (byte) 0xf5, (byte) 0xd8, (byte) 0xdf, - (byte) 0xd6, (byte) 0xd1, (byte) 0xc4, (byte) 0xc3, (byte) 0xca, (byte) 0xcd, (byte) 0x90, (byte) 0x97, (byte) 0x9e, - (byte) 0x99, (byte) 0x8c, (byte) 0x8b, (byte) 0x82, (byte) 0x85, (byte) 0xa8, (byte) 0xaf, (byte) 0xa6, (byte) 0xa1, - (byte) 0xb4, (byte) 0xb3, (byte) 0xba, (byte) 0xbd, (byte) 0xc7, (byte) 0xc0, (byte) 0xc9, (byte) 0xce, (byte) 0xdb, - (byte) 0xdc, (byte) 0xd5, (byte) 0xd2, (byte) 0xff, (byte) 0xf8, (byte) 0xf1, (byte) 0xf6, (byte) 0xe3, (byte) 0xe4, - (byte) 0xed, (byte) 0xea, (byte) 0xb7, (byte) 0xb0, (byte) 0xb9, (byte) 0xbe, (byte) 0xab, (byte) 0xac, (byte) 0xa5, - (byte) 0xa2, (byte) 0x8f, (byte) 0x88, (byte) 0x81, (byte) 0x86, (byte) 0x93, (byte) 0x94, (byte) 0x9d, (byte) 0x9a, - (byte) 0x27, (byte) 0x20, (byte) 0x29, (byte) 0x2e, (byte) 0x3b, (byte) 0x3c, (byte) 0x35, (byte) 0x32, (byte) 0x1f, - (byte) 0x18, (byte) 0x11, (byte) 0x16, (byte) 0x03, (byte) 0x04, (byte) 0x0d, (byte) 0x0a, (byte) 0x57, (byte) 0x50, - (byte) 0x59, (byte) 0x5e, (byte) 0x4b, (byte) 0x4c, (byte) 0x45, (byte) 0x42, (byte) 0x6f, (byte) 0x68, (byte) 0x61, - (byte) 0x66, (byte) 0x73, (byte) 0x74, (byte) 0x7d, (byte) 0x7a, (byte) 0x89, (byte) 0x8e, (byte) 0x87, (byte) 0x80, - (byte) 0x95, (byte) 0x92, (byte) 0x9b, (byte) 0x9c, (byte) 0xb1, (byte) 0xb6, (byte) 0xbf, (byte) 0xb8, (byte) 0xad, - (byte) 0xaa, (byte) 0xa3, (byte) 0xa4, (byte) 0xf9, (byte) 0xfe, (byte) 0xf7, (byte) 0xf0, (byte) 0xe5, (byte) 0xe2, - (byte) 0xeb, (byte) 0xec, (byte) 0xc1, (byte) 0xc6, (byte) 0xcf, (byte) 0xc8, (byte) 0xdd, (byte) 0xda, (byte) 0xd3, - (byte) 0xd4, (byte) 0x69, (byte) 0x6e, (byte) 0x67, (byte) 0x60, (byte) 0x75, (byte) 0x72, (byte) 0x7b, (byte) 0x7c, - (byte) 0x51, (byte) 0x56, (byte) 0x5f, (byte) 0x58, (byte) 0x4d, (byte) 0x4a, (byte) 0x43, (byte) 0x44, (byte) 0x19, - (byte) 0x1e, (byte) 0x17, (byte) 0x10, (byte) 0x05, (byte) 0x02, (byte) 0x0b, (byte) 0x0c, (byte) 0x21, (byte) 0x26, - (byte) 0x2f, (byte) 0x28, (byte) 0x3d, (byte) 0x3a, (byte) 0x33, (byte) 0x34, (byte) 0x4e, (byte) 0x49, (byte) 0x40, - (byte) 0x47, (byte) 0x52, (byte) 0x55, (byte) 0x5c, (byte) 0x5b, (byte) 0x76, (byte) 0x71, (byte) 0x78, (byte) 0x7f, - (byte) 0x6a, (byte) 0x6d, (byte) 0x64, (byte) 0x63, (byte) 0x3e, (byte) 0x39, (byte) 0x30, (byte) 0x37, (byte) 0x22, - (byte) 0x25, (byte) 0x2c, (byte) 0x2b, (byte) 0x06, (byte) 0x01, (byte) 0x08, (byte) 0x0f, (byte) 0x1a, (byte) 0x1d, - (byte) 0x14, (byte) 0x13, (byte) 0xae, (byte) 0xa9, (byte) 0xa0, (byte) 0xa7, (byte) 0xb2, (byte) 0xb5, (byte) 0xbc, - (byte) 0xbb, (byte) 0x96, (byte) 0x91, (byte) 0x98, (byte) 0x9f, (byte) 0x8a, (byte) 0x8d, (byte) 0x84, (byte) 0x83, - (byte) 0xde, (byte) 0xd9, (byte) 0xd0, (byte) 0xd7, (byte) 0xc2, (byte) 0xc5, (byte) 0xcc, (byte) 0xcb, (byte) 0xe6, - (byte) 0xe1, (byte) 0xe8, (byte) 0xef, (byte) 0xfa, (byte) 0xfd, (byte) 0xf4, (byte) 0xf3}; } \ No newline at end of file diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java index 27c2838..6e078a3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java @@ -1,9 +1,6 @@ package com.casic.missiles.parser.safe.impl; -import cn.hutool.core.util.CharsetUtil; -import cn.hutool.crypto.symmetric.SM4; -import cn.hutool.crypto.symmetric.SymmetricCrypto; - +import com.casic.missiles.parser.safe.SafeStrategy; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; @@ -11,19 +8,44 @@ import org.bouncycastle.crypto.engines.SM4Engine; import org.bouncycastle.crypto.params.KeyParameter; import org.bouncycastle.util.encoders.Hex; - -import static cn.hutool.crypto.Mode.ECB; -import static cn.hutool.crypto.Padding.NoPadding; +import org.springframework.stereotype.Component; /** * SM4算法工具类 */ @Slf4j -public class Sm4 { +@Component("sm4") +public class Sm4 implements SafeStrategy { //加解密的字节快大小 public static final int BlockSize = 16; + @Override + public String decryption(String cipher) { + byte[] keyByte = { + 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 + }; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(keyByte); + byte[] in = Hex.decode(cipher); + byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); + String plain = EcbDecrypt(in, keyBytes); + return plain; + } + + @Override + public String encryption(String cipher) { + byte[] keyByte = { + 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 + }; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(keyByte); + byte[] in = Hex.decode(cipher); + byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); + String plain = EcbDecrypt(in, keyBytes); + return plain; + } + /** * SM4ECB加密算法,对内 * @@ -32,8 +54,6 @@ * @return */ private static byte[] ecb_encrypt(byte[] in, byte[] keyBytes) { - - SM4Engine sm4Engine = new SM4Engine(); sm4Engine.init(true, new KeyParameter(keyBytes)); byte[] out = new byte[in.length]; @@ -58,27 +78,6 @@ return cipher; } - - /** - * hutool 解密SM4 - * - * @param encodeContent - * @return - */ - public static String decode(String encodeContent) { - String key = "24ad182507479a5da3ad94d9d78ea203"; - try { - SymmetricCrypto sm4 = new SM4(ECB, NoPadding, key.getBytes()); - String decryptStr = sm4.decryptStr(encodeContent, CharsetUtil.CHARSET_UTF_8); - return decryptStr; - } catch (Exception e) { - e.printStackTrace(); - log.error("SM4解密失败"); - } - return null; - } - - /** * SM4的ECB加密算法 * @@ -129,20 +128,6 @@ return plain; } - /** - * SM4的ECB解密算法 - * - * @param cipher 输入的密文字符串 - * @param key 密钥 - * @return - */ - public static String EcbDecrypt(String cipher, String key) { - byte[] in = Hex.decode(cipher); - byte[] keyBytes = Hex.decode(key); - - String plain = EcbDecrypt(in, keyBytes); - return plain; - } /** * 主函数 @@ -151,28 +136,24 @@ */ public static void main(String[] args) { byte[] ciphertext = { + 0x4B, (byte) 0x8C, (byte) 0x9D, 0x08, (byte) 0xE4, (byte) 0xD3, 0x64, 0x42, (byte) 0xB9, (byte) 0xA5, (byte) 0xFE, (byte) 0xCD, (byte) 0x91, 0x1B, 0x38, (byte) 0xAC, (byte) 0xE9, 0x1C, (byte) 0xCD, 0x53, 0x02, (byte) 0xD7, 0x0C, (byte) 0x9B, (byte) 0x96, 0x30, 0x62, (byte) 0xE8, (byte) 0xFB, (byte) 0xEF, (byte) 0xB9, (byte) 0xFF, (byte) 0xDE, 0x19, (byte) 0x80, 0x35, 0x3E, (byte) 0x90, 0x4F, 0x2F, 0x12, 0x2B, 0x19, (byte) 0x8B, 0x6C, 0x7A, (byte) 0x85, (byte) 0xA1, (byte) 0xB1, (byte) 0x86, (byte) 0xA3, 0x7A, 0x46, 0x0C, 0x2F, (byte) 0x94, 0x4F, 0x7F, 0x2C, 0x56, 0x14, (byte) 0xF3, (byte) 0x89, (byte) 0xC3, - 0x3F, 0x20, (byte) 0xF9, (byte) 0x87, (byte) 0xA1, 0x60, (byte) 0xD9, (byte) 0xA8, (byte) 0xFD, (byte) 0xD7, (byte) 0x9B, 0x4B, 0x26, 0x06, 0x30, 0x44}; + 0x3F, 0x20, (byte) 0xF9, (byte) 0x87, (byte) 0xA1, 0x60, (byte) 0xD9, (byte) 0xA8, (byte) 0xFD, (byte) 0xD7, (byte) 0x9B, 0x4B, 0x26, 0x06, 0x30, 0x44 + }; ByteBuf in = ByteBufAllocator.DEFAULT.heapBuffer(); in.writeBytes(ciphertext); - byte[] keyByte = { 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 }; ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); - key.writeBytes(ciphertext); - String resCipherData = decode(ByteBufUtil.hexDump(in)); - ByteBuf out = ByteBufAllocator.DEFAULT.heapBuffer(); -// out.writeBytes(resCipherData); -// System.out.println(hexBytes); - System.out.println(resCipherData.toString()); -// String resPlainData = EcbDecrypt(resCipherData, key); -// System.out.println("原始明文:" + data); -// System.out.println("解密后明文:" + resPlainData); + key.writeBytes(keyByte); +// String resCipherData = EcbDecrypt(ByteBufUtil.hexDump(in), ByteBufUtil.hexDump(key)); +// System.out.println(resCipherData); } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java index 1395a51..ac5f957 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java @@ -1,7 +1,7 @@ package com.casic.missiles.parser.safe.impl; import io.netty.buffer.ByteBufUtil; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** *

@@ -14,9 +14,8 @@ * @author hyl * @version v1.0: Tea.java, v 0.1 2021/3/12 13:48 $ */ -@Service("tea") -///tea算法类 - +//tea算法类 +@Component("tea") public class Tea { public static byte[] MyTea_Encrypt(byte[] MyTeaContent, int ByteLen, byte[] MyTeakey) { @@ -99,7 +98,6 @@ // for(int i32Index = 0; i32Index < 8; i32Index++) { // System.out.print("0x" + Integer.toHexString(MyContent[i32Index]) + " "); // } - // System.out.println("密钥为:"); // for(int i32Index = 0; i32Index < 16; i32Index++) { // System.out.print("0x" + Integer.toHexString(MyKeys[i32Index]) + " "); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java index bdd0721..bd1516a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java @@ -3,7 +3,7 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.parser.sender.DataSubscribeProvider; import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponents; import org.springframework.web.util.UriComponentsBuilder; @@ -12,7 +12,7 @@ import java.util.Collections; import java.util.Map; -@Service("functionCallback") +@Component("functionCallback") public class FunctionCallback implements DataSubscribeProvider { @Resource diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java index 0b44fb9..7526de2 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.Map; -@Service("middleware") +@Component("middleware") public class MiddlewareSubscribe implements DataSubscribeProvider { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java index 5dcee3f..e2f1192 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.Map; -@Service("nosql") +@Component("nosql") public class NoSqlSubscribe implements DataSubscribeProvider { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java b/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java new file mode 100644 index 0000000..81a5324 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java @@ -0,0 +1,86 @@ +package com.casic.missiles.pojo; + +import lombok.Data; + +/** + * 协议 + */ +@Data +public class Msg { + + /** + * 前导码 + */ + private String preamble; + + /** + * 版本号 + */ + private String version; + + /** + * 内容长度 + */ + private int leng; + + /** + * 设备ID + */ + private String deviceId; + + /** + * 通讯方式 + */ + private Integer connType; + + /** + * 加密方式 + */ + private Integer encryType; + + /** + * 目标地址 + */ + private String destAddr; + + /** + * PDUType + */ + private String PDUType; + + /** + * 操作类型 + */ + private Integer operateType; + + /** + * 传输控制位 PDUType.bit7=0时,表示存在后续的访问;当PDUType.bit7=1时,表示无后续的访问。 + */ + private Integer transControlFlag; + + /** + * 设备类型 + */ + private Integer deviceType; + + /** + * 序号 + */ + private Integer seq; + + /** + * tagList + */ + private String tagList; + + /** + * OidList + */ + private String OidList; + + /** + * CRC + */ + private String CRC; + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java index 40a5265..97cc984 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java @@ -40,7 +40,7 @@ String httpContent = msg.toString(Charset.defaultCharset()); log.info(" String : " + msg.toString(Charset.defaultCharset())); String majorContent = httpContent.substring(httpContent.indexOf("{"), httpContent.lastIndexOf("}") + 1); - String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("serviceData")).get("Value")); + String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("RegistryData")).get("Value")); log.info("----------------------------------" + values); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); bufferContent.writeBytes(values.getBytes(Charset.forName("ISO-8859-1"))); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java index 1b132a7..e3ced4b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java @@ -35,7 +35,7 @@ String httpContent = msg.toString(Charset.defaultCharset()); log.info(" String : " + msg.toString(Charset.defaultCharset())); String majorContent = httpContent.substring(httpContent.indexOf("{"), httpContent.lastIndexOf("}") + 1); - String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("serviceData")).get("Value")); + String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("RegistryData")).get("Value")); log.info("----------------------------------" + values); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); bufferContent.writeBytes(values.getBytes(Charset.forName("ISO-8859-1"))); diff --git a/sensorhub-core/src/main/resources/application.properties b/sensorhub-core/src/main/resources/application.properties deleted file mode 100644 index 8b13789..0000000 --- a/sensorhub-core/src/main/resources/application.properties +++ /dev/null @@ -1 +0,0 @@ - diff --git a/sensorhub-core/src/main/resources/config/application-dev.yml b/sensorhub-core/src/main/resources/config/application-dev.yml index 4f897a8..dcc4c2d 100644 --- a/sensorhub-core/src/main/resources/config/application-dev.yml +++ b/sensorhub-core/src/main/resources/config/application-dev.yml @@ -4,9 +4,9 @@ spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true + url: jdbc:mysql://127.0.0.1:3306/sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true username: root - password: Casic203 + password: root session: store-type: redis redis: diff --git a/sensorhub-core/src/main/resources/config/application.yml b/sensorhub-core/src/main/resources/config/application.yml index ae89f9d..7965da1 100644 --- a/sensorhub-core/src/main/resources/config/application.yml +++ b/sensorhub-core/src/main/resources/config/application.yml @@ -30,6 +30,13 @@ port: 6379 password: ew5T4K3#203lwh config-prefix: 'Casic:' +#代码生成器配置 +code: + generate: + #作者 + author: cz + #待生成对象表名 + table-name: bussiness_field_config,combined_field_config sensorhub: config: port: 7091 diff --git a/sensorhub-support/pom.xml b/sensorhub-support/pom.xml index 9a71296..761601c 100644 --- a/sensorhub-support/pom.xml +++ b/sensorhub-support/pom.xml @@ -42,6 +42,12 @@ ${redis.version} + + com.baomidou + mybatis-plus-generator + ${mybatis-plus-generator.version} + + org.reflections diff --git a/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java b/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java new file mode 100644 index 0000000..515ca53 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java @@ -0,0 +1,14 @@ +package com.casic.missiles.enums; + +/** + * @author + * @date + */ +public interface FixedPropertyEnum { + + String FIXED_POSITION = "fixedPosition"; + + String TOTAL_LENGTH = "totalLength"; + + String TAIL_POSITION = "tailPosition"; +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/CombinedFieldMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CombinedFieldMapper.java new file mode 100644 index 0000000..38e8f42 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CombinedFieldMapper.java @@ -0,0 +1,15 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.CombinedFieldConfig; +import org.apache.ibatis.annotations.Mapper; + +/** + * @author cz + * + */ +@Mapper +public interface CombinedFieldMapper extends BaseMapper { + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java new file mode 100644 index 0000000..128b09d --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java @@ -0,0 +1,10 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.CommandEventConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface CommandEventMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java new file mode 100644 index 0000000..042eb3c --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.DatagramEventConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface DatagramEventConfigMapper extends BaseMapper { +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java new file mode 100644 index 0000000..fc95cf4 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java @@ -0,0 +1,8 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.FieldConfig; + +public interface FieldConfigMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldRuleConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldRuleConfigMapper.java new file mode 100644 index 0000000..b310a08 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldRuleConfigMapper.java @@ -0,0 +1,10 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.FieldRuleConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface FieldRuleConfigMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java new file mode 100644 index 0000000..9060a69 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.ProtocolConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface ProtocolConfigMapper extends BaseMapper { +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolFieldConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolFieldConfigMapper.java new file mode 100644 index 0000000..1b47180 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolFieldConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +public interface ProtocolFieldConfigMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java new file mode 100644 index 0000000..6fa6936 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.RuleConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface RuleConfigMapper extends BaseMapper { +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/AbstractFieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/AbstractFieldConfig.java new file mode 100644 index 0000000..ba9aea2 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/AbstractFieldConfig.java @@ -0,0 +1,38 @@ +package com.casic.missiles.pojo; + +import lombok.Data; + +@Data +public class AbstractFieldConfig { + /** + * 字段名称 + */ + private String fieldName; + /** + * 按照字段评估进行字段解析 + */ + private String ruleJson; + /** + * 起始位置(单位byte) + */ + private Integer OriginPositionByte; + /** + * 起始位置,是否需要bit位置(单位bit)小于8, 没有不需要填写 + */ + private String OriginPositionBit; + /** + * 偏移长度 + */ + private Integer offsetLength; + /** + * 偏移单位(bit/byte) + */ + private String offsetUnit; + /** + * 是否需要转存 + */ + private Integer isStorage; + + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/CombinedFieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/CombinedFieldConfig.java new file mode 100644 index 0000000..4f4de6a --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/CombinedFieldConfig.java @@ -0,0 +1,41 @@ +package com.casic.missiles.pojo; + +import lombok.Data; + +import java.util.Date; + +/** + * 组合配置 + * + * @author cz + * @date 20 + */ +@Data +public class CombinedFieldConfig { + + private Long id; + private Long ruleId; + /** + * 前缀编码 + */ + private String prefixCode; + + /** + * 字段动态的id + */ + private Long dynamicLengthId; + /** + * 对应的要解析字段的ids + */ + private String dataFieldIds; + + /** + * 字段动态的id + */ + private String combinedFieldIds; + + private Date lastTime; + + private Date createTime; + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldConfig.java index a07d20d..8304dc6 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldConfig.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldConfig.java @@ -5,31 +5,28 @@ import java.util.Date; +/** + * @author cz + * 1、该表与实际解析的内容实例解析有关 + * 2、该表字段是随机出现的,和帧结构无关,无法预料的 + * 3、该表字段解析根据FieldEvaluatorConfig进行字段解析 + */ @Data -@TableName("field_config") -public class FieldConfig { +@TableName("business_field_config") +public class FieldConfig extends AbstractFieldConfig { private Long id; -// private String preFieldConfig; - private Long protocolId; - - private String isFixed; - private String uploadDeliveryChange; - - private String replyRule; - private String ruleJson; - + /** + * 协议配置id + */ + private Long ruleId; + /** + * 字段名称 + */ private String fieldName; - private String isStorage; - private Integer orignPosition; - private String exactOrignPosition; - - private Integer offsetLength; - private String offsetUnit; private String ownerId; private Date createTime; private Date lastTime; - } diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldRuleConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldRuleConfig.java new file mode 100644 index 0000000..2e09879 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldRuleConfig.java @@ -0,0 +1,20 @@ +package com.casic.missiles.pojo; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +@TableName("field_rule_config") +@Data +public class FieldRuleConfig { + + private Long id; + private String name; + private String desc; + private String condition; + private String excuteOperation; + private Date lasTime; + private Date createTime; + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/Msg.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/Msg.java deleted file mode 100644 index 81a5324..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/Msg.java +++ /dev/null @@ -1,86 +0,0 @@ -package com.casic.missiles.pojo; - -import lombok.Data; - -/** - * 协议 - */ -@Data -public class Msg { - - /** - * 前导码 - */ - private String preamble; - - /** - * 版本号 - */ - private String version; - - /** - * 内容长度 - */ - private int leng; - - /** - * 设备ID - */ - private String deviceId; - - /** - * 通讯方式 - */ - private Integer connType; - - /** - * 加密方式 - */ - private Integer encryType; - - /** - * 目标地址 - */ - private String destAddr; - - /** - * PDUType - */ - private String PDUType; - - /** - * 操作类型 - */ - private Integer operateType; - - /** - * 传输控制位 PDUType.bit7=0时,表示存在后续的访问;当PDUType.bit7=1时,表示无后续的访问。 - */ - private Integer transControlFlag; - - /** - * 设备类型 - */ - private Integer deviceType; - - /** - * 序号 - */ - private Integer seq; - - /** - * tagList - */ - private String tagList; - - /** - * OidList - */ - private String OidList; - - /** - * CRC - */ - private String CRC; - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/PreRuleConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/PreRuleConfig.java deleted file mode 100644 index bfcf914..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/PreRuleConfig.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.casic.missiles.pojo; - -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -import java.util.Date; - -@Data -@TableName("pre_rule_config") -public class PreRuleConfig { - - private Long id; - private String protocolId; - private String ruleFieldId; - private String ownerId; - private Date createTime; - private Date lastTime; -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolConfig.java index 274ad42..bdac11f 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolConfig.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolConfig.java @@ -5,18 +5,52 @@ import java.util.Date; +/** + * 协议配置表,协议配置与帧结构有关 + * 1、层级关系,协议之后是规则,规则对应设备类型的各种上数规则 + * 2、规则对应协议配置的实例流程 + * 3、每种可根据设备类型和操作类型进行上数规则进行区分 + */ @Data @TableName("protocol_config") public class ProtocolConfig { private Long id; + /** + * 前导码 + */ private String preFix; - private String unpackId; - private String totalLengthId; - private String totalLengthFilterField; + /** + * 拆包id + */ + private Long unpackId; + /** + * 总长度id + */ + private Long totalLengthId; + /** + * + */ + private String totalLengthFilterFields; + /** + * 动态长度ids + */ private String dynamicLengthId; + /** + * 动态长度json(预留字段) + */ private String dynamicLengthJson; - private String tailStr; + /** + * 规则字段所解析预准备的字段 + */ + private String rulePrepareFields; + /** + * 结尾标志 + */ + private Long tailStr; + /** + * 备注 + */ private String remark; private String ownerId; private Date createTime; diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolFieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolFieldConfig.java new file mode 100644 index 0000000..db794bd --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolFieldConfig.java @@ -0,0 +1,43 @@ +package com.casic.missiles.pojo; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +/** + * 协议字段配置表 + * 该表用户存放帧结构固定格式的字段 + * 有以下两个用途 + * (1)、固定格式的字段可用于规则匹配 + * (2)、固定格式的字段可用于报文回复 + * @author cz + * @date 2023-06-09 + */ +@Data +@TableName("protocol_field_config") +public class ProtocolFieldConfig extends AbstractFieldConfig{ + + private Long id; + /** + * 协议配置id + */ + private Long protocolId; + /** + * 上传下发是否有变化, 没有变化,可以直接组装 + */ + private String isReplyFix; + /** + * 按照字段评估进行字段解析 + */ + private Long fieldEvaluatorId; + /** + * 回复规则 + */ + private String replyRule; + + private String ownerId; + private Date createTime; + private Date lastTime; + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java index 608af3a..32cc8a4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java @@ -2,48 +2,47 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.delivery.decorator.ByteDecorator; +import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @AllArgsConstructor public class FieldDecoratorManger { - private final RuleDictDao ruleDictDao; + private final RuleConfigRegistry ruleDictDao; // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 // (1)静态的业务字段是字典里面可以配置的 // (2)动态的业务字段是通过规则生成的 public String contentMerge(String ruleJson, String sceneConent, String dynamicContent) { - List ruleDictList = ruleDictDao.getRuleDictConfig(); - Map ruleDictMap = ruleDictList.stream().collect( - Collectors.toMap(RuleDict::getId, e -> e)); - List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); - for (Map ruleMap : ruleMapList) { - String ruleType = String.valueOf(ruleMap.get("ruleType")); - ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); - NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); - byteDecorator.nodeDecoratorRule(nodeDecoratorParm); - } +// List ruleDictList = ruleDictDao.getRuleDictConfig(); +// Map ruleDictMap = ruleDictList.stream().collect( +// Collectors.toMap(RuleDict::getId, e -> e)); +// List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); +// for (Map ruleMap : ruleMapList) { +// String ruleType = String.valueOf(ruleMap.get("ruleType")); +// ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); +// NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); +// byteDecorator.nodeDecoratorRule(nodeDecoratorParm); +// } return null; } - - private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { - NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() - .contents(sceneConent) - .dynamicContent(dynamicContent) - .ruletypeId(ruletypeId) - .ruleDictMap(ruleDictMap) - .build(); - return nodeDecoratorParm; - } +// +// private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { +// NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() +// .contents(sceneConent) +// .dynamicContent(dynamicContent) +// .ruletypeId(ruletypeId) +// .ruleDictMap(ruleDictMap) +// .build(); +// return nodeDecoratorParm; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java index 652970c..b204ac3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java @@ -1,56 +1,56 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@AllArgsConstructor -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", - JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Component; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Component("logicalDecorator") +//@AllArgsConstructor +//@Slf4j +//public class LogicalShiftDecorator implements ByteDecorator { +// +//// private final FieldRuleEngineMapper fieldRuleEngineMapper; +//// +//// //字节位移 +//// @Override +//// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +//// String logicalValue = ""; +//// RuleEvaluator fieldRuleEngine = new RuleEvaluator(); +//// try { +//// Map env2 = new HashMap(); +//// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +//// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +//// for (String contentId : contentIdList) { +//// RuleDict ruleDict = ruleDictMap.get(contentId); +//// if (ruleDict.getCode().contains("#")) { +//// //使用动态的值 +//// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +//// } +//// env2.put(ruleDict.getName(), ruleDict.getCode()); +//// } +//// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +//// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +//// return null; +//// } +//// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +//// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +//// return values; +//// } catch (Exception ex) { +//// log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", +//// JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +//// return null; +//// } +//// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java index 346468f..822fead 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@AllArgsConstructor -@Slf4j -public class OperationDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("optionDecorator") +//@AllArgsConstructor +//@Slf4j +//public class OperationDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //混合运算,有常量或者乘除的缩放 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java index 50fb0a7..7a8bccb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@AllArgsConstructor -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +////精度计算 +//@AllArgsConstructor +//@Registry("precisionDecorator") +//@Slf4j +//public class PrecisionDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java index da39235..27f9cc7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java @@ -1,54 +1,53 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@AllArgsConstructor -@Slf4j -public class RuleDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("ruleDecorator") +//@AllArgsConstructor +//@Slf4j +//public class RuleDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //吃我一套正则表达式 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (Exception ex) { +// log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java index 7f5cbf3..c043f97 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java @@ -2,6 +2,6 @@ import java.util.Map; -public interface ComandeEventService { +public interface ComandeEventService{ Map loadComandeEventConfig(String protocolId,String scene); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java index 476ad84..aaf1837 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java @@ -2,46 +2,46 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.dao.CommandEventDao; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @Slf4j @AllArgsConstructor -public class ComandeEventServiceImpl implements ComandeEventService { +public class ComandeEventServiceImpl implements ComandeEventRegistry { - private final CommandEventDao commandEventDao; + // private final CommandEventDao commandEventDao; // 加密bean 固定字段出现变化的字段解析,业务字段的有序内容 @Override - public Map loadComandeEventConfig(String protocolId,String sceneName) { - CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); - if (ObjectUtil.isEmpty(commandEventConfig)) { - log.error("协议{},没有配置成功接收回复配置,清排查原因"); - return null; - } - String replyJson = commandEventConfig.getReplyContentJson(); - List> replyMapList = JSONArray.parseObject(replyJson, List.class); - List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); - Map fixMap = fixList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); - List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) - .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) - .collect(Collectors.toList()); - Map commandConfigMap = new HashMap<>(); - commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); - commandConfigMap.put("fixContent", fixMap); - commandConfigMap.put("bizContent", contentList); - return commandConfigMap; + public Map loadComandeEventConfig(String protocolId, String sceneName) { +// CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); +// if (ObjectUtil.isEmpty(commandEventConfig)) { +// log.error("协议{},没有配置成功接收回复配置,清排查原因"); +// return null; +// } +// String replyJson = commandEventConfig.getReplyContentJson(); +// List> replyMapList = JSONArray.parseObject(replyJson, List.class); +// List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); +// Map fixMap = fixList.stream() +// .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); +// List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) +// .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) +// .collect(Collectors.toList()); +// Map commandConfigMap = new HashMap<>(); +// commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); +// commandConfigMap.put("fixContent", fixMap); +// commandConfigMap.put("bizContent", contentList); +// return commandConfigMap; + return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 128b09d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java deleted file mode 100644 index 4016b0b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface DatagramEventMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java deleted file mode 100644 index 597c306..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.apache.ibatis.annotations.Mapper; - -public interface FieldConfigMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java deleted file mode 100644 index a31680a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.PreRuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface PreRuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java deleted file mode 100644 index 9060a69..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface ProtocolConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java deleted file mode 100644 index 6fa6936..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java deleted file mode 100644 index 582a705..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleDict; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleDictMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java deleted file mode 100644 index 6e302c8..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.CommandEventMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Optional; - -@Component -public class CommandEventDao { - - @Resource - private CommandEventMapper commandEventMapper; - - public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId) - .eq("scene", sceneName) - .eq("enabled", 1); - List commandEventConfig = commandEventMapper.selectList(queryWrapper); - Optional optionalEventConfig = commandEventConfig.stream().findFirst(); - return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java deleted file mode 100644 index 9137e4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.FieldConfigMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class FieldConfigDao { - - @Resource - private FieldConfigMapper fieldConfigMapper; - - public FieldConfig getFieldConfigById(String fieldId) { - FieldConfig fieldConfig = fieldConfigMapper.selectById(fieldId); - return fieldConfig; - } - - public List getFieldConfigs(String protocolId,Integer isFixed) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",isFixed); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - - public List getStorageFieldConfig(String protocolId) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",1) - .eq("is_storage",1); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java deleted file mode 100644 index 67bff6b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.mapper.PreRuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class PreRuleConfigDao { - - @Resource - private PreRuleConfigMapper preRuleConfigMapper; - - public List getPreRuleList(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return preRuleConfigMapper.selectList(queryWrapper); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java deleted file mode 100644 index d69ea85..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.RuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleConfigDao { - - @Resource - private RuleConfigMapper ruleConfigMapper; - - public RuleConfig getNextRuleConfig(String ruleFields) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("parse_rule_json", ruleFields); - return ruleConfigMapper.selectOne(queryWrapper); - } - - - public List getRuleConfigById(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return ruleConfigMapper.selectList(queryWrapper); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java deleted file mode 100644 index 932c185..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.RuleDictMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleDictDao { - - @Resource - private RuleDictMapper ruleDictMapper; - - public List getRuleDictConfig() { - List ruleDictList = ruleDictMapper.selectList(null); - return ruleDictList; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java index 9f9e279..43bc4d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java @@ -10,20 +10,15 @@ import io.netty.channel.socket.nio.NioServerSocketChannel; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import javax.annotation.PreDestroy; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static cn.hutool.core.util.ClassUtil.getClasses; /** * SensorhubServer netty服务端 */ @Slf4j -@Service +@Component public class SensorhubServer { /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java index 2c79ff5..9a28c36 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java @@ -11,13 +11,13 @@ import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioSocketChannel; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClient 客户端 */ @Slf4j -@Service +@Registry public final class SensorhubClient { public static void main(String[] args) throws Exception { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java index 9774be0..477c3f7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java @@ -6,12 +6,12 @@ import io.netty.channel.socket.SocketChannel; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientChannelInitialHandler */ -@Service +@Registry public class SensorhubClientChannelInitialHandler extends ChannelInitializer { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java index 346f4b3..73560e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java @@ -5,13 +5,13 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientHandler */ @Slf4j -@Service +@Registry public class SensorhubClientHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java index 5c1c6f2..d990af5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java @@ -4,12 +4,12 @@ import com.casic.missiles.pojo.Msg; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** * SensorhubServerHandler */ -@Service +@Component public class SensorhubServerHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 67283ae..af3172c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,41 +1,37 @@ package com.casic.missiles.parser; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultProtocolConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.*; +import com.casic.missiles.registry.FieldConfigRegistry; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; -import java.nio.charset.Charset; import java.util.HashMap; import java.util.List; import java.util.Map; -@Service("genericProtocolParser") +/** + * @author + */ +@Component("genericProtocolParser") @Slf4j -@AllArgsConstructor +@RequiredArgsConstructor public class GenericProtocolParser implements ProtocolParser { - private final LeadingCodeMatcher leadingCodeMatcher; private final List frameStructDispenserList; - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorInstanceSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; // 匹配首字母前导码=> 帧结构匹配前导码=> // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 @@ -44,18 +40,19 @@ public Boolean doParseProtocol(ByteBuf byteBuf) { String protocolContent = ByteBufUtil.hexDump(byteBuf); //匹配前导码 - List preCodeConfigs = leadingCodeMatcher.matchLeadingCode(protocolContent); + List preCodeConfigs = LeadingCodeMatcher.matchFrameLeadingCode(protocolContent); //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 if (preCodeConfigs.size() == 0) { - return rematch(byteBuf,protocolContent); + return rematch(byteBuf, protocolContent); } - //暂时先取第一个 + //暂时先取第一个,提升速度,使用享元模式, 减少类的创建销毁与构建 ProtocolConfig protocolConfig = preCodeConfigs.get(0); + AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); ByteBuf wholeDatagramByte = null; //通过匹配帧结构获取完整的数据包 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, preCodeConfigs.get(0))) != null) { + if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, protocolFactory)) != null) { break; } } @@ -68,76 +65,78 @@ * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 */ - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId, wholeDatagramByte); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap, protocolId); - //选取规则对应的流程实例 - DatagramEventConfig datagramEventConfig = processorInstanceSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); + //进行规则字段解析,进行匹配规则 + RuleConfig ruleConfig = getRuleConfig(protocolFactory, wholeDatagramByte); + if (ruleConfig == null) { + return false; + } //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, wholeDatagramByte); + ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte); + //以下进行业务的规则解析,同时选定流程实例 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); + DatagramEventProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain, + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText, protocolId); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain); //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); + datagramEventProvider.storeData(bizDataMap); return true; } - private Boolean rematch(ByteBuf byteBuf,String protocolContent) { + /** + * 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 + */ + private Boolean rematch(ByteBuf byteBuf, String protocolContent) { //重置位判断 byteBuf.resetReaderIndex(); //判断重置是否前移,如果没有前移,则直接判为匹配失败 if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { return false; } else { + //递归执行 return doParseProtocol(byteBuf); } } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; + //获取匹配规则->匹配规则 + private RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + //取出其中参与逻辑provider并判空 + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); + String rulePrepareFields = protocolConfig.getRulePrepareFields(); + //固定字段 + if (StringUtils.isNotEmpty(rulePrepareFields)) { + //获取统一固定字段解析 + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + //获取该协议的字段配置,用于协议规则匹配 + List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); + //获取规则 + RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, + rulePrepareFields, protocolFieldConfigs); + return ruleConfig; + } + return null; } - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + //数据构建,获取固定字段的store和业务字段store + private Map buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + Map bizDataMap = new HashMap<>(); + Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); + Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); + bizDataMap.putAll(ruleStoreObjectMap); + bizDataMap.putAll(protocolStoreObjectMap); return bizDataMap; } - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java index 8a46e32..16ce2e5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java @@ -3,6 +3,7 @@ import io.netty.buffer.ByteBuf; public interface ProtocolParser { + Boolean doParseProtocol(ByteBuf byteBuf); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java new file mode 100644 index 0000000..f7814af --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java @@ -0,0 +1,35 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.ProtocolConfigProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.ProtocolConfig; + +/** + * 存放基本协议的的加载信息 + */ +public class AbstractProtocolConfigFactory { + private final ProtocolConfigProvider protocolConfigProvider; + private final ProtocolFieldConfigProvider protocolFieldConfigProvider; + private final RuleConfigProvider ruleConfigProvider; + + public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { + this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); + this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); + this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); + } + + public ProtocolConfigProvider getProtocolConfigProvider() { + return protocolConfigProvider; + } + + public ProtocolFieldConfigProvider getProtocolFieldConfigProvider() { + return protocolFieldConfigProvider; + } + + public RuleConfigProvider getRuleConfigProvider() { + return ruleConfigProvider; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java new file mode 100644 index 0000000..6e36147 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java @@ -0,0 +1,57 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.CombinedFieldConfigProvider; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.FieldConfigProvider; +import com.casic.missiles.parser.provider.FieldRuleConfigProvider; + +/** + * 存放规则相关的的的加载信息 + */ +public class AbstractRuleConfigFactory { + + /** + * 处理字节 + */ + private final FieldConfigProvider fieldConfigProvider; + /** + * 处理组合字节解析的解码器 + */ + private final CombinedFieldConfigProvider combinedFieldConfigProvider; + /** + * 处理负责字节解析的规则配置 + */ + private final FieldRuleConfigProvider fieldRuleConfigProvider; + /** + * 处理实例流程 + */ + private final DatagramEventProvider datagramEventProvider; + + + public AbstractRuleConfigFactory(Long ruleId) { + this.fieldConfigProvider = new FieldConfigProvider(ruleId); + this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); + this.fieldRuleConfigProvider = new FieldRuleConfigProvider(ruleId); + this.datagramEventProvider = new DatagramEventProvider(ruleId); + } + + public FieldConfigProvider getFieldConfigProvider() { + return fieldConfigProvider; + } + + public CombinedFieldConfigProvider getCombinedFieldConfigProvider() { + return combinedFieldConfigProvider; + } + + public FieldRuleConfigProvider getFieldRuleConfigProvider() { + return fieldRuleConfigProvider; + } + + public DatagramEventProvider getDatagramEventProvider() { + return datagramEventProvider; + } + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java deleted file mode 100644 index 6e1719a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.factory; - - -import com.casic.missiles.pojo.ProtocolConfig; - -import java.util.List; - -/** - * 数据库访问优化(暂时未做) - *

- * 1、初始化协议解析配置,并存放到处存放缓存,对协议基本配置进行管理 - * 2、其中流程中所有的配置都经过此类进行管理,进行调用获取,增强解析速度 - */ -public interface DatagramFactory { - - /** - * 初始化 - */ - List datagramInit(); - - /** - * 根据前导码配置匹配,模糊匹配获取所有的报文项 - */ - List match(); - - /** - * 根据前导码匹配,返回报文项 - */ - List filer(); - - /** - * 保证数据的唯一性选择器 - */ - List selectOne(); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java new file mode 100644 index 0000000..87444a0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java @@ -0,0 +1,18 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +import java.util.List; + +/** + * 直接用,还是边用边创建 + */ +public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { + + + public DefaultProtocolConfigFactory(ProtocolConfig protocolConfig) { + super(protocolConfig); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java new file mode 100644 index 0000000..cce0c7c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java @@ -0,0 +1,12 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; + +public class DefaultRuleFactory extends AbstractRuleConfigFactory { + + public DefaultRuleFactory(Long ruleId) { + super(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java deleted file mode 100644 index 9ee97e0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.casic.missiles.parser.instance; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service -@Slf4j -@AllArgsConstructor -public class GeneralProcessor { - - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; - - /** - * 统一固定字段解析=>进行规则的查询的判断 - * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 - * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 - */ - @Deprecated - public boolean parseWholeDatagram(ByteBuf buffer, ProtocolConfig protocolConfig) { - try { - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap,protocolId); - //选取规则对应的流程= - DatagramEventConfig datagramEventConfig = processorSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); - //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); - //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); - //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); - //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); - //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); - return true; - } catch (Exception ex) { - log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", - ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); - return false; - } - } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; - } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); - } - - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); - return bizDataMap; - } - - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java index 25e7ad8..6a5777e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java @@ -1,23 +1,31 @@ package com.casic.missiles.parser.instance.impl; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.mapper.DatagramEventMapper; import com.casic.missiles.pojo.DatagramEventConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.SpringContextUtil; -@Service -@AllArgsConstructor +import java.util.List; +import java.util.Optional; + +/** + * @author cz + * + */ public class DefaultProcessorInstanceSelector implements ProcessorInstanceSelector { - private final DatagramEventMapper datagramEventMapper; + private static List datagramEventConfigs; + + static { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + datagramEventConfigs = datagramEventRegistry.getDatagramEventList(); + } @Override public DatagramEventConfig getProcessorInstance(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("rule_id", protocolId); - return datagramEventMapper.selectOne(queryWrapper); + Optional optionalSelectInstance = datagramEventConfigs.stream() + .filter(e -> e.getId().equals(protocolId)).limit(1).findFirst(); + return optionalSelectInstance.isPresent() ? optionalSelectInstance.get() : null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a778671..7b56a43 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,16 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import io.netty.buffer.ByteBuf; /** - * 分析匹配情况 - * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 - * 2、匹配不成功,有后续帧,可以进行下次匹配。 - * 3、匹配不成功,无后续帧,可以进行丢弃。 + * 分析匹配情况 + * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 + * 2、匹配不成功,有后续帧,可以进行下次匹配。 + * 3、匹配不成功,无后续帧,可以进行丢弃。 */ -public interface FrameStructMatcher{ +public interface FrameStructMatcher { - ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig); + ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 05320ab..8ebea78 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,23 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.ProtocolConfigMapper; +import com.casic.missiles.parser.provider.ProtocolConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Component; import java.util.List; import java.util.stream.Collectors; -@Component -@AllArgsConstructor public class LeadingCodeMatcher { - private final ProtocolConfigMapper protocolMapper; - //** 1、首字母匹配前导码, // 2、以匹配出的前导码是否在报文中条件进行前导码的匹配二次筛选 - public List matchLeadingCode(String protocolContent){ + public static List matchFrameLeadingCode(String protocolContent){ List initialConfigs = initialMatch(protocolContent); List preCodeConfigs = initialConfigs.stream() .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) @@ -26,13 +19,16 @@ } //初始化匹配前导码内容 - private List initialMatch(String protocolContent) { - String protocolStr = protocolContent.charAt(0) + ""; - QueryWrapper queryWrapper = new QueryWrapper() - .likeRight("pre_fix", protocolStr); - List protocolConfigList = protocolMapper.selectList(queryWrapper); - return protocolConfigList; + private static List initialMatch(String protocolContent) { + String firstFrameChar = protocolContent.charAt(0) + ""; + ProtocolConfigProvider protocolConfigProvider=new ProtocolConfigProvider(firstFrameChar); + return protocolConfigProvider.getMatchList(); } + + + + + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index cf2113d..e915877 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -1,32 +1,35 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(0) -@Service +@Component public class FrameLengthMatcher implements FrameStructMatcher { - @Autowired - private FieldParser fieldParser; - //超过长度 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { String dataGramContent = ByteBufUtil.hexDump(byteBuf); - if (StringUtils.isEmpty(protocolConfig.getUnpackId()) && StringUtils.isEmpty(protocolConfig.getTailStr())) { - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + //当不存在结尾标志和拆包标志,可以直接使用长度进行匹配 + if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { if (dataGramContent.length() >= totalLength) {//等于长度返回true,超出长度,切断 - ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, protocolConfig, totalLength); + ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, totalLength); return wholeDatagramByte; } else { //读的标志位前移舍弃 @@ -38,7 +41,7 @@ return null; } - private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, Integer totalLength) { byteBuf.readBytes(totalLength); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, totalLength - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 2bfc213..d527ad0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; @@ -13,7 +13,7 @@ import lombok.AllArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.nio.charset.Charset; import java.util.Map; @@ -22,32 +22,30 @@ * 后续标志验证 */ @Order(1) -@Service +@Component @AllArgsConstructor -public class FrameMarkMatcher implements FrameStructMatcher { - - private final FieldConfigDao fieldConfigDao; - private final FieldParser fieldParser; - private final FieldResolver fieldResolverManger; +public class FrameMarkMatcher implements FrameStructMatcher, FixedPropertyEnum { //帧后续标志=>结束,进行帧的重组=>有后续,1、帧移位判别 2、继续接收帧 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig UnpackConfig = StringUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getUnpackId()); - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); - Integer upback = 0; + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); ByteBuf mergeWholeFrameByte = null; - if (!ObjectUtil.isEmpty(UnpackConfig)) { - while (hasNextFullFrame(byteBuf, protocolConfig)) { - upback = (Integer) fieldResolverManger.filedParserManger(byteBuf, UnpackConfig, null); + if (!ObjectUtil.isEmpty(unpackFlag)) { + while (hasNextFullFrame(byteBuf, protocolConfig, protocolFieldConfigProvider)) { //是否存在后续位 - if (upback == 1) {//使用esayRule + if (unpackFlag == 1) {//使用esayRule //表示可以截取 - mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolConfig, totalLength); + mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolFieldConfigProvider, protocolConfig); return mergeWholeFrameByte; } else { - byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig)); + byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig, protocolFieldConfigProvider)); } } } @@ -56,7 +54,8 @@ //选取第一个帧,将业务内容和后面部分分开 //计算数据报文-业务内容 - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolFieldConfigProvider protocolFieldConfigProvider, ProtocolConfig protocolConfig) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); //截取完整报文 byteBuf.readBytes(totalLength); ByteBuf byteBufContent = byteBuf.slice(0, byteBuf.readerIndex()); @@ -68,15 +67,15 @@ String tail = ""; System.out.println(ByteBufUtil.hexDump(byteBufContent)); //会存在多个帧拼接在一起的的情况,进行合并处理 - while (hasNextFullFrame(byteBufContent, protocolConfig)) { - Integer currentFrameLength = fieldParser.getTotalLength(protocolConfig, byteBufContent); + while (hasNextFullFrame(byteBufContent, protocolConfig, protocolFieldConfigProvider)) { + Integer currentFrameLength = protocolFieldConfigProvider.getTotalLength(byteBufContent, protocolConfig); byteBufContent.readBytes(currentFrameLength); ByteBuf currentbyteBuf = byteBufContent.slice(0, byteBufContent.readerIndex()); byteBufContent.markReaderIndex();//读的标志位前移 System.out.println(ByteBufUtil.hexDump(byteBufContent)); String hexDump = currentbyteBuf.toString(Charset.forName("ISO-8859-1")); //获取当前固定帧结构的关系map - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, currentbyteBuf); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(currentbyteBuf, protocolConfig); if (StringUtils.isEmpty(mergeFrameStr)) { //首次获取业务数据报文 mergeFrameStr += hexDump.substring(0, currentFrameFixedProperty.get("tailPosition")); @@ -95,22 +94,22 @@ /** * 获取平移到下一帧起始位置 */ - public int getNextFrameOffset(ByteBuf buffer, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, buffer); - return currentFrameFixedProperty.get("totalLength"); + public int getNextFrameOffset(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + return currentFrameFixedProperty.get(TOTAL_LENGTH); } /** * 判断是否出错进行整个帧的 */ - public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, byteBuf); + public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); //保证读取位置不在固定位置,是可变的业务内容 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("fixedPosition")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(FIXED_POSITION)) { return false; } //判断读取是否操作帧长度 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("totalLength")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(TOTAL_LENGTH)) { return false; } return true; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 76a3784..c3a1bab 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -1,50 +1,50 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.parser.instance.GeneralProcessor; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; +import io.netty.buffer.ByteBufUtil;; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(2) -@Service +@Component public class FrameTailMatcher implements FrameStructMatcher { - @Resource - private FieldConfigDao fieldConfigDao; - @Autowired - private GeneralProcessor generalProcessor; - //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig tailFieldConfig = StringUtils.isEmpty(protocolConfig.getTailStr()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getTailStr()); - if (!ObjectUtil.isEmpty(tailFieldConfig)) { - String tailStr = tailFieldConfig.getFieldName(); + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfig protocolFieldConfig = ObjectUtils.isEmpty(protocolConfig.getTailStr()) ? null : + fieldConfigProvider.getFieldConfigById(protocolConfig.getTailStr()); + if (!ObjectUtil.isEmpty(protocolFieldConfig)) { + String tailStr = protocolFieldConfig.getFieldName(); String dataGramContent = ByteBufUtil.hexDump(byteBuf); Boolean tailFlag = ByteBufUtil.hexDump(byteBuf).contains(tailStr); if (!tailFlag) { //使用esayRule return null; } else if (dataGramContent.indexOf(tailStr) < dataGramContent.length() - tailStr.length()) { Integer length = dataGramContent.indexOf(tailStr) + tailStr.length(); - ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, protocolConfig, length); + ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, length); return wholeDatagramByte; //存在粘包 } } return null; } - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer length) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, Integer length) { byteBuf.readBytes(length); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, length - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java new file mode 100644 index 0000000..5f1c177 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java @@ -0,0 +1,73 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.combined.GenericCombinedFieldResolver; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.CombinedFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class CombinedFieldConfigProvider { + + + /** + * 作为临时配置列表缓存使用 + */ + private final List combinedFieldConfigList; + private Map storeObjectMap = new HashMap<>(); + + public CombinedFieldConfigProvider(Long ruleId) { + CombinedFieldConfigRegistry combinedFieldConfigRegistry = SpringContextUtil.getBean(CombinedFieldConfigRegistry.class); + combinedFieldConfigList = combinedFieldConfigRegistry.getCombinedFieldConfigList(ruleId); + } + + public void parseDataField(RuleConfig ruleConfig, String clearZeroPlain,Map fieldConfigsMap ) { + if (showSkip()) { + return; + } + //匹配对应的数据,然后进行相关的字段解析 + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver(); + combinedFieldResolver.parseDataField(combinedFieldConfigList, byteBuf, storeObjectMap,fieldConfigsMap); + } + + + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getCombinedFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return combinedFieldConfigList.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public List getCombinedFieldConfigList() { + return combinedFieldConfigList; + } + + /* 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(combinedFieldConfigList) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java new file mode 100644 index 0000000..f3cfedc --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java @@ -0,0 +1,11 @@ +package com.casic.missiles.parser.provider; + +/** + * @author cz + * @date 2023-6-12 + */ +public class CommandEventProvider{ + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java new file mode 100644 index 0000000..70eec5e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java @@ -0,0 +1,77 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.safe.SafeStrategy; +import com.casic.missiles.parser.sender.DataSubscribeProvider; +import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class DatagramEventProvider { + + private final DatagramEventConfig processorInstance; + + public DatagramEventProvider(Long ruleId) { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + List datagramEventConfigList = + datagramEventRegistry.getDatagramEventList(ruleId); + processorInstance = this.getProcessorInstance(datagramEventConfigList); + } + + public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { + if (showSkip()) { + return null; + } + return datagramEventConfigList.get(0); + } + + // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 + public String getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap) { + String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? + processorInstance.getSafeBean() : + fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); + if (!StringUtils.isEmpty(safeName)) { + //需要加密 + SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); + String plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); + return clearComplementZero(plain); + } + return ByteBufUtil.hexDump(bizDataContent); + } + + //解密清零操作 + private String clearComplementZero(String plain) { + plain = plain.substring(0, plain.lastIndexOf("00")); + return plain; + } + + //数据发送,数据发送者暂未构建 + public void storeData(Map bizDataMap) { + DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); +// dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return ObjectUtils.isNotEmpty(processorInstance) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java new file mode 100644 index 0000000..7e1fe0a --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java @@ -0,0 +1,97 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.FieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class FieldConfigProvider { + + + private final List fieldConfigs; + private Map storeObjectMap = new HashMap<>(); +// private Map singleObjects = new ConcurrentHashMap<>(); + + public FieldConfigProvider(Long ruleId) { + FieldConfigRegistry fieldConfigRegistry = SpringContextUtil.getBean(FieldConfigRegistry.class); + fieldConfigs = fieldConfigRegistry.getFieldConfigList(ruleId); + } + + public List getFieldConfigs() { + return fieldConfigs; + } + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public Map parseDataField(RuleConfig ruleConfig, String clearZeroPlain) { + if (showSkip()) { + return null; + } + List prepareFieldConfig = prepareParseField(ruleConfig); + if (CollectionUtils.isNotEmpty(prepareFieldConfig)) { + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(fieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + return fixDataMap; + } + } + return null; + } + + /** + * 得到需要处理的业务内容 + * + * @return + */ + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return fieldConfigs.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public Map getFieldConfigsMap() { + return fieldConfigs.stream().collect( + Collectors.toMap(FieldConfig::getId, e -> e) + ); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(fieldConfigs) ? false : true; + } + + +} + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java new file mode 100644 index 0000000..817bfaf --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java @@ -0,0 +1,19 @@ +package com.casic.missiles.parser.provider; + +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.registry.FieldRuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; + +public class FieldRuleConfigProvider { + + private final List fieldRuleConfigList; + + public FieldRuleConfigProvider(Long ruleId) { + FieldRuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(FieldRuleConfigRegistry.class); + fieldRuleConfigList = ruleConfigRegistry.getFieldRuleConfigList(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java new file mode 100644 index 0000000..99a1b06 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java @@ -0,0 +1,53 @@ +package com.casic.missiles.parser.provider; + + +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.registry.ProtocolConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolConfigProvider { + + private final List protocolConfigList; + + public ProtocolConfigProvider(String firstChar) { + ProtocolConfigRegistry registry = SpringContextUtil.getBean(ProtocolConfigRegistry.class); + protocolConfigList = registry.getProtocolConfigList(firstChar); + } + + public List getMatchList() { + return protocolConfigList; + } + + /** + * 设置当前协议 + * + * @param protocolConfig + */ + public ProtocolConfigProvider(ProtocolConfig protocolConfig) { + List protocolConfigs = new ArrayList<>(); + protocolConfigs.add(protocolConfig); + protocolConfigList = protocolConfigs; + } + + /** + * 获取当前协议 + * + * @return + */ + public ProtocolConfig getCurrentProtocolConfig() { + if (this.protocolConfigList == null) { + return null; + } else { + return protocolConfigList.get(0); + } + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java new file mode 100644 index 0000000..043927d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java @@ -0,0 +1,213 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.registry.ProtocolFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolFieldConfigProvider { + + private static final String FIXED_FIELD_DS = "fixedFieldDs"; + private static final String CONTENT_FIELD_DS = "contentFieldDs"; + private static final String PROTOCOL_LENGTH = "protocolLength"; + private static final String PROTOCOL_FIELD_ID = "protocolFieldId"; + private static final String PROTOCOL_POSITION = "protocolPosition"; + + private final List protocolFieldConfigs; + private Map singleObjects = new ConcurrentHashMap<>(); + private Map storeObjectMap = new HashMap<>(); + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public ProtocolFieldConfigProvider(Long protocolId) { + ProtocolFieldConfigRegistry protocolFieldConfigRegistry = SpringContextUtil.getBean(ProtocolFieldConfigRegistry.class); + protocolFieldConfigs = protocolFieldConfigRegistry.getProtocolFieldConfigList(protocolId); + } + + public List getProtocolFieldConfigs() { + return protocolFieldConfigs; + } + + public ProtocolFieldConfig getFieldConfigById(Long fieldId) { + Optional optionalConfig = protocolFieldConfigs.stream().filter( + e -> e.getId().equals(fieldId) + ).findFirst(); + return optionalConfig.isPresent() ? optionalConfig.get() : null; + } + + public Integer getProtocolFieldValue(Long protocolFieldId, ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_FIELD_ID + protocolFieldId + ByteBufUtil.hexDump(byteBuf); + //获取缓存 + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + //加载固定长度数据集合 + Map fixDataMap = this.getProtocolDataMap(byteBuf); + ProtocolFieldConfig protocolFieldConfig = selectFieldConfig(protocolFieldId); + Integer protocolFieldValue = 0; + //获取约定字段的总长度 + if (fixDataMap.containsKey(protocolFieldConfig.getFieldName())) { + Object appointUnpackObject = fixDataMap.get(protocolFieldConfig.getFieldName()); + if (ObjectUtils.isNotEmpty(appointUnpackObject)) { + protocolFieldValue = (Integer) appointUnpackObject; + } + } + if (protocolFieldValue != null) { + //加入缓存 + if (ObjectUtils.isNotEmpty(protocolFieldValue)) { + this.singleObjects.put(catchKey, protocolFieldValue); + return protocolFieldValue; + } + } + return null; + } + + /** + * 获取帧固定位置信息 + * + * @param byteBuf + * @param protocolConfig + * @return + */ + public Map getFixedProperty(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_POSITION + protocolConfig.getId(); + if (this.singleObjects.containsKey(catchKey)) { + return (Map) singleObjects.get(catchKey); + } + Map fixedPropertyMap = new HashMap<>(); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + fixedPropertyMap = fieldParser.doGetFixedProperty(protocolFieldConfigs, this.getTotalLength(byteBuf,protocolConfig)); + if (CollectionUtils.isNotEmpty(fixedPropertyMap)) { + this.singleObjects.put(catchKey, fixedPropertyMap); + return fixedPropertyMap; + } + return fixedPropertyMap; + } + + /** + * 获取帧结构应有的总长度 + */ + public Integer getTotalLength(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_LENGTH + ByteBufUtil.hexDump(byteBuf); + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + Integer appointFrameLength = getProtocolFieldValue(protocolConfig.getTotalLengthId(), byteBuf); + if (appointFrameLength != null) { + //获取过滤的字段集合总长度 + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Integer totalFilterLength = fieldParser.getTotalFilterLength(protocolConfig, byteBuf, getFixFieldConfigMap()); + //计算总长度 + Integer totalLength = appointFrameLength + totalFilterLength; + //加入缓存 + if (ObjectUtils.isNotEmpty(totalLength)) { + this.singleObjects.put(catchKey, totalLength); + return totalLength; + } + } + return null; + } + + /** + * 获取协议有关字段解析内容 + * storeObjectMap存储代转存的数据 + * + * @return + */ + public Map getProtocolDataMap(ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(FIXED_FIELD_DS)) { + return (Map) singleObjects.get(FIXED_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(protocolFieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + this.singleObjects.put(FIXED_FIELD_DS, fixDataMap); + return fixDataMap; + } + return null; + } + + /** + * 获取业务报文内容的content字节 + * + * @param wholeDatagramByte + * @return + */ + public ByteBuf getDataContentBuf(ByteBuf wholeDatagramByte) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(CONTENT_FIELD_DS)) { + return (ByteBuf) singleObjects.get(CONTENT_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + ByteBuf bizDataByteBuf = fieldParser.getDataContentBuf(protocolFieldConfigs, wholeDatagramByte); + if (bizDataByteBuf != null) { + this.singleObjects.put(CONTENT_FIELD_DS, bizDataByteBuf); + return bizDataByteBuf; + } + return null; + } + + + private ProtocolFieldConfig selectFieldConfig(Long id) { + Optional optionalProtocolFieldConfig = this.protocolFieldConfigs.stream().filter( + e -> e.getId().equals(id) + ).findFirst(); + return optionalProtocolFieldConfig.isPresent() ? optionalProtocolFieldConfig.get() : null; + } + + + private Map getFixFieldConfigMap() { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, e -> e) + ); + return fixDataFieldMap; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(protocolFieldConfigs) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java new file mode 100644 index 0000000..dafba1c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java @@ -0,0 +1,56 @@ +package com.casic.missiles.parser.provider; + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.rule.GenericRuleResolver; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.RuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleConfigProvider { + + private final List ruleConfigs; + + public List getRuleConfigs() { + return ruleConfigs; + } + + public RuleConfigProvider(Long protocolId) { + RuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(RuleConfigRegistry.class); + ruleConfigs = ruleConfigRegistry.getRuleConfigById(protocolId); + } + + /** + * 获取规则匹配结果 + * + * @param parseFixedDataMap + * @param protocolFieldConfigs + * @return + */ + public RuleConfig doGetRule(Map parseFixedDataMap, + String ids, + List protocolFieldConfigs) { + if (showSkip()) { + return null; + } + RuleConfig ruleConfig = GenericRuleResolver.machRule(parseFixedDataMap, ids, protocolFieldConfigs, ruleConfigs); + return ruleConfig; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(ruleConfigs) ? false : true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java index 3c05891..856b399 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java @@ -1,18 +1,11 @@ package com.casic.missiles.parser.resolver; -import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.springframework.web.bind.annotation.RequestBody; -import javax.annotation.Resource; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -20,19 +13,17 @@ @Slf4j public class ByteMergeProvider { - @Resource - private FieldRuleEngineMapper fieldRuleEngineMapper; - //拿到所有的值合并到一个值 - public String resolveByteMerge(List valueList, String ruletypeId, String vaildRange) { + public static String resolveByteMerge(List valueList, String ruleTypeId, String vaildRange) { String values = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Map vaildMap = getValidRangeMap(vaildRange); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(ruletypeId); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } + //暂时不处理 +// fieldRuleEngine = fieldRuleConfigMapper.selectById(ruleTypeId); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } Map env2 = new HashMap(); for (int i = 0; i < valueList.size(); i++) { if (vaildMap.containsKey(i)) { @@ -47,7 +38,7 @@ } } - private Map getValidRangeMap(String vaildRange) { + private static Map getValidRangeMap(String vaildRange) { String[] range = vaildRange.split(","); Map vaildMap = new HashMap(); for (int i = 0; i < range.length; i++) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 8d821cd..85d6bbf 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -1,9 +1,12 @@ package com.casic.missiles.parser.resolver; +import com.casic.missiles.pojo.AbstractFieldConfig; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; import io.netty.buffer.ByteBuf; +import java.util.List; import java.util.Map; /** @@ -11,18 +14,14 @@ */ public interface FieldParser { -// Map fieldProcess(String protocolContent,); - Map dataParser(RuleConfig ruleConfig, String lightText,String protocolId); + Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength); - Map fixDataParser(String protocolId, ByteBuf buffer); + Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap); - Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf); + ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer); - ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer); - - ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer); - - Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer); + Integer getTotalFilterLength(ProtocolConfig protocolConfig, ByteBuf byteBuf, Map protocolFieldConfigMap); } + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java new file mode 100644 index 0000000..9e0c00e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java @@ -0,0 +1,52 @@ +package com.casic.missiles.parser.resolver; + +import com.casic.missiles.pojo.AbstractFieldConfig; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.util.List; + +public class FieldParserSupport { + + //分别计算bit和byte长度=> 合并长度 + protected Integer calculateLength(List fieldConfigList) { + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + Integer fixedLength = bytefixedLength + bitfixedLength / 8; + return fixedLength; + } + + //找到最大值=> 根据最大值计算业务数据下标 + protected Integer calculatePosition(List fieldConfigList) { + String rex = "[0-9]+"; + Integer max = -1; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) + && Integer.valueOf(fieldConfig.getOriginPositionByte()) > max) { + max = Integer.valueOf(fieldConfig.getOriginPositionByte()); + } + } + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) && fieldConfig.getOriginPositionByte().equals(max)) { + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + } + } + Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; + return maxFixedPosition; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java deleted file mode 100644 index dd3a6cd..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java +++ /dev/null @@ -1,170 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.ByteResolverParam; -import io.netty.buffer.ByteBuf; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -/** - * 字段解析管理总类 - */ -@Service -@Slf4j -@AllArgsConstructor -public class FieldResolver extends ByteMergeProvider { - - //1、字段截取 => 2、简单的字节解析和复杂的字节解析 - public Object filedParserManger(ByteBuf byteBuf, FieldConfig fieldConfig, Integer maxFixedPosition) { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - //最大固定位置不为空, - if (!ObjectUtil.isEmpty(maxFixedPosition)) { - orignPosition -= maxFixedPosition; - } - Object fieldValue = 0; - //待优化 - if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { - fieldValue = bitToResolver(byteBuf, fieldConfig); - } else { - ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); - fieldValue = parsingFields(fieldBytes, fieldConfig.getRuleJson()); - } - return fieldValue; - } - - //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, - //目前默认配置的规则设置暂不支持配置化,由实现完成 - private Object parsingFields(ByteBuf byteBuf, String ruleJson) { - Object fieldsResolveValue = null; - List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); - if (ObjectUtil.isEmpty(ruleMapList)) { - fieldsResolveValue = defaultResolveBuilder(byteBuf); - } else { - fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); - } - return fieldsResolveValue; - } - - private Object defaultResolveBuilder(ByteBuf byteBuf) { - Integer defaultResolveValue = 0; - for (int i = 0; i < byteBuf.writerIndex(); i++) { - defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; - } - return defaultResolveValue; - } - - //字段解析构建器(针对字节单位的) - //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 - // 字节归并结束或者规则结束=>继续根据规则进行判断 - private Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { - Object customizeResolveValue = null; - try { - List bytStrList = new ArrayList<>(); - //存放到数组里面 - for (int i = 0; i < byteBuf.writerIndex(); i++) { - bytStrList.add(byteBuf.readByte()); - } - int i = 0; - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - customizeResolveValue = this.resolveByteMerge(bytStrList, ruletypeId,vaildRange); - break; - } else { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - List tempBytStr = new ArrayList<>(); - for (int k = 0; i < bytStrList.size(); i++) { - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(k) - .value(bytStrList.get(k)) - .ruletypeId(ruletypeId).build(); - tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); - } - bytStrList = tempBytStr; - } - i++; - } - //字节归并到一起=>继续根据规则进行判断 - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(customizeResolveValue) - .ruletypeId(ruletypeId).build(); - customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(customizeResolveValue)); - return customizeResolveValue; - } catch (RuntimeException ex) { - log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); - return null; - } - } - - /** - * 1、单个字节情况表示字段 - * 2、多字节情况表示字段(暂未处理) - */ - private Object bitToResolver(ByteBuf byteBuf, FieldConfig fieldConfig) { - Object fieldValue = new Object(); - try { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - byte fields = 0x00; - if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); - } else { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); - } - - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { - if (!StringUtils.isEmpty(fieldConfig.getExactOrignPosition())) { - fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getExactOrignPosition())).byteValue() - >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); - } else { - fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); - } - } else { - fieldValue = Integer.valueOf(fields & 0xff); - } - if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { - return fieldValue; - } - List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); - int i = 0; - //字节归并到一起=>继续根据规则进行判断 - while (i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(fieldValue) - .ruletypeId(ruletypeId).build(); - fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(fieldValue)); - return fieldValue; - } catch (RuntimeException ex) { - log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); - return null; - } - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java new file mode 100644 index 0000000..1d2aeab --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java @@ -0,0 +1,36 @@ +package com.casic.missiles.parser.resolver.bytes; + +import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.mapper.FieldRuleConfigMapper; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.pojo.ByteResolverParam; +import com.googlecode.aviator.AviatorEvaluator; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; +//转换规则 +@Component("convert") +@AllArgsConstructor +@Slf4j +public class ByteRuleResolver implements ByteResolver { + + private final FieldRuleConfigMapper fieldRuleConfigMapper; + + @Override + public Object resolveOperationRule(ByteResolverParam byteResolverParam){ + FieldRuleConfig fieldRuleEngine=fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); + if(ObjectUtil.isEmpty(fieldRuleEngine)){ + return byteResolverParam.getValue(); + } + String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); + Map env2 = new HashMap(); + env2.put("value", (byte) byteResolverParam.getValue()); + String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); + return values; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java index 103821c..786b71c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java @@ -2,34 +2,34 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("logicalShift") +@Component("logicalShift") @AllArgsConstructor @Slf4j public class LogicalShiftResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //字节位移 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { Integer index = byteResolverParam.getIndex(); - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return byteResolverParam.getValue(); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java index 476747d..01149bd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("operation") +@Component("operation") @AllArgsConstructor @Slf4j public class OperationResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //混合运算,有常量或者乘除的缩放 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java index 0b82cf4..79abcce 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.casic.missiles.pojo.ByteResolverParam; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; //精度计算 -@Service("precision") +@Component("precision") @AllArgsConstructor @Slf4j public class PrecisionResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java deleted file mode 100644 index 5c3f332..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; -//转换规则 -@Service("convert") -@AllArgsConstructor -@Slf4j -public class RuleResolver implements ByteResolver { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam){ - RuleEvaluator fieldRuleEngine=fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); - if(ObjectUtil.isEmpty(fieldRuleEngine)){ - return byteResolverParam.getValue(); - } - String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); - Map env2 = new HashMap(); - env2.put("value", (byte) byteResolverParam.getValue()); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java new file mode 100644 index 0000000..d3bbd91 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java @@ -0,0 +1,15 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; + +import java.util.List; +import java.util.Map; +// 前导码匹配->长度字段 +public interface AbstractCombinedFieldProcessor { + + Map invoke(Map map, ByteBuf byteBuf, List combinedFieldConfigList, + Map fieldConfigsMap, Map storeObjectMap); + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java new file mode 100644 index 0000000..03c8480 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java @@ -0,0 +1,59 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-13 + */ +//依次递增进行数据的解析, +public class GenericCombinedFieldResolver { + + + //通过查询,字段长度长度随机 + public void parseDataField(List combinedFieldConfigList, ByteBuf byteBuf, + Map storeObjectMap, Map fieldConfigsMap) { + Integer frameLength = Integer.valueOf(ByteBufUtil.hexDump(byteBuf)); + //添加前置处理器 + com.casic.missiles.util.ClassUtil classUtil = new com.casic.missiles.util.ClassUtil(); + List abstractCombinedProcessors = classUtil.getSubClassList(AbstractCombinedFieldProcessor.class); + + Map fieldFixedMap = combinedFieldLeadCodeMap(combinedFieldConfigList); + //frameLength + Map combinedProcessorFields = null; + while (byteBuf.readableBytes() < frameLength) { + //一直处理 + for (AbstractCombinedFieldProcessor abstractCombinedProcessor : abstractCombinedProcessors) { + combinedProcessorFields = abstractCombinedProcessor.invoke(combinedProcessorFields, byteBuf, + combinedFieldConfigList, + fieldConfigsMap, storeObjectMap); + if (combinedProcessorFields == null || byteBuf.readableBytes() < frameLength) { + return; + } + } + + } + } + + /** + * 取出前导码匹配集合 + */ + private Map combinedFieldLeadCodeMap(List combinedFieldConfigList) { + Map fieldFixedMap = combinedFieldConfigList + .stream() + .collect(Collectors.toMap(CombinedFieldConfig::getPrefixCode, e -> e)); + return fieldFixedMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java new file mode 100644 index 0000000..643a934 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java @@ -0,0 +1,100 @@ +package com.casic.missiles.parser.resolver.fields; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.FieldParserSupport; +import com.casic.missiles.pojo.*; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 保存使用时最基本的信息,并且使用原型模式 + */ +@Slf4j +public class DefaultProtocolFieldParser extends FieldParserSupport implements FieldParser, FixedPropertyEnum { + + //通过传入的配置和报文进行字段解析 + @Override + public Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap) { + Map dataMap = new HashMap<>(); + for (AbstractFieldConfig protocolFieldConfig : protocolFieldConfigs) { + if (!ObjectUtils.isEmpty(protocolFieldConfig.getOriginPositionByte())) { + Object fieldValue = FieldResolver.parseField(buffer, protocolFieldConfig, null); + if (protocolFieldConfig.getIsStorage() == 1) { + storeObjectMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + dataMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + } + return dataMap; + } + + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength) { + Map fixedPropertyMap = new HashMap<>(); + Integer fixedLength = calculateLength(protocolFieldConfigs); + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + fixedPropertyMap.put(FIXED_POSITION, maxFixedPosition); + fixedPropertyMap.put(TOTAL_LENGTH, totalLength); + fixedPropertyMap.put(TAIL_POSITION, totalLength - fixedLength + maxFixedPosition); + return fixedPropertyMap; + } + + //** 获取业务内容的byteBuf + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer) { + //计算固定长度 + Integer fixedLength = calculateLength(protocolFieldConfigs); + //总长度获取 + String lightText = buffer.toString(Charset.forName("ISO-8859-1")); + Integer totalLength = lightText.length(); + //计算固定长度最大长度 + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + //计算数据报文内容 + ByteBuf bizDataFields = buffer.slice(maxFixedPosition - 1, (totalLength - fixedLength)); + return bizDataFields; + } + + /** + * 获取过滤字段的长度 + */ + @Override + public Integer getTotalFilterLength(ProtocolConfig protocolConfig, + ByteBuf byteBuf, + Map protocolFieldConfigMap) { + if (ByteBufUtil.hexDump(byteBuf).equals("")) { + return 0; + } + int totalFilterLength = 0; + String filterFields = protocolConfig.getTotalLengthFilterFields(); + try { + if (!StringUtils.isEmpty(filterFields)) { + String[] filterFieldList = filterFields.split(","); + for (String filterFieldId : filterFieldList) { + if (StringUtils.isNotEmpty(filterFieldId)) { + ProtocolFieldConfig fieldConfig = protocolFieldConfigMap.get(Long.valueOf(filterFieldId)); + //这里都是按字节计算,没有对位进行区分,可能会出现错误 + // 如果对位有需求,需要进一步跟进 + totalFilterLength += fieldConfig.getOffsetLength(); + } + } + } + return totalFilterLength; + } catch (Exception ex) { + log.error("报文确认分发阶段,获取报文总长度过滤长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); + } + return totalFilterLength; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java new file mode 100644 index 0000000..d51e887 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java @@ -0,0 +1,169 @@ +package com.casic.missiles.parser.resolver.fields; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.parser.resolver.ByteMergeProvider; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.AbstractFieldConfig; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.pojo.ByteResolverParam; +import io.netty.buffer.ByteBuf; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * 字段解析管理总类 + */ +@Slf4j +public class FieldResolver extends ByteMergeProvider { + + //1、字段截取 => 2、简单的字节解析和复杂的字节解析 + public static Object parseField(ByteBuf byteBuf,AbstractFieldConfig fieldConfig, Integer maxFixedPosition) { + Integer orignPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + //最大固定位置不为空, + if (!ObjectUtil.isEmpty(maxFixedPosition)) { + orignPosition -= maxFixedPosition; + } + Object fieldValue = 0; + //待优化 + if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { + fieldValue = doParseBitField(byteBuf, fieldConfig); + } else { + ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); + fieldValue = doParseByteField(fieldBytes, fieldConfig.getRuleJson()); + } + return fieldValue; + } + + //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, + //目前默认配置的规则设置暂不支持配置化,由实现完成 + private static Object doParseByteField(ByteBuf byteBuf, String ruleJson) { + Object fieldsResolveValue = null; + List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); + if (ObjectUtil.isEmpty(ruleMapList)) { + fieldsResolveValue = defaultResolveBuilder(byteBuf); + } else { + fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); + } + return fieldsResolveValue; + } + + private static Object defaultResolveBuilder(ByteBuf byteBuf) { + Integer defaultResolveValue = 0; + for (int i = 0; i < byteBuf.writerIndex(); i++) { + defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; + } + return defaultResolveValue; + } + + //字段解析构建器(针对字节单位的) + //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 + // 字节归并结束或者规则结束=>继续根据规则进行判断 + private static Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { + Object customizeResolveValue = null; + try { + List bytStrList = new ArrayList<>(); + //存放到数组里面 + for (int i = 0; i < byteBuf.writerIndex(); i++) { + bytStrList.add(byteBuf.readByte()); + } + int i = 0; + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { + if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + customizeResolveValue = resolveByteMerge(bytStrList, ruletypeId, vaildRange); + break; + } else { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + List tempBytStr = new ArrayList<>(); + for (int k = 0; i < bytStrList.size(); i++) { + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(k) + .value(bytStrList.get(k)) + .ruletypeId(ruletypeId).build(); + tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); + } + bytStrList = tempBytStr; + } + i++; + } + //字节归并到一起=>继续根据规则进行判断 + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(null) + .value(customizeResolveValue) + .ruletypeId(ruletypeId).build(); + customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); + i++; + } + System.out.println(JSON.toJSON(customizeResolveValue)); + return customizeResolveValue; + } catch (RuntimeException ex) { + log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); + return null; + } + } + + /** + * 1、单个字节情况表示字段 + * 2、多字节情况表示字段(暂未处理) + */ + private static Object doParseBitField(ByteBuf byteBuf,AbstractFieldConfig fieldConfig) { + Object fieldValue = new Object(); + try { + Integer orignPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + byte fields = 0x00; + if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { + fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); + } else { + fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); + } + + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { + if (!StringUtils.isEmpty(fieldConfig.getOriginPositionBit())) { + fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getOriginPositionBit())).byteValue() + >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); + } else { + fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); + } + } else { + fieldValue = Integer.valueOf(fields & 0xff); + } + if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { + return fieldValue; + } + List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); + int i = 0; + //字节归并到一起=>继续根据规则进行判断 + while (i < ruleMapList.size()) { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(null) + .value(fieldValue) + .ruletypeId(ruletypeId).build(); + fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); + i++; + } + System.out.println(JSON.toJSON(fieldValue)); + return fieldValue; + } catch (RuntimeException ex) { + log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); + return null; + } + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java deleted file mode 100644 index 35ae3d0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java +++ /dev/null @@ -1,183 +0,0 @@ -package com.casic.missiles.parser.resolver.fields; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufAllocator; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; -import org.springframework.util.ObjectUtils; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service("standard") -@AllArgsConstructor -@Slf4j -public class StandardFieldParser implements FieldParser { - - private final FieldConfigDao fieldConfigDao; - private final FieldResolver fieldResolver; - - //数据解析 - @Override - public Map dataParser(RuleConfig ruleConfig, String lightText, String protocolId) { - String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); - ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); - bufferContent.writeBytes(lightText.getBytes(Charset.forName("ISO-8859-1"))); - Map dataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - for (String dataFieldId : dataFieldIds) { - FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(dataFieldId); - if (!ObjectUtils.isEmpty(fieldConfig)) { - dataMap.put(fieldConfig.getFieldName(), String.valueOf(fieldResolver.filedParserManger(bufferContent, fieldConfig, maxFixedPosition))); - } - } - return dataMap; - } - - //数据解析 - @Override - public Map fixDataParser(String protocolId, ByteBuf buffer) { - List dataFieldIdList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Map dataMap = new HashMap<>(); - for (FieldConfig dataField : dataFieldIdList) { - if (!ObjectUtils.isEmpty(dataField.getOrignPosition())) { - Object fieldValue = (Integer) fieldResolver.filedParserManger(buffer, dataField, null); - dataMap.put(dataField.getFieldName(), fieldValue); - } - } - return dataMap; - } - - @Override - public Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf) { - if (ByteBufUtil.hexDump(byteBuf).equals("")) { - return 0; - } - String filterFields = protocolConfig.getTotalLengthFilterField(); - Integer totalLength = 0; - try { - FieldConfig totalFieldConfig = fieldConfigDao.getFieldConfigById(protocolConfig.getTotalLengthId()); - int totalFilterLength = 0; - if (!StringUtils.isEmpty(filterFields)) { - String[] filterFieldList = filterFields.split(","); - for (String filterField : filterFieldList) { - FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(filterField); - //这里都是按字节计算,没有对位进行区分,可能会出现错误 - - // 如果对位有需求,需要进一步跟进 - totalFilterLength += fieldConfig.getOffsetLength(); - } - } - totalLength = (Integer) fieldResolver.filedParserManger(byteBuf, totalFieldConfig, null) + totalFilterLength; - } catch (Exception ex) { - log.error("报文确认分发阶段,获取报文总长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); - } - return totalLength; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer) { - //业务内容 - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - String protocolId = String.valueOf(protocolConfig.getId()); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - //计算固定长度 - Integer fixedLength = calculateLength(fieldConfigList); -// Integer totalLength = this.getTotalLength(protocolConfig, buffer); - //总长度获取 - Integer totalLength = lightText.length(); - //计算固定长度最大长度 - Integer maxFixedPosition = calculatePosition(fieldConfigList); -// buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - //计算数据报文内容 - ByteBuf bizDataFields = buffer.slice(maxFixedPosition-1, (totalLength - fixedLength)); - return bizDataFields; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer) { - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - String protocolId = String.valueOf(protocolConfig.getId()); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer fixedLength = calculateLength(fieldConfigList); -// Integer totalLength = this.getTotalLength(protocolConfig, buffer); - Integer totalLength = lightText.length(); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - ByteBuf fixDataFields = buffer.slice(0, maxFixedPosition); - return fixDataFields; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer) { - String protocolId = String.valueOf(protocolConfig.getId()); - Map fixedPropertyMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer fixedLength = calculateLength(fieldConfigList); - Integer totalLength = this.getTotalLength(protocolConfig, buffer); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - fixedPropertyMap.put("fixedPosition", maxFixedPosition); - fixedPropertyMap.put("totalLength", totalLength); - fixedPropertyMap.put("tailPosition", totalLength - fixedLength + maxFixedPosition); - return fixedPropertyMap; - } - - //分别计算bit和byte长度=> 合并长度 - private Integer calculateLength(List fieldConfigList) { - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (FieldConfig fieldConfig : fieldConfigList) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - Integer fixedLength = bytefixedLength + bitfixedLength / 8; - return fixedLength; - } - - //找到最大值=> 根据最大值计算业务数据下标 - private Integer calculatePosition(List fieldConfigList) { - String rex = "[0-9]+"; - Integer max = -1; - for (FieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOrignPosition()) - && Integer.valueOf(fieldConfig.getOrignPosition()) > max) { - max = Integer.valueOf(fieldConfig.getOrignPosition()); - } - } - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (FieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOrignPosition()) && fieldConfig.getOrignPosition().equals(max)) { - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - } - } - Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; - return maxFixedPosition; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java new file mode 100644 index 0000000..d4ec6c7 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java @@ -0,0 +1,76 @@ +package com.casic.missiles.parser.rule; + +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import org.apache.commons.lang3.StringUtils; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class GenericRuleResolver { + + //根据前置字段的值,找到指定的规则 + //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 + //=>循环判断=>通过规则得到业务字段 + public static RuleConfig machRule(Map fixDataMap, + String ids, + List protocolFieldConfigs, + List ruleConfigs) { + List preRuleConfigList = getPreRuleList(ids, protocolFieldConfigs); + //获取前置规则字段 + final Map metaDataMap = getPreRuleFields(preRuleConfigList, fixDataMap); + //准备固定的字段集合 + Map fixDataFieldMap = getFixDataFieldMap(protocolFieldConfigs); + return RuleResolverCore.doMachRule(ruleConfigs, metaDataMap, fixDataMap, fixDataFieldMap); + } + + private static Map getFixDataFieldMap(List protocolFieldConfigs) { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, ProtocolFieldConfig::getFieldName) + ); + return fixDataFieldMap; + } + + + /** + * 查询前置规则的字段配置 + * + * @param ids + * @return + */ + private static List getPreRuleList(String ids, List protocolFieldConfigs) { + String[] idList = ids.split(","); + Map prepareMaps = new HashMap<>(); + for (String id : idList) { + if (StringUtils.isNotEmpty(id)) { + prepareMaps.put(Long.valueOf(id), ""); + } + } + List preRuleConfigList = protocolFieldConfigs + .stream() + .filter(e -> prepareMaps.containsKey(e.getId())) + .collect(Collectors.toList()); + return preRuleConfigList; + } + + /** + * 获取前置规则解析字段 + */ + private static Map getPreRuleFields(List preRuleFieldConfigList, Map fixDataMap) { + Map ruleFieldMap = new HashMap<>(); + preRuleFieldConfigList.stream() + .forEach( + preRuleFieldConfig -> { + String fieldName = preRuleFieldConfig.getFieldName(); + if (fixDataMap.containsKey(fieldName)) { + ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); + } + } + ); + return ruleFieldMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java new file mode 100644 index 0000000..baae7e8 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -0,0 +1,68 @@ +package com.casic.missiles.parser.rule; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.casic.missiles.pojo.RuleConfig; + +import java.util.*; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleResolverCore { + + + public static RuleConfig doMachRule(List ruleConfigList, Map metaDataMap, + Map fixDataMap, + Map fixDataFieldMap) { + Optional ruleConfigOptional = ruleConfigList.stream() + .filter(ruleConfig -> machRuleConfig( + JSON.parseObject(ruleConfig.getMatchRuleJson(), Map.class), metaDataMap)) + .findFirst(); + if (ObjectUtil.isEmpty(ruleConfigOptional)) { + return null; + } + String[] ruleFields = ruleConfigOptional.get().getDataFieldIds().split(","); + Map ruleMetaDataMap = getRuleFields(ruleFields, fixDataMap, fixDataFieldMap); + //递归选定解析规则,进行规则解析 + if (!ruleConfigOptional.get().getIsFinishMatch().equals("1")) { + //递归选定规则 + doMachRule(ruleConfigList, ruleMetaDataMap, fixDataMap, fixDataFieldMap); + } + return ruleConfigOptional.get(); + } + + + private static Map getRuleFields(String[] preRuleConfigList, Map fixedDataMap, + Map fixedFieldMap) { + Map ruleFieldMap = new HashMap<>(); + for (String preRuleConfigId : preRuleConfigList) { + String fieldName = fixedFieldMap.get(preRuleConfigId); + if (fixedDataMap.containsKey(fieldName)) { + ruleFieldMap.put(fieldName, String.valueOf(fixedDataMap.get(fieldName))); + } + } + return ruleFieldMap; + } + + + //匹配规则配置 + private static Boolean machRuleConfig(Map ruleMap, Map metaDataMap) { + if (ruleMap == null || metaDataMap == null) { + return null; + } + //所有的字段在规则里面必须有有配置 + for (String key : metaDataMap.keySet()) { + if (ruleMap.containsKey(key)) { + if (!ruleMap.get(key).equals(metaDataMap.get(key))) { + return false; + } + } else { + return false; + } + } + return true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java deleted file mode 100644 index 664088d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java +++ /dev/null @@ -1,92 +0,0 @@ -package com.casic.missiles.parser.rule; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.mapper.dao.PreRuleConfigDao; -import com.casic.missiles.mapper.dao.RuleConfigDao; -import lombok.AllArgsConstructor; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.*; -import java.util.stream.Collectors; - -@Service -@AllArgsConstructor -public class RulerProvider { - - private final FieldConfigDao fieldConfigDao; - private final PreRuleConfigDao preRuleConfigDao; - private final RuleConfigDao ruleConfigDao; - - //根据前置字段的值,找到指定的规则 - //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 - //=>循环判断=>通过规则得到业务字段 - public RuleConfig ruleConfig(Map fixDataMap, String protocolId) { - //批量获取规则 - List preRuleConfigList = preRuleConfigDao.getPreRuleList(protocolId); - //获取固定字段 - Map fixFieldMap = getAllFieldMap(protocolId); - //获取前置规则字段 - final String preRuleFields = getPreRuleFields(preRuleConfigList, fixDataMap, fixFieldMap); - List ruleConfigList = ruleConfigDao.getRuleConfigById(protocolId); - Optional ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig ->preRuleFields.equals( ruleConfig.getParseRuleJson())).findFirst(); - //递归选定解析规则,进行规则解析 - while (!ObjectUtil.isEmpty(ruleConfigOptional) && !ruleConfigOptional.get().getIsBizField().equals("1")) { - String ruleFields = getRuleFields(ruleConfigOptional.get().getDataFieldIds().split(","), fixDataMap, fixFieldMap); - ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig -> ruleConfig.getParseRuleJson().equals(ruleFields)).findFirst(); - } - return ruleConfigOptional.get(); - } - - /** - * 获取前置规则解析字段 - */ - private String getPreRuleFields(List preRuleConfigList, Map fixDataMap, Map fixFieldMap) { - Map ruleFieldMap= new HashMap<>(); - preRuleConfigList.stream() - .forEach( - preRuleConfig -> { - String fieldName = fixFieldMap.get(Long.valueOf(preRuleConfig.getRuleFieldId())); - if (fixDataMap.containsKey(fieldName)) { - ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); - } - } - ); - return JSONObject.toJSONString(ruleFieldMap); - } - - private Map getAllFieldMap(String protocolId) { - List fieldList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Map fixFieldMap = fieldList.stream().collect( - Collectors.toMap(FieldConfig::getId, FieldConfig::getFieldName) - ); - return fixFieldMap; - } - - private String getRuleFields(String[] preRuleConfigList, Map fixDataMap, Map fixFieldMap) { - Map ruleFieldMap= new HashMap<>(); - for (String preRuleConfigId : preRuleConfigList) { - String fieldName = fixFieldMap.get(preRuleConfigId); - if (fixDataMap.containsKey(fieldName)) { - ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); - } - } - return JSONObject.toJSONString(ruleFieldMap); - } - - //弃置 - private String ListToString(List ruleFieldList) { - String ruleFields = ""; - for (String ruleField : ruleFieldList) { - ruleFields += ruleField + ","; - } - ruleFields = StringUtils.isEmpty(ruleFields) ? ruleFields : ruleFields.substring(0, ruleFields.length() - 1); - return ruleFields; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java index 6177e10..bfa87a5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java @@ -2,7 +2,7 @@ public interface SafeStrategy { - String decryption(byte[] bytes); + String decryption(String cipher); String encryption(String lightText); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java index 618716c..6236302 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java @@ -9,9 +9,9 @@ //十六进制的字符串转换成字节数组 byte[] bytes = hexStrToBinaryStr(msg); //计算CRC8 - byte crc8 = CRC8(bytes, 0, bytes.length); - String crc8ToStr = "" + Integer.toHexString(0xff & crc8); - return crc8ToStr; +// String crc8ToStr = "" + Integer.toHexString(0xff & crc8); +// return crc8ToStr; + return null; } /** @@ -33,50 +33,5 @@ return bytes; } - /** - * CRC8 校验 多项式 x8+x2+x+1 - * - * @param b - * @param off - * @param len - * @return - */ - public static byte CRC8(final byte[] b, final int off, final int len) { - byte result = 0x00; - for (int i = 0; i < len; i++) { - result = CHECKSUM_TABLE[(result ^ (b[i + off] & 0xFF)) & 0xFF]; - } - return (byte) (result & 0xFFL); - } - - private final static byte[] CHECKSUM_TABLE = {(byte) 0x00, (byte) 0x07, (byte) 0x0e, (byte) 0x09, (byte) 0x1c, (byte) 0x1b, - (byte) 0x12, (byte) 0x15, (byte) 0x38, (byte) 0x3f, (byte) 0x36, (byte) 0x31, (byte) 0x24, (byte) 0x23, (byte) 0x2a, - (byte) 0x2d, (byte) 0x70, (byte) 0x77, (byte) 0x7e, (byte) 0x79, (byte) 0x6c, (byte) 0x6b, (byte) 0x62, (byte) 0x65, - (byte) 0x48, (byte) 0x4f, (byte) 0x46, (byte) 0x41, (byte) 0x54, (byte) 0x53, (byte) 0x5a, (byte) 0x5d, (byte) 0xe0, - (byte) 0xe7, (byte) 0xee, (byte) 0xe9, (byte) 0xfc, (byte) 0xfb, (byte) 0xf2, (byte) 0xf5, (byte) 0xd8, (byte) 0xdf, - (byte) 0xd6, (byte) 0xd1, (byte) 0xc4, (byte) 0xc3, (byte) 0xca, (byte) 0xcd, (byte) 0x90, (byte) 0x97, (byte) 0x9e, - (byte) 0x99, (byte) 0x8c, (byte) 0x8b, (byte) 0x82, (byte) 0x85, (byte) 0xa8, (byte) 0xaf, (byte) 0xa6, (byte) 0xa1, - (byte) 0xb4, (byte) 0xb3, (byte) 0xba, (byte) 0xbd, (byte) 0xc7, (byte) 0xc0, (byte) 0xc9, (byte) 0xce, (byte) 0xdb, - (byte) 0xdc, (byte) 0xd5, (byte) 0xd2, (byte) 0xff, (byte) 0xf8, (byte) 0xf1, (byte) 0xf6, (byte) 0xe3, (byte) 0xe4, - (byte) 0xed, (byte) 0xea, (byte) 0xb7, (byte) 0xb0, (byte) 0xb9, (byte) 0xbe, (byte) 0xab, (byte) 0xac, (byte) 0xa5, - (byte) 0xa2, (byte) 0x8f, (byte) 0x88, (byte) 0x81, (byte) 0x86, (byte) 0x93, (byte) 0x94, (byte) 0x9d, (byte) 0x9a, - (byte) 0x27, (byte) 0x20, (byte) 0x29, (byte) 0x2e, (byte) 0x3b, (byte) 0x3c, (byte) 0x35, (byte) 0x32, (byte) 0x1f, - (byte) 0x18, (byte) 0x11, (byte) 0x16, (byte) 0x03, (byte) 0x04, (byte) 0x0d, (byte) 0x0a, (byte) 0x57, (byte) 0x50, - (byte) 0x59, (byte) 0x5e, (byte) 0x4b, (byte) 0x4c, (byte) 0x45, (byte) 0x42, (byte) 0x6f, (byte) 0x68, (byte) 0x61, - (byte) 0x66, (byte) 0x73, (byte) 0x74, (byte) 0x7d, (byte) 0x7a, (byte) 0x89, (byte) 0x8e, (byte) 0x87, (byte) 0x80, - (byte) 0x95, (byte) 0x92, (byte) 0x9b, (byte) 0x9c, (byte) 0xb1, (byte) 0xb6, (byte) 0xbf, (byte) 0xb8, (byte) 0xad, - (byte) 0xaa, (byte) 0xa3, (byte) 0xa4, (byte) 0xf9, (byte) 0xfe, (byte) 0xf7, (byte) 0xf0, (byte) 0xe5, (byte) 0xe2, - (byte) 0xeb, (byte) 0xec, (byte) 0xc1, (byte) 0xc6, (byte) 0xcf, (byte) 0xc8, (byte) 0xdd, (byte) 0xda, (byte) 0xd3, - (byte) 0xd4, (byte) 0x69, (byte) 0x6e, (byte) 0x67, (byte) 0x60, (byte) 0x75, (byte) 0x72, (byte) 0x7b, (byte) 0x7c, - (byte) 0x51, (byte) 0x56, (byte) 0x5f, (byte) 0x58, (byte) 0x4d, (byte) 0x4a, (byte) 0x43, (byte) 0x44, (byte) 0x19, - (byte) 0x1e, (byte) 0x17, (byte) 0x10, (byte) 0x05, (byte) 0x02, (byte) 0x0b, (byte) 0x0c, (byte) 0x21, (byte) 0x26, - (byte) 0x2f, (byte) 0x28, (byte) 0x3d, (byte) 0x3a, (byte) 0x33, (byte) 0x34, (byte) 0x4e, (byte) 0x49, (byte) 0x40, - (byte) 0x47, (byte) 0x52, (byte) 0x55, (byte) 0x5c, (byte) 0x5b, (byte) 0x76, (byte) 0x71, (byte) 0x78, (byte) 0x7f, - (byte) 0x6a, (byte) 0x6d, (byte) 0x64, (byte) 0x63, (byte) 0x3e, (byte) 0x39, (byte) 0x30, (byte) 0x37, (byte) 0x22, - (byte) 0x25, (byte) 0x2c, (byte) 0x2b, (byte) 0x06, (byte) 0x01, (byte) 0x08, (byte) 0x0f, (byte) 0x1a, (byte) 0x1d, - (byte) 0x14, (byte) 0x13, (byte) 0xae, (byte) 0xa9, (byte) 0xa0, (byte) 0xa7, (byte) 0xb2, (byte) 0xb5, (byte) 0xbc, - (byte) 0xbb, (byte) 0x96, (byte) 0x91, (byte) 0x98, (byte) 0x9f, (byte) 0x8a, (byte) 0x8d, (byte) 0x84, (byte) 0x83, - (byte) 0xde, (byte) 0xd9, (byte) 0xd0, (byte) 0xd7, (byte) 0xc2, (byte) 0xc5, (byte) 0xcc, (byte) 0xcb, (byte) 0xe6, - (byte) 0xe1, (byte) 0xe8, (byte) 0xef, (byte) 0xfa, (byte) 0xfd, (byte) 0xf4, (byte) 0xf3}; } \ No newline at end of file diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java index 27c2838..6e078a3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java @@ -1,9 +1,6 @@ package com.casic.missiles.parser.safe.impl; -import cn.hutool.core.util.CharsetUtil; -import cn.hutool.crypto.symmetric.SM4; -import cn.hutool.crypto.symmetric.SymmetricCrypto; - +import com.casic.missiles.parser.safe.SafeStrategy; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; @@ -11,19 +8,44 @@ import org.bouncycastle.crypto.engines.SM4Engine; import org.bouncycastle.crypto.params.KeyParameter; import org.bouncycastle.util.encoders.Hex; - -import static cn.hutool.crypto.Mode.ECB; -import static cn.hutool.crypto.Padding.NoPadding; +import org.springframework.stereotype.Component; /** * SM4算法工具类 */ @Slf4j -public class Sm4 { +@Component("sm4") +public class Sm4 implements SafeStrategy { //加解密的字节快大小 public static final int BlockSize = 16; + @Override + public String decryption(String cipher) { + byte[] keyByte = { + 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 + }; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(keyByte); + byte[] in = Hex.decode(cipher); + byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); + String plain = EcbDecrypt(in, keyBytes); + return plain; + } + + @Override + public String encryption(String cipher) { + byte[] keyByte = { + 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 + }; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(keyByte); + byte[] in = Hex.decode(cipher); + byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); + String plain = EcbDecrypt(in, keyBytes); + return plain; + } + /** * SM4ECB加密算法,对内 * @@ -32,8 +54,6 @@ * @return */ private static byte[] ecb_encrypt(byte[] in, byte[] keyBytes) { - - SM4Engine sm4Engine = new SM4Engine(); sm4Engine.init(true, new KeyParameter(keyBytes)); byte[] out = new byte[in.length]; @@ -58,27 +78,6 @@ return cipher; } - - /** - * hutool 解密SM4 - * - * @param encodeContent - * @return - */ - public static String decode(String encodeContent) { - String key = "24ad182507479a5da3ad94d9d78ea203"; - try { - SymmetricCrypto sm4 = new SM4(ECB, NoPadding, key.getBytes()); - String decryptStr = sm4.decryptStr(encodeContent, CharsetUtil.CHARSET_UTF_8); - return decryptStr; - } catch (Exception e) { - e.printStackTrace(); - log.error("SM4解密失败"); - } - return null; - } - - /** * SM4的ECB加密算法 * @@ -129,20 +128,6 @@ return plain; } - /** - * SM4的ECB解密算法 - * - * @param cipher 输入的密文字符串 - * @param key 密钥 - * @return - */ - public static String EcbDecrypt(String cipher, String key) { - byte[] in = Hex.decode(cipher); - byte[] keyBytes = Hex.decode(key); - - String plain = EcbDecrypt(in, keyBytes); - return plain; - } /** * 主函数 @@ -151,28 +136,24 @@ */ public static void main(String[] args) { byte[] ciphertext = { + 0x4B, (byte) 0x8C, (byte) 0x9D, 0x08, (byte) 0xE4, (byte) 0xD3, 0x64, 0x42, (byte) 0xB9, (byte) 0xA5, (byte) 0xFE, (byte) 0xCD, (byte) 0x91, 0x1B, 0x38, (byte) 0xAC, (byte) 0xE9, 0x1C, (byte) 0xCD, 0x53, 0x02, (byte) 0xD7, 0x0C, (byte) 0x9B, (byte) 0x96, 0x30, 0x62, (byte) 0xE8, (byte) 0xFB, (byte) 0xEF, (byte) 0xB9, (byte) 0xFF, (byte) 0xDE, 0x19, (byte) 0x80, 0x35, 0x3E, (byte) 0x90, 0x4F, 0x2F, 0x12, 0x2B, 0x19, (byte) 0x8B, 0x6C, 0x7A, (byte) 0x85, (byte) 0xA1, (byte) 0xB1, (byte) 0x86, (byte) 0xA3, 0x7A, 0x46, 0x0C, 0x2F, (byte) 0x94, 0x4F, 0x7F, 0x2C, 0x56, 0x14, (byte) 0xF3, (byte) 0x89, (byte) 0xC3, - 0x3F, 0x20, (byte) 0xF9, (byte) 0x87, (byte) 0xA1, 0x60, (byte) 0xD9, (byte) 0xA8, (byte) 0xFD, (byte) 0xD7, (byte) 0x9B, 0x4B, 0x26, 0x06, 0x30, 0x44}; + 0x3F, 0x20, (byte) 0xF9, (byte) 0x87, (byte) 0xA1, 0x60, (byte) 0xD9, (byte) 0xA8, (byte) 0xFD, (byte) 0xD7, (byte) 0x9B, 0x4B, 0x26, 0x06, 0x30, 0x44 + }; ByteBuf in = ByteBufAllocator.DEFAULT.heapBuffer(); in.writeBytes(ciphertext); - byte[] keyByte = { 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 }; ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); - key.writeBytes(ciphertext); - String resCipherData = decode(ByteBufUtil.hexDump(in)); - ByteBuf out = ByteBufAllocator.DEFAULT.heapBuffer(); -// out.writeBytes(resCipherData); -// System.out.println(hexBytes); - System.out.println(resCipherData.toString()); -// String resPlainData = EcbDecrypt(resCipherData, key); -// System.out.println("原始明文:" + data); -// System.out.println("解密后明文:" + resPlainData); + key.writeBytes(keyByte); +// String resCipherData = EcbDecrypt(ByteBufUtil.hexDump(in), ByteBufUtil.hexDump(key)); +// System.out.println(resCipherData); } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java index 1395a51..ac5f957 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java @@ -1,7 +1,7 @@ package com.casic.missiles.parser.safe.impl; import io.netty.buffer.ByteBufUtil; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** *

@@ -14,9 +14,8 @@ * @author hyl * @version v1.0: Tea.java, v 0.1 2021/3/12 13:48 $ */ -@Service("tea") -///tea算法类 - +//tea算法类 +@Component("tea") public class Tea { public static byte[] MyTea_Encrypt(byte[] MyTeaContent, int ByteLen, byte[] MyTeakey) { @@ -99,7 +98,6 @@ // for(int i32Index = 0; i32Index < 8; i32Index++) { // System.out.print("0x" + Integer.toHexString(MyContent[i32Index]) + " "); // } - // System.out.println("密钥为:"); // for(int i32Index = 0; i32Index < 16; i32Index++) { // System.out.print("0x" + Integer.toHexString(MyKeys[i32Index]) + " "); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java index bdd0721..bd1516a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java @@ -3,7 +3,7 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.parser.sender.DataSubscribeProvider; import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponents; import org.springframework.web.util.UriComponentsBuilder; @@ -12,7 +12,7 @@ import java.util.Collections; import java.util.Map; -@Service("functionCallback") +@Component("functionCallback") public class FunctionCallback implements DataSubscribeProvider { @Resource diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java index 0b44fb9..7526de2 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.Map; -@Service("middleware") +@Component("middleware") public class MiddlewareSubscribe implements DataSubscribeProvider { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java index 5dcee3f..e2f1192 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.Map; -@Service("nosql") +@Component("nosql") public class NoSqlSubscribe implements DataSubscribeProvider { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java b/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java new file mode 100644 index 0000000..81a5324 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java @@ -0,0 +1,86 @@ +package com.casic.missiles.pojo; + +import lombok.Data; + +/** + * 协议 + */ +@Data +public class Msg { + + /** + * 前导码 + */ + private String preamble; + + /** + * 版本号 + */ + private String version; + + /** + * 内容长度 + */ + private int leng; + + /** + * 设备ID + */ + private String deviceId; + + /** + * 通讯方式 + */ + private Integer connType; + + /** + * 加密方式 + */ + private Integer encryType; + + /** + * 目标地址 + */ + private String destAddr; + + /** + * PDUType + */ + private String PDUType; + + /** + * 操作类型 + */ + private Integer operateType; + + /** + * 传输控制位 PDUType.bit7=0时,表示存在后续的访问;当PDUType.bit7=1时,表示无后续的访问。 + */ + private Integer transControlFlag; + + /** + * 设备类型 + */ + private Integer deviceType; + + /** + * 序号 + */ + private Integer seq; + + /** + * tagList + */ + private String tagList; + + /** + * OidList + */ + private String OidList; + + /** + * CRC + */ + private String CRC; + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java index 40a5265..97cc984 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java @@ -40,7 +40,7 @@ String httpContent = msg.toString(Charset.defaultCharset()); log.info(" String : " + msg.toString(Charset.defaultCharset())); String majorContent = httpContent.substring(httpContent.indexOf("{"), httpContent.lastIndexOf("}") + 1); - String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("serviceData")).get("Value")); + String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("RegistryData")).get("Value")); log.info("----------------------------------" + values); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); bufferContent.writeBytes(values.getBytes(Charset.forName("ISO-8859-1"))); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java index 1b132a7..e3ced4b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java @@ -35,7 +35,7 @@ String httpContent = msg.toString(Charset.defaultCharset()); log.info(" String : " + msg.toString(Charset.defaultCharset())); String majorContent = httpContent.substring(httpContent.indexOf("{"), httpContent.lastIndexOf("}") + 1); - String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("serviceData")).get("Value")); + String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("RegistryData")).get("Value")); log.info("----------------------------------" + values); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); bufferContent.writeBytes(values.getBytes(Charset.forName("ISO-8859-1"))); diff --git a/sensorhub-core/src/main/resources/application.properties b/sensorhub-core/src/main/resources/application.properties deleted file mode 100644 index 8b13789..0000000 --- a/sensorhub-core/src/main/resources/application.properties +++ /dev/null @@ -1 +0,0 @@ - diff --git a/sensorhub-core/src/main/resources/config/application-dev.yml b/sensorhub-core/src/main/resources/config/application-dev.yml index 4f897a8..dcc4c2d 100644 --- a/sensorhub-core/src/main/resources/config/application-dev.yml +++ b/sensorhub-core/src/main/resources/config/application-dev.yml @@ -4,9 +4,9 @@ spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true + url: jdbc:mysql://127.0.0.1:3306/sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true username: root - password: Casic203 + password: root session: store-type: redis redis: diff --git a/sensorhub-core/src/main/resources/config/application.yml b/sensorhub-core/src/main/resources/config/application.yml index ae89f9d..7965da1 100644 --- a/sensorhub-core/src/main/resources/config/application.yml +++ b/sensorhub-core/src/main/resources/config/application.yml @@ -30,6 +30,13 @@ port: 6379 password: ew5T4K3#203lwh config-prefix: 'Casic:' +#代码生成器配置 +code: + generate: + #作者 + author: cz + #待生成对象表名 + table-name: bussiness_field_config,combined_field_config sensorhub: config: port: 7091 diff --git a/sensorhub-support/pom.xml b/sensorhub-support/pom.xml index 9a71296..761601c 100644 --- a/sensorhub-support/pom.xml +++ b/sensorhub-support/pom.xml @@ -42,6 +42,12 @@ ${redis.version} + + com.baomidou + mybatis-plus-generator + ${mybatis-plus-generator.version} + + org.reflections diff --git a/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java b/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java new file mode 100644 index 0000000..515ca53 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java @@ -0,0 +1,14 @@ +package com.casic.missiles.enums; + +/** + * @author + * @date + */ +public interface FixedPropertyEnum { + + String FIXED_POSITION = "fixedPosition"; + + String TOTAL_LENGTH = "totalLength"; + + String TAIL_POSITION = "tailPosition"; +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/CombinedFieldMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CombinedFieldMapper.java new file mode 100644 index 0000000..38e8f42 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CombinedFieldMapper.java @@ -0,0 +1,15 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.CombinedFieldConfig; +import org.apache.ibatis.annotations.Mapper; + +/** + * @author cz + * + */ +@Mapper +public interface CombinedFieldMapper extends BaseMapper { + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java new file mode 100644 index 0000000..128b09d --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java @@ -0,0 +1,10 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.CommandEventConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface CommandEventMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java new file mode 100644 index 0000000..042eb3c --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.DatagramEventConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface DatagramEventConfigMapper extends BaseMapper { +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java new file mode 100644 index 0000000..fc95cf4 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java @@ -0,0 +1,8 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.FieldConfig; + +public interface FieldConfigMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldRuleConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldRuleConfigMapper.java new file mode 100644 index 0000000..b310a08 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldRuleConfigMapper.java @@ -0,0 +1,10 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.FieldRuleConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface FieldRuleConfigMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java new file mode 100644 index 0000000..9060a69 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.ProtocolConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface ProtocolConfigMapper extends BaseMapper { +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolFieldConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolFieldConfigMapper.java new file mode 100644 index 0000000..1b47180 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolFieldConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +public interface ProtocolFieldConfigMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java new file mode 100644 index 0000000..6fa6936 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.RuleConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface RuleConfigMapper extends BaseMapper { +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/AbstractFieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/AbstractFieldConfig.java new file mode 100644 index 0000000..ba9aea2 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/AbstractFieldConfig.java @@ -0,0 +1,38 @@ +package com.casic.missiles.pojo; + +import lombok.Data; + +@Data +public class AbstractFieldConfig { + /** + * 字段名称 + */ + private String fieldName; + /** + * 按照字段评估进行字段解析 + */ + private String ruleJson; + /** + * 起始位置(单位byte) + */ + private Integer OriginPositionByte; + /** + * 起始位置,是否需要bit位置(单位bit)小于8, 没有不需要填写 + */ + private String OriginPositionBit; + /** + * 偏移长度 + */ + private Integer offsetLength; + /** + * 偏移单位(bit/byte) + */ + private String offsetUnit; + /** + * 是否需要转存 + */ + private Integer isStorage; + + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/CombinedFieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/CombinedFieldConfig.java new file mode 100644 index 0000000..4f4de6a --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/CombinedFieldConfig.java @@ -0,0 +1,41 @@ +package com.casic.missiles.pojo; + +import lombok.Data; + +import java.util.Date; + +/** + * 组合配置 + * + * @author cz + * @date 20 + */ +@Data +public class CombinedFieldConfig { + + private Long id; + private Long ruleId; + /** + * 前缀编码 + */ + private String prefixCode; + + /** + * 字段动态的id + */ + private Long dynamicLengthId; + /** + * 对应的要解析字段的ids + */ + private String dataFieldIds; + + /** + * 字段动态的id + */ + private String combinedFieldIds; + + private Date lastTime; + + private Date createTime; + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldConfig.java index a07d20d..8304dc6 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldConfig.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldConfig.java @@ -5,31 +5,28 @@ import java.util.Date; +/** + * @author cz + * 1、该表与实际解析的内容实例解析有关 + * 2、该表字段是随机出现的,和帧结构无关,无法预料的 + * 3、该表字段解析根据FieldEvaluatorConfig进行字段解析 + */ @Data -@TableName("field_config") -public class FieldConfig { +@TableName("business_field_config") +public class FieldConfig extends AbstractFieldConfig { private Long id; -// private String preFieldConfig; - private Long protocolId; - - private String isFixed; - private String uploadDeliveryChange; - - private String replyRule; - private String ruleJson; - + /** + * 协议配置id + */ + private Long ruleId; + /** + * 字段名称 + */ private String fieldName; - private String isStorage; - private Integer orignPosition; - private String exactOrignPosition; - - private Integer offsetLength; - private String offsetUnit; private String ownerId; private Date createTime; private Date lastTime; - } diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldRuleConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldRuleConfig.java new file mode 100644 index 0000000..2e09879 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldRuleConfig.java @@ -0,0 +1,20 @@ +package com.casic.missiles.pojo; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +@TableName("field_rule_config") +@Data +public class FieldRuleConfig { + + private Long id; + private String name; + private String desc; + private String condition; + private String excuteOperation; + private Date lasTime; + private Date createTime; + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/Msg.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/Msg.java deleted file mode 100644 index 81a5324..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/Msg.java +++ /dev/null @@ -1,86 +0,0 @@ -package com.casic.missiles.pojo; - -import lombok.Data; - -/** - * 协议 - */ -@Data -public class Msg { - - /** - * 前导码 - */ - private String preamble; - - /** - * 版本号 - */ - private String version; - - /** - * 内容长度 - */ - private int leng; - - /** - * 设备ID - */ - private String deviceId; - - /** - * 通讯方式 - */ - private Integer connType; - - /** - * 加密方式 - */ - private Integer encryType; - - /** - * 目标地址 - */ - private String destAddr; - - /** - * PDUType - */ - private String PDUType; - - /** - * 操作类型 - */ - private Integer operateType; - - /** - * 传输控制位 PDUType.bit7=0时,表示存在后续的访问;当PDUType.bit7=1时,表示无后续的访问。 - */ - private Integer transControlFlag; - - /** - * 设备类型 - */ - private Integer deviceType; - - /** - * 序号 - */ - private Integer seq; - - /** - * tagList - */ - private String tagList; - - /** - * OidList - */ - private String OidList; - - /** - * CRC - */ - private String CRC; - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/PreRuleConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/PreRuleConfig.java deleted file mode 100644 index bfcf914..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/PreRuleConfig.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.casic.missiles.pojo; - -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -import java.util.Date; - -@Data -@TableName("pre_rule_config") -public class PreRuleConfig { - - private Long id; - private String protocolId; - private String ruleFieldId; - private String ownerId; - private Date createTime; - private Date lastTime; -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolConfig.java index 274ad42..bdac11f 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolConfig.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolConfig.java @@ -5,18 +5,52 @@ import java.util.Date; +/** + * 协议配置表,协议配置与帧结构有关 + * 1、层级关系,协议之后是规则,规则对应设备类型的各种上数规则 + * 2、规则对应协议配置的实例流程 + * 3、每种可根据设备类型和操作类型进行上数规则进行区分 + */ @Data @TableName("protocol_config") public class ProtocolConfig { private Long id; + /** + * 前导码 + */ private String preFix; - private String unpackId; - private String totalLengthId; - private String totalLengthFilterField; + /** + * 拆包id + */ + private Long unpackId; + /** + * 总长度id + */ + private Long totalLengthId; + /** + * + */ + private String totalLengthFilterFields; + /** + * 动态长度ids + */ private String dynamicLengthId; + /** + * 动态长度json(预留字段) + */ private String dynamicLengthJson; - private String tailStr; + /** + * 规则字段所解析预准备的字段 + */ + private String rulePrepareFields; + /** + * 结尾标志 + */ + private Long tailStr; + /** + * 备注 + */ private String remark; private String ownerId; private Date createTime; diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolFieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolFieldConfig.java new file mode 100644 index 0000000..db794bd --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolFieldConfig.java @@ -0,0 +1,43 @@ +package com.casic.missiles.pojo; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +/** + * 协议字段配置表 + * 该表用户存放帧结构固定格式的字段 + * 有以下两个用途 + * (1)、固定格式的字段可用于规则匹配 + * (2)、固定格式的字段可用于报文回复 + * @author cz + * @date 2023-06-09 + */ +@Data +@TableName("protocol_field_config") +public class ProtocolFieldConfig extends AbstractFieldConfig{ + + private Long id; + /** + * 协议配置id + */ + private Long protocolId; + /** + * 上传下发是否有变化, 没有变化,可以直接组装 + */ + private String isReplyFix; + /** + * 按照字段评估进行字段解析 + */ + private Long fieldEvaluatorId; + /** + * 回复规则 + */ + private String replyRule; + + private String ownerId; + private Date createTime; + private Date lastTime; + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java index 3b53493..febf835 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java @@ -6,18 +6,40 @@ import java.util.Date; /** - * 加密字段解析和规则有关,事件调到该流程下面 + * @author cz + * todo: 匹配协议对应业务实例 + * 1、一个协议可以多种的流程规则 + * 2、规则可以支持递归规则流程 */ @Data @TableName("rule_config") public class RuleConfig { - private Long id; private String protocolId; - private String isBizField; - private String parseRuleJson; + /** + * 是否完成规则配置,没有完成, + * 则需要根据规则继续匹配 + */ + private String isFinishMatch; + /** + * 待匹配解析规则 + * {“data_field”:"data_value"} + */ + private String matchRuleJson; + /** + * 待解析字段ids + */ private String dataFieldIds; - private String aviatorFilterJson; + + /** + * 待解析组合字段ids + */ + private String combinedFieldIds; + + /** + * aviator + */ + private String conditionExpression; private Date createTime; private Date lastTime; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java index 608af3a..32cc8a4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java @@ -2,48 +2,47 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.delivery.decorator.ByteDecorator; +import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @AllArgsConstructor public class FieldDecoratorManger { - private final RuleDictDao ruleDictDao; + private final RuleConfigRegistry ruleDictDao; // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 // (1)静态的业务字段是字典里面可以配置的 // (2)动态的业务字段是通过规则生成的 public String contentMerge(String ruleJson, String sceneConent, String dynamicContent) { - List ruleDictList = ruleDictDao.getRuleDictConfig(); - Map ruleDictMap = ruleDictList.stream().collect( - Collectors.toMap(RuleDict::getId, e -> e)); - List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); - for (Map ruleMap : ruleMapList) { - String ruleType = String.valueOf(ruleMap.get("ruleType")); - ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); - NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); - byteDecorator.nodeDecoratorRule(nodeDecoratorParm); - } +// List ruleDictList = ruleDictDao.getRuleDictConfig(); +// Map ruleDictMap = ruleDictList.stream().collect( +// Collectors.toMap(RuleDict::getId, e -> e)); +// List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); +// for (Map ruleMap : ruleMapList) { +// String ruleType = String.valueOf(ruleMap.get("ruleType")); +// ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); +// NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); +// byteDecorator.nodeDecoratorRule(nodeDecoratorParm); +// } return null; } - - private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { - NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() - .contents(sceneConent) - .dynamicContent(dynamicContent) - .ruletypeId(ruletypeId) - .ruleDictMap(ruleDictMap) - .build(); - return nodeDecoratorParm; - } +// +// private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { +// NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() +// .contents(sceneConent) +// .dynamicContent(dynamicContent) +// .ruletypeId(ruletypeId) +// .ruleDictMap(ruleDictMap) +// .build(); +// return nodeDecoratorParm; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java index 652970c..b204ac3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java @@ -1,56 +1,56 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@AllArgsConstructor -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", - JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Component; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Component("logicalDecorator") +//@AllArgsConstructor +//@Slf4j +//public class LogicalShiftDecorator implements ByteDecorator { +// +//// private final FieldRuleEngineMapper fieldRuleEngineMapper; +//// +//// //字节位移 +//// @Override +//// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +//// String logicalValue = ""; +//// RuleEvaluator fieldRuleEngine = new RuleEvaluator(); +//// try { +//// Map env2 = new HashMap(); +//// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +//// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +//// for (String contentId : contentIdList) { +//// RuleDict ruleDict = ruleDictMap.get(contentId); +//// if (ruleDict.getCode().contains("#")) { +//// //使用动态的值 +//// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +//// } +//// env2.put(ruleDict.getName(), ruleDict.getCode()); +//// } +//// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +//// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +//// return null; +//// } +//// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +//// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +//// return values; +//// } catch (Exception ex) { +//// log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", +//// JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +//// return null; +//// } +//// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java index 346468f..822fead 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@AllArgsConstructor -@Slf4j -public class OperationDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("optionDecorator") +//@AllArgsConstructor +//@Slf4j +//public class OperationDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //混合运算,有常量或者乘除的缩放 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java index 50fb0a7..7a8bccb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@AllArgsConstructor -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +////精度计算 +//@AllArgsConstructor +//@Registry("precisionDecorator") +//@Slf4j +//public class PrecisionDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java index da39235..27f9cc7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java @@ -1,54 +1,53 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@AllArgsConstructor -@Slf4j -public class RuleDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("ruleDecorator") +//@AllArgsConstructor +//@Slf4j +//public class RuleDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //吃我一套正则表达式 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (Exception ex) { +// log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java index 7f5cbf3..c043f97 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java @@ -2,6 +2,6 @@ import java.util.Map; -public interface ComandeEventService { +public interface ComandeEventService{ Map loadComandeEventConfig(String protocolId,String scene); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java index 476ad84..aaf1837 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java @@ -2,46 +2,46 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.dao.CommandEventDao; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @Slf4j @AllArgsConstructor -public class ComandeEventServiceImpl implements ComandeEventService { +public class ComandeEventServiceImpl implements ComandeEventRegistry { - private final CommandEventDao commandEventDao; + // private final CommandEventDao commandEventDao; // 加密bean 固定字段出现变化的字段解析,业务字段的有序内容 @Override - public Map loadComandeEventConfig(String protocolId,String sceneName) { - CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); - if (ObjectUtil.isEmpty(commandEventConfig)) { - log.error("协议{},没有配置成功接收回复配置,清排查原因"); - return null; - } - String replyJson = commandEventConfig.getReplyContentJson(); - List> replyMapList = JSONArray.parseObject(replyJson, List.class); - List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); - Map fixMap = fixList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); - List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) - .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) - .collect(Collectors.toList()); - Map commandConfigMap = new HashMap<>(); - commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); - commandConfigMap.put("fixContent", fixMap); - commandConfigMap.put("bizContent", contentList); - return commandConfigMap; + public Map loadComandeEventConfig(String protocolId, String sceneName) { +// CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); +// if (ObjectUtil.isEmpty(commandEventConfig)) { +// log.error("协议{},没有配置成功接收回复配置,清排查原因"); +// return null; +// } +// String replyJson = commandEventConfig.getReplyContentJson(); +// List> replyMapList = JSONArray.parseObject(replyJson, List.class); +// List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); +// Map fixMap = fixList.stream() +// .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); +// List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) +// .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) +// .collect(Collectors.toList()); +// Map commandConfigMap = new HashMap<>(); +// commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); +// commandConfigMap.put("fixContent", fixMap); +// commandConfigMap.put("bizContent", contentList); +// return commandConfigMap; + return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 128b09d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java deleted file mode 100644 index 4016b0b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface DatagramEventMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java deleted file mode 100644 index 597c306..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.apache.ibatis.annotations.Mapper; - -public interface FieldConfigMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java deleted file mode 100644 index a31680a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.PreRuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface PreRuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java deleted file mode 100644 index 9060a69..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface ProtocolConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java deleted file mode 100644 index 6fa6936..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java deleted file mode 100644 index 582a705..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleDict; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleDictMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java deleted file mode 100644 index 6e302c8..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.CommandEventMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Optional; - -@Component -public class CommandEventDao { - - @Resource - private CommandEventMapper commandEventMapper; - - public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId) - .eq("scene", sceneName) - .eq("enabled", 1); - List commandEventConfig = commandEventMapper.selectList(queryWrapper); - Optional optionalEventConfig = commandEventConfig.stream().findFirst(); - return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java deleted file mode 100644 index 9137e4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.FieldConfigMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class FieldConfigDao { - - @Resource - private FieldConfigMapper fieldConfigMapper; - - public FieldConfig getFieldConfigById(String fieldId) { - FieldConfig fieldConfig = fieldConfigMapper.selectById(fieldId); - return fieldConfig; - } - - public List getFieldConfigs(String protocolId,Integer isFixed) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",isFixed); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - - public List getStorageFieldConfig(String protocolId) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",1) - .eq("is_storage",1); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java deleted file mode 100644 index 67bff6b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.mapper.PreRuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class PreRuleConfigDao { - - @Resource - private PreRuleConfigMapper preRuleConfigMapper; - - public List getPreRuleList(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return preRuleConfigMapper.selectList(queryWrapper); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java deleted file mode 100644 index d69ea85..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.RuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleConfigDao { - - @Resource - private RuleConfigMapper ruleConfigMapper; - - public RuleConfig getNextRuleConfig(String ruleFields) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("parse_rule_json", ruleFields); - return ruleConfigMapper.selectOne(queryWrapper); - } - - - public List getRuleConfigById(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return ruleConfigMapper.selectList(queryWrapper); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java deleted file mode 100644 index 932c185..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.RuleDictMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleDictDao { - - @Resource - private RuleDictMapper ruleDictMapper; - - public List getRuleDictConfig() { - List ruleDictList = ruleDictMapper.selectList(null); - return ruleDictList; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java index 9f9e279..43bc4d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java @@ -10,20 +10,15 @@ import io.netty.channel.socket.nio.NioServerSocketChannel; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import javax.annotation.PreDestroy; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static cn.hutool.core.util.ClassUtil.getClasses; /** * SensorhubServer netty服务端 */ @Slf4j -@Service +@Component public class SensorhubServer { /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java index 2c79ff5..9a28c36 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java @@ -11,13 +11,13 @@ import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioSocketChannel; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClient 客户端 */ @Slf4j -@Service +@Registry public final class SensorhubClient { public static void main(String[] args) throws Exception { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java index 9774be0..477c3f7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java @@ -6,12 +6,12 @@ import io.netty.channel.socket.SocketChannel; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientChannelInitialHandler */ -@Service +@Registry public class SensorhubClientChannelInitialHandler extends ChannelInitializer { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java index 346f4b3..73560e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java @@ -5,13 +5,13 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientHandler */ @Slf4j -@Service +@Registry public class SensorhubClientHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java index 5c1c6f2..d990af5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java @@ -4,12 +4,12 @@ import com.casic.missiles.pojo.Msg; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** * SensorhubServerHandler */ -@Service +@Component public class SensorhubServerHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 67283ae..af3172c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,41 +1,37 @@ package com.casic.missiles.parser; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultProtocolConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.*; +import com.casic.missiles.registry.FieldConfigRegistry; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; -import java.nio.charset.Charset; import java.util.HashMap; import java.util.List; import java.util.Map; -@Service("genericProtocolParser") +/** + * @author + */ +@Component("genericProtocolParser") @Slf4j -@AllArgsConstructor +@RequiredArgsConstructor public class GenericProtocolParser implements ProtocolParser { - private final LeadingCodeMatcher leadingCodeMatcher; private final List frameStructDispenserList; - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorInstanceSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; // 匹配首字母前导码=> 帧结构匹配前导码=> // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 @@ -44,18 +40,19 @@ public Boolean doParseProtocol(ByteBuf byteBuf) { String protocolContent = ByteBufUtil.hexDump(byteBuf); //匹配前导码 - List preCodeConfigs = leadingCodeMatcher.matchLeadingCode(protocolContent); + List preCodeConfigs = LeadingCodeMatcher.matchFrameLeadingCode(protocolContent); //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 if (preCodeConfigs.size() == 0) { - return rematch(byteBuf,protocolContent); + return rematch(byteBuf, protocolContent); } - //暂时先取第一个 + //暂时先取第一个,提升速度,使用享元模式, 减少类的创建销毁与构建 ProtocolConfig protocolConfig = preCodeConfigs.get(0); + AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); ByteBuf wholeDatagramByte = null; //通过匹配帧结构获取完整的数据包 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, preCodeConfigs.get(0))) != null) { + if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, protocolFactory)) != null) { break; } } @@ -68,76 +65,78 @@ * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 */ - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId, wholeDatagramByte); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap, protocolId); - //选取规则对应的流程实例 - DatagramEventConfig datagramEventConfig = processorInstanceSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); + //进行规则字段解析,进行匹配规则 + RuleConfig ruleConfig = getRuleConfig(protocolFactory, wholeDatagramByte); + if (ruleConfig == null) { + return false; + } //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, wholeDatagramByte); + ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte); + //以下进行业务的规则解析,同时选定流程实例 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); + DatagramEventProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain, + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText, protocolId); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain); //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); + datagramEventProvider.storeData(bizDataMap); return true; } - private Boolean rematch(ByteBuf byteBuf,String protocolContent) { + /** + * 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 + */ + private Boolean rematch(ByteBuf byteBuf, String protocolContent) { //重置位判断 byteBuf.resetReaderIndex(); //判断重置是否前移,如果没有前移,则直接判为匹配失败 if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { return false; } else { + //递归执行 return doParseProtocol(byteBuf); } } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; + //获取匹配规则->匹配规则 + private RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + //取出其中参与逻辑provider并判空 + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); + String rulePrepareFields = protocolConfig.getRulePrepareFields(); + //固定字段 + if (StringUtils.isNotEmpty(rulePrepareFields)) { + //获取统一固定字段解析 + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + //获取该协议的字段配置,用于协议规则匹配 + List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); + //获取规则 + RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, + rulePrepareFields, protocolFieldConfigs); + return ruleConfig; + } + return null; } - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + //数据构建,获取固定字段的store和业务字段store + private Map buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + Map bizDataMap = new HashMap<>(); + Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); + Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); + bizDataMap.putAll(ruleStoreObjectMap); + bizDataMap.putAll(protocolStoreObjectMap); return bizDataMap; } - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java index 8a46e32..16ce2e5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java @@ -3,6 +3,7 @@ import io.netty.buffer.ByteBuf; public interface ProtocolParser { + Boolean doParseProtocol(ByteBuf byteBuf); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java new file mode 100644 index 0000000..f7814af --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java @@ -0,0 +1,35 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.ProtocolConfigProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.ProtocolConfig; + +/** + * 存放基本协议的的加载信息 + */ +public class AbstractProtocolConfigFactory { + private final ProtocolConfigProvider protocolConfigProvider; + private final ProtocolFieldConfigProvider protocolFieldConfigProvider; + private final RuleConfigProvider ruleConfigProvider; + + public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { + this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); + this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); + this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); + } + + public ProtocolConfigProvider getProtocolConfigProvider() { + return protocolConfigProvider; + } + + public ProtocolFieldConfigProvider getProtocolFieldConfigProvider() { + return protocolFieldConfigProvider; + } + + public RuleConfigProvider getRuleConfigProvider() { + return ruleConfigProvider; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java new file mode 100644 index 0000000..6e36147 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java @@ -0,0 +1,57 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.CombinedFieldConfigProvider; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.FieldConfigProvider; +import com.casic.missiles.parser.provider.FieldRuleConfigProvider; + +/** + * 存放规则相关的的的加载信息 + */ +public class AbstractRuleConfigFactory { + + /** + * 处理字节 + */ + private final FieldConfigProvider fieldConfigProvider; + /** + * 处理组合字节解析的解码器 + */ + private final CombinedFieldConfigProvider combinedFieldConfigProvider; + /** + * 处理负责字节解析的规则配置 + */ + private final FieldRuleConfigProvider fieldRuleConfigProvider; + /** + * 处理实例流程 + */ + private final DatagramEventProvider datagramEventProvider; + + + public AbstractRuleConfigFactory(Long ruleId) { + this.fieldConfigProvider = new FieldConfigProvider(ruleId); + this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); + this.fieldRuleConfigProvider = new FieldRuleConfigProvider(ruleId); + this.datagramEventProvider = new DatagramEventProvider(ruleId); + } + + public FieldConfigProvider getFieldConfigProvider() { + return fieldConfigProvider; + } + + public CombinedFieldConfigProvider getCombinedFieldConfigProvider() { + return combinedFieldConfigProvider; + } + + public FieldRuleConfigProvider getFieldRuleConfigProvider() { + return fieldRuleConfigProvider; + } + + public DatagramEventProvider getDatagramEventProvider() { + return datagramEventProvider; + } + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java deleted file mode 100644 index 6e1719a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.factory; - - -import com.casic.missiles.pojo.ProtocolConfig; - -import java.util.List; - -/** - * 数据库访问优化(暂时未做) - *

- * 1、初始化协议解析配置,并存放到处存放缓存,对协议基本配置进行管理 - * 2、其中流程中所有的配置都经过此类进行管理,进行调用获取,增强解析速度 - */ -public interface DatagramFactory { - - /** - * 初始化 - */ - List datagramInit(); - - /** - * 根据前导码配置匹配,模糊匹配获取所有的报文项 - */ - List match(); - - /** - * 根据前导码匹配,返回报文项 - */ - List filer(); - - /** - * 保证数据的唯一性选择器 - */ - List selectOne(); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java new file mode 100644 index 0000000..87444a0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java @@ -0,0 +1,18 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +import java.util.List; + +/** + * 直接用,还是边用边创建 + */ +public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { + + + public DefaultProtocolConfigFactory(ProtocolConfig protocolConfig) { + super(protocolConfig); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java new file mode 100644 index 0000000..cce0c7c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java @@ -0,0 +1,12 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; + +public class DefaultRuleFactory extends AbstractRuleConfigFactory { + + public DefaultRuleFactory(Long ruleId) { + super(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java deleted file mode 100644 index 9ee97e0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.casic.missiles.parser.instance; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service -@Slf4j -@AllArgsConstructor -public class GeneralProcessor { - - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; - - /** - * 统一固定字段解析=>进行规则的查询的判断 - * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 - * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 - */ - @Deprecated - public boolean parseWholeDatagram(ByteBuf buffer, ProtocolConfig protocolConfig) { - try { - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap,protocolId); - //选取规则对应的流程= - DatagramEventConfig datagramEventConfig = processorSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); - //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); - //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); - //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); - //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); - //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); - return true; - } catch (Exception ex) { - log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", - ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); - return false; - } - } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; - } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); - } - - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); - return bizDataMap; - } - - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java index 25e7ad8..6a5777e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java @@ -1,23 +1,31 @@ package com.casic.missiles.parser.instance.impl; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.mapper.DatagramEventMapper; import com.casic.missiles.pojo.DatagramEventConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.SpringContextUtil; -@Service -@AllArgsConstructor +import java.util.List; +import java.util.Optional; + +/** + * @author cz + * + */ public class DefaultProcessorInstanceSelector implements ProcessorInstanceSelector { - private final DatagramEventMapper datagramEventMapper; + private static List datagramEventConfigs; + + static { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + datagramEventConfigs = datagramEventRegistry.getDatagramEventList(); + } @Override public DatagramEventConfig getProcessorInstance(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("rule_id", protocolId); - return datagramEventMapper.selectOne(queryWrapper); + Optional optionalSelectInstance = datagramEventConfigs.stream() + .filter(e -> e.getId().equals(protocolId)).limit(1).findFirst(); + return optionalSelectInstance.isPresent() ? optionalSelectInstance.get() : null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a778671..7b56a43 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,16 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import io.netty.buffer.ByteBuf; /** - * 分析匹配情况 - * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 - * 2、匹配不成功,有后续帧,可以进行下次匹配。 - * 3、匹配不成功,无后续帧,可以进行丢弃。 + * 分析匹配情况 + * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 + * 2、匹配不成功,有后续帧,可以进行下次匹配。 + * 3、匹配不成功,无后续帧,可以进行丢弃。 */ -public interface FrameStructMatcher{ +public interface FrameStructMatcher { - ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig); + ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 05320ab..8ebea78 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,23 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.ProtocolConfigMapper; +import com.casic.missiles.parser.provider.ProtocolConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Component; import java.util.List; import java.util.stream.Collectors; -@Component -@AllArgsConstructor public class LeadingCodeMatcher { - private final ProtocolConfigMapper protocolMapper; - //** 1、首字母匹配前导码, // 2、以匹配出的前导码是否在报文中条件进行前导码的匹配二次筛选 - public List matchLeadingCode(String protocolContent){ + public static List matchFrameLeadingCode(String protocolContent){ List initialConfigs = initialMatch(protocolContent); List preCodeConfigs = initialConfigs.stream() .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) @@ -26,13 +19,16 @@ } //初始化匹配前导码内容 - private List initialMatch(String protocolContent) { - String protocolStr = protocolContent.charAt(0) + ""; - QueryWrapper queryWrapper = new QueryWrapper() - .likeRight("pre_fix", protocolStr); - List protocolConfigList = protocolMapper.selectList(queryWrapper); - return protocolConfigList; + private static List initialMatch(String protocolContent) { + String firstFrameChar = protocolContent.charAt(0) + ""; + ProtocolConfigProvider protocolConfigProvider=new ProtocolConfigProvider(firstFrameChar); + return protocolConfigProvider.getMatchList(); } + + + + + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index cf2113d..e915877 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -1,32 +1,35 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(0) -@Service +@Component public class FrameLengthMatcher implements FrameStructMatcher { - @Autowired - private FieldParser fieldParser; - //超过长度 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { String dataGramContent = ByteBufUtil.hexDump(byteBuf); - if (StringUtils.isEmpty(protocolConfig.getUnpackId()) && StringUtils.isEmpty(protocolConfig.getTailStr())) { - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + //当不存在结尾标志和拆包标志,可以直接使用长度进行匹配 + if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { if (dataGramContent.length() >= totalLength) {//等于长度返回true,超出长度,切断 - ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, protocolConfig, totalLength); + ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, totalLength); return wholeDatagramByte; } else { //读的标志位前移舍弃 @@ -38,7 +41,7 @@ return null; } - private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, Integer totalLength) { byteBuf.readBytes(totalLength); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, totalLength - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 2bfc213..d527ad0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; @@ -13,7 +13,7 @@ import lombok.AllArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.nio.charset.Charset; import java.util.Map; @@ -22,32 +22,30 @@ * 后续标志验证 */ @Order(1) -@Service +@Component @AllArgsConstructor -public class FrameMarkMatcher implements FrameStructMatcher { - - private final FieldConfigDao fieldConfigDao; - private final FieldParser fieldParser; - private final FieldResolver fieldResolverManger; +public class FrameMarkMatcher implements FrameStructMatcher, FixedPropertyEnum { //帧后续标志=>结束,进行帧的重组=>有后续,1、帧移位判别 2、继续接收帧 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig UnpackConfig = StringUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getUnpackId()); - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); - Integer upback = 0; + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); ByteBuf mergeWholeFrameByte = null; - if (!ObjectUtil.isEmpty(UnpackConfig)) { - while (hasNextFullFrame(byteBuf, protocolConfig)) { - upback = (Integer) fieldResolverManger.filedParserManger(byteBuf, UnpackConfig, null); + if (!ObjectUtil.isEmpty(unpackFlag)) { + while (hasNextFullFrame(byteBuf, protocolConfig, protocolFieldConfigProvider)) { //是否存在后续位 - if (upback == 1) {//使用esayRule + if (unpackFlag == 1) {//使用esayRule //表示可以截取 - mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolConfig, totalLength); + mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolFieldConfigProvider, protocolConfig); return mergeWholeFrameByte; } else { - byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig)); + byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig, protocolFieldConfigProvider)); } } } @@ -56,7 +54,8 @@ //选取第一个帧,将业务内容和后面部分分开 //计算数据报文-业务内容 - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolFieldConfigProvider protocolFieldConfigProvider, ProtocolConfig protocolConfig) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); //截取完整报文 byteBuf.readBytes(totalLength); ByteBuf byteBufContent = byteBuf.slice(0, byteBuf.readerIndex()); @@ -68,15 +67,15 @@ String tail = ""; System.out.println(ByteBufUtil.hexDump(byteBufContent)); //会存在多个帧拼接在一起的的情况,进行合并处理 - while (hasNextFullFrame(byteBufContent, protocolConfig)) { - Integer currentFrameLength = fieldParser.getTotalLength(protocolConfig, byteBufContent); + while (hasNextFullFrame(byteBufContent, protocolConfig, protocolFieldConfigProvider)) { + Integer currentFrameLength = protocolFieldConfigProvider.getTotalLength(byteBufContent, protocolConfig); byteBufContent.readBytes(currentFrameLength); ByteBuf currentbyteBuf = byteBufContent.slice(0, byteBufContent.readerIndex()); byteBufContent.markReaderIndex();//读的标志位前移 System.out.println(ByteBufUtil.hexDump(byteBufContent)); String hexDump = currentbyteBuf.toString(Charset.forName("ISO-8859-1")); //获取当前固定帧结构的关系map - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, currentbyteBuf); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(currentbyteBuf, protocolConfig); if (StringUtils.isEmpty(mergeFrameStr)) { //首次获取业务数据报文 mergeFrameStr += hexDump.substring(0, currentFrameFixedProperty.get("tailPosition")); @@ -95,22 +94,22 @@ /** * 获取平移到下一帧起始位置 */ - public int getNextFrameOffset(ByteBuf buffer, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, buffer); - return currentFrameFixedProperty.get("totalLength"); + public int getNextFrameOffset(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + return currentFrameFixedProperty.get(TOTAL_LENGTH); } /** * 判断是否出错进行整个帧的 */ - public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, byteBuf); + public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); //保证读取位置不在固定位置,是可变的业务内容 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("fixedPosition")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(FIXED_POSITION)) { return false; } //判断读取是否操作帧长度 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("totalLength")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(TOTAL_LENGTH)) { return false; } return true; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 76a3784..c3a1bab 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -1,50 +1,50 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.parser.instance.GeneralProcessor; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; +import io.netty.buffer.ByteBufUtil;; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(2) -@Service +@Component public class FrameTailMatcher implements FrameStructMatcher { - @Resource - private FieldConfigDao fieldConfigDao; - @Autowired - private GeneralProcessor generalProcessor; - //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig tailFieldConfig = StringUtils.isEmpty(protocolConfig.getTailStr()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getTailStr()); - if (!ObjectUtil.isEmpty(tailFieldConfig)) { - String tailStr = tailFieldConfig.getFieldName(); + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfig protocolFieldConfig = ObjectUtils.isEmpty(protocolConfig.getTailStr()) ? null : + fieldConfigProvider.getFieldConfigById(protocolConfig.getTailStr()); + if (!ObjectUtil.isEmpty(protocolFieldConfig)) { + String tailStr = protocolFieldConfig.getFieldName(); String dataGramContent = ByteBufUtil.hexDump(byteBuf); Boolean tailFlag = ByteBufUtil.hexDump(byteBuf).contains(tailStr); if (!tailFlag) { //使用esayRule return null; } else if (dataGramContent.indexOf(tailStr) < dataGramContent.length() - tailStr.length()) { Integer length = dataGramContent.indexOf(tailStr) + tailStr.length(); - ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, protocolConfig, length); + ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, length); return wholeDatagramByte; //存在粘包 } } return null; } - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer length) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, Integer length) { byteBuf.readBytes(length); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, length - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java new file mode 100644 index 0000000..5f1c177 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java @@ -0,0 +1,73 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.combined.GenericCombinedFieldResolver; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.CombinedFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class CombinedFieldConfigProvider { + + + /** + * 作为临时配置列表缓存使用 + */ + private final List combinedFieldConfigList; + private Map storeObjectMap = new HashMap<>(); + + public CombinedFieldConfigProvider(Long ruleId) { + CombinedFieldConfigRegistry combinedFieldConfigRegistry = SpringContextUtil.getBean(CombinedFieldConfigRegistry.class); + combinedFieldConfigList = combinedFieldConfigRegistry.getCombinedFieldConfigList(ruleId); + } + + public void parseDataField(RuleConfig ruleConfig, String clearZeroPlain,Map fieldConfigsMap ) { + if (showSkip()) { + return; + } + //匹配对应的数据,然后进行相关的字段解析 + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver(); + combinedFieldResolver.parseDataField(combinedFieldConfigList, byteBuf, storeObjectMap,fieldConfigsMap); + } + + + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getCombinedFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return combinedFieldConfigList.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public List getCombinedFieldConfigList() { + return combinedFieldConfigList; + } + + /* 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(combinedFieldConfigList) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java new file mode 100644 index 0000000..f3cfedc --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java @@ -0,0 +1,11 @@ +package com.casic.missiles.parser.provider; + +/** + * @author cz + * @date 2023-6-12 + */ +public class CommandEventProvider{ + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java new file mode 100644 index 0000000..70eec5e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java @@ -0,0 +1,77 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.safe.SafeStrategy; +import com.casic.missiles.parser.sender.DataSubscribeProvider; +import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class DatagramEventProvider { + + private final DatagramEventConfig processorInstance; + + public DatagramEventProvider(Long ruleId) { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + List datagramEventConfigList = + datagramEventRegistry.getDatagramEventList(ruleId); + processorInstance = this.getProcessorInstance(datagramEventConfigList); + } + + public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { + if (showSkip()) { + return null; + } + return datagramEventConfigList.get(0); + } + + // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 + public String getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap) { + String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? + processorInstance.getSafeBean() : + fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); + if (!StringUtils.isEmpty(safeName)) { + //需要加密 + SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); + String plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); + return clearComplementZero(plain); + } + return ByteBufUtil.hexDump(bizDataContent); + } + + //解密清零操作 + private String clearComplementZero(String plain) { + plain = plain.substring(0, plain.lastIndexOf("00")); + return plain; + } + + //数据发送,数据发送者暂未构建 + public void storeData(Map bizDataMap) { + DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); +// dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return ObjectUtils.isNotEmpty(processorInstance) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java new file mode 100644 index 0000000..7e1fe0a --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java @@ -0,0 +1,97 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.FieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class FieldConfigProvider { + + + private final List fieldConfigs; + private Map storeObjectMap = new HashMap<>(); +// private Map singleObjects = new ConcurrentHashMap<>(); + + public FieldConfigProvider(Long ruleId) { + FieldConfigRegistry fieldConfigRegistry = SpringContextUtil.getBean(FieldConfigRegistry.class); + fieldConfigs = fieldConfigRegistry.getFieldConfigList(ruleId); + } + + public List getFieldConfigs() { + return fieldConfigs; + } + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public Map parseDataField(RuleConfig ruleConfig, String clearZeroPlain) { + if (showSkip()) { + return null; + } + List prepareFieldConfig = prepareParseField(ruleConfig); + if (CollectionUtils.isNotEmpty(prepareFieldConfig)) { + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(fieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + return fixDataMap; + } + } + return null; + } + + /** + * 得到需要处理的业务内容 + * + * @return + */ + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return fieldConfigs.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public Map getFieldConfigsMap() { + return fieldConfigs.stream().collect( + Collectors.toMap(FieldConfig::getId, e -> e) + ); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(fieldConfigs) ? false : true; + } + + +} + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java new file mode 100644 index 0000000..817bfaf --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java @@ -0,0 +1,19 @@ +package com.casic.missiles.parser.provider; + +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.registry.FieldRuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; + +public class FieldRuleConfigProvider { + + private final List fieldRuleConfigList; + + public FieldRuleConfigProvider(Long ruleId) { + FieldRuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(FieldRuleConfigRegistry.class); + fieldRuleConfigList = ruleConfigRegistry.getFieldRuleConfigList(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java new file mode 100644 index 0000000..99a1b06 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java @@ -0,0 +1,53 @@ +package com.casic.missiles.parser.provider; + + +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.registry.ProtocolConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolConfigProvider { + + private final List protocolConfigList; + + public ProtocolConfigProvider(String firstChar) { + ProtocolConfigRegistry registry = SpringContextUtil.getBean(ProtocolConfigRegistry.class); + protocolConfigList = registry.getProtocolConfigList(firstChar); + } + + public List getMatchList() { + return protocolConfigList; + } + + /** + * 设置当前协议 + * + * @param protocolConfig + */ + public ProtocolConfigProvider(ProtocolConfig protocolConfig) { + List protocolConfigs = new ArrayList<>(); + protocolConfigs.add(protocolConfig); + protocolConfigList = protocolConfigs; + } + + /** + * 获取当前协议 + * + * @return + */ + public ProtocolConfig getCurrentProtocolConfig() { + if (this.protocolConfigList == null) { + return null; + } else { + return protocolConfigList.get(0); + } + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java new file mode 100644 index 0000000..043927d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java @@ -0,0 +1,213 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.registry.ProtocolFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolFieldConfigProvider { + + private static final String FIXED_FIELD_DS = "fixedFieldDs"; + private static final String CONTENT_FIELD_DS = "contentFieldDs"; + private static final String PROTOCOL_LENGTH = "protocolLength"; + private static final String PROTOCOL_FIELD_ID = "protocolFieldId"; + private static final String PROTOCOL_POSITION = "protocolPosition"; + + private final List protocolFieldConfigs; + private Map singleObjects = new ConcurrentHashMap<>(); + private Map storeObjectMap = new HashMap<>(); + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public ProtocolFieldConfigProvider(Long protocolId) { + ProtocolFieldConfigRegistry protocolFieldConfigRegistry = SpringContextUtil.getBean(ProtocolFieldConfigRegistry.class); + protocolFieldConfigs = protocolFieldConfigRegistry.getProtocolFieldConfigList(protocolId); + } + + public List getProtocolFieldConfigs() { + return protocolFieldConfigs; + } + + public ProtocolFieldConfig getFieldConfigById(Long fieldId) { + Optional optionalConfig = protocolFieldConfigs.stream().filter( + e -> e.getId().equals(fieldId) + ).findFirst(); + return optionalConfig.isPresent() ? optionalConfig.get() : null; + } + + public Integer getProtocolFieldValue(Long protocolFieldId, ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_FIELD_ID + protocolFieldId + ByteBufUtil.hexDump(byteBuf); + //获取缓存 + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + //加载固定长度数据集合 + Map fixDataMap = this.getProtocolDataMap(byteBuf); + ProtocolFieldConfig protocolFieldConfig = selectFieldConfig(protocolFieldId); + Integer protocolFieldValue = 0; + //获取约定字段的总长度 + if (fixDataMap.containsKey(protocolFieldConfig.getFieldName())) { + Object appointUnpackObject = fixDataMap.get(protocolFieldConfig.getFieldName()); + if (ObjectUtils.isNotEmpty(appointUnpackObject)) { + protocolFieldValue = (Integer) appointUnpackObject; + } + } + if (protocolFieldValue != null) { + //加入缓存 + if (ObjectUtils.isNotEmpty(protocolFieldValue)) { + this.singleObjects.put(catchKey, protocolFieldValue); + return protocolFieldValue; + } + } + return null; + } + + /** + * 获取帧固定位置信息 + * + * @param byteBuf + * @param protocolConfig + * @return + */ + public Map getFixedProperty(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_POSITION + protocolConfig.getId(); + if (this.singleObjects.containsKey(catchKey)) { + return (Map) singleObjects.get(catchKey); + } + Map fixedPropertyMap = new HashMap<>(); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + fixedPropertyMap = fieldParser.doGetFixedProperty(protocolFieldConfigs, this.getTotalLength(byteBuf,protocolConfig)); + if (CollectionUtils.isNotEmpty(fixedPropertyMap)) { + this.singleObjects.put(catchKey, fixedPropertyMap); + return fixedPropertyMap; + } + return fixedPropertyMap; + } + + /** + * 获取帧结构应有的总长度 + */ + public Integer getTotalLength(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_LENGTH + ByteBufUtil.hexDump(byteBuf); + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + Integer appointFrameLength = getProtocolFieldValue(protocolConfig.getTotalLengthId(), byteBuf); + if (appointFrameLength != null) { + //获取过滤的字段集合总长度 + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Integer totalFilterLength = fieldParser.getTotalFilterLength(protocolConfig, byteBuf, getFixFieldConfigMap()); + //计算总长度 + Integer totalLength = appointFrameLength + totalFilterLength; + //加入缓存 + if (ObjectUtils.isNotEmpty(totalLength)) { + this.singleObjects.put(catchKey, totalLength); + return totalLength; + } + } + return null; + } + + /** + * 获取协议有关字段解析内容 + * storeObjectMap存储代转存的数据 + * + * @return + */ + public Map getProtocolDataMap(ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(FIXED_FIELD_DS)) { + return (Map) singleObjects.get(FIXED_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(protocolFieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + this.singleObjects.put(FIXED_FIELD_DS, fixDataMap); + return fixDataMap; + } + return null; + } + + /** + * 获取业务报文内容的content字节 + * + * @param wholeDatagramByte + * @return + */ + public ByteBuf getDataContentBuf(ByteBuf wholeDatagramByte) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(CONTENT_FIELD_DS)) { + return (ByteBuf) singleObjects.get(CONTENT_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + ByteBuf bizDataByteBuf = fieldParser.getDataContentBuf(protocolFieldConfigs, wholeDatagramByte); + if (bizDataByteBuf != null) { + this.singleObjects.put(CONTENT_FIELD_DS, bizDataByteBuf); + return bizDataByteBuf; + } + return null; + } + + + private ProtocolFieldConfig selectFieldConfig(Long id) { + Optional optionalProtocolFieldConfig = this.protocolFieldConfigs.stream().filter( + e -> e.getId().equals(id) + ).findFirst(); + return optionalProtocolFieldConfig.isPresent() ? optionalProtocolFieldConfig.get() : null; + } + + + private Map getFixFieldConfigMap() { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, e -> e) + ); + return fixDataFieldMap; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(protocolFieldConfigs) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java new file mode 100644 index 0000000..dafba1c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java @@ -0,0 +1,56 @@ +package com.casic.missiles.parser.provider; + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.rule.GenericRuleResolver; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.RuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleConfigProvider { + + private final List ruleConfigs; + + public List getRuleConfigs() { + return ruleConfigs; + } + + public RuleConfigProvider(Long protocolId) { + RuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(RuleConfigRegistry.class); + ruleConfigs = ruleConfigRegistry.getRuleConfigById(protocolId); + } + + /** + * 获取规则匹配结果 + * + * @param parseFixedDataMap + * @param protocolFieldConfigs + * @return + */ + public RuleConfig doGetRule(Map parseFixedDataMap, + String ids, + List protocolFieldConfigs) { + if (showSkip()) { + return null; + } + RuleConfig ruleConfig = GenericRuleResolver.machRule(parseFixedDataMap, ids, protocolFieldConfigs, ruleConfigs); + return ruleConfig; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(ruleConfigs) ? false : true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java index 3c05891..856b399 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java @@ -1,18 +1,11 @@ package com.casic.missiles.parser.resolver; -import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.springframework.web.bind.annotation.RequestBody; -import javax.annotation.Resource; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -20,19 +13,17 @@ @Slf4j public class ByteMergeProvider { - @Resource - private FieldRuleEngineMapper fieldRuleEngineMapper; - //拿到所有的值合并到一个值 - public String resolveByteMerge(List valueList, String ruletypeId, String vaildRange) { + public static String resolveByteMerge(List valueList, String ruleTypeId, String vaildRange) { String values = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Map vaildMap = getValidRangeMap(vaildRange); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(ruletypeId); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } + //暂时不处理 +// fieldRuleEngine = fieldRuleConfigMapper.selectById(ruleTypeId); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } Map env2 = new HashMap(); for (int i = 0; i < valueList.size(); i++) { if (vaildMap.containsKey(i)) { @@ -47,7 +38,7 @@ } } - private Map getValidRangeMap(String vaildRange) { + private static Map getValidRangeMap(String vaildRange) { String[] range = vaildRange.split(","); Map vaildMap = new HashMap(); for (int i = 0; i < range.length; i++) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 8d821cd..85d6bbf 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -1,9 +1,12 @@ package com.casic.missiles.parser.resolver; +import com.casic.missiles.pojo.AbstractFieldConfig; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; import io.netty.buffer.ByteBuf; +import java.util.List; import java.util.Map; /** @@ -11,18 +14,14 @@ */ public interface FieldParser { -// Map fieldProcess(String protocolContent,); - Map dataParser(RuleConfig ruleConfig, String lightText,String protocolId); + Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength); - Map fixDataParser(String protocolId, ByteBuf buffer); + Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap); - Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf); + ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer); - ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer); - - ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer); - - Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer); + Integer getTotalFilterLength(ProtocolConfig protocolConfig, ByteBuf byteBuf, Map protocolFieldConfigMap); } + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java new file mode 100644 index 0000000..9e0c00e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java @@ -0,0 +1,52 @@ +package com.casic.missiles.parser.resolver; + +import com.casic.missiles.pojo.AbstractFieldConfig; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.util.List; + +public class FieldParserSupport { + + //分别计算bit和byte长度=> 合并长度 + protected Integer calculateLength(List fieldConfigList) { + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + Integer fixedLength = bytefixedLength + bitfixedLength / 8; + return fixedLength; + } + + //找到最大值=> 根据最大值计算业务数据下标 + protected Integer calculatePosition(List fieldConfigList) { + String rex = "[0-9]+"; + Integer max = -1; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) + && Integer.valueOf(fieldConfig.getOriginPositionByte()) > max) { + max = Integer.valueOf(fieldConfig.getOriginPositionByte()); + } + } + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) && fieldConfig.getOriginPositionByte().equals(max)) { + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + } + } + Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; + return maxFixedPosition; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java deleted file mode 100644 index dd3a6cd..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java +++ /dev/null @@ -1,170 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.ByteResolverParam; -import io.netty.buffer.ByteBuf; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -/** - * 字段解析管理总类 - */ -@Service -@Slf4j -@AllArgsConstructor -public class FieldResolver extends ByteMergeProvider { - - //1、字段截取 => 2、简单的字节解析和复杂的字节解析 - public Object filedParserManger(ByteBuf byteBuf, FieldConfig fieldConfig, Integer maxFixedPosition) { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - //最大固定位置不为空, - if (!ObjectUtil.isEmpty(maxFixedPosition)) { - orignPosition -= maxFixedPosition; - } - Object fieldValue = 0; - //待优化 - if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { - fieldValue = bitToResolver(byteBuf, fieldConfig); - } else { - ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); - fieldValue = parsingFields(fieldBytes, fieldConfig.getRuleJson()); - } - return fieldValue; - } - - //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, - //目前默认配置的规则设置暂不支持配置化,由实现完成 - private Object parsingFields(ByteBuf byteBuf, String ruleJson) { - Object fieldsResolveValue = null; - List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); - if (ObjectUtil.isEmpty(ruleMapList)) { - fieldsResolveValue = defaultResolveBuilder(byteBuf); - } else { - fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); - } - return fieldsResolveValue; - } - - private Object defaultResolveBuilder(ByteBuf byteBuf) { - Integer defaultResolveValue = 0; - for (int i = 0; i < byteBuf.writerIndex(); i++) { - defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; - } - return defaultResolveValue; - } - - //字段解析构建器(针对字节单位的) - //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 - // 字节归并结束或者规则结束=>继续根据规则进行判断 - private Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { - Object customizeResolveValue = null; - try { - List bytStrList = new ArrayList<>(); - //存放到数组里面 - for (int i = 0; i < byteBuf.writerIndex(); i++) { - bytStrList.add(byteBuf.readByte()); - } - int i = 0; - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - customizeResolveValue = this.resolveByteMerge(bytStrList, ruletypeId,vaildRange); - break; - } else { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - List tempBytStr = new ArrayList<>(); - for (int k = 0; i < bytStrList.size(); i++) { - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(k) - .value(bytStrList.get(k)) - .ruletypeId(ruletypeId).build(); - tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); - } - bytStrList = tempBytStr; - } - i++; - } - //字节归并到一起=>继续根据规则进行判断 - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(customizeResolveValue) - .ruletypeId(ruletypeId).build(); - customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(customizeResolveValue)); - return customizeResolveValue; - } catch (RuntimeException ex) { - log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); - return null; - } - } - - /** - * 1、单个字节情况表示字段 - * 2、多字节情况表示字段(暂未处理) - */ - private Object bitToResolver(ByteBuf byteBuf, FieldConfig fieldConfig) { - Object fieldValue = new Object(); - try { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - byte fields = 0x00; - if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); - } else { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); - } - - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { - if (!StringUtils.isEmpty(fieldConfig.getExactOrignPosition())) { - fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getExactOrignPosition())).byteValue() - >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); - } else { - fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); - } - } else { - fieldValue = Integer.valueOf(fields & 0xff); - } - if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { - return fieldValue; - } - List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); - int i = 0; - //字节归并到一起=>继续根据规则进行判断 - while (i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(fieldValue) - .ruletypeId(ruletypeId).build(); - fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(fieldValue)); - return fieldValue; - } catch (RuntimeException ex) { - log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); - return null; - } - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java new file mode 100644 index 0000000..1d2aeab --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java @@ -0,0 +1,36 @@ +package com.casic.missiles.parser.resolver.bytes; + +import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.mapper.FieldRuleConfigMapper; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.pojo.ByteResolverParam; +import com.googlecode.aviator.AviatorEvaluator; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; +//转换规则 +@Component("convert") +@AllArgsConstructor +@Slf4j +public class ByteRuleResolver implements ByteResolver { + + private final FieldRuleConfigMapper fieldRuleConfigMapper; + + @Override + public Object resolveOperationRule(ByteResolverParam byteResolverParam){ + FieldRuleConfig fieldRuleEngine=fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); + if(ObjectUtil.isEmpty(fieldRuleEngine)){ + return byteResolverParam.getValue(); + } + String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); + Map env2 = new HashMap(); + env2.put("value", (byte) byteResolverParam.getValue()); + String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); + return values; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java index 103821c..786b71c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java @@ -2,34 +2,34 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("logicalShift") +@Component("logicalShift") @AllArgsConstructor @Slf4j public class LogicalShiftResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //字节位移 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { Integer index = byteResolverParam.getIndex(); - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return byteResolverParam.getValue(); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java index 476747d..01149bd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("operation") +@Component("operation") @AllArgsConstructor @Slf4j public class OperationResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //混合运算,有常量或者乘除的缩放 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java index 0b82cf4..79abcce 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.casic.missiles.pojo.ByteResolverParam; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; //精度计算 -@Service("precision") +@Component("precision") @AllArgsConstructor @Slf4j public class PrecisionResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java deleted file mode 100644 index 5c3f332..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; -//转换规则 -@Service("convert") -@AllArgsConstructor -@Slf4j -public class RuleResolver implements ByteResolver { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam){ - RuleEvaluator fieldRuleEngine=fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); - if(ObjectUtil.isEmpty(fieldRuleEngine)){ - return byteResolverParam.getValue(); - } - String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); - Map env2 = new HashMap(); - env2.put("value", (byte) byteResolverParam.getValue()); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java new file mode 100644 index 0000000..d3bbd91 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java @@ -0,0 +1,15 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; + +import java.util.List; +import java.util.Map; +// 前导码匹配->长度字段 +public interface AbstractCombinedFieldProcessor { + + Map invoke(Map map, ByteBuf byteBuf, List combinedFieldConfigList, + Map fieldConfigsMap, Map storeObjectMap); + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java new file mode 100644 index 0000000..03c8480 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java @@ -0,0 +1,59 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-13 + */ +//依次递增进行数据的解析, +public class GenericCombinedFieldResolver { + + + //通过查询,字段长度长度随机 + public void parseDataField(List combinedFieldConfigList, ByteBuf byteBuf, + Map storeObjectMap, Map fieldConfigsMap) { + Integer frameLength = Integer.valueOf(ByteBufUtil.hexDump(byteBuf)); + //添加前置处理器 + com.casic.missiles.util.ClassUtil classUtil = new com.casic.missiles.util.ClassUtil(); + List abstractCombinedProcessors = classUtil.getSubClassList(AbstractCombinedFieldProcessor.class); + + Map fieldFixedMap = combinedFieldLeadCodeMap(combinedFieldConfigList); + //frameLength + Map combinedProcessorFields = null; + while (byteBuf.readableBytes() < frameLength) { + //一直处理 + for (AbstractCombinedFieldProcessor abstractCombinedProcessor : abstractCombinedProcessors) { + combinedProcessorFields = abstractCombinedProcessor.invoke(combinedProcessorFields, byteBuf, + combinedFieldConfigList, + fieldConfigsMap, storeObjectMap); + if (combinedProcessorFields == null || byteBuf.readableBytes() < frameLength) { + return; + } + } + + } + } + + /** + * 取出前导码匹配集合 + */ + private Map combinedFieldLeadCodeMap(List combinedFieldConfigList) { + Map fieldFixedMap = combinedFieldConfigList + .stream() + .collect(Collectors.toMap(CombinedFieldConfig::getPrefixCode, e -> e)); + return fieldFixedMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java new file mode 100644 index 0000000..643a934 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java @@ -0,0 +1,100 @@ +package com.casic.missiles.parser.resolver.fields; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.FieldParserSupport; +import com.casic.missiles.pojo.*; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 保存使用时最基本的信息,并且使用原型模式 + */ +@Slf4j +public class DefaultProtocolFieldParser extends FieldParserSupport implements FieldParser, FixedPropertyEnum { + + //通过传入的配置和报文进行字段解析 + @Override + public Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap) { + Map dataMap = new HashMap<>(); + for (AbstractFieldConfig protocolFieldConfig : protocolFieldConfigs) { + if (!ObjectUtils.isEmpty(protocolFieldConfig.getOriginPositionByte())) { + Object fieldValue = FieldResolver.parseField(buffer, protocolFieldConfig, null); + if (protocolFieldConfig.getIsStorage() == 1) { + storeObjectMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + dataMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + } + return dataMap; + } + + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength) { + Map fixedPropertyMap = new HashMap<>(); + Integer fixedLength = calculateLength(protocolFieldConfigs); + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + fixedPropertyMap.put(FIXED_POSITION, maxFixedPosition); + fixedPropertyMap.put(TOTAL_LENGTH, totalLength); + fixedPropertyMap.put(TAIL_POSITION, totalLength - fixedLength + maxFixedPosition); + return fixedPropertyMap; + } + + //** 获取业务内容的byteBuf + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer) { + //计算固定长度 + Integer fixedLength = calculateLength(protocolFieldConfigs); + //总长度获取 + String lightText = buffer.toString(Charset.forName("ISO-8859-1")); + Integer totalLength = lightText.length(); + //计算固定长度最大长度 + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + //计算数据报文内容 + ByteBuf bizDataFields = buffer.slice(maxFixedPosition - 1, (totalLength - fixedLength)); + return bizDataFields; + } + + /** + * 获取过滤字段的长度 + */ + @Override + public Integer getTotalFilterLength(ProtocolConfig protocolConfig, + ByteBuf byteBuf, + Map protocolFieldConfigMap) { + if (ByteBufUtil.hexDump(byteBuf).equals("")) { + return 0; + } + int totalFilterLength = 0; + String filterFields = protocolConfig.getTotalLengthFilterFields(); + try { + if (!StringUtils.isEmpty(filterFields)) { + String[] filterFieldList = filterFields.split(","); + for (String filterFieldId : filterFieldList) { + if (StringUtils.isNotEmpty(filterFieldId)) { + ProtocolFieldConfig fieldConfig = protocolFieldConfigMap.get(Long.valueOf(filterFieldId)); + //这里都是按字节计算,没有对位进行区分,可能会出现错误 + // 如果对位有需求,需要进一步跟进 + totalFilterLength += fieldConfig.getOffsetLength(); + } + } + } + return totalFilterLength; + } catch (Exception ex) { + log.error("报文确认分发阶段,获取报文总长度过滤长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); + } + return totalFilterLength; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java new file mode 100644 index 0000000..d51e887 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java @@ -0,0 +1,169 @@ +package com.casic.missiles.parser.resolver.fields; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.parser.resolver.ByteMergeProvider; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.AbstractFieldConfig; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.pojo.ByteResolverParam; +import io.netty.buffer.ByteBuf; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * 字段解析管理总类 + */ +@Slf4j +public class FieldResolver extends ByteMergeProvider { + + //1、字段截取 => 2、简单的字节解析和复杂的字节解析 + public static Object parseField(ByteBuf byteBuf,AbstractFieldConfig fieldConfig, Integer maxFixedPosition) { + Integer orignPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + //最大固定位置不为空, + if (!ObjectUtil.isEmpty(maxFixedPosition)) { + orignPosition -= maxFixedPosition; + } + Object fieldValue = 0; + //待优化 + if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { + fieldValue = doParseBitField(byteBuf, fieldConfig); + } else { + ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); + fieldValue = doParseByteField(fieldBytes, fieldConfig.getRuleJson()); + } + return fieldValue; + } + + //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, + //目前默认配置的规则设置暂不支持配置化,由实现完成 + private static Object doParseByteField(ByteBuf byteBuf, String ruleJson) { + Object fieldsResolveValue = null; + List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); + if (ObjectUtil.isEmpty(ruleMapList)) { + fieldsResolveValue = defaultResolveBuilder(byteBuf); + } else { + fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); + } + return fieldsResolveValue; + } + + private static Object defaultResolveBuilder(ByteBuf byteBuf) { + Integer defaultResolveValue = 0; + for (int i = 0; i < byteBuf.writerIndex(); i++) { + defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; + } + return defaultResolveValue; + } + + //字段解析构建器(针对字节单位的) + //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 + // 字节归并结束或者规则结束=>继续根据规则进行判断 + private static Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { + Object customizeResolveValue = null; + try { + List bytStrList = new ArrayList<>(); + //存放到数组里面 + for (int i = 0; i < byteBuf.writerIndex(); i++) { + bytStrList.add(byteBuf.readByte()); + } + int i = 0; + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { + if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + customizeResolveValue = resolveByteMerge(bytStrList, ruletypeId, vaildRange); + break; + } else { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + List tempBytStr = new ArrayList<>(); + for (int k = 0; i < bytStrList.size(); i++) { + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(k) + .value(bytStrList.get(k)) + .ruletypeId(ruletypeId).build(); + tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); + } + bytStrList = tempBytStr; + } + i++; + } + //字节归并到一起=>继续根据规则进行判断 + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(null) + .value(customizeResolveValue) + .ruletypeId(ruletypeId).build(); + customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); + i++; + } + System.out.println(JSON.toJSON(customizeResolveValue)); + return customizeResolveValue; + } catch (RuntimeException ex) { + log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); + return null; + } + } + + /** + * 1、单个字节情况表示字段 + * 2、多字节情况表示字段(暂未处理) + */ + private static Object doParseBitField(ByteBuf byteBuf,AbstractFieldConfig fieldConfig) { + Object fieldValue = new Object(); + try { + Integer orignPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + byte fields = 0x00; + if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { + fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); + } else { + fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); + } + + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { + if (!StringUtils.isEmpty(fieldConfig.getOriginPositionBit())) { + fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getOriginPositionBit())).byteValue() + >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); + } else { + fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); + } + } else { + fieldValue = Integer.valueOf(fields & 0xff); + } + if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { + return fieldValue; + } + List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); + int i = 0; + //字节归并到一起=>继续根据规则进行判断 + while (i < ruleMapList.size()) { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(null) + .value(fieldValue) + .ruletypeId(ruletypeId).build(); + fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); + i++; + } + System.out.println(JSON.toJSON(fieldValue)); + return fieldValue; + } catch (RuntimeException ex) { + log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); + return null; + } + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java deleted file mode 100644 index 35ae3d0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java +++ /dev/null @@ -1,183 +0,0 @@ -package com.casic.missiles.parser.resolver.fields; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufAllocator; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; -import org.springframework.util.ObjectUtils; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service("standard") -@AllArgsConstructor -@Slf4j -public class StandardFieldParser implements FieldParser { - - private final FieldConfigDao fieldConfigDao; - private final FieldResolver fieldResolver; - - //数据解析 - @Override - public Map dataParser(RuleConfig ruleConfig, String lightText, String protocolId) { - String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); - ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); - bufferContent.writeBytes(lightText.getBytes(Charset.forName("ISO-8859-1"))); - Map dataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - for (String dataFieldId : dataFieldIds) { - FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(dataFieldId); - if (!ObjectUtils.isEmpty(fieldConfig)) { - dataMap.put(fieldConfig.getFieldName(), String.valueOf(fieldResolver.filedParserManger(bufferContent, fieldConfig, maxFixedPosition))); - } - } - return dataMap; - } - - //数据解析 - @Override - public Map fixDataParser(String protocolId, ByteBuf buffer) { - List dataFieldIdList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Map dataMap = new HashMap<>(); - for (FieldConfig dataField : dataFieldIdList) { - if (!ObjectUtils.isEmpty(dataField.getOrignPosition())) { - Object fieldValue = (Integer) fieldResolver.filedParserManger(buffer, dataField, null); - dataMap.put(dataField.getFieldName(), fieldValue); - } - } - return dataMap; - } - - @Override - public Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf) { - if (ByteBufUtil.hexDump(byteBuf).equals("")) { - return 0; - } - String filterFields = protocolConfig.getTotalLengthFilterField(); - Integer totalLength = 0; - try { - FieldConfig totalFieldConfig = fieldConfigDao.getFieldConfigById(protocolConfig.getTotalLengthId()); - int totalFilterLength = 0; - if (!StringUtils.isEmpty(filterFields)) { - String[] filterFieldList = filterFields.split(","); - for (String filterField : filterFieldList) { - FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(filterField); - //这里都是按字节计算,没有对位进行区分,可能会出现错误 - - // 如果对位有需求,需要进一步跟进 - totalFilterLength += fieldConfig.getOffsetLength(); - } - } - totalLength = (Integer) fieldResolver.filedParserManger(byteBuf, totalFieldConfig, null) + totalFilterLength; - } catch (Exception ex) { - log.error("报文确认分发阶段,获取报文总长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); - } - return totalLength; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer) { - //业务内容 - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - String protocolId = String.valueOf(protocolConfig.getId()); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - //计算固定长度 - Integer fixedLength = calculateLength(fieldConfigList); -// Integer totalLength = this.getTotalLength(protocolConfig, buffer); - //总长度获取 - Integer totalLength = lightText.length(); - //计算固定长度最大长度 - Integer maxFixedPosition = calculatePosition(fieldConfigList); -// buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - //计算数据报文内容 - ByteBuf bizDataFields = buffer.slice(maxFixedPosition-1, (totalLength - fixedLength)); - return bizDataFields; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer) { - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - String protocolId = String.valueOf(protocolConfig.getId()); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer fixedLength = calculateLength(fieldConfigList); -// Integer totalLength = this.getTotalLength(protocolConfig, buffer); - Integer totalLength = lightText.length(); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - ByteBuf fixDataFields = buffer.slice(0, maxFixedPosition); - return fixDataFields; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer) { - String protocolId = String.valueOf(protocolConfig.getId()); - Map fixedPropertyMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer fixedLength = calculateLength(fieldConfigList); - Integer totalLength = this.getTotalLength(protocolConfig, buffer); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - fixedPropertyMap.put("fixedPosition", maxFixedPosition); - fixedPropertyMap.put("totalLength", totalLength); - fixedPropertyMap.put("tailPosition", totalLength - fixedLength + maxFixedPosition); - return fixedPropertyMap; - } - - //分别计算bit和byte长度=> 合并长度 - private Integer calculateLength(List fieldConfigList) { - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (FieldConfig fieldConfig : fieldConfigList) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - Integer fixedLength = bytefixedLength + bitfixedLength / 8; - return fixedLength; - } - - //找到最大值=> 根据最大值计算业务数据下标 - private Integer calculatePosition(List fieldConfigList) { - String rex = "[0-9]+"; - Integer max = -1; - for (FieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOrignPosition()) - && Integer.valueOf(fieldConfig.getOrignPosition()) > max) { - max = Integer.valueOf(fieldConfig.getOrignPosition()); - } - } - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (FieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOrignPosition()) && fieldConfig.getOrignPosition().equals(max)) { - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - } - } - Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; - return maxFixedPosition; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java new file mode 100644 index 0000000..d4ec6c7 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java @@ -0,0 +1,76 @@ +package com.casic.missiles.parser.rule; + +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import org.apache.commons.lang3.StringUtils; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class GenericRuleResolver { + + //根据前置字段的值,找到指定的规则 + //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 + //=>循环判断=>通过规则得到业务字段 + public static RuleConfig machRule(Map fixDataMap, + String ids, + List protocolFieldConfigs, + List ruleConfigs) { + List preRuleConfigList = getPreRuleList(ids, protocolFieldConfigs); + //获取前置规则字段 + final Map metaDataMap = getPreRuleFields(preRuleConfigList, fixDataMap); + //准备固定的字段集合 + Map fixDataFieldMap = getFixDataFieldMap(protocolFieldConfigs); + return RuleResolverCore.doMachRule(ruleConfigs, metaDataMap, fixDataMap, fixDataFieldMap); + } + + private static Map getFixDataFieldMap(List protocolFieldConfigs) { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, ProtocolFieldConfig::getFieldName) + ); + return fixDataFieldMap; + } + + + /** + * 查询前置规则的字段配置 + * + * @param ids + * @return + */ + private static List getPreRuleList(String ids, List protocolFieldConfigs) { + String[] idList = ids.split(","); + Map prepareMaps = new HashMap<>(); + for (String id : idList) { + if (StringUtils.isNotEmpty(id)) { + prepareMaps.put(Long.valueOf(id), ""); + } + } + List preRuleConfigList = protocolFieldConfigs + .stream() + .filter(e -> prepareMaps.containsKey(e.getId())) + .collect(Collectors.toList()); + return preRuleConfigList; + } + + /** + * 获取前置规则解析字段 + */ + private static Map getPreRuleFields(List preRuleFieldConfigList, Map fixDataMap) { + Map ruleFieldMap = new HashMap<>(); + preRuleFieldConfigList.stream() + .forEach( + preRuleFieldConfig -> { + String fieldName = preRuleFieldConfig.getFieldName(); + if (fixDataMap.containsKey(fieldName)) { + ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); + } + } + ); + return ruleFieldMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java new file mode 100644 index 0000000..baae7e8 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -0,0 +1,68 @@ +package com.casic.missiles.parser.rule; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.casic.missiles.pojo.RuleConfig; + +import java.util.*; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleResolverCore { + + + public static RuleConfig doMachRule(List ruleConfigList, Map metaDataMap, + Map fixDataMap, + Map fixDataFieldMap) { + Optional ruleConfigOptional = ruleConfigList.stream() + .filter(ruleConfig -> machRuleConfig( + JSON.parseObject(ruleConfig.getMatchRuleJson(), Map.class), metaDataMap)) + .findFirst(); + if (ObjectUtil.isEmpty(ruleConfigOptional)) { + return null; + } + String[] ruleFields = ruleConfigOptional.get().getDataFieldIds().split(","); + Map ruleMetaDataMap = getRuleFields(ruleFields, fixDataMap, fixDataFieldMap); + //递归选定解析规则,进行规则解析 + if (!ruleConfigOptional.get().getIsFinishMatch().equals("1")) { + //递归选定规则 + doMachRule(ruleConfigList, ruleMetaDataMap, fixDataMap, fixDataFieldMap); + } + return ruleConfigOptional.get(); + } + + + private static Map getRuleFields(String[] preRuleConfigList, Map fixedDataMap, + Map fixedFieldMap) { + Map ruleFieldMap = new HashMap<>(); + for (String preRuleConfigId : preRuleConfigList) { + String fieldName = fixedFieldMap.get(preRuleConfigId); + if (fixedDataMap.containsKey(fieldName)) { + ruleFieldMap.put(fieldName, String.valueOf(fixedDataMap.get(fieldName))); + } + } + return ruleFieldMap; + } + + + //匹配规则配置 + private static Boolean machRuleConfig(Map ruleMap, Map metaDataMap) { + if (ruleMap == null || metaDataMap == null) { + return null; + } + //所有的字段在规则里面必须有有配置 + for (String key : metaDataMap.keySet()) { + if (ruleMap.containsKey(key)) { + if (!ruleMap.get(key).equals(metaDataMap.get(key))) { + return false; + } + } else { + return false; + } + } + return true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java deleted file mode 100644 index 664088d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java +++ /dev/null @@ -1,92 +0,0 @@ -package com.casic.missiles.parser.rule; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.mapper.dao.PreRuleConfigDao; -import com.casic.missiles.mapper.dao.RuleConfigDao; -import lombok.AllArgsConstructor; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.*; -import java.util.stream.Collectors; - -@Service -@AllArgsConstructor -public class RulerProvider { - - private final FieldConfigDao fieldConfigDao; - private final PreRuleConfigDao preRuleConfigDao; - private final RuleConfigDao ruleConfigDao; - - //根据前置字段的值,找到指定的规则 - //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 - //=>循环判断=>通过规则得到业务字段 - public RuleConfig ruleConfig(Map fixDataMap, String protocolId) { - //批量获取规则 - List preRuleConfigList = preRuleConfigDao.getPreRuleList(protocolId); - //获取固定字段 - Map fixFieldMap = getAllFieldMap(protocolId); - //获取前置规则字段 - final String preRuleFields = getPreRuleFields(preRuleConfigList, fixDataMap, fixFieldMap); - List ruleConfigList = ruleConfigDao.getRuleConfigById(protocolId); - Optional ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig ->preRuleFields.equals( ruleConfig.getParseRuleJson())).findFirst(); - //递归选定解析规则,进行规则解析 - while (!ObjectUtil.isEmpty(ruleConfigOptional) && !ruleConfigOptional.get().getIsBizField().equals("1")) { - String ruleFields = getRuleFields(ruleConfigOptional.get().getDataFieldIds().split(","), fixDataMap, fixFieldMap); - ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig -> ruleConfig.getParseRuleJson().equals(ruleFields)).findFirst(); - } - return ruleConfigOptional.get(); - } - - /** - * 获取前置规则解析字段 - */ - private String getPreRuleFields(List preRuleConfigList, Map fixDataMap, Map fixFieldMap) { - Map ruleFieldMap= new HashMap<>(); - preRuleConfigList.stream() - .forEach( - preRuleConfig -> { - String fieldName = fixFieldMap.get(Long.valueOf(preRuleConfig.getRuleFieldId())); - if (fixDataMap.containsKey(fieldName)) { - ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); - } - } - ); - return JSONObject.toJSONString(ruleFieldMap); - } - - private Map getAllFieldMap(String protocolId) { - List fieldList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Map fixFieldMap = fieldList.stream().collect( - Collectors.toMap(FieldConfig::getId, FieldConfig::getFieldName) - ); - return fixFieldMap; - } - - private String getRuleFields(String[] preRuleConfigList, Map fixDataMap, Map fixFieldMap) { - Map ruleFieldMap= new HashMap<>(); - for (String preRuleConfigId : preRuleConfigList) { - String fieldName = fixFieldMap.get(preRuleConfigId); - if (fixDataMap.containsKey(fieldName)) { - ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); - } - } - return JSONObject.toJSONString(ruleFieldMap); - } - - //弃置 - private String ListToString(List ruleFieldList) { - String ruleFields = ""; - for (String ruleField : ruleFieldList) { - ruleFields += ruleField + ","; - } - ruleFields = StringUtils.isEmpty(ruleFields) ? ruleFields : ruleFields.substring(0, ruleFields.length() - 1); - return ruleFields; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java index 6177e10..bfa87a5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java @@ -2,7 +2,7 @@ public interface SafeStrategy { - String decryption(byte[] bytes); + String decryption(String cipher); String encryption(String lightText); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java index 618716c..6236302 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java @@ -9,9 +9,9 @@ //十六进制的字符串转换成字节数组 byte[] bytes = hexStrToBinaryStr(msg); //计算CRC8 - byte crc8 = CRC8(bytes, 0, bytes.length); - String crc8ToStr = "" + Integer.toHexString(0xff & crc8); - return crc8ToStr; +// String crc8ToStr = "" + Integer.toHexString(0xff & crc8); +// return crc8ToStr; + return null; } /** @@ -33,50 +33,5 @@ return bytes; } - /** - * CRC8 校验 多项式 x8+x2+x+1 - * - * @param b - * @param off - * @param len - * @return - */ - public static byte CRC8(final byte[] b, final int off, final int len) { - byte result = 0x00; - for (int i = 0; i < len; i++) { - result = CHECKSUM_TABLE[(result ^ (b[i + off] & 0xFF)) & 0xFF]; - } - return (byte) (result & 0xFFL); - } - - private final static byte[] CHECKSUM_TABLE = {(byte) 0x00, (byte) 0x07, (byte) 0x0e, (byte) 0x09, (byte) 0x1c, (byte) 0x1b, - (byte) 0x12, (byte) 0x15, (byte) 0x38, (byte) 0x3f, (byte) 0x36, (byte) 0x31, (byte) 0x24, (byte) 0x23, (byte) 0x2a, - (byte) 0x2d, (byte) 0x70, (byte) 0x77, (byte) 0x7e, (byte) 0x79, (byte) 0x6c, (byte) 0x6b, (byte) 0x62, (byte) 0x65, - (byte) 0x48, (byte) 0x4f, (byte) 0x46, (byte) 0x41, (byte) 0x54, (byte) 0x53, (byte) 0x5a, (byte) 0x5d, (byte) 0xe0, - (byte) 0xe7, (byte) 0xee, (byte) 0xe9, (byte) 0xfc, (byte) 0xfb, (byte) 0xf2, (byte) 0xf5, (byte) 0xd8, (byte) 0xdf, - (byte) 0xd6, (byte) 0xd1, (byte) 0xc4, (byte) 0xc3, (byte) 0xca, (byte) 0xcd, (byte) 0x90, (byte) 0x97, (byte) 0x9e, - (byte) 0x99, (byte) 0x8c, (byte) 0x8b, (byte) 0x82, (byte) 0x85, (byte) 0xa8, (byte) 0xaf, (byte) 0xa6, (byte) 0xa1, - (byte) 0xb4, (byte) 0xb3, (byte) 0xba, (byte) 0xbd, (byte) 0xc7, (byte) 0xc0, (byte) 0xc9, (byte) 0xce, (byte) 0xdb, - (byte) 0xdc, (byte) 0xd5, (byte) 0xd2, (byte) 0xff, (byte) 0xf8, (byte) 0xf1, (byte) 0xf6, (byte) 0xe3, (byte) 0xe4, - (byte) 0xed, (byte) 0xea, (byte) 0xb7, (byte) 0xb0, (byte) 0xb9, (byte) 0xbe, (byte) 0xab, (byte) 0xac, (byte) 0xa5, - (byte) 0xa2, (byte) 0x8f, (byte) 0x88, (byte) 0x81, (byte) 0x86, (byte) 0x93, (byte) 0x94, (byte) 0x9d, (byte) 0x9a, - (byte) 0x27, (byte) 0x20, (byte) 0x29, (byte) 0x2e, (byte) 0x3b, (byte) 0x3c, (byte) 0x35, (byte) 0x32, (byte) 0x1f, - (byte) 0x18, (byte) 0x11, (byte) 0x16, (byte) 0x03, (byte) 0x04, (byte) 0x0d, (byte) 0x0a, (byte) 0x57, (byte) 0x50, - (byte) 0x59, (byte) 0x5e, (byte) 0x4b, (byte) 0x4c, (byte) 0x45, (byte) 0x42, (byte) 0x6f, (byte) 0x68, (byte) 0x61, - (byte) 0x66, (byte) 0x73, (byte) 0x74, (byte) 0x7d, (byte) 0x7a, (byte) 0x89, (byte) 0x8e, (byte) 0x87, (byte) 0x80, - (byte) 0x95, (byte) 0x92, (byte) 0x9b, (byte) 0x9c, (byte) 0xb1, (byte) 0xb6, (byte) 0xbf, (byte) 0xb8, (byte) 0xad, - (byte) 0xaa, (byte) 0xa3, (byte) 0xa4, (byte) 0xf9, (byte) 0xfe, (byte) 0xf7, (byte) 0xf0, (byte) 0xe5, (byte) 0xe2, - (byte) 0xeb, (byte) 0xec, (byte) 0xc1, (byte) 0xc6, (byte) 0xcf, (byte) 0xc8, (byte) 0xdd, (byte) 0xda, (byte) 0xd3, - (byte) 0xd4, (byte) 0x69, (byte) 0x6e, (byte) 0x67, (byte) 0x60, (byte) 0x75, (byte) 0x72, (byte) 0x7b, (byte) 0x7c, - (byte) 0x51, (byte) 0x56, (byte) 0x5f, (byte) 0x58, (byte) 0x4d, (byte) 0x4a, (byte) 0x43, (byte) 0x44, (byte) 0x19, - (byte) 0x1e, (byte) 0x17, (byte) 0x10, (byte) 0x05, (byte) 0x02, (byte) 0x0b, (byte) 0x0c, (byte) 0x21, (byte) 0x26, - (byte) 0x2f, (byte) 0x28, (byte) 0x3d, (byte) 0x3a, (byte) 0x33, (byte) 0x34, (byte) 0x4e, (byte) 0x49, (byte) 0x40, - (byte) 0x47, (byte) 0x52, (byte) 0x55, (byte) 0x5c, (byte) 0x5b, (byte) 0x76, (byte) 0x71, (byte) 0x78, (byte) 0x7f, - (byte) 0x6a, (byte) 0x6d, (byte) 0x64, (byte) 0x63, (byte) 0x3e, (byte) 0x39, (byte) 0x30, (byte) 0x37, (byte) 0x22, - (byte) 0x25, (byte) 0x2c, (byte) 0x2b, (byte) 0x06, (byte) 0x01, (byte) 0x08, (byte) 0x0f, (byte) 0x1a, (byte) 0x1d, - (byte) 0x14, (byte) 0x13, (byte) 0xae, (byte) 0xa9, (byte) 0xa0, (byte) 0xa7, (byte) 0xb2, (byte) 0xb5, (byte) 0xbc, - (byte) 0xbb, (byte) 0x96, (byte) 0x91, (byte) 0x98, (byte) 0x9f, (byte) 0x8a, (byte) 0x8d, (byte) 0x84, (byte) 0x83, - (byte) 0xde, (byte) 0xd9, (byte) 0xd0, (byte) 0xd7, (byte) 0xc2, (byte) 0xc5, (byte) 0xcc, (byte) 0xcb, (byte) 0xe6, - (byte) 0xe1, (byte) 0xe8, (byte) 0xef, (byte) 0xfa, (byte) 0xfd, (byte) 0xf4, (byte) 0xf3}; } \ No newline at end of file diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java index 27c2838..6e078a3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java @@ -1,9 +1,6 @@ package com.casic.missiles.parser.safe.impl; -import cn.hutool.core.util.CharsetUtil; -import cn.hutool.crypto.symmetric.SM4; -import cn.hutool.crypto.symmetric.SymmetricCrypto; - +import com.casic.missiles.parser.safe.SafeStrategy; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; @@ -11,19 +8,44 @@ import org.bouncycastle.crypto.engines.SM4Engine; import org.bouncycastle.crypto.params.KeyParameter; import org.bouncycastle.util.encoders.Hex; - -import static cn.hutool.crypto.Mode.ECB; -import static cn.hutool.crypto.Padding.NoPadding; +import org.springframework.stereotype.Component; /** * SM4算法工具类 */ @Slf4j -public class Sm4 { +@Component("sm4") +public class Sm4 implements SafeStrategy { //加解密的字节快大小 public static final int BlockSize = 16; + @Override + public String decryption(String cipher) { + byte[] keyByte = { + 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 + }; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(keyByte); + byte[] in = Hex.decode(cipher); + byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); + String plain = EcbDecrypt(in, keyBytes); + return plain; + } + + @Override + public String encryption(String cipher) { + byte[] keyByte = { + 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 + }; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(keyByte); + byte[] in = Hex.decode(cipher); + byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); + String plain = EcbDecrypt(in, keyBytes); + return plain; + } + /** * SM4ECB加密算法,对内 * @@ -32,8 +54,6 @@ * @return */ private static byte[] ecb_encrypt(byte[] in, byte[] keyBytes) { - - SM4Engine sm4Engine = new SM4Engine(); sm4Engine.init(true, new KeyParameter(keyBytes)); byte[] out = new byte[in.length]; @@ -58,27 +78,6 @@ return cipher; } - - /** - * hutool 解密SM4 - * - * @param encodeContent - * @return - */ - public static String decode(String encodeContent) { - String key = "24ad182507479a5da3ad94d9d78ea203"; - try { - SymmetricCrypto sm4 = new SM4(ECB, NoPadding, key.getBytes()); - String decryptStr = sm4.decryptStr(encodeContent, CharsetUtil.CHARSET_UTF_8); - return decryptStr; - } catch (Exception e) { - e.printStackTrace(); - log.error("SM4解密失败"); - } - return null; - } - - /** * SM4的ECB加密算法 * @@ -129,20 +128,6 @@ return plain; } - /** - * SM4的ECB解密算法 - * - * @param cipher 输入的密文字符串 - * @param key 密钥 - * @return - */ - public static String EcbDecrypt(String cipher, String key) { - byte[] in = Hex.decode(cipher); - byte[] keyBytes = Hex.decode(key); - - String plain = EcbDecrypt(in, keyBytes); - return plain; - } /** * 主函数 @@ -151,28 +136,24 @@ */ public static void main(String[] args) { byte[] ciphertext = { + 0x4B, (byte) 0x8C, (byte) 0x9D, 0x08, (byte) 0xE4, (byte) 0xD3, 0x64, 0x42, (byte) 0xB9, (byte) 0xA5, (byte) 0xFE, (byte) 0xCD, (byte) 0x91, 0x1B, 0x38, (byte) 0xAC, (byte) 0xE9, 0x1C, (byte) 0xCD, 0x53, 0x02, (byte) 0xD7, 0x0C, (byte) 0x9B, (byte) 0x96, 0x30, 0x62, (byte) 0xE8, (byte) 0xFB, (byte) 0xEF, (byte) 0xB9, (byte) 0xFF, (byte) 0xDE, 0x19, (byte) 0x80, 0x35, 0x3E, (byte) 0x90, 0x4F, 0x2F, 0x12, 0x2B, 0x19, (byte) 0x8B, 0x6C, 0x7A, (byte) 0x85, (byte) 0xA1, (byte) 0xB1, (byte) 0x86, (byte) 0xA3, 0x7A, 0x46, 0x0C, 0x2F, (byte) 0x94, 0x4F, 0x7F, 0x2C, 0x56, 0x14, (byte) 0xF3, (byte) 0x89, (byte) 0xC3, - 0x3F, 0x20, (byte) 0xF9, (byte) 0x87, (byte) 0xA1, 0x60, (byte) 0xD9, (byte) 0xA8, (byte) 0xFD, (byte) 0xD7, (byte) 0x9B, 0x4B, 0x26, 0x06, 0x30, 0x44}; + 0x3F, 0x20, (byte) 0xF9, (byte) 0x87, (byte) 0xA1, 0x60, (byte) 0xD9, (byte) 0xA8, (byte) 0xFD, (byte) 0xD7, (byte) 0x9B, 0x4B, 0x26, 0x06, 0x30, 0x44 + }; ByteBuf in = ByteBufAllocator.DEFAULT.heapBuffer(); in.writeBytes(ciphertext); - byte[] keyByte = { 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 }; ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); - key.writeBytes(ciphertext); - String resCipherData = decode(ByteBufUtil.hexDump(in)); - ByteBuf out = ByteBufAllocator.DEFAULT.heapBuffer(); -// out.writeBytes(resCipherData); -// System.out.println(hexBytes); - System.out.println(resCipherData.toString()); -// String resPlainData = EcbDecrypt(resCipherData, key); -// System.out.println("原始明文:" + data); -// System.out.println("解密后明文:" + resPlainData); + key.writeBytes(keyByte); +// String resCipherData = EcbDecrypt(ByteBufUtil.hexDump(in), ByteBufUtil.hexDump(key)); +// System.out.println(resCipherData); } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java index 1395a51..ac5f957 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java @@ -1,7 +1,7 @@ package com.casic.missiles.parser.safe.impl; import io.netty.buffer.ByteBufUtil; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** *

@@ -14,9 +14,8 @@ * @author hyl * @version v1.0: Tea.java, v 0.1 2021/3/12 13:48 $ */ -@Service("tea") -///tea算法类 - +//tea算法类 +@Component("tea") public class Tea { public static byte[] MyTea_Encrypt(byte[] MyTeaContent, int ByteLen, byte[] MyTeakey) { @@ -99,7 +98,6 @@ // for(int i32Index = 0; i32Index < 8; i32Index++) { // System.out.print("0x" + Integer.toHexString(MyContent[i32Index]) + " "); // } - // System.out.println("密钥为:"); // for(int i32Index = 0; i32Index < 16; i32Index++) { // System.out.print("0x" + Integer.toHexString(MyKeys[i32Index]) + " "); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java index bdd0721..bd1516a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java @@ -3,7 +3,7 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.parser.sender.DataSubscribeProvider; import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponents; import org.springframework.web.util.UriComponentsBuilder; @@ -12,7 +12,7 @@ import java.util.Collections; import java.util.Map; -@Service("functionCallback") +@Component("functionCallback") public class FunctionCallback implements DataSubscribeProvider { @Resource diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java index 0b44fb9..7526de2 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.Map; -@Service("middleware") +@Component("middleware") public class MiddlewareSubscribe implements DataSubscribeProvider { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java index 5dcee3f..e2f1192 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.Map; -@Service("nosql") +@Component("nosql") public class NoSqlSubscribe implements DataSubscribeProvider { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java b/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java new file mode 100644 index 0000000..81a5324 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java @@ -0,0 +1,86 @@ +package com.casic.missiles.pojo; + +import lombok.Data; + +/** + * 协议 + */ +@Data +public class Msg { + + /** + * 前导码 + */ + private String preamble; + + /** + * 版本号 + */ + private String version; + + /** + * 内容长度 + */ + private int leng; + + /** + * 设备ID + */ + private String deviceId; + + /** + * 通讯方式 + */ + private Integer connType; + + /** + * 加密方式 + */ + private Integer encryType; + + /** + * 目标地址 + */ + private String destAddr; + + /** + * PDUType + */ + private String PDUType; + + /** + * 操作类型 + */ + private Integer operateType; + + /** + * 传输控制位 PDUType.bit7=0时,表示存在后续的访问;当PDUType.bit7=1时,表示无后续的访问。 + */ + private Integer transControlFlag; + + /** + * 设备类型 + */ + private Integer deviceType; + + /** + * 序号 + */ + private Integer seq; + + /** + * tagList + */ + private String tagList; + + /** + * OidList + */ + private String OidList; + + /** + * CRC + */ + private String CRC; + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java index 40a5265..97cc984 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java @@ -40,7 +40,7 @@ String httpContent = msg.toString(Charset.defaultCharset()); log.info(" String : " + msg.toString(Charset.defaultCharset())); String majorContent = httpContent.substring(httpContent.indexOf("{"), httpContent.lastIndexOf("}") + 1); - String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("serviceData")).get("Value")); + String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("RegistryData")).get("Value")); log.info("----------------------------------" + values); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); bufferContent.writeBytes(values.getBytes(Charset.forName("ISO-8859-1"))); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java index 1b132a7..e3ced4b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java @@ -35,7 +35,7 @@ String httpContent = msg.toString(Charset.defaultCharset()); log.info(" String : " + msg.toString(Charset.defaultCharset())); String majorContent = httpContent.substring(httpContent.indexOf("{"), httpContent.lastIndexOf("}") + 1); - String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("serviceData")).get("Value")); + String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("RegistryData")).get("Value")); log.info("----------------------------------" + values); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); bufferContent.writeBytes(values.getBytes(Charset.forName("ISO-8859-1"))); diff --git a/sensorhub-core/src/main/resources/application.properties b/sensorhub-core/src/main/resources/application.properties deleted file mode 100644 index 8b13789..0000000 --- a/sensorhub-core/src/main/resources/application.properties +++ /dev/null @@ -1 +0,0 @@ - diff --git a/sensorhub-core/src/main/resources/config/application-dev.yml b/sensorhub-core/src/main/resources/config/application-dev.yml index 4f897a8..dcc4c2d 100644 --- a/sensorhub-core/src/main/resources/config/application-dev.yml +++ b/sensorhub-core/src/main/resources/config/application-dev.yml @@ -4,9 +4,9 @@ spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true + url: jdbc:mysql://127.0.0.1:3306/sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true username: root - password: Casic203 + password: root session: store-type: redis redis: diff --git a/sensorhub-core/src/main/resources/config/application.yml b/sensorhub-core/src/main/resources/config/application.yml index ae89f9d..7965da1 100644 --- a/sensorhub-core/src/main/resources/config/application.yml +++ b/sensorhub-core/src/main/resources/config/application.yml @@ -30,6 +30,13 @@ port: 6379 password: ew5T4K3#203lwh config-prefix: 'Casic:' +#代码生成器配置 +code: + generate: + #作者 + author: cz + #待生成对象表名 + table-name: bussiness_field_config,combined_field_config sensorhub: config: port: 7091 diff --git a/sensorhub-support/pom.xml b/sensorhub-support/pom.xml index 9a71296..761601c 100644 --- a/sensorhub-support/pom.xml +++ b/sensorhub-support/pom.xml @@ -42,6 +42,12 @@ ${redis.version} + + com.baomidou + mybatis-plus-generator + ${mybatis-plus-generator.version} + + org.reflections diff --git a/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java b/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java new file mode 100644 index 0000000..515ca53 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java @@ -0,0 +1,14 @@ +package com.casic.missiles.enums; + +/** + * @author + * @date + */ +public interface FixedPropertyEnum { + + String FIXED_POSITION = "fixedPosition"; + + String TOTAL_LENGTH = "totalLength"; + + String TAIL_POSITION = "tailPosition"; +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/CombinedFieldMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CombinedFieldMapper.java new file mode 100644 index 0000000..38e8f42 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CombinedFieldMapper.java @@ -0,0 +1,15 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.CombinedFieldConfig; +import org.apache.ibatis.annotations.Mapper; + +/** + * @author cz + * + */ +@Mapper +public interface CombinedFieldMapper extends BaseMapper { + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java new file mode 100644 index 0000000..128b09d --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java @@ -0,0 +1,10 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.CommandEventConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface CommandEventMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java new file mode 100644 index 0000000..042eb3c --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.DatagramEventConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface DatagramEventConfigMapper extends BaseMapper { +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java new file mode 100644 index 0000000..fc95cf4 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java @@ -0,0 +1,8 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.FieldConfig; + +public interface FieldConfigMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldRuleConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldRuleConfigMapper.java new file mode 100644 index 0000000..b310a08 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldRuleConfigMapper.java @@ -0,0 +1,10 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.FieldRuleConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface FieldRuleConfigMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java new file mode 100644 index 0000000..9060a69 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.ProtocolConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface ProtocolConfigMapper extends BaseMapper { +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolFieldConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolFieldConfigMapper.java new file mode 100644 index 0000000..1b47180 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolFieldConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +public interface ProtocolFieldConfigMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java new file mode 100644 index 0000000..6fa6936 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.RuleConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface RuleConfigMapper extends BaseMapper { +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/AbstractFieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/AbstractFieldConfig.java new file mode 100644 index 0000000..ba9aea2 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/AbstractFieldConfig.java @@ -0,0 +1,38 @@ +package com.casic.missiles.pojo; + +import lombok.Data; + +@Data +public class AbstractFieldConfig { + /** + * 字段名称 + */ + private String fieldName; + /** + * 按照字段评估进行字段解析 + */ + private String ruleJson; + /** + * 起始位置(单位byte) + */ + private Integer OriginPositionByte; + /** + * 起始位置,是否需要bit位置(单位bit)小于8, 没有不需要填写 + */ + private String OriginPositionBit; + /** + * 偏移长度 + */ + private Integer offsetLength; + /** + * 偏移单位(bit/byte) + */ + private String offsetUnit; + /** + * 是否需要转存 + */ + private Integer isStorage; + + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/CombinedFieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/CombinedFieldConfig.java new file mode 100644 index 0000000..4f4de6a --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/CombinedFieldConfig.java @@ -0,0 +1,41 @@ +package com.casic.missiles.pojo; + +import lombok.Data; + +import java.util.Date; + +/** + * 组合配置 + * + * @author cz + * @date 20 + */ +@Data +public class CombinedFieldConfig { + + private Long id; + private Long ruleId; + /** + * 前缀编码 + */ + private String prefixCode; + + /** + * 字段动态的id + */ + private Long dynamicLengthId; + /** + * 对应的要解析字段的ids + */ + private String dataFieldIds; + + /** + * 字段动态的id + */ + private String combinedFieldIds; + + private Date lastTime; + + private Date createTime; + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldConfig.java index a07d20d..8304dc6 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldConfig.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldConfig.java @@ -5,31 +5,28 @@ import java.util.Date; +/** + * @author cz + * 1、该表与实际解析的内容实例解析有关 + * 2、该表字段是随机出现的,和帧结构无关,无法预料的 + * 3、该表字段解析根据FieldEvaluatorConfig进行字段解析 + */ @Data -@TableName("field_config") -public class FieldConfig { +@TableName("business_field_config") +public class FieldConfig extends AbstractFieldConfig { private Long id; -// private String preFieldConfig; - private Long protocolId; - - private String isFixed; - private String uploadDeliveryChange; - - private String replyRule; - private String ruleJson; - + /** + * 协议配置id + */ + private Long ruleId; + /** + * 字段名称 + */ private String fieldName; - private String isStorage; - private Integer orignPosition; - private String exactOrignPosition; - - private Integer offsetLength; - private String offsetUnit; private String ownerId; private Date createTime; private Date lastTime; - } diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldRuleConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldRuleConfig.java new file mode 100644 index 0000000..2e09879 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldRuleConfig.java @@ -0,0 +1,20 @@ +package com.casic.missiles.pojo; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +@TableName("field_rule_config") +@Data +public class FieldRuleConfig { + + private Long id; + private String name; + private String desc; + private String condition; + private String excuteOperation; + private Date lasTime; + private Date createTime; + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/Msg.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/Msg.java deleted file mode 100644 index 81a5324..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/Msg.java +++ /dev/null @@ -1,86 +0,0 @@ -package com.casic.missiles.pojo; - -import lombok.Data; - -/** - * 协议 - */ -@Data -public class Msg { - - /** - * 前导码 - */ - private String preamble; - - /** - * 版本号 - */ - private String version; - - /** - * 内容长度 - */ - private int leng; - - /** - * 设备ID - */ - private String deviceId; - - /** - * 通讯方式 - */ - private Integer connType; - - /** - * 加密方式 - */ - private Integer encryType; - - /** - * 目标地址 - */ - private String destAddr; - - /** - * PDUType - */ - private String PDUType; - - /** - * 操作类型 - */ - private Integer operateType; - - /** - * 传输控制位 PDUType.bit7=0时,表示存在后续的访问;当PDUType.bit7=1时,表示无后续的访问。 - */ - private Integer transControlFlag; - - /** - * 设备类型 - */ - private Integer deviceType; - - /** - * 序号 - */ - private Integer seq; - - /** - * tagList - */ - private String tagList; - - /** - * OidList - */ - private String OidList; - - /** - * CRC - */ - private String CRC; - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/PreRuleConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/PreRuleConfig.java deleted file mode 100644 index bfcf914..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/PreRuleConfig.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.casic.missiles.pojo; - -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -import java.util.Date; - -@Data -@TableName("pre_rule_config") -public class PreRuleConfig { - - private Long id; - private String protocolId; - private String ruleFieldId; - private String ownerId; - private Date createTime; - private Date lastTime; -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolConfig.java index 274ad42..bdac11f 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolConfig.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolConfig.java @@ -5,18 +5,52 @@ import java.util.Date; +/** + * 协议配置表,协议配置与帧结构有关 + * 1、层级关系,协议之后是规则,规则对应设备类型的各种上数规则 + * 2、规则对应协议配置的实例流程 + * 3、每种可根据设备类型和操作类型进行上数规则进行区分 + */ @Data @TableName("protocol_config") public class ProtocolConfig { private Long id; + /** + * 前导码 + */ private String preFix; - private String unpackId; - private String totalLengthId; - private String totalLengthFilterField; + /** + * 拆包id + */ + private Long unpackId; + /** + * 总长度id + */ + private Long totalLengthId; + /** + * + */ + private String totalLengthFilterFields; + /** + * 动态长度ids + */ private String dynamicLengthId; + /** + * 动态长度json(预留字段) + */ private String dynamicLengthJson; - private String tailStr; + /** + * 规则字段所解析预准备的字段 + */ + private String rulePrepareFields; + /** + * 结尾标志 + */ + private Long tailStr; + /** + * 备注 + */ private String remark; private String ownerId; private Date createTime; diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolFieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolFieldConfig.java new file mode 100644 index 0000000..db794bd --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolFieldConfig.java @@ -0,0 +1,43 @@ +package com.casic.missiles.pojo; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +/** + * 协议字段配置表 + * 该表用户存放帧结构固定格式的字段 + * 有以下两个用途 + * (1)、固定格式的字段可用于规则匹配 + * (2)、固定格式的字段可用于报文回复 + * @author cz + * @date 2023-06-09 + */ +@Data +@TableName("protocol_field_config") +public class ProtocolFieldConfig extends AbstractFieldConfig{ + + private Long id; + /** + * 协议配置id + */ + private Long protocolId; + /** + * 上传下发是否有变化, 没有变化,可以直接组装 + */ + private String isReplyFix; + /** + * 按照字段评估进行字段解析 + */ + private Long fieldEvaluatorId; + /** + * 回复规则 + */ + private String replyRule; + + private String ownerId; + private Date createTime; + private Date lastTime; + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java index 3b53493..febf835 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java @@ -6,18 +6,40 @@ import java.util.Date; /** - * 加密字段解析和规则有关,事件调到该流程下面 + * @author cz + * todo: 匹配协议对应业务实例 + * 1、一个协议可以多种的流程规则 + * 2、规则可以支持递归规则流程 */ @Data @TableName("rule_config") public class RuleConfig { - private Long id; private String protocolId; - private String isBizField; - private String parseRuleJson; + /** + * 是否完成规则配置,没有完成, + * 则需要根据规则继续匹配 + */ + private String isFinishMatch; + /** + * 待匹配解析规则 + * {“data_field”:"data_value"} + */ + private String matchRuleJson; + /** + * 待解析字段ids + */ private String dataFieldIds; - private String aviatorFilterJson; + + /** + * 待解析组合字段ids + */ + private String combinedFieldIds; + + /** + * aviator + */ + private String conditionExpression; private Date createTime; private Date lastTime; } diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleDict.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleDict.java deleted file mode 100644 index cc7f389..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleDict.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.casic.missiles.pojo; - -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -@Data -@TableName("rule_dict") -public class RuleDict { - - private Long id; - private Long pid; - private String name; - private String code; - private String ownerId; - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java index 608af3a..32cc8a4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java @@ -2,48 +2,47 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.delivery.decorator.ByteDecorator; +import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @AllArgsConstructor public class FieldDecoratorManger { - private final RuleDictDao ruleDictDao; + private final RuleConfigRegistry ruleDictDao; // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 // (1)静态的业务字段是字典里面可以配置的 // (2)动态的业务字段是通过规则生成的 public String contentMerge(String ruleJson, String sceneConent, String dynamicContent) { - List ruleDictList = ruleDictDao.getRuleDictConfig(); - Map ruleDictMap = ruleDictList.stream().collect( - Collectors.toMap(RuleDict::getId, e -> e)); - List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); - for (Map ruleMap : ruleMapList) { - String ruleType = String.valueOf(ruleMap.get("ruleType")); - ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); - NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); - byteDecorator.nodeDecoratorRule(nodeDecoratorParm); - } +// List ruleDictList = ruleDictDao.getRuleDictConfig(); +// Map ruleDictMap = ruleDictList.stream().collect( +// Collectors.toMap(RuleDict::getId, e -> e)); +// List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); +// for (Map ruleMap : ruleMapList) { +// String ruleType = String.valueOf(ruleMap.get("ruleType")); +// ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); +// NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); +// byteDecorator.nodeDecoratorRule(nodeDecoratorParm); +// } return null; } - - private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { - NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() - .contents(sceneConent) - .dynamicContent(dynamicContent) - .ruletypeId(ruletypeId) - .ruleDictMap(ruleDictMap) - .build(); - return nodeDecoratorParm; - } +// +// private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { +// NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() +// .contents(sceneConent) +// .dynamicContent(dynamicContent) +// .ruletypeId(ruletypeId) +// .ruleDictMap(ruleDictMap) +// .build(); +// return nodeDecoratorParm; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java index 652970c..b204ac3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java @@ -1,56 +1,56 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@AllArgsConstructor -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", - JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Component; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Component("logicalDecorator") +//@AllArgsConstructor +//@Slf4j +//public class LogicalShiftDecorator implements ByteDecorator { +// +//// private final FieldRuleEngineMapper fieldRuleEngineMapper; +//// +//// //字节位移 +//// @Override +//// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +//// String logicalValue = ""; +//// RuleEvaluator fieldRuleEngine = new RuleEvaluator(); +//// try { +//// Map env2 = new HashMap(); +//// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +//// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +//// for (String contentId : contentIdList) { +//// RuleDict ruleDict = ruleDictMap.get(contentId); +//// if (ruleDict.getCode().contains("#")) { +//// //使用动态的值 +//// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +//// } +//// env2.put(ruleDict.getName(), ruleDict.getCode()); +//// } +//// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +//// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +//// return null; +//// } +//// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +//// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +//// return values; +//// } catch (Exception ex) { +//// log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", +//// JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +//// return null; +//// } +//// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java index 346468f..822fead 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@AllArgsConstructor -@Slf4j -public class OperationDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("optionDecorator") +//@AllArgsConstructor +//@Slf4j +//public class OperationDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //混合运算,有常量或者乘除的缩放 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java index 50fb0a7..7a8bccb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@AllArgsConstructor -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +////精度计算 +//@AllArgsConstructor +//@Registry("precisionDecorator") +//@Slf4j +//public class PrecisionDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java index da39235..27f9cc7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java @@ -1,54 +1,53 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@AllArgsConstructor -@Slf4j -public class RuleDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("ruleDecorator") +//@AllArgsConstructor +//@Slf4j +//public class RuleDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //吃我一套正则表达式 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (Exception ex) { +// log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java index 7f5cbf3..c043f97 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java @@ -2,6 +2,6 @@ import java.util.Map; -public interface ComandeEventService { +public interface ComandeEventService{ Map loadComandeEventConfig(String protocolId,String scene); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java index 476ad84..aaf1837 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java @@ -2,46 +2,46 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.dao.CommandEventDao; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @Slf4j @AllArgsConstructor -public class ComandeEventServiceImpl implements ComandeEventService { +public class ComandeEventServiceImpl implements ComandeEventRegistry { - private final CommandEventDao commandEventDao; + // private final CommandEventDao commandEventDao; // 加密bean 固定字段出现变化的字段解析,业务字段的有序内容 @Override - public Map loadComandeEventConfig(String protocolId,String sceneName) { - CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); - if (ObjectUtil.isEmpty(commandEventConfig)) { - log.error("协议{},没有配置成功接收回复配置,清排查原因"); - return null; - } - String replyJson = commandEventConfig.getReplyContentJson(); - List> replyMapList = JSONArray.parseObject(replyJson, List.class); - List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); - Map fixMap = fixList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); - List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) - .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) - .collect(Collectors.toList()); - Map commandConfigMap = new HashMap<>(); - commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); - commandConfigMap.put("fixContent", fixMap); - commandConfigMap.put("bizContent", contentList); - return commandConfigMap; + public Map loadComandeEventConfig(String protocolId, String sceneName) { +// CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); +// if (ObjectUtil.isEmpty(commandEventConfig)) { +// log.error("协议{},没有配置成功接收回复配置,清排查原因"); +// return null; +// } +// String replyJson = commandEventConfig.getReplyContentJson(); +// List> replyMapList = JSONArray.parseObject(replyJson, List.class); +// List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); +// Map fixMap = fixList.stream() +// .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); +// List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) +// .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) +// .collect(Collectors.toList()); +// Map commandConfigMap = new HashMap<>(); +// commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); +// commandConfigMap.put("fixContent", fixMap); +// commandConfigMap.put("bizContent", contentList); +// return commandConfigMap; + return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 128b09d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java deleted file mode 100644 index 4016b0b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface DatagramEventMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java deleted file mode 100644 index 597c306..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.apache.ibatis.annotations.Mapper; - -public interface FieldConfigMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java deleted file mode 100644 index a31680a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.PreRuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface PreRuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java deleted file mode 100644 index 9060a69..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface ProtocolConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java deleted file mode 100644 index 6fa6936..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java deleted file mode 100644 index 582a705..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleDict; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleDictMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java deleted file mode 100644 index 6e302c8..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.CommandEventMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Optional; - -@Component -public class CommandEventDao { - - @Resource - private CommandEventMapper commandEventMapper; - - public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId) - .eq("scene", sceneName) - .eq("enabled", 1); - List commandEventConfig = commandEventMapper.selectList(queryWrapper); - Optional optionalEventConfig = commandEventConfig.stream().findFirst(); - return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java deleted file mode 100644 index 9137e4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.FieldConfigMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class FieldConfigDao { - - @Resource - private FieldConfigMapper fieldConfigMapper; - - public FieldConfig getFieldConfigById(String fieldId) { - FieldConfig fieldConfig = fieldConfigMapper.selectById(fieldId); - return fieldConfig; - } - - public List getFieldConfigs(String protocolId,Integer isFixed) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",isFixed); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - - public List getStorageFieldConfig(String protocolId) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",1) - .eq("is_storage",1); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java deleted file mode 100644 index 67bff6b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.mapper.PreRuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class PreRuleConfigDao { - - @Resource - private PreRuleConfigMapper preRuleConfigMapper; - - public List getPreRuleList(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return preRuleConfigMapper.selectList(queryWrapper); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java deleted file mode 100644 index d69ea85..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.RuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleConfigDao { - - @Resource - private RuleConfigMapper ruleConfigMapper; - - public RuleConfig getNextRuleConfig(String ruleFields) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("parse_rule_json", ruleFields); - return ruleConfigMapper.selectOne(queryWrapper); - } - - - public List getRuleConfigById(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return ruleConfigMapper.selectList(queryWrapper); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java deleted file mode 100644 index 932c185..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.RuleDictMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleDictDao { - - @Resource - private RuleDictMapper ruleDictMapper; - - public List getRuleDictConfig() { - List ruleDictList = ruleDictMapper.selectList(null); - return ruleDictList; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java index 9f9e279..43bc4d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java @@ -10,20 +10,15 @@ import io.netty.channel.socket.nio.NioServerSocketChannel; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import javax.annotation.PreDestroy; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static cn.hutool.core.util.ClassUtil.getClasses; /** * SensorhubServer netty服务端 */ @Slf4j -@Service +@Component public class SensorhubServer { /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java index 2c79ff5..9a28c36 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java @@ -11,13 +11,13 @@ import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioSocketChannel; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClient 客户端 */ @Slf4j -@Service +@Registry public final class SensorhubClient { public static void main(String[] args) throws Exception { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java index 9774be0..477c3f7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java @@ -6,12 +6,12 @@ import io.netty.channel.socket.SocketChannel; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientChannelInitialHandler */ -@Service +@Registry public class SensorhubClientChannelInitialHandler extends ChannelInitializer { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java index 346f4b3..73560e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java @@ -5,13 +5,13 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientHandler */ @Slf4j -@Service +@Registry public class SensorhubClientHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java index 5c1c6f2..d990af5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java @@ -4,12 +4,12 @@ import com.casic.missiles.pojo.Msg; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** * SensorhubServerHandler */ -@Service +@Component public class SensorhubServerHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 67283ae..af3172c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,41 +1,37 @@ package com.casic.missiles.parser; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultProtocolConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.*; +import com.casic.missiles.registry.FieldConfigRegistry; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; -import java.nio.charset.Charset; import java.util.HashMap; import java.util.List; import java.util.Map; -@Service("genericProtocolParser") +/** + * @author + */ +@Component("genericProtocolParser") @Slf4j -@AllArgsConstructor +@RequiredArgsConstructor public class GenericProtocolParser implements ProtocolParser { - private final LeadingCodeMatcher leadingCodeMatcher; private final List frameStructDispenserList; - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorInstanceSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; // 匹配首字母前导码=> 帧结构匹配前导码=> // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 @@ -44,18 +40,19 @@ public Boolean doParseProtocol(ByteBuf byteBuf) { String protocolContent = ByteBufUtil.hexDump(byteBuf); //匹配前导码 - List preCodeConfigs = leadingCodeMatcher.matchLeadingCode(protocolContent); + List preCodeConfigs = LeadingCodeMatcher.matchFrameLeadingCode(protocolContent); //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 if (preCodeConfigs.size() == 0) { - return rematch(byteBuf,protocolContent); + return rematch(byteBuf, protocolContent); } - //暂时先取第一个 + //暂时先取第一个,提升速度,使用享元模式, 减少类的创建销毁与构建 ProtocolConfig protocolConfig = preCodeConfigs.get(0); + AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); ByteBuf wholeDatagramByte = null; //通过匹配帧结构获取完整的数据包 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, preCodeConfigs.get(0))) != null) { + if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, protocolFactory)) != null) { break; } } @@ -68,76 +65,78 @@ * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 */ - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId, wholeDatagramByte); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap, protocolId); - //选取规则对应的流程实例 - DatagramEventConfig datagramEventConfig = processorInstanceSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); + //进行规则字段解析,进行匹配规则 + RuleConfig ruleConfig = getRuleConfig(protocolFactory, wholeDatagramByte); + if (ruleConfig == null) { + return false; + } //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, wholeDatagramByte); + ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte); + //以下进行业务的规则解析,同时选定流程实例 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); + DatagramEventProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain, + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText, protocolId); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain); //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); + datagramEventProvider.storeData(bizDataMap); return true; } - private Boolean rematch(ByteBuf byteBuf,String protocolContent) { + /** + * 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 + */ + private Boolean rematch(ByteBuf byteBuf, String protocolContent) { //重置位判断 byteBuf.resetReaderIndex(); //判断重置是否前移,如果没有前移,则直接判为匹配失败 if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { return false; } else { + //递归执行 return doParseProtocol(byteBuf); } } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; + //获取匹配规则->匹配规则 + private RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + //取出其中参与逻辑provider并判空 + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); + String rulePrepareFields = protocolConfig.getRulePrepareFields(); + //固定字段 + if (StringUtils.isNotEmpty(rulePrepareFields)) { + //获取统一固定字段解析 + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + //获取该协议的字段配置,用于协议规则匹配 + List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); + //获取规则 + RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, + rulePrepareFields, protocolFieldConfigs); + return ruleConfig; + } + return null; } - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + //数据构建,获取固定字段的store和业务字段store + private Map buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + Map bizDataMap = new HashMap<>(); + Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); + Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); + bizDataMap.putAll(ruleStoreObjectMap); + bizDataMap.putAll(protocolStoreObjectMap); return bizDataMap; } - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java index 8a46e32..16ce2e5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java @@ -3,6 +3,7 @@ import io.netty.buffer.ByteBuf; public interface ProtocolParser { + Boolean doParseProtocol(ByteBuf byteBuf); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java new file mode 100644 index 0000000..f7814af --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java @@ -0,0 +1,35 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.ProtocolConfigProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.ProtocolConfig; + +/** + * 存放基本协议的的加载信息 + */ +public class AbstractProtocolConfigFactory { + private final ProtocolConfigProvider protocolConfigProvider; + private final ProtocolFieldConfigProvider protocolFieldConfigProvider; + private final RuleConfigProvider ruleConfigProvider; + + public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { + this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); + this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); + this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); + } + + public ProtocolConfigProvider getProtocolConfigProvider() { + return protocolConfigProvider; + } + + public ProtocolFieldConfigProvider getProtocolFieldConfigProvider() { + return protocolFieldConfigProvider; + } + + public RuleConfigProvider getRuleConfigProvider() { + return ruleConfigProvider; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java new file mode 100644 index 0000000..6e36147 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java @@ -0,0 +1,57 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.CombinedFieldConfigProvider; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.FieldConfigProvider; +import com.casic.missiles.parser.provider.FieldRuleConfigProvider; + +/** + * 存放规则相关的的的加载信息 + */ +public class AbstractRuleConfigFactory { + + /** + * 处理字节 + */ + private final FieldConfigProvider fieldConfigProvider; + /** + * 处理组合字节解析的解码器 + */ + private final CombinedFieldConfigProvider combinedFieldConfigProvider; + /** + * 处理负责字节解析的规则配置 + */ + private final FieldRuleConfigProvider fieldRuleConfigProvider; + /** + * 处理实例流程 + */ + private final DatagramEventProvider datagramEventProvider; + + + public AbstractRuleConfigFactory(Long ruleId) { + this.fieldConfigProvider = new FieldConfigProvider(ruleId); + this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); + this.fieldRuleConfigProvider = new FieldRuleConfigProvider(ruleId); + this.datagramEventProvider = new DatagramEventProvider(ruleId); + } + + public FieldConfigProvider getFieldConfigProvider() { + return fieldConfigProvider; + } + + public CombinedFieldConfigProvider getCombinedFieldConfigProvider() { + return combinedFieldConfigProvider; + } + + public FieldRuleConfigProvider getFieldRuleConfigProvider() { + return fieldRuleConfigProvider; + } + + public DatagramEventProvider getDatagramEventProvider() { + return datagramEventProvider; + } + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java deleted file mode 100644 index 6e1719a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.factory; - - -import com.casic.missiles.pojo.ProtocolConfig; - -import java.util.List; - -/** - * 数据库访问优化(暂时未做) - *

- * 1、初始化协议解析配置,并存放到处存放缓存,对协议基本配置进行管理 - * 2、其中流程中所有的配置都经过此类进行管理,进行调用获取,增强解析速度 - */ -public interface DatagramFactory { - - /** - * 初始化 - */ - List datagramInit(); - - /** - * 根据前导码配置匹配,模糊匹配获取所有的报文项 - */ - List match(); - - /** - * 根据前导码匹配,返回报文项 - */ - List filer(); - - /** - * 保证数据的唯一性选择器 - */ - List selectOne(); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java new file mode 100644 index 0000000..87444a0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java @@ -0,0 +1,18 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +import java.util.List; + +/** + * 直接用,还是边用边创建 + */ +public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { + + + public DefaultProtocolConfigFactory(ProtocolConfig protocolConfig) { + super(protocolConfig); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java new file mode 100644 index 0000000..cce0c7c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java @@ -0,0 +1,12 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; + +public class DefaultRuleFactory extends AbstractRuleConfigFactory { + + public DefaultRuleFactory(Long ruleId) { + super(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java deleted file mode 100644 index 9ee97e0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.casic.missiles.parser.instance; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service -@Slf4j -@AllArgsConstructor -public class GeneralProcessor { - - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; - - /** - * 统一固定字段解析=>进行规则的查询的判断 - * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 - * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 - */ - @Deprecated - public boolean parseWholeDatagram(ByteBuf buffer, ProtocolConfig protocolConfig) { - try { - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap,protocolId); - //选取规则对应的流程= - DatagramEventConfig datagramEventConfig = processorSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); - //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); - //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); - //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); - //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); - //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); - return true; - } catch (Exception ex) { - log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", - ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); - return false; - } - } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; - } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); - } - - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); - return bizDataMap; - } - - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java index 25e7ad8..6a5777e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java @@ -1,23 +1,31 @@ package com.casic.missiles.parser.instance.impl; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.mapper.DatagramEventMapper; import com.casic.missiles.pojo.DatagramEventConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.SpringContextUtil; -@Service -@AllArgsConstructor +import java.util.List; +import java.util.Optional; + +/** + * @author cz + * + */ public class DefaultProcessorInstanceSelector implements ProcessorInstanceSelector { - private final DatagramEventMapper datagramEventMapper; + private static List datagramEventConfigs; + + static { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + datagramEventConfigs = datagramEventRegistry.getDatagramEventList(); + } @Override public DatagramEventConfig getProcessorInstance(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("rule_id", protocolId); - return datagramEventMapper.selectOne(queryWrapper); + Optional optionalSelectInstance = datagramEventConfigs.stream() + .filter(e -> e.getId().equals(protocolId)).limit(1).findFirst(); + return optionalSelectInstance.isPresent() ? optionalSelectInstance.get() : null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a778671..7b56a43 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,16 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import io.netty.buffer.ByteBuf; /** - * 分析匹配情况 - * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 - * 2、匹配不成功,有后续帧,可以进行下次匹配。 - * 3、匹配不成功,无后续帧,可以进行丢弃。 + * 分析匹配情况 + * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 + * 2、匹配不成功,有后续帧,可以进行下次匹配。 + * 3、匹配不成功,无后续帧,可以进行丢弃。 */ -public interface FrameStructMatcher{ +public interface FrameStructMatcher { - ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig); + ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 05320ab..8ebea78 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,23 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.ProtocolConfigMapper; +import com.casic.missiles.parser.provider.ProtocolConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Component; import java.util.List; import java.util.stream.Collectors; -@Component -@AllArgsConstructor public class LeadingCodeMatcher { - private final ProtocolConfigMapper protocolMapper; - //** 1、首字母匹配前导码, // 2、以匹配出的前导码是否在报文中条件进行前导码的匹配二次筛选 - public List matchLeadingCode(String protocolContent){ + public static List matchFrameLeadingCode(String protocolContent){ List initialConfigs = initialMatch(protocolContent); List preCodeConfigs = initialConfigs.stream() .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) @@ -26,13 +19,16 @@ } //初始化匹配前导码内容 - private List initialMatch(String protocolContent) { - String protocolStr = protocolContent.charAt(0) + ""; - QueryWrapper queryWrapper = new QueryWrapper() - .likeRight("pre_fix", protocolStr); - List protocolConfigList = protocolMapper.selectList(queryWrapper); - return protocolConfigList; + private static List initialMatch(String protocolContent) { + String firstFrameChar = protocolContent.charAt(0) + ""; + ProtocolConfigProvider protocolConfigProvider=new ProtocolConfigProvider(firstFrameChar); + return protocolConfigProvider.getMatchList(); } + + + + + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index cf2113d..e915877 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -1,32 +1,35 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(0) -@Service +@Component public class FrameLengthMatcher implements FrameStructMatcher { - @Autowired - private FieldParser fieldParser; - //超过长度 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { String dataGramContent = ByteBufUtil.hexDump(byteBuf); - if (StringUtils.isEmpty(protocolConfig.getUnpackId()) && StringUtils.isEmpty(protocolConfig.getTailStr())) { - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + //当不存在结尾标志和拆包标志,可以直接使用长度进行匹配 + if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { if (dataGramContent.length() >= totalLength) {//等于长度返回true,超出长度,切断 - ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, protocolConfig, totalLength); + ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, totalLength); return wholeDatagramByte; } else { //读的标志位前移舍弃 @@ -38,7 +41,7 @@ return null; } - private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, Integer totalLength) { byteBuf.readBytes(totalLength); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, totalLength - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 2bfc213..d527ad0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; @@ -13,7 +13,7 @@ import lombok.AllArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.nio.charset.Charset; import java.util.Map; @@ -22,32 +22,30 @@ * 后续标志验证 */ @Order(1) -@Service +@Component @AllArgsConstructor -public class FrameMarkMatcher implements FrameStructMatcher { - - private final FieldConfigDao fieldConfigDao; - private final FieldParser fieldParser; - private final FieldResolver fieldResolverManger; +public class FrameMarkMatcher implements FrameStructMatcher, FixedPropertyEnum { //帧后续标志=>结束,进行帧的重组=>有后续,1、帧移位判别 2、继续接收帧 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig UnpackConfig = StringUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getUnpackId()); - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); - Integer upback = 0; + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); ByteBuf mergeWholeFrameByte = null; - if (!ObjectUtil.isEmpty(UnpackConfig)) { - while (hasNextFullFrame(byteBuf, protocolConfig)) { - upback = (Integer) fieldResolverManger.filedParserManger(byteBuf, UnpackConfig, null); + if (!ObjectUtil.isEmpty(unpackFlag)) { + while (hasNextFullFrame(byteBuf, protocolConfig, protocolFieldConfigProvider)) { //是否存在后续位 - if (upback == 1) {//使用esayRule + if (unpackFlag == 1) {//使用esayRule //表示可以截取 - mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolConfig, totalLength); + mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolFieldConfigProvider, protocolConfig); return mergeWholeFrameByte; } else { - byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig)); + byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig, protocolFieldConfigProvider)); } } } @@ -56,7 +54,8 @@ //选取第一个帧,将业务内容和后面部分分开 //计算数据报文-业务内容 - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolFieldConfigProvider protocolFieldConfigProvider, ProtocolConfig protocolConfig) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); //截取完整报文 byteBuf.readBytes(totalLength); ByteBuf byteBufContent = byteBuf.slice(0, byteBuf.readerIndex()); @@ -68,15 +67,15 @@ String tail = ""; System.out.println(ByteBufUtil.hexDump(byteBufContent)); //会存在多个帧拼接在一起的的情况,进行合并处理 - while (hasNextFullFrame(byteBufContent, protocolConfig)) { - Integer currentFrameLength = fieldParser.getTotalLength(protocolConfig, byteBufContent); + while (hasNextFullFrame(byteBufContent, protocolConfig, protocolFieldConfigProvider)) { + Integer currentFrameLength = protocolFieldConfigProvider.getTotalLength(byteBufContent, protocolConfig); byteBufContent.readBytes(currentFrameLength); ByteBuf currentbyteBuf = byteBufContent.slice(0, byteBufContent.readerIndex()); byteBufContent.markReaderIndex();//读的标志位前移 System.out.println(ByteBufUtil.hexDump(byteBufContent)); String hexDump = currentbyteBuf.toString(Charset.forName("ISO-8859-1")); //获取当前固定帧结构的关系map - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, currentbyteBuf); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(currentbyteBuf, protocolConfig); if (StringUtils.isEmpty(mergeFrameStr)) { //首次获取业务数据报文 mergeFrameStr += hexDump.substring(0, currentFrameFixedProperty.get("tailPosition")); @@ -95,22 +94,22 @@ /** * 获取平移到下一帧起始位置 */ - public int getNextFrameOffset(ByteBuf buffer, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, buffer); - return currentFrameFixedProperty.get("totalLength"); + public int getNextFrameOffset(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + return currentFrameFixedProperty.get(TOTAL_LENGTH); } /** * 判断是否出错进行整个帧的 */ - public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, byteBuf); + public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); //保证读取位置不在固定位置,是可变的业务内容 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("fixedPosition")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(FIXED_POSITION)) { return false; } //判断读取是否操作帧长度 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("totalLength")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(TOTAL_LENGTH)) { return false; } return true; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 76a3784..c3a1bab 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -1,50 +1,50 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.parser.instance.GeneralProcessor; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; +import io.netty.buffer.ByteBufUtil;; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(2) -@Service +@Component public class FrameTailMatcher implements FrameStructMatcher { - @Resource - private FieldConfigDao fieldConfigDao; - @Autowired - private GeneralProcessor generalProcessor; - //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig tailFieldConfig = StringUtils.isEmpty(protocolConfig.getTailStr()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getTailStr()); - if (!ObjectUtil.isEmpty(tailFieldConfig)) { - String tailStr = tailFieldConfig.getFieldName(); + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfig protocolFieldConfig = ObjectUtils.isEmpty(protocolConfig.getTailStr()) ? null : + fieldConfigProvider.getFieldConfigById(protocolConfig.getTailStr()); + if (!ObjectUtil.isEmpty(protocolFieldConfig)) { + String tailStr = protocolFieldConfig.getFieldName(); String dataGramContent = ByteBufUtil.hexDump(byteBuf); Boolean tailFlag = ByteBufUtil.hexDump(byteBuf).contains(tailStr); if (!tailFlag) { //使用esayRule return null; } else if (dataGramContent.indexOf(tailStr) < dataGramContent.length() - tailStr.length()) { Integer length = dataGramContent.indexOf(tailStr) + tailStr.length(); - ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, protocolConfig, length); + ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, length); return wholeDatagramByte; //存在粘包 } } return null; } - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer length) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, Integer length) { byteBuf.readBytes(length); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, length - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java new file mode 100644 index 0000000..5f1c177 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java @@ -0,0 +1,73 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.combined.GenericCombinedFieldResolver; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.CombinedFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class CombinedFieldConfigProvider { + + + /** + * 作为临时配置列表缓存使用 + */ + private final List combinedFieldConfigList; + private Map storeObjectMap = new HashMap<>(); + + public CombinedFieldConfigProvider(Long ruleId) { + CombinedFieldConfigRegistry combinedFieldConfigRegistry = SpringContextUtil.getBean(CombinedFieldConfigRegistry.class); + combinedFieldConfigList = combinedFieldConfigRegistry.getCombinedFieldConfigList(ruleId); + } + + public void parseDataField(RuleConfig ruleConfig, String clearZeroPlain,Map fieldConfigsMap ) { + if (showSkip()) { + return; + } + //匹配对应的数据,然后进行相关的字段解析 + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver(); + combinedFieldResolver.parseDataField(combinedFieldConfigList, byteBuf, storeObjectMap,fieldConfigsMap); + } + + + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getCombinedFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return combinedFieldConfigList.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public List getCombinedFieldConfigList() { + return combinedFieldConfigList; + } + + /* 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(combinedFieldConfigList) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java new file mode 100644 index 0000000..f3cfedc --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java @@ -0,0 +1,11 @@ +package com.casic.missiles.parser.provider; + +/** + * @author cz + * @date 2023-6-12 + */ +public class CommandEventProvider{ + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java new file mode 100644 index 0000000..70eec5e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java @@ -0,0 +1,77 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.safe.SafeStrategy; +import com.casic.missiles.parser.sender.DataSubscribeProvider; +import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class DatagramEventProvider { + + private final DatagramEventConfig processorInstance; + + public DatagramEventProvider(Long ruleId) { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + List datagramEventConfigList = + datagramEventRegistry.getDatagramEventList(ruleId); + processorInstance = this.getProcessorInstance(datagramEventConfigList); + } + + public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { + if (showSkip()) { + return null; + } + return datagramEventConfigList.get(0); + } + + // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 + public String getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap) { + String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? + processorInstance.getSafeBean() : + fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); + if (!StringUtils.isEmpty(safeName)) { + //需要加密 + SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); + String plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); + return clearComplementZero(plain); + } + return ByteBufUtil.hexDump(bizDataContent); + } + + //解密清零操作 + private String clearComplementZero(String plain) { + plain = plain.substring(0, plain.lastIndexOf("00")); + return plain; + } + + //数据发送,数据发送者暂未构建 + public void storeData(Map bizDataMap) { + DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); +// dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return ObjectUtils.isNotEmpty(processorInstance) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java new file mode 100644 index 0000000..7e1fe0a --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java @@ -0,0 +1,97 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.FieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class FieldConfigProvider { + + + private final List fieldConfigs; + private Map storeObjectMap = new HashMap<>(); +// private Map singleObjects = new ConcurrentHashMap<>(); + + public FieldConfigProvider(Long ruleId) { + FieldConfigRegistry fieldConfigRegistry = SpringContextUtil.getBean(FieldConfigRegistry.class); + fieldConfigs = fieldConfigRegistry.getFieldConfigList(ruleId); + } + + public List getFieldConfigs() { + return fieldConfigs; + } + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public Map parseDataField(RuleConfig ruleConfig, String clearZeroPlain) { + if (showSkip()) { + return null; + } + List prepareFieldConfig = prepareParseField(ruleConfig); + if (CollectionUtils.isNotEmpty(prepareFieldConfig)) { + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(fieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + return fixDataMap; + } + } + return null; + } + + /** + * 得到需要处理的业务内容 + * + * @return + */ + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return fieldConfigs.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public Map getFieldConfigsMap() { + return fieldConfigs.stream().collect( + Collectors.toMap(FieldConfig::getId, e -> e) + ); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(fieldConfigs) ? false : true; + } + + +} + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java new file mode 100644 index 0000000..817bfaf --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java @@ -0,0 +1,19 @@ +package com.casic.missiles.parser.provider; + +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.registry.FieldRuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; + +public class FieldRuleConfigProvider { + + private final List fieldRuleConfigList; + + public FieldRuleConfigProvider(Long ruleId) { + FieldRuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(FieldRuleConfigRegistry.class); + fieldRuleConfigList = ruleConfigRegistry.getFieldRuleConfigList(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java new file mode 100644 index 0000000..99a1b06 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java @@ -0,0 +1,53 @@ +package com.casic.missiles.parser.provider; + + +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.registry.ProtocolConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolConfigProvider { + + private final List protocolConfigList; + + public ProtocolConfigProvider(String firstChar) { + ProtocolConfigRegistry registry = SpringContextUtil.getBean(ProtocolConfigRegistry.class); + protocolConfigList = registry.getProtocolConfigList(firstChar); + } + + public List getMatchList() { + return protocolConfigList; + } + + /** + * 设置当前协议 + * + * @param protocolConfig + */ + public ProtocolConfigProvider(ProtocolConfig protocolConfig) { + List protocolConfigs = new ArrayList<>(); + protocolConfigs.add(protocolConfig); + protocolConfigList = protocolConfigs; + } + + /** + * 获取当前协议 + * + * @return + */ + public ProtocolConfig getCurrentProtocolConfig() { + if (this.protocolConfigList == null) { + return null; + } else { + return protocolConfigList.get(0); + } + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java new file mode 100644 index 0000000..043927d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java @@ -0,0 +1,213 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.registry.ProtocolFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolFieldConfigProvider { + + private static final String FIXED_FIELD_DS = "fixedFieldDs"; + private static final String CONTENT_FIELD_DS = "contentFieldDs"; + private static final String PROTOCOL_LENGTH = "protocolLength"; + private static final String PROTOCOL_FIELD_ID = "protocolFieldId"; + private static final String PROTOCOL_POSITION = "protocolPosition"; + + private final List protocolFieldConfigs; + private Map singleObjects = new ConcurrentHashMap<>(); + private Map storeObjectMap = new HashMap<>(); + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public ProtocolFieldConfigProvider(Long protocolId) { + ProtocolFieldConfigRegistry protocolFieldConfigRegistry = SpringContextUtil.getBean(ProtocolFieldConfigRegistry.class); + protocolFieldConfigs = protocolFieldConfigRegistry.getProtocolFieldConfigList(protocolId); + } + + public List getProtocolFieldConfigs() { + return protocolFieldConfigs; + } + + public ProtocolFieldConfig getFieldConfigById(Long fieldId) { + Optional optionalConfig = protocolFieldConfigs.stream().filter( + e -> e.getId().equals(fieldId) + ).findFirst(); + return optionalConfig.isPresent() ? optionalConfig.get() : null; + } + + public Integer getProtocolFieldValue(Long protocolFieldId, ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_FIELD_ID + protocolFieldId + ByteBufUtil.hexDump(byteBuf); + //获取缓存 + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + //加载固定长度数据集合 + Map fixDataMap = this.getProtocolDataMap(byteBuf); + ProtocolFieldConfig protocolFieldConfig = selectFieldConfig(protocolFieldId); + Integer protocolFieldValue = 0; + //获取约定字段的总长度 + if (fixDataMap.containsKey(protocolFieldConfig.getFieldName())) { + Object appointUnpackObject = fixDataMap.get(protocolFieldConfig.getFieldName()); + if (ObjectUtils.isNotEmpty(appointUnpackObject)) { + protocolFieldValue = (Integer) appointUnpackObject; + } + } + if (protocolFieldValue != null) { + //加入缓存 + if (ObjectUtils.isNotEmpty(protocolFieldValue)) { + this.singleObjects.put(catchKey, protocolFieldValue); + return protocolFieldValue; + } + } + return null; + } + + /** + * 获取帧固定位置信息 + * + * @param byteBuf + * @param protocolConfig + * @return + */ + public Map getFixedProperty(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_POSITION + protocolConfig.getId(); + if (this.singleObjects.containsKey(catchKey)) { + return (Map) singleObjects.get(catchKey); + } + Map fixedPropertyMap = new HashMap<>(); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + fixedPropertyMap = fieldParser.doGetFixedProperty(protocolFieldConfigs, this.getTotalLength(byteBuf,protocolConfig)); + if (CollectionUtils.isNotEmpty(fixedPropertyMap)) { + this.singleObjects.put(catchKey, fixedPropertyMap); + return fixedPropertyMap; + } + return fixedPropertyMap; + } + + /** + * 获取帧结构应有的总长度 + */ + public Integer getTotalLength(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_LENGTH + ByteBufUtil.hexDump(byteBuf); + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + Integer appointFrameLength = getProtocolFieldValue(protocolConfig.getTotalLengthId(), byteBuf); + if (appointFrameLength != null) { + //获取过滤的字段集合总长度 + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Integer totalFilterLength = fieldParser.getTotalFilterLength(protocolConfig, byteBuf, getFixFieldConfigMap()); + //计算总长度 + Integer totalLength = appointFrameLength + totalFilterLength; + //加入缓存 + if (ObjectUtils.isNotEmpty(totalLength)) { + this.singleObjects.put(catchKey, totalLength); + return totalLength; + } + } + return null; + } + + /** + * 获取协议有关字段解析内容 + * storeObjectMap存储代转存的数据 + * + * @return + */ + public Map getProtocolDataMap(ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(FIXED_FIELD_DS)) { + return (Map) singleObjects.get(FIXED_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(protocolFieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + this.singleObjects.put(FIXED_FIELD_DS, fixDataMap); + return fixDataMap; + } + return null; + } + + /** + * 获取业务报文内容的content字节 + * + * @param wholeDatagramByte + * @return + */ + public ByteBuf getDataContentBuf(ByteBuf wholeDatagramByte) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(CONTENT_FIELD_DS)) { + return (ByteBuf) singleObjects.get(CONTENT_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + ByteBuf bizDataByteBuf = fieldParser.getDataContentBuf(protocolFieldConfigs, wholeDatagramByte); + if (bizDataByteBuf != null) { + this.singleObjects.put(CONTENT_FIELD_DS, bizDataByteBuf); + return bizDataByteBuf; + } + return null; + } + + + private ProtocolFieldConfig selectFieldConfig(Long id) { + Optional optionalProtocolFieldConfig = this.protocolFieldConfigs.stream().filter( + e -> e.getId().equals(id) + ).findFirst(); + return optionalProtocolFieldConfig.isPresent() ? optionalProtocolFieldConfig.get() : null; + } + + + private Map getFixFieldConfigMap() { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, e -> e) + ); + return fixDataFieldMap; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(protocolFieldConfigs) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java new file mode 100644 index 0000000..dafba1c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java @@ -0,0 +1,56 @@ +package com.casic.missiles.parser.provider; + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.rule.GenericRuleResolver; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.RuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleConfigProvider { + + private final List ruleConfigs; + + public List getRuleConfigs() { + return ruleConfigs; + } + + public RuleConfigProvider(Long protocolId) { + RuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(RuleConfigRegistry.class); + ruleConfigs = ruleConfigRegistry.getRuleConfigById(protocolId); + } + + /** + * 获取规则匹配结果 + * + * @param parseFixedDataMap + * @param protocolFieldConfigs + * @return + */ + public RuleConfig doGetRule(Map parseFixedDataMap, + String ids, + List protocolFieldConfigs) { + if (showSkip()) { + return null; + } + RuleConfig ruleConfig = GenericRuleResolver.machRule(parseFixedDataMap, ids, protocolFieldConfigs, ruleConfigs); + return ruleConfig; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(ruleConfigs) ? false : true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java index 3c05891..856b399 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java @@ -1,18 +1,11 @@ package com.casic.missiles.parser.resolver; -import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.springframework.web.bind.annotation.RequestBody; -import javax.annotation.Resource; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -20,19 +13,17 @@ @Slf4j public class ByteMergeProvider { - @Resource - private FieldRuleEngineMapper fieldRuleEngineMapper; - //拿到所有的值合并到一个值 - public String resolveByteMerge(List valueList, String ruletypeId, String vaildRange) { + public static String resolveByteMerge(List valueList, String ruleTypeId, String vaildRange) { String values = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Map vaildMap = getValidRangeMap(vaildRange); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(ruletypeId); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } + //暂时不处理 +// fieldRuleEngine = fieldRuleConfigMapper.selectById(ruleTypeId); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } Map env2 = new HashMap(); for (int i = 0; i < valueList.size(); i++) { if (vaildMap.containsKey(i)) { @@ -47,7 +38,7 @@ } } - private Map getValidRangeMap(String vaildRange) { + private static Map getValidRangeMap(String vaildRange) { String[] range = vaildRange.split(","); Map vaildMap = new HashMap(); for (int i = 0; i < range.length; i++) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 8d821cd..85d6bbf 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -1,9 +1,12 @@ package com.casic.missiles.parser.resolver; +import com.casic.missiles.pojo.AbstractFieldConfig; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; import io.netty.buffer.ByteBuf; +import java.util.List; import java.util.Map; /** @@ -11,18 +14,14 @@ */ public interface FieldParser { -// Map fieldProcess(String protocolContent,); - Map dataParser(RuleConfig ruleConfig, String lightText,String protocolId); + Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength); - Map fixDataParser(String protocolId, ByteBuf buffer); + Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap); - Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf); + ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer); - ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer); - - ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer); - - Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer); + Integer getTotalFilterLength(ProtocolConfig protocolConfig, ByteBuf byteBuf, Map protocolFieldConfigMap); } + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java new file mode 100644 index 0000000..9e0c00e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java @@ -0,0 +1,52 @@ +package com.casic.missiles.parser.resolver; + +import com.casic.missiles.pojo.AbstractFieldConfig; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.util.List; + +public class FieldParserSupport { + + //分别计算bit和byte长度=> 合并长度 + protected Integer calculateLength(List fieldConfigList) { + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + Integer fixedLength = bytefixedLength + bitfixedLength / 8; + return fixedLength; + } + + //找到最大值=> 根据最大值计算业务数据下标 + protected Integer calculatePosition(List fieldConfigList) { + String rex = "[0-9]+"; + Integer max = -1; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) + && Integer.valueOf(fieldConfig.getOriginPositionByte()) > max) { + max = Integer.valueOf(fieldConfig.getOriginPositionByte()); + } + } + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) && fieldConfig.getOriginPositionByte().equals(max)) { + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + } + } + Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; + return maxFixedPosition; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java deleted file mode 100644 index dd3a6cd..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java +++ /dev/null @@ -1,170 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.ByteResolverParam; -import io.netty.buffer.ByteBuf; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -/** - * 字段解析管理总类 - */ -@Service -@Slf4j -@AllArgsConstructor -public class FieldResolver extends ByteMergeProvider { - - //1、字段截取 => 2、简单的字节解析和复杂的字节解析 - public Object filedParserManger(ByteBuf byteBuf, FieldConfig fieldConfig, Integer maxFixedPosition) { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - //最大固定位置不为空, - if (!ObjectUtil.isEmpty(maxFixedPosition)) { - orignPosition -= maxFixedPosition; - } - Object fieldValue = 0; - //待优化 - if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { - fieldValue = bitToResolver(byteBuf, fieldConfig); - } else { - ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); - fieldValue = parsingFields(fieldBytes, fieldConfig.getRuleJson()); - } - return fieldValue; - } - - //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, - //目前默认配置的规则设置暂不支持配置化,由实现完成 - private Object parsingFields(ByteBuf byteBuf, String ruleJson) { - Object fieldsResolveValue = null; - List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); - if (ObjectUtil.isEmpty(ruleMapList)) { - fieldsResolveValue = defaultResolveBuilder(byteBuf); - } else { - fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); - } - return fieldsResolveValue; - } - - private Object defaultResolveBuilder(ByteBuf byteBuf) { - Integer defaultResolveValue = 0; - for (int i = 0; i < byteBuf.writerIndex(); i++) { - defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; - } - return defaultResolveValue; - } - - //字段解析构建器(针对字节单位的) - //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 - // 字节归并结束或者规则结束=>继续根据规则进行判断 - private Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { - Object customizeResolveValue = null; - try { - List bytStrList = new ArrayList<>(); - //存放到数组里面 - for (int i = 0; i < byteBuf.writerIndex(); i++) { - bytStrList.add(byteBuf.readByte()); - } - int i = 0; - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - customizeResolveValue = this.resolveByteMerge(bytStrList, ruletypeId,vaildRange); - break; - } else { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - List tempBytStr = new ArrayList<>(); - for (int k = 0; i < bytStrList.size(); i++) { - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(k) - .value(bytStrList.get(k)) - .ruletypeId(ruletypeId).build(); - tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); - } - bytStrList = tempBytStr; - } - i++; - } - //字节归并到一起=>继续根据规则进行判断 - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(customizeResolveValue) - .ruletypeId(ruletypeId).build(); - customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(customizeResolveValue)); - return customizeResolveValue; - } catch (RuntimeException ex) { - log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); - return null; - } - } - - /** - * 1、单个字节情况表示字段 - * 2、多字节情况表示字段(暂未处理) - */ - private Object bitToResolver(ByteBuf byteBuf, FieldConfig fieldConfig) { - Object fieldValue = new Object(); - try { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - byte fields = 0x00; - if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); - } else { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); - } - - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { - if (!StringUtils.isEmpty(fieldConfig.getExactOrignPosition())) { - fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getExactOrignPosition())).byteValue() - >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); - } else { - fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); - } - } else { - fieldValue = Integer.valueOf(fields & 0xff); - } - if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { - return fieldValue; - } - List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); - int i = 0; - //字节归并到一起=>继续根据规则进行判断 - while (i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(fieldValue) - .ruletypeId(ruletypeId).build(); - fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(fieldValue)); - return fieldValue; - } catch (RuntimeException ex) { - log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); - return null; - } - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java new file mode 100644 index 0000000..1d2aeab --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java @@ -0,0 +1,36 @@ +package com.casic.missiles.parser.resolver.bytes; + +import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.mapper.FieldRuleConfigMapper; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.pojo.ByteResolverParam; +import com.googlecode.aviator.AviatorEvaluator; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; +//转换规则 +@Component("convert") +@AllArgsConstructor +@Slf4j +public class ByteRuleResolver implements ByteResolver { + + private final FieldRuleConfigMapper fieldRuleConfigMapper; + + @Override + public Object resolveOperationRule(ByteResolverParam byteResolverParam){ + FieldRuleConfig fieldRuleEngine=fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); + if(ObjectUtil.isEmpty(fieldRuleEngine)){ + return byteResolverParam.getValue(); + } + String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); + Map env2 = new HashMap(); + env2.put("value", (byte) byteResolverParam.getValue()); + String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); + return values; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java index 103821c..786b71c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java @@ -2,34 +2,34 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("logicalShift") +@Component("logicalShift") @AllArgsConstructor @Slf4j public class LogicalShiftResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //字节位移 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { Integer index = byteResolverParam.getIndex(); - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return byteResolverParam.getValue(); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java index 476747d..01149bd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("operation") +@Component("operation") @AllArgsConstructor @Slf4j public class OperationResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //混合运算,有常量或者乘除的缩放 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java index 0b82cf4..79abcce 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.casic.missiles.pojo.ByteResolverParam; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; //精度计算 -@Service("precision") +@Component("precision") @AllArgsConstructor @Slf4j public class PrecisionResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java deleted file mode 100644 index 5c3f332..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; -//转换规则 -@Service("convert") -@AllArgsConstructor -@Slf4j -public class RuleResolver implements ByteResolver { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam){ - RuleEvaluator fieldRuleEngine=fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); - if(ObjectUtil.isEmpty(fieldRuleEngine)){ - return byteResolverParam.getValue(); - } - String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); - Map env2 = new HashMap(); - env2.put("value", (byte) byteResolverParam.getValue()); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java new file mode 100644 index 0000000..d3bbd91 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java @@ -0,0 +1,15 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; + +import java.util.List; +import java.util.Map; +// 前导码匹配->长度字段 +public interface AbstractCombinedFieldProcessor { + + Map invoke(Map map, ByteBuf byteBuf, List combinedFieldConfigList, + Map fieldConfigsMap, Map storeObjectMap); + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java new file mode 100644 index 0000000..03c8480 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java @@ -0,0 +1,59 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-13 + */ +//依次递增进行数据的解析, +public class GenericCombinedFieldResolver { + + + //通过查询,字段长度长度随机 + public void parseDataField(List combinedFieldConfigList, ByteBuf byteBuf, + Map storeObjectMap, Map fieldConfigsMap) { + Integer frameLength = Integer.valueOf(ByteBufUtil.hexDump(byteBuf)); + //添加前置处理器 + com.casic.missiles.util.ClassUtil classUtil = new com.casic.missiles.util.ClassUtil(); + List abstractCombinedProcessors = classUtil.getSubClassList(AbstractCombinedFieldProcessor.class); + + Map fieldFixedMap = combinedFieldLeadCodeMap(combinedFieldConfigList); + //frameLength + Map combinedProcessorFields = null; + while (byteBuf.readableBytes() < frameLength) { + //一直处理 + for (AbstractCombinedFieldProcessor abstractCombinedProcessor : abstractCombinedProcessors) { + combinedProcessorFields = abstractCombinedProcessor.invoke(combinedProcessorFields, byteBuf, + combinedFieldConfigList, + fieldConfigsMap, storeObjectMap); + if (combinedProcessorFields == null || byteBuf.readableBytes() < frameLength) { + return; + } + } + + } + } + + /** + * 取出前导码匹配集合 + */ + private Map combinedFieldLeadCodeMap(List combinedFieldConfigList) { + Map fieldFixedMap = combinedFieldConfigList + .stream() + .collect(Collectors.toMap(CombinedFieldConfig::getPrefixCode, e -> e)); + return fieldFixedMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java new file mode 100644 index 0000000..643a934 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java @@ -0,0 +1,100 @@ +package com.casic.missiles.parser.resolver.fields; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.FieldParserSupport; +import com.casic.missiles.pojo.*; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 保存使用时最基本的信息,并且使用原型模式 + */ +@Slf4j +public class DefaultProtocolFieldParser extends FieldParserSupport implements FieldParser, FixedPropertyEnum { + + //通过传入的配置和报文进行字段解析 + @Override + public Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap) { + Map dataMap = new HashMap<>(); + for (AbstractFieldConfig protocolFieldConfig : protocolFieldConfigs) { + if (!ObjectUtils.isEmpty(protocolFieldConfig.getOriginPositionByte())) { + Object fieldValue = FieldResolver.parseField(buffer, protocolFieldConfig, null); + if (protocolFieldConfig.getIsStorage() == 1) { + storeObjectMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + dataMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + } + return dataMap; + } + + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength) { + Map fixedPropertyMap = new HashMap<>(); + Integer fixedLength = calculateLength(protocolFieldConfigs); + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + fixedPropertyMap.put(FIXED_POSITION, maxFixedPosition); + fixedPropertyMap.put(TOTAL_LENGTH, totalLength); + fixedPropertyMap.put(TAIL_POSITION, totalLength - fixedLength + maxFixedPosition); + return fixedPropertyMap; + } + + //** 获取业务内容的byteBuf + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer) { + //计算固定长度 + Integer fixedLength = calculateLength(protocolFieldConfigs); + //总长度获取 + String lightText = buffer.toString(Charset.forName("ISO-8859-1")); + Integer totalLength = lightText.length(); + //计算固定长度最大长度 + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + //计算数据报文内容 + ByteBuf bizDataFields = buffer.slice(maxFixedPosition - 1, (totalLength - fixedLength)); + return bizDataFields; + } + + /** + * 获取过滤字段的长度 + */ + @Override + public Integer getTotalFilterLength(ProtocolConfig protocolConfig, + ByteBuf byteBuf, + Map protocolFieldConfigMap) { + if (ByteBufUtil.hexDump(byteBuf).equals("")) { + return 0; + } + int totalFilterLength = 0; + String filterFields = protocolConfig.getTotalLengthFilterFields(); + try { + if (!StringUtils.isEmpty(filterFields)) { + String[] filterFieldList = filterFields.split(","); + for (String filterFieldId : filterFieldList) { + if (StringUtils.isNotEmpty(filterFieldId)) { + ProtocolFieldConfig fieldConfig = protocolFieldConfigMap.get(Long.valueOf(filterFieldId)); + //这里都是按字节计算,没有对位进行区分,可能会出现错误 + // 如果对位有需求,需要进一步跟进 + totalFilterLength += fieldConfig.getOffsetLength(); + } + } + } + return totalFilterLength; + } catch (Exception ex) { + log.error("报文确认分发阶段,获取报文总长度过滤长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); + } + return totalFilterLength; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java new file mode 100644 index 0000000..d51e887 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java @@ -0,0 +1,169 @@ +package com.casic.missiles.parser.resolver.fields; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.parser.resolver.ByteMergeProvider; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.AbstractFieldConfig; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.pojo.ByteResolverParam; +import io.netty.buffer.ByteBuf; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * 字段解析管理总类 + */ +@Slf4j +public class FieldResolver extends ByteMergeProvider { + + //1、字段截取 => 2、简单的字节解析和复杂的字节解析 + public static Object parseField(ByteBuf byteBuf,AbstractFieldConfig fieldConfig, Integer maxFixedPosition) { + Integer orignPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + //最大固定位置不为空, + if (!ObjectUtil.isEmpty(maxFixedPosition)) { + orignPosition -= maxFixedPosition; + } + Object fieldValue = 0; + //待优化 + if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { + fieldValue = doParseBitField(byteBuf, fieldConfig); + } else { + ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); + fieldValue = doParseByteField(fieldBytes, fieldConfig.getRuleJson()); + } + return fieldValue; + } + + //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, + //目前默认配置的规则设置暂不支持配置化,由实现完成 + private static Object doParseByteField(ByteBuf byteBuf, String ruleJson) { + Object fieldsResolveValue = null; + List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); + if (ObjectUtil.isEmpty(ruleMapList)) { + fieldsResolveValue = defaultResolveBuilder(byteBuf); + } else { + fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); + } + return fieldsResolveValue; + } + + private static Object defaultResolveBuilder(ByteBuf byteBuf) { + Integer defaultResolveValue = 0; + for (int i = 0; i < byteBuf.writerIndex(); i++) { + defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; + } + return defaultResolveValue; + } + + //字段解析构建器(针对字节单位的) + //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 + // 字节归并结束或者规则结束=>继续根据规则进行判断 + private static Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { + Object customizeResolveValue = null; + try { + List bytStrList = new ArrayList<>(); + //存放到数组里面 + for (int i = 0; i < byteBuf.writerIndex(); i++) { + bytStrList.add(byteBuf.readByte()); + } + int i = 0; + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { + if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + customizeResolveValue = resolveByteMerge(bytStrList, ruletypeId, vaildRange); + break; + } else { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + List tempBytStr = new ArrayList<>(); + for (int k = 0; i < bytStrList.size(); i++) { + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(k) + .value(bytStrList.get(k)) + .ruletypeId(ruletypeId).build(); + tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); + } + bytStrList = tempBytStr; + } + i++; + } + //字节归并到一起=>继续根据规则进行判断 + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(null) + .value(customizeResolveValue) + .ruletypeId(ruletypeId).build(); + customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); + i++; + } + System.out.println(JSON.toJSON(customizeResolveValue)); + return customizeResolveValue; + } catch (RuntimeException ex) { + log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); + return null; + } + } + + /** + * 1、单个字节情况表示字段 + * 2、多字节情况表示字段(暂未处理) + */ + private static Object doParseBitField(ByteBuf byteBuf,AbstractFieldConfig fieldConfig) { + Object fieldValue = new Object(); + try { + Integer orignPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + byte fields = 0x00; + if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { + fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); + } else { + fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); + } + + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { + if (!StringUtils.isEmpty(fieldConfig.getOriginPositionBit())) { + fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getOriginPositionBit())).byteValue() + >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); + } else { + fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); + } + } else { + fieldValue = Integer.valueOf(fields & 0xff); + } + if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { + return fieldValue; + } + List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); + int i = 0; + //字节归并到一起=>继续根据规则进行判断 + while (i < ruleMapList.size()) { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(null) + .value(fieldValue) + .ruletypeId(ruletypeId).build(); + fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); + i++; + } + System.out.println(JSON.toJSON(fieldValue)); + return fieldValue; + } catch (RuntimeException ex) { + log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); + return null; + } + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java deleted file mode 100644 index 35ae3d0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java +++ /dev/null @@ -1,183 +0,0 @@ -package com.casic.missiles.parser.resolver.fields; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufAllocator; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; -import org.springframework.util.ObjectUtils; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service("standard") -@AllArgsConstructor -@Slf4j -public class StandardFieldParser implements FieldParser { - - private final FieldConfigDao fieldConfigDao; - private final FieldResolver fieldResolver; - - //数据解析 - @Override - public Map dataParser(RuleConfig ruleConfig, String lightText, String protocolId) { - String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); - ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); - bufferContent.writeBytes(lightText.getBytes(Charset.forName("ISO-8859-1"))); - Map dataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - for (String dataFieldId : dataFieldIds) { - FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(dataFieldId); - if (!ObjectUtils.isEmpty(fieldConfig)) { - dataMap.put(fieldConfig.getFieldName(), String.valueOf(fieldResolver.filedParserManger(bufferContent, fieldConfig, maxFixedPosition))); - } - } - return dataMap; - } - - //数据解析 - @Override - public Map fixDataParser(String protocolId, ByteBuf buffer) { - List dataFieldIdList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Map dataMap = new HashMap<>(); - for (FieldConfig dataField : dataFieldIdList) { - if (!ObjectUtils.isEmpty(dataField.getOrignPosition())) { - Object fieldValue = (Integer) fieldResolver.filedParserManger(buffer, dataField, null); - dataMap.put(dataField.getFieldName(), fieldValue); - } - } - return dataMap; - } - - @Override - public Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf) { - if (ByteBufUtil.hexDump(byteBuf).equals("")) { - return 0; - } - String filterFields = protocolConfig.getTotalLengthFilterField(); - Integer totalLength = 0; - try { - FieldConfig totalFieldConfig = fieldConfigDao.getFieldConfigById(protocolConfig.getTotalLengthId()); - int totalFilterLength = 0; - if (!StringUtils.isEmpty(filterFields)) { - String[] filterFieldList = filterFields.split(","); - for (String filterField : filterFieldList) { - FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(filterField); - //这里都是按字节计算,没有对位进行区分,可能会出现错误 - - // 如果对位有需求,需要进一步跟进 - totalFilterLength += fieldConfig.getOffsetLength(); - } - } - totalLength = (Integer) fieldResolver.filedParserManger(byteBuf, totalFieldConfig, null) + totalFilterLength; - } catch (Exception ex) { - log.error("报文确认分发阶段,获取报文总长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); - } - return totalLength; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer) { - //业务内容 - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - String protocolId = String.valueOf(protocolConfig.getId()); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - //计算固定长度 - Integer fixedLength = calculateLength(fieldConfigList); -// Integer totalLength = this.getTotalLength(protocolConfig, buffer); - //总长度获取 - Integer totalLength = lightText.length(); - //计算固定长度最大长度 - Integer maxFixedPosition = calculatePosition(fieldConfigList); -// buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - //计算数据报文内容 - ByteBuf bizDataFields = buffer.slice(maxFixedPosition-1, (totalLength - fixedLength)); - return bizDataFields; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer) { - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - String protocolId = String.valueOf(protocolConfig.getId()); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer fixedLength = calculateLength(fieldConfigList); -// Integer totalLength = this.getTotalLength(protocolConfig, buffer); - Integer totalLength = lightText.length(); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - ByteBuf fixDataFields = buffer.slice(0, maxFixedPosition); - return fixDataFields; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer) { - String protocolId = String.valueOf(protocolConfig.getId()); - Map fixedPropertyMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer fixedLength = calculateLength(fieldConfigList); - Integer totalLength = this.getTotalLength(protocolConfig, buffer); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - fixedPropertyMap.put("fixedPosition", maxFixedPosition); - fixedPropertyMap.put("totalLength", totalLength); - fixedPropertyMap.put("tailPosition", totalLength - fixedLength + maxFixedPosition); - return fixedPropertyMap; - } - - //分别计算bit和byte长度=> 合并长度 - private Integer calculateLength(List fieldConfigList) { - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (FieldConfig fieldConfig : fieldConfigList) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - Integer fixedLength = bytefixedLength + bitfixedLength / 8; - return fixedLength; - } - - //找到最大值=> 根据最大值计算业务数据下标 - private Integer calculatePosition(List fieldConfigList) { - String rex = "[0-9]+"; - Integer max = -1; - for (FieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOrignPosition()) - && Integer.valueOf(fieldConfig.getOrignPosition()) > max) { - max = Integer.valueOf(fieldConfig.getOrignPosition()); - } - } - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (FieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOrignPosition()) && fieldConfig.getOrignPosition().equals(max)) { - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - } - } - Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; - return maxFixedPosition; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java new file mode 100644 index 0000000..d4ec6c7 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java @@ -0,0 +1,76 @@ +package com.casic.missiles.parser.rule; + +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import org.apache.commons.lang3.StringUtils; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class GenericRuleResolver { + + //根据前置字段的值,找到指定的规则 + //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 + //=>循环判断=>通过规则得到业务字段 + public static RuleConfig machRule(Map fixDataMap, + String ids, + List protocolFieldConfigs, + List ruleConfigs) { + List preRuleConfigList = getPreRuleList(ids, protocolFieldConfigs); + //获取前置规则字段 + final Map metaDataMap = getPreRuleFields(preRuleConfigList, fixDataMap); + //准备固定的字段集合 + Map fixDataFieldMap = getFixDataFieldMap(protocolFieldConfigs); + return RuleResolverCore.doMachRule(ruleConfigs, metaDataMap, fixDataMap, fixDataFieldMap); + } + + private static Map getFixDataFieldMap(List protocolFieldConfigs) { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, ProtocolFieldConfig::getFieldName) + ); + return fixDataFieldMap; + } + + + /** + * 查询前置规则的字段配置 + * + * @param ids + * @return + */ + private static List getPreRuleList(String ids, List protocolFieldConfigs) { + String[] idList = ids.split(","); + Map prepareMaps = new HashMap<>(); + for (String id : idList) { + if (StringUtils.isNotEmpty(id)) { + prepareMaps.put(Long.valueOf(id), ""); + } + } + List preRuleConfigList = protocolFieldConfigs + .stream() + .filter(e -> prepareMaps.containsKey(e.getId())) + .collect(Collectors.toList()); + return preRuleConfigList; + } + + /** + * 获取前置规则解析字段 + */ + private static Map getPreRuleFields(List preRuleFieldConfigList, Map fixDataMap) { + Map ruleFieldMap = new HashMap<>(); + preRuleFieldConfigList.stream() + .forEach( + preRuleFieldConfig -> { + String fieldName = preRuleFieldConfig.getFieldName(); + if (fixDataMap.containsKey(fieldName)) { + ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); + } + } + ); + return ruleFieldMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java new file mode 100644 index 0000000..baae7e8 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -0,0 +1,68 @@ +package com.casic.missiles.parser.rule; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.casic.missiles.pojo.RuleConfig; + +import java.util.*; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleResolverCore { + + + public static RuleConfig doMachRule(List ruleConfigList, Map metaDataMap, + Map fixDataMap, + Map fixDataFieldMap) { + Optional ruleConfigOptional = ruleConfigList.stream() + .filter(ruleConfig -> machRuleConfig( + JSON.parseObject(ruleConfig.getMatchRuleJson(), Map.class), metaDataMap)) + .findFirst(); + if (ObjectUtil.isEmpty(ruleConfigOptional)) { + return null; + } + String[] ruleFields = ruleConfigOptional.get().getDataFieldIds().split(","); + Map ruleMetaDataMap = getRuleFields(ruleFields, fixDataMap, fixDataFieldMap); + //递归选定解析规则,进行规则解析 + if (!ruleConfigOptional.get().getIsFinishMatch().equals("1")) { + //递归选定规则 + doMachRule(ruleConfigList, ruleMetaDataMap, fixDataMap, fixDataFieldMap); + } + return ruleConfigOptional.get(); + } + + + private static Map getRuleFields(String[] preRuleConfigList, Map fixedDataMap, + Map fixedFieldMap) { + Map ruleFieldMap = new HashMap<>(); + for (String preRuleConfigId : preRuleConfigList) { + String fieldName = fixedFieldMap.get(preRuleConfigId); + if (fixedDataMap.containsKey(fieldName)) { + ruleFieldMap.put(fieldName, String.valueOf(fixedDataMap.get(fieldName))); + } + } + return ruleFieldMap; + } + + + //匹配规则配置 + private static Boolean machRuleConfig(Map ruleMap, Map metaDataMap) { + if (ruleMap == null || metaDataMap == null) { + return null; + } + //所有的字段在规则里面必须有有配置 + for (String key : metaDataMap.keySet()) { + if (ruleMap.containsKey(key)) { + if (!ruleMap.get(key).equals(metaDataMap.get(key))) { + return false; + } + } else { + return false; + } + } + return true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java deleted file mode 100644 index 664088d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java +++ /dev/null @@ -1,92 +0,0 @@ -package com.casic.missiles.parser.rule; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.mapper.dao.PreRuleConfigDao; -import com.casic.missiles.mapper.dao.RuleConfigDao; -import lombok.AllArgsConstructor; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.*; -import java.util.stream.Collectors; - -@Service -@AllArgsConstructor -public class RulerProvider { - - private final FieldConfigDao fieldConfigDao; - private final PreRuleConfigDao preRuleConfigDao; - private final RuleConfigDao ruleConfigDao; - - //根据前置字段的值,找到指定的规则 - //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 - //=>循环判断=>通过规则得到业务字段 - public RuleConfig ruleConfig(Map fixDataMap, String protocolId) { - //批量获取规则 - List preRuleConfigList = preRuleConfigDao.getPreRuleList(protocolId); - //获取固定字段 - Map fixFieldMap = getAllFieldMap(protocolId); - //获取前置规则字段 - final String preRuleFields = getPreRuleFields(preRuleConfigList, fixDataMap, fixFieldMap); - List ruleConfigList = ruleConfigDao.getRuleConfigById(protocolId); - Optional ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig ->preRuleFields.equals( ruleConfig.getParseRuleJson())).findFirst(); - //递归选定解析规则,进行规则解析 - while (!ObjectUtil.isEmpty(ruleConfigOptional) && !ruleConfigOptional.get().getIsBizField().equals("1")) { - String ruleFields = getRuleFields(ruleConfigOptional.get().getDataFieldIds().split(","), fixDataMap, fixFieldMap); - ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig -> ruleConfig.getParseRuleJson().equals(ruleFields)).findFirst(); - } - return ruleConfigOptional.get(); - } - - /** - * 获取前置规则解析字段 - */ - private String getPreRuleFields(List preRuleConfigList, Map fixDataMap, Map fixFieldMap) { - Map ruleFieldMap= new HashMap<>(); - preRuleConfigList.stream() - .forEach( - preRuleConfig -> { - String fieldName = fixFieldMap.get(Long.valueOf(preRuleConfig.getRuleFieldId())); - if (fixDataMap.containsKey(fieldName)) { - ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); - } - } - ); - return JSONObject.toJSONString(ruleFieldMap); - } - - private Map getAllFieldMap(String protocolId) { - List fieldList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Map fixFieldMap = fieldList.stream().collect( - Collectors.toMap(FieldConfig::getId, FieldConfig::getFieldName) - ); - return fixFieldMap; - } - - private String getRuleFields(String[] preRuleConfigList, Map fixDataMap, Map fixFieldMap) { - Map ruleFieldMap= new HashMap<>(); - for (String preRuleConfigId : preRuleConfigList) { - String fieldName = fixFieldMap.get(preRuleConfigId); - if (fixDataMap.containsKey(fieldName)) { - ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); - } - } - return JSONObject.toJSONString(ruleFieldMap); - } - - //弃置 - private String ListToString(List ruleFieldList) { - String ruleFields = ""; - for (String ruleField : ruleFieldList) { - ruleFields += ruleField + ","; - } - ruleFields = StringUtils.isEmpty(ruleFields) ? ruleFields : ruleFields.substring(0, ruleFields.length() - 1); - return ruleFields; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java index 6177e10..bfa87a5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java @@ -2,7 +2,7 @@ public interface SafeStrategy { - String decryption(byte[] bytes); + String decryption(String cipher); String encryption(String lightText); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java index 618716c..6236302 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java @@ -9,9 +9,9 @@ //十六进制的字符串转换成字节数组 byte[] bytes = hexStrToBinaryStr(msg); //计算CRC8 - byte crc8 = CRC8(bytes, 0, bytes.length); - String crc8ToStr = "" + Integer.toHexString(0xff & crc8); - return crc8ToStr; +// String crc8ToStr = "" + Integer.toHexString(0xff & crc8); +// return crc8ToStr; + return null; } /** @@ -33,50 +33,5 @@ return bytes; } - /** - * CRC8 校验 多项式 x8+x2+x+1 - * - * @param b - * @param off - * @param len - * @return - */ - public static byte CRC8(final byte[] b, final int off, final int len) { - byte result = 0x00; - for (int i = 0; i < len; i++) { - result = CHECKSUM_TABLE[(result ^ (b[i + off] & 0xFF)) & 0xFF]; - } - return (byte) (result & 0xFFL); - } - - private final static byte[] CHECKSUM_TABLE = {(byte) 0x00, (byte) 0x07, (byte) 0x0e, (byte) 0x09, (byte) 0x1c, (byte) 0x1b, - (byte) 0x12, (byte) 0x15, (byte) 0x38, (byte) 0x3f, (byte) 0x36, (byte) 0x31, (byte) 0x24, (byte) 0x23, (byte) 0x2a, - (byte) 0x2d, (byte) 0x70, (byte) 0x77, (byte) 0x7e, (byte) 0x79, (byte) 0x6c, (byte) 0x6b, (byte) 0x62, (byte) 0x65, - (byte) 0x48, (byte) 0x4f, (byte) 0x46, (byte) 0x41, (byte) 0x54, (byte) 0x53, (byte) 0x5a, (byte) 0x5d, (byte) 0xe0, - (byte) 0xe7, (byte) 0xee, (byte) 0xe9, (byte) 0xfc, (byte) 0xfb, (byte) 0xf2, (byte) 0xf5, (byte) 0xd8, (byte) 0xdf, - (byte) 0xd6, (byte) 0xd1, (byte) 0xc4, (byte) 0xc3, (byte) 0xca, (byte) 0xcd, (byte) 0x90, (byte) 0x97, (byte) 0x9e, - (byte) 0x99, (byte) 0x8c, (byte) 0x8b, (byte) 0x82, (byte) 0x85, (byte) 0xa8, (byte) 0xaf, (byte) 0xa6, (byte) 0xa1, - (byte) 0xb4, (byte) 0xb3, (byte) 0xba, (byte) 0xbd, (byte) 0xc7, (byte) 0xc0, (byte) 0xc9, (byte) 0xce, (byte) 0xdb, - (byte) 0xdc, (byte) 0xd5, (byte) 0xd2, (byte) 0xff, (byte) 0xf8, (byte) 0xf1, (byte) 0xf6, (byte) 0xe3, (byte) 0xe4, - (byte) 0xed, (byte) 0xea, (byte) 0xb7, (byte) 0xb0, (byte) 0xb9, (byte) 0xbe, (byte) 0xab, (byte) 0xac, (byte) 0xa5, - (byte) 0xa2, (byte) 0x8f, (byte) 0x88, (byte) 0x81, (byte) 0x86, (byte) 0x93, (byte) 0x94, (byte) 0x9d, (byte) 0x9a, - (byte) 0x27, (byte) 0x20, (byte) 0x29, (byte) 0x2e, (byte) 0x3b, (byte) 0x3c, (byte) 0x35, (byte) 0x32, (byte) 0x1f, - (byte) 0x18, (byte) 0x11, (byte) 0x16, (byte) 0x03, (byte) 0x04, (byte) 0x0d, (byte) 0x0a, (byte) 0x57, (byte) 0x50, - (byte) 0x59, (byte) 0x5e, (byte) 0x4b, (byte) 0x4c, (byte) 0x45, (byte) 0x42, (byte) 0x6f, (byte) 0x68, (byte) 0x61, - (byte) 0x66, (byte) 0x73, (byte) 0x74, (byte) 0x7d, (byte) 0x7a, (byte) 0x89, (byte) 0x8e, (byte) 0x87, (byte) 0x80, - (byte) 0x95, (byte) 0x92, (byte) 0x9b, (byte) 0x9c, (byte) 0xb1, (byte) 0xb6, (byte) 0xbf, (byte) 0xb8, (byte) 0xad, - (byte) 0xaa, (byte) 0xa3, (byte) 0xa4, (byte) 0xf9, (byte) 0xfe, (byte) 0xf7, (byte) 0xf0, (byte) 0xe5, (byte) 0xe2, - (byte) 0xeb, (byte) 0xec, (byte) 0xc1, (byte) 0xc6, (byte) 0xcf, (byte) 0xc8, (byte) 0xdd, (byte) 0xda, (byte) 0xd3, - (byte) 0xd4, (byte) 0x69, (byte) 0x6e, (byte) 0x67, (byte) 0x60, (byte) 0x75, (byte) 0x72, (byte) 0x7b, (byte) 0x7c, - (byte) 0x51, (byte) 0x56, (byte) 0x5f, (byte) 0x58, (byte) 0x4d, (byte) 0x4a, (byte) 0x43, (byte) 0x44, (byte) 0x19, - (byte) 0x1e, (byte) 0x17, (byte) 0x10, (byte) 0x05, (byte) 0x02, (byte) 0x0b, (byte) 0x0c, (byte) 0x21, (byte) 0x26, - (byte) 0x2f, (byte) 0x28, (byte) 0x3d, (byte) 0x3a, (byte) 0x33, (byte) 0x34, (byte) 0x4e, (byte) 0x49, (byte) 0x40, - (byte) 0x47, (byte) 0x52, (byte) 0x55, (byte) 0x5c, (byte) 0x5b, (byte) 0x76, (byte) 0x71, (byte) 0x78, (byte) 0x7f, - (byte) 0x6a, (byte) 0x6d, (byte) 0x64, (byte) 0x63, (byte) 0x3e, (byte) 0x39, (byte) 0x30, (byte) 0x37, (byte) 0x22, - (byte) 0x25, (byte) 0x2c, (byte) 0x2b, (byte) 0x06, (byte) 0x01, (byte) 0x08, (byte) 0x0f, (byte) 0x1a, (byte) 0x1d, - (byte) 0x14, (byte) 0x13, (byte) 0xae, (byte) 0xa9, (byte) 0xa0, (byte) 0xa7, (byte) 0xb2, (byte) 0xb5, (byte) 0xbc, - (byte) 0xbb, (byte) 0x96, (byte) 0x91, (byte) 0x98, (byte) 0x9f, (byte) 0x8a, (byte) 0x8d, (byte) 0x84, (byte) 0x83, - (byte) 0xde, (byte) 0xd9, (byte) 0xd0, (byte) 0xd7, (byte) 0xc2, (byte) 0xc5, (byte) 0xcc, (byte) 0xcb, (byte) 0xe6, - (byte) 0xe1, (byte) 0xe8, (byte) 0xef, (byte) 0xfa, (byte) 0xfd, (byte) 0xf4, (byte) 0xf3}; } \ No newline at end of file diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java index 27c2838..6e078a3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java @@ -1,9 +1,6 @@ package com.casic.missiles.parser.safe.impl; -import cn.hutool.core.util.CharsetUtil; -import cn.hutool.crypto.symmetric.SM4; -import cn.hutool.crypto.symmetric.SymmetricCrypto; - +import com.casic.missiles.parser.safe.SafeStrategy; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; @@ -11,19 +8,44 @@ import org.bouncycastle.crypto.engines.SM4Engine; import org.bouncycastle.crypto.params.KeyParameter; import org.bouncycastle.util.encoders.Hex; - -import static cn.hutool.crypto.Mode.ECB; -import static cn.hutool.crypto.Padding.NoPadding; +import org.springframework.stereotype.Component; /** * SM4算法工具类 */ @Slf4j -public class Sm4 { +@Component("sm4") +public class Sm4 implements SafeStrategy { //加解密的字节快大小 public static final int BlockSize = 16; + @Override + public String decryption(String cipher) { + byte[] keyByte = { + 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 + }; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(keyByte); + byte[] in = Hex.decode(cipher); + byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); + String plain = EcbDecrypt(in, keyBytes); + return plain; + } + + @Override + public String encryption(String cipher) { + byte[] keyByte = { + 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 + }; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(keyByte); + byte[] in = Hex.decode(cipher); + byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); + String plain = EcbDecrypt(in, keyBytes); + return plain; + } + /** * SM4ECB加密算法,对内 * @@ -32,8 +54,6 @@ * @return */ private static byte[] ecb_encrypt(byte[] in, byte[] keyBytes) { - - SM4Engine sm4Engine = new SM4Engine(); sm4Engine.init(true, new KeyParameter(keyBytes)); byte[] out = new byte[in.length]; @@ -58,27 +78,6 @@ return cipher; } - - /** - * hutool 解密SM4 - * - * @param encodeContent - * @return - */ - public static String decode(String encodeContent) { - String key = "24ad182507479a5da3ad94d9d78ea203"; - try { - SymmetricCrypto sm4 = new SM4(ECB, NoPadding, key.getBytes()); - String decryptStr = sm4.decryptStr(encodeContent, CharsetUtil.CHARSET_UTF_8); - return decryptStr; - } catch (Exception e) { - e.printStackTrace(); - log.error("SM4解密失败"); - } - return null; - } - - /** * SM4的ECB加密算法 * @@ -129,20 +128,6 @@ return plain; } - /** - * SM4的ECB解密算法 - * - * @param cipher 输入的密文字符串 - * @param key 密钥 - * @return - */ - public static String EcbDecrypt(String cipher, String key) { - byte[] in = Hex.decode(cipher); - byte[] keyBytes = Hex.decode(key); - - String plain = EcbDecrypt(in, keyBytes); - return plain; - } /** * 主函数 @@ -151,28 +136,24 @@ */ public static void main(String[] args) { byte[] ciphertext = { + 0x4B, (byte) 0x8C, (byte) 0x9D, 0x08, (byte) 0xE4, (byte) 0xD3, 0x64, 0x42, (byte) 0xB9, (byte) 0xA5, (byte) 0xFE, (byte) 0xCD, (byte) 0x91, 0x1B, 0x38, (byte) 0xAC, (byte) 0xE9, 0x1C, (byte) 0xCD, 0x53, 0x02, (byte) 0xD7, 0x0C, (byte) 0x9B, (byte) 0x96, 0x30, 0x62, (byte) 0xE8, (byte) 0xFB, (byte) 0xEF, (byte) 0xB9, (byte) 0xFF, (byte) 0xDE, 0x19, (byte) 0x80, 0x35, 0x3E, (byte) 0x90, 0x4F, 0x2F, 0x12, 0x2B, 0x19, (byte) 0x8B, 0x6C, 0x7A, (byte) 0x85, (byte) 0xA1, (byte) 0xB1, (byte) 0x86, (byte) 0xA3, 0x7A, 0x46, 0x0C, 0x2F, (byte) 0x94, 0x4F, 0x7F, 0x2C, 0x56, 0x14, (byte) 0xF3, (byte) 0x89, (byte) 0xC3, - 0x3F, 0x20, (byte) 0xF9, (byte) 0x87, (byte) 0xA1, 0x60, (byte) 0xD9, (byte) 0xA8, (byte) 0xFD, (byte) 0xD7, (byte) 0x9B, 0x4B, 0x26, 0x06, 0x30, 0x44}; + 0x3F, 0x20, (byte) 0xF9, (byte) 0x87, (byte) 0xA1, 0x60, (byte) 0xD9, (byte) 0xA8, (byte) 0xFD, (byte) 0xD7, (byte) 0x9B, 0x4B, 0x26, 0x06, 0x30, 0x44 + }; ByteBuf in = ByteBufAllocator.DEFAULT.heapBuffer(); in.writeBytes(ciphertext); - byte[] keyByte = { 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 }; ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); - key.writeBytes(ciphertext); - String resCipherData = decode(ByteBufUtil.hexDump(in)); - ByteBuf out = ByteBufAllocator.DEFAULT.heapBuffer(); -// out.writeBytes(resCipherData); -// System.out.println(hexBytes); - System.out.println(resCipherData.toString()); -// String resPlainData = EcbDecrypt(resCipherData, key); -// System.out.println("原始明文:" + data); -// System.out.println("解密后明文:" + resPlainData); + key.writeBytes(keyByte); +// String resCipherData = EcbDecrypt(ByteBufUtil.hexDump(in), ByteBufUtil.hexDump(key)); +// System.out.println(resCipherData); } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java index 1395a51..ac5f957 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java @@ -1,7 +1,7 @@ package com.casic.missiles.parser.safe.impl; import io.netty.buffer.ByteBufUtil; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** *

@@ -14,9 +14,8 @@ * @author hyl * @version v1.0: Tea.java, v 0.1 2021/3/12 13:48 $ */ -@Service("tea") -///tea算法类 - +//tea算法类 +@Component("tea") public class Tea { public static byte[] MyTea_Encrypt(byte[] MyTeaContent, int ByteLen, byte[] MyTeakey) { @@ -99,7 +98,6 @@ // for(int i32Index = 0; i32Index < 8; i32Index++) { // System.out.print("0x" + Integer.toHexString(MyContent[i32Index]) + " "); // } - // System.out.println("密钥为:"); // for(int i32Index = 0; i32Index < 16; i32Index++) { // System.out.print("0x" + Integer.toHexString(MyKeys[i32Index]) + " "); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java index bdd0721..bd1516a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java @@ -3,7 +3,7 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.parser.sender.DataSubscribeProvider; import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponents; import org.springframework.web.util.UriComponentsBuilder; @@ -12,7 +12,7 @@ import java.util.Collections; import java.util.Map; -@Service("functionCallback") +@Component("functionCallback") public class FunctionCallback implements DataSubscribeProvider { @Resource diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java index 0b44fb9..7526de2 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.Map; -@Service("middleware") +@Component("middleware") public class MiddlewareSubscribe implements DataSubscribeProvider { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java index 5dcee3f..e2f1192 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.Map; -@Service("nosql") +@Component("nosql") public class NoSqlSubscribe implements DataSubscribeProvider { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java b/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java new file mode 100644 index 0000000..81a5324 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java @@ -0,0 +1,86 @@ +package com.casic.missiles.pojo; + +import lombok.Data; + +/** + * 协议 + */ +@Data +public class Msg { + + /** + * 前导码 + */ + private String preamble; + + /** + * 版本号 + */ + private String version; + + /** + * 内容长度 + */ + private int leng; + + /** + * 设备ID + */ + private String deviceId; + + /** + * 通讯方式 + */ + private Integer connType; + + /** + * 加密方式 + */ + private Integer encryType; + + /** + * 目标地址 + */ + private String destAddr; + + /** + * PDUType + */ + private String PDUType; + + /** + * 操作类型 + */ + private Integer operateType; + + /** + * 传输控制位 PDUType.bit7=0时,表示存在后续的访问;当PDUType.bit7=1时,表示无后续的访问。 + */ + private Integer transControlFlag; + + /** + * 设备类型 + */ + private Integer deviceType; + + /** + * 序号 + */ + private Integer seq; + + /** + * tagList + */ + private String tagList; + + /** + * OidList + */ + private String OidList; + + /** + * CRC + */ + private String CRC; + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java index 40a5265..97cc984 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java @@ -40,7 +40,7 @@ String httpContent = msg.toString(Charset.defaultCharset()); log.info(" String : " + msg.toString(Charset.defaultCharset())); String majorContent = httpContent.substring(httpContent.indexOf("{"), httpContent.lastIndexOf("}") + 1); - String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("serviceData")).get("Value")); + String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("RegistryData")).get("Value")); log.info("----------------------------------" + values); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); bufferContent.writeBytes(values.getBytes(Charset.forName("ISO-8859-1"))); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java index 1b132a7..e3ced4b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java @@ -35,7 +35,7 @@ String httpContent = msg.toString(Charset.defaultCharset()); log.info(" String : " + msg.toString(Charset.defaultCharset())); String majorContent = httpContent.substring(httpContent.indexOf("{"), httpContent.lastIndexOf("}") + 1); - String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("serviceData")).get("Value")); + String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("RegistryData")).get("Value")); log.info("----------------------------------" + values); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); bufferContent.writeBytes(values.getBytes(Charset.forName("ISO-8859-1"))); diff --git a/sensorhub-core/src/main/resources/application.properties b/sensorhub-core/src/main/resources/application.properties deleted file mode 100644 index 8b13789..0000000 --- a/sensorhub-core/src/main/resources/application.properties +++ /dev/null @@ -1 +0,0 @@ - diff --git a/sensorhub-core/src/main/resources/config/application-dev.yml b/sensorhub-core/src/main/resources/config/application-dev.yml index 4f897a8..dcc4c2d 100644 --- a/sensorhub-core/src/main/resources/config/application-dev.yml +++ b/sensorhub-core/src/main/resources/config/application-dev.yml @@ -4,9 +4,9 @@ spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true + url: jdbc:mysql://127.0.0.1:3306/sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true username: root - password: Casic203 + password: root session: store-type: redis redis: diff --git a/sensorhub-core/src/main/resources/config/application.yml b/sensorhub-core/src/main/resources/config/application.yml index ae89f9d..7965da1 100644 --- a/sensorhub-core/src/main/resources/config/application.yml +++ b/sensorhub-core/src/main/resources/config/application.yml @@ -30,6 +30,13 @@ port: 6379 password: ew5T4K3#203lwh config-prefix: 'Casic:' +#代码生成器配置 +code: + generate: + #作者 + author: cz + #待生成对象表名 + table-name: bussiness_field_config,combined_field_config sensorhub: config: port: 7091 diff --git a/sensorhub-support/pom.xml b/sensorhub-support/pom.xml index 9a71296..761601c 100644 --- a/sensorhub-support/pom.xml +++ b/sensorhub-support/pom.xml @@ -42,6 +42,12 @@ ${redis.version} + + com.baomidou + mybatis-plus-generator + ${mybatis-plus-generator.version} + + org.reflections diff --git a/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java b/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java new file mode 100644 index 0000000..515ca53 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java @@ -0,0 +1,14 @@ +package com.casic.missiles.enums; + +/** + * @author + * @date + */ +public interface FixedPropertyEnum { + + String FIXED_POSITION = "fixedPosition"; + + String TOTAL_LENGTH = "totalLength"; + + String TAIL_POSITION = "tailPosition"; +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/CombinedFieldMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CombinedFieldMapper.java new file mode 100644 index 0000000..38e8f42 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CombinedFieldMapper.java @@ -0,0 +1,15 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.CombinedFieldConfig; +import org.apache.ibatis.annotations.Mapper; + +/** + * @author cz + * + */ +@Mapper +public interface CombinedFieldMapper extends BaseMapper { + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java new file mode 100644 index 0000000..128b09d --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java @@ -0,0 +1,10 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.CommandEventConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface CommandEventMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java new file mode 100644 index 0000000..042eb3c --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.DatagramEventConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface DatagramEventConfigMapper extends BaseMapper { +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java new file mode 100644 index 0000000..fc95cf4 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java @@ -0,0 +1,8 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.FieldConfig; + +public interface FieldConfigMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldRuleConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldRuleConfigMapper.java new file mode 100644 index 0000000..b310a08 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldRuleConfigMapper.java @@ -0,0 +1,10 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.FieldRuleConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface FieldRuleConfigMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java new file mode 100644 index 0000000..9060a69 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.ProtocolConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface ProtocolConfigMapper extends BaseMapper { +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolFieldConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolFieldConfigMapper.java new file mode 100644 index 0000000..1b47180 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolFieldConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +public interface ProtocolFieldConfigMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java new file mode 100644 index 0000000..6fa6936 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.RuleConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface RuleConfigMapper extends BaseMapper { +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/AbstractFieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/AbstractFieldConfig.java new file mode 100644 index 0000000..ba9aea2 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/AbstractFieldConfig.java @@ -0,0 +1,38 @@ +package com.casic.missiles.pojo; + +import lombok.Data; + +@Data +public class AbstractFieldConfig { + /** + * 字段名称 + */ + private String fieldName; + /** + * 按照字段评估进行字段解析 + */ + private String ruleJson; + /** + * 起始位置(单位byte) + */ + private Integer OriginPositionByte; + /** + * 起始位置,是否需要bit位置(单位bit)小于8, 没有不需要填写 + */ + private String OriginPositionBit; + /** + * 偏移长度 + */ + private Integer offsetLength; + /** + * 偏移单位(bit/byte) + */ + private String offsetUnit; + /** + * 是否需要转存 + */ + private Integer isStorage; + + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/CombinedFieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/CombinedFieldConfig.java new file mode 100644 index 0000000..4f4de6a --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/CombinedFieldConfig.java @@ -0,0 +1,41 @@ +package com.casic.missiles.pojo; + +import lombok.Data; + +import java.util.Date; + +/** + * 组合配置 + * + * @author cz + * @date 20 + */ +@Data +public class CombinedFieldConfig { + + private Long id; + private Long ruleId; + /** + * 前缀编码 + */ + private String prefixCode; + + /** + * 字段动态的id + */ + private Long dynamicLengthId; + /** + * 对应的要解析字段的ids + */ + private String dataFieldIds; + + /** + * 字段动态的id + */ + private String combinedFieldIds; + + private Date lastTime; + + private Date createTime; + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldConfig.java index a07d20d..8304dc6 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldConfig.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldConfig.java @@ -5,31 +5,28 @@ import java.util.Date; +/** + * @author cz + * 1、该表与实际解析的内容实例解析有关 + * 2、该表字段是随机出现的,和帧结构无关,无法预料的 + * 3、该表字段解析根据FieldEvaluatorConfig进行字段解析 + */ @Data -@TableName("field_config") -public class FieldConfig { +@TableName("business_field_config") +public class FieldConfig extends AbstractFieldConfig { private Long id; -// private String preFieldConfig; - private Long protocolId; - - private String isFixed; - private String uploadDeliveryChange; - - private String replyRule; - private String ruleJson; - + /** + * 协议配置id + */ + private Long ruleId; + /** + * 字段名称 + */ private String fieldName; - private String isStorage; - private Integer orignPosition; - private String exactOrignPosition; - - private Integer offsetLength; - private String offsetUnit; private String ownerId; private Date createTime; private Date lastTime; - } diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldRuleConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldRuleConfig.java new file mode 100644 index 0000000..2e09879 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldRuleConfig.java @@ -0,0 +1,20 @@ +package com.casic.missiles.pojo; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +@TableName("field_rule_config") +@Data +public class FieldRuleConfig { + + private Long id; + private String name; + private String desc; + private String condition; + private String excuteOperation; + private Date lasTime; + private Date createTime; + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/Msg.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/Msg.java deleted file mode 100644 index 81a5324..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/Msg.java +++ /dev/null @@ -1,86 +0,0 @@ -package com.casic.missiles.pojo; - -import lombok.Data; - -/** - * 协议 - */ -@Data -public class Msg { - - /** - * 前导码 - */ - private String preamble; - - /** - * 版本号 - */ - private String version; - - /** - * 内容长度 - */ - private int leng; - - /** - * 设备ID - */ - private String deviceId; - - /** - * 通讯方式 - */ - private Integer connType; - - /** - * 加密方式 - */ - private Integer encryType; - - /** - * 目标地址 - */ - private String destAddr; - - /** - * PDUType - */ - private String PDUType; - - /** - * 操作类型 - */ - private Integer operateType; - - /** - * 传输控制位 PDUType.bit7=0时,表示存在后续的访问;当PDUType.bit7=1时,表示无后续的访问。 - */ - private Integer transControlFlag; - - /** - * 设备类型 - */ - private Integer deviceType; - - /** - * 序号 - */ - private Integer seq; - - /** - * tagList - */ - private String tagList; - - /** - * OidList - */ - private String OidList; - - /** - * CRC - */ - private String CRC; - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/PreRuleConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/PreRuleConfig.java deleted file mode 100644 index bfcf914..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/PreRuleConfig.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.casic.missiles.pojo; - -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -import java.util.Date; - -@Data -@TableName("pre_rule_config") -public class PreRuleConfig { - - private Long id; - private String protocolId; - private String ruleFieldId; - private String ownerId; - private Date createTime; - private Date lastTime; -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolConfig.java index 274ad42..bdac11f 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolConfig.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolConfig.java @@ -5,18 +5,52 @@ import java.util.Date; +/** + * 协议配置表,协议配置与帧结构有关 + * 1、层级关系,协议之后是规则,规则对应设备类型的各种上数规则 + * 2、规则对应协议配置的实例流程 + * 3、每种可根据设备类型和操作类型进行上数规则进行区分 + */ @Data @TableName("protocol_config") public class ProtocolConfig { private Long id; + /** + * 前导码 + */ private String preFix; - private String unpackId; - private String totalLengthId; - private String totalLengthFilterField; + /** + * 拆包id + */ + private Long unpackId; + /** + * 总长度id + */ + private Long totalLengthId; + /** + * + */ + private String totalLengthFilterFields; + /** + * 动态长度ids + */ private String dynamicLengthId; + /** + * 动态长度json(预留字段) + */ private String dynamicLengthJson; - private String tailStr; + /** + * 规则字段所解析预准备的字段 + */ + private String rulePrepareFields; + /** + * 结尾标志 + */ + private Long tailStr; + /** + * 备注 + */ private String remark; private String ownerId; private Date createTime; diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolFieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolFieldConfig.java new file mode 100644 index 0000000..db794bd --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolFieldConfig.java @@ -0,0 +1,43 @@ +package com.casic.missiles.pojo; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +/** + * 协议字段配置表 + * 该表用户存放帧结构固定格式的字段 + * 有以下两个用途 + * (1)、固定格式的字段可用于规则匹配 + * (2)、固定格式的字段可用于报文回复 + * @author cz + * @date 2023-06-09 + */ +@Data +@TableName("protocol_field_config") +public class ProtocolFieldConfig extends AbstractFieldConfig{ + + private Long id; + /** + * 协议配置id + */ + private Long protocolId; + /** + * 上传下发是否有变化, 没有变化,可以直接组装 + */ + private String isReplyFix; + /** + * 按照字段评估进行字段解析 + */ + private Long fieldEvaluatorId; + /** + * 回复规则 + */ + private String replyRule; + + private String ownerId; + private Date createTime; + private Date lastTime; + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java index 3b53493..febf835 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java @@ -6,18 +6,40 @@ import java.util.Date; /** - * 加密字段解析和规则有关,事件调到该流程下面 + * @author cz + * todo: 匹配协议对应业务实例 + * 1、一个协议可以多种的流程规则 + * 2、规则可以支持递归规则流程 */ @Data @TableName("rule_config") public class RuleConfig { - private Long id; private String protocolId; - private String isBizField; - private String parseRuleJson; + /** + * 是否完成规则配置,没有完成, + * 则需要根据规则继续匹配 + */ + private String isFinishMatch; + /** + * 待匹配解析规则 + * {“data_field”:"data_value"} + */ + private String matchRuleJson; + /** + * 待解析字段ids + */ private String dataFieldIds; - private String aviatorFilterJson; + + /** + * 待解析组合字段ids + */ + private String combinedFieldIds; + + /** + * aviator + */ + private String conditionExpression; private Date createTime; private Date lastTime; } diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleDict.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleDict.java deleted file mode 100644 index cc7f389..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleDict.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.casic.missiles.pojo; - -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -@Data -@TableName("rule_dict") -public class RuleDict { - - private Long id; - private Long pid; - private String name; - private String code; - private String ownerId; - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleEvaluator.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleEvaluator.java deleted file mode 100644 index ed16610..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleEvaluator.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.pojo; - -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -import java.util.Date; - -@TableName("rule_evaluator") -@Data -public class RuleEvaluator { - - private Long id; - private String name; - private String desc; - private String condition; - private String excuteOperation; - private Date lasTime; - private Date createTime; - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java index 608af3a..32cc8a4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java @@ -2,48 +2,47 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.delivery.decorator.ByteDecorator; +import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @AllArgsConstructor public class FieldDecoratorManger { - private final RuleDictDao ruleDictDao; + private final RuleConfigRegistry ruleDictDao; // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 // (1)静态的业务字段是字典里面可以配置的 // (2)动态的业务字段是通过规则生成的 public String contentMerge(String ruleJson, String sceneConent, String dynamicContent) { - List ruleDictList = ruleDictDao.getRuleDictConfig(); - Map ruleDictMap = ruleDictList.stream().collect( - Collectors.toMap(RuleDict::getId, e -> e)); - List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); - for (Map ruleMap : ruleMapList) { - String ruleType = String.valueOf(ruleMap.get("ruleType")); - ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); - NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); - byteDecorator.nodeDecoratorRule(nodeDecoratorParm); - } +// List ruleDictList = ruleDictDao.getRuleDictConfig(); +// Map ruleDictMap = ruleDictList.stream().collect( +// Collectors.toMap(RuleDict::getId, e -> e)); +// List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); +// for (Map ruleMap : ruleMapList) { +// String ruleType = String.valueOf(ruleMap.get("ruleType")); +// ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); +// NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); +// byteDecorator.nodeDecoratorRule(nodeDecoratorParm); +// } return null; } - - private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { - NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() - .contents(sceneConent) - .dynamicContent(dynamicContent) - .ruletypeId(ruletypeId) - .ruleDictMap(ruleDictMap) - .build(); - return nodeDecoratorParm; - } +// +// private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { +// NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() +// .contents(sceneConent) +// .dynamicContent(dynamicContent) +// .ruletypeId(ruletypeId) +// .ruleDictMap(ruleDictMap) +// .build(); +// return nodeDecoratorParm; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java index 652970c..b204ac3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java @@ -1,56 +1,56 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@AllArgsConstructor -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", - JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Component; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Component("logicalDecorator") +//@AllArgsConstructor +//@Slf4j +//public class LogicalShiftDecorator implements ByteDecorator { +// +//// private final FieldRuleEngineMapper fieldRuleEngineMapper; +//// +//// //字节位移 +//// @Override +//// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +//// String logicalValue = ""; +//// RuleEvaluator fieldRuleEngine = new RuleEvaluator(); +//// try { +//// Map env2 = new HashMap(); +//// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +//// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +//// for (String contentId : contentIdList) { +//// RuleDict ruleDict = ruleDictMap.get(contentId); +//// if (ruleDict.getCode().contains("#")) { +//// //使用动态的值 +//// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +//// } +//// env2.put(ruleDict.getName(), ruleDict.getCode()); +//// } +//// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +//// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +//// return null; +//// } +//// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +//// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +//// return values; +//// } catch (Exception ex) { +//// log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", +//// JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +//// return null; +//// } +//// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java index 346468f..822fead 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@AllArgsConstructor -@Slf4j -public class OperationDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("optionDecorator") +//@AllArgsConstructor +//@Slf4j +//public class OperationDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //混合运算,有常量或者乘除的缩放 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java index 50fb0a7..7a8bccb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@AllArgsConstructor -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +////精度计算 +//@AllArgsConstructor +//@Registry("precisionDecorator") +//@Slf4j +//public class PrecisionDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java index da39235..27f9cc7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java @@ -1,54 +1,53 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@AllArgsConstructor -@Slf4j -public class RuleDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("ruleDecorator") +//@AllArgsConstructor +//@Slf4j +//public class RuleDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //吃我一套正则表达式 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (Exception ex) { +// log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java index 7f5cbf3..c043f97 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java @@ -2,6 +2,6 @@ import java.util.Map; -public interface ComandeEventService { +public interface ComandeEventService{ Map loadComandeEventConfig(String protocolId,String scene); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java index 476ad84..aaf1837 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java @@ -2,46 +2,46 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.dao.CommandEventDao; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @Slf4j @AllArgsConstructor -public class ComandeEventServiceImpl implements ComandeEventService { +public class ComandeEventServiceImpl implements ComandeEventRegistry { - private final CommandEventDao commandEventDao; + // private final CommandEventDao commandEventDao; // 加密bean 固定字段出现变化的字段解析,业务字段的有序内容 @Override - public Map loadComandeEventConfig(String protocolId,String sceneName) { - CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); - if (ObjectUtil.isEmpty(commandEventConfig)) { - log.error("协议{},没有配置成功接收回复配置,清排查原因"); - return null; - } - String replyJson = commandEventConfig.getReplyContentJson(); - List> replyMapList = JSONArray.parseObject(replyJson, List.class); - List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); - Map fixMap = fixList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); - List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) - .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) - .collect(Collectors.toList()); - Map commandConfigMap = new HashMap<>(); - commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); - commandConfigMap.put("fixContent", fixMap); - commandConfigMap.put("bizContent", contentList); - return commandConfigMap; + public Map loadComandeEventConfig(String protocolId, String sceneName) { +// CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); +// if (ObjectUtil.isEmpty(commandEventConfig)) { +// log.error("协议{},没有配置成功接收回复配置,清排查原因"); +// return null; +// } +// String replyJson = commandEventConfig.getReplyContentJson(); +// List> replyMapList = JSONArray.parseObject(replyJson, List.class); +// List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); +// Map fixMap = fixList.stream() +// .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); +// List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) +// .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) +// .collect(Collectors.toList()); +// Map commandConfigMap = new HashMap<>(); +// commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); +// commandConfigMap.put("fixContent", fixMap); +// commandConfigMap.put("bizContent", contentList); +// return commandConfigMap; + return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 128b09d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java deleted file mode 100644 index 4016b0b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface DatagramEventMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java deleted file mode 100644 index 597c306..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.apache.ibatis.annotations.Mapper; - -public interface FieldConfigMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java deleted file mode 100644 index a31680a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.PreRuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface PreRuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java deleted file mode 100644 index 9060a69..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface ProtocolConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java deleted file mode 100644 index 6fa6936..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java deleted file mode 100644 index 582a705..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleDict; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleDictMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java deleted file mode 100644 index 6e302c8..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.CommandEventMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Optional; - -@Component -public class CommandEventDao { - - @Resource - private CommandEventMapper commandEventMapper; - - public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId) - .eq("scene", sceneName) - .eq("enabled", 1); - List commandEventConfig = commandEventMapper.selectList(queryWrapper); - Optional optionalEventConfig = commandEventConfig.stream().findFirst(); - return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java deleted file mode 100644 index 9137e4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.FieldConfigMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class FieldConfigDao { - - @Resource - private FieldConfigMapper fieldConfigMapper; - - public FieldConfig getFieldConfigById(String fieldId) { - FieldConfig fieldConfig = fieldConfigMapper.selectById(fieldId); - return fieldConfig; - } - - public List getFieldConfigs(String protocolId,Integer isFixed) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",isFixed); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - - public List getStorageFieldConfig(String protocolId) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",1) - .eq("is_storage",1); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java deleted file mode 100644 index 67bff6b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.mapper.PreRuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class PreRuleConfigDao { - - @Resource - private PreRuleConfigMapper preRuleConfigMapper; - - public List getPreRuleList(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return preRuleConfigMapper.selectList(queryWrapper); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java deleted file mode 100644 index d69ea85..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.RuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleConfigDao { - - @Resource - private RuleConfigMapper ruleConfigMapper; - - public RuleConfig getNextRuleConfig(String ruleFields) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("parse_rule_json", ruleFields); - return ruleConfigMapper.selectOne(queryWrapper); - } - - - public List getRuleConfigById(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return ruleConfigMapper.selectList(queryWrapper); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java deleted file mode 100644 index 932c185..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.RuleDictMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleDictDao { - - @Resource - private RuleDictMapper ruleDictMapper; - - public List getRuleDictConfig() { - List ruleDictList = ruleDictMapper.selectList(null); - return ruleDictList; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java index 9f9e279..43bc4d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java @@ -10,20 +10,15 @@ import io.netty.channel.socket.nio.NioServerSocketChannel; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import javax.annotation.PreDestroy; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static cn.hutool.core.util.ClassUtil.getClasses; /** * SensorhubServer netty服务端 */ @Slf4j -@Service +@Component public class SensorhubServer { /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java index 2c79ff5..9a28c36 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java @@ -11,13 +11,13 @@ import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioSocketChannel; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClient 客户端 */ @Slf4j -@Service +@Registry public final class SensorhubClient { public static void main(String[] args) throws Exception { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java index 9774be0..477c3f7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java @@ -6,12 +6,12 @@ import io.netty.channel.socket.SocketChannel; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientChannelInitialHandler */ -@Service +@Registry public class SensorhubClientChannelInitialHandler extends ChannelInitializer { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java index 346f4b3..73560e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java @@ -5,13 +5,13 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientHandler */ @Slf4j -@Service +@Registry public class SensorhubClientHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java index 5c1c6f2..d990af5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java @@ -4,12 +4,12 @@ import com.casic.missiles.pojo.Msg; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** * SensorhubServerHandler */ -@Service +@Component public class SensorhubServerHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 67283ae..af3172c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,41 +1,37 @@ package com.casic.missiles.parser; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultProtocolConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.*; +import com.casic.missiles.registry.FieldConfigRegistry; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; -import java.nio.charset.Charset; import java.util.HashMap; import java.util.List; import java.util.Map; -@Service("genericProtocolParser") +/** + * @author + */ +@Component("genericProtocolParser") @Slf4j -@AllArgsConstructor +@RequiredArgsConstructor public class GenericProtocolParser implements ProtocolParser { - private final LeadingCodeMatcher leadingCodeMatcher; private final List frameStructDispenserList; - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorInstanceSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; // 匹配首字母前导码=> 帧结构匹配前导码=> // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 @@ -44,18 +40,19 @@ public Boolean doParseProtocol(ByteBuf byteBuf) { String protocolContent = ByteBufUtil.hexDump(byteBuf); //匹配前导码 - List preCodeConfigs = leadingCodeMatcher.matchLeadingCode(protocolContent); + List preCodeConfigs = LeadingCodeMatcher.matchFrameLeadingCode(protocolContent); //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 if (preCodeConfigs.size() == 0) { - return rematch(byteBuf,protocolContent); + return rematch(byteBuf, protocolContent); } - //暂时先取第一个 + //暂时先取第一个,提升速度,使用享元模式, 减少类的创建销毁与构建 ProtocolConfig protocolConfig = preCodeConfigs.get(0); + AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); ByteBuf wholeDatagramByte = null; //通过匹配帧结构获取完整的数据包 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, preCodeConfigs.get(0))) != null) { + if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, protocolFactory)) != null) { break; } } @@ -68,76 +65,78 @@ * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 */ - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId, wholeDatagramByte); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap, protocolId); - //选取规则对应的流程实例 - DatagramEventConfig datagramEventConfig = processorInstanceSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); + //进行规则字段解析,进行匹配规则 + RuleConfig ruleConfig = getRuleConfig(protocolFactory, wholeDatagramByte); + if (ruleConfig == null) { + return false; + } //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, wholeDatagramByte); + ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte); + //以下进行业务的规则解析,同时选定流程实例 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); + DatagramEventProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain, + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText, protocolId); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain); //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); + datagramEventProvider.storeData(bizDataMap); return true; } - private Boolean rematch(ByteBuf byteBuf,String protocolContent) { + /** + * 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 + */ + private Boolean rematch(ByteBuf byteBuf, String protocolContent) { //重置位判断 byteBuf.resetReaderIndex(); //判断重置是否前移,如果没有前移,则直接判为匹配失败 if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { return false; } else { + //递归执行 return doParseProtocol(byteBuf); } } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; + //获取匹配规则->匹配规则 + private RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + //取出其中参与逻辑provider并判空 + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); + String rulePrepareFields = protocolConfig.getRulePrepareFields(); + //固定字段 + if (StringUtils.isNotEmpty(rulePrepareFields)) { + //获取统一固定字段解析 + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + //获取该协议的字段配置,用于协议规则匹配 + List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); + //获取规则 + RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, + rulePrepareFields, protocolFieldConfigs); + return ruleConfig; + } + return null; } - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + //数据构建,获取固定字段的store和业务字段store + private Map buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + Map bizDataMap = new HashMap<>(); + Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); + Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); + bizDataMap.putAll(ruleStoreObjectMap); + bizDataMap.putAll(protocolStoreObjectMap); return bizDataMap; } - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java index 8a46e32..16ce2e5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java @@ -3,6 +3,7 @@ import io.netty.buffer.ByteBuf; public interface ProtocolParser { + Boolean doParseProtocol(ByteBuf byteBuf); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java new file mode 100644 index 0000000..f7814af --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java @@ -0,0 +1,35 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.ProtocolConfigProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.ProtocolConfig; + +/** + * 存放基本协议的的加载信息 + */ +public class AbstractProtocolConfigFactory { + private final ProtocolConfigProvider protocolConfigProvider; + private final ProtocolFieldConfigProvider protocolFieldConfigProvider; + private final RuleConfigProvider ruleConfigProvider; + + public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { + this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); + this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); + this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); + } + + public ProtocolConfigProvider getProtocolConfigProvider() { + return protocolConfigProvider; + } + + public ProtocolFieldConfigProvider getProtocolFieldConfigProvider() { + return protocolFieldConfigProvider; + } + + public RuleConfigProvider getRuleConfigProvider() { + return ruleConfigProvider; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java new file mode 100644 index 0000000..6e36147 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java @@ -0,0 +1,57 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.CombinedFieldConfigProvider; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.FieldConfigProvider; +import com.casic.missiles.parser.provider.FieldRuleConfigProvider; + +/** + * 存放规则相关的的的加载信息 + */ +public class AbstractRuleConfigFactory { + + /** + * 处理字节 + */ + private final FieldConfigProvider fieldConfigProvider; + /** + * 处理组合字节解析的解码器 + */ + private final CombinedFieldConfigProvider combinedFieldConfigProvider; + /** + * 处理负责字节解析的规则配置 + */ + private final FieldRuleConfigProvider fieldRuleConfigProvider; + /** + * 处理实例流程 + */ + private final DatagramEventProvider datagramEventProvider; + + + public AbstractRuleConfigFactory(Long ruleId) { + this.fieldConfigProvider = new FieldConfigProvider(ruleId); + this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); + this.fieldRuleConfigProvider = new FieldRuleConfigProvider(ruleId); + this.datagramEventProvider = new DatagramEventProvider(ruleId); + } + + public FieldConfigProvider getFieldConfigProvider() { + return fieldConfigProvider; + } + + public CombinedFieldConfigProvider getCombinedFieldConfigProvider() { + return combinedFieldConfigProvider; + } + + public FieldRuleConfigProvider getFieldRuleConfigProvider() { + return fieldRuleConfigProvider; + } + + public DatagramEventProvider getDatagramEventProvider() { + return datagramEventProvider; + } + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java deleted file mode 100644 index 6e1719a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.factory; - - -import com.casic.missiles.pojo.ProtocolConfig; - -import java.util.List; - -/** - * 数据库访问优化(暂时未做) - *

- * 1、初始化协议解析配置,并存放到处存放缓存,对协议基本配置进行管理 - * 2、其中流程中所有的配置都经过此类进行管理,进行调用获取,增强解析速度 - */ -public interface DatagramFactory { - - /** - * 初始化 - */ - List datagramInit(); - - /** - * 根据前导码配置匹配,模糊匹配获取所有的报文项 - */ - List match(); - - /** - * 根据前导码匹配,返回报文项 - */ - List filer(); - - /** - * 保证数据的唯一性选择器 - */ - List selectOne(); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java new file mode 100644 index 0000000..87444a0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java @@ -0,0 +1,18 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +import java.util.List; + +/** + * 直接用,还是边用边创建 + */ +public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { + + + public DefaultProtocolConfigFactory(ProtocolConfig protocolConfig) { + super(protocolConfig); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java new file mode 100644 index 0000000..cce0c7c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java @@ -0,0 +1,12 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; + +public class DefaultRuleFactory extends AbstractRuleConfigFactory { + + public DefaultRuleFactory(Long ruleId) { + super(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java deleted file mode 100644 index 9ee97e0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.casic.missiles.parser.instance; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service -@Slf4j -@AllArgsConstructor -public class GeneralProcessor { - - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; - - /** - * 统一固定字段解析=>进行规则的查询的判断 - * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 - * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 - */ - @Deprecated - public boolean parseWholeDatagram(ByteBuf buffer, ProtocolConfig protocolConfig) { - try { - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap,protocolId); - //选取规则对应的流程= - DatagramEventConfig datagramEventConfig = processorSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); - //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); - //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); - //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); - //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); - //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); - return true; - } catch (Exception ex) { - log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", - ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); - return false; - } - } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; - } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); - } - - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); - return bizDataMap; - } - - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java index 25e7ad8..6a5777e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java @@ -1,23 +1,31 @@ package com.casic.missiles.parser.instance.impl; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.mapper.DatagramEventMapper; import com.casic.missiles.pojo.DatagramEventConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.SpringContextUtil; -@Service -@AllArgsConstructor +import java.util.List; +import java.util.Optional; + +/** + * @author cz + * + */ public class DefaultProcessorInstanceSelector implements ProcessorInstanceSelector { - private final DatagramEventMapper datagramEventMapper; + private static List datagramEventConfigs; + + static { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + datagramEventConfigs = datagramEventRegistry.getDatagramEventList(); + } @Override public DatagramEventConfig getProcessorInstance(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("rule_id", protocolId); - return datagramEventMapper.selectOne(queryWrapper); + Optional optionalSelectInstance = datagramEventConfigs.stream() + .filter(e -> e.getId().equals(protocolId)).limit(1).findFirst(); + return optionalSelectInstance.isPresent() ? optionalSelectInstance.get() : null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a778671..7b56a43 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,16 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import io.netty.buffer.ByteBuf; /** - * 分析匹配情况 - * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 - * 2、匹配不成功,有后续帧,可以进行下次匹配。 - * 3、匹配不成功,无后续帧,可以进行丢弃。 + * 分析匹配情况 + * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 + * 2、匹配不成功,有后续帧,可以进行下次匹配。 + * 3、匹配不成功,无后续帧,可以进行丢弃。 */ -public interface FrameStructMatcher{ +public interface FrameStructMatcher { - ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig); + ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 05320ab..8ebea78 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,23 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.ProtocolConfigMapper; +import com.casic.missiles.parser.provider.ProtocolConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Component; import java.util.List; import java.util.stream.Collectors; -@Component -@AllArgsConstructor public class LeadingCodeMatcher { - private final ProtocolConfigMapper protocolMapper; - //** 1、首字母匹配前导码, // 2、以匹配出的前导码是否在报文中条件进行前导码的匹配二次筛选 - public List matchLeadingCode(String protocolContent){ + public static List matchFrameLeadingCode(String protocolContent){ List initialConfigs = initialMatch(protocolContent); List preCodeConfigs = initialConfigs.stream() .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) @@ -26,13 +19,16 @@ } //初始化匹配前导码内容 - private List initialMatch(String protocolContent) { - String protocolStr = protocolContent.charAt(0) + ""; - QueryWrapper queryWrapper = new QueryWrapper() - .likeRight("pre_fix", protocolStr); - List protocolConfigList = protocolMapper.selectList(queryWrapper); - return protocolConfigList; + private static List initialMatch(String protocolContent) { + String firstFrameChar = protocolContent.charAt(0) + ""; + ProtocolConfigProvider protocolConfigProvider=new ProtocolConfigProvider(firstFrameChar); + return protocolConfigProvider.getMatchList(); } + + + + + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index cf2113d..e915877 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -1,32 +1,35 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(0) -@Service +@Component public class FrameLengthMatcher implements FrameStructMatcher { - @Autowired - private FieldParser fieldParser; - //超过长度 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { String dataGramContent = ByteBufUtil.hexDump(byteBuf); - if (StringUtils.isEmpty(protocolConfig.getUnpackId()) && StringUtils.isEmpty(protocolConfig.getTailStr())) { - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + //当不存在结尾标志和拆包标志,可以直接使用长度进行匹配 + if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { if (dataGramContent.length() >= totalLength) {//等于长度返回true,超出长度,切断 - ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, protocolConfig, totalLength); + ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, totalLength); return wholeDatagramByte; } else { //读的标志位前移舍弃 @@ -38,7 +41,7 @@ return null; } - private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, Integer totalLength) { byteBuf.readBytes(totalLength); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, totalLength - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 2bfc213..d527ad0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; @@ -13,7 +13,7 @@ import lombok.AllArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.nio.charset.Charset; import java.util.Map; @@ -22,32 +22,30 @@ * 后续标志验证 */ @Order(1) -@Service +@Component @AllArgsConstructor -public class FrameMarkMatcher implements FrameStructMatcher { - - private final FieldConfigDao fieldConfigDao; - private final FieldParser fieldParser; - private final FieldResolver fieldResolverManger; +public class FrameMarkMatcher implements FrameStructMatcher, FixedPropertyEnum { //帧后续标志=>结束,进行帧的重组=>有后续,1、帧移位判别 2、继续接收帧 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig UnpackConfig = StringUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getUnpackId()); - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); - Integer upback = 0; + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); ByteBuf mergeWholeFrameByte = null; - if (!ObjectUtil.isEmpty(UnpackConfig)) { - while (hasNextFullFrame(byteBuf, protocolConfig)) { - upback = (Integer) fieldResolverManger.filedParserManger(byteBuf, UnpackConfig, null); + if (!ObjectUtil.isEmpty(unpackFlag)) { + while (hasNextFullFrame(byteBuf, protocolConfig, protocolFieldConfigProvider)) { //是否存在后续位 - if (upback == 1) {//使用esayRule + if (unpackFlag == 1) {//使用esayRule //表示可以截取 - mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolConfig, totalLength); + mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolFieldConfigProvider, protocolConfig); return mergeWholeFrameByte; } else { - byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig)); + byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig, protocolFieldConfigProvider)); } } } @@ -56,7 +54,8 @@ //选取第一个帧,将业务内容和后面部分分开 //计算数据报文-业务内容 - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolFieldConfigProvider protocolFieldConfigProvider, ProtocolConfig protocolConfig) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); //截取完整报文 byteBuf.readBytes(totalLength); ByteBuf byteBufContent = byteBuf.slice(0, byteBuf.readerIndex()); @@ -68,15 +67,15 @@ String tail = ""; System.out.println(ByteBufUtil.hexDump(byteBufContent)); //会存在多个帧拼接在一起的的情况,进行合并处理 - while (hasNextFullFrame(byteBufContent, protocolConfig)) { - Integer currentFrameLength = fieldParser.getTotalLength(protocolConfig, byteBufContent); + while (hasNextFullFrame(byteBufContent, protocolConfig, protocolFieldConfigProvider)) { + Integer currentFrameLength = protocolFieldConfigProvider.getTotalLength(byteBufContent, protocolConfig); byteBufContent.readBytes(currentFrameLength); ByteBuf currentbyteBuf = byteBufContent.slice(0, byteBufContent.readerIndex()); byteBufContent.markReaderIndex();//读的标志位前移 System.out.println(ByteBufUtil.hexDump(byteBufContent)); String hexDump = currentbyteBuf.toString(Charset.forName("ISO-8859-1")); //获取当前固定帧结构的关系map - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, currentbyteBuf); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(currentbyteBuf, protocolConfig); if (StringUtils.isEmpty(mergeFrameStr)) { //首次获取业务数据报文 mergeFrameStr += hexDump.substring(0, currentFrameFixedProperty.get("tailPosition")); @@ -95,22 +94,22 @@ /** * 获取平移到下一帧起始位置 */ - public int getNextFrameOffset(ByteBuf buffer, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, buffer); - return currentFrameFixedProperty.get("totalLength"); + public int getNextFrameOffset(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + return currentFrameFixedProperty.get(TOTAL_LENGTH); } /** * 判断是否出错进行整个帧的 */ - public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, byteBuf); + public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); //保证读取位置不在固定位置,是可变的业务内容 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("fixedPosition")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(FIXED_POSITION)) { return false; } //判断读取是否操作帧长度 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("totalLength")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(TOTAL_LENGTH)) { return false; } return true; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 76a3784..c3a1bab 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -1,50 +1,50 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.parser.instance.GeneralProcessor; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; +import io.netty.buffer.ByteBufUtil;; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(2) -@Service +@Component public class FrameTailMatcher implements FrameStructMatcher { - @Resource - private FieldConfigDao fieldConfigDao; - @Autowired - private GeneralProcessor generalProcessor; - //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig tailFieldConfig = StringUtils.isEmpty(protocolConfig.getTailStr()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getTailStr()); - if (!ObjectUtil.isEmpty(tailFieldConfig)) { - String tailStr = tailFieldConfig.getFieldName(); + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfig protocolFieldConfig = ObjectUtils.isEmpty(protocolConfig.getTailStr()) ? null : + fieldConfigProvider.getFieldConfigById(protocolConfig.getTailStr()); + if (!ObjectUtil.isEmpty(protocolFieldConfig)) { + String tailStr = protocolFieldConfig.getFieldName(); String dataGramContent = ByteBufUtil.hexDump(byteBuf); Boolean tailFlag = ByteBufUtil.hexDump(byteBuf).contains(tailStr); if (!tailFlag) { //使用esayRule return null; } else if (dataGramContent.indexOf(tailStr) < dataGramContent.length() - tailStr.length()) { Integer length = dataGramContent.indexOf(tailStr) + tailStr.length(); - ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, protocolConfig, length); + ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, length); return wholeDatagramByte; //存在粘包 } } return null; } - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer length) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, Integer length) { byteBuf.readBytes(length); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, length - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java new file mode 100644 index 0000000..5f1c177 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java @@ -0,0 +1,73 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.combined.GenericCombinedFieldResolver; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.CombinedFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class CombinedFieldConfigProvider { + + + /** + * 作为临时配置列表缓存使用 + */ + private final List combinedFieldConfigList; + private Map storeObjectMap = new HashMap<>(); + + public CombinedFieldConfigProvider(Long ruleId) { + CombinedFieldConfigRegistry combinedFieldConfigRegistry = SpringContextUtil.getBean(CombinedFieldConfigRegistry.class); + combinedFieldConfigList = combinedFieldConfigRegistry.getCombinedFieldConfigList(ruleId); + } + + public void parseDataField(RuleConfig ruleConfig, String clearZeroPlain,Map fieldConfigsMap ) { + if (showSkip()) { + return; + } + //匹配对应的数据,然后进行相关的字段解析 + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver(); + combinedFieldResolver.parseDataField(combinedFieldConfigList, byteBuf, storeObjectMap,fieldConfigsMap); + } + + + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getCombinedFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return combinedFieldConfigList.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public List getCombinedFieldConfigList() { + return combinedFieldConfigList; + } + + /* 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(combinedFieldConfigList) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java new file mode 100644 index 0000000..f3cfedc --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java @@ -0,0 +1,11 @@ +package com.casic.missiles.parser.provider; + +/** + * @author cz + * @date 2023-6-12 + */ +public class CommandEventProvider{ + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java new file mode 100644 index 0000000..70eec5e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java @@ -0,0 +1,77 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.safe.SafeStrategy; +import com.casic.missiles.parser.sender.DataSubscribeProvider; +import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class DatagramEventProvider { + + private final DatagramEventConfig processorInstance; + + public DatagramEventProvider(Long ruleId) { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + List datagramEventConfigList = + datagramEventRegistry.getDatagramEventList(ruleId); + processorInstance = this.getProcessorInstance(datagramEventConfigList); + } + + public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { + if (showSkip()) { + return null; + } + return datagramEventConfigList.get(0); + } + + // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 + public String getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap) { + String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? + processorInstance.getSafeBean() : + fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); + if (!StringUtils.isEmpty(safeName)) { + //需要加密 + SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); + String plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); + return clearComplementZero(plain); + } + return ByteBufUtil.hexDump(bizDataContent); + } + + //解密清零操作 + private String clearComplementZero(String plain) { + plain = plain.substring(0, plain.lastIndexOf("00")); + return plain; + } + + //数据发送,数据发送者暂未构建 + public void storeData(Map bizDataMap) { + DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); +// dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return ObjectUtils.isNotEmpty(processorInstance) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java new file mode 100644 index 0000000..7e1fe0a --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java @@ -0,0 +1,97 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.FieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class FieldConfigProvider { + + + private final List fieldConfigs; + private Map storeObjectMap = new HashMap<>(); +// private Map singleObjects = new ConcurrentHashMap<>(); + + public FieldConfigProvider(Long ruleId) { + FieldConfigRegistry fieldConfigRegistry = SpringContextUtil.getBean(FieldConfigRegistry.class); + fieldConfigs = fieldConfigRegistry.getFieldConfigList(ruleId); + } + + public List getFieldConfigs() { + return fieldConfigs; + } + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public Map parseDataField(RuleConfig ruleConfig, String clearZeroPlain) { + if (showSkip()) { + return null; + } + List prepareFieldConfig = prepareParseField(ruleConfig); + if (CollectionUtils.isNotEmpty(prepareFieldConfig)) { + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(fieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + return fixDataMap; + } + } + return null; + } + + /** + * 得到需要处理的业务内容 + * + * @return + */ + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return fieldConfigs.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public Map getFieldConfigsMap() { + return fieldConfigs.stream().collect( + Collectors.toMap(FieldConfig::getId, e -> e) + ); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(fieldConfigs) ? false : true; + } + + +} + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java new file mode 100644 index 0000000..817bfaf --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java @@ -0,0 +1,19 @@ +package com.casic.missiles.parser.provider; + +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.registry.FieldRuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; + +public class FieldRuleConfigProvider { + + private final List fieldRuleConfigList; + + public FieldRuleConfigProvider(Long ruleId) { + FieldRuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(FieldRuleConfigRegistry.class); + fieldRuleConfigList = ruleConfigRegistry.getFieldRuleConfigList(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java new file mode 100644 index 0000000..99a1b06 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java @@ -0,0 +1,53 @@ +package com.casic.missiles.parser.provider; + + +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.registry.ProtocolConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolConfigProvider { + + private final List protocolConfigList; + + public ProtocolConfigProvider(String firstChar) { + ProtocolConfigRegistry registry = SpringContextUtil.getBean(ProtocolConfigRegistry.class); + protocolConfigList = registry.getProtocolConfigList(firstChar); + } + + public List getMatchList() { + return protocolConfigList; + } + + /** + * 设置当前协议 + * + * @param protocolConfig + */ + public ProtocolConfigProvider(ProtocolConfig protocolConfig) { + List protocolConfigs = new ArrayList<>(); + protocolConfigs.add(protocolConfig); + protocolConfigList = protocolConfigs; + } + + /** + * 获取当前协议 + * + * @return + */ + public ProtocolConfig getCurrentProtocolConfig() { + if (this.protocolConfigList == null) { + return null; + } else { + return protocolConfigList.get(0); + } + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java new file mode 100644 index 0000000..043927d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java @@ -0,0 +1,213 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.registry.ProtocolFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolFieldConfigProvider { + + private static final String FIXED_FIELD_DS = "fixedFieldDs"; + private static final String CONTENT_FIELD_DS = "contentFieldDs"; + private static final String PROTOCOL_LENGTH = "protocolLength"; + private static final String PROTOCOL_FIELD_ID = "protocolFieldId"; + private static final String PROTOCOL_POSITION = "protocolPosition"; + + private final List protocolFieldConfigs; + private Map singleObjects = new ConcurrentHashMap<>(); + private Map storeObjectMap = new HashMap<>(); + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public ProtocolFieldConfigProvider(Long protocolId) { + ProtocolFieldConfigRegistry protocolFieldConfigRegistry = SpringContextUtil.getBean(ProtocolFieldConfigRegistry.class); + protocolFieldConfigs = protocolFieldConfigRegistry.getProtocolFieldConfigList(protocolId); + } + + public List getProtocolFieldConfigs() { + return protocolFieldConfigs; + } + + public ProtocolFieldConfig getFieldConfigById(Long fieldId) { + Optional optionalConfig = protocolFieldConfigs.stream().filter( + e -> e.getId().equals(fieldId) + ).findFirst(); + return optionalConfig.isPresent() ? optionalConfig.get() : null; + } + + public Integer getProtocolFieldValue(Long protocolFieldId, ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_FIELD_ID + protocolFieldId + ByteBufUtil.hexDump(byteBuf); + //获取缓存 + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + //加载固定长度数据集合 + Map fixDataMap = this.getProtocolDataMap(byteBuf); + ProtocolFieldConfig protocolFieldConfig = selectFieldConfig(protocolFieldId); + Integer protocolFieldValue = 0; + //获取约定字段的总长度 + if (fixDataMap.containsKey(protocolFieldConfig.getFieldName())) { + Object appointUnpackObject = fixDataMap.get(protocolFieldConfig.getFieldName()); + if (ObjectUtils.isNotEmpty(appointUnpackObject)) { + protocolFieldValue = (Integer) appointUnpackObject; + } + } + if (protocolFieldValue != null) { + //加入缓存 + if (ObjectUtils.isNotEmpty(protocolFieldValue)) { + this.singleObjects.put(catchKey, protocolFieldValue); + return protocolFieldValue; + } + } + return null; + } + + /** + * 获取帧固定位置信息 + * + * @param byteBuf + * @param protocolConfig + * @return + */ + public Map getFixedProperty(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_POSITION + protocolConfig.getId(); + if (this.singleObjects.containsKey(catchKey)) { + return (Map) singleObjects.get(catchKey); + } + Map fixedPropertyMap = new HashMap<>(); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + fixedPropertyMap = fieldParser.doGetFixedProperty(protocolFieldConfigs, this.getTotalLength(byteBuf,protocolConfig)); + if (CollectionUtils.isNotEmpty(fixedPropertyMap)) { + this.singleObjects.put(catchKey, fixedPropertyMap); + return fixedPropertyMap; + } + return fixedPropertyMap; + } + + /** + * 获取帧结构应有的总长度 + */ + public Integer getTotalLength(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_LENGTH + ByteBufUtil.hexDump(byteBuf); + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + Integer appointFrameLength = getProtocolFieldValue(protocolConfig.getTotalLengthId(), byteBuf); + if (appointFrameLength != null) { + //获取过滤的字段集合总长度 + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Integer totalFilterLength = fieldParser.getTotalFilterLength(protocolConfig, byteBuf, getFixFieldConfigMap()); + //计算总长度 + Integer totalLength = appointFrameLength + totalFilterLength; + //加入缓存 + if (ObjectUtils.isNotEmpty(totalLength)) { + this.singleObjects.put(catchKey, totalLength); + return totalLength; + } + } + return null; + } + + /** + * 获取协议有关字段解析内容 + * storeObjectMap存储代转存的数据 + * + * @return + */ + public Map getProtocolDataMap(ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(FIXED_FIELD_DS)) { + return (Map) singleObjects.get(FIXED_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(protocolFieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + this.singleObjects.put(FIXED_FIELD_DS, fixDataMap); + return fixDataMap; + } + return null; + } + + /** + * 获取业务报文内容的content字节 + * + * @param wholeDatagramByte + * @return + */ + public ByteBuf getDataContentBuf(ByteBuf wholeDatagramByte) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(CONTENT_FIELD_DS)) { + return (ByteBuf) singleObjects.get(CONTENT_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + ByteBuf bizDataByteBuf = fieldParser.getDataContentBuf(protocolFieldConfigs, wholeDatagramByte); + if (bizDataByteBuf != null) { + this.singleObjects.put(CONTENT_FIELD_DS, bizDataByteBuf); + return bizDataByteBuf; + } + return null; + } + + + private ProtocolFieldConfig selectFieldConfig(Long id) { + Optional optionalProtocolFieldConfig = this.protocolFieldConfigs.stream().filter( + e -> e.getId().equals(id) + ).findFirst(); + return optionalProtocolFieldConfig.isPresent() ? optionalProtocolFieldConfig.get() : null; + } + + + private Map getFixFieldConfigMap() { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, e -> e) + ); + return fixDataFieldMap; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(protocolFieldConfigs) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java new file mode 100644 index 0000000..dafba1c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java @@ -0,0 +1,56 @@ +package com.casic.missiles.parser.provider; + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.rule.GenericRuleResolver; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.RuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleConfigProvider { + + private final List ruleConfigs; + + public List getRuleConfigs() { + return ruleConfigs; + } + + public RuleConfigProvider(Long protocolId) { + RuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(RuleConfigRegistry.class); + ruleConfigs = ruleConfigRegistry.getRuleConfigById(protocolId); + } + + /** + * 获取规则匹配结果 + * + * @param parseFixedDataMap + * @param protocolFieldConfigs + * @return + */ + public RuleConfig doGetRule(Map parseFixedDataMap, + String ids, + List protocolFieldConfigs) { + if (showSkip()) { + return null; + } + RuleConfig ruleConfig = GenericRuleResolver.machRule(parseFixedDataMap, ids, protocolFieldConfigs, ruleConfigs); + return ruleConfig; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(ruleConfigs) ? false : true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java index 3c05891..856b399 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java @@ -1,18 +1,11 @@ package com.casic.missiles.parser.resolver; -import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.springframework.web.bind.annotation.RequestBody; -import javax.annotation.Resource; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -20,19 +13,17 @@ @Slf4j public class ByteMergeProvider { - @Resource - private FieldRuleEngineMapper fieldRuleEngineMapper; - //拿到所有的值合并到一个值 - public String resolveByteMerge(List valueList, String ruletypeId, String vaildRange) { + public static String resolveByteMerge(List valueList, String ruleTypeId, String vaildRange) { String values = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Map vaildMap = getValidRangeMap(vaildRange); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(ruletypeId); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } + //暂时不处理 +// fieldRuleEngine = fieldRuleConfigMapper.selectById(ruleTypeId); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } Map env2 = new HashMap(); for (int i = 0; i < valueList.size(); i++) { if (vaildMap.containsKey(i)) { @@ -47,7 +38,7 @@ } } - private Map getValidRangeMap(String vaildRange) { + private static Map getValidRangeMap(String vaildRange) { String[] range = vaildRange.split(","); Map vaildMap = new HashMap(); for (int i = 0; i < range.length; i++) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 8d821cd..85d6bbf 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -1,9 +1,12 @@ package com.casic.missiles.parser.resolver; +import com.casic.missiles.pojo.AbstractFieldConfig; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; import io.netty.buffer.ByteBuf; +import java.util.List; import java.util.Map; /** @@ -11,18 +14,14 @@ */ public interface FieldParser { -// Map fieldProcess(String protocolContent,); - Map dataParser(RuleConfig ruleConfig, String lightText,String protocolId); + Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength); - Map fixDataParser(String protocolId, ByteBuf buffer); + Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap); - Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf); + ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer); - ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer); - - ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer); - - Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer); + Integer getTotalFilterLength(ProtocolConfig protocolConfig, ByteBuf byteBuf, Map protocolFieldConfigMap); } + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java new file mode 100644 index 0000000..9e0c00e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java @@ -0,0 +1,52 @@ +package com.casic.missiles.parser.resolver; + +import com.casic.missiles.pojo.AbstractFieldConfig; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.util.List; + +public class FieldParserSupport { + + //分别计算bit和byte长度=> 合并长度 + protected Integer calculateLength(List fieldConfigList) { + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + Integer fixedLength = bytefixedLength + bitfixedLength / 8; + return fixedLength; + } + + //找到最大值=> 根据最大值计算业务数据下标 + protected Integer calculatePosition(List fieldConfigList) { + String rex = "[0-9]+"; + Integer max = -1; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) + && Integer.valueOf(fieldConfig.getOriginPositionByte()) > max) { + max = Integer.valueOf(fieldConfig.getOriginPositionByte()); + } + } + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) && fieldConfig.getOriginPositionByte().equals(max)) { + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + } + } + Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; + return maxFixedPosition; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java deleted file mode 100644 index dd3a6cd..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java +++ /dev/null @@ -1,170 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.ByteResolverParam; -import io.netty.buffer.ByteBuf; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -/** - * 字段解析管理总类 - */ -@Service -@Slf4j -@AllArgsConstructor -public class FieldResolver extends ByteMergeProvider { - - //1、字段截取 => 2、简单的字节解析和复杂的字节解析 - public Object filedParserManger(ByteBuf byteBuf, FieldConfig fieldConfig, Integer maxFixedPosition) { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - //最大固定位置不为空, - if (!ObjectUtil.isEmpty(maxFixedPosition)) { - orignPosition -= maxFixedPosition; - } - Object fieldValue = 0; - //待优化 - if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { - fieldValue = bitToResolver(byteBuf, fieldConfig); - } else { - ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); - fieldValue = parsingFields(fieldBytes, fieldConfig.getRuleJson()); - } - return fieldValue; - } - - //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, - //目前默认配置的规则设置暂不支持配置化,由实现完成 - private Object parsingFields(ByteBuf byteBuf, String ruleJson) { - Object fieldsResolveValue = null; - List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); - if (ObjectUtil.isEmpty(ruleMapList)) { - fieldsResolveValue = defaultResolveBuilder(byteBuf); - } else { - fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); - } - return fieldsResolveValue; - } - - private Object defaultResolveBuilder(ByteBuf byteBuf) { - Integer defaultResolveValue = 0; - for (int i = 0; i < byteBuf.writerIndex(); i++) { - defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; - } - return defaultResolveValue; - } - - //字段解析构建器(针对字节单位的) - //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 - // 字节归并结束或者规则结束=>继续根据规则进行判断 - private Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { - Object customizeResolveValue = null; - try { - List bytStrList = new ArrayList<>(); - //存放到数组里面 - for (int i = 0; i < byteBuf.writerIndex(); i++) { - bytStrList.add(byteBuf.readByte()); - } - int i = 0; - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - customizeResolveValue = this.resolveByteMerge(bytStrList, ruletypeId,vaildRange); - break; - } else { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - List tempBytStr = new ArrayList<>(); - for (int k = 0; i < bytStrList.size(); i++) { - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(k) - .value(bytStrList.get(k)) - .ruletypeId(ruletypeId).build(); - tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); - } - bytStrList = tempBytStr; - } - i++; - } - //字节归并到一起=>继续根据规则进行判断 - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(customizeResolveValue) - .ruletypeId(ruletypeId).build(); - customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(customizeResolveValue)); - return customizeResolveValue; - } catch (RuntimeException ex) { - log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); - return null; - } - } - - /** - * 1、单个字节情况表示字段 - * 2、多字节情况表示字段(暂未处理) - */ - private Object bitToResolver(ByteBuf byteBuf, FieldConfig fieldConfig) { - Object fieldValue = new Object(); - try { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - byte fields = 0x00; - if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); - } else { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); - } - - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { - if (!StringUtils.isEmpty(fieldConfig.getExactOrignPosition())) { - fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getExactOrignPosition())).byteValue() - >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); - } else { - fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); - } - } else { - fieldValue = Integer.valueOf(fields & 0xff); - } - if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { - return fieldValue; - } - List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); - int i = 0; - //字节归并到一起=>继续根据规则进行判断 - while (i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(fieldValue) - .ruletypeId(ruletypeId).build(); - fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(fieldValue)); - return fieldValue; - } catch (RuntimeException ex) { - log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); - return null; - } - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java new file mode 100644 index 0000000..1d2aeab --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java @@ -0,0 +1,36 @@ +package com.casic.missiles.parser.resolver.bytes; + +import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.mapper.FieldRuleConfigMapper; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.pojo.ByteResolverParam; +import com.googlecode.aviator.AviatorEvaluator; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; +//转换规则 +@Component("convert") +@AllArgsConstructor +@Slf4j +public class ByteRuleResolver implements ByteResolver { + + private final FieldRuleConfigMapper fieldRuleConfigMapper; + + @Override + public Object resolveOperationRule(ByteResolverParam byteResolverParam){ + FieldRuleConfig fieldRuleEngine=fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); + if(ObjectUtil.isEmpty(fieldRuleEngine)){ + return byteResolverParam.getValue(); + } + String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); + Map env2 = new HashMap(); + env2.put("value", (byte) byteResolverParam.getValue()); + String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); + return values; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java index 103821c..786b71c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java @@ -2,34 +2,34 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("logicalShift") +@Component("logicalShift") @AllArgsConstructor @Slf4j public class LogicalShiftResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //字节位移 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { Integer index = byteResolverParam.getIndex(); - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return byteResolverParam.getValue(); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java index 476747d..01149bd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("operation") +@Component("operation") @AllArgsConstructor @Slf4j public class OperationResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //混合运算,有常量或者乘除的缩放 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java index 0b82cf4..79abcce 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.casic.missiles.pojo.ByteResolverParam; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; //精度计算 -@Service("precision") +@Component("precision") @AllArgsConstructor @Slf4j public class PrecisionResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java deleted file mode 100644 index 5c3f332..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; -//转换规则 -@Service("convert") -@AllArgsConstructor -@Slf4j -public class RuleResolver implements ByteResolver { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam){ - RuleEvaluator fieldRuleEngine=fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); - if(ObjectUtil.isEmpty(fieldRuleEngine)){ - return byteResolverParam.getValue(); - } - String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); - Map env2 = new HashMap(); - env2.put("value", (byte) byteResolverParam.getValue()); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java new file mode 100644 index 0000000..d3bbd91 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java @@ -0,0 +1,15 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; + +import java.util.List; +import java.util.Map; +// 前导码匹配->长度字段 +public interface AbstractCombinedFieldProcessor { + + Map invoke(Map map, ByteBuf byteBuf, List combinedFieldConfigList, + Map fieldConfigsMap, Map storeObjectMap); + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java new file mode 100644 index 0000000..03c8480 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java @@ -0,0 +1,59 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-13 + */ +//依次递增进行数据的解析, +public class GenericCombinedFieldResolver { + + + //通过查询,字段长度长度随机 + public void parseDataField(List combinedFieldConfigList, ByteBuf byteBuf, + Map storeObjectMap, Map fieldConfigsMap) { + Integer frameLength = Integer.valueOf(ByteBufUtil.hexDump(byteBuf)); + //添加前置处理器 + com.casic.missiles.util.ClassUtil classUtil = new com.casic.missiles.util.ClassUtil(); + List abstractCombinedProcessors = classUtil.getSubClassList(AbstractCombinedFieldProcessor.class); + + Map fieldFixedMap = combinedFieldLeadCodeMap(combinedFieldConfigList); + //frameLength + Map combinedProcessorFields = null; + while (byteBuf.readableBytes() < frameLength) { + //一直处理 + for (AbstractCombinedFieldProcessor abstractCombinedProcessor : abstractCombinedProcessors) { + combinedProcessorFields = abstractCombinedProcessor.invoke(combinedProcessorFields, byteBuf, + combinedFieldConfigList, + fieldConfigsMap, storeObjectMap); + if (combinedProcessorFields == null || byteBuf.readableBytes() < frameLength) { + return; + } + } + + } + } + + /** + * 取出前导码匹配集合 + */ + private Map combinedFieldLeadCodeMap(List combinedFieldConfigList) { + Map fieldFixedMap = combinedFieldConfigList + .stream() + .collect(Collectors.toMap(CombinedFieldConfig::getPrefixCode, e -> e)); + return fieldFixedMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java new file mode 100644 index 0000000..643a934 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java @@ -0,0 +1,100 @@ +package com.casic.missiles.parser.resolver.fields; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.FieldParserSupport; +import com.casic.missiles.pojo.*; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 保存使用时最基本的信息,并且使用原型模式 + */ +@Slf4j +public class DefaultProtocolFieldParser extends FieldParserSupport implements FieldParser, FixedPropertyEnum { + + //通过传入的配置和报文进行字段解析 + @Override + public Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap) { + Map dataMap = new HashMap<>(); + for (AbstractFieldConfig protocolFieldConfig : protocolFieldConfigs) { + if (!ObjectUtils.isEmpty(protocolFieldConfig.getOriginPositionByte())) { + Object fieldValue = FieldResolver.parseField(buffer, protocolFieldConfig, null); + if (protocolFieldConfig.getIsStorage() == 1) { + storeObjectMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + dataMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + } + return dataMap; + } + + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength) { + Map fixedPropertyMap = new HashMap<>(); + Integer fixedLength = calculateLength(protocolFieldConfigs); + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + fixedPropertyMap.put(FIXED_POSITION, maxFixedPosition); + fixedPropertyMap.put(TOTAL_LENGTH, totalLength); + fixedPropertyMap.put(TAIL_POSITION, totalLength - fixedLength + maxFixedPosition); + return fixedPropertyMap; + } + + //** 获取业务内容的byteBuf + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer) { + //计算固定长度 + Integer fixedLength = calculateLength(protocolFieldConfigs); + //总长度获取 + String lightText = buffer.toString(Charset.forName("ISO-8859-1")); + Integer totalLength = lightText.length(); + //计算固定长度最大长度 + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + //计算数据报文内容 + ByteBuf bizDataFields = buffer.slice(maxFixedPosition - 1, (totalLength - fixedLength)); + return bizDataFields; + } + + /** + * 获取过滤字段的长度 + */ + @Override + public Integer getTotalFilterLength(ProtocolConfig protocolConfig, + ByteBuf byteBuf, + Map protocolFieldConfigMap) { + if (ByteBufUtil.hexDump(byteBuf).equals("")) { + return 0; + } + int totalFilterLength = 0; + String filterFields = protocolConfig.getTotalLengthFilterFields(); + try { + if (!StringUtils.isEmpty(filterFields)) { + String[] filterFieldList = filterFields.split(","); + for (String filterFieldId : filterFieldList) { + if (StringUtils.isNotEmpty(filterFieldId)) { + ProtocolFieldConfig fieldConfig = protocolFieldConfigMap.get(Long.valueOf(filterFieldId)); + //这里都是按字节计算,没有对位进行区分,可能会出现错误 + // 如果对位有需求,需要进一步跟进 + totalFilterLength += fieldConfig.getOffsetLength(); + } + } + } + return totalFilterLength; + } catch (Exception ex) { + log.error("报文确认分发阶段,获取报文总长度过滤长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); + } + return totalFilterLength; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java new file mode 100644 index 0000000..d51e887 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java @@ -0,0 +1,169 @@ +package com.casic.missiles.parser.resolver.fields; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.parser.resolver.ByteMergeProvider; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.AbstractFieldConfig; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.pojo.ByteResolverParam; +import io.netty.buffer.ByteBuf; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * 字段解析管理总类 + */ +@Slf4j +public class FieldResolver extends ByteMergeProvider { + + //1、字段截取 => 2、简单的字节解析和复杂的字节解析 + public static Object parseField(ByteBuf byteBuf,AbstractFieldConfig fieldConfig, Integer maxFixedPosition) { + Integer orignPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + //最大固定位置不为空, + if (!ObjectUtil.isEmpty(maxFixedPosition)) { + orignPosition -= maxFixedPosition; + } + Object fieldValue = 0; + //待优化 + if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { + fieldValue = doParseBitField(byteBuf, fieldConfig); + } else { + ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); + fieldValue = doParseByteField(fieldBytes, fieldConfig.getRuleJson()); + } + return fieldValue; + } + + //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, + //目前默认配置的规则设置暂不支持配置化,由实现完成 + private static Object doParseByteField(ByteBuf byteBuf, String ruleJson) { + Object fieldsResolveValue = null; + List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); + if (ObjectUtil.isEmpty(ruleMapList)) { + fieldsResolveValue = defaultResolveBuilder(byteBuf); + } else { + fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); + } + return fieldsResolveValue; + } + + private static Object defaultResolveBuilder(ByteBuf byteBuf) { + Integer defaultResolveValue = 0; + for (int i = 0; i < byteBuf.writerIndex(); i++) { + defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; + } + return defaultResolveValue; + } + + //字段解析构建器(针对字节单位的) + //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 + // 字节归并结束或者规则结束=>继续根据规则进行判断 + private static Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { + Object customizeResolveValue = null; + try { + List bytStrList = new ArrayList<>(); + //存放到数组里面 + for (int i = 0; i < byteBuf.writerIndex(); i++) { + bytStrList.add(byteBuf.readByte()); + } + int i = 0; + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { + if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + customizeResolveValue = resolveByteMerge(bytStrList, ruletypeId, vaildRange); + break; + } else { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + List tempBytStr = new ArrayList<>(); + for (int k = 0; i < bytStrList.size(); i++) { + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(k) + .value(bytStrList.get(k)) + .ruletypeId(ruletypeId).build(); + tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); + } + bytStrList = tempBytStr; + } + i++; + } + //字节归并到一起=>继续根据规则进行判断 + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(null) + .value(customizeResolveValue) + .ruletypeId(ruletypeId).build(); + customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); + i++; + } + System.out.println(JSON.toJSON(customizeResolveValue)); + return customizeResolveValue; + } catch (RuntimeException ex) { + log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); + return null; + } + } + + /** + * 1、单个字节情况表示字段 + * 2、多字节情况表示字段(暂未处理) + */ + private static Object doParseBitField(ByteBuf byteBuf,AbstractFieldConfig fieldConfig) { + Object fieldValue = new Object(); + try { + Integer orignPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + byte fields = 0x00; + if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { + fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); + } else { + fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); + } + + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { + if (!StringUtils.isEmpty(fieldConfig.getOriginPositionBit())) { + fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getOriginPositionBit())).byteValue() + >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); + } else { + fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); + } + } else { + fieldValue = Integer.valueOf(fields & 0xff); + } + if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { + return fieldValue; + } + List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); + int i = 0; + //字节归并到一起=>继续根据规则进行判断 + while (i < ruleMapList.size()) { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(null) + .value(fieldValue) + .ruletypeId(ruletypeId).build(); + fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); + i++; + } + System.out.println(JSON.toJSON(fieldValue)); + return fieldValue; + } catch (RuntimeException ex) { + log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); + return null; + } + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java deleted file mode 100644 index 35ae3d0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java +++ /dev/null @@ -1,183 +0,0 @@ -package com.casic.missiles.parser.resolver.fields; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufAllocator; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; -import org.springframework.util.ObjectUtils; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service("standard") -@AllArgsConstructor -@Slf4j -public class StandardFieldParser implements FieldParser { - - private final FieldConfigDao fieldConfigDao; - private final FieldResolver fieldResolver; - - //数据解析 - @Override - public Map dataParser(RuleConfig ruleConfig, String lightText, String protocolId) { - String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); - ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); - bufferContent.writeBytes(lightText.getBytes(Charset.forName("ISO-8859-1"))); - Map dataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - for (String dataFieldId : dataFieldIds) { - FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(dataFieldId); - if (!ObjectUtils.isEmpty(fieldConfig)) { - dataMap.put(fieldConfig.getFieldName(), String.valueOf(fieldResolver.filedParserManger(bufferContent, fieldConfig, maxFixedPosition))); - } - } - return dataMap; - } - - //数据解析 - @Override - public Map fixDataParser(String protocolId, ByteBuf buffer) { - List dataFieldIdList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Map dataMap = new HashMap<>(); - for (FieldConfig dataField : dataFieldIdList) { - if (!ObjectUtils.isEmpty(dataField.getOrignPosition())) { - Object fieldValue = (Integer) fieldResolver.filedParserManger(buffer, dataField, null); - dataMap.put(dataField.getFieldName(), fieldValue); - } - } - return dataMap; - } - - @Override - public Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf) { - if (ByteBufUtil.hexDump(byteBuf).equals("")) { - return 0; - } - String filterFields = protocolConfig.getTotalLengthFilterField(); - Integer totalLength = 0; - try { - FieldConfig totalFieldConfig = fieldConfigDao.getFieldConfigById(protocolConfig.getTotalLengthId()); - int totalFilterLength = 0; - if (!StringUtils.isEmpty(filterFields)) { - String[] filterFieldList = filterFields.split(","); - for (String filterField : filterFieldList) { - FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(filterField); - //这里都是按字节计算,没有对位进行区分,可能会出现错误 - - // 如果对位有需求,需要进一步跟进 - totalFilterLength += fieldConfig.getOffsetLength(); - } - } - totalLength = (Integer) fieldResolver.filedParserManger(byteBuf, totalFieldConfig, null) + totalFilterLength; - } catch (Exception ex) { - log.error("报文确认分发阶段,获取报文总长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); - } - return totalLength; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer) { - //业务内容 - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - String protocolId = String.valueOf(protocolConfig.getId()); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - //计算固定长度 - Integer fixedLength = calculateLength(fieldConfigList); -// Integer totalLength = this.getTotalLength(protocolConfig, buffer); - //总长度获取 - Integer totalLength = lightText.length(); - //计算固定长度最大长度 - Integer maxFixedPosition = calculatePosition(fieldConfigList); -// buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - //计算数据报文内容 - ByteBuf bizDataFields = buffer.slice(maxFixedPosition-1, (totalLength - fixedLength)); - return bizDataFields; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer) { - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - String protocolId = String.valueOf(protocolConfig.getId()); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer fixedLength = calculateLength(fieldConfigList); -// Integer totalLength = this.getTotalLength(protocolConfig, buffer); - Integer totalLength = lightText.length(); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - ByteBuf fixDataFields = buffer.slice(0, maxFixedPosition); - return fixDataFields; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer) { - String protocolId = String.valueOf(protocolConfig.getId()); - Map fixedPropertyMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer fixedLength = calculateLength(fieldConfigList); - Integer totalLength = this.getTotalLength(protocolConfig, buffer); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - fixedPropertyMap.put("fixedPosition", maxFixedPosition); - fixedPropertyMap.put("totalLength", totalLength); - fixedPropertyMap.put("tailPosition", totalLength - fixedLength + maxFixedPosition); - return fixedPropertyMap; - } - - //分别计算bit和byte长度=> 合并长度 - private Integer calculateLength(List fieldConfigList) { - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (FieldConfig fieldConfig : fieldConfigList) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - Integer fixedLength = bytefixedLength + bitfixedLength / 8; - return fixedLength; - } - - //找到最大值=> 根据最大值计算业务数据下标 - private Integer calculatePosition(List fieldConfigList) { - String rex = "[0-9]+"; - Integer max = -1; - for (FieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOrignPosition()) - && Integer.valueOf(fieldConfig.getOrignPosition()) > max) { - max = Integer.valueOf(fieldConfig.getOrignPosition()); - } - } - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (FieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOrignPosition()) && fieldConfig.getOrignPosition().equals(max)) { - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - } - } - Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; - return maxFixedPosition; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java new file mode 100644 index 0000000..d4ec6c7 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java @@ -0,0 +1,76 @@ +package com.casic.missiles.parser.rule; + +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import org.apache.commons.lang3.StringUtils; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class GenericRuleResolver { + + //根据前置字段的值,找到指定的规则 + //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 + //=>循环判断=>通过规则得到业务字段 + public static RuleConfig machRule(Map fixDataMap, + String ids, + List protocolFieldConfigs, + List ruleConfigs) { + List preRuleConfigList = getPreRuleList(ids, protocolFieldConfigs); + //获取前置规则字段 + final Map metaDataMap = getPreRuleFields(preRuleConfigList, fixDataMap); + //准备固定的字段集合 + Map fixDataFieldMap = getFixDataFieldMap(protocolFieldConfigs); + return RuleResolverCore.doMachRule(ruleConfigs, metaDataMap, fixDataMap, fixDataFieldMap); + } + + private static Map getFixDataFieldMap(List protocolFieldConfigs) { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, ProtocolFieldConfig::getFieldName) + ); + return fixDataFieldMap; + } + + + /** + * 查询前置规则的字段配置 + * + * @param ids + * @return + */ + private static List getPreRuleList(String ids, List protocolFieldConfigs) { + String[] idList = ids.split(","); + Map prepareMaps = new HashMap<>(); + for (String id : idList) { + if (StringUtils.isNotEmpty(id)) { + prepareMaps.put(Long.valueOf(id), ""); + } + } + List preRuleConfigList = protocolFieldConfigs + .stream() + .filter(e -> prepareMaps.containsKey(e.getId())) + .collect(Collectors.toList()); + return preRuleConfigList; + } + + /** + * 获取前置规则解析字段 + */ + private static Map getPreRuleFields(List preRuleFieldConfigList, Map fixDataMap) { + Map ruleFieldMap = new HashMap<>(); + preRuleFieldConfigList.stream() + .forEach( + preRuleFieldConfig -> { + String fieldName = preRuleFieldConfig.getFieldName(); + if (fixDataMap.containsKey(fieldName)) { + ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); + } + } + ); + return ruleFieldMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java new file mode 100644 index 0000000..baae7e8 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -0,0 +1,68 @@ +package com.casic.missiles.parser.rule; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.casic.missiles.pojo.RuleConfig; + +import java.util.*; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleResolverCore { + + + public static RuleConfig doMachRule(List ruleConfigList, Map metaDataMap, + Map fixDataMap, + Map fixDataFieldMap) { + Optional ruleConfigOptional = ruleConfigList.stream() + .filter(ruleConfig -> machRuleConfig( + JSON.parseObject(ruleConfig.getMatchRuleJson(), Map.class), metaDataMap)) + .findFirst(); + if (ObjectUtil.isEmpty(ruleConfigOptional)) { + return null; + } + String[] ruleFields = ruleConfigOptional.get().getDataFieldIds().split(","); + Map ruleMetaDataMap = getRuleFields(ruleFields, fixDataMap, fixDataFieldMap); + //递归选定解析规则,进行规则解析 + if (!ruleConfigOptional.get().getIsFinishMatch().equals("1")) { + //递归选定规则 + doMachRule(ruleConfigList, ruleMetaDataMap, fixDataMap, fixDataFieldMap); + } + return ruleConfigOptional.get(); + } + + + private static Map getRuleFields(String[] preRuleConfigList, Map fixedDataMap, + Map fixedFieldMap) { + Map ruleFieldMap = new HashMap<>(); + for (String preRuleConfigId : preRuleConfigList) { + String fieldName = fixedFieldMap.get(preRuleConfigId); + if (fixedDataMap.containsKey(fieldName)) { + ruleFieldMap.put(fieldName, String.valueOf(fixedDataMap.get(fieldName))); + } + } + return ruleFieldMap; + } + + + //匹配规则配置 + private static Boolean machRuleConfig(Map ruleMap, Map metaDataMap) { + if (ruleMap == null || metaDataMap == null) { + return null; + } + //所有的字段在规则里面必须有有配置 + for (String key : metaDataMap.keySet()) { + if (ruleMap.containsKey(key)) { + if (!ruleMap.get(key).equals(metaDataMap.get(key))) { + return false; + } + } else { + return false; + } + } + return true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java deleted file mode 100644 index 664088d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java +++ /dev/null @@ -1,92 +0,0 @@ -package com.casic.missiles.parser.rule; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.mapper.dao.PreRuleConfigDao; -import com.casic.missiles.mapper.dao.RuleConfigDao; -import lombok.AllArgsConstructor; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.*; -import java.util.stream.Collectors; - -@Service -@AllArgsConstructor -public class RulerProvider { - - private final FieldConfigDao fieldConfigDao; - private final PreRuleConfigDao preRuleConfigDao; - private final RuleConfigDao ruleConfigDao; - - //根据前置字段的值,找到指定的规则 - //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 - //=>循环判断=>通过规则得到业务字段 - public RuleConfig ruleConfig(Map fixDataMap, String protocolId) { - //批量获取规则 - List preRuleConfigList = preRuleConfigDao.getPreRuleList(protocolId); - //获取固定字段 - Map fixFieldMap = getAllFieldMap(protocolId); - //获取前置规则字段 - final String preRuleFields = getPreRuleFields(preRuleConfigList, fixDataMap, fixFieldMap); - List ruleConfigList = ruleConfigDao.getRuleConfigById(protocolId); - Optional ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig ->preRuleFields.equals( ruleConfig.getParseRuleJson())).findFirst(); - //递归选定解析规则,进行规则解析 - while (!ObjectUtil.isEmpty(ruleConfigOptional) && !ruleConfigOptional.get().getIsBizField().equals("1")) { - String ruleFields = getRuleFields(ruleConfigOptional.get().getDataFieldIds().split(","), fixDataMap, fixFieldMap); - ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig -> ruleConfig.getParseRuleJson().equals(ruleFields)).findFirst(); - } - return ruleConfigOptional.get(); - } - - /** - * 获取前置规则解析字段 - */ - private String getPreRuleFields(List preRuleConfigList, Map fixDataMap, Map fixFieldMap) { - Map ruleFieldMap= new HashMap<>(); - preRuleConfigList.stream() - .forEach( - preRuleConfig -> { - String fieldName = fixFieldMap.get(Long.valueOf(preRuleConfig.getRuleFieldId())); - if (fixDataMap.containsKey(fieldName)) { - ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); - } - } - ); - return JSONObject.toJSONString(ruleFieldMap); - } - - private Map getAllFieldMap(String protocolId) { - List fieldList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Map fixFieldMap = fieldList.stream().collect( - Collectors.toMap(FieldConfig::getId, FieldConfig::getFieldName) - ); - return fixFieldMap; - } - - private String getRuleFields(String[] preRuleConfigList, Map fixDataMap, Map fixFieldMap) { - Map ruleFieldMap= new HashMap<>(); - for (String preRuleConfigId : preRuleConfigList) { - String fieldName = fixFieldMap.get(preRuleConfigId); - if (fixDataMap.containsKey(fieldName)) { - ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); - } - } - return JSONObject.toJSONString(ruleFieldMap); - } - - //弃置 - private String ListToString(List ruleFieldList) { - String ruleFields = ""; - for (String ruleField : ruleFieldList) { - ruleFields += ruleField + ","; - } - ruleFields = StringUtils.isEmpty(ruleFields) ? ruleFields : ruleFields.substring(0, ruleFields.length() - 1); - return ruleFields; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java index 6177e10..bfa87a5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java @@ -2,7 +2,7 @@ public interface SafeStrategy { - String decryption(byte[] bytes); + String decryption(String cipher); String encryption(String lightText); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java index 618716c..6236302 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java @@ -9,9 +9,9 @@ //十六进制的字符串转换成字节数组 byte[] bytes = hexStrToBinaryStr(msg); //计算CRC8 - byte crc8 = CRC8(bytes, 0, bytes.length); - String crc8ToStr = "" + Integer.toHexString(0xff & crc8); - return crc8ToStr; +// String crc8ToStr = "" + Integer.toHexString(0xff & crc8); +// return crc8ToStr; + return null; } /** @@ -33,50 +33,5 @@ return bytes; } - /** - * CRC8 校验 多项式 x8+x2+x+1 - * - * @param b - * @param off - * @param len - * @return - */ - public static byte CRC8(final byte[] b, final int off, final int len) { - byte result = 0x00; - for (int i = 0; i < len; i++) { - result = CHECKSUM_TABLE[(result ^ (b[i + off] & 0xFF)) & 0xFF]; - } - return (byte) (result & 0xFFL); - } - - private final static byte[] CHECKSUM_TABLE = {(byte) 0x00, (byte) 0x07, (byte) 0x0e, (byte) 0x09, (byte) 0x1c, (byte) 0x1b, - (byte) 0x12, (byte) 0x15, (byte) 0x38, (byte) 0x3f, (byte) 0x36, (byte) 0x31, (byte) 0x24, (byte) 0x23, (byte) 0x2a, - (byte) 0x2d, (byte) 0x70, (byte) 0x77, (byte) 0x7e, (byte) 0x79, (byte) 0x6c, (byte) 0x6b, (byte) 0x62, (byte) 0x65, - (byte) 0x48, (byte) 0x4f, (byte) 0x46, (byte) 0x41, (byte) 0x54, (byte) 0x53, (byte) 0x5a, (byte) 0x5d, (byte) 0xe0, - (byte) 0xe7, (byte) 0xee, (byte) 0xe9, (byte) 0xfc, (byte) 0xfb, (byte) 0xf2, (byte) 0xf5, (byte) 0xd8, (byte) 0xdf, - (byte) 0xd6, (byte) 0xd1, (byte) 0xc4, (byte) 0xc3, (byte) 0xca, (byte) 0xcd, (byte) 0x90, (byte) 0x97, (byte) 0x9e, - (byte) 0x99, (byte) 0x8c, (byte) 0x8b, (byte) 0x82, (byte) 0x85, (byte) 0xa8, (byte) 0xaf, (byte) 0xa6, (byte) 0xa1, - (byte) 0xb4, (byte) 0xb3, (byte) 0xba, (byte) 0xbd, (byte) 0xc7, (byte) 0xc0, (byte) 0xc9, (byte) 0xce, (byte) 0xdb, - (byte) 0xdc, (byte) 0xd5, (byte) 0xd2, (byte) 0xff, (byte) 0xf8, (byte) 0xf1, (byte) 0xf6, (byte) 0xe3, (byte) 0xe4, - (byte) 0xed, (byte) 0xea, (byte) 0xb7, (byte) 0xb0, (byte) 0xb9, (byte) 0xbe, (byte) 0xab, (byte) 0xac, (byte) 0xa5, - (byte) 0xa2, (byte) 0x8f, (byte) 0x88, (byte) 0x81, (byte) 0x86, (byte) 0x93, (byte) 0x94, (byte) 0x9d, (byte) 0x9a, - (byte) 0x27, (byte) 0x20, (byte) 0x29, (byte) 0x2e, (byte) 0x3b, (byte) 0x3c, (byte) 0x35, (byte) 0x32, (byte) 0x1f, - (byte) 0x18, (byte) 0x11, (byte) 0x16, (byte) 0x03, (byte) 0x04, (byte) 0x0d, (byte) 0x0a, (byte) 0x57, (byte) 0x50, - (byte) 0x59, (byte) 0x5e, (byte) 0x4b, (byte) 0x4c, (byte) 0x45, (byte) 0x42, (byte) 0x6f, (byte) 0x68, (byte) 0x61, - (byte) 0x66, (byte) 0x73, (byte) 0x74, (byte) 0x7d, (byte) 0x7a, (byte) 0x89, (byte) 0x8e, (byte) 0x87, (byte) 0x80, - (byte) 0x95, (byte) 0x92, (byte) 0x9b, (byte) 0x9c, (byte) 0xb1, (byte) 0xb6, (byte) 0xbf, (byte) 0xb8, (byte) 0xad, - (byte) 0xaa, (byte) 0xa3, (byte) 0xa4, (byte) 0xf9, (byte) 0xfe, (byte) 0xf7, (byte) 0xf0, (byte) 0xe5, (byte) 0xe2, - (byte) 0xeb, (byte) 0xec, (byte) 0xc1, (byte) 0xc6, (byte) 0xcf, (byte) 0xc8, (byte) 0xdd, (byte) 0xda, (byte) 0xd3, - (byte) 0xd4, (byte) 0x69, (byte) 0x6e, (byte) 0x67, (byte) 0x60, (byte) 0x75, (byte) 0x72, (byte) 0x7b, (byte) 0x7c, - (byte) 0x51, (byte) 0x56, (byte) 0x5f, (byte) 0x58, (byte) 0x4d, (byte) 0x4a, (byte) 0x43, (byte) 0x44, (byte) 0x19, - (byte) 0x1e, (byte) 0x17, (byte) 0x10, (byte) 0x05, (byte) 0x02, (byte) 0x0b, (byte) 0x0c, (byte) 0x21, (byte) 0x26, - (byte) 0x2f, (byte) 0x28, (byte) 0x3d, (byte) 0x3a, (byte) 0x33, (byte) 0x34, (byte) 0x4e, (byte) 0x49, (byte) 0x40, - (byte) 0x47, (byte) 0x52, (byte) 0x55, (byte) 0x5c, (byte) 0x5b, (byte) 0x76, (byte) 0x71, (byte) 0x78, (byte) 0x7f, - (byte) 0x6a, (byte) 0x6d, (byte) 0x64, (byte) 0x63, (byte) 0x3e, (byte) 0x39, (byte) 0x30, (byte) 0x37, (byte) 0x22, - (byte) 0x25, (byte) 0x2c, (byte) 0x2b, (byte) 0x06, (byte) 0x01, (byte) 0x08, (byte) 0x0f, (byte) 0x1a, (byte) 0x1d, - (byte) 0x14, (byte) 0x13, (byte) 0xae, (byte) 0xa9, (byte) 0xa0, (byte) 0xa7, (byte) 0xb2, (byte) 0xb5, (byte) 0xbc, - (byte) 0xbb, (byte) 0x96, (byte) 0x91, (byte) 0x98, (byte) 0x9f, (byte) 0x8a, (byte) 0x8d, (byte) 0x84, (byte) 0x83, - (byte) 0xde, (byte) 0xd9, (byte) 0xd0, (byte) 0xd7, (byte) 0xc2, (byte) 0xc5, (byte) 0xcc, (byte) 0xcb, (byte) 0xe6, - (byte) 0xe1, (byte) 0xe8, (byte) 0xef, (byte) 0xfa, (byte) 0xfd, (byte) 0xf4, (byte) 0xf3}; } \ No newline at end of file diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java index 27c2838..6e078a3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java @@ -1,9 +1,6 @@ package com.casic.missiles.parser.safe.impl; -import cn.hutool.core.util.CharsetUtil; -import cn.hutool.crypto.symmetric.SM4; -import cn.hutool.crypto.symmetric.SymmetricCrypto; - +import com.casic.missiles.parser.safe.SafeStrategy; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; @@ -11,19 +8,44 @@ import org.bouncycastle.crypto.engines.SM4Engine; import org.bouncycastle.crypto.params.KeyParameter; import org.bouncycastle.util.encoders.Hex; - -import static cn.hutool.crypto.Mode.ECB; -import static cn.hutool.crypto.Padding.NoPadding; +import org.springframework.stereotype.Component; /** * SM4算法工具类 */ @Slf4j -public class Sm4 { +@Component("sm4") +public class Sm4 implements SafeStrategy { //加解密的字节快大小 public static final int BlockSize = 16; + @Override + public String decryption(String cipher) { + byte[] keyByte = { + 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 + }; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(keyByte); + byte[] in = Hex.decode(cipher); + byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); + String plain = EcbDecrypt(in, keyBytes); + return plain; + } + + @Override + public String encryption(String cipher) { + byte[] keyByte = { + 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 + }; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(keyByte); + byte[] in = Hex.decode(cipher); + byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); + String plain = EcbDecrypt(in, keyBytes); + return plain; + } + /** * SM4ECB加密算法,对内 * @@ -32,8 +54,6 @@ * @return */ private static byte[] ecb_encrypt(byte[] in, byte[] keyBytes) { - - SM4Engine sm4Engine = new SM4Engine(); sm4Engine.init(true, new KeyParameter(keyBytes)); byte[] out = new byte[in.length]; @@ -58,27 +78,6 @@ return cipher; } - - /** - * hutool 解密SM4 - * - * @param encodeContent - * @return - */ - public static String decode(String encodeContent) { - String key = "24ad182507479a5da3ad94d9d78ea203"; - try { - SymmetricCrypto sm4 = new SM4(ECB, NoPadding, key.getBytes()); - String decryptStr = sm4.decryptStr(encodeContent, CharsetUtil.CHARSET_UTF_8); - return decryptStr; - } catch (Exception e) { - e.printStackTrace(); - log.error("SM4解密失败"); - } - return null; - } - - /** * SM4的ECB加密算法 * @@ -129,20 +128,6 @@ return plain; } - /** - * SM4的ECB解密算法 - * - * @param cipher 输入的密文字符串 - * @param key 密钥 - * @return - */ - public static String EcbDecrypt(String cipher, String key) { - byte[] in = Hex.decode(cipher); - byte[] keyBytes = Hex.decode(key); - - String plain = EcbDecrypt(in, keyBytes); - return plain; - } /** * 主函数 @@ -151,28 +136,24 @@ */ public static void main(String[] args) { byte[] ciphertext = { + 0x4B, (byte) 0x8C, (byte) 0x9D, 0x08, (byte) 0xE4, (byte) 0xD3, 0x64, 0x42, (byte) 0xB9, (byte) 0xA5, (byte) 0xFE, (byte) 0xCD, (byte) 0x91, 0x1B, 0x38, (byte) 0xAC, (byte) 0xE9, 0x1C, (byte) 0xCD, 0x53, 0x02, (byte) 0xD7, 0x0C, (byte) 0x9B, (byte) 0x96, 0x30, 0x62, (byte) 0xE8, (byte) 0xFB, (byte) 0xEF, (byte) 0xB9, (byte) 0xFF, (byte) 0xDE, 0x19, (byte) 0x80, 0x35, 0x3E, (byte) 0x90, 0x4F, 0x2F, 0x12, 0x2B, 0x19, (byte) 0x8B, 0x6C, 0x7A, (byte) 0x85, (byte) 0xA1, (byte) 0xB1, (byte) 0x86, (byte) 0xA3, 0x7A, 0x46, 0x0C, 0x2F, (byte) 0x94, 0x4F, 0x7F, 0x2C, 0x56, 0x14, (byte) 0xF3, (byte) 0x89, (byte) 0xC3, - 0x3F, 0x20, (byte) 0xF9, (byte) 0x87, (byte) 0xA1, 0x60, (byte) 0xD9, (byte) 0xA8, (byte) 0xFD, (byte) 0xD7, (byte) 0x9B, 0x4B, 0x26, 0x06, 0x30, 0x44}; + 0x3F, 0x20, (byte) 0xF9, (byte) 0x87, (byte) 0xA1, 0x60, (byte) 0xD9, (byte) 0xA8, (byte) 0xFD, (byte) 0xD7, (byte) 0x9B, 0x4B, 0x26, 0x06, 0x30, 0x44 + }; ByteBuf in = ByteBufAllocator.DEFAULT.heapBuffer(); in.writeBytes(ciphertext); - byte[] keyByte = { 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 }; ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); - key.writeBytes(ciphertext); - String resCipherData = decode(ByteBufUtil.hexDump(in)); - ByteBuf out = ByteBufAllocator.DEFAULT.heapBuffer(); -// out.writeBytes(resCipherData); -// System.out.println(hexBytes); - System.out.println(resCipherData.toString()); -// String resPlainData = EcbDecrypt(resCipherData, key); -// System.out.println("原始明文:" + data); -// System.out.println("解密后明文:" + resPlainData); + key.writeBytes(keyByte); +// String resCipherData = EcbDecrypt(ByteBufUtil.hexDump(in), ByteBufUtil.hexDump(key)); +// System.out.println(resCipherData); } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java index 1395a51..ac5f957 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java @@ -1,7 +1,7 @@ package com.casic.missiles.parser.safe.impl; import io.netty.buffer.ByteBufUtil; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** *

@@ -14,9 +14,8 @@ * @author hyl * @version v1.0: Tea.java, v 0.1 2021/3/12 13:48 $ */ -@Service("tea") -///tea算法类 - +//tea算法类 +@Component("tea") public class Tea { public static byte[] MyTea_Encrypt(byte[] MyTeaContent, int ByteLen, byte[] MyTeakey) { @@ -99,7 +98,6 @@ // for(int i32Index = 0; i32Index < 8; i32Index++) { // System.out.print("0x" + Integer.toHexString(MyContent[i32Index]) + " "); // } - // System.out.println("密钥为:"); // for(int i32Index = 0; i32Index < 16; i32Index++) { // System.out.print("0x" + Integer.toHexString(MyKeys[i32Index]) + " "); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java index bdd0721..bd1516a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java @@ -3,7 +3,7 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.parser.sender.DataSubscribeProvider; import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponents; import org.springframework.web.util.UriComponentsBuilder; @@ -12,7 +12,7 @@ import java.util.Collections; import java.util.Map; -@Service("functionCallback") +@Component("functionCallback") public class FunctionCallback implements DataSubscribeProvider { @Resource diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java index 0b44fb9..7526de2 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.Map; -@Service("middleware") +@Component("middleware") public class MiddlewareSubscribe implements DataSubscribeProvider { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java index 5dcee3f..e2f1192 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.Map; -@Service("nosql") +@Component("nosql") public class NoSqlSubscribe implements DataSubscribeProvider { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java b/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java new file mode 100644 index 0000000..81a5324 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java @@ -0,0 +1,86 @@ +package com.casic.missiles.pojo; + +import lombok.Data; + +/** + * 协议 + */ +@Data +public class Msg { + + /** + * 前导码 + */ + private String preamble; + + /** + * 版本号 + */ + private String version; + + /** + * 内容长度 + */ + private int leng; + + /** + * 设备ID + */ + private String deviceId; + + /** + * 通讯方式 + */ + private Integer connType; + + /** + * 加密方式 + */ + private Integer encryType; + + /** + * 目标地址 + */ + private String destAddr; + + /** + * PDUType + */ + private String PDUType; + + /** + * 操作类型 + */ + private Integer operateType; + + /** + * 传输控制位 PDUType.bit7=0时,表示存在后续的访问;当PDUType.bit7=1时,表示无后续的访问。 + */ + private Integer transControlFlag; + + /** + * 设备类型 + */ + private Integer deviceType; + + /** + * 序号 + */ + private Integer seq; + + /** + * tagList + */ + private String tagList; + + /** + * OidList + */ + private String OidList; + + /** + * CRC + */ + private String CRC; + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java index 40a5265..97cc984 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java @@ -40,7 +40,7 @@ String httpContent = msg.toString(Charset.defaultCharset()); log.info(" String : " + msg.toString(Charset.defaultCharset())); String majorContent = httpContent.substring(httpContent.indexOf("{"), httpContent.lastIndexOf("}") + 1); - String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("serviceData")).get("Value")); + String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("RegistryData")).get("Value")); log.info("----------------------------------" + values); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); bufferContent.writeBytes(values.getBytes(Charset.forName("ISO-8859-1"))); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java index 1b132a7..e3ced4b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java @@ -35,7 +35,7 @@ String httpContent = msg.toString(Charset.defaultCharset()); log.info(" String : " + msg.toString(Charset.defaultCharset())); String majorContent = httpContent.substring(httpContent.indexOf("{"), httpContent.lastIndexOf("}") + 1); - String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("serviceData")).get("Value")); + String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("RegistryData")).get("Value")); log.info("----------------------------------" + values); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); bufferContent.writeBytes(values.getBytes(Charset.forName("ISO-8859-1"))); diff --git a/sensorhub-core/src/main/resources/application.properties b/sensorhub-core/src/main/resources/application.properties deleted file mode 100644 index 8b13789..0000000 --- a/sensorhub-core/src/main/resources/application.properties +++ /dev/null @@ -1 +0,0 @@ - diff --git a/sensorhub-core/src/main/resources/config/application-dev.yml b/sensorhub-core/src/main/resources/config/application-dev.yml index 4f897a8..dcc4c2d 100644 --- a/sensorhub-core/src/main/resources/config/application-dev.yml +++ b/sensorhub-core/src/main/resources/config/application-dev.yml @@ -4,9 +4,9 @@ spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true + url: jdbc:mysql://127.0.0.1:3306/sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true username: root - password: Casic203 + password: root session: store-type: redis redis: diff --git a/sensorhub-core/src/main/resources/config/application.yml b/sensorhub-core/src/main/resources/config/application.yml index ae89f9d..7965da1 100644 --- a/sensorhub-core/src/main/resources/config/application.yml +++ b/sensorhub-core/src/main/resources/config/application.yml @@ -30,6 +30,13 @@ port: 6379 password: ew5T4K3#203lwh config-prefix: 'Casic:' +#代码生成器配置 +code: + generate: + #作者 + author: cz + #待生成对象表名 + table-name: bussiness_field_config,combined_field_config sensorhub: config: port: 7091 diff --git a/sensorhub-support/pom.xml b/sensorhub-support/pom.xml index 9a71296..761601c 100644 --- a/sensorhub-support/pom.xml +++ b/sensorhub-support/pom.xml @@ -42,6 +42,12 @@ ${redis.version} + + com.baomidou + mybatis-plus-generator + ${mybatis-plus-generator.version} + + org.reflections diff --git a/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java b/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java new file mode 100644 index 0000000..515ca53 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java @@ -0,0 +1,14 @@ +package com.casic.missiles.enums; + +/** + * @author + * @date + */ +public interface FixedPropertyEnum { + + String FIXED_POSITION = "fixedPosition"; + + String TOTAL_LENGTH = "totalLength"; + + String TAIL_POSITION = "tailPosition"; +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/CombinedFieldMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CombinedFieldMapper.java new file mode 100644 index 0000000..38e8f42 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CombinedFieldMapper.java @@ -0,0 +1,15 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.CombinedFieldConfig; +import org.apache.ibatis.annotations.Mapper; + +/** + * @author cz + * + */ +@Mapper +public interface CombinedFieldMapper extends BaseMapper { + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java new file mode 100644 index 0000000..128b09d --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java @@ -0,0 +1,10 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.CommandEventConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface CommandEventMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java new file mode 100644 index 0000000..042eb3c --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.DatagramEventConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface DatagramEventConfigMapper extends BaseMapper { +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java new file mode 100644 index 0000000..fc95cf4 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java @@ -0,0 +1,8 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.FieldConfig; + +public interface FieldConfigMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldRuleConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldRuleConfigMapper.java new file mode 100644 index 0000000..b310a08 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldRuleConfigMapper.java @@ -0,0 +1,10 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.FieldRuleConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface FieldRuleConfigMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java new file mode 100644 index 0000000..9060a69 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.ProtocolConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface ProtocolConfigMapper extends BaseMapper { +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolFieldConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolFieldConfigMapper.java new file mode 100644 index 0000000..1b47180 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolFieldConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +public interface ProtocolFieldConfigMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java new file mode 100644 index 0000000..6fa6936 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.RuleConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface RuleConfigMapper extends BaseMapper { +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/AbstractFieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/AbstractFieldConfig.java new file mode 100644 index 0000000..ba9aea2 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/AbstractFieldConfig.java @@ -0,0 +1,38 @@ +package com.casic.missiles.pojo; + +import lombok.Data; + +@Data +public class AbstractFieldConfig { + /** + * 字段名称 + */ + private String fieldName; + /** + * 按照字段评估进行字段解析 + */ + private String ruleJson; + /** + * 起始位置(单位byte) + */ + private Integer OriginPositionByte; + /** + * 起始位置,是否需要bit位置(单位bit)小于8, 没有不需要填写 + */ + private String OriginPositionBit; + /** + * 偏移长度 + */ + private Integer offsetLength; + /** + * 偏移单位(bit/byte) + */ + private String offsetUnit; + /** + * 是否需要转存 + */ + private Integer isStorage; + + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/CombinedFieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/CombinedFieldConfig.java new file mode 100644 index 0000000..4f4de6a --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/CombinedFieldConfig.java @@ -0,0 +1,41 @@ +package com.casic.missiles.pojo; + +import lombok.Data; + +import java.util.Date; + +/** + * 组合配置 + * + * @author cz + * @date 20 + */ +@Data +public class CombinedFieldConfig { + + private Long id; + private Long ruleId; + /** + * 前缀编码 + */ + private String prefixCode; + + /** + * 字段动态的id + */ + private Long dynamicLengthId; + /** + * 对应的要解析字段的ids + */ + private String dataFieldIds; + + /** + * 字段动态的id + */ + private String combinedFieldIds; + + private Date lastTime; + + private Date createTime; + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldConfig.java index a07d20d..8304dc6 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldConfig.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldConfig.java @@ -5,31 +5,28 @@ import java.util.Date; +/** + * @author cz + * 1、该表与实际解析的内容实例解析有关 + * 2、该表字段是随机出现的,和帧结构无关,无法预料的 + * 3、该表字段解析根据FieldEvaluatorConfig进行字段解析 + */ @Data -@TableName("field_config") -public class FieldConfig { +@TableName("business_field_config") +public class FieldConfig extends AbstractFieldConfig { private Long id; -// private String preFieldConfig; - private Long protocolId; - - private String isFixed; - private String uploadDeliveryChange; - - private String replyRule; - private String ruleJson; - + /** + * 协议配置id + */ + private Long ruleId; + /** + * 字段名称 + */ private String fieldName; - private String isStorage; - private Integer orignPosition; - private String exactOrignPosition; - - private Integer offsetLength; - private String offsetUnit; private String ownerId; private Date createTime; private Date lastTime; - } diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldRuleConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldRuleConfig.java new file mode 100644 index 0000000..2e09879 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldRuleConfig.java @@ -0,0 +1,20 @@ +package com.casic.missiles.pojo; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +@TableName("field_rule_config") +@Data +public class FieldRuleConfig { + + private Long id; + private String name; + private String desc; + private String condition; + private String excuteOperation; + private Date lasTime; + private Date createTime; + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/Msg.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/Msg.java deleted file mode 100644 index 81a5324..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/Msg.java +++ /dev/null @@ -1,86 +0,0 @@ -package com.casic.missiles.pojo; - -import lombok.Data; - -/** - * 协议 - */ -@Data -public class Msg { - - /** - * 前导码 - */ - private String preamble; - - /** - * 版本号 - */ - private String version; - - /** - * 内容长度 - */ - private int leng; - - /** - * 设备ID - */ - private String deviceId; - - /** - * 通讯方式 - */ - private Integer connType; - - /** - * 加密方式 - */ - private Integer encryType; - - /** - * 目标地址 - */ - private String destAddr; - - /** - * PDUType - */ - private String PDUType; - - /** - * 操作类型 - */ - private Integer operateType; - - /** - * 传输控制位 PDUType.bit7=0时,表示存在后续的访问;当PDUType.bit7=1时,表示无后续的访问。 - */ - private Integer transControlFlag; - - /** - * 设备类型 - */ - private Integer deviceType; - - /** - * 序号 - */ - private Integer seq; - - /** - * tagList - */ - private String tagList; - - /** - * OidList - */ - private String OidList; - - /** - * CRC - */ - private String CRC; - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/PreRuleConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/PreRuleConfig.java deleted file mode 100644 index bfcf914..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/PreRuleConfig.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.casic.missiles.pojo; - -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -import java.util.Date; - -@Data -@TableName("pre_rule_config") -public class PreRuleConfig { - - private Long id; - private String protocolId; - private String ruleFieldId; - private String ownerId; - private Date createTime; - private Date lastTime; -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolConfig.java index 274ad42..bdac11f 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolConfig.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolConfig.java @@ -5,18 +5,52 @@ import java.util.Date; +/** + * 协议配置表,协议配置与帧结构有关 + * 1、层级关系,协议之后是规则,规则对应设备类型的各种上数规则 + * 2、规则对应协议配置的实例流程 + * 3、每种可根据设备类型和操作类型进行上数规则进行区分 + */ @Data @TableName("protocol_config") public class ProtocolConfig { private Long id; + /** + * 前导码 + */ private String preFix; - private String unpackId; - private String totalLengthId; - private String totalLengthFilterField; + /** + * 拆包id + */ + private Long unpackId; + /** + * 总长度id + */ + private Long totalLengthId; + /** + * + */ + private String totalLengthFilterFields; + /** + * 动态长度ids + */ private String dynamicLengthId; + /** + * 动态长度json(预留字段) + */ private String dynamicLengthJson; - private String tailStr; + /** + * 规则字段所解析预准备的字段 + */ + private String rulePrepareFields; + /** + * 结尾标志 + */ + private Long tailStr; + /** + * 备注 + */ private String remark; private String ownerId; private Date createTime; diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolFieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolFieldConfig.java new file mode 100644 index 0000000..db794bd --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolFieldConfig.java @@ -0,0 +1,43 @@ +package com.casic.missiles.pojo; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +/** + * 协议字段配置表 + * 该表用户存放帧结构固定格式的字段 + * 有以下两个用途 + * (1)、固定格式的字段可用于规则匹配 + * (2)、固定格式的字段可用于报文回复 + * @author cz + * @date 2023-06-09 + */ +@Data +@TableName("protocol_field_config") +public class ProtocolFieldConfig extends AbstractFieldConfig{ + + private Long id; + /** + * 协议配置id + */ + private Long protocolId; + /** + * 上传下发是否有变化, 没有变化,可以直接组装 + */ + private String isReplyFix; + /** + * 按照字段评估进行字段解析 + */ + private Long fieldEvaluatorId; + /** + * 回复规则 + */ + private String replyRule; + + private String ownerId; + private Date createTime; + private Date lastTime; + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java index 3b53493..febf835 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java @@ -6,18 +6,40 @@ import java.util.Date; /** - * 加密字段解析和规则有关,事件调到该流程下面 + * @author cz + * todo: 匹配协议对应业务实例 + * 1、一个协议可以多种的流程规则 + * 2、规则可以支持递归规则流程 */ @Data @TableName("rule_config") public class RuleConfig { - private Long id; private String protocolId; - private String isBizField; - private String parseRuleJson; + /** + * 是否完成规则配置,没有完成, + * 则需要根据规则继续匹配 + */ + private String isFinishMatch; + /** + * 待匹配解析规则 + * {“data_field”:"data_value"} + */ + private String matchRuleJson; + /** + * 待解析字段ids + */ private String dataFieldIds; - private String aviatorFilterJson; + + /** + * 待解析组合字段ids + */ + private String combinedFieldIds; + + /** + * aviator + */ + private String conditionExpression; private Date createTime; private Date lastTime; } diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleDict.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleDict.java deleted file mode 100644 index cc7f389..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleDict.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.casic.missiles.pojo; - -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -@Data -@TableName("rule_dict") -public class RuleDict { - - private Long id; - private Long pid; - private String name; - private String code; - private String ownerId; - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleEvaluator.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleEvaluator.java deleted file mode 100644 index ed16610..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleEvaluator.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.pojo; - -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -import java.util.Date; - -@TableName("rule_evaluator") -@Data -public class RuleEvaluator { - - private Long id; - private String name; - private String desc; - private String condition; - private String excuteOperation; - private Date lasTime; - private Date createTime; - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/CombinedFieldConfigRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/CombinedFieldConfigRegistry.java new file mode 100644 index 0000000..fa59b90 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/CombinedFieldConfigRegistry.java @@ -0,0 +1,12 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.CombinedFieldConfig; + +import java.util.List; + +public interface CombinedFieldConfigRegistry { + + List getCombinedFieldConfigList(Long ruleId); + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java index 608af3a..32cc8a4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java @@ -2,48 +2,47 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.delivery.decorator.ByteDecorator; +import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @AllArgsConstructor public class FieldDecoratorManger { - private final RuleDictDao ruleDictDao; + private final RuleConfigRegistry ruleDictDao; // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 // (1)静态的业务字段是字典里面可以配置的 // (2)动态的业务字段是通过规则生成的 public String contentMerge(String ruleJson, String sceneConent, String dynamicContent) { - List ruleDictList = ruleDictDao.getRuleDictConfig(); - Map ruleDictMap = ruleDictList.stream().collect( - Collectors.toMap(RuleDict::getId, e -> e)); - List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); - for (Map ruleMap : ruleMapList) { - String ruleType = String.valueOf(ruleMap.get("ruleType")); - ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); - NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); - byteDecorator.nodeDecoratorRule(nodeDecoratorParm); - } +// List ruleDictList = ruleDictDao.getRuleDictConfig(); +// Map ruleDictMap = ruleDictList.stream().collect( +// Collectors.toMap(RuleDict::getId, e -> e)); +// List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); +// for (Map ruleMap : ruleMapList) { +// String ruleType = String.valueOf(ruleMap.get("ruleType")); +// ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); +// NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); +// byteDecorator.nodeDecoratorRule(nodeDecoratorParm); +// } return null; } - - private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { - NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() - .contents(sceneConent) - .dynamicContent(dynamicContent) - .ruletypeId(ruletypeId) - .ruleDictMap(ruleDictMap) - .build(); - return nodeDecoratorParm; - } +// +// private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { +// NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() +// .contents(sceneConent) +// .dynamicContent(dynamicContent) +// .ruletypeId(ruletypeId) +// .ruleDictMap(ruleDictMap) +// .build(); +// return nodeDecoratorParm; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java index 652970c..b204ac3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java @@ -1,56 +1,56 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@AllArgsConstructor -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", - JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Component; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Component("logicalDecorator") +//@AllArgsConstructor +//@Slf4j +//public class LogicalShiftDecorator implements ByteDecorator { +// +//// private final FieldRuleEngineMapper fieldRuleEngineMapper; +//// +//// //字节位移 +//// @Override +//// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +//// String logicalValue = ""; +//// RuleEvaluator fieldRuleEngine = new RuleEvaluator(); +//// try { +//// Map env2 = new HashMap(); +//// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +//// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +//// for (String contentId : contentIdList) { +//// RuleDict ruleDict = ruleDictMap.get(contentId); +//// if (ruleDict.getCode().contains("#")) { +//// //使用动态的值 +//// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +//// } +//// env2.put(ruleDict.getName(), ruleDict.getCode()); +//// } +//// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +//// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +//// return null; +//// } +//// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +//// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +//// return values; +//// } catch (Exception ex) { +//// log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", +//// JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +//// return null; +//// } +//// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java index 346468f..822fead 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@AllArgsConstructor -@Slf4j -public class OperationDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("optionDecorator") +//@AllArgsConstructor +//@Slf4j +//public class OperationDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //混合运算,有常量或者乘除的缩放 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java index 50fb0a7..7a8bccb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@AllArgsConstructor -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +////精度计算 +//@AllArgsConstructor +//@Registry("precisionDecorator") +//@Slf4j +//public class PrecisionDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java index da39235..27f9cc7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java @@ -1,54 +1,53 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@AllArgsConstructor -@Slf4j -public class RuleDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("ruleDecorator") +//@AllArgsConstructor +//@Slf4j +//public class RuleDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //吃我一套正则表达式 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (Exception ex) { +// log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java index 7f5cbf3..c043f97 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java @@ -2,6 +2,6 @@ import java.util.Map; -public interface ComandeEventService { +public interface ComandeEventService{ Map loadComandeEventConfig(String protocolId,String scene); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java index 476ad84..aaf1837 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java @@ -2,46 +2,46 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.dao.CommandEventDao; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @Slf4j @AllArgsConstructor -public class ComandeEventServiceImpl implements ComandeEventService { +public class ComandeEventServiceImpl implements ComandeEventRegistry { - private final CommandEventDao commandEventDao; + // private final CommandEventDao commandEventDao; // 加密bean 固定字段出现变化的字段解析,业务字段的有序内容 @Override - public Map loadComandeEventConfig(String protocolId,String sceneName) { - CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); - if (ObjectUtil.isEmpty(commandEventConfig)) { - log.error("协议{},没有配置成功接收回复配置,清排查原因"); - return null; - } - String replyJson = commandEventConfig.getReplyContentJson(); - List> replyMapList = JSONArray.parseObject(replyJson, List.class); - List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); - Map fixMap = fixList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); - List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) - .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) - .collect(Collectors.toList()); - Map commandConfigMap = new HashMap<>(); - commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); - commandConfigMap.put("fixContent", fixMap); - commandConfigMap.put("bizContent", contentList); - return commandConfigMap; + public Map loadComandeEventConfig(String protocolId, String sceneName) { +// CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); +// if (ObjectUtil.isEmpty(commandEventConfig)) { +// log.error("协议{},没有配置成功接收回复配置,清排查原因"); +// return null; +// } +// String replyJson = commandEventConfig.getReplyContentJson(); +// List> replyMapList = JSONArray.parseObject(replyJson, List.class); +// List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); +// Map fixMap = fixList.stream() +// .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); +// List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) +// .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) +// .collect(Collectors.toList()); +// Map commandConfigMap = new HashMap<>(); +// commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); +// commandConfigMap.put("fixContent", fixMap); +// commandConfigMap.put("bizContent", contentList); +// return commandConfigMap; + return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 128b09d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java deleted file mode 100644 index 4016b0b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface DatagramEventMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java deleted file mode 100644 index 597c306..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.apache.ibatis.annotations.Mapper; - -public interface FieldConfigMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java deleted file mode 100644 index a31680a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.PreRuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface PreRuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java deleted file mode 100644 index 9060a69..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface ProtocolConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java deleted file mode 100644 index 6fa6936..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java deleted file mode 100644 index 582a705..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleDict; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleDictMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java deleted file mode 100644 index 6e302c8..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.CommandEventMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Optional; - -@Component -public class CommandEventDao { - - @Resource - private CommandEventMapper commandEventMapper; - - public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId) - .eq("scene", sceneName) - .eq("enabled", 1); - List commandEventConfig = commandEventMapper.selectList(queryWrapper); - Optional optionalEventConfig = commandEventConfig.stream().findFirst(); - return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java deleted file mode 100644 index 9137e4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.FieldConfigMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class FieldConfigDao { - - @Resource - private FieldConfigMapper fieldConfigMapper; - - public FieldConfig getFieldConfigById(String fieldId) { - FieldConfig fieldConfig = fieldConfigMapper.selectById(fieldId); - return fieldConfig; - } - - public List getFieldConfigs(String protocolId,Integer isFixed) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",isFixed); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - - public List getStorageFieldConfig(String protocolId) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",1) - .eq("is_storage",1); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java deleted file mode 100644 index 67bff6b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.mapper.PreRuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class PreRuleConfigDao { - - @Resource - private PreRuleConfigMapper preRuleConfigMapper; - - public List getPreRuleList(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return preRuleConfigMapper.selectList(queryWrapper); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java deleted file mode 100644 index d69ea85..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.RuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleConfigDao { - - @Resource - private RuleConfigMapper ruleConfigMapper; - - public RuleConfig getNextRuleConfig(String ruleFields) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("parse_rule_json", ruleFields); - return ruleConfigMapper.selectOne(queryWrapper); - } - - - public List getRuleConfigById(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return ruleConfigMapper.selectList(queryWrapper); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java deleted file mode 100644 index 932c185..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.RuleDictMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleDictDao { - - @Resource - private RuleDictMapper ruleDictMapper; - - public List getRuleDictConfig() { - List ruleDictList = ruleDictMapper.selectList(null); - return ruleDictList; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java index 9f9e279..43bc4d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java @@ -10,20 +10,15 @@ import io.netty.channel.socket.nio.NioServerSocketChannel; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import javax.annotation.PreDestroy; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static cn.hutool.core.util.ClassUtil.getClasses; /** * SensorhubServer netty服务端 */ @Slf4j -@Service +@Component public class SensorhubServer { /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java index 2c79ff5..9a28c36 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java @@ -11,13 +11,13 @@ import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioSocketChannel; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClient 客户端 */ @Slf4j -@Service +@Registry public final class SensorhubClient { public static void main(String[] args) throws Exception { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java index 9774be0..477c3f7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java @@ -6,12 +6,12 @@ import io.netty.channel.socket.SocketChannel; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientChannelInitialHandler */ -@Service +@Registry public class SensorhubClientChannelInitialHandler extends ChannelInitializer { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java index 346f4b3..73560e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java @@ -5,13 +5,13 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientHandler */ @Slf4j -@Service +@Registry public class SensorhubClientHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java index 5c1c6f2..d990af5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java @@ -4,12 +4,12 @@ import com.casic.missiles.pojo.Msg; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** * SensorhubServerHandler */ -@Service +@Component public class SensorhubServerHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 67283ae..af3172c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,41 +1,37 @@ package com.casic.missiles.parser; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultProtocolConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.*; +import com.casic.missiles.registry.FieldConfigRegistry; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; -import java.nio.charset.Charset; import java.util.HashMap; import java.util.List; import java.util.Map; -@Service("genericProtocolParser") +/** + * @author + */ +@Component("genericProtocolParser") @Slf4j -@AllArgsConstructor +@RequiredArgsConstructor public class GenericProtocolParser implements ProtocolParser { - private final LeadingCodeMatcher leadingCodeMatcher; private final List frameStructDispenserList; - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorInstanceSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; // 匹配首字母前导码=> 帧结构匹配前导码=> // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 @@ -44,18 +40,19 @@ public Boolean doParseProtocol(ByteBuf byteBuf) { String protocolContent = ByteBufUtil.hexDump(byteBuf); //匹配前导码 - List preCodeConfigs = leadingCodeMatcher.matchLeadingCode(protocolContent); + List preCodeConfigs = LeadingCodeMatcher.matchFrameLeadingCode(protocolContent); //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 if (preCodeConfigs.size() == 0) { - return rematch(byteBuf,protocolContent); + return rematch(byteBuf, protocolContent); } - //暂时先取第一个 + //暂时先取第一个,提升速度,使用享元模式, 减少类的创建销毁与构建 ProtocolConfig protocolConfig = preCodeConfigs.get(0); + AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); ByteBuf wholeDatagramByte = null; //通过匹配帧结构获取完整的数据包 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, preCodeConfigs.get(0))) != null) { + if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, protocolFactory)) != null) { break; } } @@ -68,76 +65,78 @@ * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 */ - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId, wholeDatagramByte); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap, protocolId); - //选取规则对应的流程实例 - DatagramEventConfig datagramEventConfig = processorInstanceSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); + //进行规则字段解析,进行匹配规则 + RuleConfig ruleConfig = getRuleConfig(protocolFactory, wholeDatagramByte); + if (ruleConfig == null) { + return false; + } //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, wholeDatagramByte); + ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte); + //以下进行业务的规则解析,同时选定流程实例 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); + DatagramEventProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain, + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText, protocolId); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain); //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); + datagramEventProvider.storeData(bizDataMap); return true; } - private Boolean rematch(ByteBuf byteBuf,String protocolContent) { + /** + * 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 + */ + private Boolean rematch(ByteBuf byteBuf, String protocolContent) { //重置位判断 byteBuf.resetReaderIndex(); //判断重置是否前移,如果没有前移,则直接判为匹配失败 if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { return false; } else { + //递归执行 return doParseProtocol(byteBuf); } } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; + //获取匹配规则->匹配规则 + private RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + //取出其中参与逻辑provider并判空 + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); + String rulePrepareFields = protocolConfig.getRulePrepareFields(); + //固定字段 + if (StringUtils.isNotEmpty(rulePrepareFields)) { + //获取统一固定字段解析 + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + //获取该协议的字段配置,用于协议规则匹配 + List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); + //获取规则 + RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, + rulePrepareFields, protocolFieldConfigs); + return ruleConfig; + } + return null; } - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + //数据构建,获取固定字段的store和业务字段store + private Map buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + Map bizDataMap = new HashMap<>(); + Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); + Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); + bizDataMap.putAll(ruleStoreObjectMap); + bizDataMap.putAll(protocolStoreObjectMap); return bizDataMap; } - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java index 8a46e32..16ce2e5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java @@ -3,6 +3,7 @@ import io.netty.buffer.ByteBuf; public interface ProtocolParser { + Boolean doParseProtocol(ByteBuf byteBuf); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java new file mode 100644 index 0000000..f7814af --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java @@ -0,0 +1,35 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.ProtocolConfigProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.ProtocolConfig; + +/** + * 存放基本协议的的加载信息 + */ +public class AbstractProtocolConfigFactory { + private final ProtocolConfigProvider protocolConfigProvider; + private final ProtocolFieldConfigProvider protocolFieldConfigProvider; + private final RuleConfigProvider ruleConfigProvider; + + public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { + this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); + this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); + this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); + } + + public ProtocolConfigProvider getProtocolConfigProvider() { + return protocolConfigProvider; + } + + public ProtocolFieldConfigProvider getProtocolFieldConfigProvider() { + return protocolFieldConfigProvider; + } + + public RuleConfigProvider getRuleConfigProvider() { + return ruleConfigProvider; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java new file mode 100644 index 0000000..6e36147 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java @@ -0,0 +1,57 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.CombinedFieldConfigProvider; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.FieldConfigProvider; +import com.casic.missiles.parser.provider.FieldRuleConfigProvider; + +/** + * 存放规则相关的的的加载信息 + */ +public class AbstractRuleConfigFactory { + + /** + * 处理字节 + */ + private final FieldConfigProvider fieldConfigProvider; + /** + * 处理组合字节解析的解码器 + */ + private final CombinedFieldConfigProvider combinedFieldConfigProvider; + /** + * 处理负责字节解析的规则配置 + */ + private final FieldRuleConfigProvider fieldRuleConfigProvider; + /** + * 处理实例流程 + */ + private final DatagramEventProvider datagramEventProvider; + + + public AbstractRuleConfigFactory(Long ruleId) { + this.fieldConfigProvider = new FieldConfigProvider(ruleId); + this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); + this.fieldRuleConfigProvider = new FieldRuleConfigProvider(ruleId); + this.datagramEventProvider = new DatagramEventProvider(ruleId); + } + + public FieldConfigProvider getFieldConfigProvider() { + return fieldConfigProvider; + } + + public CombinedFieldConfigProvider getCombinedFieldConfigProvider() { + return combinedFieldConfigProvider; + } + + public FieldRuleConfigProvider getFieldRuleConfigProvider() { + return fieldRuleConfigProvider; + } + + public DatagramEventProvider getDatagramEventProvider() { + return datagramEventProvider; + } + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java deleted file mode 100644 index 6e1719a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.factory; - - -import com.casic.missiles.pojo.ProtocolConfig; - -import java.util.List; - -/** - * 数据库访问优化(暂时未做) - *

- * 1、初始化协议解析配置,并存放到处存放缓存,对协议基本配置进行管理 - * 2、其中流程中所有的配置都经过此类进行管理,进行调用获取,增强解析速度 - */ -public interface DatagramFactory { - - /** - * 初始化 - */ - List datagramInit(); - - /** - * 根据前导码配置匹配,模糊匹配获取所有的报文项 - */ - List match(); - - /** - * 根据前导码匹配,返回报文项 - */ - List filer(); - - /** - * 保证数据的唯一性选择器 - */ - List selectOne(); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java new file mode 100644 index 0000000..87444a0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java @@ -0,0 +1,18 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +import java.util.List; + +/** + * 直接用,还是边用边创建 + */ +public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { + + + public DefaultProtocolConfigFactory(ProtocolConfig protocolConfig) { + super(protocolConfig); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java new file mode 100644 index 0000000..cce0c7c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java @@ -0,0 +1,12 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; + +public class DefaultRuleFactory extends AbstractRuleConfigFactory { + + public DefaultRuleFactory(Long ruleId) { + super(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java deleted file mode 100644 index 9ee97e0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.casic.missiles.parser.instance; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service -@Slf4j -@AllArgsConstructor -public class GeneralProcessor { - - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; - - /** - * 统一固定字段解析=>进行规则的查询的判断 - * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 - * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 - */ - @Deprecated - public boolean parseWholeDatagram(ByteBuf buffer, ProtocolConfig protocolConfig) { - try { - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap,protocolId); - //选取规则对应的流程= - DatagramEventConfig datagramEventConfig = processorSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); - //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); - //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); - //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); - //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); - //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); - return true; - } catch (Exception ex) { - log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", - ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); - return false; - } - } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; - } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); - } - - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); - return bizDataMap; - } - - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java index 25e7ad8..6a5777e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java @@ -1,23 +1,31 @@ package com.casic.missiles.parser.instance.impl; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.mapper.DatagramEventMapper; import com.casic.missiles.pojo.DatagramEventConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.SpringContextUtil; -@Service -@AllArgsConstructor +import java.util.List; +import java.util.Optional; + +/** + * @author cz + * + */ public class DefaultProcessorInstanceSelector implements ProcessorInstanceSelector { - private final DatagramEventMapper datagramEventMapper; + private static List datagramEventConfigs; + + static { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + datagramEventConfigs = datagramEventRegistry.getDatagramEventList(); + } @Override public DatagramEventConfig getProcessorInstance(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("rule_id", protocolId); - return datagramEventMapper.selectOne(queryWrapper); + Optional optionalSelectInstance = datagramEventConfigs.stream() + .filter(e -> e.getId().equals(protocolId)).limit(1).findFirst(); + return optionalSelectInstance.isPresent() ? optionalSelectInstance.get() : null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a778671..7b56a43 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,16 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import io.netty.buffer.ByteBuf; /** - * 分析匹配情况 - * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 - * 2、匹配不成功,有后续帧,可以进行下次匹配。 - * 3、匹配不成功,无后续帧,可以进行丢弃。 + * 分析匹配情况 + * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 + * 2、匹配不成功,有后续帧,可以进行下次匹配。 + * 3、匹配不成功,无后续帧,可以进行丢弃。 */ -public interface FrameStructMatcher{ +public interface FrameStructMatcher { - ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig); + ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 05320ab..8ebea78 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,23 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.ProtocolConfigMapper; +import com.casic.missiles.parser.provider.ProtocolConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Component; import java.util.List; import java.util.stream.Collectors; -@Component -@AllArgsConstructor public class LeadingCodeMatcher { - private final ProtocolConfigMapper protocolMapper; - //** 1、首字母匹配前导码, // 2、以匹配出的前导码是否在报文中条件进行前导码的匹配二次筛选 - public List matchLeadingCode(String protocolContent){ + public static List matchFrameLeadingCode(String protocolContent){ List initialConfigs = initialMatch(protocolContent); List preCodeConfigs = initialConfigs.stream() .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) @@ -26,13 +19,16 @@ } //初始化匹配前导码内容 - private List initialMatch(String protocolContent) { - String protocolStr = protocolContent.charAt(0) + ""; - QueryWrapper queryWrapper = new QueryWrapper() - .likeRight("pre_fix", protocolStr); - List protocolConfigList = protocolMapper.selectList(queryWrapper); - return protocolConfigList; + private static List initialMatch(String protocolContent) { + String firstFrameChar = protocolContent.charAt(0) + ""; + ProtocolConfigProvider protocolConfigProvider=new ProtocolConfigProvider(firstFrameChar); + return protocolConfigProvider.getMatchList(); } + + + + + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index cf2113d..e915877 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -1,32 +1,35 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(0) -@Service +@Component public class FrameLengthMatcher implements FrameStructMatcher { - @Autowired - private FieldParser fieldParser; - //超过长度 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { String dataGramContent = ByteBufUtil.hexDump(byteBuf); - if (StringUtils.isEmpty(protocolConfig.getUnpackId()) && StringUtils.isEmpty(protocolConfig.getTailStr())) { - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + //当不存在结尾标志和拆包标志,可以直接使用长度进行匹配 + if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { if (dataGramContent.length() >= totalLength) {//等于长度返回true,超出长度,切断 - ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, protocolConfig, totalLength); + ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, totalLength); return wholeDatagramByte; } else { //读的标志位前移舍弃 @@ -38,7 +41,7 @@ return null; } - private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, Integer totalLength) { byteBuf.readBytes(totalLength); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, totalLength - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 2bfc213..d527ad0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; @@ -13,7 +13,7 @@ import lombok.AllArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.nio.charset.Charset; import java.util.Map; @@ -22,32 +22,30 @@ * 后续标志验证 */ @Order(1) -@Service +@Component @AllArgsConstructor -public class FrameMarkMatcher implements FrameStructMatcher { - - private final FieldConfigDao fieldConfigDao; - private final FieldParser fieldParser; - private final FieldResolver fieldResolverManger; +public class FrameMarkMatcher implements FrameStructMatcher, FixedPropertyEnum { //帧后续标志=>结束,进行帧的重组=>有后续,1、帧移位判别 2、继续接收帧 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig UnpackConfig = StringUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getUnpackId()); - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); - Integer upback = 0; + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); ByteBuf mergeWholeFrameByte = null; - if (!ObjectUtil.isEmpty(UnpackConfig)) { - while (hasNextFullFrame(byteBuf, protocolConfig)) { - upback = (Integer) fieldResolverManger.filedParserManger(byteBuf, UnpackConfig, null); + if (!ObjectUtil.isEmpty(unpackFlag)) { + while (hasNextFullFrame(byteBuf, protocolConfig, protocolFieldConfigProvider)) { //是否存在后续位 - if (upback == 1) {//使用esayRule + if (unpackFlag == 1) {//使用esayRule //表示可以截取 - mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolConfig, totalLength); + mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolFieldConfigProvider, protocolConfig); return mergeWholeFrameByte; } else { - byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig)); + byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig, protocolFieldConfigProvider)); } } } @@ -56,7 +54,8 @@ //选取第一个帧,将业务内容和后面部分分开 //计算数据报文-业务内容 - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolFieldConfigProvider protocolFieldConfigProvider, ProtocolConfig protocolConfig) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); //截取完整报文 byteBuf.readBytes(totalLength); ByteBuf byteBufContent = byteBuf.slice(0, byteBuf.readerIndex()); @@ -68,15 +67,15 @@ String tail = ""; System.out.println(ByteBufUtil.hexDump(byteBufContent)); //会存在多个帧拼接在一起的的情况,进行合并处理 - while (hasNextFullFrame(byteBufContent, protocolConfig)) { - Integer currentFrameLength = fieldParser.getTotalLength(protocolConfig, byteBufContent); + while (hasNextFullFrame(byteBufContent, protocolConfig, protocolFieldConfigProvider)) { + Integer currentFrameLength = protocolFieldConfigProvider.getTotalLength(byteBufContent, protocolConfig); byteBufContent.readBytes(currentFrameLength); ByteBuf currentbyteBuf = byteBufContent.slice(0, byteBufContent.readerIndex()); byteBufContent.markReaderIndex();//读的标志位前移 System.out.println(ByteBufUtil.hexDump(byteBufContent)); String hexDump = currentbyteBuf.toString(Charset.forName("ISO-8859-1")); //获取当前固定帧结构的关系map - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, currentbyteBuf); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(currentbyteBuf, protocolConfig); if (StringUtils.isEmpty(mergeFrameStr)) { //首次获取业务数据报文 mergeFrameStr += hexDump.substring(0, currentFrameFixedProperty.get("tailPosition")); @@ -95,22 +94,22 @@ /** * 获取平移到下一帧起始位置 */ - public int getNextFrameOffset(ByteBuf buffer, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, buffer); - return currentFrameFixedProperty.get("totalLength"); + public int getNextFrameOffset(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + return currentFrameFixedProperty.get(TOTAL_LENGTH); } /** * 判断是否出错进行整个帧的 */ - public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, byteBuf); + public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); //保证读取位置不在固定位置,是可变的业务内容 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("fixedPosition")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(FIXED_POSITION)) { return false; } //判断读取是否操作帧长度 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("totalLength")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(TOTAL_LENGTH)) { return false; } return true; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 76a3784..c3a1bab 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -1,50 +1,50 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.parser.instance.GeneralProcessor; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; +import io.netty.buffer.ByteBufUtil;; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(2) -@Service +@Component public class FrameTailMatcher implements FrameStructMatcher { - @Resource - private FieldConfigDao fieldConfigDao; - @Autowired - private GeneralProcessor generalProcessor; - //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig tailFieldConfig = StringUtils.isEmpty(protocolConfig.getTailStr()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getTailStr()); - if (!ObjectUtil.isEmpty(tailFieldConfig)) { - String tailStr = tailFieldConfig.getFieldName(); + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfig protocolFieldConfig = ObjectUtils.isEmpty(protocolConfig.getTailStr()) ? null : + fieldConfigProvider.getFieldConfigById(protocolConfig.getTailStr()); + if (!ObjectUtil.isEmpty(protocolFieldConfig)) { + String tailStr = protocolFieldConfig.getFieldName(); String dataGramContent = ByteBufUtil.hexDump(byteBuf); Boolean tailFlag = ByteBufUtil.hexDump(byteBuf).contains(tailStr); if (!tailFlag) { //使用esayRule return null; } else if (dataGramContent.indexOf(tailStr) < dataGramContent.length() - tailStr.length()) { Integer length = dataGramContent.indexOf(tailStr) + tailStr.length(); - ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, protocolConfig, length); + ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, length); return wholeDatagramByte; //存在粘包 } } return null; } - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer length) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, Integer length) { byteBuf.readBytes(length); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, length - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java new file mode 100644 index 0000000..5f1c177 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java @@ -0,0 +1,73 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.combined.GenericCombinedFieldResolver; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.CombinedFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class CombinedFieldConfigProvider { + + + /** + * 作为临时配置列表缓存使用 + */ + private final List combinedFieldConfigList; + private Map storeObjectMap = new HashMap<>(); + + public CombinedFieldConfigProvider(Long ruleId) { + CombinedFieldConfigRegistry combinedFieldConfigRegistry = SpringContextUtil.getBean(CombinedFieldConfigRegistry.class); + combinedFieldConfigList = combinedFieldConfigRegistry.getCombinedFieldConfigList(ruleId); + } + + public void parseDataField(RuleConfig ruleConfig, String clearZeroPlain,Map fieldConfigsMap ) { + if (showSkip()) { + return; + } + //匹配对应的数据,然后进行相关的字段解析 + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver(); + combinedFieldResolver.parseDataField(combinedFieldConfigList, byteBuf, storeObjectMap,fieldConfigsMap); + } + + + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getCombinedFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return combinedFieldConfigList.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public List getCombinedFieldConfigList() { + return combinedFieldConfigList; + } + + /* 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(combinedFieldConfigList) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java new file mode 100644 index 0000000..f3cfedc --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java @@ -0,0 +1,11 @@ +package com.casic.missiles.parser.provider; + +/** + * @author cz + * @date 2023-6-12 + */ +public class CommandEventProvider{ + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java new file mode 100644 index 0000000..70eec5e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java @@ -0,0 +1,77 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.safe.SafeStrategy; +import com.casic.missiles.parser.sender.DataSubscribeProvider; +import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class DatagramEventProvider { + + private final DatagramEventConfig processorInstance; + + public DatagramEventProvider(Long ruleId) { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + List datagramEventConfigList = + datagramEventRegistry.getDatagramEventList(ruleId); + processorInstance = this.getProcessorInstance(datagramEventConfigList); + } + + public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { + if (showSkip()) { + return null; + } + return datagramEventConfigList.get(0); + } + + // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 + public String getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap) { + String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? + processorInstance.getSafeBean() : + fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); + if (!StringUtils.isEmpty(safeName)) { + //需要加密 + SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); + String plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); + return clearComplementZero(plain); + } + return ByteBufUtil.hexDump(bizDataContent); + } + + //解密清零操作 + private String clearComplementZero(String plain) { + plain = plain.substring(0, plain.lastIndexOf("00")); + return plain; + } + + //数据发送,数据发送者暂未构建 + public void storeData(Map bizDataMap) { + DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); +// dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return ObjectUtils.isNotEmpty(processorInstance) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java new file mode 100644 index 0000000..7e1fe0a --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java @@ -0,0 +1,97 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.FieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class FieldConfigProvider { + + + private final List fieldConfigs; + private Map storeObjectMap = new HashMap<>(); +// private Map singleObjects = new ConcurrentHashMap<>(); + + public FieldConfigProvider(Long ruleId) { + FieldConfigRegistry fieldConfigRegistry = SpringContextUtil.getBean(FieldConfigRegistry.class); + fieldConfigs = fieldConfigRegistry.getFieldConfigList(ruleId); + } + + public List getFieldConfigs() { + return fieldConfigs; + } + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public Map parseDataField(RuleConfig ruleConfig, String clearZeroPlain) { + if (showSkip()) { + return null; + } + List prepareFieldConfig = prepareParseField(ruleConfig); + if (CollectionUtils.isNotEmpty(prepareFieldConfig)) { + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(fieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + return fixDataMap; + } + } + return null; + } + + /** + * 得到需要处理的业务内容 + * + * @return + */ + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return fieldConfigs.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public Map getFieldConfigsMap() { + return fieldConfigs.stream().collect( + Collectors.toMap(FieldConfig::getId, e -> e) + ); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(fieldConfigs) ? false : true; + } + + +} + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java new file mode 100644 index 0000000..817bfaf --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java @@ -0,0 +1,19 @@ +package com.casic.missiles.parser.provider; + +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.registry.FieldRuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; + +public class FieldRuleConfigProvider { + + private final List fieldRuleConfigList; + + public FieldRuleConfigProvider(Long ruleId) { + FieldRuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(FieldRuleConfigRegistry.class); + fieldRuleConfigList = ruleConfigRegistry.getFieldRuleConfigList(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java new file mode 100644 index 0000000..99a1b06 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java @@ -0,0 +1,53 @@ +package com.casic.missiles.parser.provider; + + +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.registry.ProtocolConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolConfigProvider { + + private final List protocolConfigList; + + public ProtocolConfigProvider(String firstChar) { + ProtocolConfigRegistry registry = SpringContextUtil.getBean(ProtocolConfigRegistry.class); + protocolConfigList = registry.getProtocolConfigList(firstChar); + } + + public List getMatchList() { + return protocolConfigList; + } + + /** + * 设置当前协议 + * + * @param protocolConfig + */ + public ProtocolConfigProvider(ProtocolConfig protocolConfig) { + List protocolConfigs = new ArrayList<>(); + protocolConfigs.add(protocolConfig); + protocolConfigList = protocolConfigs; + } + + /** + * 获取当前协议 + * + * @return + */ + public ProtocolConfig getCurrentProtocolConfig() { + if (this.protocolConfigList == null) { + return null; + } else { + return protocolConfigList.get(0); + } + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java new file mode 100644 index 0000000..043927d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java @@ -0,0 +1,213 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.registry.ProtocolFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolFieldConfigProvider { + + private static final String FIXED_FIELD_DS = "fixedFieldDs"; + private static final String CONTENT_FIELD_DS = "contentFieldDs"; + private static final String PROTOCOL_LENGTH = "protocolLength"; + private static final String PROTOCOL_FIELD_ID = "protocolFieldId"; + private static final String PROTOCOL_POSITION = "protocolPosition"; + + private final List protocolFieldConfigs; + private Map singleObjects = new ConcurrentHashMap<>(); + private Map storeObjectMap = new HashMap<>(); + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public ProtocolFieldConfigProvider(Long protocolId) { + ProtocolFieldConfigRegistry protocolFieldConfigRegistry = SpringContextUtil.getBean(ProtocolFieldConfigRegistry.class); + protocolFieldConfigs = protocolFieldConfigRegistry.getProtocolFieldConfigList(protocolId); + } + + public List getProtocolFieldConfigs() { + return protocolFieldConfigs; + } + + public ProtocolFieldConfig getFieldConfigById(Long fieldId) { + Optional optionalConfig = protocolFieldConfigs.stream().filter( + e -> e.getId().equals(fieldId) + ).findFirst(); + return optionalConfig.isPresent() ? optionalConfig.get() : null; + } + + public Integer getProtocolFieldValue(Long protocolFieldId, ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_FIELD_ID + protocolFieldId + ByteBufUtil.hexDump(byteBuf); + //获取缓存 + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + //加载固定长度数据集合 + Map fixDataMap = this.getProtocolDataMap(byteBuf); + ProtocolFieldConfig protocolFieldConfig = selectFieldConfig(protocolFieldId); + Integer protocolFieldValue = 0; + //获取约定字段的总长度 + if (fixDataMap.containsKey(protocolFieldConfig.getFieldName())) { + Object appointUnpackObject = fixDataMap.get(protocolFieldConfig.getFieldName()); + if (ObjectUtils.isNotEmpty(appointUnpackObject)) { + protocolFieldValue = (Integer) appointUnpackObject; + } + } + if (protocolFieldValue != null) { + //加入缓存 + if (ObjectUtils.isNotEmpty(protocolFieldValue)) { + this.singleObjects.put(catchKey, protocolFieldValue); + return protocolFieldValue; + } + } + return null; + } + + /** + * 获取帧固定位置信息 + * + * @param byteBuf + * @param protocolConfig + * @return + */ + public Map getFixedProperty(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_POSITION + protocolConfig.getId(); + if (this.singleObjects.containsKey(catchKey)) { + return (Map) singleObjects.get(catchKey); + } + Map fixedPropertyMap = new HashMap<>(); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + fixedPropertyMap = fieldParser.doGetFixedProperty(protocolFieldConfigs, this.getTotalLength(byteBuf,protocolConfig)); + if (CollectionUtils.isNotEmpty(fixedPropertyMap)) { + this.singleObjects.put(catchKey, fixedPropertyMap); + return fixedPropertyMap; + } + return fixedPropertyMap; + } + + /** + * 获取帧结构应有的总长度 + */ + public Integer getTotalLength(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_LENGTH + ByteBufUtil.hexDump(byteBuf); + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + Integer appointFrameLength = getProtocolFieldValue(protocolConfig.getTotalLengthId(), byteBuf); + if (appointFrameLength != null) { + //获取过滤的字段集合总长度 + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Integer totalFilterLength = fieldParser.getTotalFilterLength(protocolConfig, byteBuf, getFixFieldConfigMap()); + //计算总长度 + Integer totalLength = appointFrameLength + totalFilterLength; + //加入缓存 + if (ObjectUtils.isNotEmpty(totalLength)) { + this.singleObjects.put(catchKey, totalLength); + return totalLength; + } + } + return null; + } + + /** + * 获取协议有关字段解析内容 + * storeObjectMap存储代转存的数据 + * + * @return + */ + public Map getProtocolDataMap(ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(FIXED_FIELD_DS)) { + return (Map) singleObjects.get(FIXED_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(protocolFieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + this.singleObjects.put(FIXED_FIELD_DS, fixDataMap); + return fixDataMap; + } + return null; + } + + /** + * 获取业务报文内容的content字节 + * + * @param wholeDatagramByte + * @return + */ + public ByteBuf getDataContentBuf(ByteBuf wholeDatagramByte) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(CONTENT_FIELD_DS)) { + return (ByteBuf) singleObjects.get(CONTENT_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + ByteBuf bizDataByteBuf = fieldParser.getDataContentBuf(protocolFieldConfigs, wholeDatagramByte); + if (bizDataByteBuf != null) { + this.singleObjects.put(CONTENT_FIELD_DS, bizDataByteBuf); + return bizDataByteBuf; + } + return null; + } + + + private ProtocolFieldConfig selectFieldConfig(Long id) { + Optional optionalProtocolFieldConfig = this.protocolFieldConfigs.stream().filter( + e -> e.getId().equals(id) + ).findFirst(); + return optionalProtocolFieldConfig.isPresent() ? optionalProtocolFieldConfig.get() : null; + } + + + private Map getFixFieldConfigMap() { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, e -> e) + ); + return fixDataFieldMap; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(protocolFieldConfigs) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java new file mode 100644 index 0000000..dafba1c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java @@ -0,0 +1,56 @@ +package com.casic.missiles.parser.provider; + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.rule.GenericRuleResolver; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.RuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleConfigProvider { + + private final List ruleConfigs; + + public List getRuleConfigs() { + return ruleConfigs; + } + + public RuleConfigProvider(Long protocolId) { + RuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(RuleConfigRegistry.class); + ruleConfigs = ruleConfigRegistry.getRuleConfigById(protocolId); + } + + /** + * 获取规则匹配结果 + * + * @param parseFixedDataMap + * @param protocolFieldConfigs + * @return + */ + public RuleConfig doGetRule(Map parseFixedDataMap, + String ids, + List protocolFieldConfigs) { + if (showSkip()) { + return null; + } + RuleConfig ruleConfig = GenericRuleResolver.machRule(parseFixedDataMap, ids, protocolFieldConfigs, ruleConfigs); + return ruleConfig; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(ruleConfigs) ? false : true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java index 3c05891..856b399 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java @@ -1,18 +1,11 @@ package com.casic.missiles.parser.resolver; -import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.springframework.web.bind.annotation.RequestBody; -import javax.annotation.Resource; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -20,19 +13,17 @@ @Slf4j public class ByteMergeProvider { - @Resource - private FieldRuleEngineMapper fieldRuleEngineMapper; - //拿到所有的值合并到一个值 - public String resolveByteMerge(List valueList, String ruletypeId, String vaildRange) { + public static String resolveByteMerge(List valueList, String ruleTypeId, String vaildRange) { String values = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Map vaildMap = getValidRangeMap(vaildRange); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(ruletypeId); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } + //暂时不处理 +// fieldRuleEngine = fieldRuleConfigMapper.selectById(ruleTypeId); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } Map env2 = new HashMap(); for (int i = 0; i < valueList.size(); i++) { if (vaildMap.containsKey(i)) { @@ -47,7 +38,7 @@ } } - private Map getValidRangeMap(String vaildRange) { + private static Map getValidRangeMap(String vaildRange) { String[] range = vaildRange.split(","); Map vaildMap = new HashMap(); for (int i = 0; i < range.length; i++) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 8d821cd..85d6bbf 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -1,9 +1,12 @@ package com.casic.missiles.parser.resolver; +import com.casic.missiles.pojo.AbstractFieldConfig; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; import io.netty.buffer.ByteBuf; +import java.util.List; import java.util.Map; /** @@ -11,18 +14,14 @@ */ public interface FieldParser { -// Map fieldProcess(String protocolContent,); - Map dataParser(RuleConfig ruleConfig, String lightText,String protocolId); + Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength); - Map fixDataParser(String protocolId, ByteBuf buffer); + Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap); - Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf); + ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer); - ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer); - - ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer); - - Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer); + Integer getTotalFilterLength(ProtocolConfig protocolConfig, ByteBuf byteBuf, Map protocolFieldConfigMap); } + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java new file mode 100644 index 0000000..9e0c00e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java @@ -0,0 +1,52 @@ +package com.casic.missiles.parser.resolver; + +import com.casic.missiles.pojo.AbstractFieldConfig; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.util.List; + +public class FieldParserSupport { + + //分别计算bit和byte长度=> 合并长度 + protected Integer calculateLength(List fieldConfigList) { + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + Integer fixedLength = bytefixedLength + bitfixedLength / 8; + return fixedLength; + } + + //找到最大值=> 根据最大值计算业务数据下标 + protected Integer calculatePosition(List fieldConfigList) { + String rex = "[0-9]+"; + Integer max = -1; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) + && Integer.valueOf(fieldConfig.getOriginPositionByte()) > max) { + max = Integer.valueOf(fieldConfig.getOriginPositionByte()); + } + } + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) && fieldConfig.getOriginPositionByte().equals(max)) { + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + } + } + Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; + return maxFixedPosition; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java deleted file mode 100644 index dd3a6cd..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java +++ /dev/null @@ -1,170 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.ByteResolverParam; -import io.netty.buffer.ByteBuf; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -/** - * 字段解析管理总类 - */ -@Service -@Slf4j -@AllArgsConstructor -public class FieldResolver extends ByteMergeProvider { - - //1、字段截取 => 2、简单的字节解析和复杂的字节解析 - public Object filedParserManger(ByteBuf byteBuf, FieldConfig fieldConfig, Integer maxFixedPosition) { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - //最大固定位置不为空, - if (!ObjectUtil.isEmpty(maxFixedPosition)) { - orignPosition -= maxFixedPosition; - } - Object fieldValue = 0; - //待优化 - if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { - fieldValue = bitToResolver(byteBuf, fieldConfig); - } else { - ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); - fieldValue = parsingFields(fieldBytes, fieldConfig.getRuleJson()); - } - return fieldValue; - } - - //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, - //目前默认配置的规则设置暂不支持配置化,由实现完成 - private Object parsingFields(ByteBuf byteBuf, String ruleJson) { - Object fieldsResolveValue = null; - List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); - if (ObjectUtil.isEmpty(ruleMapList)) { - fieldsResolveValue = defaultResolveBuilder(byteBuf); - } else { - fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); - } - return fieldsResolveValue; - } - - private Object defaultResolveBuilder(ByteBuf byteBuf) { - Integer defaultResolveValue = 0; - for (int i = 0; i < byteBuf.writerIndex(); i++) { - defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; - } - return defaultResolveValue; - } - - //字段解析构建器(针对字节单位的) - //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 - // 字节归并结束或者规则结束=>继续根据规则进行判断 - private Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { - Object customizeResolveValue = null; - try { - List bytStrList = new ArrayList<>(); - //存放到数组里面 - for (int i = 0; i < byteBuf.writerIndex(); i++) { - bytStrList.add(byteBuf.readByte()); - } - int i = 0; - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - customizeResolveValue = this.resolveByteMerge(bytStrList, ruletypeId,vaildRange); - break; - } else { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - List tempBytStr = new ArrayList<>(); - for (int k = 0; i < bytStrList.size(); i++) { - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(k) - .value(bytStrList.get(k)) - .ruletypeId(ruletypeId).build(); - tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); - } - bytStrList = tempBytStr; - } - i++; - } - //字节归并到一起=>继续根据规则进行判断 - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(customizeResolveValue) - .ruletypeId(ruletypeId).build(); - customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(customizeResolveValue)); - return customizeResolveValue; - } catch (RuntimeException ex) { - log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); - return null; - } - } - - /** - * 1、单个字节情况表示字段 - * 2、多字节情况表示字段(暂未处理) - */ - private Object bitToResolver(ByteBuf byteBuf, FieldConfig fieldConfig) { - Object fieldValue = new Object(); - try { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - byte fields = 0x00; - if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); - } else { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); - } - - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { - if (!StringUtils.isEmpty(fieldConfig.getExactOrignPosition())) { - fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getExactOrignPosition())).byteValue() - >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); - } else { - fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); - } - } else { - fieldValue = Integer.valueOf(fields & 0xff); - } - if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { - return fieldValue; - } - List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); - int i = 0; - //字节归并到一起=>继续根据规则进行判断 - while (i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(fieldValue) - .ruletypeId(ruletypeId).build(); - fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(fieldValue)); - return fieldValue; - } catch (RuntimeException ex) { - log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); - return null; - } - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java new file mode 100644 index 0000000..1d2aeab --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java @@ -0,0 +1,36 @@ +package com.casic.missiles.parser.resolver.bytes; + +import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.mapper.FieldRuleConfigMapper; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.pojo.ByteResolverParam; +import com.googlecode.aviator.AviatorEvaluator; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; +//转换规则 +@Component("convert") +@AllArgsConstructor +@Slf4j +public class ByteRuleResolver implements ByteResolver { + + private final FieldRuleConfigMapper fieldRuleConfigMapper; + + @Override + public Object resolveOperationRule(ByteResolverParam byteResolverParam){ + FieldRuleConfig fieldRuleEngine=fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); + if(ObjectUtil.isEmpty(fieldRuleEngine)){ + return byteResolverParam.getValue(); + } + String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); + Map env2 = new HashMap(); + env2.put("value", (byte) byteResolverParam.getValue()); + String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); + return values; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java index 103821c..786b71c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java @@ -2,34 +2,34 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("logicalShift") +@Component("logicalShift") @AllArgsConstructor @Slf4j public class LogicalShiftResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //字节位移 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { Integer index = byteResolverParam.getIndex(); - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return byteResolverParam.getValue(); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java index 476747d..01149bd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("operation") +@Component("operation") @AllArgsConstructor @Slf4j public class OperationResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //混合运算,有常量或者乘除的缩放 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java index 0b82cf4..79abcce 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.casic.missiles.pojo.ByteResolverParam; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; //精度计算 -@Service("precision") +@Component("precision") @AllArgsConstructor @Slf4j public class PrecisionResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java deleted file mode 100644 index 5c3f332..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; -//转换规则 -@Service("convert") -@AllArgsConstructor -@Slf4j -public class RuleResolver implements ByteResolver { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam){ - RuleEvaluator fieldRuleEngine=fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); - if(ObjectUtil.isEmpty(fieldRuleEngine)){ - return byteResolverParam.getValue(); - } - String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); - Map env2 = new HashMap(); - env2.put("value", (byte) byteResolverParam.getValue()); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java new file mode 100644 index 0000000..d3bbd91 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java @@ -0,0 +1,15 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; + +import java.util.List; +import java.util.Map; +// 前导码匹配->长度字段 +public interface AbstractCombinedFieldProcessor { + + Map invoke(Map map, ByteBuf byteBuf, List combinedFieldConfigList, + Map fieldConfigsMap, Map storeObjectMap); + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java new file mode 100644 index 0000000..03c8480 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java @@ -0,0 +1,59 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-13 + */ +//依次递增进行数据的解析, +public class GenericCombinedFieldResolver { + + + //通过查询,字段长度长度随机 + public void parseDataField(List combinedFieldConfigList, ByteBuf byteBuf, + Map storeObjectMap, Map fieldConfigsMap) { + Integer frameLength = Integer.valueOf(ByteBufUtil.hexDump(byteBuf)); + //添加前置处理器 + com.casic.missiles.util.ClassUtil classUtil = new com.casic.missiles.util.ClassUtil(); + List abstractCombinedProcessors = classUtil.getSubClassList(AbstractCombinedFieldProcessor.class); + + Map fieldFixedMap = combinedFieldLeadCodeMap(combinedFieldConfigList); + //frameLength + Map combinedProcessorFields = null; + while (byteBuf.readableBytes() < frameLength) { + //一直处理 + for (AbstractCombinedFieldProcessor abstractCombinedProcessor : abstractCombinedProcessors) { + combinedProcessorFields = abstractCombinedProcessor.invoke(combinedProcessorFields, byteBuf, + combinedFieldConfigList, + fieldConfigsMap, storeObjectMap); + if (combinedProcessorFields == null || byteBuf.readableBytes() < frameLength) { + return; + } + } + + } + } + + /** + * 取出前导码匹配集合 + */ + private Map combinedFieldLeadCodeMap(List combinedFieldConfigList) { + Map fieldFixedMap = combinedFieldConfigList + .stream() + .collect(Collectors.toMap(CombinedFieldConfig::getPrefixCode, e -> e)); + return fieldFixedMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java new file mode 100644 index 0000000..643a934 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java @@ -0,0 +1,100 @@ +package com.casic.missiles.parser.resolver.fields; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.FieldParserSupport; +import com.casic.missiles.pojo.*; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 保存使用时最基本的信息,并且使用原型模式 + */ +@Slf4j +public class DefaultProtocolFieldParser extends FieldParserSupport implements FieldParser, FixedPropertyEnum { + + //通过传入的配置和报文进行字段解析 + @Override + public Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap) { + Map dataMap = new HashMap<>(); + for (AbstractFieldConfig protocolFieldConfig : protocolFieldConfigs) { + if (!ObjectUtils.isEmpty(protocolFieldConfig.getOriginPositionByte())) { + Object fieldValue = FieldResolver.parseField(buffer, protocolFieldConfig, null); + if (protocolFieldConfig.getIsStorage() == 1) { + storeObjectMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + dataMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + } + return dataMap; + } + + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength) { + Map fixedPropertyMap = new HashMap<>(); + Integer fixedLength = calculateLength(protocolFieldConfigs); + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + fixedPropertyMap.put(FIXED_POSITION, maxFixedPosition); + fixedPropertyMap.put(TOTAL_LENGTH, totalLength); + fixedPropertyMap.put(TAIL_POSITION, totalLength - fixedLength + maxFixedPosition); + return fixedPropertyMap; + } + + //** 获取业务内容的byteBuf + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer) { + //计算固定长度 + Integer fixedLength = calculateLength(protocolFieldConfigs); + //总长度获取 + String lightText = buffer.toString(Charset.forName("ISO-8859-1")); + Integer totalLength = lightText.length(); + //计算固定长度最大长度 + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + //计算数据报文内容 + ByteBuf bizDataFields = buffer.slice(maxFixedPosition - 1, (totalLength - fixedLength)); + return bizDataFields; + } + + /** + * 获取过滤字段的长度 + */ + @Override + public Integer getTotalFilterLength(ProtocolConfig protocolConfig, + ByteBuf byteBuf, + Map protocolFieldConfigMap) { + if (ByteBufUtil.hexDump(byteBuf).equals("")) { + return 0; + } + int totalFilterLength = 0; + String filterFields = protocolConfig.getTotalLengthFilterFields(); + try { + if (!StringUtils.isEmpty(filterFields)) { + String[] filterFieldList = filterFields.split(","); + for (String filterFieldId : filterFieldList) { + if (StringUtils.isNotEmpty(filterFieldId)) { + ProtocolFieldConfig fieldConfig = protocolFieldConfigMap.get(Long.valueOf(filterFieldId)); + //这里都是按字节计算,没有对位进行区分,可能会出现错误 + // 如果对位有需求,需要进一步跟进 + totalFilterLength += fieldConfig.getOffsetLength(); + } + } + } + return totalFilterLength; + } catch (Exception ex) { + log.error("报文确认分发阶段,获取报文总长度过滤长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); + } + return totalFilterLength; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java new file mode 100644 index 0000000..d51e887 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java @@ -0,0 +1,169 @@ +package com.casic.missiles.parser.resolver.fields; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.parser.resolver.ByteMergeProvider; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.AbstractFieldConfig; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.pojo.ByteResolverParam; +import io.netty.buffer.ByteBuf; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * 字段解析管理总类 + */ +@Slf4j +public class FieldResolver extends ByteMergeProvider { + + //1、字段截取 => 2、简单的字节解析和复杂的字节解析 + public static Object parseField(ByteBuf byteBuf,AbstractFieldConfig fieldConfig, Integer maxFixedPosition) { + Integer orignPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + //最大固定位置不为空, + if (!ObjectUtil.isEmpty(maxFixedPosition)) { + orignPosition -= maxFixedPosition; + } + Object fieldValue = 0; + //待优化 + if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { + fieldValue = doParseBitField(byteBuf, fieldConfig); + } else { + ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); + fieldValue = doParseByteField(fieldBytes, fieldConfig.getRuleJson()); + } + return fieldValue; + } + + //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, + //目前默认配置的规则设置暂不支持配置化,由实现完成 + private static Object doParseByteField(ByteBuf byteBuf, String ruleJson) { + Object fieldsResolveValue = null; + List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); + if (ObjectUtil.isEmpty(ruleMapList)) { + fieldsResolveValue = defaultResolveBuilder(byteBuf); + } else { + fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); + } + return fieldsResolveValue; + } + + private static Object defaultResolveBuilder(ByteBuf byteBuf) { + Integer defaultResolveValue = 0; + for (int i = 0; i < byteBuf.writerIndex(); i++) { + defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; + } + return defaultResolveValue; + } + + //字段解析构建器(针对字节单位的) + //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 + // 字节归并结束或者规则结束=>继续根据规则进行判断 + private static Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { + Object customizeResolveValue = null; + try { + List bytStrList = new ArrayList<>(); + //存放到数组里面 + for (int i = 0; i < byteBuf.writerIndex(); i++) { + bytStrList.add(byteBuf.readByte()); + } + int i = 0; + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { + if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + customizeResolveValue = resolveByteMerge(bytStrList, ruletypeId, vaildRange); + break; + } else { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + List tempBytStr = new ArrayList<>(); + for (int k = 0; i < bytStrList.size(); i++) { + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(k) + .value(bytStrList.get(k)) + .ruletypeId(ruletypeId).build(); + tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); + } + bytStrList = tempBytStr; + } + i++; + } + //字节归并到一起=>继续根据规则进行判断 + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(null) + .value(customizeResolveValue) + .ruletypeId(ruletypeId).build(); + customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); + i++; + } + System.out.println(JSON.toJSON(customizeResolveValue)); + return customizeResolveValue; + } catch (RuntimeException ex) { + log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); + return null; + } + } + + /** + * 1、单个字节情况表示字段 + * 2、多字节情况表示字段(暂未处理) + */ + private static Object doParseBitField(ByteBuf byteBuf,AbstractFieldConfig fieldConfig) { + Object fieldValue = new Object(); + try { + Integer orignPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + byte fields = 0x00; + if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { + fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); + } else { + fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); + } + + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { + if (!StringUtils.isEmpty(fieldConfig.getOriginPositionBit())) { + fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getOriginPositionBit())).byteValue() + >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); + } else { + fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); + } + } else { + fieldValue = Integer.valueOf(fields & 0xff); + } + if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { + return fieldValue; + } + List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); + int i = 0; + //字节归并到一起=>继续根据规则进行判断 + while (i < ruleMapList.size()) { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(null) + .value(fieldValue) + .ruletypeId(ruletypeId).build(); + fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); + i++; + } + System.out.println(JSON.toJSON(fieldValue)); + return fieldValue; + } catch (RuntimeException ex) { + log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); + return null; + } + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java deleted file mode 100644 index 35ae3d0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java +++ /dev/null @@ -1,183 +0,0 @@ -package com.casic.missiles.parser.resolver.fields; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufAllocator; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; -import org.springframework.util.ObjectUtils; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service("standard") -@AllArgsConstructor -@Slf4j -public class StandardFieldParser implements FieldParser { - - private final FieldConfigDao fieldConfigDao; - private final FieldResolver fieldResolver; - - //数据解析 - @Override - public Map dataParser(RuleConfig ruleConfig, String lightText, String protocolId) { - String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); - ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); - bufferContent.writeBytes(lightText.getBytes(Charset.forName("ISO-8859-1"))); - Map dataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - for (String dataFieldId : dataFieldIds) { - FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(dataFieldId); - if (!ObjectUtils.isEmpty(fieldConfig)) { - dataMap.put(fieldConfig.getFieldName(), String.valueOf(fieldResolver.filedParserManger(bufferContent, fieldConfig, maxFixedPosition))); - } - } - return dataMap; - } - - //数据解析 - @Override - public Map fixDataParser(String protocolId, ByteBuf buffer) { - List dataFieldIdList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Map dataMap = new HashMap<>(); - for (FieldConfig dataField : dataFieldIdList) { - if (!ObjectUtils.isEmpty(dataField.getOrignPosition())) { - Object fieldValue = (Integer) fieldResolver.filedParserManger(buffer, dataField, null); - dataMap.put(dataField.getFieldName(), fieldValue); - } - } - return dataMap; - } - - @Override - public Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf) { - if (ByteBufUtil.hexDump(byteBuf).equals("")) { - return 0; - } - String filterFields = protocolConfig.getTotalLengthFilterField(); - Integer totalLength = 0; - try { - FieldConfig totalFieldConfig = fieldConfigDao.getFieldConfigById(protocolConfig.getTotalLengthId()); - int totalFilterLength = 0; - if (!StringUtils.isEmpty(filterFields)) { - String[] filterFieldList = filterFields.split(","); - for (String filterField : filterFieldList) { - FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(filterField); - //这里都是按字节计算,没有对位进行区分,可能会出现错误 - - // 如果对位有需求,需要进一步跟进 - totalFilterLength += fieldConfig.getOffsetLength(); - } - } - totalLength = (Integer) fieldResolver.filedParserManger(byteBuf, totalFieldConfig, null) + totalFilterLength; - } catch (Exception ex) { - log.error("报文确认分发阶段,获取报文总长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); - } - return totalLength; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer) { - //业务内容 - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - String protocolId = String.valueOf(protocolConfig.getId()); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - //计算固定长度 - Integer fixedLength = calculateLength(fieldConfigList); -// Integer totalLength = this.getTotalLength(protocolConfig, buffer); - //总长度获取 - Integer totalLength = lightText.length(); - //计算固定长度最大长度 - Integer maxFixedPosition = calculatePosition(fieldConfigList); -// buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - //计算数据报文内容 - ByteBuf bizDataFields = buffer.slice(maxFixedPosition-1, (totalLength - fixedLength)); - return bizDataFields; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer) { - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - String protocolId = String.valueOf(protocolConfig.getId()); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer fixedLength = calculateLength(fieldConfigList); -// Integer totalLength = this.getTotalLength(protocolConfig, buffer); - Integer totalLength = lightText.length(); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - ByteBuf fixDataFields = buffer.slice(0, maxFixedPosition); - return fixDataFields; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer) { - String protocolId = String.valueOf(protocolConfig.getId()); - Map fixedPropertyMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer fixedLength = calculateLength(fieldConfigList); - Integer totalLength = this.getTotalLength(protocolConfig, buffer); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - fixedPropertyMap.put("fixedPosition", maxFixedPosition); - fixedPropertyMap.put("totalLength", totalLength); - fixedPropertyMap.put("tailPosition", totalLength - fixedLength + maxFixedPosition); - return fixedPropertyMap; - } - - //分别计算bit和byte长度=> 合并长度 - private Integer calculateLength(List fieldConfigList) { - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (FieldConfig fieldConfig : fieldConfigList) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - Integer fixedLength = bytefixedLength + bitfixedLength / 8; - return fixedLength; - } - - //找到最大值=> 根据最大值计算业务数据下标 - private Integer calculatePosition(List fieldConfigList) { - String rex = "[0-9]+"; - Integer max = -1; - for (FieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOrignPosition()) - && Integer.valueOf(fieldConfig.getOrignPosition()) > max) { - max = Integer.valueOf(fieldConfig.getOrignPosition()); - } - } - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (FieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOrignPosition()) && fieldConfig.getOrignPosition().equals(max)) { - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - } - } - Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; - return maxFixedPosition; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java new file mode 100644 index 0000000..d4ec6c7 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java @@ -0,0 +1,76 @@ +package com.casic.missiles.parser.rule; + +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import org.apache.commons.lang3.StringUtils; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class GenericRuleResolver { + + //根据前置字段的值,找到指定的规则 + //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 + //=>循环判断=>通过规则得到业务字段 + public static RuleConfig machRule(Map fixDataMap, + String ids, + List protocolFieldConfigs, + List ruleConfigs) { + List preRuleConfigList = getPreRuleList(ids, protocolFieldConfigs); + //获取前置规则字段 + final Map metaDataMap = getPreRuleFields(preRuleConfigList, fixDataMap); + //准备固定的字段集合 + Map fixDataFieldMap = getFixDataFieldMap(protocolFieldConfigs); + return RuleResolverCore.doMachRule(ruleConfigs, metaDataMap, fixDataMap, fixDataFieldMap); + } + + private static Map getFixDataFieldMap(List protocolFieldConfigs) { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, ProtocolFieldConfig::getFieldName) + ); + return fixDataFieldMap; + } + + + /** + * 查询前置规则的字段配置 + * + * @param ids + * @return + */ + private static List getPreRuleList(String ids, List protocolFieldConfigs) { + String[] idList = ids.split(","); + Map prepareMaps = new HashMap<>(); + for (String id : idList) { + if (StringUtils.isNotEmpty(id)) { + prepareMaps.put(Long.valueOf(id), ""); + } + } + List preRuleConfigList = protocolFieldConfigs + .stream() + .filter(e -> prepareMaps.containsKey(e.getId())) + .collect(Collectors.toList()); + return preRuleConfigList; + } + + /** + * 获取前置规则解析字段 + */ + private static Map getPreRuleFields(List preRuleFieldConfigList, Map fixDataMap) { + Map ruleFieldMap = new HashMap<>(); + preRuleFieldConfigList.stream() + .forEach( + preRuleFieldConfig -> { + String fieldName = preRuleFieldConfig.getFieldName(); + if (fixDataMap.containsKey(fieldName)) { + ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); + } + } + ); + return ruleFieldMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java new file mode 100644 index 0000000..baae7e8 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -0,0 +1,68 @@ +package com.casic.missiles.parser.rule; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.casic.missiles.pojo.RuleConfig; + +import java.util.*; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleResolverCore { + + + public static RuleConfig doMachRule(List ruleConfigList, Map metaDataMap, + Map fixDataMap, + Map fixDataFieldMap) { + Optional ruleConfigOptional = ruleConfigList.stream() + .filter(ruleConfig -> machRuleConfig( + JSON.parseObject(ruleConfig.getMatchRuleJson(), Map.class), metaDataMap)) + .findFirst(); + if (ObjectUtil.isEmpty(ruleConfigOptional)) { + return null; + } + String[] ruleFields = ruleConfigOptional.get().getDataFieldIds().split(","); + Map ruleMetaDataMap = getRuleFields(ruleFields, fixDataMap, fixDataFieldMap); + //递归选定解析规则,进行规则解析 + if (!ruleConfigOptional.get().getIsFinishMatch().equals("1")) { + //递归选定规则 + doMachRule(ruleConfigList, ruleMetaDataMap, fixDataMap, fixDataFieldMap); + } + return ruleConfigOptional.get(); + } + + + private static Map getRuleFields(String[] preRuleConfigList, Map fixedDataMap, + Map fixedFieldMap) { + Map ruleFieldMap = new HashMap<>(); + for (String preRuleConfigId : preRuleConfigList) { + String fieldName = fixedFieldMap.get(preRuleConfigId); + if (fixedDataMap.containsKey(fieldName)) { + ruleFieldMap.put(fieldName, String.valueOf(fixedDataMap.get(fieldName))); + } + } + return ruleFieldMap; + } + + + //匹配规则配置 + private static Boolean machRuleConfig(Map ruleMap, Map metaDataMap) { + if (ruleMap == null || metaDataMap == null) { + return null; + } + //所有的字段在规则里面必须有有配置 + for (String key : metaDataMap.keySet()) { + if (ruleMap.containsKey(key)) { + if (!ruleMap.get(key).equals(metaDataMap.get(key))) { + return false; + } + } else { + return false; + } + } + return true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java deleted file mode 100644 index 664088d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java +++ /dev/null @@ -1,92 +0,0 @@ -package com.casic.missiles.parser.rule; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.mapper.dao.PreRuleConfigDao; -import com.casic.missiles.mapper.dao.RuleConfigDao; -import lombok.AllArgsConstructor; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.*; -import java.util.stream.Collectors; - -@Service -@AllArgsConstructor -public class RulerProvider { - - private final FieldConfigDao fieldConfigDao; - private final PreRuleConfigDao preRuleConfigDao; - private final RuleConfigDao ruleConfigDao; - - //根据前置字段的值,找到指定的规则 - //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 - //=>循环判断=>通过规则得到业务字段 - public RuleConfig ruleConfig(Map fixDataMap, String protocolId) { - //批量获取规则 - List preRuleConfigList = preRuleConfigDao.getPreRuleList(protocolId); - //获取固定字段 - Map fixFieldMap = getAllFieldMap(protocolId); - //获取前置规则字段 - final String preRuleFields = getPreRuleFields(preRuleConfigList, fixDataMap, fixFieldMap); - List ruleConfigList = ruleConfigDao.getRuleConfigById(protocolId); - Optional ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig ->preRuleFields.equals( ruleConfig.getParseRuleJson())).findFirst(); - //递归选定解析规则,进行规则解析 - while (!ObjectUtil.isEmpty(ruleConfigOptional) && !ruleConfigOptional.get().getIsBizField().equals("1")) { - String ruleFields = getRuleFields(ruleConfigOptional.get().getDataFieldIds().split(","), fixDataMap, fixFieldMap); - ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig -> ruleConfig.getParseRuleJson().equals(ruleFields)).findFirst(); - } - return ruleConfigOptional.get(); - } - - /** - * 获取前置规则解析字段 - */ - private String getPreRuleFields(List preRuleConfigList, Map fixDataMap, Map fixFieldMap) { - Map ruleFieldMap= new HashMap<>(); - preRuleConfigList.stream() - .forEach( - preRuleConfig -> { - String fieldName = fixFieldMap.get(Long.valueOf(preRuleConfig.getRuleFieldId())); - if (fixDataMap.containsKey(fieldName)) { - ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); - } - } - ); - return JSONObject.toJSONString(ruleFieldMap); - } - - private Map getAllFieldMap(String protocolId) { - List fieldList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Map fixFieldMap = fieldList.stream().collect( - Collectors.toMap(FieldConfig::getId, FieldConfig::getFieldName) - ); - return fixFieldMap; - } - - private String getRuleFields(String[] preRuleConfigList, Map fixDataMap, Map fixFieldMap) { - Map ruleFieldMap= new HashMap<>(); - for (String preRuleConfigId : preRuleConfigList) { - String fieldName = fixFieldMap.get(preRuleConfigId); - if (fixDataMap.containsKey(fieldName)) { - ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); - } - } - return JSONObject.toJSONString(ruleFieldMap); - } - - //弃置 - private String ListToString(List ruleFieldList) { - String ruleFields = ""; - for (String ruleField : ruleFieldList) { - ruleFields += ruleField + ","; - } - ruleFields = StringUtils.isEmpty(ruleFields) ? ruleFields : ruleFields.substring(0, ruleFields.length() - 1); - return ruleFields; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java index 6177e10..bfa87a5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java @@ -2,7 +2,7 @@ public interface SafeStrategy { - String decryption(byte[] bytes); + String decryption(String cipher); String encryption(String lightText); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java index 618716c..6236302 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java @@ -9,9 +9,9 @@ //十六进制的字符串转换成字节数组 byte[] bytes = hexStrToBinaryStr(msg); //计算CRC8 - byte crc8 = CRC8(bytes, 0, bytes.length); - String crc8ToStr = "" + Integer.toHexString(0xff & crc8); - return crc8ToStr; +// String crc8ToStr = "" + Integer.toHexString(0xff & crc8); +// return crc8ToStr; + return null; } /** @@ -33,50 +33,5 @@ return bytes; } - /** - * CRC8 校验 多项式 x8+x2+x+1 - * - * @param b - * @param off - * @param len - * @return - */ - public static byte CRC8(final byte[] b, final int off, final int len) { - byte result = 0x00; - for (int i = 0; i < len; i++) { - result = CHECKSUM_TABLE[(result ^ (b[i + off] & 0xFF)) & 0xFF]; - } - return (byte) (result & 0xFFL); - } - - private final static byte[] CHECKSUM_TABLE = {(byte) 0x00, (byte) 0x07, (byte) 0x0e, (byte) 0x09, (byte) 0x1c, (byte) 0x1b, - (byte) 0x12, (byte) 0x15, (byte) 0x38, (byte) 0x3f, (byte) 0x36, (byte) 0x31, (byte) 0x24, (byte) 0x23, (byte) 0x2a, - (byte) 0x2d, (byte) 0x70, (byte) 0x77, (byte) 0x7e, (byte) 0x79, (byte) 0x6c, (byte) 0x6b, (byte) 0x62, (byte) 0x65, - (byte) 0x48, (byte) 0x4f, (byte) 0x46, (byte) 0x41, (byte) 0x54, (byte) 0x53, (byte) 0x5a, (byte) 0x5d, (byte) 0xe0, - (byte) 0xe7, (byte) 0xee, (byte) 0xe9, (byte) 0xfc, (byte) 0xfb, (byte) 0xf2, (byte) 0xf5, (byte) 0xd8, (byte) 0xdf, - (byte) 0xd6, (byte) 0xd1, (byte) 0xc4, (byte) 0xc3, (byte) 0xca, (byte) 0xcd, (byte) 0x90, (byte) 0x97, (byte) 0x9e, - (byte) 0x99, (byte) 0x8c, (byte) 0x8b, (byte) 0x82, (byte) 0x85, (byte) 0xa8, (byte) 0xaf, (byte) 0xa6, (byte) 0xa1, - (byte) 0xb4, (byte) 0xb3, (byte) 0xba, (byte) 0xbd, (byte) 0xc7, (byte) 0xc0, (byte) 0xc9, (byte) 0xce, (byte) 0xdb, - (byte) 0xdc, (byte) 0xd5, (byte) 0xd2, (byte) 0xff, (byte) 0xf8, (byte) 0xf1, (byte) 0xf6, (byte) 0xe3, (byte) 0xe4, - (byte) 0xed, (byte) 0xea, (byte) 0xb7, (byte) 0xb0, (byte) 0xb9, (byte) 0xbe, (byte) 0xab, (byte) 0xac, (byte) 0xa5, - (byte) 0xa2, (byte) 0x8f, (byte) 0x88, (byte) 0x81, (byte) 0x86, (byte) 0x93, (byte) 0x94, (byte) 0x9d, (byte) 0x9a, - (byte) 0x27, (byte) 0x20, (byte) 0x29, (byte) 0x2e, (byte) 0x3b, (byte) 0x3c, (byte) 0x35, (byte) 0x32, (byte) 0x1f, - (byte) 0x18, (byte) 0x11, (byte) 0x16, (byte) 0x03, (byte) 0x04, (byte) 0x0d, (byte) 0x0a, (byte) 0x57, (byte) 0x50, - (byte) 0x59, (byte) 0x5e, (byte) 0x4b, (byte) 0x4c, (byte) 0x45, (byte) 0x42, (byte) 0x6f, (byte) 0x68, (byte) 0x61, - (byte) 0x66, (byte) 0x73, (byte) 0x74, (byte) 0x7d, (byte) 0x7a, (byte) 0x89, (byte) 0x8e, (byte) 0x87, (byte) 0x80, - (byte) 0x95, (byte) 0x92, (byte) 0x9b, (byte) 0x9c, (byte) 0xb1, (byte) 0xb6, (byte) 0xbf, (byte) 0xb8, (byte) 0xad, - (byte) 0xaa, (byte) 0xa3, (byte) 0xa4, (byte) 0xf9, (byte) 0xfe, (byte) 0xf7, (byte) 0xf0, (byte) 0xe5, (byte) 0xe2, - (byte) 0xeb, (byte) 0xec, (byte) 0xc1, (byte) 0xc6, (byte) 0xcf, (byte) 0xc8, (byte) 0xdd, (byte) 0xda, (byte) 0xd3, - (byte) 0xd4, (byte) 0x69, (byte) 0x6e, (byte) 0x67, (byte) 0x60, (byte) 0x75, (byte) 0x72, (byte) 0x7b, (byte) 0x7c, - (byte) 0x51, (byte) 0x56, (byte) 0x5f, (byte) 0x58, (byte) 0x4d, (byte) 0x4a, (byte) 0x43, (byte) 0x44, (byte) 0x19, - (byte) 0x1e, (byte) 0x17, (byte) 0x10, (byte) 0x05, (byte) 0x02, (byte) 0x0b, (byte) 0x0c, (byte) 0x21, (byte) 0x26, - (byte) 0x2f, (byte) 0x28, (byte) 0x3d, (byte) 0x3a, (byte) 0x33, (byte) 0x34, (byte) 0x4e, (byte) 0x49, (byte) 0x40, - (byte) 0x47, (byte) 0x52, (byte) 0x55, (byte) 0x5c, (byte) 0x5b, (byte) 0x76, (byte) 0x71, (byte) 0x78, (byte) 0x7f, - (byte) 0x6a, (byte) 0x6d, (byte) 0x64, (byte) 0x63, (byte) 0x3e, (byte) 0x39, (byte) 0x30, (byte) 0x37, (byte) 0x22, - (byte) 0x25, (byte) 0x2c, (byte) 0x2b, (byte) 0x06, (byte) 0x01, (byte) 0x08, (byte) 0x0f, (byte) 0x1a, (byte) 0x1d, - (byte) 0x14, (byte) 0x13, (byte) 0xae, (byte) 0xa9, (byte) 0xa0, (byte) 0xa7, (byte) 0xb2, (byte) 0xb5, (byte) 0xbc, - (byte) 0xbb, (byte) 0x96, (byte) 0x91, (byte) 0x98, (byte) 0x9f, (byte) 0x8a, (byte) 0x8d, (byte) 0x84, (byte) 0x83, - (byte) 0xde, (byte) 0xd9, (byte) 0xd0, (byte) 0xd7, (byte) 0xc2, (byte) 0xc5, (byte) 0xcc, (byte) 0xcb, (byte) 0xe6, - (byte) 0xe1, (byte) 0xe8, (byte) 0xef, (byte) 0xfa, (byte) 0xfd, (byte) 0xf4, (byte) 0xf3}; } \ No newline at end of file diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java index 27c2838..6e078a3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java @@ -1,9 +1,6 @@ package com.casic.missiles.parser.safe.impl; -import cn.hutool.core.util.CharsetUtil; -import cn.hutool.crypto.symmetric.SM4; -import cn.hutool.crypto.symmetric.SymmetricCrypto; - +import com.casic.missiles.parser.safe.SafeStrategy; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; @@ -11,19 +8,44 @@ import org.bouncycastle.crypto.engines.SM4Engine; import org.bouncycastle.crypto.params.KeyParameter; import org.bouncycastle.util.encoders.Hex; - -import static cn.hutool.crypto.Mode.ECB; -import static cn.hutool.crypto.Padding.NoPadding; +import org.springframework.stereotype.Component; /** * SM4算法工具类 */ @Slf4j -public class Sm4 { +@Component("sm4") +public class Sm4 implements SafeStrategy { //加解密的字节快大小 public static final int BlockSize = 16; + @Override + public String decryption(String cipher) { + byte[] keyByte = { + 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 + }; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(keyByte); + byte[] in = Hex.decode(cipher); + byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); + String plain = EcbDecrypt(in, keyBytes); + return plain; + } + + @Override + public String encryption(String cipher) { + byte[] keyByte = { + 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 + }; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(keyByte); + byte[] in = Hex.decode(cipher); + byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); + String plain = EcbDecrypt(in, keyBytes); + return plain; + } + /** * SM4ECB加密算法,对内 * @@ -32,8 +54,6 @@ * @return */ private static byte[] ecb_encrypt(byte[] in, byte[] keyBytes) { - - SM4Engine sm4Engine = new SM4Engine(); sm4Engine.init(true, new KeyParameter(keyBytes)); byte[] out = new byte[in.length]; @@ -58,27 +78,6 @@ return cipher; } - - /** - * hutool 解密SM4 - * - * @param encodeContent - * @return - */ - public static String decode(String encodeContent) { - String key = "24ad182507479a5da3ad94d9d78ea203"; - try { - SymmetricCrypto sm4 = new SM4(ECB, NoPadding, key.getBytes()); - String decryptStr = sm4.decryptStr(encodeContent, CharsetUtil.CHARSET_UTF_8); - return decryptStr; - } catch (Exception e) { - e.printStackTrace(); - log.error("SM4解密失败"); - } - return null; - } - - /** * SM4的ECB加密算法 * @@ -129,20 +128,6 @@ return plain; } - /** - * SM4的ECB解密算法 - * - * @param cipher 输入的密文字符串 - * @param key 密钥 - * @return - */ - public static String EcbDecrypt(String cipher, String key) { - byte[] in = Hex.decode(cipher); - byte[] keyBytes = Hex.decode(key); - - String plain = EcbDecrypt(in, keyBytes); - return plain; - } /** * 主函数 @@ -151,28 +136,24 @@ */ public static void main(String[] args) { byte[] ciphertext = { + 0x4B, (byte) 0x8C, (byte) 0x9D, 0x08, (byte) 0xE4, (byte) 0xD3, 0x64, 0x42, (byte) 0xB9, (byte) 0xA5, (byte) 0xFE, (byte) 0xCD, (byte) 0x91, 0x1B, 0x38, (byte) 0xAC, (byte) 0xE9, 0x1C, (byte) 0xCD, 0x53, 0x02, (byte) 0xD7, 0x0C, (byte) 0x9B, (byte) 0x96, 0x30, 0x62, (byte) 0xE8, (byte) 0xFB, (byte) 0xEF, (byte) 0xB9, (byte) 0xFF, (byte) 0xDE, 0x19, (byte) 0x80, 0x35, 0x3E, (byte) 0x90, 0x4F, 0x2F, 0x12, 0x2B, 0x19, (byte) 0x8B, 0x6C, 0x7A, (byte) 0x85, (byte) 0xA1, (byte) 0xB1, (byte) 0x86, (byte) 0xA3, 0x7A, 0x46, 0x0C, 0x2F, (byte) 0x94, 0x4F, 0x7F, 0x2C, 0x56, 0x14, (byte) 0xF3, (byte) 0x89, (byte) 0xC3, - 0x3F, 0x20, (byte) 0xF9, (byte) 0x87, (byte) 0xA1, 0x60, (byte) 0xD9, (byte) 0xA8, (byte) 0xFD, (byte) 0xD7, (byte) 0x9B, 0x4B, 0x26, 0x06, 0x30, 0x44}; + 0x3F, 0x20, (byte) 0xF9, (byte) 0x87, (byte) 0xA1, 0x60, (byte) 0xD9, (byte) 0xA8, (byte) 0xFD, (byte) 0xD7, (byte) 0x9B, 0x4B, 0x26, 0x06, 0x30, 0x44 + }; ByteBuf in = ByteBufAllocator.DEFAULT.heapBuffer(); in.writeBytes(ciphertext); - byte[] keyByte = { 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 }; ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); - key.writeBytes(ciphertext); - String resCipherData = decode(ByteBufUtil.hexDump(in)); - ByteBuf out = ByteBufAllocator.DEFAULT.heapBuffer(); -// out.writeBytes(resCipherData); -// System.out.println(hexBytes); - System.out.println(resCipherData.toString()); -// String resPlainData = EcbDecrypt(resCipherData, key); -// System.out.println("原始明文:" + data); -// System.out.println("解密后明文:" + resPlainData); + key.writeBytes(keyByte); +// String resCipherData = EcbDecrypt(ByteBufUtil.hexDump(in), ByteBufUtil.hexDump(key)); +// System.out.println(resCipherData); } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java index 1395a51..ac5f957 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java @@ -1,7 +1,7 @@ package com.casic.missiles.parser.safe.impl; import io.netty.buffer.ByteBufUtil; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** *

@@ -14,9 +14,8 @@ * @author hyl * @version v1.0: Tea.java, v 0.1 2021/3/12 13:48 $ */ -@Service("tea") -///tea算法类 - +//tea算法类 +@Component("tea") public class Tea { public static byte[] MyTea_Encrypt(byte[] MyTeaContent, int ByteLen, byte[] MyTeakey) { @@ -99,7 +98,6 @@ // for(int i32Index = 0; i32Index < 8; i32Index++) { // System.out.print("0x" + Integer.toHexString(MyContent[i32Index]) + " "); // } - // System.out.println("密钥为:"); // for(int i32Index = 0; i32Index < 16; i32Index++) { // System.out.print("0x" + Integer.toHexString(MyKeys[i32Index]) + " "); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java index bdd0721..bd1516a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java @@ -3,7 +3,7 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.parser.sender.DataSubscribeProvider; import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponents; import org.springframework.web.util.UriComponentsBuilder; @@ -12,7 +12,7 @@ import java.util.Collections; import java.util.Map; -@Service("functionCallback") +@Component("functionCallback") public class FunctionCallback implements DataSubscribeProvider { @Resource diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java index 0b44fb9..7526de2 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.Map; -@Service("middleware") +@Component("middleware") public class MiddlewareSubscribe implements DataSubscribeProvider { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java index 5dcee3f..e2f1192 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.Map; -@Service("nosql") +@Component("nosql") public class NoSqlSubscribe implements DataSubscribeProvider { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java b/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java new file mode 100644 index 0000000..81a5324 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java @@ -0,0 +1,86 @@ +package com.casic.missiles.pojo; + +import lombok.Data; + +/** + * 协议 + */ +@Data +public class Msg { + + /** + * 前导码 + */ + private String preamble; + + /** + * 版本号 + */ + private String version; + + /** + * 内容长度 + */ + private int leng; + + /** + * 设备ID + */ + private String deviceId; + + /** + * 通讯方式 + */ + private Integer connType; + + /** + * 加密方式 + */ + private Integer encryType; + + /** + * 目标地址 + */ + private String destAddr; + + /** + * PDUType + */ + private String PDUType; + + /** + * 操作类型 + */ + private Integer operateType; + + /** + * 传输控制位 PDUType.bit7=0时,表示存在后续的访问;当PDUType.bit7=1时,表示无后续的访问。 + */ + private Integer transControlFlag; + + /** + * 设备类型 + */ + private Integer deviceType; + + /** + * 序号 + */ + private Integer seq; + + /** + * tagList + */ + private String tagList; + + /** + * OidList + */ + private String OidList; + + /** + * CRC + */ + private String CRC; + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java index 40a5265..97cc984 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java @@ -40,7 +40,7 @@ String httpContent = msg.toString(Charset.defaultCharset()); log.info(" String : " + msg.toString(Charset.defaultCharset())); String majorContent = httpContent.substring(httpContent.indexOf("{"), httpContent.lastIndexOf("}") + 1); - String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("serviceData")).get("Value")); + String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("RegistryData")).get("Value")); log.info("----------------------------------" + values); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); bufferContent.writeBytes(values.getBytes(Charset.forName("ISO-8859-1"))); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java index 1b132a7..e3ced4b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java @@ -35,7 +35,7 @@ String httpContent = msg.toString(Charset.defaultCharset()); log.info(" String : " + msg.toString(Charset.defaultCharset())); String majorContent = httpContent.substring(httpContent.indexOf("{"), httpContent.lastIndexOf("}") + 1); - String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("serviceData")).get("Value")); + String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("RegistryData")).get("Value")); log.info("----------------------------------" + values); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); bufferContent.writeBytes(values.getBytes(Charset.forName("ISO-8859-1"))); diff --git a/sensorhub-core/src/main/resources/application.properties b/sensorhub-core/src/main/resources/application.properties deleted file mode 100644 index 8b13789..0000000 --- a/sensorhub-core/src/main/resources/application.properties +++ /dev/null @@ -1 +0,0 @@ - diff --git a/sensorhub-core/src/main/resources/config/application-dev.yml b/sensorhub-core/src/main/resources/config/application-dev.yml index 4f897a8..dcc4c2d 100644 --- a/sensorhub-core/src/main/resources/config/application-dev.yml +++ b/sensorhub-core/src/main/resources/config/application-dev.yml @@ -4,9 +4,9 @@ spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true + url: jdbc:mysql://127.0.0.1:3306/sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true username: root - password: Casic203 + password: root session: store-type: redis redis: diff --git a/sensorhub-core/src/main/resources/config/application.yml b/sensorhub-core/src/main/resources/config/application.yml index ae89f9d..7965da1 100644 --- a/sensorhub-core/src/main/resources/config/application.yml +++ b/sensorhub-core/src/main/resources/config/application.yml @@ -30,6 +30,13 @@ port: 6379 password: ew5T4K3#203lwh config-prefix: 'Casic:' +#代码生成器配置 +code: + generate: + #作者 + author: cz + #待生成对象表名 + table-name: bussiness_field_config,combined_field_config sensorhub: config: port: 7091 diff --git a/sensorhub-support/pom.xml b/sensorhub-support/pom.xml index 9a71296..761601c 100644 --- a/sensorhub-support/pom.xml +++ b/sensorhub-support/pom.xml @@ -42,6 +42,12 @@ ${redis.version} + + com.baomidou + mybatis-plus-generator + ${mybatis-plus-generator.version} + + org.reflections diff --git a/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java b/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java new file mode 100644 index 0000000..515ca53 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java @@ -0,0 +1,14 @@ +package com.casic.missiles.enums; + +/** + * @author + * @date + */ +public interface FixedPropertyEnum { + + String FIXED_POSITION = "fixedPosition"; + + String TOTAL_LENGTH = "totalLength"; + + String TAIL_POSITION = "tailPosition"; +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/CombinedFieldMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CombinedFieldMapper.java new file mode 100644 index 0000000..38e8f42 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CombinedFieldMapper.java @@ -0,0 +1,15 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.CombinedFieldConfig; +import org.apache.ibatis.annotations.Mapper; + +/** + * @author cz + * + */ +@Mapper +public interface CombinedFieldMapper extends BaseMapper { + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java new file mode 100644 index 0000000..128b09d --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java @@ -0,0 +1,10 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.CommandEventConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface CommandEventMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java new file mode 100644 index 0000000..042eb3c --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.DatagramEventConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface DatagramEventConfigMapper extends BaseMapper { +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java new file mode 100644 index 0000000..fc95cf4 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java @@ -0,0 +1,8 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.FieldConfig; + +public interface FieldConfigMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldRuleConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldRuleConfigMapper.java new file mode 100644 index 0000000..b310a08 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldRuleConfigMapper.java @@ -0,0 +1,10 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.FieldRuleConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface FieldRuleConfigMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java new file mode 100644 index 0000000..9060a69 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.ProtocolConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface ProtocolConfigMapper extends BaseMapper { +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolFieldConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolFieldConfigMapper.java new file mode 100644 index 0000000..1b47180 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolFieldConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +public interface ProtocolFieldConfigMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java new file mode 100644 index 0000000..6fa6936 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.RuleConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface RuleConfigMapper extends BaseMapper { +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/AbstractFieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/AbstractFieldConfig.java new file mode 100644 index 0000000..ba9aea2 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/AbstractFieldConfig.java @@ -0,0 +1,38 @@ +package com.casic.missiles.pojo; + +import lombok.Data; + +@Data +public class AbstractFieldConfig { + /** + * 字段名称 + */ + private String fieldName; + /** + * 按照字段评估进行字段解析 + */ + private String ruleJson; + /** + * 起始位置(单位byte) + */ + private Integer OriginPositionByte; + /** + * 起始位置,是否需要bit位置(单位bit)小于8, 没有不需要填写 + */ + private String OriginPositionBit; + /** + * 偏移长度 + */ + private Integer offsetLength; + /** + * 偏移单位(bit/byte) + */ + private String offsetUnit; + /** + * 是否需要转存 + */ + private Integer isStorage; + + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/CombinedFieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/CombinedFieldConfig.java new file mode 100644 index 0000000..4f4de6a --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/CombinedFieldConfig.java @@ -0,0 +1,41 @@ +package com.casic.missiles.pojo; + +import lombok.Data; + +import java.util.Date; + +/** + * 组合配置 + * + * @author cz + * @date 20 + */ +@Data +public class CombinedFieldConfig { + + private Long id; + private Long ruleId; + /** + * 前缀编码 + */ + private String prefixCode; + + /** + * 字段动态的id + */ + private Long dynamicLengthId; + /** + * 对应的要解析字段的ids + */ + private String dataFieldIds; + + /** + * 字段动态的id + */ + private String combinedFieldIds; + + private Date lastTime; + + private Date createTime; + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldConfig.java index a07d20d..8304dc6 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldConfig.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldConfig.java @@ -5,31 +5,28 @@ import java.util.Date; +/** + * @author cz + * 1、该表与实际解析的内容实例解析有关 + * 2、该表字段是随机出现的,和帧结构无关,无法预料的 + * 3、该表字段解析根据FieldEvaluatorConfig进行字段解析 + */ @Data -@TableName("field_config") -public class FieldConfig { +@TableName("business_field_config") +public class FieldConfig extends AbstractFieldConfig { private Long id; -// private String preFieldConfig; - private Long protocolId; - - private String isFixed; - private String uploadDeliveryChange; - - private String replyRule; - private String ruleJson; - + /** + * 协议配置id + */ + private Long ruleId; + /** + * 字段名称 + */ private String fieldName; - private String isStorage; - private Integer orignPosition; - private String exactOrignPosition; - - private Integer offsetLength; - private String offsetUnit; private String ownerId; private Date createTime; private Date lastTime; - } diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldRuleConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldRuleConfig.java new file mode 100644 index 0000000..2e09879 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldRuleConfig.java @@ -0,0 +1,20 @@ +package com.casic.missiles.pojo; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +@TableName("field_rule_config") +@Data +public class FieldRuleConfig { + + private Long id; + private String name; + private String desc; + private String condition; + private String excuteOperation; + private Date lasTime; + private Date createTime; + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/Msg.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/Msg.java deleted file mode 100644 index 81a5324..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/Msg.java +++ /dev/null @@ -1,86 +0,0 @@ -package com.casic.missiles.pojo; - -import lombok.Data; - -/** - * 协议 - */ -@Data -public class Msg { - - /** - * 前导码 - */ - private String preamble; - - /** - * 版本号 - */ - private String version; - - /** - * 内容长度 - */ - private int leng; - - /** - * 设备ID - */ - private String deviceId; - - /** - * 通讯方式 - */ - private Integer connType; - - /** - * 加密方式 - */ - private Integer encryType; - - /** - * 目标地址 - */ - private String destAddr; - - /** - * PDUType - */ - private String PDUType; - - /** - * 操作类型 - */ - private Integer operateType; - - /** - * 传输控制位 PDUType.bit7=0时,表示存在后续的访问;当PDUType.bit7=1时,表示无后续的访问。 - */ - private Integer transControlFlag; - - /** - * 设备类型 - */ - private Integer deviceType; - - /** - * 序号 - */ - private Integer seq; - - /** - * tagList - */ - private String tagList; - - /** - * OidList - */ - private String OidList; - - /** - * CRC - */ - private String CRC; - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/PreRuleConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/PreRuleConfig.java deleted file mode 100644 index bfcf914..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/PreRuleConfig.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.casic.missiles.pojo; - -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -import java.util.Date; - -@Data -@TableName("pre_rule_config") -public class PreRuleConfig { - - private Long id; - private String protocolId; - private String ruleFieldId; - private String ownerId; - private Date createTime; - private Date lastTime; -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolConfig.java index 274ad42..bdac11f 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolConfig.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolConfig.java @@ -5,18 +5,52 @@ import java.util.Date; +/** + * 协议配置表,协议配置与帧结构有关 + * 1、层级关系,协议之后是规则,规则对应设备类型的各种上数规则 + * 2、规则对应协议配置的实例流程 + * 3、每种可根据设备类型和操作类型进行上数规则进行区分 + */ @Data @TableName("protocol_config") public class ProtocolConfig { private Long id; + /** + * 前导码 + */ private String preFix; - private String unpackId; - private String totalLengthId; - private String totalLengthFilterField; + /** + * 拆包id + */ + private Long unpackId; + /** + * 总长度id + */ + private Long totalLengthId; + /** + * + */ + private String totalLengthFilterFields; + /** + * 动态长度ids + */ private String dynamicLengthId; + /** + * 动态长度json(预留字段) + */ private String dynamicLengthJson; - private String tailStr; + /** + * 规则字段所解析预准备的字段 + */ + private String rulePrepareFields; + /** + * 结尾标志 + */ + private Long tailStr; + /** + * 备注 + */ private String remark; private String ownerId; private Date createTime; diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolFieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolFieldConfig.java new file mode 100644 index 0000000..db794bd --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolFieldConfig.java @@ -0,0 +1,43 @@ +package com.casic.missiles.pojo; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +/** + * 协议字段配置表 + * 该表用户存放帧结构固定格式的字段 + * 有以下两个用途 + * (1)、固定格式的字段可用于规则匹配 + * (2)、固定格式的字段可用于报文回复 + * @author cz + * @date 2023-06-09 + */ +@Data +@TableName("protocol_field_config") +public class ProtocolFieldConfig extends AbstractFieldConfig{ + + private Long id; + /** + * 协议配置id + */ + private Long protocolId; + /** + * 上传下发是否有变化, 没有变化,可以直接组装 + */ + private String isReplyFix; + /** + * 按照字段评估进行字段解析 + */ + private Long fieldEvaluatorId; + /** + * 回复规则 + */ + private String replyRule; + + private String ownerId; + private Date createTime; + private Date lastTime; + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java index 3b53493..febf835 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java @@ -6,18 +6,40 @@ import java.util.Date; /** - * 加密字段解析和规则有关,事件调到该流程下面 + * @author cz + * todo: 匹配协议对应业务实例 + * 1、一个协议可以多种的流程规则 + * 2、规则可以支持递归规则流程 */ @Data @TableName("rule_config") public class RuleConfig { - private Long id; private String protocolId; - private String isBizField; - private String parseRuleJson; + /** + * 是否完成规则配置,没有完成, + * 则需要根据规则继续匹配 + */ + private String isFinishMatch; + /** + * 待匹配解析规则 + * {“data_field”:"data_value"} + */ + private String matchRuleJson; + /** + * 待解析字段ids + */ private String dataFieldIds; - private String aviatorFilterJson; + + /** + * 待解析组合字段ids + */ + private String combinedFieldIds; + + /** + * aviator + */ + private String conditionExpression; private Date createTime; private Date lastTime; } diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleDict.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleDict.java deleted file mode 100644 index cc7f389..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleDict.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.casic.missiles.pojo; - -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -@Data -@TableName("rule_dict") -public class RuleDict { - - private Long id; - private Long pid; - private String name; - private String code; - private String ownerId; - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleEvaluator.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleEvaluator.java deleted file mode 100644 index ed16610..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleEvaluator.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.pojo; - -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -import java.util.Date; - -@TableName("rule_evaluator") -@Data -public class RuleEvaluator { - - private Long id; - private String name; - private String desc; - private String condition; - private String excuteOperation; - private Date lasTime; - private Date createTime; - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/CombinedFieldConfigRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/CombinedFieldConfigRegistry.java new file mode 100644 index 0000000..fa59b90 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/CombinedFieldConfigRegistry.java @@ -0,0 +1,12 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.CombinedFieldConfig; + +import java.util.List; + +public interface CombinedFieldConfigRegistry { + + List getCombinedFieldConfigList(Long ruleId); + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/CommandEventRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/CommandEventRegistry.java new file mode 100644 index 0000000..fb97d87 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/CommandEventRegistry.java @@ -0,0 +1,8 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.CommandEventConfig; + +public interface CommandEventRegistry { + + CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName); +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java index 608af3a..32cc8a4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java @@ -2,48 +2,47 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.delivery.decorator.ByteDecorator; +import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @AllArgsConstructor public class FieldDecoratorManger { - private final RuleDictDao ruleDictDao; + private final RuleConfigRegistry ruleDictDao; // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 // (1)静态的业务字段是字典里面可以配置的 // (2)动态的业务字段是通过规则生成的 public String contentMerge(String ruleJson, String sceneConent, String dynamicContent) { - List ruleDictList = ruleDictDao.getRuleDictConfig(); - Map ruleDictMap = ruleDictList.stream().collect( - Collectors.toMap(RuleDict::getId, e -> e)); - List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); - for (Map ruleMap : ruleMapList) { - String ruleType = String.valueOf(ruleMap.get("ruleType")); - ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); - NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); - byteDecorator.nodeDecoratorRule(nodeDecoratorParm); - } +// List ruleDictList = ruleDictDao.getRuleDictConfig(); +// Map ruleDictMap = ruleDictList.stream().collect( +// Collectors.toMap(RuleDict::getId, e -> e)); +// List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); +// for (Map ruleMap : ruleMapList) { +// String ruleType = String.valueOf(ruleMap.get("ruleType")); +// ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); +// NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); +// byteDecorator.nodeDecoratorRule(nodeDecoratorParm); +// } return null; } - - private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { - NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() - .contents(sceneConent) - .dynamicContent(dynamicContent) - .ruletypeId(ruletypeId) - .ruleDictMap(ruleDictMap) - .build(); - return nodeDecoratorParm; - } +// +// private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { +// NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() +// .contents(sceneConent) +// .dynamicContent(dynamicContent) +// .ruletypeId(ruletypeId) +// .ruleDictMap(ruleDictMap) +// .build(); +// return nodeDecoratorParm; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java index 652970c..b204ac3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java @@ -1,56 +1,56 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@AllArgsConstructor -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", - JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Component; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Component("logicalDecorator") +//@AllArgsConstructor +//@Slf4j +//public class LogicalShiftDecorator implements ByteDecorator { +// +//// private final FieldRuleEngineMapper fieldRuleEngineMapper; +//// +//// //字节位移 +//// @Override +//// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +//// String logicalValue = ""; +//// RuleEvaluator fieldRuleEngine = new RuleEvaluator(); +//// try { +//// Map env2 = new HashMap(); +//// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +//// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +//// for (String contentId : contentIdList) { +//// RuleDict ruleDict = ruleDictMap.get(contentId); +//// if (ruleDict.getCode().contains("#")) { +//// //使用动态的值 +//// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +//// } +//// env2.put(ruleDict.getName(), ruleDict.getCode()); +//// } +//// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +//// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +//// return null; +//// } +//// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +//// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +//// return values; +//// } catch (Exception ex) { +//// log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", +//// JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +//// return null; +//// } +//// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java index 346468f..822fead 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@AllArgsConstructor -@Slf4j -public class OperationDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("optionDecorator") +//@AllArgsConstructor +//@Slf4j +//public class OperationDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //混合运算,有常量或者乘除的缩放 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java index 50fb0a7..7a8bccb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@AllArgsConstructor -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +////精度计算 +//@AllArgsConstructor +//@Registry("precisionDecorator") +//@Slf4j +//public class PrecisionDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java index da39235..27f9cc7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java @@ -1,54 +1,53 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@AllArgsConstructor -@Slf4j -public class RuleDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("ruleDecorator") +//@AllArgsConstructor +//@Slf4j +//public class RuleDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //吃我一套正则表达式 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (Exception ex) { +// log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java index 7f5cbf3..c043f97 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java @@ -2,6 +2,6 @@ import java.util.Map; -public interface ComandeEventService { +public interface ComandeEventService{ Map loadComandeEventConfig(String protocolId,String scene); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java index 476ad84..aaf1837 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java @@ -2,46 +2,46 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.dao.CommandEventDao; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @Slf4j @AllArgsConstructor -public class ComandeEventServiceImpl implements ComandeEventService { +public class ComandeEventServiceImpl implements ComandeEventRegistry { - private final CommandEventDao commandEventDao; + // private final CommandEventDao commandEventDao; // 加密bean 固定字段出现变化的字段解析,业务字段的有序内容 @Override - public Map loadComandeEventConfig(String protocolId,String sceneName) { - CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); - if (ObjectUtil.isEmpty(commandEventConfig)) { - log.error("协议{},没有配置成功接收回复配置,清排查原因"); - return null; - } - String replyJson = commandEventConfig.getReplyContentJson(); - List> replyMapList = JSONArray.parseObject(replyJson, List.class); - List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); - Map fixMap = fixList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); - List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) - .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) - .collect(Collectors.toList()); - Map commandConfigMap = new HashMap<>(); - commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); - commandConfigMap.put("fixContent", fixMap); - commandConfigMap.put("bizContent", contentList); - return commandConfigMap; + public Map loadComandeEventConfig(String protocolId, String sceneName) { +// CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); +// if (ObjectUtil.isEmpty(commandEventConfig)) { +// log.error("协议{},没有配置成功接收回复配置,清排查原因"); +// return null; +// } +// String replyJson = commandEventConfig.getReplyContentJson(); +// List> replyMapList = JSONArray.parseObject(replyJson, List.class); +// List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); +// Map fixMap = fixList.stream() +// .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); +// List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) +// .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) +// .collect(Collectors.toList()); +// Map commandConfigMap = new HashMap<>(); +// commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); +// commandConfigMap.put("fixContent", fixMap); +// commandConfigMap.put("bizContent", contentList); +// return commandConfigMap; + return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 128b09d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java deleted file mode 100644 index 4016b0b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface DatagramEventMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java deleted file mode 100644 index 597c306..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.apache.ibatis.annotations.Mapper; - -public interface FieldConfigMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java deleted file mode 100644 index a31680a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.PreRuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface PreRuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java deleted file mode 100644 index 9060a69..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface ProtocolConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java deleted file mode 100644 index 6fa6936..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java deleted file mode 100644 index 582a705..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleDict; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleDictMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java deleted file mode 100644 index 6e302c8..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.CommandEventMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Optional; - -@Component -public class CommandEventDao { - - @Resource - private CommandEventMapper commandEventMapper; - - public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId) - .eq("scene", sceneName) - .eq("enabled", 1); - List commandEventConfig = commandEventMapper.selectList(queryWrapper); - Optional optionalEventConfig = commandEventConfig.stream().findFirst(); - return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java deleted file mode 100644 index 9137e4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.FieldConfigMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class FieldConfigDao { - - @Resource - private FieldConfigMapper fieldConfigMapper; - - public FieldConfig getFieldConfigById(String fieldId) { - FieldConfig fieldConfig = fieldConfigMapper.selectById(fieldId); - return fieldConfig; - } - - public List getFieldConfigs(String protocolId,Integer isFixed) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",isFixed); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - - public List getStorageFieldConfig(String protocolId) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",1) - .eq("is_storage",1); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java deleted file mode 100644 index 67bff6b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.mapper.PreRuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class PreRuleConfigDao { - - @Resource - private PreRuleConfigMapper preRuleConfigMapper; - - public List getPreRuleList(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return preRuleConfigMapper.selectList(queryWrapper); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java deleted file mode 100644 index d69ea85..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.RuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleConfigDao { - - @Resource - private RuleConfigMapper ruleConfigMapper; - - public RuleConfig getNextRuleConfig(String ruleFields) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("parse_rule_json", ruleFields); - return ruleConfigMapper.selectOne(queryWrapper); - } - - - public List getRuleConfigById(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return ruleConfigMapper.selectList(queryWrapper); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java deleted file mode 100644 index 932c185..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.RuleDictMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleDictDao { - - @Resource - private RuleDictMapper ruleDictMapper; - - public List getRuleDictConfig() { - List ruleDictList = ruleDictMapper.selectList(null); - return ruleDictList; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java index 9f9e279..43bc4d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java @@ -10,20 +10,15 @@ import io.netty.channel.socket.nio.NioServerSocketChannel; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import javax.annotation.PreDestroy; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static cn.hutool.core.util.ClassUtil.getClasses; /** * SensorhubServer netty服务端 */ @Slf4j -@Service +@Component public class SensorhubServer { /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java index 2c79ff5..9a28c36 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java @@ -11,13 +11,13 @@ import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioSocketChannel; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClient 客户端 */ @Slf4j -@Service +@Registry public final class SensorhubClient { public static void main(String[] args) throws Exception { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java index 9774be0..477c3f7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java @@ -6,12 +6,12 @@ import io.netty.channel.socket.SocketChannel; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientChannelInitialHandler */ -@Service +@Registry public class SensorhubClientChannelInitialHandler extends ChannelInitializer { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java index 346f4b3..73560e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java @@ -5,13 +5,13 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientHandler */ @Slf4j -@Service +@Registry public class SensorhubClientHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java index 5c1c6f2..d990af5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java @@ -4,12 +4,12 @@ import com.casic.missiles.pojo.Msg; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** * SensorhubServerHandler */ -@Service +@Component public class SensorhubServerHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 67283ae..af3172c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,41 +1,37 @@ package com.casic.missiles.parser; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultProtocolConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.*; +import com.casic.missiles.registry.FieldConfigRegistry; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; -import java.nio.charset.Charset; import java.util.HashMap; import java.util.List; import java.util.Map; -@Service("genericProtocolParser") +/** + * @author + */ +@Component("genericProtocolParser") @Slf4j -@AllArgsConstructor +@RequiredArgsConstructor public class GenericProtocolParser implements ProtocolParser { - private final LeadingCodeMatcher leadingCodeMatcher; private final List frameStructDispenserList; - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorInstanceSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; // 匹配首字母前导码=> 帧结构匹配前导码=> // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 @@ -44,18 +40,19 @@ public Boolean doParseProtocol(ByteBuf byteBuf) { String protocolContent = ByteBufUtil.hexDump(byteBuf); //匹配前导码 - List preCodeConfigs = leadingCodeMatcher.matchLeadingCode(protocolContent); + List preCodeConfigs = LeadingCodeMatcher.matchFrameLeadingCode(protocolContent); //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 if (preCodeConfigs.size() == 0) { - return rematch(byteBuf,protocolContent); + return rematch(byteBuf, protocolContent); } - //暂时先取第一个 + //暂时先取第一个,提升速度,使用享元模式, 减少类的创建销毁与构建 ProtocolConfig protocolConfig = preCodeConfigs.get(0); + AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); ByteBuf wholeDatagramByte = null; //通过匹配帧结构获取完整的数据包 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, preCodeConfigs.get(0))) != null) { + if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, protocolFactory)) != null) { break; } } @@ -68,76 +65,78 @@ * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 */ - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId, wholeDatagramByte); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap, protocolId); - //选取规则对应的流程实例 - DatagramEventConfig datagramEventConfig = processorInstanceSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); + //进行规则字段解析,进行匹配规则 + RuleConfig ruleConfig = getRuleConfig(protocolFactory, wholeDatagramByte); + if (ruleConfig == null) { + return false; + } //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, wholeDatagramByte); + ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte); + //以下进行业务的规则解析,同时选定流程实例 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); + DatagramEventProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain, + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText, protocolId); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain); //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); + datagramEventProvider.storeData(bizDataMap); return true; } - private Boolean rematch(ByteBuf byteBuf,String protocolContent) { + /** + * 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 + */ + private Boolean rematch(ByteBuf byteBuf, String protocolContent) { //重置位判断 byteBuf.resetReaderIndex(); //判断重置是否前移,如果没有前移,则直接判为匹配失败 if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { return false; } else { + //递归执行 return doParseProtocol(byteBuf); } } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; + //获取匹配规则->匹配规则 + private RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + //取出其中参与逻辑provider并判空 + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); + String rulePrepareFields = protocolConfig.getRulePrepareFields(); + //固定字段 + if (StringUtils.isNotEmpty(rulePrepareFields)) { + //获取统一固定字段解析 + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + //获取该协议的字段配置,用于协议规则匹配 + List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); + //获取规则 + RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, + rulePrepareFields, protocolFieldConfigs); + return ruleConfig; + } + return null; } - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + //数据构建,获取固定字段的store和业务字段store + private Map buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + Map bizDataMap = new HashMap<>(); + Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); + Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); + bizDataMap.putAll(ruleStoreObjectMap); + bizDataMap.putAll(protocolStoreObjectMap); return bizDataMap; } - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java index 8a46e32..16ce2e5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java @@ -3,6 +3,7 @@ import io.netty.buffer.ByteBuf; public interface ProtocolParser { + Boolean doParseProtocol(ByteBuf byteBuf); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java new file mode 100644 index 0000000..f7814af --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java @@ -0,0 +1,35 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.ProtocolConfigProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.ProtocolConfig; + +/** + * 存放基本协议的的加载信息 + */ +public class AbstractProtocolConfigFactory { + private final ProtocolConfigProvider protocolConfigProvider; + private final ProtocolFieldConfigProvider protocolFieldConfigProvider; + private final RuleConfigProvider ruleConfigProvider; + + public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { + this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); + this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); + this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); + } + + public ProtocolConfigProvider getProtocolConfigProvider() { + return protocolConfigProvider; + } + + public ProtocolFieldConfigProvider getProtocolFieldConfigProvider() { + return protocolFieldConfigProvider; + } + + public RuleConfigProvider getRuleConfigProvider() { + return ruleConfigProvider; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java new file mode 100644 index 0000000..6e36147 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java @@ -0,0 +1,57 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.CombinedFieldConfigProvider; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.FieldConfigProvider; +import com.casic.missiles.parser.provider.FieldRuleConfigProvider; + +/** + * 存放规则相关的的的加载信息 + */ +public class AbstractRuleConfigFactory { + + /** + * 处理字节 + */ + private final FieldConfigProvider fieldConfigProvider; + /** + * 处理组合字节解析的解码器 + */ + private final CombinedFieldConfigProvider combinedFieldConfigProvider; + /** + * 处理负责字节解析的规则配置 + */ + private final FieldRuleConfigProvider fieldRuleConfigProvider; + /** + * 处理实例流程 + */ + private final DatagramEventProvider datagramEventProvider; + + + public AbstractRuleConfigFactory(Long ruleId) { + this.fieldConfigProvider = new FieldConfigProvider(ruleId); + this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); + this.fieldRuleConfigProvider = new FieldRuleConfigProvider(ruleId); + this.datagramEventProvider = new DatagramEventProvider(ruleId); + } + + public FieldConfigProvider getFieldConfigProvider() { + return fieldConfigProvider; + } + + public CombinedFieldConfigProvider getCombinedFieldConfigProvider() { + return combinedFieldConfigProvider; + } + + public FieldRuleConfigProvider getFieldRuleConfigProvider() { + return fieldRuleConfigProvider; + } + + public DatagramEventProvider getDatagramEventProvider() { + return datagramEventProvider; + } + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java deleted file mode 100644 index 6e1719a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.factory; - - -import com.casic.missiles.pojo.ProtocolConfig; - -import java.util.List; - -/** - * 数据库访问优化(暂时未做) - *

- * 1、初始化协议解析配置,并存放到处存放缓存,对协议基本配置进行管理 - * 2、其中流程中所有的配置都经过此类进行管理,进行调用获取,增强解析速度 - */ -public interface DatagramFactory { - - /** - * 初始化 - */ - List datagramInit(); - - /** - * 根据前导码配置匹配,模糊匹配获取所有的报文项 - */ - List match(); - - /** - * 根据前导码匹配,返回报文项 - */ - List filer(); - - /** - * 保证数据的唯一性选择器 - */ - List selectOne(); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java new file mode 100644 index 0000000..87444a0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java @@ -0,0 +1,18 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +import java.util.List; + +/** + * 直接用,还是边用边创建 + */ +public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { + + + public DefaultProtocolConfigFactory(ProtocolConfig protocolConfig) { + super(protocolConfig); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java new file mode 100644 index 0000000..cce0c7c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java @@ -0,0 +1,12 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; + +public class DefaultRuleFactory extends AbstractRuleConfigFactory { + + public DefaultRuleFactory(Long ruleId) { + super(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java deleted file mode 100644 index 9ee97e0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.casic.missiles.parser.instance; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service -@Slf4j -@AllArgsConstructor -public class GeneralProcessor { - - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; - - /** - * 统一固定字段解析=>进行规则的查询的判断 - * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 - * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 - */ - @Deprecated - public boolean parseWholeDatagram(ByteBuf buffer, ProtocolConfig protocolConfig) { - try { - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap,protocolId); - //选取规则对应的流程= - DatagramEventConfig datagramEventConfig = processorSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); - //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); - //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); - //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); - //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); - //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); - return true; - } catch (Exception ex) { - log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", - ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); - return false; - } - } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; - } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); - } - - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); - return bizDataMap; - } - - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java index 25e7ad8..6a5777e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java @@ -1,23 +1,31 @@ package com.casic.missiles.parser.instance.impl; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.mapper.DatagramEventMapper; import com.casic.missiles.pojo.DatagramEventConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.SpringContextUtil; -@Service -@AllArgsConstructor +import java.util.List; +import java.util.Optional; + +/** + * @author cz + * + */ public class DefaultProcessorInstanceSelector implements ProcessorInstanceSelector { - private final DatagramEventMapper datagramEventMapper; + private static List datagramEventConfigs; + + static { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + datagramEventConfigs = datagramEventRegistry.getDatagramEventList(); + } @Override public DatagramEventConfig getProcessorInstance(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("rule_id", protocolId); - return datagramEventMapper.selectOne(queryWrapper); + Optional optionalSelectInstance = datagramEventConfigs.stream() + .filter(e -> e.getId().equals(protocolId)).limit(1).findFirst(); + return optionalSelectInstance.isPresent() ? optionalSelectInstance.get() : null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a778671..7b56a43 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,16 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import io.netty.buffer.ByteBuf; /** - * 分析匹配情况 - * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 - * 2、匹配不成功,有后续帧,可以进行下次匹配。 - * 3、匹配不成功,无后续帧,可以进行丢弃。 + * 分析匹配情况 + * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 + * 2、匹配不成功,有后续帧,可以进行下次匹配。 + * 3、匹配不成功,无后续帧,可以进行丢弃。 */ -public interface FrameStructMatcher{ +public interface FrameStructMatcher { - ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig); + ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 05320ab..8ebea78 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,23 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.ProtocolConfigMapper; +import com.casic.missiles.parser.provider.ProtocolConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Component; import java.util.List; import java.util.stream.Collectors; -@Component -@AllArgsConstructor public class LeadingCodeMatcher { - private final ProtocolConfigMapper protocolMapper; - //** 1、首字母匹配前导码, // 2、以匹配出的前导码是否在报文中条件进行前导码的匹配二次筛选 - public List matchLeadingCode(String protocolContent){ + public static List matchFrameLeadingCode(String protocolContent){ List initialConfigs = initialMatch(protocolContent); List preCodeConfigs = initialConfigs.stream() .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) @@ -26,13 +19,16 @@ } //初始化匹配前导码内容 - private List initialMatch(String protocolContent) { - String protocolStr = protocolContent.charAt(0) + ""; - QueryWrapper queryWrapper = new QueryWrapper() - .likeRight("pre_fix", protocolStr); - List protocolConfigList = protocolMapper.selectList(queryWrapper); - return protocolConfigList; + private static List initialMatch(String protocolContent) { + String firstFrameChar = protocolContent.charAt(0) + ""; + ProtocolConfigProvider protocolConfigProvider=new ProtocolConfigProvider(firstFrameChar); + return protocolConfigProvider.getMatchList(); } + + + + + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index cf2113d..e915877 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -1,32 +1,35 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(0) -@Service +@Component public class FrameLengthMatcher implements FrameStructMatcher { - @Autowired - private FieldParser fieldParser; - //超过长度 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { String dataGramContent = ByteBufUtil.hexDump(byteBuf); - if (StringUtils.isEmpty(protocolConfig.getUnpackId()) && StringUtils.isEmpty(protocolConfig.getTailStr())) { - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + //当不存在结尾标志和拆包标志,可以直接使用长度进行匹配 + if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { if (dataGramContent.length() >= totalLength) {//等于长度返回true,超出长度,切断 - ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, protocolConfig, totalLength); + ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, totalLength); return wholeDatagramByte; } else { //读的标志位前移舍弃 @@ -38,7 +41,7 @@ return null; } - private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, Integer totalLength) { byteBuf.readBytes(totalLength); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, totalLength - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 2bfc213..d527ad0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; @@ -13,7 +13,7 @@ import lombok.AllArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.nio.charset.Charset; import java.util.Map; @@ -22,32 +22,30 @@ * 后续标志验证 */ @Order(1) -@Service +@Component @AllArgsConstructor -public class FrameMarkMatcher implements FrameStructMatcher { - - private final FieldConfigDao fieldConfigDao; - private final FieldParser fieldParser; - private final FieldResolver fieldResolverManger; +public class FrameMarkMatcher implements FrameStructMatcher, FixedPropertyEnum { //帧后续标志=>结束,进行帧的重组=>有后续,1、帧移位判别 2、继续接收帧 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig UnpackConfig = StringUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getUnpackId()); - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); - Integer upback = 0; + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); ByteBuf mergeWholeFrameByte = null; - if (!ObjectUtil.isEmpty(UnpackConfig)) { - while (hasNextFullFrame(byteBuf, protocolConfig)) { - upback = (Integer) fieldResolverManger.filedParserManger(byteBuf, UnpackConfig, null); + if (!ObjectUtil.isEmpty(unpackFlag)) { + while (hasNextFullFrame(byteBuf, protocolConfig, protocolFieldConfigProvider)) { //是否存在后续位 - if (upback == 1) {//使用esayRule + if (unpackFlag == 1) {//使用esayRule //表示可以截取 - mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolConfig, totalLength); + mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolFieldConfigProvider, protocolConfig); return mergeWholeFrameByte; } else { - byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig)); + byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig, protocolFieldConfigProvider)); } } } @@ -56,7 +54,8 @@ //选取第一个帧,将业务内容和后面部分分开 //计算数据报文-业务内容 - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolFieldConfigProvider protocolFieldConfigProvider, ProtocolConfig protocolConfig) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); //截取完整报文 byteBuf.readBytes(totalLength); ByteBuf byteBufContent = byteBuf.slice(0, byteBuf.readerIndex()); @@ -68,15 +67,15 @@ String tail = ""; System.out.println(ByteBufUtil.hexDump(byteBufContent)); //会存在多个帧拼接在一起的的情况,进行合并处理 - while (hasNextFullFrame(byteBufContent, protocolConfig)) { - Integer currentFrameLength = fieldParser.getTotalLength(protocolConfig, byteBufContent); + while (hasNextFullFrame(byteBufContent, protocolConfig, protocolFieldConfigProvider)) { + Integer currentFrameLength = protocolFieldConfigProvider.getTotalLength(byteBufContent, protocolConfig); byteBufContent.readBytes(currentFrameLength); ByteBuf currentbyteBuf = byteBufContent.slice(0, byteBufContent.readerIndex()); byteBufContent.markReaderIndex();//读的标志位前移 System.out.println(ByteBufUtil.hexDump(byteBufContent)); String hexDump = currentbyteBuf.toString(Charset.forName("ISO-8859-1")); //获取当前固定帧结构的关系map - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, currentbyteBuf); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(currentbyteBuf, protocolConfig); if (StringUtils.isEmpty(mergeFrameStr)) { //首次获取业务数据报文 mergeFrameStr += hexDump.substring(0, currentFrameFixedProperty.get("tailPosition")); @@ -95,22 +94,22 @@ /** * 获取平移到下一帧起始位置 */ - public int getNextFrameOffset(ByteBuf buffer, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, buffer); - return currentFrameFixedProperty.get("totalLength"); + public int getNextFrameOffset(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + return currentFrameFixedProperty.get(TOTAL_LENGTH); } /** * 判断是否出错进行整个帧的 */ - public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, byteBuf); + public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); //保证读取位置不在固定位置,是可变的业务内容 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("fixedPosition")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(FIXED_POSITION)) { return false; } //判断读取是否操作帧长度 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("totalLength")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(TOTAL_LENGTH)) { return false; } return true; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 76a3784..c3a1bab 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -1,50 +1,50 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.parser.instance.GeneralProcessor; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; +import io.netty.buffer.ByteBufUtil;; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(2) -@Service +@Component public class FrameTailMatcher implements FrameStructMatcher { - @Resource - private FieldConfigDao fieldConfigDao; - @Autowired - private GeneralProcessor generalProcessor; - //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig tailFieldConfig = StringUtils.isEmpty(protocolConfig.getTailStr()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getTailStr()); - if (!ObjectUtil.isEmpty(tailFieldConfig)) { - String tailStr = tailFieldConfig.getFieldName(); + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfig protocolFieldConfig = ObjectUtils.isEmpty(protocolConfig.getTailStr()) ? null : + fieldConfigProvider.getFieldConfigById(protocolConfig.getTailStr()); + if (!ObjectUtil.isEmpty(protocolFieldConfig)) { + String tailStr = protocolFieldConfig.getFieldName(); String dataGramContent = ByteBufUtil.hexDump(byteBuf); Boolean tailFlag = ByteBufUtil.hexDump(byteBuf).contains(tailStr); if (!tailFlag) { //使用esayRule return null; } else if (dataGramContent.indexOf(tailStr) < dataGramContent.length() - tailStr.length()) { Integer length = dataGramContent.indexOf(tailStr) + tailStr.length(); - ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, protocolConfig, length); + ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, length); return wholeDatagramByte; //存在粘包 } } return null; } - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer length) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, Integer length) { byteBuf.readBytes(length); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, length - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java new file mode 100644 index 0000000..5f1c177 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java @@ -0,0 +1,73 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.combined.GenericCombinedFieldResolver; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.CombinedFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class CombinedFieldConfigProvider { + + + /** + * 作为临时配置列表缓存使用 + */ + private final List combinedFieldConfigList; + private Map storeObjectMap = new HashMap<>(); + + public CombinedFieldConfigProvider(Long ruleId) { + CombinedFieldConfigRegistry combinedFieldConfigRegistry = SpringContextUtil.getBean(CombinedFieldConfigRegistry.class); + combinedFieldConfigList = combinedFieldConfigRegistry.getCombinedFieldConfigList(ruleId); + } + + public void parseDataField(RuleConfig ruleConfig, String clearZeroPlain,Map fieldConfigsMap ) { + if (showSkip()) { + return; + } + //匹配对应的数据,然后进行相关的字段解析 + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver(); + combinedFieldResolver.parseDataField(combinedFieldConfigList, byteBuf, storeObjectMap,fieldConfigsMap); + } + + + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getCombinedFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return combinedFieldConfigList.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public List getCombinedFieldConfigList() { + return combinedFieldConfigList; + } + + /* 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(combinedFieldConfigList) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java new file mode 100644 index 0000000..f3cfedc --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java @@ -0,0 +1,11 @@ +package com.casic.missiles.parser.provider; + +/** + * @author cz + * @date 2023-6-12 + */ +public class CommandEventProvider{ + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java new file mode 100644 index 0000000..70eec5e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java @@ -0,0 +1,77 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.safe.SafeStrategy; +import com.casic.missiles.parser.sender.DataSubscribeProvider; +import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class DatagramEventProvider { + + private final DatagramEventConfig processorInstance; + + public DatagramEventProvider(Long ruleId) { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + List datagramEventConfigList = + datagramEventRegistry.getDatagramEventList(ruleId); + processorInstance = this.getProcessorInstance(datagramEventConfigList); + } + + public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { + if (showSkip()) { + return null; + } + return datagramEventConfigList.get(0); + } + + // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 + public String getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap) { + String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? + processorInstance.getSafeBean() : + fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); + if (!StringUtils.isEmpty(safeName)) { + //需要加密 + SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); + String plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); + return clearComplementZero(plain); + } + return ByteBufUtil.hexDump(bizDataContent); + } + + //解密清零操作 + private String clearComplementZero(String plain) { + plain = plain.substring(0, plain.lastIndexOf("00")); + return plain; + } + + //数据发送,数据发送者暂未构建 + public void storeData(Map bizDataMap) { + DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); +// dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return ObjectUtils.isNotEmpty(processorInstance) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java new file mode 100644 index 0000000..7e1fe0a --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java @@ -0,0 +1,97 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.FieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class FieldConfigProvider { + + + private final List fieldConfigs; + private Map storeObjectMap = new HashMap<>(); +// private Map singleObjects = new ConcurrentHashMap<>(); + + public FieldConfigProvider(Long ruleId) { + FieldConfigRegistry fieldConfigRegistry = SpringContextUtil.getBean(FieldConfigRegistry.class); + fieldConfigs = fieldConfigRegistry.getFieldConfigList(ruleId); + } + + public List getFieldConfigs() { + return fieldConfigs; + } + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public Map parseDataField(RuleConfig ruleConfig, String clearZeroPlain) { + if (showSkip()) { + return null; + } + List prepareFieldConfig = prepareParseField(ruleConfig); + if (CollectionUtils.isNotEmpty(prepareFieldConfig)) { + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(fieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + return fixDataMap; + } + } + return null; + } + + /** + * 得到需要处理的业务内容 + * + * @return + */ + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return fieldConfigs.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public Map getFieldConfigsMap() { + return fieldConfigs.stream().collect( + Collectors.toMap(FieldConfig::getId, e -> e) + ); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(fieldConfigs) ? false : true; + } + + +} + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java new file mode 100644 index 0000000..817bfaf --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java @@ -0,0 +1,19 @@ +package com.casic.missiles.parser.provider; + +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.registry.FieldRuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; + +public class FieldRuleConfigProvider { + + private final List fieldRuleConfigList; + + public FieldRuleConfigProvider(Long ruleId) { + FieldRuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(FieldRuleConfigRegistry.class); + fieldRuleConfigList = ruleConfigRegistry.getFieldRuleConfigList(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java new file mode 100644 index 0000000..99a1b06 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java @@ -0,0 +1,53 @@ +package com.casic.missiles.parser.provider; + + +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.registry.ProtocolConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolConfigProvider { + + private final List protocolConfigList; + + public ProtocolConfigProvider(String firstChar) { + ProtocolConfigRegistry registry = SpringContextUtil.getBean(ProtocolConfigRegistry.class); + protocolConfigList = registry.getProtocolConfigList(firstChar); + } + + public List getMatchList() { + return protocolConfigList; + } + + /** + * 设置当前协议 + * + * @param protocolConfig + */ + public ProtocolConfigProvider(ProtocolConfig protocolConfig) { + List protocolConfigs = new ArrayList<>(); + protocolConfigs.add(protocolConfig); + protocolConfigList = protocolConfigs; + } + + /** + * 获取当前协议 + * + * @return + */ + public ProtocolConfig getCurrentProtocolConfig() { + if (this.protocolConfigList == null) { + return null; + } else { + return protocolConfigList.get(0); + } + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java new file mode 100644 index 0000000..043927d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java @@ -0,0 +1,213 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.registry.ProtocolFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolFieldConfigProvider { + + private static final String FIXED_FIELD_DS = "fixedFieldDs"; + private static final String CONTENT_FIELD_DS = "contentFieldDs"; + private static final String PROTOCOL_LENGTH = "protocolLength"; + private static final String PROTOCOL_FIELD_ID = "protocolFieldId"; + private static final String PROTOCOL_POSITION = "protocolPosition"; + + private final List protocolFieldConfigs; + private Map singleObjects = new ConcurrentHashMap<>(); + private Map storeObjectMap = new HashMap<>(); + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public ProtocolFieldConfigProvider(Long protocolId) { + ProtocolFieldConfigRegistry protocolFieldConfigRegistry = SpringContextUtil.getBean(ProtocolFieldConfigRegistry.class); + protocolFieldConfigs = protocolFieldConfigRegistry.getProtocolFieldConfigList(protocolId); + } + + public List getProtocolFieldConfigs() { + return protocolFieldConfigs; + } + + public ProtocolFieldConfig getFieldConfigById(Long fieldId) { + Optional optionalConfig = protocolFieldConfigs.stream().filter( + e -> e.getId().equals(fieldId) + ).findFirst(); + return optionalConfig.isPresent() ? optionalConfig.get() : null; + } + + public Integer getProtocolFieldValue(Long protocolFieldId, ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_FIELD_ID + protocolFieldId + ByteBufUtil.hexDump(byteBuf); + //获取缓存 + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + //加载固定长度数据集合 + Map fixDataMap = this.getProtocolDataMap(byteBuf); + ProtocolFieldConfig protocolFieldConfig = selectFieldConfig(protocolFieldId); + Integer protocolFieldValue = 0; + //获取约定字段的总长度 + if (fixDataMap.containsKey(protocolFieldConfig.getFieldName())) { + Object appointUnpackObject = fixDataMap.get(protocolFieldConfig.getFieldName()); + if (ObjectUtils.isNotEmpty(appointUnpackObject)) { + protocolFieldValue = (Integer) appointUnpackObject; + } + } + if (protocolFieldValue != null) { + //加入缓存 + if (ObjectUtils.isNotEmpty(protocolFieldValue)) { + this.singleObjects.put(catchKey, protocolFieldValue); + return protocolFieldValue; + } + } + return null; + } + + /** + * 获取帧固定位置信息 + * + * @param byteBuf + * @param protocolConfig + * @return + */ + public Map getFixedProperty(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_POSITION + protocolConfig.getId(); + if (this.singleObjects.containsKey(catchKey)) { + return (Map) singleObjects.get(catchKey); + } + Map fixedPropertyMap = new HashMap<>(); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + fixedPropertyMap = fieldParser.doGetFixedProperty(protocolFieldConfigs, this.getTotalLength(byteBuf,protocolConfig)); + if (CollectionUtils.isNotEmpty(fixedPropertyMap)) { + this.singleObjects.put(catchKey, fixedPropertyMap); + return fixedPropertyMap; + } + return fixedPropertyMap; + } + + /** + * 获取帧结构应有的总长度 + */ + public Integer getTotalLength(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_LENGTH + ByteBufUtil.hexDump(byteBuf); + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + Integer appointFrameLength = getProtocolFieldValue(protocolConfig.getTotalLengthId(), byteBuf); + if (appointFrameLength != null) { + //获取过滤的字段集合总长度 + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Integer totalFilterLength = fieldParser.getTotalFilterLength(protocolConfig, byteBuf, getFixFieldConfigMap()); + //计算总长度 + Integer totalLength = appointFrameLength + totalFilterLength; + //加入缓存 + if (ObjectUtils.isNotEmpty(totalLength)) { + this.singleObjects.put(catchKey, totalLength); + return totalLength; + } + } + return null; + } + + /** + * 获取协议有关字段解析内容 + * storeObjectMap存储代转存的数据 + * + * @return + */ + public Map getProtocolDataMap(ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(FIXED_FIELD_DS)) { + return (Map) singleObjects.get(FIXED_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(protocolFieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + this.singleObjects.put(FIXED_FIELD_DS, fixDataMap); + return fixDataMap; + } + return null; + } + + /** + * 获取业务报文内容的content字节 + * + * @param wholeDatagramByte + * @return + */ + public ByteBuf getDataContentBuf(ByteBuf wholeDatagramByte) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(CONTENT_FIELD_DS)) { + return (ByteBuf) singleObjects.get(CONTENT_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + ByteBuf bizDataByteBuf = fieldParser.getDataContentBuf(protocolFieldConfigs, wholeDatagramByte); + if (bizDataByteBuf != null) { + this.singleObjects.put(CONTENT_FIELD_DS, bizDataByteBuf); + return bizDataByteBuf; + } + return null; + } + + + private ProtocolFieldConfig selectFieldConfig(Long id) { + Optional optionalProtocolFieldConfig = this.protocolFieldConfigs.stream().filter( + e -> e.getId().equals(id) + ).findFirst(); + return optionalProtocolFieldConfig.isPresent() ? optionalProtocolFieldConfig.get() : null; + } + + + private Map getFixFieldConfigMap() { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, e -> e) + ); + return fixDataFieldMap; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(protocolFieldConfigs) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java new file mode 100644 index 0000000..dafba1c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java @@ -0,0 +1,56 @@ +package com.casic.missiles.parser.provider; + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.rule.GenericRuleResolver; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.RuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleConfigProvider { + + private final List ruleConfigs; + + public List getRuleConfigs() { + return ruleConfigs; + } + + public RuleConfigProvider(Long protocolId) { + RuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(RuleConfigRegistry.class); + ruleConfigs = ruleConfigRegistry.getRuleConfigById(protocolId); + } + + /** + * 获取规则匹配结果 + * + * @param parseFixedDataMap + * @param protocolFieldConfigs + * @return + */ + public RuleConfig doGetRule(Map parseFixedDataMap, + String ids, + List protocolFieldConfigs) { + if (showSkip()) { + return null; + } + RuleConfig ruleConfig = GenericRuleResolver.machRule(parseFixedDataMap, ids, protocolFieldConfigs, ruleConfigs); + return ruleConfig; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(ruleConfigs) ? false : true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java index 3c05891..856b399 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java @@ -1,18 +1,11 @@ package com.casic.missiles.parser.resolver; -import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.springframework.web.bind.annotation.RequestBody; -import javax.annotation.Resource; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -20,19 +13,17 @@ @Slf4j public class ByteMergeProvider { - @Resource - private FieldRuleEngineMapper fieldRuleEngineMapper; - //拿到所有的值合并到一个值 - public String resolveByteMerge(List valueList, String ruletypeId, String vaildRange) { + public static String resolveByteMerge(List valueList, String ruleTypeId, String vaildRange) { String values = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Map vaildMap = getValidRangeMap(vaildRange); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(ruletypeId); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } + //暂时不处理 +// fieldRuleEngine = fieldRuleConfigMapper.selectById(ruleTypeId); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } Map env2 = new HashMap(); for (int i = 0; i < valueList.size(); i++) { if (vaildMap.containsKey(i)) { @@ -47,7 +38,7 @@ } } - private Map getValidRangeMap(String vaildRange) { + private static Map getValidRangeMap(String vaildRange) { String[] range = vaildRange.split(","); Map vaildMap = new HashMap(); for (int i = 0; i < range.length; i++) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 8d821cd..85d6bbf 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -1,9 +1,12 @@ package com.casic.missiles.parser.resolver; +import com.casic.missiles.pojo.AbstractFieldConfig; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; import io.netty.buffer.ByteBuf; +import java.util.List; import java.util.Map; /** @@ -11,18 +14,14 @@ */ public interface FieldParser { -// Map fieldProcess(String protocolContent,); - Map dataParser(RuleConfig ruleConfig, String lightText,String protocolId); + Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength); - Map fixDataParser(String protocolId, ByteBuf buffer); + Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap); - Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf); + ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer); - ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer); - - ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer); - - Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer); + Integer getTotalFilterLength(ProtocolConfig protocolConfig, ByteBuf byteBuf, Map protocolFieldConfigMap); } + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java new file mode 100644 index 0000000..9e0c00e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java @@ -0,0 +1,52 @@ +package com.casic.missiles.parser.resolver; + +import com.casic.missiles.pojo.AbstractFieldConfig; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.util.List; + +public class FieldParserSupport { + + //分别计算bit和byte长度=> 合并长度 + protected Integer calculateLength(List fieldConfigList) { + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + Integer fixedLength = bytefixedLength + bitfixedLength / 8; + return fixedLength; + } + + //找到最大值=> 根据最大值计算业务数据下标 + protected Integer calculatePosition(List fieldConfigList) { + String rex = "[0-9]+"; + Integer max = -1; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) + && Integer.valueOf(fieldConfig.getOriginPositionByte()) > max) { + max = Integer.valueOf(fieldConfig.getOriginPositionByte()); + } + } + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) && fieldConfig.getOriginPositionByte().equals(max)) { + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + } + } + Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; + return maxFixedPosition; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java deleted file mode 100644 index dd3a6cd..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java +++ /dev/null @@ -1,170 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.ByteResolverParam; -import io.netty.buffer.ByteBuf; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -/** - * 字段解析管理总类 - */ -@Service -@Slf4j -@AllArgsConstructor -public class FieldResolver extends ByteMergeProvider { - - //1、字段截取 => 2、简单的字节解析和复杂的字节解析 - public Object filedParserManger(ByteBuf byteBuf, FieldConfig fieldConfig, Integer maxFixedPosition) { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - //最大固定位置不为空, - if (!ObjectUtil.isEmpty(maxFixedPosition)) { - orignPosition -= maxFixedPosition; - } - Object fieldValue = 0; - //待优化 - if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { - fieldValue = bitToResolver(byteBuf, fieldConfig); - } else { - ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); - fieldValue = parsingFields(fieldBytes, fieldConfig.getRuleJson()); - } - return fieldValue; - } - - //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, - //目前默认配置的规则设置暂不支持配置化,由实现完成 - private Object parsingFields(ByteBuf byteBuf, String ruleJson) { - Object fieldsResolveValue = null; - List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); - if (ObjectUtil.isEmpty(ruleMapList)) { - fieldsResolveValue = defaultResolveBuilder(byteBuf); - } else { - fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); - } - return fieldsResolveValue; - } - - private Object defaultResolveBuilder(ByteBuf byteBuf) { - Integer defaultResolveValue = 0; - for (int i = 0; i < byteBuf.writerIndex(); i++) { - defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; - } - return defaultResolveValue; - } - - //字段解析构建器(针对字节单位的) - //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 - // 字节归并结束或者规则结束=>继续根据规则进行判断 - private Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { - Object customizeResolveValue = null; - try { - List bytStrList = new ArrayList<>(); - //存放到数组里面 - for (int i = 0; i < byteBuf.writerIndex(); i++) { - bytStrList.add(byteBuf.readByte()); - } - int i = 0; - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - customizeResolveValue = this.resolveByteMerge(bytStrList, ruletypeId,vaildRange); - break; - } else { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - List tempBytStr = new ArrayList<>(); - for (int k = 0; i < bytStrList.size(); i++) { - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(k) - .value(bytStrList.get(k)) - .ruletypeId(ruletypeId).build(); - tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); - } - bytStrList = tempBytStr; - } - i++; - } - //字节归并到一起=>继续根据规则进行判断 - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(customizeResolveValue) - .ruletypeId(ruletypeId).build(); - customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(customizeResolveValue)); - return customizeResolveValue; - } catch (RuntimeException ex) { - log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); - return null; - } - } - - /** - * 1、单个字节情况表示字段 - * 2、多字节情况表示字段(暂未处理) - */ - private Object bitToResolver(ByteBuf byteBuf, FieldConfig fieldConfig) { - Object fieldValue = new Object(); - try { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - byte fields = 0x00; - if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); - } else { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); - } - - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { - if (!StringUtils.isEmpty(fieldConfig.getExactOrignPosition())) { - fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getExactOrignPosition())).byteValue() - >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); - } else { - fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); - } - } else { - fieldValue = Integer.valueOf(fields & 0xff); - } - if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { - return fieldValue; - } - List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); - int i = 0; - //字节归并到一起=>继续根据规则进行判断 - while (i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(fieldValue) - .ruletypeId(ruletypeId).build(); - fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(fieldValue)); - return fieldValue; - } catch (RuntimeException ex) { - log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); - return null; - } - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java new file mode 100644 index 0000000..1d2aeab --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java @@ -0,0 +1,36 @@ +package com.casic.missiles.parser.resolver.bytes; + +import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.mapper.FieldRuleConfigMapper; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.pojo.ByteResolverParam; +import com.googlecode.aviator.AviatorEvaluator; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; +//转换规则 +@Component("convert") +@AllArgsConstructor +@Slf4j +public class ByteRuleResolver implements ByteResolver { + + private final FieldRuleConfigMapper fieldRuleConfigMapper; + + @Override + public Object resolveOperationRule(ByteResolverParam byteResolverParam){ + FieldRuleConfig fieldRuleEngine=fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); + if(ObjectUtil.isEmpty(fieldRuleEngine)){ + return byteResolverParam.getValue(); + } + String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); + Map env2 = new HashMap(); + env2.put("value", (byte) byteResolverParam.getValue()); + String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); + return values; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java index 103821c..786b71c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java @@ -2,34 +2,34 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("logicalShift") +@Component("logicalShift") @AllArgsConstructor @Slf4j public class LogicalShiftResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //字节位移 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { Integer index = byteResolverParam.getIndex(); - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return byteResolverParam.getValue(); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java index 476747d..01149bd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("operation") +@Component("operation") @AllArgsConstructor @Slf4j public class OperationResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //混合运算,有常量或者乘除的缩放 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java index 0b82cf4..79abcce 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.casic.missiles.pojo.ByteResolverParam; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; //精度计算 -@Service("precision") +@Component("precision") @AllArgsConstructor @Slf4j public class PrecisionResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java deleted file mode 100644 index 5c3f332..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; -//转换规则 -@Service("convert") -@AllArgsConstructor -@Slf4j -public class RuleResolver implements ByteResolver { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam){ - RuleEvaluator fieldRuleEngine=fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); - if(ObjectUtil.isEmpty(fieldRuleEngine)){ - return byteResolverParam.getValue(); - } - String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); - Map env2 = new HashMap(); - env2.put("value", (byte) byteResolverParam.getValue()); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java new file mode 100644 index 0000000..d3bbd91 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java @@ -0,0 +1,15 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; + +import java.util.List; +import java.util.Map; +// 前导码匹配->长度字段 +public interface AbstractCombinedFieldProcessor { + + Map invoke(Map map, ByteBuf byteBuf, List combinedFieldConfigList, + Map fieldConfigsMap, Map storeObjectMap); + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java new file mode 100644 index 0000000..03c8480 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java @@ -0,0 +1,59 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-13 + */ +//依次递增进行数据的解析, +public class GenericCombinedFieldResolver { + + + //通过查询,字段长度长度随机 + public void parseDataField(List combinedFieldConfigList, ByteBuf byteBuf, + Map storeObjectMap, Map fieldConfigsMap) { + Integer frameLength = Integer.valueOf(ByteBufUtil.hexDump(byteBuf)); + //添加前置处理器 + com.casic.missiles.util.ClassUtil classUtil = new com.casic.missiles.util.ClassUtil(); + List abstractCombinedProcessors = classUtil.getSubClassList(AbstractCombinedFieldProcessor.class); + + Map fieldFixedMap = combinedFieldLeadCodeMap(combinedFieldConfigList); + //frameLength + Map combinedProcessorFields = null; + while (byteBuf.readableBytes() < frameLength) { + //一直处理 + for (AbstractCombinedFieldProcessor abstractCombinedProcessor : abstractCombinedProcessors) { + combinedProcessorFields = abstractCombinedProcessor.invoke(combinedProcessorFields, byteBuf, + combinedFieldConfigList, + fieldConfigsMap, storeObjectMap); + if (combinedProcessorFields == null || byteBuf.readableBytes() < frameLength) { + return; + } + } + + } + } + + /** + * 取出前导码匹配集合 + */ + private Map combinedFieldLeadCodeMap(List combinedFieldConfigList) { + Map fieldFixedMap = combinedFieldConfigList + .stream() + .collect(Collectors.toMap(CombinedFieldConfig::getPrefixCode, e -> e)); + return fieldFixedMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java new file mode 100644 index 0000000..643a934 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java @@ -0,0 +1,100 @@ +package com.casic.missiles.parser.resolver.fields; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.FieldParserSupport; +import com.casic.missiles.pojo.*; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 保存使用时最基本的信息,并且使用原型模式 + */ +@Slf4j +public class DefaultProtocolFieldParser extends FieldParserSupport implements FieldParser, FixedPropertyEnum { + + //通过传入的配置和报文进行字段解析 + @Override + public Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap) { + Map dataMap = new HashMap<>(); + for (AbstractFieldConfig protocolFieldConfig : protocolFieldConfigs) { + if (!ObjectUtils.isEmpty(protocolFieldConfig.getOriginPositionByte())) { + Object fieldValue = FieldResolver.parseField(buffer, protocolFieldConfig, null); + if (protocolFieldConfig.getIsStorage() == 1) { + storeObjectMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + dataMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + } + return dataMap; + } + + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength) { + Map fixedPropertyMap = new HashMap<>(); + Integer fixedLength = calculateLength(protocolFieldConfigs); + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + fixedPropertyMap.put(FIXED_POSITION, maxFixedPosition); + fixedPropertyMap.put(TOTAL_LENGTH, totalLength); + fixedPropertyMap.put(TAIL_POSITION, totalLength - fixedLength + maxFixedPosition); + return fixedPropertyMap; + } + + //** 获取业务内容的byteBuf + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer) { + //计算固定长度 + Integer fixedLength = calculateLength(protocolFieldConfigs); + //总长度获取 + String lightText = buffer.toString(Charset.forName("ISO-8859-1")); + Integer totalLength = lightText.length(); + //计算固定长度最大长度 + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + //计算数据报文内容 + ByteBuf bizDataFields = buffer.slice(maxFixedPosition - 1, (totalLength - fixedLength)); + return bizDataFields; + } + + /** + * 获取过滤字段的长度 + */ + @Override + public Integer getTotalFilterLength(ProtocolConfig protocolConfig, + ByteBuf byteBuf, + Map protocolFieldConfigMap) { + if (ByteBufUtil.hexDump(byteBuf).equals("")) { + return 0; + } + int totalFilterLength = 0; + String filterFields = protocolConfig.getTotalLengthFilterFields(); + try { + if (!StringUtils.isEmpty(filterFields)) { + String[] filterFieldList = filterFields.split(","); + for (String filterFieldId : filterFieldList) { + if (StringUtils.isNotEmpty(filterFieldId)) { + ProtocolFieldConfig fieldConfig = protocolFieldConfigMap.get(Long.valueOf(filterFieldId)); + //这里都是按字节计算,没有对位进行区分,可能会出现错误 + // 如果对位有需求,需要进一步跟进 + totalFilterLength += fieldConfig.getOffsetLength(); + } + } + } + return totalFilterLength; + } catch (Exception ex) { + log.error("报文确认分发阶段,获取报文总长度过滤长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); + } + return totalFilterLength; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java new file mode 100644 index 0000000..d51e887 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java @@ -0,0 +1,169 @@ +package com.casic.missiles.parser.resolver.fields; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.parser.resolver.ByteMergeProvider; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.AbstractFieldConfig; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.pojo.ByteResolverParam; +import io.netty.buffer.ByteBuf; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * 字段解析管理总类 + */ +@Slf4j +public class FieldResolver extends ByteMergeProvider { + + //1、字段截取 => 2、简单的字节解析和复杂的字节解析 + public static Object parseField(ByteBuf byteBuf,AbstractFieldConfig fieldConfig, Integer maxFixedPosition) { + Integer orignPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + //最大固定位置不为空, + if (!ObjectUtil.isEmpty(maxFixedPosition)) { + orignPosition -= maxFixedPosition; + } + Object fieldValue = 0; + //待优化 + if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { + fieldValue = doParseBitField(byteBuf, fieldConfig); + } else { + ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); + fieldValue = doParseByteField(fieldBytes, fieldConfig.getRuleJson()); + } + return fieldValue; + } + + //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, + //目前默认配置的规则设置暂不支持配置化,由实现完成 + private static Object doParseByteField(ByteBuf byteBuf, String ruleJson) { + Object fieldsResolveValue = null; + List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); + if (ObjectUtil.isEmpty(ruleMapList)) { + fieldsResolveValue = defaultResolveBuilder(byteBuf); + } else { + fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); + } + return fieldsResolveValue; + } + + private static Object defaultResolveBuilder(ByteBuf byteBuf) { + Integer defaultResolveValue = 0; + for (int i = 0; i < byteBuf.writerIndex(); i++) { + defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; + } + return defaultResolveValue; + } + + //字段解析构建器(针对字节单位的) + //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 + // 字节归并结束或者规则结束=>继续根据规则进行判断 + private static Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { + Object customizeResolveValue = null; + try { + List bytStrList = new ArrayList<>(); + //存放到数组里面 + for (int i = 0; i < byteBuf.writerIndex(); i++) { + bytStrList.add(byteBuf.readByte()); + } + int i = 0; + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { + if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + customizeResolveValue = resolveByteMerge(bytStrList, ruletypeId, vaildRange); + break; + } else { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + List tempBytStr = new ArrayList<>(); + for (int k = 0; i < bytStrList.size(); i++) { + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(k) + .value(bytStrList.get(k)) + .ruletypeId(ruletypeId).build(); + tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); + } + bytStrList = tempBytStr; + } + i++; + } + //字节归并到一起=>继续根据规则进行判断 + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(null) + .value(customizeResolveValue) + .ruletypeId(ruletypeId).build(); + customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); + i++; + } + System.out.println(JSON.toJSON(customizeResolveValue)); + return customizeResolveValue; + } catch (RuntimeException ex) { + log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); + return null; + } + } + + /** + * 1、单个字节情况表示字段 + * 2、多字节情况表示字段(暂未处理) + */ + private static Object doParseBitField(ByteBuf byteBuf,AbstractFieldConfig fieldConfig) { + Object fieldValue = new Object(); + try { + Integer orignPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + byte fields = 0x00; + if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { + fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); + } else { + fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); + } + + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { + if (!StringUtils.isEmpty(fieldConfig.getOriginPositionBit())) { + fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getOriginPositionBit())).byteValue() + >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); + } else { + fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); + } + } else { + fieldValue = Integer.valueOf(fields & 0xff); + } + if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { + return fieldValue; + } + List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); + int i = 0; + //字节归并到一起=>继续根据规则进行判断 + while (i < ruleMapList.size()) { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(null) + .value(fieldValue) + .ruletypeId(ruletypeId).build(); + fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); + i++; + } + System.out.println(JSON.toJSON(fieldValue)); + return fieldValue; + } catch (RuntimeException ex) { + log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); + return null; + } + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java deleted file mode 100644 index 35ae3d0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java +++ /dev/null @@ -1,183 +0,0 @@ -package com.casic.missiles.parser.resolver.fields; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufAllocator; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; -import org.springframework.util.ObjectUtils; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service("standard") -@AllArgsConstructor -@Slf4j -public class StandardFieldParser implements FieldParser { - - private final FieldConfigDao fieldConfigDao; - private final FieldResolver fieldResolver; - - //数据解析 - @Override - public Map dataParser(RuleConfig ruleConfig, String lightText, String protocolId) { - String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); - ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); - bufferContent.writeBytes(lightText.getBytes(Charset.forName("ISO-8859-1"))); - Map dataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - for (String dataFieldId : dataFieldIds) { - FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(dataFieldId); - if (!ObjectUtils.isEmpty(fieldConfig)) { - dataMap.put(fieldConfig.getFieldName(), String.valueOf(fieldResolver.filedParserManger(bufferContent, fieldConfig, maxFixedPosition))); - } - } - return dataMap; - } - - //数据解析 - @Override - public Map fixDataParser(String protocolId, ByteBuf buffer) { - List dataFieldIdList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Map dataMap = new HashMap<>(); - for (FieldConfig dataField : dataFieldIdList) { - if (!ObjectUtils.isEmpty(dataField.getOrignPosition())) { - Object fieldValue = (Integer) fieldResolver.filedParserManger(buffer, dataField, null); - dataMap.put(dataField.getFieldName(), fieldValue); - } - } - return dataMap; - } - - @Override - public Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf) { - if (ByteBufUtil.hexDump(byteBuf).equals("")) { - return 0; - } - String filterFields = protocolConfig.getTotalLengthFilterField(); - Integer totalLength = 0; - try { - FieldConfig totalFieldConfig = fieldConfigDao.getFieldConfigById(protocolConfig.getTotalLengthId()); - int totalFilterLength = 0; - if (!StringUtils.isEmpty(filterFields)) { - String[] filterFieldList = filterFields.split(","); - for (String filterField : filterFieldList) { - FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(filterField); - //这里都是按字节计算,没有对位进行区分,可能会出现错误 - - // 如果对位有需求,需要进一步跟进 - totalFilterLength += fieldConfig.getOffsetLength(); - } - } - totalLength = (Integer) fieldResolver.filedParserManger(byteBuf, totalFieldConfig, null) + totalFilterLength; - } catch (Exception ex) { - log.error("报文确认分发阶段,获取报文总长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); - } - return totalLength; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer) { - //业务内容 - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - String protocolId = String.valueOf(protocolConfig.getId()); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - //计算固定长度 - Integer fixedLength = calculateLength(fieldConfigList); -// Integer totalLength = this.getTotalLength(protocolConfig, buffer); - //总长度获取 - Integer totalLength = lightText.length(); - //计算固定长度最大长度 - Integer maxFixedPosition = calculatePosition(fieldConfigList); -// buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - //计算数据报文内容 - ByteBuf bizDataFields = buffer.slice(maxFixedPosition-1, (totalLength - fixedLength)); - return bizDataFields; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer) { - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - String protocolId = String.valueOf(protocolConfig.getId()); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer fixedLength = calculateLength(fieldConfigList); -// Integer totalLength = this.getTotalLength(protocolConfig, buffer); - Integer totalLength = lightText.length(); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - ByteBuf fixDataFields = buffer.slice(0, maxFixedPosition); - return fixDataFields; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer) { - String protocolId = String.valueOf(protocolConfig.getId()); - Map fixedPropertyMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer fixedLength = calculateLength(fieldConfigList); - Integer totalLength = this.getTotalLength(protocolConfig, buffer); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - fixedPropertyMap.put("fixedPosition", maxFixedPosition); - fixedPropertyMap.put("totalLength", totalLength); - fixedPropertyMap.put("tailPosition", totalLength - fixedLength + maxFixedPosition); - return fixedPropertyMap; - } - - //分别计算bit和byte长度=> 合并长度 - private Integer calculateLength(List fieldConfigList) { - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (FieldConfig fieldConfig : fieldConfigList) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - Integer fixedLength = bytefixedLength + bitfixedLength / 8; - return fixedLength; - } - - //找到最大值=> 根据最大值计算业务数据下标 - private Integer calculatePosition(List fieldConfigList) { - String rex = "[0-9]+"; - Integer max = -1; - for (FieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOrignPosition()) - && Integer.valueOf(fieldConfig.getOrignPosition()) > max) { - max = Integer.valueOf(fieldConfig.getOrignPosition()); - } - } - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (FieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOrignPosition()) && fieldConfig.getOrignPosition().equals(max)) { - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - } - } - Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; - return maxFixedPosition; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java new file mode 100644 index 0000000..d4ec6c7 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java @@ -0,0 +1,76 @@ +package com.casic.missiles.parser.rule; + +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import org.apache.commons.lang3.StringUtils; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class GenericRuleResolver { + + //根据前置字段的值,找到指定的规则 + //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 + //=>循环判断=>通过规则得到业务字段 + public static RuleConfig machRule(Map fixDataMap, + String ids, + List protocolFieldConfigs, + List ruleConfigs) { + List preRuleConfigList = getPreRuleList(ids, protocolFieldConfigs); + //获取前置规则字段 + final Map metaDataMap = getPreRuleFields(preRuleConfigList, fixDataMap); + //准备固定的字段集合 + Map fixDataFieldMap = getFixDataFieldMap(protocolFieldConfigs); + return RuleResolverCore.doMachRule(ruleConfigs, metaDataMap, fixDataMap, fixDataFieldMap); + } + + private static Map getFixDataFieldMap(List protocolFieldConfigs) { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, ProtocolFieldConfig::getFieldName) + ); + return fixDataFieldMap; + } + + + /** + * 查询前置规则的字段配置 + * + * @param ids + * @return + */ + private static List getPreRuleList(String ids, List protocolFieldConfigs) { + String[] idList = ids.split(","); + Map prepareMaps = new HashMap<>(); + for (String id : idList) { + if (StringUtils.isNotEmpty(id)) { + prepareMaps.put(Long.valueOf(id), ""); + } + } + List preRuleConfigList = protocolFieldConfigs + .stream() + .filter(e -> prepareMaps.containsKey(e.getId())) + .collect(Collectors.toList()); + return preRuleConfigList; + } + + /** + * 获取前置规则解析字段 + */ + private static Map getPreRuleFields(List preRuleFieldConfigList, Map fixDataMap) { + Map ruleFieldMap = new HashMap<>(); + preRuleFieldConfigList.stream() + .forEach( + preRuleFieldConfig -> { + String fieldName = preRuleFieldConfig.getFieldName(); + if (fixDataMap.containsKey(fieldName)) { + ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); + } + } + ); + return ruleFieldMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java new file mode 100644 index 0000000..baae7e8 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -0,0 +1,68 @@ +package com.casic.missiles.parser.rule; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.casic.missiles.pojo.RuleConfig; + +import java.util.*; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleResolverCore { + + + public static RuleConfig doMachRule(List ruleConfigList, Map metaDataMap, + Map fixDataMap, + Map fixDataFieldMap) { + Optional ruleConfigOptional = ruleConfigList.stream() + .filter(ruleConfig -> machRuleConfig( + JSON.parseObject(ruleConfig.getMatchRuleJson(), Map.class), metaDataMap)) + .findFirst(); + if (ObjectUtil.isEmpty(ruleConfigOptional)) { + return null; + } + String[] ruleFields = ruleConfigOptional.get().getDataFieldIds().split(","); + Map ruleMetaDataMap = getRuleFields(ruleFields, fixDataMap, fixDataFieldMap); + //递归选定解析规则,进行规则解析 + if (!ruleConfigOptional.get().getIsFinishMatch().equals("1")) { + //递归选定规则 + doMachRule(ruleConfigList, ruleMetaDataMap, fixDataMap, fixDataFieldMap); + } + return ruleConfigOptional.get(); + } + + + private static Map getRuleFields(String[] preRuleConfigList, Map fixedDataMap, + Map fixedFieldMap) { + Map ruleFieldMap = new HashMap<>(); + for (String preRuleConfigId : preRuleConfigList) { + String fieldName = fixedFieldMap.get(preRuleConfigId); + if (fixedDataMap.containsKey(fieldName)) { + ruleFieldMap.put(fieldName, String.valueOf(fixedDataMap.get(fieldName))); + } + } + return ruleFieldMap; + } + + + //匹配规则配置 + private static Boolean machRuleConfig(Map ruleMap, Map metaDataMap) { + if (ruleMap == null || metaDataMap == null) { + return null; + } + //所有的字段在规则里面必须有有配置 + for (String key : metaDataMap.keySet()) { + if (ruleMap.containsKey(key)) { + if (!ruleMap.get(key).equals(metaDataMap.get(key))) { + return false; + } + } else { + return false; + } + } + return true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java deleted file mode 100644 index 664088d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java +++ /dev/null @@ -1,92 +0,0 @@ -package com.casic.missiles.parser.rule; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.mapper.dao.PreRuleConfigDao; -import com.casic.missiles.mapper.dao.RuleConfigDao; -import lombok.AllArgsConstructor; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.*; -import java.util.stream.Collectors; - -@Service -@AllArgsConstructor -public class RulerProvider { - - private final FieldConfigDao fieldConfigDao; - private final PreRuleConfigDao preRuleConfigDao; - private final RuleConfigDao ruleConfigDao; - - //根据前置字段的值,找到指定的规则 - //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 - //=>循环判断=>通过规则得到业务字段 - public RuleConfig ruleConfig(Map fixDataMap, String protocolId) { - //批量获取规则 - List preRuleConfigList = preRuleConfigDao.getPreRuleList(protocolId); - //获取固定字段 - Map fixFieldMap = getAllFieldMap(protocolId); - //获取前置规则字段 - final String preRuleFields = getPreRuleFields(preRuleConfigList, fixDataMap, fixFieldMap); - List ruleConfigList = ruleConfigDao.getRuleConfigById(protocolId); - Optional ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig ->preRuleFields.equals( ruleConfig.getParseRuleJson())).findFirst(); - //递归选定解析规则,进行规则解析 - while (!ObjectUtil.isEmpty(ruleConfigOptional) && !ruleConfigOptional.get().getIsBizField().equals("1")) { - String ruleFields = getRuleFields(ruleConfigOptional.get().getDataFieldIds().split(","), fixDataMap, fixFieldMap); - ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig -> ruleConfig.getParseRuleJson().equals(ruleFields)).findFirst(); - } - return ruleConfigOptional.get(); - } - - /** - * 获取前置规则解析字段 - */ - private String getPreRuleFields(List preRuleConfigList, Map fixDataMap, Map fixFieldMap) { - Map ruleFieldMap= new HashMap<>(); - preRuleConfigList.stream() - .forEach( - preRuleConfig -> { - String fieldName = fixFieldMap.get(Long.valueOf(preRuleConfig.getRuleFieldId())); - if (fixDataMap.containsKey(fieldName)) { - ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); - } - } - ); - return JSONObject.toJSONString(ruleFieldMap); - } - - private Map getAllFieldMap(String protocolId) { - List fieldList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Map fixFieldMap = fieldList.stream().collect( - Collectors.toMap(FieldConfig::getId, FieldConfig::getFieldName) - ); - return fixFieldMap; - } - - private String getRuleFields(String[] preRuleConfigList, Map fixDataMap, Map fixFieldMap) { - Map ruleFieldMap= new HashMap<>(); - for (String preRuleConfigId : preRuleConfigList) { - String fieldName = fixFieldMap.get(preRuleConfigId); - if (fixDataMap.containsKey(fieldName)) { - ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); - } - } - return JSONObject.toJSONString(ruleFieldMap); - } - - //弃置 - private String ListToString(List ruleFieldList) { - String ruleFields = ""; - for (String ruleField : ruleFieldList) { - ruleFields += ruleField + ","; - } - ruleFields = StringUtils.isEmpty(ruleFields) ? ruleFields : ruleFields.substring(0, ruleFields.length() - 1); - return ruleFields; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java index 6177e10..bfa87a5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java @@ -2,7 +2,7 @@ public interface SafeStrategy { - String decryption(byte[] bytes); + String decryption(String cipher); String encryption(String lightText); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java index 618716c..6236302 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java @@ -9,9 +9,9 @@ //十六进制的字符串转换成字节数组 byte[] bytes = hexStrToBinaryStr(msg); //计算CRC8 - byte crc8 = CRC8(bytes, 0, bytes.length); - String crc8ToStr = "" + Integer.toHexString(0xff & crc8); - return crc8ToStr; +// String crc8ToStr = "" + Integer.toHexString(0xff & crc8); +// return crc8ToStr; + return null; } /** @@ -33,50 +33,5 @@ return bytes; } - /** - * CRC8 校验 多项式 x8+x2+x+1 - * - * @param b - * @param off - * @param len - * @return - */ - public static byte CRC8(final byte[] b, final int off, final int len) { - byte result = 0x00; - for (int i = 0; i < len; i++) { - result = CHECKSUM_TABLE[(result ^ (b[i + off] & 0xFF)) & 0xFF]; - } - return (byte) (result & 0xFFL); - } - - private final static byte[] CHECKSUM_TABLE = {(byte) 0x00, (byte) 0x07, (byte) 0x0e, (byte) 0x09, (byte) 0x1c, (byte) 0x1b, - (byte) 0x12, (byte) 0x15, (byte) 0x38, (byte) 0x3f, (byte) 0x36, (byte) 0x31, (byte) 0x24, (byte) 0x23, (byte) 0x2a, - (byte) 0x2d, (byte) 0x70, (byte) 0x77, (byte) 0x7e, (byte) 0x79, (byte) 0x6c, (byte) 0x6b, (byte) 0x62, (byte) 0x65, - (byte) 0x48, (byte) 0x4f, (byte) 0x46, (byte) 0x41, (byte) 0x54, (byte) 0x53, (byte) 0x5a, (byte) 0x5d, (byte) 0xe0, - (byte) 0xe7, (byte) 0xee, (byte) 0xe9, (byte) 0xfc, (byte) 0xfb, (byte) 0xf2, (byte) 0xf5, (byte) 0xd8, (byte) 0xdf, - (byte) 0xd6, (byte) 0xd1, (byte) 0xc4, (byte) 0xc3, (byte) 0xca, (byte) 0xcd, (byte) 0x90, (byte) 0x97, (byte) 0x9e, - (byte) 0x99, (byte) 0x8c, (byte) 0x8b, (byte) 0x82, (byte) 0x85, (byte) 0xa8, (byte) 0xaf, (byte) 0xa6, (byte) 0xa1, - (byte) 0xb4, (byte) 0xb3, (byte) 0xba, (byte) 0xbd, (byte) 0xc7, (byte) 0xc0, (byte) 0xc9, (byte) 0xce, (byte) 0xdb, - (byte) 0xdc, (byte) 0xd5, (byte) 0xd2, (byte) 0xff, (byte) 0xf8, (byte) 0xf1, (byte) 0xf6, (byte) 0xe3, (byte) 0xe4, - (byte) 0xed, (byte) 0xea, (byte) 0xb7, (byte) 0xb0, (byte) 0xb9, (byte) 0xbe, (byte) 0xab, (byte) 0xac, (byte) 0xa5, - (byte) 0xa2, (byte) 0x8f, (byte) 0x88, (byte) 0x81, (byte) 0x86, (byte) 0x93, (byte) 0x94, (byte) 0x9d, (byte) 0x9a, - (byte) 0x27, (byte) 0x20, (byte) 0x29, (byte) 0x2e, (byte) 0x3b, (byte) 0x3c, (byte) 0x35, (byte) 0x32, (byte) 0x1f, - (byte) 0x18, (byte) 0x11, (byte) 0x16, (byte) 0x03, (byte) 0x04, (byte) 0x0d, (byte) 0x0a, (byte) 0x57, (byte) 0x50, - (byte) 0x59, (byte) 0x5e, (byte) 0x4b, (byte) 0x4c, (byte) 0x45, (byte) 0x42, (byte) 0x6f, (byte) 0x68, (byte) 0x61, - (byte) 0x66, (byte) 0x73, (byte) 0x74, (byte) 0x7d, (byte) 0x7a, (byte) 0x89, (byte) 0x8e, (byte) 0x87, (byte) 0x80, - (byte) 0x95, (byte) 0x92, (byte) 0x9b, (byte) 0x9c, (byte) 0xb1, (byte) 0xb6, (byte) 0xbf, (byte) 0xb8, (byte) 0xad, - (byte) 0xaa, (byte) 0xa3, (byte) 0xa4, (byte) 0xf9, (byte) 0xfe, (byte) 0xf7, (byte) 0xf0, (byte) 0xe5, (byte) 0xe2, - (byte) 0xeb, (byte) 0xec, (byte) 0xc1, (byte) 0xc6, (byte) 0xcf, (byte) 0xc8, (byte) 0xdd, (byte) 0xda, (byte) 0xd3, - (byte) 0xd4, (byte) 0x69, (byte) 0x6e, (byte) 0x67, (byte) 0x60, (byte) 0x75, (byte) 0x72, (byte) 0x7b, (byte) 0x7c, - (byte) 0x51, (byte) 0x56, (byte) 0x5f, (byte) 0x58, (byte) 0x4d, (byte) 0x4a, (byte) 0x43, (byte) 0x44, (byte) 0x19, - (byte) 0x1e, (byte) 0x17, (byte) 0x10, (byte) 0x05, (byte) 0x02, (byte) 0x0b, (byte) 0x0c, (byte) 0x21, (byte) 0x26, - (byte) 0x2f, (byte) 0x28, (byte) 0x3d, (byte) 0x3a, (byte) 0x33, (byte) 0x34, (byte) 0x4e, (byte) 0x49, (byte) 0x40, - (byte) 0x47, (byte) 0x52, (byte) 0x55, (byte) 0x5c, (byte) 0x5b, (byte) 0x76, (byte) 0x71, (byte) 0x78, (byte) 0x7f, - (byte) 0x6a, (byte) 0x6d, (byte) 0x64, (byte) 0x63, (byte) 0x3e, (byte) 0x39, (byte) 0x30, (byte) 0x37, (byte) 0x22, - (byte) 0x25, (byte) 0x2c, (byte) 0x2b, (byte) 0x06, (byte) 0x01, (byte) 0x08, (byte) 0x0f, (byte) 0x1a, (byte) 0x1d, - (byte) 0x14, (byte) 0x13, (byte) 0xae, (byte) 0xa9, (byte) 0xa0, (byte) 0xa7, (byte) 0xb2, (byte) 0xb5, (byte) 0xbc, - (byte) 0xbb, (byte) 0x96, (byte) 0x91, (byte) 0x98, (byte) 0x9f, (byte) 0x8a, (byte) 0x8d, (byte) 0x84, (byte) 0x83, - (byte) 0xde, (byte) 0xd9, (byte) 0xd0, (byte) 0xd7, (byte) 0xc2, (byte) 0xc5, (byte) 0xcc, (byte) 0xcb, (byte) 0xe6, - (byte) 0xe1, (byte) 0xe8, (byte) 0xef, (byte) 0xfa, (byte) 0xfd, (byte) 0xf4, (byte) 0xf3}; } \ No newline at end of file diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java index 27c2838..6e078a3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java @@ -1,9 +1,6 @@ package com.casic.missiles.parser.safe.impl; -import cn.hutool.core.util.CharsetUtil; -import cn.hutool.crypto.symmetric.SM4; -import cn.hutool.crypto.symmetric.SymmetricCrypto; - +import com.casic.missiles.parser.safe.SafeStrategy; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; @@ -11,19 +8,44 @@ import org.bouncycastle.crypto.engines.SM4Engine; import org.bouncycastle.crypto.params.KeyParameter; import org.bouncycastle.util.encoders.Hex; - -import static cn.hutool.crypto.Mode.ECB; -import static cn.hutool.crypto.Padding.NoPadding; +import org.springframework.stereotype.Component; /** * SM4算法工具类 */ @Slf4j -public class Sm4 { +@Component("sm4") +public class Sm4 implements SafeStrategy { //加解密的字节快大小 public static final int BlockSize = 16; + @Override + public String decryption(String cipher) { + byte[] keyByte = { + 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 + }; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(keyByte); + byte[] in = Hex.decode(cipher); + byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); + String plain = EcbDecrypt(in, keyBytes); + return plain; + } + + @Override + public String encryption(String cipher) { + byte[] keyByte = { + 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 + }; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(keyByte); + byte[] in = Hex.decode(cipher); + byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); + String plain = EcbDecrypt(in, keyBytes); + return plain; + } + /** * SM4ECB加密算法,对内 * @@ -32,8 +54,6 @@ * @return */ private static byte[] ecb_encrypt(byte[] in, byte[] keyBytes) { - - SM4Engine sm4Engine = new SM4Engine(); sm4Engine.init(true, new KeyParameter(keyBytes)); byte[] out = new byte[in.length]; @@ -58,27 +78,6 @@ return cipher; } - - /** - * hutool 解密SM4 - * - * @param encodeContent - * @return - */ - public static String decode(String encodeContent) { - String key = "24ad182507479a5da3ad94d9d78ea203"; - try { - SymmetricCrypto sm4 = new SM4(ECB, NoPadding, key.getBytes()); - String decryptStr = sm4.decryptStr(encodeContent, CharsetUtil.CHARSET_UTF_8); - return decryptStr; - } catch (Exception e) { - e.printStackTrace(); - log.error("SM4解密失败"); - } - return null; - } - - /** * SM4的ECB加密算法 * @@ -129,20 +128,6 @@ return plain; } - /** - * SM4的ECB解密算法 - * - * @param cipher 输入的密文字符串 - * @param key 密钥 - * @return - */ - public static String EcbDecrypt(String cipher, String key) { - byte[] in = Hex.decode(cipher); - byte[] keyBytes = Hex.decode(key); - - String plain = EcbDecrypt(in, keyBytes); - return plain; - } /** * 主函数 @@ -151,28 +136,24 @@ */ public static void main(String[] args) { byte[] ciphertext = { + 0x4B, (byte) 0x8C, (byte) 0x9D, 0x08, (byte) 0xE4, (byte) 0xD3, 0x64, 0x42, (byte) 0xB9, (byte) 0xA5, (byte) 0xFE, (byte) 0xCD, (byte) 0x91, 0x1B, 0x38, (byte) 0xAC, (byte) 0xE9, 0x1C, (byte) 0xCD, 0x53, 0x02, (byte) 0xD7, 0x0C, (byte) 0x9B, (byte) 0x96, 0x30, 0x62, (byte) 0xE8, (byte) 0xFB, (byte) 0xEF, (byte) 0xB9, (byte) 0xFF, (byte) 0xDE, 0x19, (byte) 0x80, 0x35, 0x3E, (byte) 0x90, 0x4F, 0x2F, 0x12, 0x2B, 0x19, (byte) 0x8B, 0x6C, 0x7A, (byte) 0x85, (byte) 0xA1, (byte) 0xB1, (byte) 0x86, (byte) 0xA3, 0x7A, 0x46, 0x0C, 0x2F, (byte) 0x94, 0x4F, 0x7F, 0x2C, 0x56, 0x14, (byte) 0xF3, (byte) 0x89, (byte) 0xC3, - 0x3F, 0x20, (byte) 0xF9, (byte) 0x87, (byte) 0xA1, 0x60, (byte) 0xD9, (byte) 0xA8, (byte) 0xFD, (byte) 0xD7, (byte) 0x9B, 0x4B, 0x26, 0x06, 0x30, 0x44}; + 0x3F, 0x20, (byte) 0xF9, (byte) 0x87, (byte) 0xA1, 0x60, (byte) 0xD9, (byte) 0xA8, (byte) 0xFD, (byte) 0xD7, (byte) 0x9B, 0x4B, 0x26, 0x06, 0x30, 0x44 + }; ByteBuf in = ByteBufAllocator.DEFAULT.heapBuffer(); in.writeBytes(ciphertext); - byte[] keyByte = { 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 }; ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); - key.writeBytes(ciphertext); - String resCipherData = decode(ByteBufUtil.hexDump(in)); - ByteBuf out = ByteBufAllocator.DEFAULT.heapBuffer(); -// out.writeBytes(resCipherData); -// System.out.println(hexBytes); - System.out.println(resCipherData.toString()); -// String resPlainData = EcbDecrypt(resCipherData, key); -// System.out.println("原始明文:" + data); -// System.out.println("解密后明文:" + resPlainData); + key.writeBytes(keyByte); +// String resCipherData = EcbDecrypt(ByteBufUtil.hexDump(in), ByteBufUtil.hexDump(key)); +// System.out.println(resCipherData); } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java index 1395a51..ac5f957 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java @@ -1,7 +1,7 @@ package com.casic.missiles.parser.safe.impl; import io.netty.buffer.ByteBufUtil; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** *

@@ -14,9 +14,8 @@ * @author hyl * @version v1.0: Tea.java, v 0.1 2021/3/12 13:48 $ */ -@Service("tea") -///tea算法类 - +//tea算法类 +@Component("tea") public class Tea { public static byte[] MyTea_Encrypt(byte[] MyTeaContent, int ByteLen, byte[] MyTeakey) { @@ -99,7 +98,6 @@ // for(int i32Index = 0; i32Index < 8; i32Index++) { // System.out.print("0x" + Integer.toHexString(MyContent[i32Index]) + " "); // } - // System.out.println("密钥为:"); // for(int i32Index = 0; i32Index < 16; i32Index++) { // System.out.print("0x" + Integer.toHexString(MyKeys[i32Index]) + " "); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java index bdd0721..bd1516a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java @@ -3,7 +3,7 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.parser.sender.DataSubscribeProvider; import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponents; import org.springframework.web.util.UriComponentsBuilder; @@ -12,7 +12,7 @@ import java.util.Collections; import java.util.Map; -@Service("functionCallback") +@Component("functionCallback") public class FunctionCallback implements DataSubscribeProvider { @Resource diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java index 0b44fb9..7526de2 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.Map; -@Service("middleware") +@Component("middleware") public class MiddlewareSubscribe implements DataSubscribeProvider { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java index 5dcee3f..e2f1192 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.Map; -@Service("nosql") +@Component("nosql") public class NoSqlSubscribe implements DataSubscribeProvider { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java b/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java new file mode 100644 index 0000000..81a5324 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java @@ -0,0 +1,86 @@ +package com.casic.missiles.pojo; + +import lombok.Data; + +/** + * 协议 + */ +@Data +public class Msg { + + /** + * 前导码 + */ + private String preamble; + + /** + * 版本号 + */ + private String version; + + /** + * 内容长度 + */ + private int leng; + + /** + * 设备ID + */ + private String deviceId; + + /** + * 通讯方式 + */ + private Integer connType; + + /** + * 加密方式 + */ + private Integer encryType; + + /** + * 目标地址 + */ + private String destAddr; + + /** + * PDUType + */ + private String PDUType; + + /** + * 操作类型 + */ + private Integer operateType; + + /** + * 传输控制位 PDUType.bit7=0时,表示存在后续的访问;当PDUType.bit7=1时,表示无后续的访问。 + */ + private Integer transControlFlag; + + /** + * 设备类型 + */ + private Integer deviceType; + + /** + * 序号 + */ + private Integer seq; + + /** + * tagList + */ + private String tagList; + + /** + * OidList + */ + private String OidList; + + /** + * CRC + */ + private String CRC; + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java index 40a5265..97cc984 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java @@ -40,7 +40,7 @@ String httpContent = msg.toString(Charset.defaultCharset()); log.info(" String : " + msg.toString(Charset.defaultCharset())); String majorContent = httpContent.substring(httpContent.indexOf("{"), httpContent.lastIndexOf("}") + 1); - String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("serviceData")).get("Value")); + String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("RegistryData")).get("Value")); log.info("----------------------------------" + values); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); bufferContent.writeBytes(values.getBytes(Charset.forName("ISO-8859-1"))); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java index 1b132a7..e3ced4b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java @@ -35,7 +35,7 @@ String httpContent = msg.toString(Charset.defaultCharset()); log.info(" String : " + msg.toString(Charset.defaultCharset())); String majorContent = httpContent.substring(httpContent.indexOf("{"), httpContent.lastIndexOf("}") + 1); - String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("serviceData")).get("Value")); + String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("RegistryData")).get("Value")); log.info("----------------------------------" + values); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); bufferContent.writeBytes(values.getBytes(Charset.forName("ISO-8859-1"))); diff --git a/sensorhub-core/src/main/resources/application.properties b/sensorhub-core/src/main/resources/application.properties deleted file mode 100644 index 8b13789..0000000 --- a/sensorhub-core/src/main/resources/application.properties +++ /dev/null @@ -1 +0,0 @@ - diff --git a/sensorhub-core/src/main/resources/config/application-dev.yml b/sensorhub-core/src/main/resources/config/application-dev.yml index 4f897a8..dcc4c2d 100644 --- a/sensorhub-core/src/main/resources/config/application-dev.yml +++ b/sensorhub-core/src/main/resources/config/application-dev.yml @@ -4,9 +4,9 @@ spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true + url: jdbc:mysql://127.0.0.1:3306/sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true username: root - password: Casic203 + password: root session: store-type: redis redis: diff --git a/sensorhub-core/src/main/resources/config/application.yml b/sensorhub-core/src/main/resources/config/application.yml index ae89f9d..7965da1 100644 --- a/sensorhub-core/src/main/resources/config/application.yml +++ b/sensorhub-core/src/main/resources/config/application.yml @@ -30,6 +30,13 @@ port: 6379 password: ew5T4K3#203lwh config-prefix: 'Casic:' +#代码生成器配置 +code: + generate: + #作者 + author: cz + #待生成对象表名 + table-name: bussiness_field_config,combined_field_config sensorhub: config: port: 7091 diff --git a/sensorhub-support/pom.xml b/sensorhub-support/pom.xml index 9a71296..761601c 100644 --- a/sensorhub-support/pom.xml +++ b/sensorhub-support/pom.xml @@ -42,6 +42,12 @@ ${redis.version} + + com.baomidou + mybatis-plus-generator + ${mybatis-plus-generator.version} + + org.reflections diff --git a/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java b/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java new file mode 100644 index 0000000..515ca53 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java @@ -0,0 +1,14 @@ +package com.casic.missiles.enums; + +/** + * @author + * @date + */ +public interface FixedPropertyEnum { + + String FIXED_POSITION = "fixedPosition"; + + String TOTAL_LENGTH = "totalLength"; + + String TAIL_POSITION = "tailPosition"; +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/CombinedFieldMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CombinedFieldMapper.java new file mode 100644 index 0000000..38e8f42 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CombinedFieldMapper.java @@ -0,0 +1,15 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.CombinedFieldConfig; +import org.apache.ibatis.annotations.Mapper; + +/** + * @author cz + * + */ +@Mapper +public interface CombinedFieldMapper extends BaseMapper { + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java new file mode 100644 index 0000000..128b09d --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java @@ -0,0 +1,10 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.CommandEventConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface CommandEventMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java new file mode 100644 index 0000000..042eb3c --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.DatagramEventConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface DatagramEventConfigMapper extends BaseMapper { +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java new file mode 100644 index 0000000..fc95cf4 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java @@ -0,0 +1,8 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.FieldConfig; + +public interface FieldConfigMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldRuleConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldRuleConfigMapper.java new file mode 100644 index 0000000..b310a08 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldRuleConfigMapper.java @@ -0,0 +1,10 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.FieldRuleConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface FieldRuleConfigMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java new file mode 100644 index 0000000..9060a69 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.ProtocolConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface ProtocolConfigMapper extends BaseMapper { +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolFieldConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolFieldConfigMapper.java new file mode 100644 index 0000000..1b47180 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolFieldConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +public interface ProtocolFieldConfigMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java new file mode 100644 index 0000000..6fa6936 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.RuleConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface RuleConfigMapper extends BaseMapper { +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/AbstractFieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/AbstractFieldConfig.java new file mode 100644 index 0000000..ba9aea2 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/AbstractFieldConfig.java @@ -0,0 +1,38 @@ +package com.casic.missiles.pojo; + +import lombok.Data; + +@Data +public class AbstractFieldConfig { + /** + * 字段名称 + */ + private String fieldName; + /** + * 按照字段评估进行字段解析 + */ + private String ruleJson; + /** + * 起始位置(单位byte) + */ + private Integer OriginPositionByte; + /** + * 起始位置,是否需要bit位置(单位bit)小于8, 没有不需要填写 + */ + private String OriginPositionBit; + /** + * 偏移长度 + */ + private Integer offsetLength; + /** + * 偏移单位(bit/byte) + */ + private String offsetUnit; + /** + * 是否需要转存 + */ + private Integer isStorage; + + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/CombinedFieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/CombinedFieldConfig.java new file mode 100644 index 0000000..4f4de6a --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/CombinedFieldConfig.java @@ -0,0 +1,41 @@ +package com.casic.missiles.pojo; + +import lombok.Data; + +import java.util.Date; + +/** + * 组合配置 + * + * @author cz + * @date 20 + */ +@Data +public class CombinedFieldConfig { + + private Long id; + private Long ruleId; + /** + * 前缀编码 + */ + private String prefixCode; + + /** + * 字段动态的id + */ + private Long dynamicLengthId; + /** + * 对应的要解析字段的ids + */ + private String dataFieldIds; + + /** + * 字段动态的id + */ + private String combinedFieldIds; + + private Date lastTime; + + private Date createTime; + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldConfig.java index a07d20d..8304dc6 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldConfig.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldConfig.java @@ -5,31 +5,28 @@ import java.util.Date; +/** + * @author cz + * 1、该表与实际解析的内容实例解析有关 + * 2、该表字段是随机出现的,和帧结构无关,无法预料的 + * 3、该表字段解析根据FieldEvaluatorConfig进行字段解析 + */ @Data -@TableName("field_config") -public class FieldConfig { +@TableName("business_field_config") +public class FieldConfig extends AbstractFieldConfig { private Long id; -// private String preFieldConfig; - private Long protocolId; - - private String isFixed; - private String uploadDeliveryChange; - - private String replyRule; - private String ruleJson; - + /** + * 协议配置id + */ + private Long ruleId; + /** + * 字段名称 + */ private String fieldName; - private String isStorage; - private Integer orignPosition; - private String exactOrignPosition; - - private Integer offsetLength; - private String offsetUnit; private String ownerId; private Date createTime; private Date lastTime; - } diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldRuleConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldRuleConfig.java new file mode 100644 index 0000000..2e09879 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldRuleConfig.java @@ -0,0 +1,20 @@ +package com.casic.missiles.pojo; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +@TableName("field_rule_config") +@Data +public class FieldRuleConfig { + + private Long id; + private String name; + private String desc; + private String condition; + private String excuteOperation; + private Date lasTime; + private Date createTime; + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/Msg.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/Msg.java deleted file mode 100644 index 81a5324..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/Msg.java +++ /dev/null @@ -1,86 +0,0 @@ -package com.casic.missiles.pojo; - -import lombok.Data; - -/** - * 协议 - */ -@Data -public class Msg { - - /** - * 前导码 - */ - private String preamble; - - /** - * 版本号 - */ - private String version; - - /** - * 内容长度 - */ - private int leng; - - /** - * 设备ID - */ - private String deviceId; - - /** - * 通讯方式 - */ - private Integer connType; - - /** - * 加密方式 - */ - private Integer encryType; - - /** - * 目标地址 - */ - private String destAddr; - - /** - * PDUType - */ - private String PDUType; - - /** - * 操作类型 - */ - private Integer operateType; - - /** - * 传输控制位 PDUType.bit7=0时,表示存在后续的访问;当PDUType.bit7=1时,表示无后续的访问。 - */ - private Integer transControlFlag; - - /** - * 设备类型 - */ - private Integer deviceType; - - /** - * 序号 - */ - private Integer seq; - - /** - * tagList - */ - private String tagList; - - /** - * OidList - */ - private String OidList; - - /** - * CRC - */ - private String CRC; - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/PreRuleConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/PreRuleConfig.java deleted file mode 100644 index bfcf914..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/PreRuleConfig.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.casic.missiles.pojo; - -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -import java.util.Date; - -@Data -@TableName("pre_rule_config") -public class PreRuleConfig { - - private Long id; - private String protocolId; - private String ruleFieldId; - private String ownerId; - private Date createTime; - private Date lastTime; -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolConfig.java index 274ad42..bdac11f 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolConfig.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolConfig.java @@ -5,18 +5,52 @@ import java.util.Date; +/** + * 协议配置表,协议配置与帧结构有关 + * 1、层级关系,协议之后是规则,规则对应设备类型的各种上数规则 + * 2、规则对应协议配置的实例流程 + * 3、每种可根据设备类型和操作类型进行上数规则进行区分 + */ @Data @TableName("protocol_config") public class ProtocolConfig { private Long id; + /** + * 前导码 + */ private String preFix; - private String unpackId; - private String totalLengthId; - private String totalLengthFilterField; + /** + * 拆包id + */ + private Long unpackId; + /** + * 总长度id + */ + private Long totalLengthId; + /** + * + */ + private String totalLengthFilterFields; + /** + * 动态长度ids + */ private String dynamicLengthId; + /** + * 动态长度json(预留字段) + */ private String dynamicLengthJson; - private String tailStr; + /** + * 规则字段所解析预准备的字段 + */ + private String rulePrepareFields; + /** + * 结尾标志 + */ + private Long tailStr; + /** + * 备注 + */ private String remark; private String ownerId; private Date createTime; diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolFieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolFieldConfig.java new file mode 100644 index 0000000..db794bd --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolFieldConfig.java @@ -0,0 +1,43 @@ +package com.casic.missiles.pojo; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +/** + * 协议字段配置表 + * 该表用户存放帧结构固定格式的字段 + * 有以下两个用途 + * (1)、固定格式的字段可用于规则匹配 + * (2)、固定格式的字段可用于报文回复 + * @author cz + * @date 2023-06-09 + */ +@Data +@TableName("protocol_field_config") +public class ProtocolFieldConfig extends AbstractFieldConfig{ + + private Long id; + /** + * 协议配置id + */ + private Long protocolId; + /** + * 上传下发是否有变化, 没有变化,可以直接组装 + */ + private String isReplyFix; + /** + * 按照字段评估进行字段解析 + */ + private Long fieldEvaluatorId; + /** + * 回复规则 + */ + private String replyRule; + + private String ownerId; + private Date createTime; + private Date lastTime; + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java index 3b53493..febf835 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java @@ -6,18 +6,40 @@ import java.util.Date; /** - * 加密字段解析和规则有关,事件调到该流程下面 + * @author cz + * todo: 匹配协议对应业务实例 + * 1、一个协议可以多种的流程规则 + * 2、规则可以支持递归规则流程 */ @Data @TableName("rule_config") public class RuleConfig { - private Long id; private String protocolId; - private String isBizField; - private String parseRuleJson; + /** + * 是否完成规则配置,没有完成, + * 则需要根据规则继续匹配 + */ + private String isFinishMatch; + /** + * 待匹配解析规则 + * {“data_field”:"data_value"} + */ + private String matchRuleJson; + /** + * 待解析字段ids + */ private String dataFieldIds; - private String aviatorFilterJson; + + /** + * 待解析组合字段ids + */ + private String combinedFieldIds; + + /** + * aviator + */ + private String conditionExpression; private Date createTime; private Date lastTime; } diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleDict.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleDict.java deleted file mode 100644 index cc7f389..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleDict.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.casic.missiles.pojo; - -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -@Data -@TableName("rule_dict") -public class RuleDict { - - private Long id; - private Long pid; - private String name; - private String code; - private String ownerId; - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleEvaluator.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleEvaluator.java deleted file mode 100644 index ed16610..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleEvaluator.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.pojo; - -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -import java.util.Date; - -@TableName("rule_evaluator") -@Data -public class RuleEvaluator { - - private Long id; - private String name; - private String desc; - private String condition; - private String excuteOperation; - private Date lasTime; - private Date createTime; - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/CombinedFieldConfigRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/CombinedFieldConfigRegistry.java new file mode 100644 index 0000000..fa59b90 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/CombinedFieldConfigRegistry.java @@ -0,0 +1,12 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.CombinedFieldConfig; + +import java.util.List; + +public interface CombinedFieldConfigRegistry { + + List getCombinedFieldConfigList(Long ruleId); + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/CommandEventRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/CommandEventRegistry.java new file mode 100644 index 0000000..fb97d87 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/CommandEventRegistry.java @@ -0,0 +1,8 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.CommandEventConfig; + +public interface CommandEventRegistry { + + CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName); +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/DatagramEventRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/DatagramEventRegistry.java new file mode 100644 index 0000000..fb34641 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/DatagramEventRegistry.java @@ -0,0 +1,11 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.DatagramEventConfig; + +import java.util.List; + +public interface DatagramEventRegistry{ + + List getDatagramEventList(Long ruleId); + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java index 608af3a..32cc8a4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java @@ -2,48 +2,47 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.delivery.decorator.ByteDecorator; +import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @AllArgsConstructor public class FieldDecoratorManger { - private final RuleDictDao ruleDictDao; + private final RuleConfigRegistry ruleDictDao; // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 // (1)静态的业务字段是字典里面可以配置的 // (2)动态的业务字段是通过规则生成的 public String contentMerge(String ruleJson, String sceneConent, String dynamicContent) { - List ruleDictList = ruleDictDao.getRuleDictConfig(); - Map ruleDictMap = ruleDictList.stream().collect( - Collectors.toMap(RuleDict::getId, e -> e)); - List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); - for (Map ruleMap : ruleMapList) { - String ruleType = String.valueOf(ruleMap.get("ruleType")); - ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); - NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); - byteDecorator.nodeDecoratorRule(nodeDecoratorParm); - } +// List ruleDictList = ruleDictDao.getRuleDictConfig(); +// Map ruleDictMap = ruleDictList.stream().collect( +// Collectors.toMap(RuleDict::getId, e -> e)); +// List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); +// for (Map ruleMap : ruleMapList) { +// String ruleType = String.valueOf(ruleMap.get("ruleType")); +// ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); +// NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); +// byteDecorator.nodeDecoratorRule(nodeDecoratorParm); +// } return null; } - - private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { - NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() - .contents(sceneConent) - .dynamicContent(dynamicContent) - .ruletypeId(ruletypeId) - .ruleDictMap(ruleDictMap) - .build(); - return nodeDecoratorParm; - } +// +// private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { +// NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() +// .contents(sceneConent) +// .dynamicContent(dynamicContent) +// .ruletypeId(ruletypeId) +// .ruleDictMap(ruleDictMap) +// .build(); +// return nodeDecoratorParm; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java index 652970c..b204ac3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java @@ -1,56 +1,56 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@AllArgsConstructor -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", - JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Component; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Component("logicalDecorator") +//@AllArgsConstructor +//@Slf4j +//public class LogicalShiftDecorator implements ByteDecorator { +// +//// private final FieldRuleEngineMapper fieldRuleEngineMapper; +//// +//// //字节位移 +//// @Override +//// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +//// String logicalValue = ""; +//// RuleEvaluator fieldRuleEngine = new RuleEvaluator(); +//// try { +//// Map env2 = new HashMap(); +//// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +//// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +//// for (String contentId : contentIdList) { +//// RuleDict ruleDict = ruleDictMap.get(contentId); +//// if (ruleDict.getCode().contains("#")) { +//// //使用动态的值 +//// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +//// } +//// env2.put(ruleDict.getName(), ruleDict.getCode()); +//// } +//// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +//// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +//// return null; +//// } +//// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +//// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +//// return values; +//// } catch (Exception ex) { +//// log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", +//// JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +//// return null; +//// } +//// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java index 346468f..822fead 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@AllArgsConstructor -@Slf4j -public class OperationDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("optionDecorator") +//@AllArgsConstructor +//@Slf4j +//public class OperationDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //混合运算,有常量或者乘除的缩放 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java index 50fb0a7..7a8bccb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@AllArgsConstructor -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +////精度计算 +//@AllArgsConstructor +//@Registry("precisionDecorator") +//@Slf4j +//public class PrecisionDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java index da39235..27f9cc7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java @@ -1,54 +1,53 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@AllArgsConstructor -@Slf4j -public class RuleDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("ruleDecorator") +//@AllArgsConstructor +//@Slf4j +//public class RuleDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //吃我一套正则表达式 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (Exception ex) { +// log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java index 7f5cbf3..c043f97 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java @@ -2,6 +2,6 @@ import java.util.Map; -public interface ComandeEventService { +public interface ComandeEventService{ Map loadComandeEventConfig(String protocolId,String scene); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java index 476ad84..aaf1837 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java @@ -2,46 +2,46 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.dao.CommandEventDao; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @Slf4j @AllArgsConstructor -public class ComandeEventServiceImpl implements ComandeEventService { +public class ComandeEventServiceImpl implements ComandeEventRegistry { - private final CommandEventDao commandEventDao; + // private final CommandEventDao commandEventDao; // 加密bean 固定字段出现变化的字段解析,业务字段的有序内容 @Override - public Map loadComandeEventConfig(String protocolId,String sceneName) { - CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); - if (ObjectUtil.isEmpty(commandEventConfig)) { - log.error("协议{},没有配置成功接收回复配置,清排查原因"); - return null; - } - String replyJson = commandEventConfig.getReplyContentJson(); - List> replyMapList = JSONArray.parseObject(replyJson, List.class); - List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); - Map fixMap = fixList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); - List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) - .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) - .collect(Collectors.toList()); - Map commandConfigMap = new HashMap<>(); - commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); - commandConfigMap.put("fixContent", fixMap); - commandConfigMap.put("bizContent", contentList); - return commandConfigMap; + public Map loadComandeEventConfig(String protocolId, String sceneName) { +// CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); +// if (ObjectUtil.isEmpty(commandEventConfig)) { +// log.error("协议{},没有配置成功接收回复配置,清排查原因"); +// return null; +// } +// String replyJson = commandEventConfig.getReplyContentJson(); +// List> replyMapList = JSONArray.parseObject(replyJson, List.class); +// List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); +// Map fixMap = fixList.stream() +// .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); +// List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) +// .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) +// .collect(Collectors.toList()); +// Map commandConfigMap = new HashMap<>(); +// commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); +// commandConfigMap.put("fixContent", fixMap); +// commandConfigMap.put("bizContent", contentList); +// return commandConfigMap; + return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 128b09d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java deleted file mode 100644 index 4016b0b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface DatagramEventMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java deleted file mode 100644 index 597c306..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.apache.ibatis.annotations.Mapper; - -public interface FieldConfigMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java deleted file mode 100644 index a31680a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.PreRuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface PreRuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java deleted file mode 100644 index 9060a69..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface ProtocolConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java deleted file mode 100644 index 6fa6936..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java deleted file mode 100644 index 582a705..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleDict; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleDictMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java deleted file mode 100644 index 6e302c8..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.CommandEventMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Optional; - -@Component -public class CommandEventDao { - - @Resource - private CommandEventMapper commandEventMapper; - - public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId) - .eq("scene", sceneName) - .eq("enabled", 1); - List commandEventConfig = commandEventMapper.selectList(queryWrapper); - Optional optionalEventConfig = commandEventConfig.stream().findFirst(); - return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java deleted file mode 100644 index 9137e4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.FieldConfigMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class FieldConfigDao { - - @Resource - private FieldConfigMapper fieldConfigMapper; - - public FieldConfig getFieldConfigById(String fieldId) { - FieldConfig fieldConfig = fieldConfigMapper.selectById(fieldId); - return fieldConfig; - } - - public List getFieldConfigs(String protocolId,Integer isFixed) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",isFixed); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - - public List getStorageFieldConfig(String protocolId) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",1) - .eq("is_storage",1); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java deleted file mode 100644 index 67bff6b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.mapper.PreRuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class PreRuleConfigDao { - - @Resource - private PreRuleConfigMapper preRuleConfigMapper; - - public List getPreRuleList(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return preRuleConfigMapper.selectList(queryWrapper); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java deleted file mode 100644 index d69ea85..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.RuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleConfigDao { - - @Resource - private RuleConfigMapper ruleConfigMapper; - - public RuleConfig getNextRuleConfig(String ruleFields) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("parse_rule_json", ruleFields); - return ruleConfigMapper.selectOne(queryWrapper); - } - - - public List getRuleConfigById(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return ruleConfigMapper.selectList(queryWrapper); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java deleted file mode 100644 index 932c185..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.RuleDictMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleDictDao { - - @Resource - private RuleDictMapper ruleDictMapper; - - public List getRuleDictConfig() { - List ruleDictList = ruleDictMapper.selectList(null); - return ruleDictList; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java index 9f9e279..43bc4d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java @@ -10,20 +10,15 @@ import io.netty.channel.socket.nio.NioServerSocketChannel; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import javax.annotation.PreDestroy; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static cn.hutool.core.util.ClassUtil.getClasses; /** * SensorhubServer netty服务端 */ @Slf4j -@Service +@Component public class SensorhubServer { /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java index 2c79ff5..9a28c36 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java @@ -11,13 +11,13 @@ import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioSocketChannel; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClient 客户端 */ @Slf4j -@Service +@Registry public final class SensorhubClient { public static void main(String[] args) throws Exception { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java index 9774be0..477c3f7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java @@ -6,12 +6,12 @@ import io.netty.channel.socket.SocketChannel; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientChannelInitialHandler */ -@Service +@Registry public class SensorhubClientChannelInitialHandler extends ChannelInitializer { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java index 346f4b3..73560e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java @@ -5,13 +5,13 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientHandler */ @Slf4j -@Service +@Registry public class SensorhubClientHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java index 5c1c6f2..d990af5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java @@ -4,12 +4,12 @@ import com.casic.missiles.pojo.Msg; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** * SensorhubServerHandler */ -@Service +@Component public class SensorhubServerHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 67283ae..af3172c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,41 +1,37 @@ package com.casic.missiles.parser; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultProtocolConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.*; +import com.casic.missiles.registry.FieldConfigRegistry; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; -import java.nio.charset.Charset; import java.util.HashMap; import java.util.List; import java.util.Map; -@Service("genericProtocolParser") +/** + * @author + */ +@Component("genericProtocolParser") @Slf4j -@AllArgsConstructor +@RequiredArgsConstructor public class GenericProtocolParser implements ProtocolParser { - private final LeadingCodeMatcher leadingCodeMatcher; private final List frameStructDispenserList; - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorInstanceSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; // 匹配首字母前导码=> 帧结构匹配前导码=> // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 @@ -44,18 +40,19 @@ public Boolean doParseProtocol(ByteBuf byteBuf) { String protocolContent = ByteBufUtil.hexDump(byteBuf); //匹配前导码 - List preCodeConfigs = leadingCodeMatcher.matchLeadingCode(protocolContent); + List preCodeConfigs = LeadingCodeMatcher.matchFrameLeadingCode(protocolContent); //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 if (preCodeConfigs.size() == 0) { - return rematch(byteBuf,protocolContent); + return rematch(byteBuf, protocolContent); } - //暂时先取第一个 + //暂时先取第一个,提升速度,使用享元模式, 减少类的创建销毁与构建 ProtocolConfig protocolConfig = preCodeConfigs.get(0); + AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); ByteBuf wholeDatagramByte = null; //通过匹配帧结构获取完整的数据包 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, preCodeConfigs.get(0))) != null) { + if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, protocolFactory)) != null) { break; } } @@ -68,76 +65,78 @@ * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 */ - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId, wholeDatagramByte); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap, protocolId); - //选取规则对应的流程实例 - DatagramEventConfig datagramEventConfig = processorInstanceSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); + //进行规则字段解析,进行匹配规则 + RuleConfig ruleConfig = getRuleConfig(protocolFactory, wholeDatagramByte); + if (ruleConfig == null) { + return false; + } //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, wholeDatagramByte); + ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte); + //以下进行业务的规则解析,同时选定流程实例 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); + DatagramEventProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain, + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText, protocolId); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain); //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); + datagramEventProvider.storeData(bizDataMap); return true; } - private Boolean rematch(ByteBuf byteBuf,String protocolContent) { + /** + * 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 + */ + private Boolean rematch(ByteBuf byteBuf, String protocolContent) { //重置位判断 byteBuf.resetReaderIndex(); //判断重置是否前移,如果没有前移,则直接判为匹配失败 if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { return false; } else { + //递归执行 return doParseProtocol(byteBuf); } } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; + //获取匹配规则->匹配规则 + private RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + //取出其中参与逻辑provider并判空 + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); + String rulePrepareFields = protocolConfig.getRulePrepareFields(); + //固定字段 + if (StringUtils.isNotEmpty(rulePrepareFields)) { + //获取统一固定字段解析 + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + //获取该协议的字段配置,用于协议规则匹配 + List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); + //获取规则 + RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, + rulePrepareFields, protocolFieldConfigs); + return ruleConfig; + } + return null; } - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + //数据构建,获取固定字段的store和业务字段store + private Map buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + Map bizDataMap = new HashMap<>(); + Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); + Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); + bizDataMap.putAll(ruleStoreObjectMap); + bizDataMap.putAll(protocolStoreObjectMap); return bizDataMap; } - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java index 8a46e32..16ce2e5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java @@ -3,6 +3,7 @@ import io.netty.buffer.ByteBuf; public interface ProtocolParser { + Boolean doParseProtocol(ByteBuf byteBuf); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java new file mode 100644 index 0000000..f7814af --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java @@ -0,0 +1,35 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.ProtocolConfigProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.ProtocolConfig; + +/** + * 存放基本协议的的加载信息 + */ +public class AbstractProtocolConfigFactory { + private final ProtocolConfigProvider protocolConfigProvider; + private final ProtocolFieldConfigProvider protocolFieldConfigProvider; + private final RuleConfigProvider ruleConfigProvider; + + public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { + this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); + this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); + this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); + } + + public ProtocolConfigProvider getProtocolConfigProvider() { + return protocolConfigProvider; + } + + public ProtocolFieldConfigProvider getProtocolFieldConfigProvider() { + return protocolFieldConfigProvider; + } + + public RuleConfigProvider getRuleConfigProvider() { + return ruleConfigProvider; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java new file mode 100644 index 0000000..6e36147 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java @@ -0,0 +1,57 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.CombinedFieldConfigProvider; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.FieldConfigProvider; +import com.casic.missiles.parser.provider.FieldRuleConfigProvider; + +/** + * 存放规则相关的的的加载信息 + */ +public class AbstractRuleConfigFactory { + + /** + * 处理字节 + */ + private final FieldConfigProvider fieldConfigProvider; + /** + * 处理组合字节解析的解码器 + */ + private final CombinedFieldConfigProvider combinedFieldConfigProvider; + /** + * 处理负责字节解析的规则配置 + */ + private final FieldRuleConfigProvider fieldRuleConfigProvider; + /** + * 处理实例流程 + */ + private final DatagramEventProvider datagramEventProvider; + + + public AbstractRuleConfigFactory(Long ruleId) { + this.fieldConfigProvider = new FieldConfigProvider(ruleId); + this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); + this.fieldRuleConfigProvider = new FieldRuleConfigProvider(ruleId); + this.datagramEventProvider = new DatagramEventProvider(ruleId); + } + + public FieldConfigProvider getFieldConfigProvider() { + return fieldConfigProvider; + } + + public CombinedFieldConfigProvider getCombinedFieldConfigProvider() { + return combinedFieldConfigProvider; + } + + public FieldRuleConfigProvider getFieldRuleConfigProvider() { + return fieldRuleConfigProvider; + } + + public DatagramEventProvider getDatagramEventProvider() { + return datagramEventProvider; + } + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java deleted file mode 100644 index 6e1719a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.factory; - - -import com.casic.missiles.pojo.ProtocolConfig; - -import java.util.List; - -/** - * 数据库访问优化(暂时未做) - *

- * 1、初始化协议解析配置,并存放到处存放缓存,对协议基本配置进行管理 - * 2、其中流程中所有的配置都经过此类进行管理,进行调用获取,增强解析速度 - */ -public interface DatagramFactory { - - /** - * 初始化 - */ - List datagramInit(); - - /** - * 根据前导码配置匹配,模糊匹配获取所有的报文项 - */ - List match(); - - /** - * 根据前导码匹配,返回报文项 - */ - List filer(); - - /** - * 保证数据的唯一性选择器 - */ - List selectOne(); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java new file mode 100644 index 0000000..87444a0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java @@ -0,0 +1,18 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +import java.util.List; + +/** + * 直接用,还是边用边创建 + */ +public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { + + + public DefaultProtocolConfigFactory(ProtocolConfig protocolConfig) { + super(protocolConfig); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java new file mode 100644 index 0000000..cce0c7c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java @@ -0,0 +1,12 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; + +public class DefaultRuleFactory extends AbstractRuleConfigFactory { + + public DefaultRuleFactory(Long ruleId) { + super(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java deleted file mode 100644 index 9ee97e0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.casic.missiles.parser.instance; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service -@Slf4j -@AllArgsConstructor -public class GeneralProcessor { - - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; - - /** - * 统一固定字段解析=>进行规则的查询的判断 - * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 - * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 - */ - @Deprecated - public boolean parseWholeDatagram(ByteBuf buffer, ProtocolConfig protocolConfig) { - try { - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap,protocolId); - //选取规则对应的流程= - DatagramEventConfig datagramEventConfig = processorSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); - //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); - //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); - //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); - //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); - //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); - return true; - } catch (Exception ex) { - log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", - ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); - return false; - } - } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; - } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); - } - - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); - return bizDataMap; - } - - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java index 25e7ad8..6a5777e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java @@ -1,23 +1,31 @@ package com.casic.missiles.parser.instance.impl; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.mapper.DatagramEventMapper; import com.casic.missiles.pojo.DatagramEventConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.SpringContextUtil; -@Service -@AllArgsConstructor +import java.util.List; +import java.util.Optional; + +/** + * @author cz + * + */ public class DefaultProcessorInstanceSelector implements ProcessorInstanceSelector { - private final DatagramEventMapper datagramEventMapper; + private static List datagramEventConfigs; + + static { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + datagramEventConfigs = datagramEventRegistry.getDatagramEventList(); + } @Override public DatagramEventConfig getProcessorInstance(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("rule_id", protocolId); - return datagramEventMapper.selectOne(queryWrapper); + Optional optionalSelectInstance = datagramEventConfigs.stream() + .filter(e -> e.getId().equals(protocolId)).limit(1).findFirst(); + return optionalSelectInstance.isPresent() ? optionalSelectInstance.get() : null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a778671..7b56a43 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,16 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import io.netty.buffer.ByteBuf; /** - * 分析匹配情况 - * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 - * 2、匹配不成功,有后续帧,可以进行下次匹配。 - * 3、匹配不成功,无后续帧,可以进行丢弃。 + * 分析匹配情况 + * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 + * 2、匹配不成功,有后续帧,可以进行下次匹配。 + * 3、匹配不成功,无后续帧,可以进行丢弃。 */ -public interface FrameStructMatcher{ +public interface FrameStructMatcher { - ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig); + ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 05320ab..8ebea78 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,23 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.ProtocolConfigMapper; +import com.casic.missiles.parser.provider.ProtocolConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Component; import java.util.List; import java.util.stream.Collectors; -@Component -@AllArgsConstructor public class LeadingCodeMatcher { - private final ProtocolConfigMapper protocolMapper; - //** 1、首字母匹配前导码, // 2、以匹配出的前导码是否在报文中条件进行前导码的匹配二次筛选 - public List matchLeadingCode(String protocolContent){ + public static List matchFrameLeadingCode(String protocolContent){ List initialConfigs = initialMatch(protocolContent); List preCodeConfigs = initialConfigs.stream() .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) @@ -26,13 +19,16 @@ } //初始化匹配前导码内容 - private List initialMatch(String protocolContent) { - String protocolStr = protocolContent.charAt(0) + ""; - QueryWrapper queryWrapper = new QueryWrapper() - .likeRight("pre_fix", protocolStr); - List protocolConfigList = protocolMapper.selectList(queryWrapper); - return protocolConfigList; + private static List initialMatch(String protocolContent) { + String firstFrameChar = protocolContent.charAt(0) + ""; + ProtocolConfigProvider protocolConfigProvider=new ProtocolConfigProvider(firstFrameChar); + return protocolConfigProvider.getMatchList(); } + + + + + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index cf2113d..e915877 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -1,32 +1,35 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(0) -@Service +@Component public class FrameLengthMatcher implements FrameStructMatcher { - @Autowired - private FieldParser fieldParser; - //超过长度 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { String dataGramContent = ByteBufUtil.hexDump(byteBuf); - if (StringUtils.isEmpty(protocolConfig.getUnpackId()) && StringUtils.isEmpty(protocolConfig.getTailStr())) { - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + //当不存在结尾标志和拆包标志,可以直接使用长度进行匹配 + if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { if (dataGramContent.length() >= totalLength) {//等于长度返回true,超出长度,切断 - ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, protocolConfig, totalLength); + ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, totalLength); return wholeDatagramByte; } else { //读的标志位前移舍弃 @@ -38,7 +41,7 @@ return null; } - private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, Integer totalLength) { byteBuf.readBytes(totalLength); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, totalLength - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 2bfc213..d527ad0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; @@ -13,7 +13,7 @@ import lombok.AllArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.nio.charset.Charset; import java.util.Map; @@ -22,32 +22,30 @@ * 后续标志验证 */ @Order(1) -@Service +@Component @AllArgsConstructor -public class FrameMarkMatcher implements FrameStructMatcher { - - private final FieldConfigDao fieldConfigDao; - private final FieldParser fieldParser; - private final FieldResolver fieldResolverManger; +public class FrameMarkMatcher implements FrameStructMatcher, FixedPropertyEnum { //帧后续标志=>结束,进行帧的重组=>有后续,1、帧移位判别 2、继续接收帧 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig UnpackConfig = StringUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getUnpackId()); - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); - Integer upback = 0; + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); ByteBuf mergeWholeFrameByte = null; - if (!ObjectUtil.isEmpty(UnpackConfig)) { - while (hasNextFullFrame(byteBuf, protocolConfig)) { - upback = (Integer) fieldResolverManger.filedParserManger(byteBuf, UnpackConfig, null); + if (!ObjectUtil.isEmpty(unpackFlag)) { + while (hasNextFullFrame(byteBuf, protocolConfig, protocolFieldConfigProvider)) { //是否存在后续位 - if (upback == 1) {//使用esayRule + if (unpackFlag == 1) {//使用esayRule //表示可以截取 - mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolConfig, totalLength); + mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolFieldConfigProvider, protocolConfig); return mergeWholeFrameByte; } else { - byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig)); + byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig, protocolFieldConfigProvider)); } } } @@ -56,7 +54,8 @@ //选取第一个帧,将业务内容和后面部分分开 //计算数据报文-业务内容 - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolFieldConfigProvider protocolFieldConfigProvider, ProtocolConfig protocolConfig) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); //截取完整报文 byteBuf.readBytes(totalLength); ByteBuf byteBufContent = byteBuf.slice(0, byteBuf.readerIndex()); @@ -68,15 +67,15 @@ String tail = ""; System.out.println(ByteBufUtil.hexDump(byteBufContent)); //会存在多个帧拼接在一起的的情况,进行合并处理 - while (hasNextFullFrame(byteBufContent, protocolConfig)) { - Integer currentFrameLength = fieldParser.getTotalLength(protocolConfig, byteBufContent); + while (hasNextFullFrame(byteBufContent, protocolConfig, protocolFieldConfigProvider)) { + Integer currentFrameLength = protocolFieldConfigProvider.getTotalLength(byteBufContent, protocolConfig); byteBufContent.readBytes(currentFrameLength); ByteBuf currentbyteBuf = byteBufContent.slice(0, byteBufContent.readerIndex()); byteBufContent.markReaderIndex();//读的标志位前移 System.out.println(ByteBufUtil.hexDump(byteBufContent)); String hexDump = currentbyteBuf.toString(Charset.forName("ISO-8859-1")); //获取当前固定帧结构的关系map - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, currentbyteBuf); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(currentbyteBuf, protocolConfig); if (StringUtils.isEmpty(mergeFrameStr)) { //首次获取业务数据报文 mergeFrameStr += hexDump.substring(0, currentFrameFixedProperty.get("tailPosition")); @@ -95,22 +94,22 @@ /** * 获取平移到下一帧起始位置 */ - public int getNextFrameOffset(ByteBuf buffer, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, buffer); - return currentFrameFixedProperty.get("totalLength"); + public int getNextFrameOffset(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + return currentFrameFixedProperty.get(TOTAL_LENGTH); } /** * 判断是否出错进行整个帧的 */ - public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, byteBuf); + public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); //保证读取位置不在固定位置,是可变的业务内容 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("fixedPosition")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(FIXED_POSITION)) { return false; } //判断读取是否操作帧长度 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("totalLength")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(TOTAL_LENGTH)) { return false; } return true; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 76a3784..c3a1bab 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -1,50 +1,50 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.parser.instance.GeneralProcessor; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; +import io.netty.buffer.ByteBufUtil;; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(2) -@Service +@Component public class FrameTailMatcher implements FrameStructMatcher { - @Resource - private FieldConfigDao fieldConfigDao; - @Autowired - private GeneralProcessor generalProcessor; - //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig tailFieldConfig = StringUtils.isEmpty(protocolConfig.getTailStr()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getTailStr()); - if (!ObjectUtil.isEmpty(tailFieldConfig)) { - String tailStr = tailFieldConfig.getFieldName(); + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfig protocolFieldConfig = ObjectUtils.isEmpty(protocolConfig.getTailStr()) ? null : + fieldConfigProvider.getFieldConfigById(protocolConfig.getTailStr()); + if (!ObjectUtil.isEmpty(protocolFieldConfig)) { + String tailStr = protocolFieldConfig.getFieldName(); String dataGramContent = ByteBufUtil.hexDump(byteBuf); Boolean tailFlag = ByteBufUtil.hexDump(byteBuf).contains(tailStr); if (!tailFlag) { //使用esayRule return null; } else if (dataGramContent.indexOf(tailStr) < dataGramContent.length() - tailStr.length()) { Integer length = dataGramContent.indexOf(tailStr) + tailStr.length(); - ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, protocolConfig, length); + ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, length); return wholeDatagramByte; //存在粘包 } } return null; } - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer length) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, Integer length) { byteBuf.readBytes(length); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, length - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java new file mode 100644 index 0000000..5f1c177 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java @@ -0,0 +1,73 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.combined.GenericCombinedFieldResolver; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.CombinedFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class CombinedFieldConfigProvider { + + + /** + * 作为临时配置列表缓存使用 + */ + private final List combinedFieldConfigList; + private Map storeObjectMap = new HashMap<>(); + + public CombinedFieldConfigProvider(Long ruleId) { + CombinedFieldConfigRegistry combinedFieldConfigRegistry = SpringContextUtil.getBean(CombinedFieldConfigRegistry.class); + combinedFieldConfigList = combinedFieldConfigRegistry.getCombinedFieldConfigList(ruleId); + } + + public void parseDataField(RuleConfig ruleConfig, String clearZeroPlain,Map fieldConfigsMap ) { + if (showSkip()) { + return; + } + //匹配对应的数据,然后进行相关的字段解析 + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver(); + combinedFieldResolver.parseDataField(combinedFieldConfigList, byteBuf, storeObjectMap,fieldConfigsMap); + } + + + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getCombinedFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return combinedFieldConfigList.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public List getCombinedFieldConfigList() { + return combinedFieldConfigList; + } + + /* 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(combinedFieldConfigList) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java new file mode 100644 index 0000000..f3cfedc --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java @@ -0,0 +1,11 @@ +package com.casic.missiles.parser.provider; + +/** + * @author cz + * @date 2023-6-12 + */ +public class CommandEventProvider{ + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java new file mode 100644 index 0000000..70eec5e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java @@ -0,0 +1,77 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.safe.SafeStrategy; +import com.casic.missiles.parser.sender.DataSubscribeProvider; +import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class DatagramEventProvider { + + private final DatagramEventConfig processorInstance; + + public DatagramEventProvider(Long ruleId) { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + List datagramEventConfigList = + datagramEventRegistry.getDatagramEventList(ruleId); + processorInstance = this.getProcessorInstance(datagramEventConfigList); + } + + public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { + if (showSkip()) { + return null; + } + return datagramEventConfigList.get(0); + } + + // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 + public String getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap) { + String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? + processorInstance.getSafeBean() : + fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); + if (!StringUtils.isEmpty(safeName)) { + //需要加密 + SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); + String plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); + return clearComplementZero(plain); + } + return ByteBufUtil.hexDump(bizDataContent); + } + + //解密清零操作 + private String clearComplementZero(String plain) { + plain = plain.substring(0, plain.lastIndexOf("00")); + return plain; + } + + //数据发送,数据发送者暂未构建 + public void storeData(Map bizDataMap) { + DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); +// dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return ObjectUtils.isNotEmpty(processorInstance) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java new file mode 100644 index 0000000..7e1fe0a --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java @@ -0,0 +1,97 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.FieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class FieldConfigProvider { + + + private final List fieldConfigs; + private Map storeObjectMap = new HashMap<>(); +// private Map singleObjects = new ConcurrentHashMap<>(); + + public FieldConfigProvider(Long ruleId) { + FieldConfigRegistry fieldConfigRegistry = SpringContextUtil.getBean(FieldConfigRegistry.class); + fieldConfigs = fieldConfigRegistry.getFieldConfigList(ruleId); + } + + public List getFieldConfigs() { + return fieldConfigs; + } + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public Map parseDataField(RuleConfig ruleConfig, String clearZeroPlain) { + if (showSkip()) { + return null; + } + List prepareFieldConfig = prepareParseField(ruleConfig); + if (CollectionUtils.isNotEmpty(prepareFieldConfig)) { + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(fieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + return fixDataMap; + } + } + return null; + } + + /** + * 得到需要处理的业务内容 + * + * @return + */ + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return fieldConfigs.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public Map getFieldConfigsMap() { + return fieldConfigs.stream().collect( + Collectors.toMap(FieldConfig::getId, e -> e) + ); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(fieldConfigs) ? false : true; + } + + +} + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java new file mode 100644 index 0000000..817bfaf --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java @@ -0,0 +1,19 @@ +package com.casic.missiles.parser.provider; + +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.registry.FieldRuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; + +public class FieldRuleConfigProvider { + + private final List fieldRuleConfigList; + + public FieldRuleConfigProvider(Long ruleId) { + FieldRuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(FieldRuleConfigRegistry.class); + fieldRuleConfigList = ruleConfigRegistry.getFieldRuleConfigList(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java new file mode 100644 index 0000000..99a1b06 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java @@ -0,0 +1,53 @@ +package com.casic.missiles.parser.provider; + + +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.registry.ProtocolConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolConfigProvider { + + private final List protocolConfigList; + + public ProtocolConfigProvider(String firstChar) { + ProtocolConfigRegistry registry = SpringContextUtil.getBean(ProtocolConfigRegistry.class); + protocolConfigList = registry.getProtocolConfigList(firstChar); + } + + public List getMatchList() { + return protocolConfigList; + } + + /** + * 设置当前协议 + * + * @param protocolConfig + */ + public ProtocolConfigProvider(ProtocolConfig protocolConfig) { + List protocolConfigs = new ArrayList<>(); + protocolConfigs.add(protocolConfig); + protocolConfigList = protocolConfigs; + } + + /** + * 获取当前协议 + * + * @return + */ + public ProtocolConfig getCurrentProtocolConfig() { + if (this.protocolConfigList == null) { + return null; + } else { + return protocolConfigList.get(0); + } + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java new file mode 100644 index 0000000..043927d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java @@ -0,0 +1,213 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.registry.ProtocolFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolFieldConfigProvider { + + private static final String FIXED_FIELD_DS = "fixedFieldDs"; + private static final String CONTENT_FIELD_DS = "contentFieldDs"; + private static final String PROTOCOL_LENGTH = "protocolLength"; + private static final String PROTOCOL_FIELD_ID = "protocolFieldId"; + private static final String PROTOCOL_POSITION = "protocolPosition"; + + private final List protocolFieldConfigs; + private Map singleObjects = new ConcurrentHashMap<>(); + private Map storeObjectMap = new HashMap<>(); + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public ProtocolFieldConfigProvider(Long protocolId) { + ProtocolFieldConfigRegistry protocolFieldConfigRegistry = SpringContextUtil.getBean(ProtocolFieldConfigRegistry.class); + protocolFieldConfigs = protocolFieldConfigRegistry.getProtocolFieldConfigList(protocolId); + } + + public List getProtocolFieldConfigs() { + return protocolFieldConfigs; + } + + public ProtocolFieldConfig getFieldConfigById(Long fieldId) { + Optional optionalConfig = protocolFieldConfigs.stream().filter( + e -> e.getId().equals(fieldId) + ).findFirst(); + return optionalConfig.isPresent() ? optionalConfig.get() : null; + } + + public Integer getProtocolFieldValue(Long protocolFieldId, ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_FIELD_ID + protocolFieldId + ByteBufUtil.hexDump(byteBuf); + //获取缓存 + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + //加载固定长度数据集合 + Map fixDataMap = this.getProtocolDataMap(byteBuf); + ProtocolFieldConfig protocolFieldConfig = selectFieldConfig(protocolFieldId); + Integer protocolFieldValue = 0; + //获取约定字段的总长度 + if (fixDataMap.containsKey(protocolFieldConfig.getFieldName())) { + Object appointUnpackObject = fixDataMap.get(protocolFieldConfig.getFieldName()); + if (ObjectUtils.isNotEmpty(appointUnpackObject)) { + protocolFieldValue = (Integer) appointUnpackObject; + } + } + if (protocolFieldValue != null) { + //加入缓存 + if (ObjectUtils.isNotEmpty(protocolFieldValue)) { + this.singleObjects.put(catchKey, protocolFieldValue); + return protocolFieldValue; + } + } + return null; + } + + /** + * 获取帧固定位置信息 + * + * @param byteBuf + * @param protocolConfig + * @return + */ + public Map getFixedProperty(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_POSITION + protocolConfig.getId(); + if (this.singleObjects.containsKey(catchKey)) { + return (Map) singleObjects.get(catchKey); + } + Map fixedPropertyMap = new HashMap<>(); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + fixedPropertyMap = fieldParser.doGetFixedProperty(protocolFieldConfigs, this.getTotalLength(byteBuf,protocolConfig)); + if (CollectionUtils.isNotEmpty(fixedPropertyMap)) { + this.singleObjects.put(catchKey, fixedPropertyMap); + return fixedPropertyMap; + } + return fixedPropertyMap; + } + + /** + * 获取帧结构应有的总长度 + */ + public Integer getTotalLength(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_LENGTH + ByteBufUtil.hexDump(byteBuf); + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + Integer appointFrameLength = getProtocolFieldValue(protocolConfig.getTotalLengthId(), byteBuf); + if (appointFrameLength != null) { + //获取过滤的字段集合总长度 + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Integer totalFilterLength = fieldParser.getTotalFilterLength(protocolConfig, byteBuf, getFixFieldConfigMap()); + //计算总长度 + Integer totalLength = appointFrameLength + totalFilterLength; + //加入缓存 + if (ObjectUtils.isNotEmpty(totalLength)) { + this.singleObjects.put(catchKey, totalLength); + return totalLength; + } + } + return null; + } + + /** + * 获取协议有关字段解析内容 + * storeObjectMap存储代转存的数据 + * + * @return + */ + public Map getProtocolDataMap(ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(FIXED_FIELD_DS)) { + return (Map) singleObjects.get(FIXED_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(protocolFieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + this.singleObjects.put(FIXED_FIELD_DS, fixDataMap); + return fixDataMap; + } + return null; + } + + /** + * 获取业务报文内容的content字节 + * + * @param wholeDatagramByte + * @return + */ + public ByteBuf getDataContentBuf(ByteBuf wholeDatagramByte) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(CONTENT_FIELD_DS)) { + return (ByteBuf) singleObjects.get(CONTENT_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + ByteBuf bizDataByteBuf = fieldParser.getDataContentBuf(protocolFieldConfigs, wholeDatagramByte); + if (bizDataByteBuf != null) { + this.singleObjects.put(CONTENT_FIELD_DS, bizDataByteBuf); + return bizDataByteBuf; + } + return null; + } + + + private ProtocolFieldConfig selectFieldConfig(Long id) { + Optional optionalProtocolFieldConfig = this.protocolFieldConfigs.stream().filter( + e -> e.getId().equals(id) + ).findFirst(); + return optionalProtocolFieldConfig.isPresent() ? optionalProtocolFieldConfig.get() : null; + } + + + private Map getFixFieldConfigMap() { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, e -> e) + ); + return fixDataFieldMap; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(protocolFieldConfigs) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java new file mode 100644 index 0000000..dafba1c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java @@ -0,0 +1,56 @@ +package com.casic.missiles.parser.provider; + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.rule.GenericRuleResolver; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.RuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleConfigProvider { + + private final List ruleConfigs; + + public List getRuleConfigs() { + return ruleConfigs; + } + + public RuleConfigProvider(Long protocolId) { + RuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(RuleConfigRegistry.class); + ruleConfigs = ruleConfigRegistry.getRuleConfigById(protocolId); + } + + /** + * 获取规则匹配结果 + * + * @param parseFixedDataMap + * @param protocolFieldConfigs + * @return + */ + public RuleConfig doGetRule(Map parseFixedDataMap, + String ids, + List protocolFieldConfigs) { + if (showSkip()) { + return null; + } + RuleConfig ruleConfig = GenericRuleResolver.machRule(parseFixedDataMap, ids, protocolFieldConfigs, ruleConfigs); + return ruleConfig; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(ruleConfigs) ? false : true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java index 3c05891..856b399 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java @@ -1,18 +1,11 @@ package com.casic.missiles.parser.resolver; -import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.springframework.web.bind.annotation.RequestBody; -import javax.annotation.Resource; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -20,19 +13,17 @@ @Slf4j public class ByteMergeProvider { - @Resource - private FieldRuleEngineMapper fieldRuleEngineMapper; - //拿到所有的值合并到一个值 - public String resolveByteMerge(List valueList, String ruletypeId, String vaildRange) { + public static String resolveByteMerge(List valueList, String ruleTypeId, String vaildRange) { String values = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Map vaildMap = getValidRangeMap(vaildRange); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(ruletypeId); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } + //暂时不处理 +// fieldRuleEngine = fieldRuleConfigMapper.selectById(ruleTypeId); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } Map env2 = new HashMap(); for (int i = 0; i < valueList.size(); i++) { if (vaildMap.containsKey(i)) { @@ -47,7 +38,7 @@ } } - private Map getValidRangeMap(String vaildRange) { + private static Map getValidRangeMap(String vaildRange) { String[] range = vaildRange.split(","); Map vaildMap = new HashMap(); for (int i = 0; i < range.length; i++) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 8d821cd..85d6bbf 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -1,9 +1,12 @@ package com.casic.missiles.parser.resolver; +import com.casic.missiles.pojo.AbstractFieldConfig; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; import io.netty.buffer.ByteBuf; +import java.util.List; import java.util.Map; /** @@ -11,18 +14,14 @@ */ public interface FieldParser { -// Map fieldProcess(String protocolContent,); - Map dataParser(RuleConfig ruleConfig, String lightText,String protocolId); + Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength); - Map fixDataParser(String protocolId, ByteBuf buffer); + Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap); - Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf); + ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer); - ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer); - - ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer); - - Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer); + Integer getTotalFilterLength(ProtocolConfig protocolConfig, ByteBuf byteBuf, Map protocolFieldConfigMap); } + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java new file mode 100644 index 0000000..9e0c00e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java @@ -0,0 +1,52 @@ +package com.casic.missiles.parser.resolver; + +import com.casic.missiles.pojo.AbstractFieldConfig; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.util.List; + +public class FieldParserSupport { + + //分别计算bit和byte长度=> 合并长度 + protected Integer calculateLength(List fieldConfigList) { + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + Integer fixedLength = bytefixedLength + bitfixedLength / 8; + return fixedLength; + } + + //找到最大值=> 根据最大值计算业务数据下标 + protected Integer calculatePosition(List fieldConfigList) { + String rex = "[0-9]+"; + Integer max = -1; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) + && Integer.valueOf(fieldConfig.getOriginPositionByte()) > max) { + max = Integer.valueOf(fieldConfig.getOriginPositionByte()); + } + } + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) && fieldConfig.getOriginPositionByte().equals(max)) { + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + } + } + Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; + return maxFixedPosition; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java deleted file mode 100644 index dd3a6cd..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java +++ /dev/null @@ -1,170 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.ByteResolverParam; -import io.netty.buffer.ByteBuf; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -/** - * 字段解析管理总类 - */ -@Service -@Slf4j -@AllArgsConstructor -public class FieldResolver extends ByteMergeProvider { - - //1、字段截取 => 2、简单的字节解析和复杂的字节解析 - public Object filedParserManger(ByteBuf byteBuf, FieldConfig fieldConfig, Integer maxFixedPosition) { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - //最大固定位置不为空, - if (!ObjectUtil.isEmpty(maxFixedPosition)) { - orignPosition -= maxFixedPosition; - } - Object fieldValue = 0; - //待优化 - if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { - fieldValue = bitToResolver(byteBuf, fieldConfig); - } else { - ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); - fieldValue = parsingFields(fieldBytes, fieldConfig.getRuleJson()); - } - return fieldValue; - } - - //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, - //目前默认配置的规则设置暂不支持配置化,由实现完成 - private Object parsingFields(ByteBuf byteBuf, String ruleJson) { - Object fieldsResolveValue = null; - List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); - if (ObjectUtil.isEmpty(ruleMapList)) { - fieldsResolveValue = defaultResolveBuilder(byteBuf); - } else { - fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); - } - return fieldsResolveValue; - } - - private Object defaultResolveBuilder(ByteBuf byteBuf) { - Integer defaultResolveValue = 0; - for (int i = 0; i < byteBuf.writerIndex(); i++) { - defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; - } - return defaultResolveValue; - } - - //字段解析构建器(针对字节单位的) - //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 - // 字节归并结束或者规则结束=>继续根据规则进行判断 - private Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { - Object customizeResolveValue = null; - try { - List bytStrList = new ArrayList<>(); - //存放到数组里面 - for (int i = 0; i < byteBuf.writerIndex(); i++) { - bytStrList.add(byteBuf.readByte()); - } - int i = 0; - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - customizeResolveValue = this.resolveByteMerge(bytStrList, ruletypeId,vaildRange); - break; - } else { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - List tempBytStr = new ArrayList<>(); - for (int k = 0; i < bytStrList.size(); i++) { - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(k) - .value(bytStrList.get(k)) - .ruletypeId(ruletypeId).build(); - tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); - } - bytStrList = tempBytStr; - } - i++; - } - //字节归并到一起=>继续根据规则进行判断 - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(customizeResolveValue) - .ruletypeId(ruletypeId).build(); - customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(customizeResolveValue)); - return customizeResolveValue; - } catch (RuntimeException ex) { - log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); - return null; - } - } - - /** - * 1、单个字节情况表示字段 - * 2、多字节情况表示字段(暂未处理) - */ - private Object bitToResolver(ByteBuf byteBuf, FieldConfig fieldConfig) { - Object fieldValue = new Object(); - try { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - byte fields = 0x00; - if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); - } else { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); - } - - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { - if (!StringUtils.isEmpty(fieldConfig.getExactOrignPosition())) { - fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getExactOrignPosition())).byteValue() - >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); - } else { - fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); - } - } else { - fieldValue = Integer.valueOf(fields & 0xff); - } - if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { - return fieldValue; - } - List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); - int i = 0; - //字节归并到一起=>继续根据规则进行判断 - while (i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(fieldValue) - .ruletypeId(ruletypeId).build(); - fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(fieldValue)); - return fieldValue; - } catch (RuntimeException ex) { - log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); - return null; - } - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java new file mode 100644 index 0000000..1d2aeab --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java @@ -0,0 +1,36 @@ +package com.casic.missiles.parser.resolver.bytes; + +import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.mapper.FieldRuleConfigMapper; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.pojo.ByteResolverParam; +import com.googlecode.aviator.AviatorEvaluator; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; +//转换规则 +@Component("convert") +@AllArgsConstructor +@Slf4j +public class ByteRuleResolver implements ByteResolver { + + private final FieldRuleConfigMapper fieldRuleConfigMapper; + + @Override + public Object resolveOperationRule(ByteResolverParam byteResolverParam){ + FieldRuleConfig fieldRuleEngine=fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); + if(ObjectUtil.isEmpty(fieldRuleEngine)){ + return byteResolverParam.getValue(); + } + String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); + Map env2 = new HashMap(); + env2.put("value", (byte) byteResolverParam.getValue()); + String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); + return values; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java index 103821c..786b71c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java @@ -2,34 +2,34 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("logicalShift") +@Component("logicalShift") @AllArgsConstructor @Slf4j public class LogicalShiftResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //字节位移 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { Integer index = byteResolverParam.getIndex(); - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return byteResolverParam.getValue(); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java index 476747d..01149bd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("operation") +@Component("operation") @AllArgsConstructor @Slf4j public class OperationResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //混合运算,有常量或者乘除的缩放 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java index 0b82cf4..79abcce 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.casic.missiles.pojo.ByteResolverParam; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; //精度计算 -@Service("precision") +@Component("precision") @AllArgsConstructor @Slf4j public class PrecisionResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java deleted file mode 100644 index 5c3f332..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; -//转换规则 -@Service("convert") -@AllArgsConstructor -@Slf4j -public class RuleResolver implements ByteResolver { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam){ - RuleEvaluator fieldRuleEngine=fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); - if(ObjectUtil.isEmpty(fieldRuleEngine)){ - return byteResolverParam.getValue(); - } - String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); - Map env2 = new HashMap(); - env2.put("value", (byte) byteResolverParam.getValue()); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java new file mode 100644 index 0000000..d3bbd91 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java @@ -0,0 +1,15 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; + +import java.util.List; +import java.util.Map; +// 前导码匹配->长度字段 +public interface AbstractCombinedFieldProcessor { + + Map invoke(Map map, ByteBuf byteBuf, List combinedFieldConfigList, + Map fieldConfigsMap, Map storeObjectMap); + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java new file mode 100644 index 0000000..03c8480 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java @@ -0,0 +1,59 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-13 + */ +//依次递增进行数据的解析, +public class GenericCombinedFieldResolver { + + + //通过查询,字段长度长度随机 + public void parseDataField(List combinedFieldConfigList, ByteBuf byteBuf, + Map storeObjectMap, Map fieldConfigsMap) { + Integer frameLength = Integer.valueOf(ByteBufUtil.hexDump(byteBuf)); + //添加前置处理器 + com.casic.missiles.util.ClassUtil classUtil = new com.casic.missiles.util.ClassUtil(); + List abstractCombinedProcessors = classUtil.getSubClassList(AbstractCombinedFieldProcessor.class); + + Map fieldFixedMap = combinedFieldLeadCodeMap(combinedFieldConfigList); + //frameLength + Map combinedProcessorFields = null; + while (byteBuf.readableBytes() < frameLength) { + //一直处理 + for (AbstractCombinedFieldProcessor abstractCombinedProcessor : abstractCombinedProcessors) { + combinedProcessorFields = abstractCombinedProcessor.invoke(combinedProcessorFields, byteBuf, + combinedFieldConfigList, + fieldConfigsMap, storeObjectMap); + if (combinedProcessorFields == null || byteBuf.readableBytes() < frameLength) { + return; + } + } + + } + } + + /** + * 取出前导码匹配集合 + */ + private Map combinedFieldLeadCodeMap(List combinedFieldConfigList) { + Map fieldFixedMap = combinedFieldConfigList + .stream() + .collect(Collectors.toMap(CombinedFieldConfig::getPrefixCode, e -> e)); + return fieldFixedMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java new file mode 100644 index 0000000..643a934 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java @@ -0,0 +1,100 @@ +package com.casic.missiles.parser.resolver.fields; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.FieldParserSupport; +import com.casic.missiles.pojo.*; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 保存使用时最基本的信息,并且使用原型模式 + */ +@Slf4j +public class DefaultProtocolFieldParser extends FieldParserSupport implements FieldParser, FixedPropertyEnum { + + //通过传入的配置和报文进行字段解析 + @Override + public Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap) { + Map dataMap = new HashMap<>(); + for (AbstractFieldConfig protocolFieldConfig : protocolFieldConfigs) { + if (!ObjectUtils.isEmpty(protocolFieldConfig.getOriginPositionByte())) { + Object fieldValue = FieldResolver.parseField(buffer, protocolFieldConfig, null); + if (protocolFieldConfig.getIsStorage() == 1) { + storeObjectMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + dataMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + } + return dataMap; + } + + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength) { + Map fixedPropertyMap = new HashMap<>(); + Integer fixedLength = calculateLength(protocolFieldConfigs); + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + fixedPropertyMap.put(FIXED_POSITION, maxFixedPosition); + fixedPropertyMap.put(TOTAL_LENGTH, totalLength); + fixedPropertyMap.put(TAIL_POSITION, totalLength - fixedLength + maxFixedPosition); + return fixedPropertyMap; + } + + //** 获取业务内容的byteBuf + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer) { + //计算固定长度 + Integer fixedLength = calculateLength(protocolFieldConfigs); + //总长度获取 + String lightText = buffer.toString(Charset.forName("ISO-8859-1")); + Integer totalLength = lightText.length(); + //计算固定长度最大长度 + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + //计算数据报文内容 + ByteBuf bizDataFields = buffer.slice(maxFixedPosition - 1, (totalLength - fixedLength)); + return bizDataFields; + } + + /** + * 获取过滤字段的长度 + */ + @Override + public Integer getTotalFilterLength(ProtocolConfig protocolConfig, + ByteBuf byteBuf, + Map protocolFieldConfigMap) { + if (ByteBufUtil.hexDump(byteBuf).equals("")) { + return 0; + } + int totalFilterLength = 0; + String filterFields = protocolConfig.getTotalLengthFilterFields(); + try { + if (!StringUtils.isEmpty(filterFields)) { + String[] filterFieldList = filterFields.split(","); + for (String filterFieldId : filterFieldList) { + if (StringUtils.isNotEmpty(filterFieldId)) { + ProtocolFieldConfig fieldConfig = protocolFieldConfigMap.get(Long.valueOf(filterFieldId)); + //这里都是按字节计算,没有对位进行区分,可能会出现错误 + // 如果对位有需求,需要进一步跟进 + totalFilterLength += fieldConfig.getOffsetLength(); + } + } + } + return totalFilterLength; + } catch (Exception ex) { + log.error("报文确认分发阶段,获取报文总长度过滤长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); + } + return totalFilterLength; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java new file mode 100644 index 0000000..d51e887 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java @@ -0,0 +1,169 @@ +package com.casic.missiles.parser.resolver.fields; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.parser.resolver.ByteMergeProvider; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.AbstractFieldConfig; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.pojo.ByteResolverParam; +import io.netty.buffer.ByteBuf; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * 字段解析管理总类 + */ +@Slf4j +public class FieldResolver extends ByteMergeProvider { + + //1、字段截取 => 2、简单的字节解析和复杂的字节解析 + public static Object parseField(ByteBuf byteBuf,AbstractFieldConfig fieldConfig, Integer maxFixedPosition) { + Integer orignPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + //最大固定位置不为空, + if (!ObjectUtil.isEmpty(maxFixedPosition)) { + orignPosition -= maxFixedPosition; + } + Object fieldValue = 0; + //待优化 + if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { + fieldValue = doParseBitField(byteBuf, fieldConfig); + } else { + ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); + fieldValue = doParseByteField(fieldBytes, fieldConfig.getRuleJson()); + } + return fieldValue; + } + + //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, + //目前默认配置的规则设置暂不支持配置化,由实现完成 + private static Object doParseByteField(ByteBuf byteBuf, String ruleJson) { + Object fieldsResolveValue = null; + List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); + if (ObjectUtil.isEmpty(ruleMapList)) { + fieldsResolveValue = defaultResolveBuilder(byteBuf); + } else { + fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); + } + return fieldsResolveValue; + } + + private static Object defaultResolveBuilder(ByteBuf byteBuf) { + Integer defaultResolveValue = 0; + for (int i = 0; i < byteBuf.writerIndex(); i++) { + defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; + } + return defaultResolveValue; + } + + //字段解析构建器(针对字节单位的) + //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 + // 字节归并结束或者规则结束=>继续根据规则进行判断 + private static Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { + Object customizeResolveValue = null; + try { + List bytStrList = new ArrayList<>(); + //存放到数组里面 + for (int i = 0; i < byteBuf.writerIndex(); i++) { + bytStrList.add(byteBuf.readByte()); + } + int i = 0; + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { + if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + customizeResolveValue = resolveByteMerge(bytStrList, ruletypeId, vaildRange); + break; + } else { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + List tempBytStr = new ArrayList<>(); + for (int k = 0; i < bytStrList.size(); i++) { + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(k) + .value(bytStrList.get(k)) + .ruletypeId(ruletypeId).build(); + tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); + } + bytStrList = tempBytStr; + } + i++; + } + //字节归并到一起=>继续根据规则进行判断 + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(null) + .value(customizeResolveValue) + .ruletypeId(ruletypeId).build(); + customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); + i++; + } + System.out.println(JSON.toJSON(customizeResolveValue)); + return customizeResolveValue; + } catch (RuntimeException ex) { + log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); + return null; + } + } + + /** + * 1、单个字节情况表示字段 + * 2、多字节情况表示字段(暂未处理) + */ + private static Object doParseBitField(ByteBuf byteBuf,AbstractFieldConfig fieldConfig) { + Object fieldValue = new Object(); + try { + Integer orignPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + byte fields = 0x00; + if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { + fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); + } else { + fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); + } + + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { + if (!StringUtils.isEmpty(fieldConfig.getOriginPositionBit())) { + fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getOriginPositionBit())).byteValue() + >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); + } else { + fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); + } + } else { + fieldValue = Integer.valueOf(fields & 0xff); + } + if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { + return fieldValue; + } + List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); + int i = 0; + //字节归并到一起=>继续根据规则进行判断 + while (i < ruleMapList.size()) { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(null) + .value(fieldValue) + .ruletypeId(ruletypeId).build(); + fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); + i++; + } + System.out.println(JSON.toJSON(fieldValue)); + return fieldValue; + } catch (RuntimeException ex) { + log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); + return null; + } + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java deleted file mode 100644 index 35ae3d0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java +++ /dev/null @@ -1,183 +0,0 @@ -package com.casic.missiles.parser.resolver.fields; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufAllocator; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; -import org.springframework.util.ObjectUtils; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service("standard") -@AllArgsConstructor -@Slf4j -public class StandardFieldParser implements FieldParser { - - private final FieldConfigDao fieldConfigDao; - private final FieldResolver fieldResolver; - - //数据解析 - @Override - public Map dataParser(RuleConfig ruleConfig, String lightText, String protocolId) { - String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); - ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); - bufferContent.writeBytes(lightText.getBytes(Charset.forName("ISO-8859-1"))); - Map dataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - for (String dataFieldId : dataFieldIds) { - FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(dataFieldId); - if (!ObjectUtils.isEmpty(fieldConfig)) { - dataMap.put(fieldConfig.getFieldName(), String.valueOf(fieldResolver.filedParserManger(bufferContent, fieldConfig, maxFixedPosition))); - } - } - return dataMap; - } - - //数据解析 - @Override - public Map fixDataParser(String protocolId, ByteBuf buffer) { - List dataFieldIdList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Map dataMap = new HashMap<>(); - for (FieldConfig dataField : dataFieldIdList) { - if (!ObjectUtils.isEmpty(dataField.getOrignPosition())) { - Object fieldValue = (Integer) fieldResolver.filedParserManger(buffer, dataField, null); - dataMap.put(dataField.getFieldName(), fieldValue); - } - } - return dataMap; - } - - @Override - public Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf) { - if (ByteBufUtil.hexDump(byteBuf).equals("")) { - return 0; - } - String filterFields = protocolConfig.getTotalLengthFilterField(); - Integer totalLength = 0; - try { - FieldConfig totalFieldConfig = fieldConfigDao.getFieldConfigById(protocolConfig.getTotalLengthId()); - int totalFilterLength = 0; - if (!StringUtils.isEmpty(filterFields)) { - String[] filterFieldList = filterFields.split(","); - for (String filterField : filterFieldList) { - FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(filterField); - //这里都是按字节计算,没有对位进行区分,可能会出现错误 - - // 如果对位有需求,需要进一步跟进 - totalFilterLength += fieldConfig.getOffsetLength(); - } - } - totalLength = (Integer) fieldResolver.filedParserManger(byteBuf, totalFieldConfig, null) + totalFilterLength; - } catch (Exception ex) { - log.error("报文确认分发阶段,获取报文总长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); - } - return totalLength; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer) { - //业务内容 - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - String protocolId = String.valueOf(protocolConfig.getId()); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - //计算固定长度 - Integer fixedLength = calculateLength(fieldConfigList); -// Integer totalLength = this.getTotalLength(protocolConfig, buffer); - //总长度获取 - Integer totalLength = lightText.length(); - //计算固定长度最大长度 - Integer maxFixedPosition = calculatePosition(fieldConfigList); -// buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - //计算数据报文内容 - ByteBuf bizDataFields = buffer.slice(maxFixedPosition-1, (totalLength - fixedLength)); - return bizDataFields; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer) { - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - String protocolId = String.valueOf(protocolConfig.getId()); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer fixedLength = calculateLength(fieldConfigList); -// Integer totalLength = this.getTotalLength(protocolConfig, buffer); - Integer totalLength = lightText.length(); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - ByteBuf fixDataFields = buffer.slice(0, maxFixedPosition); - return fixDataFields; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer) { - String protocolId = String.valueOf(protocolConfig.getId()); - Map fixedPropertyMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer fixedLength = calculateLength(fieldConfigList); - Integer totalLength = this.getTotalLength(protocolConfig, buffer); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - fixedPropertyMap.put("fixedPosition", maxFixedPosition); - fixedPropertyMap.put("totalLength", totalLength); - fixedPropertyMap.put("tailPosition", totalLength - fixedLength + maxFixedPosition); - return fixedPropertyMap; - } - - //分别计算bit和byte长度=> 合并长度 - private Integer calculateLength(List fieldConfigList) { - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (FieldConfig fieldConfig : fieldConfigList) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - Integer fixedLength = bytefixedLength + bitfixedLength / 8; - return fixedLength; - } - - //找到最大值=> 根据最大值计算业务数据下标 - private Integer calculatePosition(List fieldConfigList) { - String rex = "[0-9]+"; - Integer max = -1; - for (FieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOrignPosition()) - && Integer.valueOf(fieldConfig.getOrignPosition()) > max) { - max = Integer.valueOf(fieldConfig.getOrignPosition()); - } - } - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (FieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOrignPosition()) && fieldConfig.getOrignPosition().equals(max)) { - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - } - } - Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; - return maxFixedPosition; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java new file mode 100644 index 0000000..d4ec6c7 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java @@ -0,0 +1,76 @@ +package com.casic.missiles.parser.rule; + +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import org.apache.commons.lang3.StringUtils; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class GenericRuleResolver { + + //根据前置字段的值,找到指定的规则 + //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 + //=>循环判断=>通过规则得到业务字段 + public static RuleConfig machRule(Map fixDataMap, + String ids, + List protocolFieldConfigs, + List ruleConfigs) { + List preRuleConfigList = getPreRuleList(ids, protocolFieldConfigs); + //获取前置规则字段 + final Map metaDataMap = getPreRuleFields(preRuleConfigList, fixDataMap); + //准备固定的字段集合 + Map fixDataFieldMap = getFixDataFieldMap(protocolFieldConfigs); + return RuleResolverCore.doMachRule(ruleConfigs, metaDataMap, fixDataMap, fixDataFieldMap); + } + + private static Map getFixDataFieldMap(List protocolFieldConfigs) { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, ProtocolFieldConfig::getFieldName) + ); + return fixDataFieldMap; + } + + + /** + * 查询前置规则的字段配置 + * + * @param ids + * @return + */ + private static List getPreRuleList(String ids, List protocolFieldConfigs) { + String[] idList = ids.split(","); + Map prepareMaps = new HashMap<>(); + for (String id : idList) { + if (StringUtils.isNotEmpty(id)) { + prepareMaps.put(Long.valueOf(id), ""); + } + } + List preRuleConfigList = protocolFieldConfigs + .stream() + .filter(e -> prepareMaps.containsKey(e.getId())) + .collect(Collectors.toList()); + return preRuleConfigList; + } + + /** + * 获取前置规则解析字段 + */ + private static Map getPreRuleFields(List preRuleFieldConfigList, Map fixDataMap) { + Map ruleFieldMap = new HashMap<>(); + preRuleFieldConfigList.stream() + .forEach( + preRuleFieldConfig -> { + String fieldName = preRuleFieldConfig.getFieldName(); + if (fixDataMap.containsKey(fieldName)) { + ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); + } + } + ); + return ruleFieldMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java new file mode 100644 index 0000000..baae7e8 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -0,0 +1,68 @@ +package com.casic.missiles.parser.rule; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.casic.missiles.pojo.RuleConfig; + +import java.util.*; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleResolverCore { + + + public static RuleConfig doMachRule(List ruleConfigList, Map metaDataMap, + Map fixDataMap, + Map fixDataFieldMap) { + Optional ruleConfigOptional = ruleConfigList.stream() + .filter(ruleConfig -> machRuleConfig( + JSON.parseObject(ruleConfig.getMatchRuleJson(), Map.class), metaDataMap)) + .findFirst(); + if (ObjectUtil.isEmpty(ruleConfigOptional)) { + return null; + } + String[] ruleFields = ruleConfigOptional.get().getDataFieldIds().split(","); + Map ruleMetaDataMap = getRuleFields(ruleFields, fixDataMap, fixDataFieldMap); + //递归选定解析规则,进行规则解析 + if (!ruleConfigOptional.get().getIsFinishMatch().equals("1")) { + //递归选定规则 + doMachRule(ruleConfigList, ruleMetaDataMap, fixDataMap, fixDataFieldMap); + } + return ruleConfigOptional.get(); + } + + + private static Map getRuleFields(String[] preRuleConfigList, Map fixedDataMap, + Map fixedFieldMap) { + Map ruleFieldMap = new HashMap<>(); + for (String preRuleConfigId : preRuleConfigList) { + String fieldName = fixedFieldMap.get(preRuleConfigId); + if (fixedDataMap.containsKey(fieldName)) { + ruleFieldMap.put(fieldName, String.valueOf(fixedDataMap.get(fieldName))); + } + } + return ruleFieldMap; + } + + + //匹配规则配置 + private static Boolean machRuleConfig(Map ruleMap, Map metaDataMap) { + if (ruleMap == null || metaDataMap == null) { + return null; + } + //所有的字段在规则里面必须有有配置 + for (String key : metaDataMap.keySet()) { + if (ruleMap.containsKey(key)) { + if (!ruleMap.get(key).equals(metaDataMap.get(key))) { + return false; + } + } else { + return false; + } + } + return true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java deleted file mode 100644 index 664088d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java +++ /dev/null @@ -1,92 +0,0 @@ -package com.casic.missiles.parser.rule; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.mapper.dao.PreRuleConfigDao; -import com.casic.missiles.mapper.dao.RuleConfigDao; -import lombok.AllArgsConstructor; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.*; -import java.util.stream.Collectors; - -@Service -@AllArgsConstructor -public class RulerProvider { - - private final FieldConfigDao fieldConfigDao; - private final PreRuleConfigDao preRuleConfigDao; - private final RuleConfigDao ruleConfigDao; - - //根据前置字段的值,找到指定的规则 - //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 - //=>循环判断=>通过规则得到业务字段 - public RuleConfig ruleConfig(Map fixDataMap, String protocolId) { - //批量获取规则 - List preRuleConfigList = preRuleConfigDao.getPreRuleList(protocolId); - //获取固定字段 - Map fixFieldMap = getAllFieldMap(protocolId); - //获取前置规则字段 - final String preRuleFields = getPreRuleFields(preRuleConfigList, fixDataMap, fixFieldMap); - List ruleConfigList = ruleConfigDao.getRuleConfigById(protocolId); - Optional ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig ->preRuleFields.equals( ruleConfig.getParseRuleJson())).findFirst(); - //递归选定解析规则,进行规则解析 - while (!ObjectUtil.isEmpty(ruleConfigOptional) && !ruleConfigOptional.get().getIsBizField().equals("1")) { - String ruleFields = getRuleFields(ruleConfigOptional.get().getDataFieldIds().split(","), fixDataMap, fixFieldMap); - ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig -> ruleConfig.getParseRuleJson().equals(ruleFields)).findFirst(); - } - return ruleConfigOptional.get(); - } - - /** - * 获取前置规则解析字段 - */ - private String getPreRuleFields(List preRuleConfigList, Map fixDataMap, Map fixFieldMap) { - Map ruleFieldMap= new HashMap<>(); - preRuleConfigList.stream() - .forEach( - preRuleConfig -> { - String fieldName = fixFieldMap.get(Long.valueOf(preRuleConfig.getRuleFieldId())); - if (fixDataMap.containsKey(fieldName)) { - ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); - } - } - ); - return JSONObject.toJSONString(ruleFieldMap); - } - - private Map getAllFieldMap(String protocolId) { - List fieldList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Map fixFieldMap = fieldList.stream().collect( - Collectors.toMap(FieldConfig::getId, FieldConfig::getFieldName) - ); - return fixFieldMap; - } - - private String getRuleFields(String[] preRuleConfigList, Map fixDataMap, Map fixFieldMap) { - Map ruleFieldMap= new HashMap<>(); - for (String preRuleConfigId : preRuleConfigList) { - String fieldName = fixFieldMap.get(preRuleConfigId); - if (fixDataMap.containsKey(fieldName)) { - ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); - } - } - return JSONObject.toJSONString(ruleFieldMap); - } - - //弃置 - private String ListToString(List ruleFieldList) { - String ruleFields = ""; - for (String ruleField : ruleFieldList) { - ruleFields += ruleField + ","; - } - ruleFields = StringUtils.isEmpty(ruleFields) ? ruleFields : ruleFields.substring(0, ruleFields.length() - 1); - return ruleFields; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java index 6177e10..bfa87a5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java @@ -2,7 +2,7 @@ public interface SafeStrategy { - String decryption(byte[] bytes); + String decryption(String cipher); String encryption(String lightText); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java index 618716c..6236302 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java @@ -9,9 +9,9 @@ //十六进制的字符串转换成字节数组 byte[] bytes = hexStrToBinaryStr(msg); //计算CRC8 - byte crc8 = CRC8(bytes, 0, bytes.length); - String crc8ToStr = "" + Integer.toHexString(0xff & crc8); - return crc8ToStr; +// String crc8ToStr = "" + Integer.toHexString(0xff & crc8); +// return crc8ToStr; + return null; } /** @@ -33,50 +33,5 @@ return bytes; } - /** - * CRC8 校验 多项式 x8+x2+x+1 - * - * @param b - * @param off - * @param len - * @return - */ - public static byte CRC8(final byte[] b, final int off, final int len) { - byte result = 0x00; - for (int i = 0; i < len; i++) { - result = CHECKSUM_TABLE[(result ^ (b[i + off] & 0xFF)) & 0xFF]; - } - return (byte) (result & 0xFFL); - } - - private final static byte[] CHECKSUM_TABLE = {(byte) 0x00, (byte) 0x07, (byte) 0x0e, (byte) 0x09, (byte) 0x1c, (byte) 0x1b, - (byte) 0x12, (byte) 0x15, (byte) 0x38, (byte) 0x3f, (byte) 0x36, (byte) 0x31, (byte) 0x24, (byte) 0x23, (byte) 0x2a, - (byte) 0x2d, (byte) 0x70, (byte) 0x77, (byte) 0x7e, (byte) 0x79, (byte) 0x6c, (byte) 0x6b, (byte) 0x62, (byte) 0x65, - (byte) 0x48, (byte) 0x4f, (byte) 0x46, (byte) 0x41, (byte) 0x54, (byte) 0x53, (byte) 0x5a, (byte) 0x5d, (byte) 0xe0, - (byte) 0xe7, (byte) 0xee, (byte) 0xe9, (byte) 0xfc, (byte) 0xfb, (byte) 0xf2, (byte) 0xf5, (byte) 0xd8, (byte) 0xdf, - (byte) 0xd6, (byte) 0xd1, (byte) 0xc4, (byte) 0xc3, (byte) 0xca, (byte) 0xcd, (byte) 0x90, (byte) 0x97, (byte) 0x9e, - (byte) 0x99, (byte) 0x8c, (byte) 0x8b, (byte) 0x82, (byte) 0x85, (byte) 0xa8, (byte) 0xaf, (byte) 0xa6, (byte) 0xa1, - (byte) 0xb4, (byte) 0xb3, (byte) 0xba, (byte) 0xbd, (byte) 0xc7, (byte) 0xc0, (byte) 0xc9, (byte) 0xce, (byte) 0xdb, - (byte) 0xdc, (byte) 0xd5, (byte) 0xd2, (byte) 0xff, (byte) 0xf8, (byte) 0xf1, (byte) 0xf6, (byte) 0xe3, (byte) 0xe4, - (byte) 0xed, (byte) 0xea, (byte) 0xb7, (byte) 0xb0, (byte) 0xb9, (byte) 0xbe, (byte) 0xab, (byte) 0xac, (byte) 0xa5, - (byte) 0xa2, (byte) 0x8f, (byte) 0x88, (byte) 0x81, (byte) 0x86, (byte) 0x93, (byte) 0x94, (byte) 0x9d, (byte) 0x9a, - (byte) 0x27, (byte) 0x20, (byte) 0x29, (byte) 0x2e, (byte) 0x3b, (byte) 0x3c, (byte) 0x35, (byte) 0x32, (byte) 0x1f, - (byte) 0x18, (byte) 0x11, (byte) 0x16, (byte) 0x03, (byte) 0x04, (byte) 0x0d, (byte) 0x0a, (byte) 0x57, (byte) 0x50, - (byte) 0x59, (byte) 0x5e, (byte) 0x4b, (byte) 0x4c, (byte) 0x45, (byte) 0x42, (byte) 0x6f, (byte) 0x68, (byte) 0x61, - (byte) 0x66, (byte) 0x73, (byte) 0x74, (byte) 0x7d, (byte) 0x7a, (byte) 0x89, (byte) 0x8e, (byte) 0x87, (byte) 0x80, - (byte) 0x95, (byte) 0x92, (byte) 0x9b, (byte) 0x9c, (byte) 0xb1, (byte) 0xb6, (byte) 0xbf, (byte) 0xb8, (byte) 0xad, - (byte) 0xaa, (byte) 0xa3, (byte) 0xa4, (byte) 0xf9, (byte) 0xfe, (byte) 0xf7, (byte) 0xf0, (byte) 0xe5, (byte) 0xe2, - (byte) 0xeb, (byte) 0xec, (byte) 0xc1, (byte) 0xc6, (byte) 0xcf, (byte) 0xc8, (byte) 0xdd, (byte) 0xda, (byte) 0xd3, - (byte) 0xd4, (byte) 0x69, (byte) 0x6e, (byte) 0x67, (byte) 0x60, (byte) 0x75, (byte) 0x72, (byte) 0x7b, (byte) 0x7c, - (byte) 0x51, (byte) 0x56, (byte) 0x5f, (byte) 0x58, (byte) 0x4d, (byte) 0x4a, (byte) 0x43, (byte) 0x44, (byte) 0x19, - (byte) 0x1e, (byte) 0x17, (byte) 0x10, (byte) 0x05, (byte) 0x02, (byte) 0x0b, (byte) 0x0c, (byte) 0x21, (byte) 0x26, - (byte) 0x2f, (byte) 0x28, (byte) 0x3d, (byte) 0x3a, (byte) 0x33, (byte) 0x34, (byte) 0x4e, (byte) 0x49, (byte) 0x40, - (byte) 0x47, (byte) 0x52, (byte) 0x55, (byte) 0x5c, (byte) 0x5b, (byte) 0x76, (byte) 0x71, (byte) 0x78, (byte) 0x7f, - (byte) 0x6a, (byte) 0x6d, (byte) 0x64, (byte) 0x63, (byte) 0x3e, (byte) 0x39, (byte) 0x30, (byte) 0x37, (byte) 0x22, - (byte) 0x25, (byte) 0x2c, (byte) 0x2b, (byte) 0x06, (byte) 0x01, (byte) 0x08, (byte) 0x0f, (byte) 0x1a, (byte) 0x1d, - (byte) 0x14, (byte) 0x13, (byte) 0xae, (byte) 0xa9, (byte) 0xa0, (byte) 0xa7, (byte) 0xb2, (byte) 0xb5, (byte) 0xbc, - (byte) 0xbb, (byte) 0x96, (byte) 0x91, (byte) 0x98, (byte) 0x9f, (byte) 0x8a, (byte) 0x8d, (byte) 0x84, (byte) 0x83, - (byte) 0xde, (byte) 0xd9, (byte) 0xd0, (byte) 0xd7, (byte) 0xc2, (byte) 0xc5, (byte) 0xcc, (byte) 0xcb, (byte) 0xe6, - (byte) 0xe1, (byte) 0xe8, (byte) 0xef, (byte) 0xfa, (byte) 0xfd, (byte) 0xf4, (byte) 0xf3}; } \ No newline at end of file diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java index 27c2838..6e078a3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java @@ -1,9 +1,6 @@ package com.casic.missiles.parser.safe.impl; -import cn.hutool.core.util.CharsetUtil; -import cn.hutool.crypto.symmetric.SM4; -import cn.hutool.crypto.symmetric.SymmetricCrypto; - +import com.casic.missiles.parser.safe.SafeStrategy; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; @@ -11,19 +8,44 @@ import org.bouncycastle.crypto.engines.SM4Engine; import org.bouncycastle.crypto.params.KeyParameter; import org.bouncycastle.util.encoders.Hex; - -import static cn.hutool.crypto.Mode.ECB; -import static cn.hutool.crypto.Padding.NoPadding; +import org.springframework.stereotype.Component; /** * SM4算法工具类 */ @Slf4j -public class Sm4 { +@Component("sm4") +public class Sm4 implements SafeStrategy { //加解密的字节快大小 public static final int BlockSize = 16; + @Override + public String decryption(String cipher) { + byte[] keyByte = { + 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 + }; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(keyByte); + byte[] in = Hex.decode(cipher); + byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); + String plain = EcbDecrypt(in, keyBytes); + return plain; + } + + @Override + public String encryption(String cipher) { + byte[] keyByte = { + 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 + }; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(keyByte); + byte[] in = Hex.decode(cipher); + byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); + String plain = EcbDecrypt(in, keyBytes); + return plain; + } + /** * SM4ECB加密算法,对内 * @@ -32,8 +54,6 @@ * @return */ private static byte[] ecb_encrypt(byte[] in, byte[] keyBytes) { - - SM4Engine sm4Engine = new SM4Engine(); sm4Engine.init(true, new KeyParameter(keyBytes)); byte[] out = new byte[in.length]; @@ -58,27 +78,6 @@ return cipher; } - - /** - * hutool 解密SM4 - * - * @param encodeContent - * @return - */ - public static String decode(String encodeContent) { - String key = "24ad182507479a5da3ad94d9d78ea203"; - try { - SymmetricCrypto sm4 = new SM4(ECB, NoPadding, key.getBytes()); - String decryptStr = sm4.decryptStr(encodeContent, CharsetUtil.CHARSET_UTF_8); - return decryptStr; - } catch (Exception e) { - e.printStackTrace(); - log.error("SM4解密失败"); - } - return null; - } - - /** * SM4的ECB加密算法 * @@ -129,20 +128,6 @@ return plain; } - /** - * SM4的ECB解密算法 - * - * @param cipher 输入的密文字符串 - * @param key 密钥 - * @return - */ - public static String EcbDecrypt(String cipher, String key) { - byte[] in = Hex.decode(cipher); - byte[] keyBytes = Hex.decode(key); - - String plain = EcbDecrypt(in, keyBytes); - return plain; - } /** * 主函数 @@ -151,28 +136,24 @@ */ public static void main(String[] args) { byte[] ciphertext = { + 0x4B, (byte) 0x8C, (byte) 0x9D, 0x08, (byte) 0xE4, (byte) 0xD3, 0x64, 0x42, (byte) 0xB9, (byte) 0xA5, (byte) 0xFE, (byte) 0xCD, (byte) 0x91, 0x1B, 0x38, (byte) 0xAC, (byte) 0xE9, 0x1C, (byte) 0xCD, 0x53, 0x02, (byte) 0xD7, 0x0C, (byte) 0x9B, (byte) 0x96, 0x30, 0x62, (byte) 0xE8, (byte) 0xFB, (byte) 0xEF, (byte) 0xB9, (byte) 0xFF, (byte) 0xDE, 0x19, (byte) 0x80, 0x35, 0x3E, (byte) 0x90, 0x4F, 0x2F, 0x12, 0x2B, 0x19, (byte) 0x8B, 0x6C, 0x7A, (byte) 0x85, (byte) 0xA1, (byte) 0xB1, (byte) 0x86, (byte) 0xA3, 0x7A, 0x46, 0x0C, 0x2F, (byte) 0x94, 0x4F, 0x7F, 0x2C, 0x56, 0x14, (byte) 0xF3, (byte) 0x89, (byte) 0xC3, - 0x3F, 0x20, (byte) 0xF9, (byte) 0x87, (byte) 0xA1, 0x60, (byte) 0xD9, (byte) 0xA8, (byte) 0xFD, (byte) 0xD7, (byte) 0x9B, 0x4B, 0x26, 0x06, 0x30, 0x44}; + 0x3F, 0x20, (byte) 0xF9, (byte) 0x87, (byte) 0xA1, 0x60, (byte) 0xD9, (byte) 0xA8, (byte) 0xFD, (byte) 0xD7, (byte) 0x9B, 0x4B, 0x26, 0x06, 0x30, 0x44 + }; ByteBuf in = ByteBufAllocator.DEFAULT.heapBuffer(); in.writeBytes(ciphertext); - byte[] keyByte = { 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 }; ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); - key.writeBytes(ciphertext); - String resCipherData = decode(ByteBufUtil.hexDump(in)); - ByteBuf out = ByteBufAllocator.DEFAULT.heapBuffer(); -// out.writeBytes(resCipherData); -// System.out.println(hexBytes); - System.out.println(resCipherData.toString()); -// String resPlainData = EcbDecrypt(resCipherData, key); -// System.out.println("原始明文:" + data); -// System.out.println("解密后明文:" + resPlainData); + key.writeBytes(keyByte); +// String resCipherData = EcbDecrypt(ByteBufUtil.hexDump(in), ByteBufUtil.hexDump(key)); +// System.out.println(resCipherData); } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java index 1395a51..ac5f957 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java @@ -1,7 +1,7 @@ package com.casic.missiles.parser.safe.impl; import io.netty.buffer.ByteBufUtil; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** *

@@ -14,9 +14,8 @@ * @author hyl * @version v1.0: Tea.java, v 0.1 2021/3/12 13:48 $ */ -@Service("tea") -///tea算法类 - +//tea算法类 +@Component("tea") public class Tea { public static byte[] MyTea_Encrypt(byte[] MyTeaContent, int ByteLen, byte[] MyTeakey) { @@ -99,7 +98,6 @@ // for(int i32Index = 0; i32Index < 8; i32Index++) { // System.out.print("0x" + Integer.toHexString(MyContent[i32Index]) + " "); // } - // System.out.println("密钥为:"); // for(int i32Index = 0; i32Index < 16; i32Index++) { // System.out.print("0x" + Integer.toHexString(MyKeys[i32Index]) + " "); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java index bdd0721..bd1516a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java @@ -3,7 +3,7 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.parser.sender.DataSubscribeProvider; import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponents; import org.springframework.web.util.UriComponentsBuilder; @@ -12,7 +12,7 @@ import java.util.Collections; import java.util.Map; -@Service("functionCallback") +@Component("functionCallback") public class FunctionCallback implements DataSubscribeProvider { @Resource diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java index 0b44fb9..7526de2 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.Map; -@Service("middleware") +@Component("middleware") public class MiddlewareSubscribe implements DataSubscribeProvider { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java index 5dcee3f..e2f1192 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.Map; -@Service("nosql") +@Component("nosql") public class NoSqlSubscribe implements DataSubscribeProvider { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java b/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java new file mode 100644 index 0000000..81a5324 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java @@ -0,0 +1,86 @@ +package com.casic.missiles.pojo; + +import lombok.Data; + +/** + * 协议 + */ +@Data +public class Msg { + + /** + * 前导码 + */ + private String preamble; + + /** + * 版本号 + */ + private String version; + + /** + * 内容长度 + */ + private int leng; + + /** + * 设备ID + */ + private String deviceId; + + /** + * 通讯方式 + */ + private Integer connType; + + /** + * 加密方式 + */ + private Integer encryType; + + /** + * 目标地址 + */ + private String destAddr; + + /** + * PDUType + */ + private String PDUType; + + /** + * 操作类型 + */ + private Integer operateType; + + /** + * 传输控制位 PDUType.bit7=0时,表示存在后续的访问;当PDUType.bit7=1时,表示无后续的访问。 + */ + private Integer transControlFlag; + + /** + * 设备类型 + */ + private Integer deviceType; + + /** + * 序号 + */ + private Integer seq; + + /** + * tagList + */ + private String tagList; + + /** + * OidList + */ + private String OidList; + + /** + * CRC + */ + private String CRC; + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java index 40a5265..97cc984 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java @@ -40,7 +40,7 @@ String httpContent = msg.toString(Charset.defaultCharset()); log.info(" String : " + msg.toString(Charset.defaultCharset())); String majorContent = httpContent.substring(httpContent.indexOf("{"), httpContent.lastIndexOf("}") + 1); - String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("serviceData")).get("Value")); + String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("RegistryData")).get("Value")); log.info("----------------------------------" + values); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); bufferContent.writeBytes(values.getBytes(Charset.forName("ISO-8859-1"))); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java index 1b132a7..e3ced4b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java @@ -35,7 +35,7 @@ String httpContent = msg.toString(Charset.defaultCharset()); log.info(" String : " + msg.toString(Charset.defaultCharset())); String majorContent = httpContent.substring(httpContent.indexOf("{"), httpContent.lastIndexOf("}") + 1); - String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("serviceData")).get("Value")); + String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("RegistryData")).get("Value")); log.info("----------------------------------" + values); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); bufferContent.writeBytes(values.getBytes(Charset.forName("ISO-8859-1"))); diff --git a/sensorhub-core/src/main/resources/application.properties b/sensorhub-core/src/main/resources/application.properties deleted file mode 100644 index 8b13789..0000000 --- a/sensorhub-core/src/main/resources/application.properties +++ /dev/null @@ -1 +0,0 @@ - diff --git a/sensorhub-core/src/main/resources/config/application-dev.yml b/sensorhub-core/src/main/resources/config/application-dev.yml index 4f897a8..dcc4c2d 100644 --- a/sensorhub-core/src/main/resources/config/application-dev.yml +++ b/sensorhub-core/src/main/resources/config/application-dev.yml @@ -4,9 +4,9 @@ spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true + url: jdbc:mysql://127.0.0.1:3306/sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true username: root - password: Casic203 + password: root session: store-type: redis redis: diff --git a/sensorhub-core/src/main/resources/config/application.yml b/sensorhub-core/src/main/resources/config/application.yml index ae89f9d..7965da1 100644 --- a/sensorhub-core/src/main/resources/config/application.yml +++ b/sensorhub-core/src/main/resources/config/application.yml @@ -30,6 +30,13 @@ port: 6379 password: ew5T4K3#203lwh config-prefix: 'Casic:' +#代码生成器配置 +code: + generate: + #作者 + author: cz + #待生成对象表名 + table-name: bussiness_field_config,combined_field_config sensorhub: config: port: 7091 diff --git a/sensorhub-support/pom.xml b/sensorhub-support/pom.xml index 9a71296..761601c 100644 --- a/sensorhub-support/pom.xml +++ b/sensorhub-support/pom.xml @@ -42,6 +42,12 @@ ${redis.version} + + com.baomidou + mybatis-plus-generator + ${mybatis-plus-generator.version} + + org.reflections diff --git a/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java b/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java new file mode 100644 index 0000000..515ca53 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java @@ -0,0 +1,14 @@ +package com.casic.missiles.enums; + +/** + * @author + * @date + */ +public interface FixedPropertyEnum { + + String FIXED_POSITION = "fixedPosition"; + + String TOTAL_LENGTH = "totalLength"; + + String TAIL_POSITION = "tailPosition"; +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/CombinedFieldMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CombinedFieldMapper.java new file mode 100644 index 0000000..38e8f42 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CombinedFieldMapper.java @@ -0,0 +1,15 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.CombinedFieldConfig; +import org.apache.ibatis.annotations.Mapper; + +/** + * @author cz + * + */ +@Mapper +public interface CombinedFieldMapper extends BaseMapper { + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java new file mode 100644 index 0000000..128b09d --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java @@ -0,0 +1,10 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.CommandEventConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface CommandEventMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java new file mode 100644 index 0000000..042eb3c --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.DatagramEventConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface DatagramEventConfigMapper extends BaseMapper { +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java new file mode 100644 index 0000000..fc95cf4 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java @@ -0,0 +1,8 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.FieldConfig; + +public interface FieldConfigMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldRuleConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldRuleConfigMapper.java new file mode 100644 index 0000000..b310a08 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldRuleConfigMapper.java @@ -0,0 +1,10 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.FieldRuleConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface FieldRuleConfigMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java new file mode 100644 index 0000000..9060a69 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.ProtocolConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface ProtocolConfigMapper extends BaseMapper { +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolFieldConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolFieldConfigMapper.java new file mode 100644 index 0000000..1b47180 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolFieldConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +public interface ProtocolFieldConfigMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java new file mode 100644 index 0000000..6fa6936 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.RuleConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface RuleConfigMapper extends BaseMapper { +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/AbstractFieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/AbstractFieldConfig.java new file mode 100644 index 0000000..ba9aea2 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/AbstractFieldConfig.java @@ -0,0 +1,38 @@ +package com.casic.missiles.pojo; + +import lombok.Data; + +@Data +public class AbstractFieldConfig { + /** + * 字段名称 + */ + private String fieldName; + /** + * 按照字段评估进行字段解析 + */ + private String ruleJson; + /** + * 起始位置(单位byte) + */ + private Integer OriginPositionByte; + /** + * 起始位置,是否需要bit位置(单位bit)小于8, 没有不需要填写 + */ + private String OriginPositionBit; + /** + * 偏移长度 + */ + private Integer offsetLength; + /** + * 偏移单位(bit/byte) + */ + private String offsetUnit; + /** + * 是否需要转存 + */ + private Integer isStorage; + + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/CombinedFieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/CombinedFieldConfig.java new file mode 100644 index 0000000..4f4de6a --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/CombinedFieldConfig.java @@ -0,0 +1,41 @@ +package com.casic.missiles.pojo; + +import lombok.Data; + +import java.util.Date; + +/** + * 组合配置 + * + * @author cz + * @date 20 + */ +@Data +public class CombinedFieldConfig { + + private Long id; + private Long ruleId; + /** + * 前缀编码 + */ + private String prefixCode; + + /** + * 字段动态的id + */ + private Long dynamicLengthId; + /** + * 对应的要解析字段的ids + */ + private String dataFieldIds; + + /** + * 字段动态的id + */ + private String combinedFieldIds; + + private Date lastTime; + + private Date createTime; + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldConfig.java index a07d20d..8304dc6 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldConfig.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldConfig.java @@ -5,31 +5,28 @@ import java.util.Date; +/** + * @author cz + * 1、该表与实际解析的内容实例解析有关 + * 2、该表字段是随机出现的,和帧结构无关,无法预料的 + * 3、该表字段解析根据FieldEvaluatorConfig进行字段解析 + */ @Data -@TableName("field_config") -public class FieldConfig { +@TableName("business_field_config") +public class FieldConfig extends AbstractFieldConfig { private Long id; -// private String preFieldConfig; - private Long protocolId; - - private String isFixed; - private String uploadDeliveryChange; - - private String replyRule; - private String ruleJson; - + /** + * 协议配置id + */ + private Long ruleId; + /** + * 字段名称 + */ private String fieldName; - private String isStorage; - private Integer orignPosition; - private String exactOrignPosition; - - private Integer offsetLength; - private String offsetUnit; private String ownerId; private Date createTime; private Date lastTime; - } diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldRuleConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldRuleConfig.java new file mode 100644 index 0000000..2e09879 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldRuleConfig.java @@ -0,0 +1,20 @@ +package com.casic.missiles.pojo; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +@TableName("field_rule_config") +@Data +public class FieldRuleConfig { + + private Long id; + private String name; + private String desc; + private String condition; + private String excuteOperation; + private Date lasTime; + private Date createTime; + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/Msg.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/Msg.java deleted file mode 100644 index 81a5324..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/Msg.java +++ /dev/null @@ -1,86 +0,0 @@ -package com.casic.missiles.pojo; - -import lombok.Data; - -/** - * 协议 - */ -@Data -public class Msg { - - /** - * 前导码 - */ - private String preamble; - - /** - * 版本号 - */ - private String version; - - /** - * 内容长度 - */ - private int leng; - - /** - * 设备ID - */ - private String deviceId; - - /** - * 通讯方式 - */ - private Integer connType; - - /** - * 加密方式 - */ - private Integer encryType; - - /** - * 目标地址 - */ - private String destAddr; - - /** - * PDUType - */ - private String PDUType; - - /** - * 操作类型 - */ - private Integer operateType; - - /** - * 传输控制位 PDUType.bit7=0时,表示存在后续的访问;当PDUType.bit7=1时,表示无后续的访问。 - */ - private Integer transControlFlag; - - /** - * 设备类型 - */ - private Integer deviceType; - - /** - * 序号 - */ - private Integer seq; - - /** - * tagList - */ - private String tagList; - - /** - * OidList - */ - private String OidList; - - /** - * CRC - */ - private String CRC; - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/PreRuleConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/PreRuleConfig.java deleted file mode 100644 index bfcf914..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/PreRuleConfig.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.casic.missiles.pojo; - -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -import java.util.Date; - -@Data -@TableName("pre_rule_config") -public class PreRuleConfig { - - private Long id; - private String protocolId; - private String ruleFieldId; - private String ownerId; - private Date createTime; - private Date lastTime; -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolConfig.java index 274ad42..bdac11f 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolConfig.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolConfig.java @@ -5,18 +5,52 @@ import java.util.Date; +/** + * 协议配置表,协议配置与帧结构有关 + * 1、层级关系,协议之后是规则,规则对应设备类型的各种上数规则 + * 2、规则对应协议配置的实例流程 + * 3、每种可根据设备类型和操作类型进行上数规则进行区分 + */ @Data @TableName("protocol_config") public class ProtocolConfig { private Long id; + /** + * 前导码 + */ private String preFix; - private String unpackId; - private String totalLengthId; - private String totalLengthFilterField; + /** + * 拆包id + */ + private Long unpackId; + /** + * 总长度id + */ + private Long totalLengthId; + /** + * + */ + private String totalLengthFilterFields; + /** + * 动态长度ids + */ private String dynamicLengthId; + /** + * 动态长度json(预留字段) + */ private String dynamicLengthJson; - private String tailStr; + /** + * 规则字段所解析预准备的字段 + */ + private String rulePrepareFields; + /** + * 结尾标志 + */ + private Long tailStr; + /** + * 备注 + */ private String remark; private String ownerId; private Date createTime; diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolFieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolFieldConfig.java new file mode 100644 index 0000000..db794bd --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolFieldConfig.java @@ -0,0 +1,43 @@ +package com.casic.missiles.pojo; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +/** + * 协议字段配置表 + * 该表用户存放帧结构固定格式的字段 + * 有以下两个用途 + * (1)、固定格式的字段可用于规则匹配 + * (2)、固定格式的字段可用于报文回复 + * @author cz + * @date 2023-06-09 + */ +@Data +@TableName("protocol_field_config") +public class ProtocolFieldConfig extends AbstractFieldConfig{ + + private Long id; + /** + * 协议配置id + */ + private Long protocolId; + /** + * 上传下发是否有变化, 没有变化,可以直接组装 + */ + private String isReplyFix; + /** + * 按照字段评估进行字段解析 + */ + private Long fieldEvaluatorId; + /** + * 回复规则 + */ + private String replyRule; + + private String ownerId; + private Date createTime; + private Date lastTime; + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java index 3b53493..febf835 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java @@ -6,18 +6,40 @@ import java.util.Date; /** - * 加密字段解析和规则有关,事件调到该流程下面 + * @author cz + * todo: 匹配协议对应业务实例 + * 1、一个协议可以多种的流程规则 + * 2、规则可以支持递归规则流程 */ @Data @TableName("rule_config") public class RuleConfig { - private Long id; private String protocolId; - private String isBizField; - private String parseRuleJson; + /** + * 是否完成规则配置,没有完成, + * 则需要根据规则继续匹配 + */ + private String isFinishMatch; + /** + * 待匹配解析规则 + * {“data_field”:"data_value"} + */ + private String matchRuleJson; + /** + * 待解析字段ids + */ private String dataFieldIds; - private String aviatorFilterJson; + + /** + * 待解析组合字段ids + */ + private String combinedFieldIds; + + /** + * aviator + */ + private String conditionExpression; private Date createTime; private Date lastTime; } diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleDict.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleDict.java deleted file mode 100644 index cc7f389..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleDict.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.casic.missiles.pojo; - -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -@Data -@TableName("rule_dict") -public class RuleDict { - - private Long id; - private Long pid; - private String name; - private String code; - private String ownerId; - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleEvaluator.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleEvaluator.java deleted file mode 100644 index ed16610..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleEvaluator.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.pojo; - -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -import java.util.Date; - -@TableName("rule_evaluator") -@Data -public class RuleEvaluator { - - private Long id; - private String name; - private String desc; - private String condition; - private String excuteOperation; - private Date lasTime; - private Date createTime; - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/CombinedFieldConfigRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/CombinedFieldConfigRegistry.java new file mode 100644 index 0000000..fa59b90 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/CombinedFieldConfigRegistry.java @@ -0,0 +1,12 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.CombinedFieldConfig; + +import java.util.List; + +public interface CombinedFieldConfigRegistry { + + List getCombinedFieldConfigList(Long ruleId); + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/CommandEventRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/CommandEventRegistry.java new file mode 100644 index 0000000..fb97d87 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/CommandEventRegistry.java @@ -0,0 +1,8 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.CommandEventConfig; + +public interface CommandEventRegistry { + + CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName); +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/DatagramEventRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/DatagramEventRegistry.java new file mode 100644 index 0000000..fb34641 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/DatagramEventRegistry.java @@ -0,0 +1,11 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.DatagramEventConfig; + +import java.util.List; + +public interface DatagramEventRegistry{ + + List getDatagramEventList(Long ruleId); + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/FieldConfigRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/FieldConfigRegistry.java new file mode 100644 index 0000000..759642e --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/FieldConfigRegistry.java @@ -0,0 +1,20 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.FieldConfig; + +import java.util.List; + +public interface FieldConfigRegistry { + + + List getFieldConfigList(Long ruleId); + + FieldConfig getFieldConfigById(String fieldId); + + List getFieldConfigs(String protocolId, Integer isFixed); + + List getStorageFieldConfig(String protocolId); + + +} + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java index 608af3a..32cc8a4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java @@ -2,48 +2,47 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.delivery.decorator.ByteDecorator; +import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @AllArgsConstructor public class FieldDecoratorManger { - private final RuleDictDao ruleDictDao; + private final RuleConfigRegistry ruleDictDao; // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 // (1)静态的业务字段是字典里面可以配置的 // (2)动态的业务字段是通过规则生成的 public String contentMerge(String ruleJson, String sceneConent, String dynamicContent) { - List ruleDictList = ruleDictDao.getRuleDictConfig(); - Map ruleDictMap = ruleDictList.stream().collect( - Collectors.toMap(RuleDict::getId, e -> e)); - List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); - for (Map ruleMap : ruleMapList) { - String ruleType = String.valueOf(ruleMap.get("ruleType")); - ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); - NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); - byteDecorator.nodeDecoratorRule(nodeDecoratorParm); - } +// List ruleDictList = ruleDictDao.getRuleDictConfig(); +// Map ruleDictMap = ruleDictList.stream().collect( +// Collectors.toMap(RuleDict::getId, e -> e)); +// List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); +// for (Map ruleMap : ruleMapList) { +// String ruleType = String.valueOf(ruleMap.get("ruleType")); +// ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); +// NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); +// byteDecorator.nodeDecoratorRule(nodeDecoratorParm); +// } return null; } - - private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { - NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() - .contents(sceneConent) - .dynamicContent(dynamicContent) - .ruletypeId(ruletypeId) - .ruleDictMap(ruleDictMap) - .build(); - return nodeDecoratorParm; - } +// +// private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { +// NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() +// .contents(sceneConent) +// .dynamicContent(dynamicContent) +// .ruletypeId(ruletypeId) +// .ruleDictMap(ruleDictMap) +// .build(); +// return nodeDecoratorParm; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java index 652970c..b204ac3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java @@ -1,56 +1,56 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@AllArgsConstructor -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", - JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Component; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Component("logicalDecorator") +//@AllArgsConstructor +//@Slf4j +//public class LogicalShiftDecorator implements ByteDecorator { +// +//// private final FieldRuleEngineMapper fieldRuleEngineMapper; +//// +//// //字节位移 +//// @Override +//// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +//// String logicalValue = ""; +//// RuleEvaluator fieldRuleEngine = new RuleEvaluator(); +//// try { +//// Map env2 = new HashMap(); +//// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +//// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +//// for (String contentId : contentIdList) { +//// RuleDict ruleDict = ruleDictMap.get(contentId); +//// if (ruleDict.getCode().contains("#")) { +//// //使用动态的值 +//// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +//// } +//// env2.put(ruleDict.getName(), ruleDict.getCode()); +//// } +//// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +//// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +//// return null; +//// } +//// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +//// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +//// return values; +//// } catch (Exception ex) { +//// log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", +//// JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +//// return null; +//// } +//// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java index 346468f..822fead 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@AllArgsConstructor -@Slf4j -public class OperationDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("optionDecorator") +//@AllArgsConstructor +//@Slf4j +//public class OperationDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //混合运算,有常量或者乘除的缩放 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java index 50fb0a7..7a8bccb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@AllArgsConstructor -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +////精度计算 +//@AllArgsConstructor +//@Registry("precisionDecorator") +//@Slf4j +//public class PrecisionDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java index da39235..27f9cc7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java @@ -1,54 +1,53 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@AllArgsConstructor -@Slf4j -public class RuleDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("ruleDecorator") +//@AllArgsConstructor +//@Slf4j +//public class RuleDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //吃我一套正则表达式 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (Exception ex) { +// log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java index 7f5cbf3..c043f97 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java @@ -2,6 +2,6 @@ import java.util.Map; -public interface ComandeEventService { +public interface ComandeEventService{ Map loadComandeEventConfig(String protocolId,String scene); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java index 476ad84..aaf1837 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java @@ -2,46 +2,46 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.dao.CommandEventDao; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @Slf4j @AllArgsConstructor -public class ComandeEventServiceImpl implements ComandeEventService { +public class ComandeEventServiceImpl implements ComandeEventRegistry { - private final CommandEventDao commandEventDao; + // private final CommandEventDao commandEventDao; // 加密bean 固定字段出现变化的字段解析,业务字段的有序内容 @Override - public Map loadComandeEventConfig(String protocolId,String sceneName) { - CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); - if (ObjectUtil.isEmpty(commandEventConfig)) { - log.error("协议{},没有配置成功接收回复配置,清排查原因"); - return null; - } - String replyJson = commandEventConfig.getReplyContentJson(); - List> replyMapList = JSONArray.parseObject(replyJson, List.class); - List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); - Map fixMap = fixList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); - List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) - .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) - .collect(Collectors.toList()); - Map commandConfigMap = new HashMap<>(); - commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); - commandConfigMap.put("fixContent", fixMap); - commandConfigMap.put("bizContent", contentList); - return commandConfigMap; + public Map loadComandeEventConfig(String protocolId, String sceneName) { +// CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); +// if (ObjectUtil.isEmpty(commandEventConfig)) { +// log.error("协议{},没有配置成功接收回复配置,清排查原因"); +// return null; +// } +// String replyJson = commandEventConfig.getReplyContentJson(); +// List> replyMapList = JSONArray.parseObject(replyJson, List.class); +// List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); +// Map fixMap = fixList.stream() +// .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); +// List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) +// .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) +// .collect(Collectors.toList()); +// Map commandConfigMap = new HashMap<>(); +// commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); +// commandConfigMap.put("fixContent", fixMap); +// commandConfigMap.put("bizContent", contentList); +// return commandConfigMap; + return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 128b09d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java deleted file mode 100644 index 4016b0b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface DatagramEventMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java deleted file mode 100644 index 597c306..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.apache.ibatis.annotations.Mapper; - -public interface FieldConfigMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java deleted file mode 100644 index a31680a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.PreRuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface PreRuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java deleted file mode 100644 index 9060a69..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface ProtocolConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java deleted file mode 100644 index 6fa6936..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java deleted file mode 100644 index 582a705..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleDict; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleDictMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java deleted file mode 100644 index 6e302c8..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.CommandEventMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Optional; - -@Component -public class CommandEventDao { - - @Resource - private CommandEventMapper commandEventMapper; - - public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId) - .eq("scene", sceneName) - .eq("enabled", 1); - List commandEventConfig = commandEventMapper.selectList(queryWrapper); - Optional optionalEventConfig = commandEventConfig.stream().findFirst(); - return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java deleted file mode 100644 index 9137e4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.FieldConfigMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class FieldConfigDao { - - @Resource - private FieldConfigMapper fieldConfigMapper; - - public FieldConfig getFieldConfigById(String fieldId) { - FieldConfig fieldConfig = fieldConfigMapper.selectById(fieldId); - return fieldConfig; - } - - public List getFieldConfigs(String protocolId,Integer isFixed) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",isFixed); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - - public List getStorageFieldConfig(String protocolId) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",1) - .eq("is_storage",1); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java deleted file mode 100644 index 67bff6b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.mapper.PreRuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class PreRuleConfigDao { - - @Resource - private PreRuleConfigMapper preRuleConfigMapper; - - public List getPreRuleList(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return preRuleConfigMapper.selectList(queryWrapper); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java deleted file mode 100644 index d69ea85..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.RuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleConfigDao { - - @Resource - private RuleConfigMapper ruleConfigMapper; - - public RuleConfig getNextRuleConfig(String ruleFields) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("parse_rule_json", ruleFields); - return ruleConfigMapper.selectOne(queryWrapper); - } - - - public List getRuleConfigById(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return ruleConfigMapper.selectList(queryWrapper); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java deleted file mode 100644 index 932c185..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.RuleDictMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleDictDao { - - @Resource - private RuleDictMapper ruleDictMapper; - - public List getRuleDictConfig() { - List ruleDictList = ruleDictMapper.selectList(null); - return ruleDictList; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java index 9f9e279..43bc4d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java @@ -10,20 +10,15 @@ import io.netty.channel.socket.nio.NioServerSocketChannel; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import javax.annotation.PreDestroy; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static cn.hutool.core.util.ClassUtil.getClasses; /** * SensorhubServer netty服务端 */ @Slf4j -@Service +@Component public class SensorhubServer { /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java index 2c79ff5..9a28c36 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java @@ -11,13 +11,13 @@ import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioSocketChannel; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClient 客户端 */ @Slf4j -@Service +@Registry public final class SensorhubClient { public static void main(String[] args) throws Exception { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java index 9774be0..477c3f7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java @@ -6,12 +6,12 @@ import io.netty.channel.socket.SocketChannel; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientChannelInitialHandler */ -@Service +@Registry public class SensorhubClientChannelInitialHandler extends ChannelInitializer { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java index 346f4b3..73560e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java @@ -5,13 +5,13 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientHandler */ @Slf4j -@Service +@Registry public class SensorhubClientHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java index 5c1c6f2..d990af5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java @@ -4,12 +4,12 @@ import com.casic.missiles.pojo.Msg; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** * SensorhubServerHandler */ -@Service +@Component public class SensorhubServerHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 67283ae..af3172c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,41 +1,37 @@ package com.casic.missiles.parser; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultProtocolConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.*; +import com.casic.missiles.registry.FieldConfigRegistry; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; -import java.nio.charset.Charset; import java.util.HashMap; import java.util.List; import java.util.Map; -@Service("genericProtocolParser") +/** + * @author + */ +@Component("genericProtocolParser") @Slf4j -@AllArgsConstructor +@RequiredArgsConstructor public class GenericProtocolParser implements ProtocolParser { - private final LeadingCodeMatcher leadingCodeMatcher; private final List frameStructDispenserList; - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorInstanceSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; // 匹配首字母前导码=> 帧结构匹配前导码=> // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 @@ -44,18 +40,19 @@ public Boolean doParseProtocol(ByteBuf byteBuf) { String protocolContent = ByteBufUtil.hexDump(byteBuf); //匹配前导码 - List preCodeConfigs = leadingCodeMatcher.matchLeadingCode(protocolContent); + List preCodeConfigs = LeadingCodeMatcher.matchFrameLeadingCode(protocolContent); //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 if (preCodeConfigs.size() == 0) { - return rematch(byteBuf,protocolContent); + return rematch(byteBuf, protocolContent); } - //暂时先取第一个 + //暂时先取第一个,提升速度,使用享元模式, 减少类的创建销毁与构建 ProtocolConfig protocolConfig = preCodeConfigs.get(0); + AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); ByteBuf wholeDatagramByte = null; //通过匹配帧结构获取完整的数据包 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, preCodeConfigs.get(0))) != null) { + if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, protocolFactory)) != null) { break; } } @@ -68,76 +65,78 @@ * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 */ - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId, wholeDatagramByte); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap, protocolId); - //选取规则对应的流程实例 - DatagramEventConfig datagramEventConfig = processorInstanceSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); + //进行规则字段解析,进行匹配规则 + RuleConfig ruleConfig = getRuleConfig(protocolFactory, wholeDatagramByte); + if (ruleConfig == null) { + return false; + } //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, wholeDatagramByte); + ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte); + //以下进行业务的规则解析,同时选定流程实例 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); + DatagramEventProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain, + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText, protocolId); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain); //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); + datagramEventProvider.storeData(bizDataMap); return true; } - private Boolean rematch(ByteBuf byteBuf,String protocolContent) { + /** + * 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 + */ + private Boolean rematch(ByteBuf byteBuf, String protocolContent) { //重置位判断 byteBuf.resetReaderIndex(); //判断重置是否前移,如果没有前移,则直接判为匹配失败 if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { return false; } else { + //递归执行 return doParseProtocol(byteBuf); } } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; + //获取匹配规则->匹配规则 + private RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + //取出其中参与逻辑provider并判空 + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); + String rulePrepareFields = protocolConfig.getRulePrepareFields(); + //固定字段 + if (StringUtils.isNotEmpty(rulePrepareFields)) { + //获取统一固定字段解析 + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + //获取该协议的字段配置,用于协议规则匹配 + List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); + //获取规则 + RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, + rulePrepareFields, protocolFieldConfigs); + return ruleConfig; + } + return null; } - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + //数据构建,获取固定字段的store和业务字段store + private Map buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + Map bizDataMap = new HashMap<>(); + Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); + Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); + bizDataMap.putAll(ruleStoreObjectMap); + bizDataMap.putAll(protocolStoreObjectMap); return bizDataMap; } - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java index 8a46e32..16ce2e5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java @@ -3,6 +3,7 @@ import io.netty.buffer.ByteBuf; public interface ProtocolParser { + Boolean doParseProtocol(ByteBuf byteBuf); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java new file mode 100644 index 0000000..f7814af --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java @@ -0,0 +1,35 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.ProtocolConfigProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.ProtocolConfig; + +/** + * 存放基本协议的的加载信息 + */ +public class AbstractProtocolConfigFactory { + private final ProtocolConfigProvider protocolConfigProvider; + private final ProtocolFieldConfigProvider protocolFieldConfigProvider; + private final RuleConfigProvider ruleConfigProvider; + + public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { + this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); + this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); + this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); + } + + public ProtocolConfigProvider getProtocolConfigProvider() { + return protocolConfigProvider; + } + + public ProtocolFieldConfigProvider getProtocolFieldConfigProvider() { + return protocolFieldConfigProvider; + } + + public RuleConfigProvider getRuleConfigProvider() { + return ruleConfigProvider; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java new file mode 100644 index 0000000..6e36147 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java @@ -0,0 +1,57 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.CombinedFieldConfigProvider; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.FieldConfigProvider; +import com.casic.missiles.parser.provider.FieldRuleConfigProvider; + +/** + * 存放规则相关的的的加载信息 + */ +public class AbstractRuleConfigFactory { + + /** + * 处理字节 + */ + private final FieldConfigProvider fieldConfigProvider; + /** + * 处理组合字节解析的解码器 + */ + private final CombinedFieldConfigProvider combinedFieldConfigProvider; + /** + * 处理负责字节解析的规则配置 + */ + private final FieldRuleConfigProvider fieldRuleConfigProvider; + /** + * 处理实例流程 + */ + private final DatagramEventProvider datagramEventProvider; + + + public AbstractRuleConfigFactory(Long ruleId) { + this.fieldConfigProvider = new FieldConfigProvider(ruleId); + this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); + this.fieldRuleConfigProvider = new FieldRuleConfigProvider(ruleId); + this.datagramEventProvider = new DatagramEventProvider(ruleId); + } + + public FieldConfigProvider getFieldConfigProvider() { + return fieldConfigProvider; + } + + public CombinedFieldConfigProvider getCombinedFieldConfigProvider() { + return combinedFieldConfigProvider; + } + + public FieldRuleConfigProvider getFieldRuleConfigProvider() { + return fieldRuleConfigProvider; + } + + public DatagramEventProvider getDatagramEventProvider() { + return datagramEventProvider; + } + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java deleted file mode 100644 index 6e1719a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.factory; - - -import com.casic.missiles.pojo.ProtocolConfig; - -import java.util.List; - -/** - * 数据库访问优化(暂时未做) - *

- * 1、初始化协议解析配置,并存放到处存放缓存,对协议基本配置进行管理 - * 2、其中流程中所有的配置都经过此类进行管理,进行调用获取,增强解析速度 - */ -public interface DatagramFactory { - - /** - * 初始化 - */ - List datagramInit(); - - /** - * 根据前导码配置匹配,模糊匹配获取所有的报文项 - */ - List match(); - - /** - * 根据前导码匹配,返回报文项 - */ - List filer(); - - /** - * 保证数据的唯一性选择器 - */ - List selectOne(); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java new file mode 100644 index 0000000..87444a0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java @@ -0,0 +1,18 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +import java.util.List; + +/** + * 直接用,还是边用边创建 + */ +public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { + + + public DefaultProtocolConfigFactory(ProtocolConfig protocolConfig) { + super(protocolConfig); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java new file mode 100644 index 0000000..cce0c7c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java @@ -0,0 +1,12 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; + +public class DefaultRuleFactory extends AbstractRuleConfigFactory { + + public DefaultRuleFactory(Long ruleId) { + super(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java deleted file mode 100644 index 9ee97e0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.casic.missiles.parser.instance; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service -@Slf4j -@AllArgsConstructor -public class GeneralProcessor { - - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; - - /** - * 统一固定字段解析=>进行规则的查询的判断 - * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 - * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 - */ - @Deprecated - public boolean parseWholeDatagram(ByteBuf buffer, ProtocolConfig protocolConfig) { - try { - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap,protocolId); - //选取规则对应的流程= - DatagramEventConfig datagramEventConfig = processorSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); - //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); - //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); - //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); - //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); - //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); - return true; - } catch (Exception ex) { - log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", - ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); - return false; - } - } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; - } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); - } - - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); - return bizDataMap; - } - - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java index 25e7ad8..6a5777e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java @@ -1,23 +1,31 @@ package com.casic.missiles.parser.instance.impl; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.mapper.DatagramEventMapper; import com.casic.missiles.pojo.DatagramEventConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.SpringContextUtil; -@Service -@AllArgsConstructor +import java.util.List; +import java.util.Optional; + +/** + * @author cz + * + */ public class DefaultProcessorInstanceSelector implements ProcessorInstanceSelector { - private final DatagramEventMapper datagramEventMapper; + private static List datagramEventConfigs; + + static { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + datagramEventConfigs = datagramEventRegistry.getDatagramEventList(); + } @Override public DatagramEventConfig getProcessorInstance(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("rule_id", protocolId); - return datagramEventMapper.selectOne(queryWrapper); + Optional optionalSelectInstance = datagramEventConfigs.stream() + .filter(e -> e.getId().equals(protocolId)).limit(1).findFirst(); + return optionalSelectInstance.isPresent() ? optionalSelectInstance.get() : null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a778671..7b56a43 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,16 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import io.netty.buffer.ByteBuf; /** - * 分析匹配情况 - * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 - * 2、匹配不成功,有后续帧,可以进行下次匹配。 - * 3、匹配不成功,无后续帧,可以进行丢弃。 + * 分析匹配情况 + * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 + * 2、匹配不成功,有后续帧,可以进行下次匹配。 + * 3、匹配不成功,无后续帧,可以进行丢弃。 */ -public interface FrameStructMatcher{ +public interface FrameStructMatcher { - ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig); + ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 05320ab..8ebea78 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,23 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.ProtocolConfigMapper; +import com.casic.missiles.parser.provider.ProtocolConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Component; import java.util.List; import java.util.stream.Collectors; -@Component -@AllArgsConstructor public class LeadingCodeMatcher { - private final ProtocolConfigMapper protocolMapper; - //** 1、首字母匹配前导码, // 2、以匹配出的前导码是否在报文中条件进行前导码的匹配二次筛选 - public List matchLeadingCode(String protocolContent){ + public static List matchFrameLeadingCode(String protocolContent){ List initialConfigs = initialMatch(protocolContent); List preCodeConfigs = initialConfigs.stream() .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) @@ -26,13 +19,16 @@ } //初始化匹配前导码内容 - private List initialMatch(String protocolContent) { - String protocolStr = protocolContent.charAt(0) + ""; - QueryWrapper queryWrapper = new QueryWrapper() - .likeRight("pre_fix", protocolStr); - List protocolConfigList = protocolMapper.selectList(queryWrapper); - return protocolConfigList; + private static List initialMatch(String protocolContent) { + String firstFrameChar = protocolContent.charAt(0) + ""; + ProtocolConfigProvider protocolConfigProvider=new ProtocolConfigProvider(firstFrameChar); + return protocolConfigProvider.getMatchList(); } + + + + + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index cf2113d..e915877 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -1,32 +1,35 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(0) -@Service +@Component public class FrameLengthMatcher implements FrameStructMatcher { - @Autowired - private FieldParser fieldParser; - //超过长度 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { String dataGramContent = ByteBufUtil.hexDump(byteBuf); - if (StringUtils.isEmpty(protocolConfig.getUnpackId()) && StringUtils.isEmpty(protocolConfig.getTailStr())) { - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + //当不存在结尾标志和拆包标志,可以直接使用长度进行匹配 + if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { if (dataGramContent.length() >= totalLength) {//等于长度返回true,超出长度,切断 - ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, protocolConfig, totalLength); + ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, totalLength); return wholeDatagramByte; } else { //读的标志位前移舍弃 @@ -38,7 +41,7 @@ return null; } - private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, Integer totalLength) { byteBuf.readBytes(totalLength); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, totalLength - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 2bfc213..d527ad0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; @@ -13,7 +13,7 @@ import lombok.AllArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.nio.charset.Charset; import java.util.Map; @@ -22,32 +22,30 @@ * 后续标志验证 */ @Order(1) -@Service +@Component @AllArgsConstructor -public class FrameMarkMatcher implements FrameStructMatcher { - - private final FieldConfigDao fieldConfigDao; - private final FieldParser fieldParser; - private final FieldResolver fieldResolverManger; +public class FrameMarkMatcher implements FrameStructMatcher, FixedPropertyEnum { //帧后续标志=>结束,进行帧的重组=>有后续,1、帧移位判别 2、继续接收帧 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig UnpackConfig = StringUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getUnpackId()); - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); - Integer upback = 0; + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); ByteBuf mergeWholeFrameByte = null; - if (!ObjectUtil.isEmpty(UnpackConfig)) { - while (hasNextFullFrame(byteBuf, protocolConfig)) { - upback = (Integer) fieldResolverManger.filedParserManger(byteBuf, UnpackConfig, null); + if (!ObjectUtil.isEmpty(unpackFlag)) { + while (hasNextFullFrame(byteBuf, protocolConfig, protocolFieldConfigProvider)) { //是否存在后续位 - if (upback == 1) {//使用esayRule + if (unpackFlag == 1) {//使用esayRule //表示可以截取 - mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolConfig, totalLength); + mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolFieldConfigProvider, protocolConfig); return mergeWholeFrameByte; } else { - byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig)); + byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig, protocolFieldConfigProvider)); } } } @@ -56,7 +54,8 @@ //选取第一个帧,将业务内容和后面部分分开 //计算数据报文-业务内容 - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolFieldConfigProvider protocolFieldConfigProvider, ProtocolConfig protocolConfig) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); //截取完整报文 byteBuf.readBytes(totalLength); ByteBuf byteBufContent = byteBuf.slice(0, byteBuf.readerIndex()); @@ -68,15 +67,15 @@ String tail = ""; System.out.println(ByteBufUtil.hexDump(byteBufContent)); //会存在多个帧拼接在一起的的情况,进行合并处理 - while (hasNextFullFrame(byteBufContent, protocolConfig)) { - Integer currentFrameLength = fieldParser.getTotalLength(protocolConfig, byteBufContent); + while (hasNextFullFrame(byteBufContent, protocolConfig, protocolFieldConfigProvider)) { + Integer currentFrameLength = protocolFieldConfigProvider.getTotalLength(byteBufContent, protocolConfig); byteBufContent.readBytes(currentFrameLength); ByteBuf currentbyteBuf = byteBufContent.slice(0, byteBufContent.readerIndex()); byteBufContent.markReaderIndex();//读的标志位前移 System.out.println(ByteBufUtil.hexDump(byteBufContent)); String hexDump = currentbyteBuf.toString(Charset.forName("ISO-8859-1")); //获取当前固定帧结构的关系map - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, currentbyteBuf); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(currentbyteBuf, protocolConfig); if (StringUtils.isEmpty(mergeFrameStr)) { //首次获取业务数据报文 mergeFrameStr += hexDump.substring(0, currentFrameFixedProperty.get("tailPosition")); @@ -95,22 +94,22 @@ /** * 获取平移到下一帧起始位置 */ - public int getNextFrameOffset(ByteBuf buffer, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, buffer); - return currentFrameFixedProperty.get("totalLength"); + public int getNextFrameOffset(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + return currentFrameFixedProperty.get(TOTAL_LENGTH); } /** * 判断是否出错进行整个帧的 */ - public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, byteBuf); + public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); //保证读取位置不在固定位置,是可变的业务内容 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("fixedPosition")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(FIXED_POSITION)) { return false; } //判断读取是否操作帧长度 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("totalLength")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(TOTAL_LENGTH)) { return false; } return true; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 76a3784..c3a1bab 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -1,50 +1,50 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.parser.instance.GeneralProcessor; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; +import io.netty.buffer.ByteBufUtil;; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(2) -@Service +@Component public class FrameTailMatcher implements FrameStructMatcher { - @Resource - private FieldConfigDao fieldConfigDao; - @Autowired - private GeneralProcessor generalProcessor; - //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig tailFieldConfig = StringUtils.isEmpty(protocolConfig.getTailStr()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getTailStr()); - if (!ObjectUtil.isEmpty(tailFieldConfig)) { - String tailStr = tailFieldConfig.getFieldName(); + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfig protocolFieldConfig = ObjectUtils.isEmpty(protocolConfig.getTailStr()) ? null : + fieldConfigProvider.getFieldConfigById(protocolConfig.getTailStr()); + if (!ObjectUtil.isEmpty(protocolFieldConfig)) { + String tailStr = protocolFieldConfig.getFieldName(); String dataGramContent = ByteBufUtil.hexDump(byteBuf); Boolean tailFlag = ByteBufUtil.hexDump(byteBuf).contains(tailStr); if (!tailFlag) { //使用esayRule return null; } else if (dataGramContent.indexOf(tailStr) < dataGramContent.length() - tailStr.length()) { Integer length = dataGramContent.indexOf(tailStr) + tailStr.length(); - ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, protocolConfig, length); + ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, length); return wholeDatagramByte; //存在粘包 } } return null; } - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer length) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, Integer length) { byteBuf.readBytes(length); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, length - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java new file mode 100644 index 0000000..5f1c177 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java @@ -0,0 +1,73 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.combined.GenericCombinedFieldResolver; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.CombinedFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class CombinedFieldConfigProvider { + + + /** + * 作为临时配置列表缓存使用 + */ + private final List combinedFieldConfigList; + private Map storeObjectMap = new HashMap<>(); + + public CombinedFieldConfigProvider(Long ruleId) { + CombinedFieldConfigRegistry combinedFieldConfigRegistry = SpringContextUtil.getBean(CombinedFieldConfigRegistry.class); + combinedFieldConfigList = combinedFieldConfigRegistry.getCombinedFieldConfigList(ruleId); + } + + public void parseDataField(RuleConfig ruleConfig, String clearZeroPlain,Map fieldConfigsMap ) { + if (showSkip()) { + return; + } + //匹配对应的数据,然后进行相关的字段解析 + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver(); + combinedFieldResolver.parseDataField(combinedFieldConfigList, byteBuf, storeObjectMap,fieldConfigsMap); + } + + + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getCombinedFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return combinedFieldConfigList.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public List getCombinedFieldConfigList() { + return combinedFieldConfigList; + } + + /* 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(combinedFieldConfigList) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java new file mode 100644 index 0000000..f3cfedc --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java @@ -0,0 +1,11 @@ +package com.casic.missiles.parser.provider; + +/** + * @author cz + * @date 2023-6-12 + */ +public class CommandEventProvider{ + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java new file mode 100644 index 0000000..70eec5e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java @@ -0,0 +1,77 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.safe.SafeStrategy; +import com.casic.missiles.parser.sender.DataSubscribeProvider; +import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class DatagramEventProvider { + + private final DatagramEventConfig processorInstance; + + public DatagramEventProvider(Long ruleId) { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + List datagramEventConfigList = + datagramEventRegistry.getDatagramEventList(ruleId); + processorInstance = this.getProcessorInstance(datagramEventConfigList); + } + + public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { + if (showSkip()) { + return null; + } + return datagramEventConfigList.get(0); + } + + // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 + public String getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap) { + String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? + processorInstance.getSafeBean() : + fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); + if (!StringUtils.isEmpty(safeName)) { + //需要加密 + SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); + String plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); + return clearComplementZero(plain); + } + return ByteBufUtil.hexDump(bizDataContent); + } + + //解密清零操作 + private String clearComplementZero(String plain) { + plain = plain.substring(0, plain.lastIndexOf("00")); + return plain; + } + + //数据发送,数据发送者暂未构建 + public void storeData(Map bizDataMap) { + DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); +// dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return ObjectUtils.isNotEmpty(processorInstance) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java new file mode 100644 index 0000000..7e1fe0a --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java @@ -0,0 +1,97 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.FieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class FieldConfigProvider { + + + private final List fieldConfigs; + private Map storeObjectMap = new HashMap<>(); +// private Map singleObjects = new ConcurrentHashMap<>(); + + public FieldConfigProvider(Long ruleId) { + FieldConfigRegistry fieldConfigRegistry = SpringContextUtil.getBean(FieldConfigRegistry.class); + fieldConfigs = fieldConfigRegistry.getFieldConfigList(ruleId); + } + + public List getFieldConfigs() { + return fieldConfigs; + } + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public Map parseDataField(RuleConfig ruleConfig, String clearZeroPlain) { + if (showSkip()) { + return null; + } + List prepareFieldConfig = prepareParseField(ruleConfig); + if (CollectionUtils.isNotEmpty(prepareFieldConfig)) { + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(fieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + return fixDataMap; + } + } + return null; + } + + /** + * 得到需要处理的业务内容 + * + * @return + */ + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return fieldConfigs.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public Map getFieldConfigsMap() { + return fieldConfigs.stream().collect( + Collectors.toMap(FieldConfig::getId, e -> e) + ); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(fieldConfigs) ? false : true; + } + + +} + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java new file mode 100644 index 0000000..817bfaf --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java @@ -0,0 +1,19 @@ +package com.casic.missiles.parser.provider; + +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.registry.FieldRuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; + +public class FieldRuleConfigProvider { + + private final List fieldRuleConfigList; + + public FieldRuleConfigProvider(Long ruleId) { + FieldRuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(FieldRuleConfigRegistry.class); + fieldRuleConfigList = ruleConfigRegistry.getFieldRuleConfigList(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java new file mode 100644 index 0000000..99a1b06 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java @@ -0,0 +1,53 @@ +package com.casic.missiles.parser.provider; + + +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.registry.ProtocolConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolConfigProvider { + + private final List protocolConfigList; + + public ProtocolConfigProvider(String firstChar) { + ProtocolConfigRegistry registry = SpringContextUtil.getBean(ProtocolConfigRegistry.class); + protocolConfigList = registry.getProtocolConfigList(firstChar); + } + + public List getMatchList() { + return protocolConfigList; + } + + /** + * 设置当前协议 + * + * @param protocolConfig + */ + public ProtocolConfigProvider(ProtocolConfig protocolConfig) { + List protocolConfigs = new ArrayList<>(); + protocolConfigs.add(protocolConfig); + protocolConfigList = protocolConfigs; + } + + /** + * 获取当前协议 + * + * @return + */ + public ProtocolConfig getCurrentProtocolConfig() { + if (this.protocolConfigList == null) { + return null; + } else { + return protocolConfigList.get(0); + } + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java new file mode 100644 index 0000000..043927d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java @@ -0,0 +1,213 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.registry.ProtocolFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolFieldConfigProvider { + + private static final String FIXED_FIELD_DS = "fixedFieldDs"; + private static final String CONTENT_FIELD_DS = "contentFieldDs"; + private static final String PROTOCOL_LENGTH = "protocolLength"; + private static final String PROTOCOL_FIELD_ID = "protocolFieldId"; + private static final String PROTOCOL_POSITION = "protocolPosition"; + + private final List protocolFieldConfigs; + private Map singleObjects = new ConcurrentHashMap<>(); + private Map storeObjectMap = new HashMap<>(); + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public ProtocolFieldConfigProvider(Long protocolId) { + ProtocolFieldConfigRegistry protocolFieldConfigRegistry = SpringContextUtil.getBean(ProtocolFieldConfigRegistry.class); + protocolFieldConfigs = protocolFieldConfigRegistry.getProtocolFieldConfigList(protocolId); + } + + public List getProtocolFieldConfigs() { + return protocolFieldConfigs; + } + + public ProtocolFieldConfig getFieldConfigById(Long fieldId) { + Optional optionalConfig = protocolFieldConfigs.stream().filter( + e -> e.getId().equals(fieldId) + ).findFirst(); + return optionalConfig.isPresent() ? optionalConfig.get() : null; + } + + public Integer getProtocolFieldValue(Long protocolFieldId, ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_FIELD_ID + protocolFieldId + ByteBufUtil.hexDump(byteBuf); + //获取缓存 + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + //加载固定长度数据集合 + Map fixDataMap = this.getProtocolDataMap(byteBuf); + ProtocolFieldConfig protocolFieldConfig = selectFieldConfig(protocolFieldId); + Integer protocolFieldValue = 0; + //获取约定字段的总长度 + if (fixDataMap.containsKey(protocolFieldConfig.getFieldName())) { + Object appointUnpackObject = fixDataMap.get(protocolFieldConfig.getFieldName()); + if (ObjectUtils.isNotEmpty(appointUnpackObject)) { + protocolFieldValue = (Integer) appointUnpackObject; + } + } + if (protocolFieldValue != null) { + //加入缓存 + if (ObjectUtils.isNotEmpty(protocolFieldValue)) { + this.singleObjects.put(catchKey, protocolFieldValue); + return protocolFieldValue; + } + } + return null; + } + + /** + * 获取帧固定位置信息 + * + * @param byteBuf + * @param protocolConfig + * @return + */ + public Map getFixedProperty(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_POSITION + protocolConfig.getId(); + if (this.singleObjects.containsKey(catchKey)) { + return (Map) singleObjects.get(catchKey); + } + Map fixedPropertyMap = new HashMap<>(); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + fixedPropertyMap = fieldParser.doGetFixedProperty(protocolFieldConfigs, this.getTotalLength(byteBuf,protocolConfig)); + if (CollectionUtils.isNotEmpty(fixedPropertyMap)) { + this.singleObjects.put(catchKey, fixedPropertyMap); + return fixedPropertyMap; + } + return fixedPropertyMap; + } + + /** + * 获取帧结构应有的总长度 + */ + public Integer getTotalLength(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_LENGTH + ByteBufUtil.hexDump(byteBuf); + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + Integer appointFrameLength = getProtocolFieldValue(protocolConfig.getTotalLengthId(), byteBuf); + if (appointFrameLength != null) { + //获取过滤的字段集合总长度 + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Integer totalFilterLength = fieldParser.getTotalFilterLength(protocolConfig, byteBuf, getFixFieldConfigMap()); + //计算总长度 + Integer totalLength = appointFrameLength + totalFilterLength; + //加入缓存 + if (ObjectUtils.isNotEmpty(totalLength)) { + this.singleObjects.put(catchKey, totalLength); + return totalLength; + } + } + return null; + } + + /** + * 获取协议有关字段解析内容 + * storeObjectMap存储代转存的数据 + * + * @return + */ + public Map getProtocolDataMap(ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(FIXED_FIELD_DS)) { + return (Map) singleObjects.get(FIXED_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(protocolFieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + this.singleObjects.put(FIXED_FIELD_DS, fixDataMap); + return fixDataMap; + } + return null; + } + + /** + * 获取业务报文内容的content字节 + * + * @param wholeDatagramByte + * @return + */ + public ByteBuf getDataContentBuf(ByteBuf wholeDatagramByte) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(CONTENT_FIELD_DS)) { + return (ByteBuf) singleObjects.get(CONTENT_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + ByteBuf bizDataByteBuf = fieldParser.getDataContentBuf(protocolFieldConfigs, wholeDatagramByte); + if (bizDataByteBuf != null) { + this.singleObjects.put(CONTENT_FIELD_DS, bizDataByteBuf); + return bizDataByteBuf; + } + return null; + } + + + private ProtocolFieldConfig selectFieldConfig(Long id) { + Optional optionalProtocolFieldConfig = this.protocolFieldConfigs.stream().filter( + e -> e.getId().equals(id) + ).findFirst(); + return optionalProtocolFieldConfig.isPresent() ? optionalProtocolFieldConfig.get() : null; + } + + + private Map getFixFieldConfigMap() { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, e -> e) + ); + return fixDataFieldMap; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(protocolFieldConfigs) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java new file mode 100644 index 0000000..dafba1c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java @@ -0,0 +1,56 @@ +package com.casic.missiles.parser.provider; + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.rule.GenericRuleResolver; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.RuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleConfigProvider { + + private final List ruleConfigs; + + public List getRuleConfigs() { + return ruleConfigs; + } + + public RuleConfigProvider(Long protocolId) { + RuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(RuleConfigRegistry.class); + ruleConfigs = ruleConfigRegistry.getRuleConfigById(protocolId); + } + + /** + * 获取规则匹配结果 + * + * @param parseFixedDataMap + * @param protocolFieldConfigs + * @return + */ + public RuleConfig doGetRule(Map parseFixedDataMap, + String ids, + List protocolFieldConfigs) { + if (showSkip()) { + return null; + } + RuleConfig ruleConfig = GenericRuleResolver.machRule(parseFixedDataMap, ids, protocolFieldConfigs, ruleConfigs); + return ruleConfig; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(ruleConfigs) ? false : true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java index 3c05891..856b399 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java @@ -1,18 +1,11 @@ package com.casic.missiles.parser.resolver; -import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.springframework.web.bind.annotation.RequestBody; -import javax.annotation.Resource; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -20,19 +13,17 @@ @Slf4j public class ByteMergeProvider { - @Resource - private FieldRuleEngineMapper fieldRuleEngineMapper; - //拿到所有的值合并到一个值 - public String resolveByteMerge(List valueList, String ruletypeId, String vaildRange) { + public static String resolveByteMerge(List valueList, String ruleTypeId, String vaildRange) { String values = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Map vaildMap = getValidRangeMap(vaildRange); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(ruletypeId); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } + //暂时不处理 +// fieldRuleEngine = fieldRuleConfigMapper.selectById(ruleTypeId); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } Map env2 = new HashMap(); for (int i = 0; i < valueList.size(); i++) { if (vaildMap.containsKey(i)) { @@ -47,7 +38,7 @@ } } - private Map getValidRangeMap(String vaildRange) { + private static Map getValidRangeMap(String vaildRange) { String[] range = vaildRange.split(","); Map vaildMap = new HashMap(); for (int i = 0; i < range.length; i++) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 8d821cd..85d6bbf 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -1,9 +1,12 @@ package com.casic.missiles.parser.resolver; +import com.casic.missiles.pojo.AbstractFieldConfig; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; import io.netty.buffer.ByteBuf; +import java.util.List; import java.util.Map; /** @@ -11,18 +14,14 @@ */ public interface FieldParser { -// Map fieldProcess(String protocolContent,); - Map dataParser(RuleConfig ruleConfig, String lightText,String protocolId); + Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength); - Map fixDataParser(String protocolId, ByteBuf buffer); + Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap); - Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf); + ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer); - ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer); - - ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer); - - Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer); + Integer getTotalFilterLength(ProtocolConfig protocolConfig, ByteBuf byteBuf, Map protocolFieldConfigMap); } + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java new file mode 100644 index 0000000..9e0c00e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java @@ -0,0 +1,52 @@ +package com.casic.missiles.parser.resolver; + +import com.casic.missiles.pojo.AbstractFieldConfig; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.util.List; + +public class FieldParserSupport { + + //分别计算bit和byte长度=> 合并长度 + protected Integer calculateLength(List fieldConfigList) { + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + Integer fixedLength = bytefixedLength + bitfixedLength / 8; + return fixedLength; + } + + //找到最大值=> 根据最大值计算业务数据下标 + protected Integer calculatePosition(List fieldConfigList) { + String rex = "[0-9]+"; + Integer max = -1; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) + && Integer.valueOf(fieldConfig.getOriginPositionByte()) > max) { + max = Integer.valueOf(fieldConfig.getOriginPositionByte()); + } + } + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) && fieldConfig.getOriginPositionByte().equals(max)) { + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + } + } + Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; + return maxFixedPosition; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java deleted file mode 100644 index dd3a6cd..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java +++ /dev/null @@ -1,170 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.ByteResolverParam; -import io.netty.buffer.ByteBuf; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -/** - * 字段解析管理总类 - */ -@Service -@Slf4j -@AllArgsConstructor -public class FieldResolver extends ByteMergeProvider { - - //1、字段截取 => 2、简单的字节解析和复杂的字节解析 - public Object filedParserManger(ByteBuf byteBuf, FieldConfig fieldConfig, Integer maxFixedPosition) { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - //最大固定位置不为空, - if (!ObjectUtil.isEmpty(maxFixedPosition)) { - orignPosition -= maxFixedPosition; - } - Object fieldValue = 0; - //待优化 - if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { - fieldValue = bitToResolver(byteBuf, fieldConfig); - } else { - ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); - fieldValue = parsingFields(fieldBytes, fieldConfig.getRuleJson()); - } - return fieldValue; - } - - //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, - //目前默认配置的规则设置暂不支持配置化,由实现完成 - private Object parsingFields(ByteBuf byteBuf, String ruleJson) { - Object fieldsResolveValue = null; - List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); - if (ObjectUtil.isEmpty(ruleMapList)) { - fieldsResolveValue = defaultResolveBuilder(byteBuf); - } else { - fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); - } - return fieldsResolveValue; - } - - private Object defaultResolveBuilder(ByteBuf byteBuf) { - Integer defaultResolveValue = 0; - for (int i = 0; i < byteBuf.writerIndex(); i++) { - defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; - } - return defaultResolveValue; - } - - //字段解析构建器(针对字节单位的) - //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 - // 字节归并结束或者规则结束=>继续根据规则进行判断 - private Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { - Object customizeResolveValue = null; - try { - List bytStrList = new ArrayList<>(); - //存放到数组里面 - for (int i = 0; i < byteBuf.writerIndex(); i++) { - bytStrList.add(byteBuf.readByte()); - } - int i = 0; - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - customizeResolveValue = this.resolveByteMerge(bytStrList, ruletypeId,vaildRange); - break; - } else { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - List tempBytStr = new ArrayList<>(); - for (int k = 0; i < bytStrList.size(); i++) { - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(k) - .value(bytStrList.get(k)) - .ruletypeId(ruletypeId).build(); - tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); - } - bytStrList = tempBytStr; - } - i++; - } - //字节归并到一起=>继续根据规则进行判断 - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(customizeResolveValue) - .ruletypeId(ruletypeId).build(); - customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(customizeResolveValue)); - return customizeResolveValue; - } catch (RuntimeException ex) { - log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); - return null; - } - } - - /** - * 1、单个字节情况表示字段 - * 2、多字节情况表示字段(暂未处理) - */ - private Object bitToResolver(ByteBuf byteBuf, FieldConfig fieldConfig) { - Object fieldValue = new Object(); - try { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - byte fields = 0x00; - if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); - } else { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); - } - - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { - if (!StringUtils.isEmpty(fieldConfig.getExactOrignPosition())) { - fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getExactOrignPosition())).byteValue() - >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); - } else { - fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); - } - } else { - fieldValue = Integer.valueOf(fields & 0xff); - } - if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { - return fieldValue; - } - List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); - int i = 0; - //字节归并到一起=>继续根据规则进行判断 - while (i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(fieldValue) - .ruletypeId(ruletypeId).build(); - fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(fieldValue)); - return fieldValue; - } catch (RuntimeException ex) { - log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); - return null; - } - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java new file mode 100644 index 0000000..1d2aeab --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java @@ -0,0 +1,36 @@ +package com.casic.missiles.parser.resolver.bytes; + +import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.mapper.FieldRuleConfigMapper; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.pojo.ByteResolverParam; +import com.googlecode.aviator.AviatorEvaluator; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; +//转换规则 +@Component("convert") +@AllArgsConstructor +@Slf4j +public class ByteRuleResolver implements ByteResolver { + + private final FieldRuleConfigMapper fieldRuleConfigMapper; + + @Override + public Object resolveOperationRule(ByteResolverParam byteResolverParam){ + FieldRuleConfig fieldRuleEngine=fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); + if(ObjectUtil.isEmpty(fieldRuleEngine)){ + return byteResolverParam.getValue(); + } + String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); + Map env2 = new HashMap(); + env2.put("value", (byte) byteResolverParam.getValue()); + String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); + return values; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java index 103821c..786b71c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java @@ -2,34 +2,34 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("logicalShift") +@Component("logicalShift") @AllArgsConstructor @Slf4j public class LogicalShiftResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //字节位移 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { Integer index = byteResolverParam.getIndex(); - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return byteResolverParam.getValue(); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java index 476747d..01149bd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("operation") +@Component("operation") @AllArgsConstructor @Slf4j public class OperationResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //混合运算,有常量或者乘除的缩放 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java index 0b82cf4..79abcce 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.casic.missiles.pojo.ByteResolverParam; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; //精度计算 -@Service("precision") +@Component("precision") @AllArgsConstructor @Slf4j public class PrecisionResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java deleted file mode 100644 index 5c3f332..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; -//转换规则 -@Service("convert") -@AllArgsConstructor -@Slf4j -public class RuleResolver implements ByteResolver { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam){ - RuleEvaluator fieldRuleEngine=fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); - if(ObjectUtil.isEmpty(fieldRuleEngine)){ - return byteResolverParam.getValue(); - } - String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); - Map env2 = new HashMap(); - env2.put("value", (byte) byteResolverParam.getValue()); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java new file mode 100644 index 0000000..d3bbd91 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java @@ -0,0 +1,15 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; + +import java.util.List; +import java.util.Map; +// 前导码匹配->长度字段 +public interface AbstractCombinedFieldProcessor { + + Map invoke(Map map, ByteBuf byteBuf, List combinedFieldConfigList, + Map fieldConfigsMap, Map storeObjectMap); + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java new file mode 100644 index 0000000..03c8480 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java @@ -0,0 +1,59 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-13 + */ +//依次递增进行数据的解析, +public class GenericCombinedFieldResolver { + + + //通过查询,字段长度长度随机 + public void parseDataField(List combinedFieldConfigList, ByteBuf byteBuf, + Map storeObjectMap, Map fieldConfigsMap) { + Integer frameLength = Integer.valueOf(ByteBufUtil.hexDump(byteBuf)); + //添加前置处理器 + com.casic.missiles.util.ClassUtil classUtil = new com.casic.missiles.util.ClassUtil(); + List abstractCombinedProcessors = classUtil.getSubClassList(AbstractCombinedFieldProcessor.class); + + Map fieldFixedMap = combinedFieldLeadCodeMap(combinedFieldConfigList); + //frameLength + Map combinedProcessorFields = null; + while (byteBuf.readableBytes() < frameLength) { + //一直处理 + for (AbstractCombinedFieldProcessor abstractCombinedProcessor : abstractCombinedProcessors) { + combinedProcessorFields = abstractCombinedProcessor.invoke(combinedProcessorFields, byteBuf, + combinedFieldConfigList, + fieldConfigsMap, storeObjectMap); + if (combinedProcessorFields == null || byteBuf.readableBytes() < frameLength) { + return; + } + } + + } + } + + /** + * 取出前导码匹配集合 + */ + private Map combinedFieldLeadCodeMap(List combinedFieldConfigList) { + Map fieldFixedMap = combinedFieldConfigList + .stream() + .collect(Collectors.toMap(CombinedFieldConfig::getPrefixCode, e -> e)); + return fieldFixedMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java new file mode 100644 index 0000000..643a934 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java @@ -0,0 +1,100 @@ +package com.casic.missiles.parser.resolver.fields; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.FieldParserSupport; +import com.casic.missiles.pojo.*; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 保存使用时最基本的信息,并且使用原型模式 + */ +@Slf4j +public class DefaultProtocolFieldParser extends FieldParserSupport implements FieldParser, FixedPropertyEnum { + + //通过传入的配置和报文进行字段解析 + @Override + public Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap) { + Map dataMap = new HashMap<>(); + for (AbstractFieldConfig protocolFieldConfig : protocolFieldConfigs) { + if (!ObjectUtils.isEmpty(protocolFieldConfig.getOriginPositionByte())) { + Object fieldValue = FieldResolver.parseField(buffer, protocolFieldConfig, null); + if (protocolFieldConfig.getIsStorage() == 1) { + storeObjectMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + dataMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + } + return dataMap; + } + + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength) { + Map fixedPropertyMap = new HashMap<>(); + Integer fixedLength = calculateLength(protocolFieldConfigs); + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + fixedPropertyMap.put(FIXED_POSITION, maxFixedPosition); + fixedPropertyMap.put(TOTAL_LENGTH, totalLength); + fixedPropertyMap.put(TAIL_POSITION, totalLength - fixedLength + maxFixedPosition); + return fixedPropertyMap; + } + + //** 获取业务内容的byteBuf + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer) { + //计算固定长度 + Integer fixedLength = calculateLength(protocolFieldConfigs); + //总长度获取 + String lightText = buffer.toString(Charset.forName("ISO-8859-1")); + Integer totalLength = lightText.length(); + //计算固定长度最大长度 + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + //计算数据报文内容 + ByteBuf bizDataFields = buffer.slice(maxFixedPosition - 1, (totalLength - fixedLength)); + return bizDataFields; + } + + /** + * 获取过滤字段的长度 + */ + @Override + public Integer getTotalFilterLength(ProtocolConfig protocolConfig, + ByteBuf byteBuf, + Map protocolFieldConfigMap) { + if (ByteBufUtil.hexDump(byteBuf).equals("")) { + return 0; + } + int totalFilterLength = 0; + String filterFields = protocolConfig.getTotalLengthFilterFields(); + try { + if (!StringUtils.isEmpty(filterFields)) { + String[] filterFieldList = filterFields.split(","); + for (String filterFieldId : filterFieldList) { + if (StringUtils.isNotEmpty(filterFieldId)) { + ProtocolFieldConfig fieldConfig = protocolFieldConfigMap.get(Long.valueOf(filterFieldId)); + //这里都是按字节计算,没有对位进行区分,可能会出现错误 + // 如果对位有需求,需要进一步跟进 + totalFilterLength += fieldConfig.getOffsetLength(); + } + } + } + return totalFilterLength; + } catch (Exception ex) { + log.error("报文确认分发阶段,获取报文总长度过滤长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); + } + return totalFilterLength; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java new file mode 100644 index 0000000..d51e887 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java @@ -0,0 +1,169 @@ +package com.casic.missiles.parser.resolver.fields; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.parser.resolver.ByteMergeProvider; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.AbstractFieldConfig; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.pojo.ByteResolverParam; +import io.netty.buffer.ByteBuf; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * 字段解析管理总类 + */ +@Slf4j +public class FieldResolver extends ByteMergeProvider { + + //1、字段截取 => 2、简单的字节解析和复杂的字节解析 + public static Object parseField(ByteBuf byteBuf,AbstractFieldConfig fieldConfig, Integer maxFixedPosition) { + Integer orignPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + //最大固定位置不为空, + if (!ObjectUtil.isEmpty(maxFixedPosition)) { + orignPosition -= maxFixedPosition; + } + Object fieldValue = 0; + //待优化 + if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { + fieldValue = doParseBitField(byteBuf, fieldConfig); + } else { + ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); + fieldValue = doParseByteField(fieldBytes, fieldConfig.getRuleJson()); + } + return fieldValue; + } + + //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, + //目前默认配置的规则设置暂不支持配置化,由实现完成 + private static Object doParseByteField(ByteBuf byteBuf, String ruleJson) { + Object fieldsResolveValue = null; + List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); + if (ObjectUtil.isEmpty(ruleMapList)) { + fieldsResolveValue = defaultResolveBuilder(byteBuf); + } else { + fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); + } + return fieldsResolveValue; + } + + private static Object defaultResolveBuilder(ByteBuf byteBuf) { + Integer defaultResolveValue = 0; + for (int i = 0; i < byteBuf.writerIndex(); i++) { + defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; + } + return defaultResolveValue; + } + + //字段解析构建器(针对字节单位的) + //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 + // 字节归并结束或者规则结束=>继续根据规则进行判断 + private static Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { + Object customizeResolveValue = null; + try { + List bytStrList = new ArrayList<>(); + //存放到数组里面 + for (int i = 0; i < byteBuf.writerIndex(); i++) { + bytStrList.add(byteBuf.readByte()); + } + int i = 0; + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { + if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + customizeResolveValue = resolveByteMerge(bytStrList, ruletypeId, vaildRange); + break; + } else { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + List tempBytStr = new ArrayList<>(); + for (int k = 0; i < bytStrList.size(); i++) { + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(k) + .value(bytStrList.get(k)) + .ruletypeId(ruletypeId).build(); + tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); + } + bytStrList = tempBytStr; + } + i++; + } + //字节归并到一起=>继续根据规则进行判断 + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(null) + .value(customizeResolveValue) + .ruletypeId(ruletypeId).build(); + customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); + i++; + } + System.out.println(JSON.toJSON(customizeResolveValue)); + return customizeResolveValue; + } catch (RuntimeException ex) { + log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); + return null; + } + } + + /** + * 1、单个字节情况表示字段 + * 2、多字节情况表示字段(暂未处理) + */ + private static Object doParseBitField(ByteBuf byteBuf,AbstractFieldConfig fieldConfig) { + Object fieldValue = new Object(); + try { + Integer orignPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + byte fields = 0x00; + if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { + fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); + } else { + fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); + } + + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { + if (!StringUtils.isEmpty(fieldConfig.getOriginPositionBit())) { + fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getOriginPositionBit())).byteValue() + >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); + } else { + fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); + } + } else { + fieldValue = Integer.valueOf(fields & 0xff); + } + if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { + return fieldValue; + } + List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); + int i = 0; + //字节归并到一起=>继续根据规则进行判断 + while (i < ruleMapList.size()) { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(null) + .value(fieldValue) + .ruletypeId(ruletypeId).build(); + fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); + i++; + } + System.out.println(JSON.toJSON(fieldValue)); + return fieldValue; + } catch (RuntimeException ex) { + log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); + return null; + } + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java deleted file mode 100644 index 35ae3d0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java +++ /dev/null @@ -1,183 +0,0 @@ -package com.casic.missiles.parser.resolver.fields; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufAllocator; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; -import org.springframework.util.ObjectUtils; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service("standard") -@AllArgsConstructor -@Slf4j -public class StandardFieldParser implements FieldParser { - - private final FieldConfigDao fieldConfigDao; - private final FieldResolver fieldResolver; - - //数据解析 - @Override - public Map dataParser(RuleConfig ruleConfig, String lightText, String protocolId) { - String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); - ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); - bufferContent.writeBytes(lightText.getBytes(Charset.forName("ISO-8859-1"))); - Map dataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - for (String dataFieldId : dataFieldIds) { - FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(dataFieldId); - if (!ObjectUtils.isEmpty(fieldConfig)) { - dataMap.put(fieldConfig.getFieldName(), String.valueOf(fieldResolver.filedParserManger(bufferContent, fieldConfig, maxFixedPosition))); - } - } - return dataMap; - } - - //数据解析 - @Override - public Map fixDataParser(String protocolId, ByteBuf buffer) { - List dataFieldIdList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Map dataMap = new HashMap<>(); - for (FieldConfig dataField : dataFieldIdList) { - if (!ObjectUtils.isEmpty(dataField.getOrignPosition())) { - Object fieldValue = (Integer) fieldResolver.filedParserManger(buffer, dataField, null); - dataMap.put(dataField.getFieldName(), fieldValue); - } - } - return dataMap; - } - - @Override - public Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf) { - if (ByteBufUtil.hexDump(byteBuf).equals("")) { - return 0; - } - String filterFields = protocolConfig.getTotalLengthFilterField(); - Integer totalLength = 0; - try { - FieldConfig totalFieldConfig = fieldConfigDao.getFieldConfigById(protocolConfig.getTotalLengthId()); - int totalFilterLength = 0; - if (!StringUtils.isEmpty(filterFields)) { - String[] filterFieldList = filterFields.split(","); - for (String filterField : filterFieldList) { - FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(filterField); - //这里都是按字节计算,没有对位进行区分,可能会出现错误 - - // 如果对位有需求,需要进一步跟进 - totalFilterLength += fieldConfig.getOffsetLength(); - } - } - totalLength = (Integer) fieldResolver.filedParserManger(byteBuf, totalFieldConfig, null) + totalFilterLength; - } catch (Exception ex) { - log.error("报文确认分发阶段,获取报文总长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); - } - return totalLength; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer) { - //业务内容 - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - String protocolId = String.valueOf(protocolConfig.getId()); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - //计算固定长度 - Integer fixedLength = calculateLength(fieldConfigList); -// Integer totalLength = this.getTotalLength(protocolConfig, buffer); - //总长度获取 - Integer totalLength = lightText.length(); - //计算固定长度最大长度 - Integer maxFixedPosition = calculatePosition(fieldConfigList); -// buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - //计算数据报文内容 - ByteBuf bizDataFields = buffer.slice(maxFixedPosition-1, (totalLength - fixedLength)); - return bizDataFields; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer) { - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - String protocolId = String.valueOf(protocolConfig.getId()); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer fixedLength = calculateLength(fieldConfigList); -// Integer totalLength = this.getTotalLength(protocolConfig, buffer); - Integer totalLength = lightText.length(); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - ByteBuf fixDataFields = buffer.slice(0, maxFixedPosition); - return fixDataFields; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer) { - String protocolId = String.valueOf(protocolConfig.getId()); - Map fixedPropertyMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer fixedLength = calculateLength(fieldConfigList); - Integer totalLength = this.getTotalLength(protocolConfig, buffer); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - fixedPropertyMap.put("fixedPosition", maxFixedPosition); - fixedPropertyMap.put("totalLength", totalLength); - fixedPropertyMap.put("tailPosition", totalLength - fixedLength + maxFixedPosition); - return fixedPropertyMap; - } - - //分别计算bit和byte长度=> 合并长度 - private Integer calculateLength(List fieldConfigList) { - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (FieldConfig fieldConfig : fieldConfigList) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - Integer fixedLength = bytefixedLength + bitfixedLength / 8; - return fixedLength; - } - - //找到最大值=> 根据最大值计算业务数据下标 - private Integer calculatePosition(List fieldConfigList) { - String rex = "[0-9]+"; - Integer max = -1; - for (FieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOrignPosition()) - && Integer.valueOf(fieldConfig.getOrignPosition()) > max) { - max = Integer.valueOf(fieldConfig.getOrignPosition()); - } - } - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (FieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOrignPosition()) && fieldConfig.getOrignPosition().equals(max)) { - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - } - } - Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; - return maxFixedPosition; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java new file mode 100644 index 0000000..d4ec6c7 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java @@ -0,0 +1,76 @@ +package com.casic.missiles.parser.rule; + +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import org.apache.commons.lang3.StringUtils; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class GenericRuleResolver { + + //根据前置字段的值,找到指定的规则 + //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 + //=>循环判断=>通过规则得到业务字段 + public static RuleConfig machRule(Map fixDataMap, + String ids, + List protocolFieldConfigs, + List ruleConfigs) { + List preRuleConfigList = getPreRuleList(ids, protocolFieldConfigs); + //获取前置规则字段 + final Map metaDataMap = getPreRuleFields(preRuleConfigList, fixDataMap); + //准备固定的字段集合 + Map fixDataFieldMap = getFixDataFieldMap(protocolFieldConfigs); + return RuleResolverCore.doMachRule(ruleConfigs, metaDataMap, fixDataMap, fixDataFieldMap); + } + + private static Map getFixDataFieldMap(List protocolFieldConfigs) { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, ProtocolFieldConfig::getFieldName) + ); + return fixDataFieldMap; + } + + + /** + * 查询前置规则的字段配置 + * + * @param ids + * @return + */ + private static List getPreRuleList(String ids, List protocolFieldConfigs) { + String[] idList = ids.split(","); + Map prepareMaps = new HashMap<>(); + for (String id : idList) { + if (StringUtils.isNotEmpty(id)) { + prepareMaps.put(Long.valueOf(id), ""); + } + } + List preRuleConfigList = protocolFieldConfigs + .stream() + .filter(e -> prepareMaps.containsKey(e.getId())) + .collect(Collectors.toList()); + return preRuleConfigList; + } + + /** + * 获取前置规则解析字段 + */ + private static Map getPreRuleFields(List preRuleFieldConfigList, Map fixDataMap) { + Map ruleFieldMap = new HashMap<>(); + preRuleFieldConfigList.stream() + .forEach( + preRuleFieldConfig -> { + String fieldName = preRuleFieldConfig.getFieldName(); + if (fixDataMap.containsKey(fieldName)) { + ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); + } + } + ); + return ruleFieldMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java new file mode 100644 index 0000000..baae7e8 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -0,0 +1,68 @@ +package com.casic.missiles.parser.rule; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.casic.missiles.pojo.RuleConfig; + +import java.util.*; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleResolverCore { + + + public static RuleConfig doMachRule(List ruleConfigList, Map metaDataMap, + Map fixDataMap, + Map fixDataFieldMap) { + Optional ruleConfigOptional = ruleConfigList.stream() + .filter(ruleConfig -> machRuleConfig( + JSON.parseObject(ruleConfig.getMatchRuleJson(), Map.class), metaDataMap)) + .findFirst(); + if (ObjectUtil.isEmpty(ruleConfigOptional)) { + return null; + } + String[] ruleFields = ruleConfigOptional.get().getDataFieldIds().split(","); + Map ruleMetaDataMap = getRuleFields(ruleFields, fixDataMap, fixDataFieldMap); + //递归选定解析规则,进行规则解析 + if (!ruleConfigOptional.get().getIsFinishMatch().equals("1")) { + //递归选定规则 + doMachRule(ruleConfigList, ruleMetaDataMap, fixDataMap, fixDataFieldMap); + } + return ruleConfigOptional.get(); + } + + + private static Map getRuleFields(String[] preRuleConfigList, Map fixedDataMap, + Map fixedFieldMap) { + Map ruleFieldMap = new HashMap<>(); + for (String preRuleConfigId : preRuleConfigList) { + String fieldName = fixedFieldMap.get(preRuleConfigId); + if (fixedDataMap.containsKey(fieldName)) { + ruleFieldMap.put(fieldName, String.valueOf(fixedDataMap.get(fieldName))); + } + } + return ruleFieldMap; + } + + + //匹配规则配置 + private static Boolean machRuleConfig(Map ruleMap, Map metaDataMap) { + if (ruleMap == null || metaDataMap == null) { + return null; + } + //所有的字段在规则里面必须有有配置 + for (String key : metaDataMap.keySet()) { + if (ruleMap.containsKey(key)) { + if (!ruleMap.get(key).equals(metaDataMap.get(key))) { + return false; + } + } else { + return false; + } + } + return true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java deleted file mode 100644 index 664088d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java +++ /dev/null @@ -1,92 +0,0 @@ -package com.casic.missiles.parser.rule; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.mapper.dao.PreRuleConfigDao; -import com.casic.missiles.mapper.dao.RuleConfigDao; -import lombok.AllArgsConstructor; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.*; -import java.util.stream.Collectors; - -@Service -@AllArgsConstructor -public class RulerProvider { - - private final FieldConfigDao fieldConfigDao; - private final PreRuleConfigDao preRuleConfigDao; - private final RuleConfigDao ruleConfigDao; - - //根据前置字段的值,找到指定的规则 - //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 - //=>循环判断=>通过规则得到业务字段 - public RuleConfig ruleConfig(Map fixDataMap, String protocolId) { - //批量获取规则 - List preRuleConfigList = preRuleConfigDao.getPreRuleList(protocolId); - //获取固定字段 - Map fixFieldMap = getAllFieldMap(protocolId); - //获取前置规则字段 - final String preRuleFields = getPreRuleFields(preRuleConfigList, fixDataMap, fixFieldMap); - List ruleConfigList = ruleConfigDao.getRuleConfigById(protocolId); - Optional ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig ->preRuleFields.equals( ruleConfig.getParseRuleJson())).findFirst(); - //递归选定解析规则,进行规则解析 - while (!ObjectUtil.isEmpty(ruleConfigOptional) && !ruleConfigOptional.get().getIsBizField().equals("1")) { - String ruleFields = getRuleFields(ruleConfigOptional.get().getDataFieldIds().split(","), fixDataMap, fixFieldMap); - ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig -> ruleConfig.getParseRuleJson().equals(ruleFields)).findFirst(); - } - return ruleConfigOptional.get(); - } - - /** - * 获取前置规则解析字段 - */ - private String getPreRuleFields(List preRuleConfigList, Map fixDataMap, Map fixFieldMap) { - Map ruleFieldMap= new HashMap<>(); - preRuleConfigList.stream() - .forEach( - preRuleConfig -> { - String fieldName = fixFieldMap.get(Long.valueOf(preRuleConfig.getRuleFieldId())); - if (fixDataMap.containsKey(fieldName)) { - ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); - } - } - ); - return JSONObject.toJSONString(ruleFieldMap); - } - - private Map getAllFieldMap(String protocolId) { - List fieldList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Map fixFieldMap = fieldList.stream().collect( - Collectors.toMap(FieldConfig::getId, FieldConfig::getFieldName) - ); - return fixFieldMap; - } - - private String getRuleFields(String[] preRuleConfigList, Map fixDataMap, Map fixFieldMap) { - Map ruleFieldMap= new HashMap<>(); - for (String preRuleConfigId : preRuleConfigList) { - String fieldName = fixFieldMap.get(preRuleConfigId); - if (fixDataMap.containsKey(fieldName)) { - ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); - } - } - return JSONObject.toJSONString(ruleFieldMap); - } - - //弃置 - private String ListToString(List ruleFieldList) { - String ruleFields = ""; - for (String ruleField : ruleFieldList) { - ruleFields += ruleField + ","; - } - ruleFields = StringUtils.isEmpty(ruleFields) ? ruleFields : ruleFields.substring(0, ruleFields.length() - 1); - return ruleFields; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java index 6177e10..bfa87a5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java @@ -2,7 +2,7 @@ public interface SafeStrategy { - String decryption(byte[] bytes); + String decryption(String cipher); String encryption(String lightText); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java index 618716c..6236302 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java @@ -9,9 +9,9 @@ //十六进制的字符串转换成字节数组 byte[] bytes = hexStrToBinaryStr(msg); //计算CRC8 - byte crc8 = CRC8(bytes, 0, bytes.length); - String crc8ToStr = "" + Integer.toHexString(0xff & crc8); - return crc8ToStr; +// String crc8ToStr = "" + Integer.toHexString(0xff & crc8); +// return crc8ToStr; + return null; } /** @@ -33,50 +33,5 @@ return bytes; } - /** - * CRC8 校验 多项式 x8+x2+x+1 - * - * @param b - * @param off - * @param len - * @return - */ - public static byte CRC8(final byte[] b, final int off, final int len) { - byte result = 0x00; - for (int i = 0; i < len; i++) { - result = CHECKSUM_TABLE[(result ^ (b[i + off] & 0xFF)) & 0xFF]; - } - return (byte) (result & 0xFFL); - } - - private final static byte[] CHECKSUM_TABLE = {(byte) 0x00, (byte) 0x07, (byte) 0x0e, (byte) 0x09, (byte) 0x1c, (byte) 0x1b, - (byte) 0x12, (byte) 0x15, (byte) 0x38, (byte) 0x3f, (byte) 0x36, (byte) 0x31, (byte) 0x24, (byte) 0x23, (byte) 0x2a, - (byte) 0x2d, (byte) 0x70, (byte) 0x77, (byte) 0x7e, (byte) 0x79, (byte) 0x6c, (byte) 0x6b, (byte) 0x62, (byte) 0x65, - (byte) 0x48, (byte) 0x4f, (byte) 0x46, (byte) 0x41, (byte) 0x54, (byte) 0x53, (byte) 0x5a, (byte) 0x5d, (byte) 0xe0, - (byte) 0xe7, (byte) 0xee, (byte) 0xe9, (byte) 0xfc, (byte) 0xfb, (byte) 0xf2, (byte) 0xf5, (byte) 0xd8, (byte) 0xdf, - (byte) 0xd6, (byte) 0xd1, (byte) 0xc4, (byte) 0xc3, (byte) 0xca, (byte) 0xcd, (byte) 0x90, (byte) 0x97, (byte) 0x9e, - (byte) 0x99, (byte) 0x8c, (byte) 0x8b, (byte) 0x82, (byte) 0x85, (byte) 0xa8, (byte) 0xaf, (byte) 0xa6, (byte) 0xa1, - (byte) 0xb4, (byte) 0xb3, (byte) 0xba, (byte) 0xbd, (byte) 0xc7, (byte) 0xc0, (byte) 0xc9, (byte) 0xce, (byte) 0xdb, - (byte) 0xdc, (byte) 0xd5, (byte) 0xd2, (byte) 0xff, (byte) 0xf8, (byte) 0xf1, (byte) 0xf6, (byte) 0xe3, (byte) 0xe4, - (byte) 0xed, (byte) 0xea, (byte) 0xb7, (byte) 0xb0, (byte) 0xb9, (byte) 0xbe, (byte) 0xab, (byte) 0xac, (byte) 0xa5, - (byte) 0xa2, (byte) 0x8f, (byte) 0x88, (byte) 0x81, (byte) 0x86, (byte) 0x93, (byte) 0x94, (byte) 0x9d, (byte) 0x9a, - (byte) 0x27, (byte) 0x20, (byte) 0x29, (byte) 0x2e, (byte) 0x3b, (byte) 0x3c, (byte) 0x35, (byte) 0x32, (byte) 0x1f, - (byte) 0x18, (byte) 0x11, (byte) 0x16, (byte) 0x03, (byte) 0x04, (byte) 0x0d, (byte) 0x0a, (byte) 0x57, (byte) 0x50, - (byte) 0x59, (byte) 0x5e, (byte) 0x4b, (byte) 0x4c, (byte) 0x45, (byte) 0x42, (byte) 0x6f, (byte) 0x68, (byte) 0x61, - (byte) 0x66, (byte) 0x73, (byte) 0x74, (byte) 0x7d, (byte) 0x7a, (byte) 0x89, (byte) 0x8e, (byte) 0x87, (byte) 0x80, - (byte) 0x95, (byte) 0x92, (byte) 0x9b, (byte) 0x9c, (byte) 0xb1, (byte) 0xb6, (byte) 0xbf, (byte) 0xb8, (byte) 0xad, - (byte) 0xaa, (byte) 0xa3, (byte) 0xa4, (byte) 0xf9, (byte) 0xfe, (byte) 0xf7, (byte) 0xf0, (byte) 0xe5, (byte) 0xe2, - (byte) 0xeb, (byte) 0xec, (byte) 0xc1, (byte) 0xc6, (byte) 0xcf, (byte) 0xc8, (byte) 0xdd, (byte) 0xda, (byte) 0xd3, - (byte) 0xd4, (byte) 0x69, (byte) 0x6e, (byte) 0x67, (byte) 0x60, (byte) 0x75, (byte) 0x72, (byte) 0x7b, (byte) 0x7c, - (byte) 0x51, (byte) 0x56, (byte) 0x5f, (byte) 0x58, (byte) 0x4d, (byte) 0x4a, (byte) 0x43, (byte) 0x44, (byte) 0x19, - (byte) 0x1e, (byte) 0x17, (byte) 0x10, (byte) 0x05, (byte) 0x02, (byte) 0x0b, (byte) 0x0c, (byte) 0x21, (byte) 0x26, - (byte) 0x2f, (byte) 0x28, (byte) 0x3d, (byte) 0x3a, (byte) 0x33, (byte) 0x34, (byte) 0x4e, (byte) 0x49, (byte) 0x40, - (byte) 0x47, (byte) 0x52, (byte) 0x55, (byte) 0x5c, (byte) 0x5b, (byte) 0x76, (byte) 0x71, (byte) 0x78, (byte) 0x7f, - (byte) 0x6a, (byte) 0x6d, (byte) 0x64, (byte) 0x63, (byte) 0x3e, (byte) 0x39, (byte) 0x30, (byte) 0x37, (byte) 0x22, - (byte) 0x25, (byte) 0x2c, (byte) 0x2b, (byte) 0x06, (byte) 0x01, (byte) 0x08, (byte) 0x0f, (byte) 0x1a, (byte) 0x1d, - (byte) 0x14, (byte) 0x13, (byte) 0xae, (byte) 0xa9, (byte) 0xa0, (byte) 0xa7, (byte) 0xb2, (byte) 0xb5, (byte) 0xbc, - (byte) 0xbb, (byte) 0x96, (byte) 0x91, (byte) 0x98, (byte) 0x9f, (byte) 0x8a, (byte) 0x8d, (byte) 0x84, (byte) 0x83, - (byte) 0xde, (byte) 0xd9, (byte) 0xd0, (byte) 0xd7, (byte) 0xc2, (byte) 0xc5, (byte) 0xcc, (byte) 0xcb, (byte) 0xe6, - (byte) 0xe1, (byte) 0xe8, (byte) 0xef, (byte) 0xfa, (byte) 0xfd, (byte) 0xf4, (byte) 0xf3}; } \ No newline at end of file diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java index 27c2838..6e078a3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java @@ -1,9 +1,6 @@ package com.casic.missiles.parser.safe.impl; -import cn.hutool.core.util.CharsetUtil; -import cn.hutool.crypto.symmetric.SM4; -import cn.hutool.crypto.symmetric.SymmetricCrypto; - +import com.casic.missiles.parser.safe.SafeStrategy; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; @@ -11,19 +8,44 @@ import org.bouncycastle.crypto.engines.SM4Engine; import org.bouncycastle.crypto.params.KeyParameter; import org.bouncycastle.util.encoders.Hex; - -import static cn.hutool.crypto.Mode.ECB; -import static cn.hutool.crypto.Padding.NoPadding; +import org.springframework.stereotype.Component; /** * SM4算法工具类 */ @Slf4j -public class Sm4 { +@Component("sm4") +public class Sm4 implements SafeStrategy { //加解密的字节快大小 public static final int BlockSize = 16; + @Override + public String decryption(String cipher) { + byte[] keyByte = { + 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 + }; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(keyByte); + byte[] in = Hex.decode(cipher); + byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); + String plain = EcbDecrypt(in, keyBytes); + return plain; + } + + @Override + public String encryption(String cipher) { + byte[] keyByte = { + 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 + }; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(keyByte); + byte[] in = Hex.decode(cipher); + byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); + String plain = EcbDecrypt(in, keyBytes); + return plain; + } + /** * SM4ECB加密算法,对内 * @@ -32,8 +54,6 @@ * @return */ private static byte[] ecb_encrypt(byte[] in, byte[] keyBytes) { - - SM4Engine sm4Engine = new SM4Engine(); sm4Engine.init(true, new KeyParameter(keyBytes)); byte[] out = new byte[in.length]; @@ -58,27 +78,6 @@ return cipher; } - - /** - * hutool 解密SM4 - * - * @param encodeContent - * @return - */ - public static String decode(String encodeContent) { - String key = "24ad182507479a5da3ad94d9d78ea203"; - try { - SymmetricCrypto sm4 = new SM4(ECB, NoPadding, key.getBytes()); - String decryptStr = sm4.decryptStr(encodeContent, CharsetUtil.CHARSET_UTF_8); - return decryptStr; - } catch (Exception e) { - e.printStackTrace(); - log.error("SM4解密失败"); - } - return null; - } - - /** * SM4的ECB加密算法 * @@ -129,20 +128,6 @@ return plain; } - /** - * SM4的ECB解密算法 - * - * @param cipher 输入的密文字符串 - * @param key 密钥 - * @return - */ - public static String EcbDecrypt(String cipher, String key) { - byte[] in = Hex.decode(cipher); - byte[] keyBytes = Hex.decode(key); - - String plain = EcbDecrypt(in, keyBytes); - return plain; - } /** * 主函数 @@ -151,28 +136,24 @@ */ public static void main(String[] args) { byte[] ciphertext = { + 0x4B, (byte) 0x8C, (byte) 0x9D, 0x08, (byte) 0xE4, (byte) 0xD3, 0x64, 0x42, (byte) 0xB9, (byte) 0xA5, (byte) 0xFE, (byte) 0xCD, (byte) 0x91, 0x1B, 0x38, (byte) 0xAC, (byte) 0xE9, 0x1C, (byte) 0xCD, 0x53, 0x02, (byte) 0xD7, 0x0C, (byte) 0x9B, (byte) 0x96, 0x30, 0x62, (byte) 0xE8, (byte) 0xFB, (byte) 0xEF, (byte) 0xB9, (byte) 0xFF, (byte) 0xDE, 0x19, (byte) 0x80, 0x35, 0x3E, (byte) 0x90, 0x4F, 0x2F, 0x12, 0x2B, 0x19, (byte) 0x8B, 0x6C, 0x7A, (byte) 0x85, (byte) 0xA1, (byte) 0xB1, (byte) 0x86, (byte) 0xA3, 0x7A, 0x46, 0x0C, 0x2F, (byte) 0x94, 0x4F, 0x7F, 0x2C, 0x56, 0x14, (byte) 0xF3, (byte) 0x89, (byte) 0xC3, - 0x3F, 0x20, (byte) 0xF9, (byte) 0x87, (byte) 0xA1, 0x60, (byte) 0xD9, (byte) 0xA8, (byte) 0xFD, (byte) 0xD7, (byte) 0x9B, 0x4B, 0x26, 0x06, 0x30, 0x44}; + 0x3F, 0x20, (byte) 0xF9, (byte) 0x87, (byte) 0xA1, 0x60, (byte) 0xD9, (byte) 0xA8, (byte) 0xFD, (byte) 0xD7, (byte) 0x9B, 0x4B, 0x26, 0x06, 0x30, 0x44 + }; ByteBuf in = ByteBufAllocator.DEFAULT.heapBuffer(); in.writeBytes(ciphertext); - byte[] keyByte = { 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 }; ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); - key.writeBytes(ciphertext); - String resCipherData = decode(ByteBufUtil.hexDump(in)); - ByteBuf out = ByteBufAllocator.DEFAULT.heapBuffer(); -// out.writeBytes(resCipherData); -// System.out.println(hexBytes); - System.out.println(resCipherData.toString()); -// String resPlainData = EcbDecrypt(resCipherData, key); -// System.out.println("原始明文:" + data); -// System.out.println("解密后明文:" + resPlainData); + key.writeBytes(keyByte); +// String resCipherData = EcbDecrypt(ByteBufUtil.hexDump(in), ByteBufUtil.hexDump(key)); +// System.out.println(resCipherData); } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java index 1395a51..ac5f957 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java @@ -1,7 +1,7 @@ package com.casic.missiles.parser.safe.impl; import io.netty.buffer.ByteBufUtil; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** *

@@ -14,9 +14,8 @@ * @author hyl * @version v1.0: Tea.java, v 0.1 2021/3/12 13:48 $ */ -@Service("tea") -///tea算法类 - +//tea算法类 +@Component("tea") public class Tea { public static byte[] MyTea_Encrypt(byte[] MyTeaContent, int ByteLen, byte[] MyTeakey) { @@ -99,7 +98,6 @@ // for(int i32Index = 0; i32Index < 8; i32Index++) { // System.out.print("0x" + Integer.toHexString(MyContent[i32Index]) + " "); // } - // System.out.println("密钥为:"); // for(int i32Index = 0; i32Index < 16; i32Index++) { // System.out.print("0x" + Integer.toHexString(MyKeys[i32Index]) + " "); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java index bdd0721..bd1516a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java @@ -3,7 +3,7 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.parser.sender.DataSubscribeProvider; import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponents; import org.springframework.web.util.UriComponentsBuilder; @@ -12,7 +12,7 @@ import java.util.Collections; import java.util.Map; -@Service("functionCallback") +@Component("functionCallback") public class FunctionCallback implements DataSubscribeProvider { @Resource diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java index 0b44fb9..7526de2 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.Map; -@Service("middleware") +@Component("middleware") public class MiddlewareSubscribe implements DataSubscribeProvider { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java index 5dcee3f..e2f1192 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.Map; -@Service("nosql") +@Component("nosql") public class NoSqlSubscribe implements DataSubscribeProvider { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java b/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java new file mode 100644 index 0000000..81a5324 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java @@ -0,0 +1,86 @@ +package com.casic.missiles.pojo; + +import lombok.Data; + +/** + * 协议 + */ +@Data +public class Msg { + + /** + * 前导码 + */ + private String preamble; + + /** + * 版本号 + */ + private String version; + + /** + * 内容长度 + */ + private int leng; + + /** + * 设备ID + */ + private String deviceId; + + /** + * 通讯方式 + */ + private Integer connType; + + /** + * 加密方式 + */ + private Integer encryType; + + /** + * 目标地址 + */ + private String destAddr; + + /** + * PDUType + */ + private String PDUType; + + /** + * 操作类型 + */ + private Integer operateType; + + /** + * 传输控制位 PDUType.bit7=0时,表示存在后续的访问;当PDUType.bit7=1时,表示无后续的访问。 + */ + private Integer transControlFlag; + + /** + * 设备类型 + */ + private Integer deviceType; + + /** + * 序号 + */ + private Integer seq; + + /** + * tagList + */ + private String tagList; + + /** + * OidList + */ + private String OidList; + + /** + * CRC + */ + private String CRC; + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java index 40a5265..97cc984 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java @@ -40,7 +40,7 @@ String httpContent = msg.toString(Charset.defaultCharset()); log.info(" String : " + msg.toString(Charset.defaultCharset())); String majorContent = httpContent.substring(httpContent.indexOf("{"), httpContent.lastIndexOf("}") + 1); - String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("serviceData")).get("Value")); + String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("RegistryData")).get("Value")); log.info("----------------------------------" + values); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); bufferContent.writeBytes(values.getBytes(Charset.forName("ISO-8859-1"))); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java index 1b132a7..e3ced4b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java @@ -35,7 +35,7 @@ String httpContent = msg.toString(Charset.defaultCharset()); log.info(" String : " + msg.toString(Charset.defaultCharset())); String majorContent = httpContent.substring(httpContent.indexOf("{"), httpContent.lastIndexOf("}") + 1); - String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("serviceData")).get("Value")); + String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("RegistryData")).get("Value")); log.info("----------------------------------" + values); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); bufferContent.writeBytes(values.getBytes(Charset.forName("ISO-8859-1"))); diff --git a/sensorhub-core/src/main/resources/application.properties b/sensorhub-core/src/main/resources/application.properties deleted file mode 100644 index 8b13789..0000000 --- a/sensorhub-core/src/main/resources/application.properties +++ /dev/null @@ -1 +0,0 @@ - diff --git a/sensorhub-core/src/main/resources/config/application-dev.yml b/sensorhub-core/src/main/resources/config/application-dev.yml index 4f897a8..dcc4c2d 100644 --- a/sensorhub-core/src/main/resources/config/application-dev.yml +++ b/sensorhub-core/src/main/resources/config/application-dev.yml @@ -4,9 +4,9 @@ spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true + url: jdbc:mysql://127.0.0.1:3306/sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true username: root - password: Casic203 + password: root session: store-type: redis redis: diff --git a/sensorhub-core/src/main/resources/config/application.yml b/sensorhub-core/src/main/resources/config/application.yml index ae89f9d..7965da1 100644 --- a/sensorhub-core/src/main/resources/config/application.yml +++ b/sensorhub-core/src/main/resources/config/application.yml @@ -30,6 +30,13 @@ port: 6379 password: ew5T4K3#203lwh config-prefix: 'Casic:' +#代码生成器配置 +code: + generate: + #作者 + author: cz + #待生成对象表名 + table-name: bussiness_field_config,combined_field_config sensorhub: config: port: 7091 diff --git a/sensorhub-support/pom.xml b/sensorhub-support/pom.xml index 9a71296..761601c 100644 --- a/sensorhub-support/pom.xml +++ b/sensorhub-support/pom.xml @@ -42,6 +42,12 @@ ${redis.version} + + com.baomidou + mybatis-plus-generator + ${mybatis-plus-generator.version} + + org.reflections diff --git a/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java b/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java new file mode 100644 index 0000000..515ca53 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java @@ -0,0 +1,14 @@ +package com.casic.missiles.enums; + +/** + * @author + * @date + */ +public interface FixedPropertyEnum { + + String FIXED_POSITION = "fixedPosition"; + + String TOTAL_LENGTH = "totalLength"; + + String TAIL_POSITION = "tailPosition"; +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/CombinedFieldMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CombinedFieldMapper.java new file mode 100644 index 0000000..38e8f42 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CombinedFieldMapper.java @@ -0,0 +1,15 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.CombinedFieldConfig; +import org.apache.ibatis.annotations.Mapper; + +/** + * @author cz + * + */ +@Mapper +public interface CombinedFieldMapper extends BaseMapper { + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java new file mode 100644 index 0000000..128b09d --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java @@ -0,0 +1,10 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.CommandEventConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface CommandEventMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java new file mode 100644 index 0000000..042eb3c --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.DatagramEventConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface DatagramEventConfigMapper extends BaseMapper { +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java new file mode 100644 index 0000000..fc95cf4 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java @@ -0,0 +1,8 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.FieldConfig; + +public interface FieldConfigMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldRuleConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldRuleConfigMapper.java new file mode 100644 index 0000000..b310a08 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldRuleConfigMapper.java @@ -0,0 +1,10 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.FieldRuleConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface FieldRuleConfigMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java new file mode 100644 index 0000000..9060a69 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.ProtocolConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface ProtocolConfigMapper extends BaseMapper { +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolFieldConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolFieldConfigMapper.java new file mode 100644 index 0000000..1b47180 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolFieldConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +public interface ProtocolFieldConfigMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java new file mode 100644 index 0000000..6fa6936 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.RuleConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface RuleConfigMapper extends BaseMapper { +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/AbstractFieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/AbstractFieldConfig.java new file mode 100644 index 0000000..ba9aea2 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/AbstractFieldConfig.java @@ -0,0 +1,38 @@ +package com.casic.missiles.pojo; + +import lombok.Data; + +@Data +public class AbstractFieldConfig { + /** + * 字段名称 + */ + private String fieldName; + /** + * 按照字段评估进行字段解析 + */ + private String ruleJson; + /** + * 起始位置(单位byte) + */ + private Integer OriginPositionByte; + /** + * 起始位置,是否需要bit位置(单位bit)小于8, 没有不需要填写 + */ + private String OriginPositionBit; + /** + * 偏移长度 + */ + private Integer offsetLength; + /** + * 偏移单位(bit/byte) + */ + private String offsetUnit; + /** + * 是否需要转存 + */ + private Integer isStorage; + + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/CombinedFieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/CombinedFieldConfig.java new file mode 100644 index 0000000..4f4de6a --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/CombinedFieldConfig.java @@ -0,0 +1,41 @@ +package com.casic.missiles.pojo; + +import lombok.Data; + +import java.util.Date; + +/** + * 组合配置 + * + * @author cz + * @date 20 + */ +@Data +public class CombinedFieldConfig { + + private Long id; + private Long ruleId; + /** + * 前缀编码 + */ + private String prefixCode; + + /** + * 字段动态的id + */ + private Long dynamicLengthId; + /** + * 对应的要解析字段的ids + */ + private String dataFieldIds; + + /** + * 字段动态的id + */ + private String combinedFieldIds; + + private Date lastTime; + + private Date createTime; + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldConfig.java index a07d20d..8304dc6 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldConfig.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldConfig.java @@ -5,31 +5,28 @@ import java.util.Date; +/** + * @author cz + * 1、该表与实际解析的内容实例解析有关 + * 2、该表字段是随机出现的,和帧结构无关,无法预料的 + * 3、该表字段解析根据FieldEvaluatorConfig进行字段解析 + */ @Data -@TableName("field_config") -public class FieldConfig { +@TableName("business_field_config") +public class FieldConfig extends AbstractFieldConfig { private Long id; -// private String preFieldConfig; - private Long protocolId; - - private String isFixed; - private String uploadDeliveryChange; - - private String replyRule; - private String ruleJson; - + /** + * 协议配置id + */ + private Long ruleId; + /** + * 字段名称 + */ private String fieldName; - private String isStorage; - private Integer orignPosition; - private String exactOrignPosition; - - private Integer offsetLength; - private String offsetUnit; private String ownerId; private Date createTime; private Date lastTime; - } diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldRuleConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldRuleConfig.java new file mode 100644 index 0000000..2e09879 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldRuleConfig.java @@ -0,0 +1,20 @@ +package com.casic.missiles.pojo; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +@TableName("field_rule_config") +@Data +public class FieldRuleConfig { + + private Long id; + private String name; + private String desc; + private String condition; + private String excuteOperation; + private Date lasTime; + private Date createTime; + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/Msg.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/Msg.java deleted file mode 100644 index 81a5324..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/Msg.java +++ /dev/null @@ -1,86 +0,0 @@ -package com.casic.missiles.pojo; - -import lombok.Data; - -/** - * 协议 - */ -@Data -public class Msg { - - /** - * 前导码 - */ - private String preamble; - - /** - * 版本号 - */ - private String version; - - /** - * 内容长度 - */ - private int leng; - - /** - * 设备ID - */ - private String deviceId; - - /** - * 通讯方式 - */ - private Integer connType; - - /** - * 加密方式 - */ - private Integer encryType; - - /** - * 目标地址 - */ - private String destAddr; - - /** - * PDUType - */ - private String PDUType; - - /** - * 操作类型 - */ - private Integer operateType; - - /** - * 传输控制位 PDUType.bit7=0时,表示存在后续的访问;当PDUType.bit7=1时,表示无后续的访问。 - */ - private Integer transControlFlag; - - /** - * 设备类型 - */ - private Integer deviceType; - - /** - * 序号 - */ - private Integer seq; - - /** - * tagList - */ - private String tagList; - - /** - * OidList - */ - private String OidList; - - /** - * CRC - */ - private String CRC; - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/PreRuleConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/PreRuleConfig.java deleted file mode 100644 index bfcf914..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/PreRuleConfig.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.casic.missiles.pojo; - -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -import java.util.Date; - -@Data -@TableName("pre_rule_config") -public class PreRuleConfig { - - private Long id; - private String protocolId; - private String ruleFieldId; - private String ownerId; - private Date createTime; - private Date lastTime; -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolConfig.java index 274ad42..bdac11f 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolConfig.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolConfig.java @@ -5,18 +5,52 @@ import java.util.Date; +/** + * 协议配置表,协议配置与帧结构有关 + * 1、层级关系,协议之后是规则,规则对应设备类型的各种上数规则 + * 2、规则对应协议配置的实例流程 + * 3、每种可根据设备类型和操作类型进行上数规则进行区分 + */ @Data @TableName("protocol_config") public class ProtocolConfig { private Long id; + /** + * 前导码 + */ private String preFix; - private String unpackId; - private String totalLengthId; - private String totalLengthFilterField; + /** + * 拆包id + */ + private Long unpackId; + /** + * 总长度id + */ + private Long totalLengthId; + /** + * + */ + private String totalLengthFilterFields; + /** + * 动态长度ids + */ private String dynamicLengthId; + /** + * 动态长度json(预留字段) + */ private String dynamicLengthJson; - private String tailStr; + /** + * 规则字段所解析预准备的字段 + */ + private String rulePrepareFields; + /** + * 结尾标志 + */ + private Long tailStr; + /** + * 备注 + */ private String remark; private String ownerId; private Date createTime; diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolFieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolFieldConfig.java new file mode 100644 index 0000000..db794bd --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolFieldConfig.java @@ -0,0 +1,43 @@ +package com.casic.missiles.pojo; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +/** + * 协议字段配置表 + * 该表用户存放帧结构固定格式的字段 + * 有以下两个用途 + * (1)、固定格式的字段可用于规则匹配 + * (2)、固定格式的字段可用于报文回复 + * @author cz + * @date 2023-06-09 + */ +@Data +@TableName("protocol_field_config") +public class ProtocolFieldConfig extends AbstractFieldConfig{ + + private Long id; + /** + * 协议配置id + */ + private Long protocolId; + /** + * 上传下发是否有变化, 没有变化,可以直接组装 + */ + private String isReplyFix; + /** + * 按照字段评估进行字段解析 + */ + private Long fieldEvaluatorId; + /** + * 回复规则 + */ + private String replyRule; + + private String ownerId; + private Date createTime; + private Date lastTime; + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java index 3b53493..febf835 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java @@ -6,18 +6,40 @@ import java.util.Date; /** - * 加密字段解析和规则有关,事件调到该流程下面 + * @author cz + * todo: 匹配协议对应业务实例 + * 1、一个协议可以多种的流程规则 + * 2、规则可以支持递归规则流程 */ @Data @TableName("rule_config") public class RuleConfig { - private Long id; private String protocolId; - private String isBizField; - private String parseRuleJson; + /** + * 是否完成规则配置,没有完成, + * 则需要根据规则继续匹配 + */ + private String isFinishMatch; + /** + * 待匹配解析规则 + * {“data_field”:"data_value"} + */ + private String matchRuleJson; + /** + * 待解析字段ids + */ private String dataFieldIds; - private String aviatorFilterJson; + + /** + * 待解析组合字段ids + */ + private String combinedFieldIds; + + /** + * aviator + */ + private String conditionExpression; private Date createTime; private Date lastTime; } diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleDict.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleDict.java deleted file mode 100644 index cc7f389..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleDict.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.casic.missiles.pojo; - -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -@Data -@TableName("rule_dict") -public class RuleDict { - - private Long id; - private Long pid; - private String name; - private String code; - private String ownerId; - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleEvaluator.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleEvaluator.java deleted file mode 100644 index ed16610..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleEvaluator.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.pojo; - -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -import java.util.Date; - -@TableName("rule_evaluator") -@Data -public class RuleEvaluator { - - private Long id; - private String name; - private String desc; - private String condition; - private String excuteOperation; - private Date lasTime; - private Date createTime; - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/CombinedFieldConfigRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/CombinedFieldConfigRegistry.java new file mode 100644 index 0000000..fa59b90 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/CombinedFieldConfigRegistry.java @@ -0,0 +1,12 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.CombinedFieldConfig; + +import java.util.List; + +public interface CombinedFieldConfigRegistry { + + List getCombinedFieldConfigList(Long ruleId); + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/CommandEventRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/CommandEventRegistry.java new file mode 100644 index 0000000..fb97d87 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/CommandEventRegistry.java @@ -0,0 +1,8 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.CommandEventConfig; + +public interface CommandEventRegistry { + + CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName); +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/DatagramEventRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/DatagramEventRegistry.java new file mode 100644 index 0000000..fb34641 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/DatagramEventRegistry.java @@ -0,0 +1,11 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.DatagramEventConfig; + +import java.util.List; + +public interface DatagramEventRegistry{ + + List getDatagramEventList(Long ruleId); + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/FieldConfigRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/FieldConfigRegistry.java new file mode 100644 index 0000000..759642e --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/FieldConfigRegistry.java @@ -0,0 +1,20 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.FieldConfig; + +import java.util.List; + +public interface FieldConfigRegistry { + + + List getFieldConfigList(Long ruleId); + + FieldConfig getFieldConfigById(String fieldId); + + List getFieldConfigs(String protocolId, Integer isFixed); + + List getStorageFieldConfig(String protocolId); + + +} + diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/FieldRuleConfigRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/FieldRuleConfigRegistry.java new file mode 100644 index 0000000..33da70c --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/FieldRuleConfigRegistry.java @@ -0,0 +1,11 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.FieldRuleConfig; + +import java.util.List; + +public interface FieldRuleConfigRegistry { + + List getFieldRuleConfigList(Long ruleId); + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java index 608af3a..32cc8a4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java @@ -2,48 +2,47 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.delivery.decorator.ByteDecorator; +import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @AllArgsConstructor public class FieldDecoratorManger { - private final RuleDictDao ruleDictDao; + private final RuleConfigRegistry ruleDictDao; // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 // (1)静态的业务字段是字典里面可以配置的 // (2)动态的业务字段是通过规则生成的 public String contentMerge(String ruleJson, String sceneConent, String dynamicContent) { - List ruleDictList = ruleDictDao.getRuleDictConfig(); - Map ruleDictMap = ruleDictList.stream().collect( - Collectors.toMap(RuleDict::getId, e -> e)); - List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); - for (Map ruleMap : ruleMapList) { - String ruleType = String.valueOf(ruleMap.get("ruleType")); - ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); - NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); - byteDecorator.nodeDecoratorRule(nodeDecoratorParm); - } +// List ruleDictList = ruleDictDao.getRuleDictConfig(); +// Map ruleDictMap = ruleDictList.stream().collect( +// Collectors.toMap(RuleDict::getId, e -> e)); +// List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); +// for (Map ruleMap : ruleMapList) { +// String ruleType = String.valueOf(ruleMap.get("ruleType")); +// ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); +// NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); +// byteDecorator.nodeDecoratorRule(nodeDecoratorParm); +// } return null; } - - private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { - NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() - .contents(sceneConent) - .dynamicContent(dynamicContent) - .ruletypeId(ruletypeId) - .ruleDictMap(ruleDictMap) - .build(); - return nodeDecoratorParm; - } +// +// private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { +// NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() +// .contents(sceneConent) +// .dynamicContent(dynamicContent) +// .ruletypeId(ruletypeId) +// .ruleDictMap(ruleDictMap) +// .build(); +// return nodeDecoratorParm; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java index 652970c..b204ac3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java @@ -1,56 +1,56 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@AllArgsConstructor -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", - JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Component; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Component("logicalDecorator") +//@AllArgsConstructor +//@Slf4j +//public class LogicalShiftDecorator implements ByteDecorator { +// +//// private final FieldRuleEngineMapper fieldRuleEngineMapper; +//// +//// //字节位移 +//// @Override +//// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +//// String logicalValue = ""; +//// RuleEvaluator fieldRuleEngine = new RuleEvaluator(); +//// try { +//// Map env2 = new HashMap(); +//// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +//// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +//// for (String contentId : contentIdList) { +//// RuleDict ruleDict = ruleDictMap.get(contentId); +//// if (ruleDict.getCode().contains("#")) { +//// //使用动态的值 +//// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +//// } +//// env2.put(ruleDict.getName(), ruleDict.getCode()); +//// } +//// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +//// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +//// return null; +//// } +//// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +//// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +//// return values; +//// } catch (Exception ex) { +//// log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", +//// JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +//// return null; +//// } +//// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java index 346468f..822fead 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@AllArgsConstructor -@Slf4j -public class OperationDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("optionDecorator") +//@AllArgsConstructor +//@Slf4j +//public class OperationDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //混合运算,有常量或者乘除的缩放 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java index 50fb0a7..7a8bccb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@AllArgsConstructor -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +////精度计算 +//@AllArgsConstructor +//@Registry("precisionDecorator") +//@Slf4j +//public class PrecisionDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java index da39235..27f9cc7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java @@ -1,54 +1,53 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@AllArgsConstructor -@Slf4j -public class RuleDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("ruleDecorator") +//@AllArgsConstructor +//@Slf4j +//public class RuleDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //吃我一套正则表达式 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (Exception ex) { +// log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java index 7f5cbf3..c043f97 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java @@ -2,6 +2,6 @@ import java.util.Map; -public interface ComandeEventService { +public interface ComandeEventService{ Map loadComandeEventConfig(String protocolId,String scene); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java index 476ad84..aaf1837 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java @@ -2,46 +2,46 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.dao.CommandEventDao; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @Slf4j @AllArgsConstructor -public class ComandeEventServiceImpl implements ComandeEventService { +public class ComandeEventServiceImpl implements ComandeEventRegistry { - private final CommandEventDao commandEventDao; + // private final CommandEventDao commandEventDao; // 加密bean 固定字段出现变化的字段解析,业务字段的有序内容 @Override - public Map loadComandeEventConfig(String protocolId,String sceneName) { - CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); - if (ObjectUtil.isEmpty(commandEventConfig)) { - log.error("协议{},没有配置成功接收回复配置,清排查原因"); - return null; - } - String replyJson = commandEventConfig.getReplyContentJson(); - List> replyMapList = JSONArray.parseObject(replyJson, List.class); - List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); - Map fixMap = fixList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); - List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) - .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) - .collect(Collectors.toList()); - Map commandConfigMap = new HashMap<>(); - commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); - commandConfigMap.put("fixContent", fixMap); - commandConfigMap.put("bizContent", contentList); - return commandConfigMap; + public Map loadComandeEventConfig(String protocolId, String sceneName) { +// CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); +// if (ObjectUtil.isEmpty(commandEventConfig)) { +// log.error("协议{},没有配置成功接收回复配置,清排查原因"); +// return null; +// } +// String replyJson = commandEventConfig.getReplyContentJson(); +// List> replyMapList = JSONArray.parseObject(replyJson, List.class); +// List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); +// Map fixMap = fixList.stream() +// .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); +// List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) +// .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) +// .collect(Collectors.toList()); +// Map commandConfigMap = new HashMap<>(); +// commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); +// commandConfigMap.put("fixContent", fixMap); +// commandConfigMap.put("bizContent", contentList); +// return commandConfigMap; + return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 128b09d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java deleted file mode 100644 index 4016b0b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface DatagramEventMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java deleted file mode 100644 index 597c306..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.apache.ibatis.annotations.Mapper; - -public interface FieldConfigMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java deleted file mode 100644 index a31680a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.PreRuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface PreRuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java deleted file mode 100644 index 9060a69..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface ProtocolConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java deleted file mode 100644 index 6fa6936..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java deleted file mode 100644 index 582a705..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleDict; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleDictMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java deleted file mode 100644 index 6e302c8..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.CommandEventMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Optional; - -@Component -public class CommandEventDao { - - @Resource - private CommandEventMapper commandEventMapper; - - public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId) - .eq("scene", sceneName) - .eq("enabled", 1); - List commandEventConfig = commandEventMapper.selectList(queryWrapper); - Optional optionalEventConfig = commandEventConfig.stream().findFirst(); - return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java deleted file mode 100644 index 9137e4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.FieldConfigMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class FieldConfigDao { - - @Resource - private FieldConfigMapper fieldConfigMapper; - - public FieldConfig getFieldConfigById(String fieldId) { - FieldConfig fieldConfig = fieldConfigMapper.selectById(fieldId); - return fieldConfig; - } - - public List getFieldConfigs(String protocolId,Integer isFixed) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",isFixed); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - - public List getStorageFieldConfig(String protocolId) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",1) - .eq("is_storage",1); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java deleted file mode 100644 index 67bff6b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.mapper.PreRuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class PreRuleConfigDao { - - @Resource - private PreRuleConfigMapper preRuleConfigMapper; - - public List getPreRuleList(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return preRuleConfigMapper.selectList(queryWrapper); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java deleted file mode 100644 index d69ea85..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.RuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleConfigDao { - - @Resource - private RuleConfigMapper ruleConfigMapper; - - public RuleConfig getNextRuleConfig(String ruleFields) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("parse_rule_json", ruleFields); - return ruleConfigMapper.selectOne(queryWrapper); - } - - - public List getRuleConfigById(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return ruleConfigMapper.selectList(queryWrapper); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java deleted file mode 100644 index 932c185..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.RuleDictMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleDictDao { - - @Resource - private RuleDictMapper ruleDictMapper; - - public List getRuleDictConfig() { - List ruleDictList = ruleDictMapper.selectList(null); - return ruleDictList; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java index 9f9e279..43bc4d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java @@ -10,20 +10,15 @@ import io.netty.channel.socket.nio.NioServerSocketChannel; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import javax.annotation.PreDestroy; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static cn.hutool.core.util.ClassUtil.getClasses; /** * SensorhubServer netty服务端 */ @Slf4j -@Service +@Component public class SensorhubServer { /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java index 2c79ff5..9a28c36 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java @@ -11,13 +11,13 @@ import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioSocketChannel; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClient 客户端 */ @Slf4j -@Service +@Registry public final class SensorhubClient { public static void main(String[] args) throws Exception { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java index 9774be0..477c3f7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java @@ -6,12 +6,12 @@ import io.netty.channel.socket.SocketChannel; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientChannelInitialHandler */ -@Service +@Registry public class SensorhubClientChannelInitialHandler extends ChannelInitializer { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java index 346f4b3..73560e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java @@ -5,13 +5,13 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientHandler */ @Slf4j -@Service +@Registry public class SensorhubClientHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java index 5c1c6f2..d990af5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java @@ -4,12 +4,12 @@ import com.casic.missiles.pojo.Msg; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** * SensorhubServerHandler */ -@Service +@Component public class SensorhubServerHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 67283ae..af3172c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,41 +1,37 @@ package com.casic.missiles.parser; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultProtocolConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.*; +import com.casic.missiles.registry.FieldConfigRegistry; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; -import java.nio.charset.Charset; import java.util.HashMap; import java.util.List; import java.util.Map; -@Service("genericProtocolParser") +/** + * @author + */ +@Component("genericProtocolParser") @Slf4j -@AllArgsConstructor +@RequiredArgsConstructor public class GenericProtocolParser implements ProtocolParser { - private final LeadingCodeMatcher leadingCodeMatcher; private final List frameStructDispenserList; - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorInstanceSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; // 匹配首字母前导码=> 帧结构匹配前导码=> // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 @@ -44,18 +40,19 @@ public Boolean doParseProtocol(ByteBuf byteBuf) { String protocolContent = ByteBufUtil.hexDump(byteBuf); //匹配前导码 - List preCodeConfigs = leadingCodeMatcher.matchLeadingCode(protocolContent); + List preCodeConfigs = LeadingCodeMatcher.matchFrameLeadingCode(protocolContent); //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 if (preCodeConfigs.size() == 0) { - return rematch(byteBuf,protocolContent); + return rematch(byteBuf, protocolContent); } - //暂时先取第一个 + //暂时先取第一个,提升速度,使用享元模式, 减少类的创建销毁与构建 ProtocolConfig protocolConfig = preCodeConfigs.get(0); + AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); ByteBuf wholeDatagramByte = null; //通过匹配帧结构获取完整的数据包 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, preCodeConfigs.get(0))) != null) { + if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, protocolFactory)) != null) { break; } } @@ -68,76 +65,78 @@ * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 */ - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId, wholeDatagramByte); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap, protocolId); - //选取规则对应的流程实例 - DatagramEventConfig datagramEventConfig = processorInstanceSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); + //进行规则字段解析,进行匹配规则 + RuleConfig ruleConfig = getRuleConfig(protocolFactory, wholeDatagramByte); + if (ruleConfig == null) { + return false; + } //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, wholeDatagramByte); + ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte); + //以下进行业务的规则解析,同时选定流程实例 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); + DatagramEventProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain, + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText, protocolId); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain); //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); + datagramEventProvider.storeData(bizDataMap); return true; } - private Boolean rematch(ByteBuf byteBuf,String protocolContent) { + /** + * 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 + */ + private Boolean rematch(ByteBuf byteBuf, String protocolContent) { //重置位判断 byteBuf.resetReaderIndex(); //判断重置是否前移,如果没有前移,则直接判为匹配失败 if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { return false; } else { + //递归执行 return doParseProtocol(byteBuf); } } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; + //获取匹配规则->匹配规则 + private RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + //取出其中参与逻辑provider并判空 + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); + String rulePrepareFields = protocolConfig.getRulePrepareFields(); + //固定字段 + if (StringUtils.isNotEmpty(rulePrepareFields)) { + //获取统一固定字段解析 + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + //获取该协议的字段配置,用于协议规则匹配 + List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); + //获取规则 + RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, + rulePrepareFields, protocolFieldConfigs); + return ruleConfig; + } + return null; } - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + //数据构建,获取固定字段的store和业务字段store + private Map buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + Map bizDataMap = new HashMap<>(); + Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); + Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); + bizDataMap.putAll(ruleStoreObjectMap); + bizDataMap.putAll(protocolStoreObjectMap); return bizDataMap; } - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java index 8a46e32..16ce2e5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java @@ -3,6 +3,7 @@ import io.netty.buffer.ByteBuf; public interface ProtocolParser { + Boolean doParseProtocol(ByteBuf byteBuf); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java new file mode 100644 index 0000000..f7814af --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java @@ -0,0 +1,35 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.ProtocolConfigProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.ProtocolConfig; + +/** + * 存放基本协议的的加载信息 + */ +public class AbstractProtocolConfigFactory { + private final ProtocolConfigProvider protocolConfigProvider; + private final ProtocolFieldConfigProvider protocolFieldConfigProvider; + private final RuleConfigProvider ruleConfigProvider; + + public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { + this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); + this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); + this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); + } + + public ProtocolConfigProvider getProtocolConfigProvider() { + return protocolConfigProvider; + } + + public ProtocolFieldConfigProvider getProtocolFieldConfigProvider() { + return protocolFieldConfigProvider; + } + + public RuleConfigProvider getRuleConfigProvider() { + return ruleConfigProvider; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java new file mode 100644 index 0000000..6e36147 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java @@ -0,0 +1,57 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.CombinedFieldConfigProvider; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.FieldConfigProvider; +import com.casic.missiles.parser.provider.FieldRuleConfigProvider; + +/** + * 存放规则相关的的的加载信息 + */ +public class AbstractRuleConfigFactory { + + /** + * 处理字节 + */ + private final FieldConfigProvider fieldConfigProvider; + /** + * 处理组合字节解析的解码器 + */ + private final CombinedFieldConfigProvider combinedFieldConfigProvider; + /** + * 处理负责字节解析的规则配置 + */ + private final FieldRuleConfigProvider fieldRuleConfigProvider; + /** + * 处理实例流程 + */ + private final DatagramEventProvider datagramEventProvider; + + + public AbstractRuleConfigFactory(Long ruleId) { + this.fieldConfigProvider = new FieldConfigProvider(ruleId); + this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); + this.fieldRuleConfigProvider = new FieldRuleConfigProvider(ruleId); + this.datagramEventProvider = new DatagramEventProvider(ruleId); + } + + public FieldConfigProvider getFieldConfigProvider() { + return fieldConfigProvider; + } + + public CombinedFieldConfigProvider getCombinedFieldConfigProvider() { + return combinedFieldConfigProvider; + } + + public FieldRuleConfigProvider getFieldRuleConfigProvider() { + return fieldRuleConfigProvider; + } + + public DatagramEventProvider getDatagramEventProvider() { + return datagramEventProvider; + } + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java deleted file mode 100644 index 6e1719a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.factory; - - -import com.casic.missiles.pojo.ProtocolConfig; - -import java.util.List; - -/** - * 数据库访问优化(暂时未做) - *

- * 1、初始化协议解析配置,并存放到处存放缓存,对协议基本配置进行管理 - * 2、其中流程中所有的配置都经过此类进行管理,进行调用获取,增强解析速度 - */ -public interface DatagramFactory { - - /** - * 初始化 - */ - List datagramInit(); - - /** - * 根据前导码配置匹配,模糊匹配获取所有的报文项 - */ - List match(); - - /** - * 根据前导码匹配,返回报文项 - */ - List filer(); - - /** - * 保证数据的唯一性选择器 - */ - List selectOne(); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java new file mode 100644 index 0000000..87444a0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java @@ -0,0 +1,18 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +import java.util.List; + +/** + * 直接用,还是边用边创建 + */ +public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { + + + public DefaultProtocolConfigFactory(ProtocolConfig protocolConfig) { + super(protocolConfig); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java new file mode 100644 index 0000000..cce0c7c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java @@ -0,0 +1,12 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; + +public class DefaultRuleFactory extends AbstractRuleConfigFactory { + + public DefaultRuleFactory(Long ruleId) { + super(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java deleted file mode 100644 index 9ee97e0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.casic.missiles.parser.instance; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service -@Slf4j -@AllArgsConstructor -public class GeneralProcessor { - - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; - - /** - * 统一固定字段解析=>进行规则的查询的判断 - * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 - * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 - */ - @Deprecated - public boolean parseWholeDatagram(ByteBuf buffer, ProtocolConfig protocolConfig) { - try { - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap,protocolId); - //选取规则对应的流程= - DatagramEventConfig datagramEventConfig = processorSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); - //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); - //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); - //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); - //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); - //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); - return true; - } catch (Exception ex) { - log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", - ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); - return false; - } - } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; - } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); - } - - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); - return bizDataMap; - } - - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java index 25e7ad8..6a5777e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java @@ -1,23 +1,31 @@ package com.casic.missiles.parser.instance.impl; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.mapper.DatagramEventMapper; import com.casic.missiles.pojo.DatagramEventConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.SpringContextUtil; -@Service -@AllArgsConstructor +import java.util.List; +import java.util.Optional; + +/** + * @author cz + * + */ public class DefaultProcessorInstanceSelector implements ProcessorInstanceSelector { - private final DatagramEventMapper datagramEventMapper; + private static List datagramEventConfigs; + + static { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + datagramEventConfigs = datagramEventRegistry.getDatagramEventList(); + } @Override public DatagramEventConfig getProcessorInstance(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("rule_id", protocolId); - return datagramEventMapper.selectOne(queryWrapper); + Optional optionalSelectInstance = datagramEventConfigs.stream() + .filter(e -> e.getId().equals(protocolId)).limit(1).findFirst(); + return optionalSelectInstance.isPresent() ? optionalSelectInstance.get() : null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a778671..7b56a43 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,16 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import io.netty.buffer.ByteBuf; /** - * 分析匹配情况 - * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 - * 2、匹配不成功,有后续帧,可以进行下次匹配。 - * 3、匹配不成功,无后续帧,可以进行丢弃。 + * 分析匹配情况 + * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 + * 2、匹配不成功,有后续帧,可以进行下次匹配。 + * 3、匹配不成功,无后续帧,可以进行丢弃。 */ -public interface FrameStructMatcher{ +public interface FrameStructMatcher { - ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig); + ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 05320ab..8ebea78 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,23 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.ProtocolConfigMapper; +import com.casic.missiles.parser.provider.ProtocolConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Component; import java.util.List; import java.util.stream.Collectors; -@Component -@AllArgsConstructor public class LeadingCodeMatcher { - private final ProtocolConfigMapper protocolMapper; - //** 1、首字母匹配前导码, // 2、以匹配出的前导码是否在报文中条件进行前导码的匹配二次筛选 - public List matchLeadingCode(String protocolContent){ + public static List matchFrameLeadingCode(String protocolContent){ List initialConfigs = initialMatch(protocolContent); List preCodeConfigs = initialConfigs.stream() .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) @@ -26,13 +19,16 @@ } //初始化匹配前导码内容 - private List initialMatch(String protocolContent) { - String protocolStr = protocolContent.charAt(0) + ""; - QueryWrapper queryWrapper = new QueryWrapper() - .likeRight("pre_fix", protocolStr); - List protocolConfigList = protocolMapper.selectList(queryWrapper); - return protocolConfigList; + private static List initialMatch(String protocolContent) { + String firstFrameChar = protocolContent.charAt(0) + ""; + ProtocolConfigProvider protocolConfigProvider=new ProtocolConfigProvider(firstFrameChar); + return protocolConfigProvider.getMatchList(); } + + + + + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index cf2113d..e915877 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -1,32 +1,35 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(0) -@Service +@Component public class FrameLengthMatcher implements FrameStructMatcher { - @Autowired - private FieldParser fieldParser; - //超过长度 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { String dataGramContent = ByteBufUtil.hexDump(byteBuf); - if (StringUtils.isEmpty(protocolConfig.getUnpackId()) && StringUtils.isEmpty(protocolConfig.getTailStr())) { - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + //当不存在结尾标志和拆包标志,可以直接使用长度进行匹配 + if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { if (dataGramContent.length() >= totalLength) {//等于长度返回true,超出长度,切断 - ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, protocolConfig, totalLength); + ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, totalLength); return wholeDatagramByte; } else { //读的标志位前移舍弃 @@ -38,7 +41,7 @@ return null; } - private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, Integer totalLength) { byteBuf.readBytes(totalLength); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, totalLength - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 2bfc213..d527ad0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; @@ -13,7 +13,7 @@ import lombok.AllArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.nio.charset.Charset; import java.util.Map; @@ -22,32 +22,30 @@ * 后续标志验证 */ @Order(1) -@Service +@Component @AllArgsConstructor -public class FrameMarkMatcher implements FrameStructMatcher { - - private final FieldConfigDao fieldConfigDao; - private final FieldParser fieldParser; - private final FieldResolver fieldResolverManger; +public class FrameMarkMatcher implements FrameStructMatcher, FixedPropertyEnum { //帧后续标志=>结束,进行帧的重组=>有后续,1、帧移位判别 2、继续接收帧 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig UnpackConfig = StringUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getUnpackId()); - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); - Integer upback = 0; + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); ByteBuf mergeWholeFrameByte = null; - if (!ObjectUtil.isEmpty(UnpackConfig)) { - while (hasNextFullFrame(byteBuf, protocolConfig)) { - upback = (Integer) fieldResolverManger.filedParserManger(byteBuf, UnpackConfig, null); + if (!ObjectUtil.isEmpty(unpackFlag)) { + while (hasNextFullFrame(byteBuf, protocolConfig, protocolFieldConfigProvider)) { //是否存在后续位 - if (upback == 1) {//使用esayRule + if (unpackFlag == 1) {//使用esayRule //表示可以截取 - mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolConfig, totalLength); + mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolFieldConfigProvider, protocolConfig); return mergeWholeFrameByte; } else { - byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig)); + byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig, protocolFieldConfigProvider)); } } } @@ -56,7 +54,8 @@ //选取第一个帧,将业务内容和后面部分分开 //计算数据报文-业务内容 - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolFieldConfigProvider protocolFieldConfigProvider, ProtocolConfig protocolConfig) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); //截取完整报文 byteBuf.readBytes(totalLength); ByteBuf byteBufContent = byteBuf.slice(0, byteBuf.readerIndex()); @@ -68,15 +67,15 @@ String tail = ""; System.out.println(ByteBufUtil.hexDump(byteBufContent)); //会存在多个帧拼接在一起的的情况,进行合并处理 - while (hasNextFullFrame(byteBufContent, protocolConfig)) { - Integer currentFrameLength = fieldParser.getTotalLength(protocolConfig, byteBufContent); + while (hasNextFullFrame(byteBufContent, protocolConfig, protocolFieldConfigProvider)) { + Integer currentFrameLength = protocolFieldConfigProvider.getTotalLength(byteBufContent, protocolConfig); byteBufContent.readBytes(currentFrameLength); ByteBuf currentbyteBuf = byteBufContent.slice(0, byteBufContent.readerIndex()); byteBufContent.markReaderIndex();//读的标志位前移 System.out.println(ByteBufUtil.hexDump(byteBufContent)); String hexDump = currentbyteBuf.toString(Charset.forName("ISO-8859-1")); //获取当前固定帧结构的关系map - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, currentbyteBuf); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(currentbyteBuf, protocolConfig); if (StringUtils.isEmpty(mergeFrameStr)) { //首次获取业务数据报文 mergeFrameStr += hexDump.substring(0, currentFrameFixedProperty.get("tailPosition")); @@ -95,22 +94,22 @@ /** * 获取平移到下一帧起始位置 */ - public int getNextFrameOffset(ByteBuf buffer, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, buffer); - return currentFrameFixedProperty.get("totalLength"); + public int getNextFrameOffset(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + return currentFrameFixedProperty.get(TOTAL_LENGTH); } /** * 判断是否出错进行整个帧的 */ - public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, byteBuf); + public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); //保证读取位置不在固定位置,是可变的业务内容 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("fixedPosition")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(FIXED_POSITION)) { return false; } //判断读取是否操作帧长度 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("totalLength")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(TOTAL_LENGTH)) { return false; } return true; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 76a3784..c3a1bab 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -1,50 +1,50 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.parser.instance.GeneralProcessor; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; +import io.netty.buffer.ByteBufUtil;; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(2) -@Service +@Component public class FrameTailMatcher implements FrameStructMatcher { - @Resource - private FieldConfigDao fieldConfigDao; - @Autowired - private GeneralProcessor generalProcessor; - //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig tailFieldConfig = StringUtils.isEmpty(protocolConfig.getTailStr()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getTailStr()); - if (!ObjectUtil.isEmpty(tailFieldConfig)) { - String tailStr = tailFieldConfig.getFieldName(); + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfig protocolFieldConfig = ObjectUtils.isEmpty(protocolConfig.getTailStr()) ? null : + fieldConfigProvider.getFieldConfigById(protocolConfig.getTailStr()); + if (!ObjectUtil.isEmpty(protocolFieldConfig)) { + String tailStr = protocolFieldConfig.getFieldName(); String dataGramContent = ByteBufUtil.hexDump(byteBuf); Boolean tailFlag = ByteBufUtil.hexDump(byteBuf).contains(tailStr); if (!tailFlag) { //使用esayRule return null; } else if (dataGramContent.indexOf(tailStr) < dataGramContent.length() - tailStr.length()) { Integer length = dataGramContent.indexOf(tailStr) + tailStr.length(); - ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, protocolConfig, length); + ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, length); return wholeDatagramByte; //存在粘包 } } return null; } - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer length) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, Integer length) { byteBuf.readBytes(length); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, length - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java new file mode 100644 index 0000000..5f1c177 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java @@ -0,0 +1,73 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.combined.GenericCombinedFieldResolver; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.CombinedFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class CombinedFieldConfigProvider { + + + /** + * 作为临时配置列表缓存使用 + */ + private final List combinedFieldConfigList; + private Map storeObjectMap = new HashMap<>(); + + public CombinedFieldConfigProvider(Long ruleId) { + CombinedFieldConfigRegistry combinedFieldConfigRegistry = SpringContextUtil.getBean(CombinedFieldConfigRegistry.class); + combinedFieldConfigList = combinedFieldConfigRegistry.getCombinedFieldConfigList(ruleId); + } + + public void parseDataField(RuleConfig ruleConfig, String clearZeroPlain,Map fieldConfigsMap ) { + if (showSkip()) { + return; + } + //匹配对应的数据,然后进行相关的字段解析 + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver(); + combinedFieldResolver.parseDataField(combinedFieldConfigList, byteBuf, storeObjectMap,fieldConfigsMap); + } + + + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getCombinedFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return combinedFieldConfigList.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public List getCombinedFieldConfigList() { + return combinedFieldConfigList; + } + + /* 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(combinedFieldConfigList) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java new file mode 100644 index 0000000..f3cfedc --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java @@ -0,0 +1,11 @@ +package com.casic.missiles.parser.provider; + +/** + * @author cz + * @date 2023-6-12 + */ +public class CommandEventProvider{ + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java new file mode 100644 index 0000000..70eec5e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java @@ -0,0 +1,77 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.safe.SafeStrategy; +import com.casic.missiles.parser.sender.DataSubscribeProvider; +import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class DatagramEventProvider { + + private final DatagramEventConfig processorInstance; + + public DatagramEventProvider(Long ruleId) { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + List datagramEventConfigList = + datagramEventRegistry.getDatagramEventList(ruleId); + processorInstance = this.getProcessorInstance(datagramEventConfigList); + } + + public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { + if (showSkip()) { + return null; + } + return datagramEventConfigList.get(0); + } + + // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 + public String getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap) { + String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? + processorInstance.getSafeBean() : + fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); + if (!StringUtils.isEmpty(safeName)) { + //需要加密 + SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); + String plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); + return clearComplementZero(plain); + } + return ByteBufUtil.hexDump(bizDataContent); + } + + //解密清零操作 + private String clearComplementZero(String plain) { + plain = plain.substring(0, plain.lastIndexOf("00")); + return plain; + } + + //数据发送,数据发送者暂未构建 + public void storeData(Map bizDataMap) { + DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); +// dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return ObjectUtils.isNotEmpty(processorInstance) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java new file mode 100644 index 0000000..7e1fe0a --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java @@ -0,0 +1,97 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.FieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class FieldConfigProvider { + + + private final List fieldConfigs; + private Map storeObjectMap = new HashMap<>(); +// private Map singleObjects = new ConcurrentHashMap<>(); + + public FieldConfigProvider(Long ruleId) { + FieldConfigRegistry fieldConfigRegistry = SpringContextUtil.getBean(FieldConfigRegistry.class); + fieldConfigs = fieldConfigRegistry.getFieldConfigList(ruleId); + } + + public List getFieldConfigs() { + return fieldConfigs; + } + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public Map parseDataField(RuleConfig ruleConfig, String clearZeroPlain) { + if (showSkip()) { + return null; + } + List prepareFieldConfig = prepareParseField(ruleConfig); + if (CollectionUtils.isNotEmpty(prepareFieldConfig)) { + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(fieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + return fixDataMap; + } + } + return null; + } + + /** + * 得到需要处理的业务内容 + * + * @return + */ + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return fieldConfigs.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public Map getFieldConfigsMap() { + return fieldConfigs.stream().collect( + Collectors.toMap(FieldConfig::getId, e -> e) + ); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(fieldConfigs) ? false : true; + } + + +} + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java new file mode 100644 index 0000000..817bfaf --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java @@ -0,0 +1,19 @@ +package com.casic.missiles.parser.provider; + +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.registry.FieldRuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; + +public class FieldRuleConfigProvider { + + private final List fieldRuleConfigList; + + public FieldRuleConfigProvider(Long ruleId) { + FieldRuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(FieldRuleConfigRegistry.class); + fieldRuleConfigList = ruleConfigRegistry.getFieldRuleConfigList(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java new file mode 100644 index 0000000..99a1b06 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java @@ -0,0 +1,53 @@ +package com.casic.missiles.parser.provider; + + +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.registry.ProtocolConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolConfigProvider { + + private final List protocolConfigList; + + public ProtocolConfigProvider(String firstChar) { + ProtocolConfigRegistry registry = SpringContextUtil.getBean(ProtocolConfigRegistry.class); + protocolConfigList = registry.getProtocolConfigList(firstChar); + } + + public List getMatchList() { + return protocolConfigList; + } + + /** + * 设置当前协议 + * + * @param protocolConfig + */ + public ProtocolConfigProvider(ProtocolConfig protocolConfig) { + List protocolConfigs = new ArrayList<>(); + protocolConfigs.add(protocolConfig); + protocolConfigList = protocolConfigs; + } + + /** + * 获取当前协议 + * + * @return + */ + public ProtocolConfig getCurrentProtocolConfig() { + if (this.protocolConfigList == null) { + return null; + } else { + return protocolConfigList.get(0); + } + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java new file mode 100644 index 0000000..043927d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java @@ -0,0 +1,213 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.registry.ProtocolFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolFieldConfigProvider { + + private static final String FIXED_FIELD_DS = "fixedFieldDs"; + private static final String CONTENT_FIELD_DS = "contentFieldDs"; + private static final String PROTOCOL_LENGTH = "protocolLength"; + private static final String PROTOCOL_FIELD_ID = "protocolFieldId"; + private static final String PROTOCOL_POSITION = "protocolPosition"; + + private final List protocolFieldConfigs; + private Map singleObjects = new ConcurrentHashMap<>(); + private Map storeObjectMap = new HashMap<>(); + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public ProtocolFieldConfigProvider(Long protocolId) { + ProtocolFieldConfigRegistry protocolFieldConfigRegistry = SpringContextUtil.getBean(ProtocolFieldConfigRegistry.class); + protocolFieldConfigs = protocolFieldConfigRegistry.getProtocolFieldConfigList(protocolId); + } + + public List getProtocolFieldConfigs() { + return protocolFieldConfigs; + } + + public ProtocolFieldConfig getFieldConfigById(Long fieldId) { + Optional optionalConfig = protocolFieldConfigs.stream().filter( + e -> e.getId().equals(fieldId) + ).findFirst(); + return optionalConfig.isPresent() ? optionalConfig.get() : null; + } + + public Integer getProtocolFieldValue(Long protocolFieldId, ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_FIELD_ID + protocolFieldId + ByteBufUtil.hexDump(byteBuf); + //获取缓存 + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + //加载固定长度数据集合 + Map fixDataMap = this.getProtocolDataMap(byteBuf); + ProtocolFieldConfig protocolFieldConfig = selectFieldConfig(protocolFieldId); + Integer protocolFieldValue = 0; + //获取约定字段的总长度 + if (fixDataMap.containsKey(protocolFieldConfig.getFieldName())) { + Object appointUnpackObject = fixDataMap.get(protocolFieldConfig.getFieldName()); + if (ObjectUtils.isNotEmpty(appointUnpackObject)) { + protocolFieldValue = (Integer) appointUnpackObject; + } + } + if (protocolFieldValue != null) { + //加入缓存 + if (ObjectUtils.isNotEmpty(protocolFieldValue)) { + this.singleObjects.put(catchKey, protocolFieldValue); + return protocolFieldValue; + } + } + return null; + } + + /** + * 获取帧固定位置信息 + * + * @param byteBuf + * @param protocolConfig + * @return + */ + public Map getFixedProperty(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_POSITION + protocolConfig.getId(); + if (this.singleObjects.containsKey(catchKey)) { + return (Map) singleObjects.get(catchKey); + } + Map fixedPropertyMap = new HashMap<>(); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + fixedPropertyMap = fieldParser.doGetFixedProperty(protocolFieldConfigs, this.getTotalLength(byteBuf,protocolConfig)); + if (CollectionUtils.isNotEmpty(fixedPropertyMap)) { + this.singleObjects.put(catchKey, fixedPropertyMap); + return fixedPropertyMap; + } + return fixedPropertyMap; + } + + /** + * 获取帧结构应有的总长度 + */ + public Integer getTotalLength(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_LENGTH + ByteBufUtil.hexDump(byteBuf); + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + Integer appointFrameLength = getProtocolFieldValue(protocolConfig.getTotalLengthId(), byteBuf); + if (appointFrameLength != null) { + //获取过滤的字段集合总长度 + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Integer totalFilterLength = fieldParser.getTotalFilterLength(protocolConfig, byteBuf, getFixFieldConfigMap()); + //计算总长度 + Integer totalLength = appointFrameLength + totalFilterLength; + //加入缓存 + if (ObjectUtils.isNotEmpty(totalLength)) { + this.singleObjects.put(catchKey, totalLength); + return totalLength; + } + } + return null; + } + + /** + * 获取协议有关字段解析内容 + * storeObjectMap存储代转存的数据 + * + * @return + */ + public Map getProtocolDataMap(ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(FIXED_FIELD_DS)) { + return (Map) singleObjects.get(FIXED_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(protocolFieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + this.singleObjects.put(FIXED_FIELD_DS, fixDataMap); + return fixDataMap; + } + return null; + } + + /** + * 获取业务报文内容的content字节 + * + * @param wholeDatagramByte + * @return + */ + public ByteBuf getDataContentBuf(ByteBuf wholeDatagramByte) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(CONTENT_FIELD_DS)) { + return (ByteBuf) singleObjects.get(CONTENT_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + ByteBuf bizDataByteBuf = fieldParser.getDataContentBuf(protocolFieldConfigs, wholeDatagramByte); + if (bizDataByteBuf != null) { + this.singleObjects.put(CONTENT_FIELD_DS, bizDataByteBuf); + return bizDataByteBuf; + } + return null; + } + + + private ProtocolFieldConfig selectFieldConfig(Long id) { + Optional optionalProtocolFieldConfig = this.protocolFieldConfigs.stream().filter( + e -> e.getId().equals(id) + ).findFirst(); + return optionalProtocolFieldConfig.isPresent() ? optionalProtocolFieldConfig.get() : null; + } + + + private Map getFixFieldConfigMap() { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, e -> e) + ); + return fixDataFieldMap; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(protocolFieldConfigs) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java new file mode 100644 index 0000000..dafba1c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java @@ -0,0 +1,56 @@ +package com.casic.missiles.parser.provider; + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.rule.GenericRuleResolver; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.RuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleConfigProvider { + + private final List ruleConfigs; + + public List getRuleConfigs() { + return ruleConfigs; + } + + public RuleConfigProvider(Long protocolId) { + RuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(RuleConfigRegistry.class); + ruleConfigs = ruleConfigRegistry.getRuleConfigById(protocolId); + } + + /** + * 获取规则匹配结果 + * + * @param parseFixedDataMap + * @param protocolFieldConfigs + * @return + */ + public RuleConfig doGetRule(Map parseFixedDataMap, + String ids, + List protocolFieldConfigs) { + if (showSkip()) { + return null; + } + RuleConfig ruleConfig = GenericRuleResolver.machRule(parseFixedDataMap, ids, protocolFieldConfigs, ruleConfigs); + return ruleConfig; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(ruleConfigs) ? false : true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java index 3c05891..856b399 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java @@ -1,18 +1,11 @@ package com.casic.missiles.parser.resolver; -import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.springframework.web.bind.annotation.RequestBody; -import javax.annotation.Resource; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -20,19 +13,17 @@ @Slf4j public class ByteMergeProvider { - @Resource - private FieldRuleEngineMapper fieldRuleEngineMapper; - //拿到所有的值合并到一个值 - public String resolveByteMerge(List valueList, String ruletypeId, String vaildRange) { + public static String resolveByteMerge(List valueList, String ruleTypeId, String vaildRange) { String values = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Map vaildMap = getValidRangeMap(vaildRange); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(ruletypeId); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } + //暂时不处理 +// fieldRuleEngine = fieldRuleConfigMapper.selectById(ruleTypeId); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } Map env2 = new HashMap(); for (int i = 0; i < valueList.size(); i++) { if (vaildMap.containsKey(i)) { @@ -47,7 +38,7 @@ } } - private Map getValidRangeMap(String vaildRange) { + private static Map getValidRangeMap(String vaildRange) { String[] range = vaildRange.split(","); Map vaildMap = new HashMap(); for (int i = 0; i < range.length; i++) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 8d821cd..85d6bbf 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -1,9 +1,12 @@ package com.casic.missiles.parser.resolver; +import com.casic.missiles.pojo.AbstractFieldConfig; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; import io.netty.buffer.ByteBuf; +import java.util.List; import java.util.Map; /** @@ -11,18 +14,14 @@ */ public interface FieldParser { -// Map fieldProcess(String protocolContent,); - Map dataParser(RuleConfig ruleConfig, String lightText,String protocolId); + Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength); - Map fixDataParser(String protocolId, ByteBuf buffer); + Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap); - Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf); + ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer); - ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer); - - ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer); - - Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer); + Integer getTotalFilterLength(ProtocolConfig protocolConfig, ByteBuf byteBuf, Map protocolFieldConfigMap); } + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java new file mode 100644 index 0000000..9e0c00e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java @@ -0,0 +1,52 @@ +package com.casic.missiles.parser.resolver; + +import com.casic.missiles.pojo.AbstractFieldConfig; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.util.List; + +public class FieldParserSupport { + + //分别计算bit和byte长度=> 合并长度 + protected Integer calculateLength(List fieldConfigList) { + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + Integer fixedLength = bytefixedLength + bitfixedLength / 8; + return fixedLength; + } + + //找到最大值=> 根据最大值计算业务数据下标 + protected Integer calculatePosition(List fieldConfigList) { + String rex = "[0-9]+"; + Integer max = -1; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) + && Integer.valueOf(fieldConfig.getOriginPositionByte()) > max) { + max = Integer.valueOf(fieldConfig.getOriginPositionByte()); + } + } + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) && fieldConfig.getOriginPositionByte().equals(max)) { + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + } + } + Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; + return maxFixedPosition; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java deleted file mode 100644 index dd3a6cd..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java +++ /dev/null @@ -1,170 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.ByteResolverParam; -import io.netty.buffer.ByteBuf; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -/** - * 字段解析管理总类 - */ -@Service -@Slf4j -@AllArgsConstructor -public class FieldResolver extends ByteMergeProvider { - - //1、字段截取 => 2、简单的字节解析和复杂的字节解析 - public Object filedParserManger(ByteBuf byteBuf, FieldConfig fieldConfig, Integer maxFixedPosition) { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - //最大固定位置不为空, - if (!ObjectUtil.isEmpty(maxFixedPosition)) { - orignPosition -= maxFixedPosition; - } - Object fieldValue = 0; - //待优化 - if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { - fieldValue = bitToResolver(byteBuf, fieldConfig); - } else { - ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); - fieldValue = parsingFields(fieldBytes, fieldConfig.getRuleJson()); - } - return fieldValue; - } - - //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, - //目前默认配置的规则设置暂不支持配置化,由实现完成 - private Object parsingFields(ByteBuf byteBuf, String ruleJson) { - Object fieldsResolveValue = null; - List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); - if (ObjectUtil.isEmpty(ruleMapList)) { - fieldsResolveValue = defaultResolveBuilder(byteBuf); - } else { - fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); - } - return fieldsResolveValue; - } - - private Object defaultResolveBuilder(ByteBuf byteBuf) { - Integer defaultResolveValue = 0; - for (int i = 0; i < byteBuf.writerIndex(); i++) { - defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; - } - return defaultResolveValue; - } - - //字段解析构建器(针对字节单位的) - //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 - // 字节归并结束或者规则结束=>继续根据规则进行判断 - private Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { - Object customizeResolveValue = null; - try { - List bytStrList = new ArrayList<>(); - //存放到数组里面 - for (int i = 0; i < byteBuf.writerIndex(); i++) { - bytStrList.add(byteBuf.readByte()); - } - int i = 0; - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - customizeResolveValue = this.resolveByteMerge(bytStrList, ruletypeId,vaildRange); - break; - } else { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - List tempBytStr = new ArrayList<>(); - for (int k = 0; i < bytStrList.size(); i++) { - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(k) - .value(bytStrList.get(k)) - .ruletypeId(ruletypeId).build(); - tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); - } - bytStrList = tempBytStr; - } - i++; - } - //字节归并到一起=>继续根据规则进行判断 - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(customizeResolveValue) - .ruletypeId(ruletypeId).build(); - customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(customizeResolveValue)); - return customizeResolveValue; - } catch (RuntimeException ex) { - log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); - return null; - } - } - - /** - * 1、单个字节情况表示字段 - * 2、多字节情况表示字段(暂未处理) - */ - private Object bitToResolver(ByteBuf byteBuf, FieldConfig fieldConfig) { - Object fieldValue = new Object(); - try { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - byte fields = 0x00; - if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); - } else { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); - } - - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { - if (!StringUtils.isEmpty(fieldConfig.getExactOrignPosition())) { - fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getExactOrignPosition())).byteValue() - >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); - } else { - fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); - } - } else { - fieldValue = Integer.valueOf(fields & 0xff); - } - if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { - return fieldValue; - } - List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); - int i = 0; - //字节归并到一起=>继续根据规则进行判断 - while (i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(fieldValue) - .ruletypeId(ruletypeId).build(); - fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(fieldValue)); - return fieldValue; - } catch (RuntimeException ex) { - log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); - return null; - } - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java new file mode 100644 index 0000000..1d2aeab --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java @@ -0,0 +1,36 @@ +package com.casic.missiles.parser.resolver.bytes; + +import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.mapper.FieldRuleConfigMapper; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.pojo.ByteResolverParam; +import com.googlecode.aviator.AviatorEvaluator; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; +//转换规则 +@Component("convert") +@AllArgsConstructor +@Slf4j +public class ByteRuleResolver implements ByteResolver { + + private final FieldRuleConfigMapper fieldRuleConfigMapper; + + @Override + public Object resolveOperationRule(ByteResolverParam byteResolverParam){ + FieldRuleConfig fieldRuleEngine=fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); + if(ObjectUtil.isEmpty(fieldRuleEngine)){ + return byteResolverParam.getValue(); + } + String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); + Map env2 = new HashMap(); + env2.put("value", (byte) byteResolverParam.getValue()); + String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); + return values; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java index 103821c..786b71c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java @@ -2,34 +2,34 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("logicalShift") +@Component("logicalShift") @AllArgsConstructor @Slf4j public class LogicalShiftResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //字节位移 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { Integer index = byteResolverParam.getIndex(); - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return byteResolverParam.getValue(); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java index 476747d..01149bd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("operation") +@Component("operation") @AllArgsConstructor @Slf4j public class OperationResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //混合运算,有常量或者乘除的缩放 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java index 0b82cf4..79abcce 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.casic.missiles.pojo.ByteResolverParam; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; //精度计算 -@Service("precision") +@Component("precision") @AllArgsConstructor @Slf4j public class PrecisionResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java deleted file mode 100644 index 5c3f332..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; -//转换规则 -@Service("convert") -@AllArgsConstructor -@Slf4j -public class RuleResolver implements ByteResolver { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam){ - RuleEvaluator fieldRuleEngine=fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); - if(ObjectUtil.isEmpty(fieldRuleEngine)){ - return byteResolverParam.getValue(); - } - String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); - Map env2 = new HashMap(); - env2.put("value", (byte) byteResolverParam.getValue()); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java new file mode 100644 index 0000000..d3bbd91 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java @@ -0,0 +1,15 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; + +import java.util.List; +import java.util.Map; +// 前导码匹配->长度字段 +public interface AbstractCombinedFieldProcessor { + + Map invoke(Map map, ByteBuf byteBuf, List combinedFieldConfigList, + Map fieldConfigsMap, Map storeObjectMap); + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java new file mode 100644 index 0000000..03c8480 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java @@ -0,0 +1,59 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-13 + */ +//依次递增进行数据的解析, +public class GenericCombinedFieldResolver { + + + //通过查询,字段长度长度随机 + public void parseDataField(List combinedFieldConfigList, ByteBuf byteBuf, + Map storeObjectMap, Map fieldConfigsMap) { + Integer frameLength = Integer.valueOf(ByteBufUtil.hexDump(byteBuf)); + //添加前置处理器 + com.casic.missiles.util.ClassUtil classUtil = new com.casic.missiles.util.ClassUtil(); + List abstractCombinedProcessors = classUtil.getSubClassList(AbstractCombinedFieldProcessor.class); + + Map fieldFixedMap = combinedFieldLeadCodeMap(combinedFieldConfigList); + //frameLength + Map combinedProcessorFields = null; + while (byteBuf.readableBytes() < frameLength) { + //一直处理 + for (AbstractCombinedFieldProcessor abstractCombinedProcessor : abstractCombinedProcessors) { + combinedProcessorFields = abstractCombinedProcessor.invoke(combinedProcessorFields, byteBuf, + combinedFieldConfigList, + fieldConfigsMap, storeObjectMap); + if (combinedProcessorFields == null || byteBuf.readableBytes() < frameLength) { + return; + } + } + + } + } + + /** + * 取出前导码匹配集合 + */ + private Map combinedFieldLeadCodeMap(List combinedFieldConfigList) { + Map fieldFixedMap = combinedFieldConfigList + .stream() + .collect(Collectors.toMap(CombinedFieldConfig::getPrefixCode, e -> e)); + return fieldFixedMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java new file mode 100644 index 0000000..643a934 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java @@ -0,0 +1,100 @@ +package com.casic.missiles.parser.resolver.fields; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.FieldParserSupport; +import com.casic.missiles.pojo.*; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 保存使用时最基本的信息,并且使用原型模式 + */ +@Slf4j +public class DefaultProtocolFieldParser extends FieldParserSupport implements FieldParser, FixedPropertyEnum { + + //通过传入的配置和报文进行字段解析 + @Override + public Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap) { + Map dataMap = new HashMap<>(); + for (AbstractFieldConfig protocolFieldConfig : protocolFieldConfigs) { + if (!ObjectUtils.isEmpty(protocolFieldConfig.getOriginPositionByte())) { + Object fieldValue = FieldResolver.parseField(buffer, protocolFieldConfig, null); + if (protocolFieldConfig.getIsStorage() == 1) { + storeObjectMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + dataMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + } + return dataMap; + } + + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength) { + Map fixedPropertyMap = new HashMap<>(); + Integer fixedLength = calculateLength(protocolFieldConfigs); + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + fixedPropertyMap.put(FIXED_POSITION, maxFixedPosition); + fixedPropertyMap.put(TOTAL_LENGTH, totalLength); + fixedPropertyMap.put(TAIL_POSITION, totalLength - fixedLength + maxFixedPosition); + return fixedPropertyMap; + } + + //** 获取业务内容的byteBuf + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer) { + //计算固定长度 + Integer fixedLength = calculateLength(protocolFieldConfigs); + //总长度获取 + String lightText = buffer.toString(Charset.forName("ISO-8859-1")); + Integer totalLength = lightText.length(); + //计算固定长度最大长度 + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + //计算数据报文内容 + ByteBuf bizDataFields = buffer.slice(maxFixedPosition - 1, (totalLength - fixedLength)); + return bizDataFields; + } + + /** + * 获取过滤字段的长度 + */ + @Override + public Integer getTotalFilterLength(ProtocolConfig protocolConfig, + ByteBuf byteBuf, + Map protocolFieldConfigMap) { + if (ByteBufUtil.hexDump(byteBuf).equals("")) { + return 0; + } + int totalFilterLength = 0; + String filterFields = protocolConfig.getTotalLengthFilterFields(); + try { + if (!StringUtils.isEmpty(filterFields)) { + String[] filterFieldList = filterFields.split(","); + for (String filterFieldId : filterFieldList) { + if (StringUtils.isNotEmpty(filterFieldId)) { + ProtocolFieldConfig fieldConfig = protocolFieldConfigMap.get(Long.valueOf(filterFieldId)); + //这里都是按字节计算,没有对位进行区分,可能会出现错误 + // 如果对位有需求,需要进一步跟进 + totalFilterLength += fieldConfig.getOffsetLength(); + } + } + } + return totalFilterLength; + } catch (Exception ex) { + log.error("报文确认分发阶段,获取报文总长度过滤长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); + } + return totalFilterLength; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java new file mode 100644 index 0000000..d51e887 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java @@ -0,0 +1,169 @@ +package com.casic.missiles.parser.resolver.fields; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.parser.resolver.ByteMergeProvider; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.AbstractFieldConfig; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.pojo.ByteResolverParam; +import io.netty.buffer.ByteBuf; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * 字段解析管理总类 + */ +@Slf4j +public class FieldResolver extends ByteMergeProvider { + + //1、字段截取 => 2、简单的字节解析和复杂的字节解析 + public static Object parseField(ByteBuf byteBuf,AbstractFieldConfig fieldConfig, Integer maxFixedPosition) { + Integer orignPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + //最大固定位置不为空, + if (!ObjectUtil.isEmpty(maxFixedPosition)) { + orignPosition -= maxFixedPosition; + } + Object fieldValue = 0; + //待优化 + if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { + fieldValue = doParseBitField(byteBuf, fieldConfig); + } else { + ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); + fieldValue = doParseByteField(fieldBytes, fieldConfig.getRuleJson()); + } + return fieldValue; + } + + //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, + //目前默认配置的规则设置暂不支持配置化,由实现完成 + private static Object doParseByteField(ByteBuf byteBuf, String ruleJson) { + Object fieldsResolveValue = null; + List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); + if (ObjectUtil.isEmpty(ruleMapList)) { + fieldsResolveValue = defaultResolveBuilder(byteBuf); + } else { + fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); + } + return fieldsResolveValue; + } + + private static Object defaultResolveBuilder(ByteBuf byteBuf) { + Integer defaultResolveValue = 0; + for (int i = 0; i < byteBuf.writerIndex(); i++) { + defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; + } + return defaultResolveValue; + } + + //字段解析构建器(针对字节单位的) + //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 + // 字节归并结束或者规则结束=>继续根据规则进行判断 + private static Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { + Object customizeResolveValue = null; + try { + List bytStrList = new ArrayList<>(); + //存放到数组里面 + for (int i = 0; i < byteBuf.writerIndex(); i++) { + bytStrList.add(byteBuf.readByte()); + } + int i = 0; + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { + if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + customizeResolveValue = resolveByteMerge(bytStrList, ruletypeId, vaildRange); + break; + } else { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + List tempBytStr = new ArrayList<>(); + for (int k = 0; i < bytStrList.size(); i++) { + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(k) + .value(bytStrList.get(k)) + .ruletypeId(ruletypeId).build(); + tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); + } + bytStrList = tempBytStr; + } + i++; + } + //字节归并到一起=>继续根据规则进行判断 + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(null) + .value(customizeResolveValue) + .ruletypeId(ruletypeId).build(); + customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); + i++; + } + System.out.println(JSON.toJSON(customizeResolveValue)); + return customizeResolveValue; + } catch (RuntimeException ex) { + log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); + return null; + } + } + + /** + * 1、单个字节情况表示字段 + * 2、多字节情况表示字段(暂未处理) + */ + private static Object doParseBitField(ByteBuf byteBuf,AbstractFieldConfig fieldConfig) { + Object fieldValue = new Object(); + try { + Integer orignPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + byte fields = 0x00; + if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { + fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); + } else { + fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); + } + + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { + if (!StringUtils.isEmpty(fieldConfig.getOriginPositionBit())) { + fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getOriginPositionBit())).byteValue() + >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); + } else { + fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); + } + } else { + fieldValue = Integer.valueOf(fields & 0xff); + } + if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { + return fieldValue; + } + List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); + int i = 0; + //字节归并到一起=>继续根据规则进行判断 + while (i < ruleMapList.size()) { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(null) + .value(fieldValue) + .ruletypeId(ruletypeId).build(); + fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); + i++; + } + System.out.println(JSON.toJSON(fieldValue)); + return fieldValue; + } catch (RuntimeException ex) { + log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); + return null; + } + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java deleted file mode 100644 index 35ae3d0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java +++ /dev/null @@ -1,183 +0,0 @@ -package com.casic.missiles.parser.resolver.fields; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufAllocator; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; -import org.springframework.util.ObjectUtils; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service("standard") -@AllArgsConstructor -@Slf4j -public class StandardFieldParser implements FieldParser { - - private final FieldConfigDao fieldConfigDao; - private final FieldResolver fieldResolver; - - //数据解析 - @Override - public Map dataParser(RuleConfig ruleConfig, String lightText, String protocolId) { - String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); - ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); - bufferContent.writeBytes(lightText.getBytes(Charset.forName("ISO-8859-1"))); - Map dataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - for (String dataFieldId : dataFieldIds) { - FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(dataFieldId); - if (!ObjectUtils.isEmpty(fieldConfig)) { - dataMap.put(fieldConfig.getFieldName(), String.valueOf(fieldResolver.filedParserManger(bufferContent, fieldConfig, maxFixedPosition))); - } - } - return dataMap; - } - - //数据解析 - @Override - public Map fixDataParser(String protocolId, ByteBuf buffer) { - List dataFieldIdList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Map dataMap = new HashMap<>(); - for (FieldConfig dataField : dataFieldIdList) { - if (!ObjectUtils.isEmpty(dataField.getOrignPosition())) { - Object fieldValue = (Integer) fieldResolver.filedParserManger(buffer, dataField, null); - dataMap.put(dataField.getFieldName(), fieldValue); - } - } - return dataMap; - } - - @Override - public Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf) { - if (ByteBufUtil.hexDump(byteBuf).equals("")) { - return 0; - } - String filterFields = protocolConfig.getTotalLengthFilterField(); - Integer totalLength = 0; - try { - FieldConfig totalFieldConfig = fieldConfigDao.getFieldConfigById(protocolConfig.getTotalLengthId()); - int totalFilterLength = 0; - if (!StringUtils.isEmpty(filterFields)) { - String[] filterFieldList = filterFields.split(","); - for (String filterField : filterFieldList) { - FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(filterField); - //这里都是按字节计算,没有对位进行区分,可能会出现错误 - - // 如果对位有需求,需要进一步跟进 - totalFilterLength += fieldConfig.getOffsetLength(); - } - } - totalLength = (Integer) fieldResolver.filedParserManger(byteBuf, totalFieldConfig, null) + totalFilterLength; - } catch (Exception ex) { - log.error("报文确认分发阶段,获取报文总长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); - } - return totalLength; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer) { - //业务内容 - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - String protocolId = String.valueOf(protocolConfig.getId()); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - //计算固定长度 - Integer fixedLength = calculateLength(fieldConfigList); -// Integer totalLength = this.getTotalLength(protocolConfig, buffer); - //总长度获取 - Integer totalLength = lightText.length(); - //计算固定长度最大长度 - Integer maxFixedPosition = calculatePosition(fieldConfigList); -// buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - //计算数据报文内容 - ByteBuf bizDataFields = buffer.slice(maxFixedPosition-1, (totalLength - fixedLength)); - return bizDataFields; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer) { - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - String protocolId = String.valueOf(protocolConfig.getId()); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer fixedLength = calculateLength(fieldConfigList); -// Integer totalLength = this.getTotalLength(protocolConfig, buffer); - Integer totalLength = lightText.length(); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - ByteBuf fixDataFields = buffer.slice(0, maxFixedPosition); - return fixDataFields; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer) { - String protocolId = String.valueOf(protocolConfig.getId()); - Map fixedPropertyMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer fixedLength = calculateLength(fieldConfigList); - Integer totalLength = this.getTotalLength(protocolConfig, buffer); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - fixedPropertyMap.put("fixedPosition", maxFixedPosition); - fixedPropertyMap.put("totalLength", totalLength); - fixedPropertyMap.put("tailPosition", totalLength - fixedLength + maxFixedPosition); - return fixedPropertyMap; - } - - //分别计算bit和byte长度=> 合并长度 - private Integer calculateLength(List fieldConfigList) { - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (FieldConfig fieldConfig : fieldConfigList) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - Integer fixedLength = bytefixedLength + bitfixedLength / 8; - return fixedLength; - } - - //找到最大值=> 根据最大值计算业务数据下标 - private Integer calculatePosition(List fieldConfigList) { - String rex = "[0-9]+"; - Integer max = -1; - for (FieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOrignPosition()) - && Integer.valueOf(fieldConfig.getOrignPosition()) > max) { - max = Integer.valueOf(fieldConfig.getOrignPosition()); - } - } - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (FieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOrignPosition()) && fieldConfig.getOrignPosition().equals(max)) { - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - } - } - Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; - return maxFixedPosition; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java new file mode 100644 index 0000000..d4ec6c7 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java @@ -0,0 +1,76 @@ +package com.casic.missiles.parser.rule; + +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import org.apache.commons.lang3.StringUtils; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class GenericRuleResolver { + + //根据前置字段的值,找到指定的规则 + //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 + //=>循环判断=>通过规则得到业务字段 + public static RuleConfig machRule(Map fixDataMap, + String ids, + List protocolFieldConfigs, + List ruleConfigs) { + List preRuleConfigList = getPreRuleList(ids, protocolFieldConfigs); + //获取前置规则字段 + final Map metaDataMap = getPreRuleFields(preRuleConfigList, fixDataMap); + //准备固定的字段集合 + Map fixDataFieldMap = getFixDataFieldMap(protocolFieldConfigs); + return RuleResolverCore.doMachRule(ruleConfigs, metaDataMap, fixDataMap, fixDataFieldMap); + } + + private static Map getFixDataFieldMap(List protocolFieldConfigs) { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, ProtocolFieldConfig::getFieldName) + ); + return fixDataFieldMap; + } + + + /** + * 查询前置规则的字段配置 + * + * @param ids + * @return + */ + private static List getPreRuleList(String ids, List protocolFieldConfigs) { + String[] idList = ids.split(","); + Map prepareMaps = new HashMap<>(); + for (String id : idList) { + if (StringUtils.isNotEmpty(id)) { + prepareMaps.put(Long.valueOf(id), ""); + } + } + List preRuleConfigList = protocolFieldConfigs + .stream() + .filter(e -> prepareMaps.containsKey(e.getId())) + .collect(Collectors.toList()); + return preRuleConfigList; + } + + /** + * 获取前置规则解析字段 + */ + private static Map getPreRuleFields(List preRuleFieldConfigList, Map fixDataMap) { + Map ruleFieldMap = new HashMap<>(); + preRuleFieldConfigList.stream() + .forEach( + preRuleFieldConfig -> { + String fieldName = preRuleFieldConfig.getFieldName(); + if (fixDataMap.containsKey(fieldName)) { + ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); + } + } + ); + return ruleFieldMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java new file mode 100644 index 0000000..baae7e8 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -0,0 +1,68 @@ +package com.casic.missiles.parser.rule; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.casic.missiles.pojo.RuleConfig; + +import java.util.*; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleResolverCore { + + + public static RuleConfig doMachRule(List ruleConfigList, Map metaDataMap, + Map fixDataMap, + Map fixDataFieldMap) { + Optional ruleConfigOptional = ruleConfigList.stream() + .filter(ruleConfig -> machRuleConfig( + JSON.parseObject(ruleConfig.getMatchRuleJson(), Map.class), metaDataMap)) + .findFirst(); + if (ObjectUtil.isEmpty(ruleConfigOptional)) { + return null; + } + String[] ruleFields = ruleConfigOptional.get().getDataFieldIds().split(","); + Map ruleMetaDataMap = getRuleFields(ruleFields, fixDataMap, fixDataFieldMap); + //递归选定解析规则,进行规则解析 + if (!ruleConfigOptional.get().getIsFinishMatch().equals("1")) { + //递归选定规则 + doMachRule(ruleConfigList, ruleMetaDataMap, fixDataMap, fixDataFieldMap); + } + return ruleConfigOptional.get(); + } + + + private static Map getRuleFields(String[] preRuleConfigList, Map fixedDataMap, + Map fixedFieldMap) { + Map ruleFieldMap = new HashMap<>(); + for (String preRuleConfigId : preRuleConfigList) { + String fieldName = fixedFieldMap.get(preRuleConfigId); + if (fixedDataMap.containsKey(fieldName)) { + ruleFieldMap.put(fieldName, String.valueOf(fixedDataMap.get(fieldName))); + } + } + return ruleFieldMap; + } + + + //匹配规则配置 + private static Boolean machRuleConfig(Map ruleMap, Map metaDataMap) { + if (ruleMap == null || metaDataMap == null) { + return null; + } + //所有的字段在规则里面必须有有配置 + for (String key : metaDataMap.keySet()) { + if (ruleMap.containsKey(key)) { + if (!ruleMap.get(key).equals(metaDataMap.get(key))) { + return false; + } + } else { + return false; + } + } + return true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java deleted file mode 100644 index 664088d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java +++ /dev/null @@ -1,92 +0,0 @@ -package com.casic.missiles.parser.rule; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.mapper.dao.PreRuleConfigDao; -import com.casic.missiles.mapper.dao.RuleConfigDao; -import lombok.AllArgsConstructor; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.*; -import java.util.stream.Collectors; - -@Service -@AllArgsConstructor -public class RulerProvider { - - private final FieldConfigDao fieldConfigDao; - private final PreRuleConfigDao preRuleConfigDao; - private final RuleConfigDao ruleConfigDao; - - //根据前置字段的值,找到指定的规则 - //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 - //=>循环判断=>通过规则得到业务字段 - public RuleConfig ruleConfig(Map fixDataMap, String protocolId) { - //批量获取规则 - List preRuleConfigList = preRuleConfigDao.getPreRuleList(protocolId); - //获取固定字段 - Map fixFieldMap = getAllFieldMap(protocolId); - //获取前置规则字段 - final String preRuleFields = getPreRuleFields(preRuleConfigList, fixDataMap, fixFieldMap); - List ruleConfigList = ruleConfigDao.getRuleConfigById(protocolId); - Optional ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig ->preRuleFields.equals( ruleConfig.getParseRuleJson())).findFirst(); - //递归选定解析规则,进行规则解析 - while (!ObjectUtil.isEmpty(ruleConfigOptional) && !ruleConfigOptional.get().getIsBizField().equals("1")) { - String ruleFields = getRuleFields(ruleConfigOptional.get().getDataFieldIds().split(","), fixDataMap, fixFieldMap); - ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig -> ruleConfig.getParseRuleJson().equals(ruleFields)).findFirst(); - } - return ruleConfigOptional.get(); - } - - /** - * 获取前置规则解析字段 - */ - private String getPreRuleFields(List preRuleConfigList, Map fixDataMap, Map fixFieldMap) { - Map ruleFieldMap= new HashMap<>(); - preRuleConfigList.stream() - .forEach( - preRuleConfig -> { - String fieldName = fixFieldMap.get(Long.valueOf(preRuleConfig.getRuleFieldId())); - if (fixDataMap.containsKey(fieldName)) { - ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); - } - } - ); - return JSONObject.toJSONString(ruleFieldMap); - } - - private Map getAllFieldMap(String protocolId) { - List fieldList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Map fixFieldMap = fieldList.stream().collect( - Collectors.toMap(FieldConfig::getId, FieldConfig::getFieldName) - ); - return fixFieldMap; - } - - private String getRuleFields(String[] preRuleConfigList, Map fixDataMap, Map fixFieldMap) { - Map ruleFieldMap= new HashMap<>(); - for (String preRuleConfigId : preRuleConfigList) { - String fieldName = fixFieldMap.get(preRuleConfigId); - if (fixDataMap.containsKey(fieldName)) { - ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); - } - } - return JSONObject.toJSONString(ruleFieldMap); - } - - //弃置 - private String ListToString(List ruleFieldList) { - String ruleFields = ""; - for (String ruleField : ruleFieldList) { - ruleFields += ruleField + ","; - } - ruleFields = StringUtils.isEmpty(ruleFields) ? ruleFields : ruleFields.substring(0, ruleFields.length() - 1); - return ruleFields; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java index 6177e10..bfa87a5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java @@ -2,7 +2,7 @@ public interface SafeStrategy { - String decryption(byte[] bytes); + String decryption(String cipher); String encryption(String lightText); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java index 618716c..6236302 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java @@ -9,9 +9,9 @@ //十六进制的字符串转换成字节数组 byte[] bytes = hexStrToBinaryStr(msg); //计算CRC8 - byte crc8 = CRC8(bytes, 0, bytes.length); - String crc8ToStr = "" + Integer.toHexString(0xff & crc8); - return crc8ToStr; +// String crc8ToStr = "" + Integer.toHexString(0xff & crc8); +// return crc8ToStr; + return null; } /** @@ -33,50 +33,5 @@ return bytes; } - /** - * CRC8 校验 多项式 x8+x2+x+1 - * - * @param b - * @param off - * @param len - * @return - */ - public static byte CRC8(final byte[] b, final int off, final int len) { - byte result = 0x00; - for (int i = 0; i < len; i++) { - result = CHECKSUM_TABLE[(result ^ (b[i + off] & 0xFF)) & 0xFF]; - } - return (byte) (result & 0xFFL); - } - - private final static byte[] CHECKSUM_TABLE = {(byte) 0x00, (byte) 0x07, (byte) 0x0e, (byte) 0x09, (byte) 0x1c, (byte) 0x1b, - (byte) 0x12, (byte) 0x15, (byte) 0x38, (byte) 0x3f, (byte) 0x36, (byte) 0x31, (byte) 0x24, (byte) 0x23, (byte) 0x2a, - (byte) 0x2d, (byte) 0x70, (byte) 0x77, (byte) 0x7e, (byte) 0x79, (byte) 0x6c, (byte) 0x6b, (byte) 0x62, (byte) 0x65, - (byte) 0x48, (byte) 0x4f, (byte) 0x46, (byte) 0x41, (byte) 0x54, (byte) 0x53, (byte) 0x5a, (byte) 0x5d, (byte) 0xe0, - (byte) 0xe7, (byte) 0xee, (byte) 0xe9, (byte) 0xfc, (byte) 0xfb, (byte) 0xf2, (byte) 0xf5, (byte) 0xd8, (byte) 0xdf, - (byte) 0xd6, (byte) 0xd1, (byte) 0xc4, (byte) 0xc3, (byte) 0xca, (byte) 0xcd, (byte) 0x90, (byte) 0x97, (byte) 0x9e, - (byte) 0x99, (byte) 0x8c, (byte) 0x8b, (byte) 0x82, (byte) 0x85, (byte) 0xa8, (byte) 0xaf, (byte) 0xa6, (byte) 0xa1, - (byte) 0xb4, (byte) 0xb3, (byte) 0xba, (byte) 0xbd, (byte) 0xc7, (byte) 0xc0, (byte) 0xc9, (byte) 0xce, (byte) 0xdb, - (byte) 0xdc, (byte) 0xd5, (byte) 0xd2, (byte) 0xff, (byte) 0xf8, (byte) 0xf1, (byte) 0xf6, (byte) 0xe3, (byte) 0xe4, - (byte) 0xed, (byte) 0xea, (byte) 0xb7, (byte) 0xb0, (byte) 0xb9, (byte) 0xbe, (byte) 0xab, (byte) 0xac, (byte) 0xa5, - (byte) 0xa2, (byte) 0x8f, (byte) 0x88, (byte) 0x81, (byte) 0x86, (byte) 0x93, (byte) 0x94, (byte) 0x9d, (byte) 0x9a, - (byte) 0x27, (byte) 0x20, (byte) 0x29, (byte) 0x2e, (byte) 0x3b, (byte) 0x3c, (byte) 0x35, (byte) 0x32, (byte) 0x1f, - (byte) 0x18, (byte) 0x11, (byte) 0x16, (byte) 0x03, (byte) 0x04, (byte) 0x0d, (byte) 0x0a, (byte) 0x57, (byte) 0x50, - (byte) 0x59, (byte) 0x5e, (byte) 0x4b, (byte) 0x4c, (byte) 0x45, (byte) 0x42, (byte) 0x6f, (byte) 0x68, (byte) 0x61, - (byte) 0x66, (byte) 0x73, (byte) 0x74, (byte) 0x7d, (byte) 0x7a, (byte) 0x89, (byte) 0x8e, (byte) 0x87, (byte) 0x80, - (byte) 0x95, (byte) 0x92, (byte) 0x9b, (byte) 0x9c, (byte) 0xb1, (byte) 0xb6, (byte) 0xbf, (byte) 0xb8, (byte) 0xad, - (byte) 0xaa, (byte) 0xa3, (byte) 0xa4, (byte) 0xf9, (byte) 0xfe, (byte) 0xf7, (byte) 0xf0, (byte) 0xe5, (byte) 0xe2, - (byte) 0xeb, (byte) 0xec, (byte) 0xc1, (byte) 0xc6, (byte) 0xcf, (byte) 0xc8, (byte) 0xdd, (byte) 0xda, (byte) 0xd3, - (byte) 0xd4, (byte) 0x69, (byte) 0x6e, (byte) 0x67, (byte) 0x60, (byte) 0x75, (byte) 0x72, (byte) 0x7b, (byte) 0x7c, - (byte) 0x51, (byte) 0x56, (byte) 0x5f, (byte) 0x58, (byte) 0x4d, (byte) 0x4a, (byte) 0x43, (byte) 0x44, (byte) 0x19, - (byte) 0x1e, (byte) 0x17, (byte) 0x10, (byte) 0x05, (byte) 0x02, (byte) 0x0b, (byte) 0x0c, (byte) 0x21, (byte) 0x26, - (byte) 0x2f, (byte) 0x28, (byte) 0x3d, (byte) 0x3a, (byte) 0x33, (byte) 0x34, (byte) 0x4e, (byte) 0x49, (byte) 0x40, - (byte) 0x47, (byte) 0x52, (byte) 0x55, (byte) 0x5c, (byte) 0x5b, (byte) 0x76, (byte) 0x71, (byte) 0x78, (byte) 0x7f, - (byte) 0x6a, (byte) 0x6d, (byte) 0x64, (byte) 0x63, (byte) 0x3e, (byte) 0x39, (byte) 0x30, (byte) 0x37, (byte) 0x22, - (byte) 0x25, (byte) 0x2c, (byte) 0x2b, (byte) 0x06, (byte) 0x01, (byte) 0x08, (byte) 0x0f, (byte) 0x1a, (byte) 0x1d, - (byte) 0x14, (byte) 0x13, (byte) 0xae, (byte) 0xa9, (byte) 0xa0, (byte) 0xa7, (byte) 0xb2, (byte) 0xb5, (byte) 0xbc, - (byte) 0xbb, (byte) 0x96, (byte) 0x91, (byte) 0x98, (byte) 0x9f, (byte) 0x8a, (byte) 0x8d, (byte) 0x84, (byte) 0x83, - (byte) 0xde, (byte) 0xd9, (byte) 0xd0, (byte) 0xd7, (byte) 0xc2, (byte) 0xc5, (byte) 0xcc, (byte) 0xcb, (byte) 0xe6, - (byte) 0xe1, (byte) 0xe8, (byte) 0xef, (byte) 0xfa, (byte) 0xfd, (byte) 0xf4, (byte) 0xf3}; } \ No newline at end of file diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java index 27c2838..6e078a3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java @@ -1,9 +1,6 @@ package com.casic.missiles.parser.safe.impl; -import cn.hutool.core.util.CharsetUtil; -import cn.hutool.crypto.symmetric.SM4; -import cn.hutool.crypto.symmetric.SymmetricCrypto; - +import com.casic.missiles.parser.safe.SafeStrategy; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; @@ -11,19 +8,44 @@ import org.bouncycastle.crypto.engines.SM4Engine; import org.bouncycastle.crypto.params.KeyParameter; import org.bouncycastle.util.encoders.Hex; - -import static cn.hutool.crypto.Mode.ECB; -import static cn.hutool.crypto.Padding.NoPadding; +import org.springframework.stereotype.Component; /** * SM4算法工具类 */ @Slf4j -public class Sm4 { +@Component("sm4") +public class Sm4 implements SafeStrategy { //加解密的字节快大小 public static final int BlockSize = 16; + @Override + public String decryption(String cipher) { + byte[] keyByte = { + 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 + }; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(keyByte); + byte[] in = Hex.decode(cipher); + byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); + String plain = EcbDecrypt(in, keyBytes); + return plain; + } + + @Override + public String encryption(String cipher) { + byte[] keyByte = { + 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 + }; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(keyByte); + byte[] in = Hex.decode(cipher); + byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); + String plain = EcbDecrypt(in, keyBytes); + return plain; + } + /** * SM4ECB加密算法,对内 * @@ -32,8 +54,6 @@ * @return */ private static byte[] ecb_encrypt(byte[] in, byte[] keyBytes) { - - SM4Engine sm4Engine = new SM4Engine(); sm4Engine.init(true, new KeyParameter(keyBytes)); byte[] out = new byte[in.length]; @@ -58,27 +78,6 @@ return cipher; } - - /** - * hutool 解密SM4 - * - * @param encodeContent - * @return - */ - public static String decode(String encodeContent) { - String key = "24ad182507479a5da3ad94d9d78ea203"; - try { - SymmetricCrypto sm4 = new SM4(ECB, NoPadding, key.getBytes()); - String decryptStr = sm4.decryptStr(encodeContent, CharsetUtil.CHARSET_UTF_8); - return decryptStr; - } catch (Exception e) { - e.printStackTrace(); - log.error("SM4解密失败"); - } - return null; - } - - /** * SM4的ECB加密算法 * @@ -129,20 +128,6 @@ return plain; } - /** - * SM4的ECB解密算法 - * - * @param cipher 输入的密文字符串 - * @param key 密钥 - * @return - */ - public static String EcbDecrypt(String cipher, String key) { - byte[] in = Hex.decode(cipher); - byte[] keyBytes = Hex.decode(key); - - String plain = EcbDecrypt(in, keyBytes); - return plain; - } /** * 主函数 @@ -151,28 +136,24 @@ */ public static void main(String[] args) { byte[] ciphertext = { + 0x4B, (byte) 0x8C, (byte) 0x9D, 0x08, (byte) 0xE4, (byte) 0xD3, 0x64, 0x42, (byte) 0xB9, (byte) 0xA5, (byte) 0xFE, (byte) 0xCD, (byte) 0x91, 0x1B, 0x38, (byte) 0xAC, (byte) 0xE9, 0x1C, (byte) 0xCD, 0x53, 0x02, (byte) 0xD7, 0x0C, (byte) 0x9B, (byte) 0x96, 0x30, 0x62, (byte) 0xE8, (byte) 0xFB, (byte) 0xEF, (byte) 0xB9, (byte) 0xFF, (byte) 0xDE, 0x19, (byte) 0x80, 0x35, 0x3E, (byte) 0x90, 0x4F, 0x2F, 0x12, 0x2B, 0x19, (byte) 0x8B, 0x6C, 0x7A, (byte) 0x85, (byte) 0xA1, (byte) 0xB1, (byte) 0x86, (byte) 0xA3, 0x7A, 0x46, 0x0C, 0x2F, (byte) 0x94, 0x4F, 0x7F, 0x2C, 0x56, 0x14, (byte) 0xF3, (byte) 0x89, (byte) 0xC3, - 0x3F, 0x20, (byte) 0xF9, (byte) 0x87, (byte) 0xA1, 0x60, (byte) 0xD9, (byte) 0xA8, (byte) 0xFD, (byte) 0xD7, (byte) 0x9B, 0x4B, 0x26, 0x06, 0x30, 0x44}; + 0x3F, 0x20, (byte) 0xF9, (byte) 0x87, (byte) 0xA1, 0x60, (byte) 0xD9, (byte) 0xA8, (byte) 0xFD, (byte) 0xD7, (byte) 0x9B, 0x4B, 0x26, 0x06, 0x30, 0x44 + }; ByteBuf in = ByteBufAllocator.DEFAULT.heapBuffer(); in.writeBytes(ciphertext); - byte[] keyByte = { 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 }; ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); - key.writeBytes(ciphertext); - String resCipherData = decode(ByteBufUtil.hexDump(in)); - ByteBuf out = ByteBufAllocator.DEFAULT.heapBuffer(); -// out.writeBytes(resCipherData); -// System.out.println(hexBytes); - System.out.println(resCipherData.toString()); -// String resPlainData = EcbDecrypt(resCipherData, key); -// System.out.println("原始明文:" + data); -// System.out.println("解密后明文:" + resPlainData); + key.writeBytes(keyByte); +// String resCipherData = EcbDecrypt(ByteBufUtil.hexDump(in), ByteBufUtil.hexDump(key)); +// System.out.println(resCipherData); } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java index 1395a51..ac5f957 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java @@ -1,7 +1,7 @@ package com.casic.missiles.parser.safe.impl; import io.netty.buffer.ByteBufUtil; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** *

@@ -14,9 +14,8 @@ * @author hyl * @version v1.0: Tea.java, v 0.1 2021/3/12 13:48 $ */ -@Service("tea") -///tea算法类 - +//tea算法类 +@Component("tea") public class Tea { public static byte[] MyTea_Encrypt(byte[] MyTeaContent, int ByteLen, byte[] MyTeakey) { @@ -99,7 +98,6 @@ // for(int i32Index = 0; i32Index < 8; i32Index++) { // System.out.print("0x" + Integer.toHexString(MyContent[i32Index]) + " "); // } - // System.out.println("密钥为:"); // for(int i32Index = 0; i32Index < 16; i32Index++) { // System.out.print("0x" + Integer.toHexString(MyKeys[i32Index]) + " "); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java index bdd0721..bd1516a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java @@ -3,7 +3,7 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.parser.sender.DataSubscribeProvider; import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponents; import org.springframework.web.util.UriComponentsBuilder; @@ -12,7 +12,7 @@ import java.util.Collections; import java.util.Map; -@Service("functionCallback") +@Component("functionCallback") public class FunctionCallback implements DataSubscribeProvider { @Resource diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java index 0b44fb9..7526de2 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.Map; -@Service("middleware") +@Component("middleware") public class MiddlewareSubscribe implements DataSubscribeProvider { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java index 5dcee3f..e2f1192 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.Map; -@Service("nosql") +@Component("nosql") public class NoSqlSubscribe implements DataSubscribeProvider { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java b/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java new file mode 100644 index 0000000..81a5324 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java @@ -0,0 +1,86 @@ +package com.casic.missiles.pojo; + +import lombok.Data; + +/** + * 协议 + */ +@Data +public class Msg { + + /** + * 前导码 + */ + private String preamble; + + /** + * 版本号 + */ + private String version; + + /** + * 内容长度 + */ + private int leng; + + /** + * 设备ID + */ + private String deviceId; + + /** + * 通讯方式 + */ + private Integer connType; + + /** + * 加密方式 + */ + private Integer encryType; + + /** + * 目标地址 + */ + private String destAddr; + + /** + * PDUType + */ + private String PDUType; + + /** + * 操作类型 + */ + private Integer operateType; + + /** + * 传输控制位 PDUType.bit7=0时,表示存在后续的访问;当PDUType.bit7=1时,表示无后续的访问。 + */ + private Integer transControlFlag; + + /** + * 设备类型 + */ + private Integer deviceType; + + /** + * 序号 + */ + private Integer seq; + + /** + * tagList + */ + private String tagList; + + /** + * OidList + */ + private String OidList; + + /** + * CRC + */ + private String CRC; + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java index 40a5265..97cc984 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java @@ -40,7 +40,7 @@ String httpContent = msg.toString(Charset.defaultCharset()); log.info(" String : " + msg.toString(Charset.defaultCharset())); String majorContent = httpContent.substring(httpContent.indexOf("{"), httpContent.lastIndexOf("}") + 1); - String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("serviceData")).get("Value")); + String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("RegistryData")).get("Value")); log.info("----------------------------------" + values); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); bufferContent.writeBytes(values.getBytes(Charset.forName("ISO-8859-1"))); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java index 1b132a7..e3ced4b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java @@ -35,7 +35,7 @@ String httpContent = msg.toString(Charset.defaultCharset()); log.info(" String : " + msg.toString(Charset.defaultCharset())); String majorContent = httpContent.substring(httpContent.indexOf("{"), httpContent.lastIndexOf("}") + 1); - String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("serviceData")).get("Value")); + String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("RegistryData")).get("Value")); log.info("----------------------------------" + values); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); bufferContent.writeBytes(values.getBytes(Charset.forName("ISO-8859-1"))); diff --git a/sensorhub-core/src/main/resources/application.properties b/sensorhub-core/src/main/resources/application.properties deleted file mode 100644 index 8b13789..0000000 --- a/sensorhub-core/src/main/resources/application.properties +++ /dev/null @@ -1 +0,0 @@ - diff --git a/sensorhub-core/src/main/resources/config/application-dev.yml b/sensorhub-core/src/main/resources/config/application-dev.yml index 4f897a8..dcc4c2d 100644 --- a/sensorhub-core/src/main/resources/config/application-dev.yml +++ b/sensorhub-core/src/main/resources/config/application-dev.yml @@ -4,9 +4,9 @@ spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true + url: jdbc:mysql://127.0.0.1:3306/sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true username: root - password: Casic203 + password: root session: store-type: redis redis: diff --git a/sensorhub-core/src/main/resources/config/application.yml b/sensorhub-core/src/main/resources/config/application.yml index ae89f9d..7965da1 100644 --- a/sensorhub-core/src/main/resources/config/application.yml +++ b/sensorhub-core/src/main/resources/config/application.yml @@ -30,6 +30,13 @@ port: 6379 password: ew5T4K3#203lwh config-prefix: 'Casic:' +#代码生成器配置 +code: + generate: + #作者 + author: cz + #待生成对象表名 + table-name: bussiness_field_config,combined_field_config sensorhub: config: port: 7091 diff --git a/sensorhub-support/pom.xml b/sensorhub-support/pom.xml index 9a71296..761601c 100644 --- a/sensorhub-support/pom.xml +++ b/sensorhub-support/pom.xml @@ -42,6 +42,12 @@ ${redis.version} + + com.baomidou + mybatis-plus-generator + ${mybatis-plus-generator.version} + + org.reflections diff --git a/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java b/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java new file mode 100644 index 0000000..515ca53 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java @@ -0,0 +1,14 @@ +package com.casic.missiles.enums; + +/** + * @author + * @date + */ +public interface FixedPropertyEnum { + + String FIXED_POSITION = "fixedPosition"; + + String TOTAL_LENGTH = "totalLength"; + + String TAIL_POSITION = "tailPosition"; +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/CombinedFieldMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CombinedFieldMapper.java new file mode 100644 index 0000000..38e8f42 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CombinedFieldMapper.java @@ -0,0 +1,15 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.CombinedFieldConfig; +import org.apache.ibatis.annotations.Mapper; + +/** + * @author cz + * + */ +@Mapper +public interface CombinedFieldMapper extends BaseMapper { + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java new file mode 100644 index 0000000..128b09d --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java @@ -0,0 +1,10 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.CommandEventConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface CommandEventMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java new file mode 100644 index 0000000..042eb3c --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.DatagramEventConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface DatagramEventConfigMapper extends BaseMapper { +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java new file mode 100644 index 0000000..fc95cf4 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java @@ -0,0 +1,8 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.FieldConfig; + +public interface FieldConfigMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldRuleConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldRuleConfigMapper.java new file mode 100644 index 0000000..b310a08 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldRuleConfigMapper.java @@ -0,0 +1,10 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.FieldRuleConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface FieldRuleConfigMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java new file mode 100644 index 0000000..9060a69 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.ProtocolConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface ProtocolConfigMapper extends BaseMapper { +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolFieldConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolFieldConfigMapper.java new file mode 100644 index 0000000..1b47180 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolFieldConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +public interface ProtocolFieldConfigMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java new file mode 100644 index 0000000..6fa6936 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.RuleConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface RuleConfigMapper extends BaseMapper { +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/AbstractFieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/AbstractFieldConfig.java new file mode 100644 index 0000000..ba9aea2 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/AbstractFieldConfig.java @@ -0,0 +1,38 @@ +package com.casic.missiles.pojo; + +import lombok.Data; + +@Data +public class AbstractFieldConfig { + /** + * 字段名称 + */ + private String fieldName; + /** + * 按照字段评估进行字段解析 + */ + private String ruleJson; + /** + * 起始位置(单位byte) + */ + private Integer OriginPositionByte; + /** + * 起始位置,是否需要bit位置(单位bit)小于8, 没有不需要填写 + */ + private String OriginPositionBit; + /** + * 偏移长度 + */ + private Integer offsetLength; + /** + * 偏移单位(bit/byte) + */ + private String offsetUnit; + /** + * 是否需要转存 + */ + private Integer isStorage; + + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/CombinedFieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/CombinedFieldConfig.java new file mode 100644 index 0000000..4f4de6a --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/CombinedFieldConfig.java @@ -0,0 +1,41 @@ +package com.casic.missiles.pojo; + +import lombok.Data; + +import java.util.Date; + +/** + * 组合配置 + * + * @author cz + * @date 20 + */ +@Data +public class CombinedFieldConfig { + + private Long id; + private Long ruleId; + /** + * 前缀编码 + */ + private String prefixCode; + + /** + * 字段动态的id + */ + private Long dynamicLengthId; + /** + * 对应的要解析字段的ids + */ + private String dataFieldIds; + + /** + * 字段动态的id + */ + private String combinedFieldIds; + + private Date lastTime; + + private Date createTime; + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldConfig.java index a07d20d..8304dc6 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldConfig.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldConfig.java @@ -5,31 +5,28 @@ import java.util.Date; +/** + * @author cz + * 1、该表与实际解析的内容实例解析有关 + * 2、该表字段是随机出现的,和帧结构无关,无法预料的 + * 3、该表字段解析根据FieldEvaluatorConfig进行字段解析 + */ @Data -@TableName("field_config") -public class FieldConfig { +@TableName("business_field_config") +public class FieldConfig extends AbstractFieldConfig { private Long id; -// private String preFieldConfig; - private Long protocolId; - - private String isFixed; - private String uploadDeliveryChange; - - private String replyRule; - private String ruleJson; - + /** + * 协议配置id + */ + private Long ruleId; + /** + * 字段名称 + */ private String fieldName; - private String isStorage; - private Integer orignPosition; - private String exactOrignPosition; - - private Integer offsetLength; - private String offsetUnit; private String ownerId; private Date createTime; private Date lastTime; - } diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldRuleConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldRuleConfig.java new file mode 100644 index 0000000..2e09879 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldRuleConfig.java @@ -0,0 +1,20 @@ +package com.casic.missiles.pojo; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +@TableName("field_rule_config") +@Data +public class FieldRuleConfig { + + private Long id; + private String name; + private String desc; + private String condition; + private String excuteOperation; + private Date lasTime; + private Date createTime; + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/Msg.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/Msg.java deleted file mode 100644 index 81a5324..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/Msg.java +++ /dev/null @@ -1,86 +0,0 @@ -package com.casic.missiles.pojo; - -import lombok.Data; - -/** - * 协议 - */ -@Data -public class Msg { - - /** - * 前导码 - */ - private String preamble; - - /** - * 版本号 - */ - private String version; - - /** - * 内容长度 - */ - private int leng; - - /** - * 设备ID - */ - private String deviceId; - - /** - * 通讯方式 - */ - private Integer connType; - - /** - * 加密方式 - */ - private Integer encryType; - - /** - * 目标地址 - */ - private String destAddr; - - /** - * PDUType - */ - private String PDUType; - - /** - * 操作类型 - */ - private Integer operateType; - - /** - * 传输控制位 PDUType.bit7=0时,表示存在后续的访问;当PDUType.bit7=1时,表示无后续的访问。 - */ - private Integer transControlFlag; - - /** - * 设备类型 - */ - private Integer deviceType; - - /** - * 序号 - */ - private Integer seq; - - /** - * tagList - */ - private String tagList; - - /** - * OidList - */ - private String OidList; - - /** - * CRC - */ - private String CRC; - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/PreRuleConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/PreRuleConfig.java deleted file mode 100644 index bfcf914..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/PreRuleConfig.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.casic.missiles.pojo; - -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -import java.util.Date; - -@Data -@TableName("pre_rule_config") -public class PreRuleConfig { - - private Long id; - private String protocolId; - private String ruleFieldId; - private String ownerId; - private Date createTime; - private Date lastTime; -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolConfig.java index 274ad42..bdac11f 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolConfig.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolConfig.java @@ -5,18 +5,52 @@ import java.util.Date; +/** + * 协议配置表,协议配置与帧结构有关 + * 1、层级关系,协议之后是规则,规则对应设备类型的各种上数规则 + * 2、规则对应协议配置的实例流程 + * 3、每种可根据设备类型和操作类型进行上数规则进行区分 + */ @Data @TableName("protocol_config") public class ProtocolConfig { private Long id; + /** + * 前导码 + */ private String preFix; - private String unpackId; - private String totalLengthId; - private String totalLengthFilterField; + /** + * 拆包id + */ + private Long unpackId; + /** + * 总长度id + */ + private Long totalLengthId; + /** + * + */ + private String totalLengthFilterFields; + /** + * 动态长度ids + */ private String dynamicLengthId; + /** + * 动态长度json(预留字段) + */ private String dynamicLengthJson; - private String tailStr; + /** + * 规则字段所解析预准备的字段 + */ + private String rulePrepareFields; + /** + * 结尾标志 + */ + private Long tailStr; + /** + * 备注 + */ private String remark; private String ownerId; private Date createTime; diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolFieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolFieldConfig.java new file mode 100644 index 0000000..db794bd --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolFieldConfig.java @@ -0,0 +1,43 @@ +package com.casic.missiles.pojo; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +/** + * 协议字段配置表 + * 该表用户存放帧结构固定格式的字段 + * 有以下两个用途 + * (1)、固定格式的字段可用于规则匹配 + * (2)、固定格式的字段可用于报文回复 + * @author cz + * @date 2023-06-09 + */ +@Data +@TableName("protocol_field_config") +public class ProtocolFieldConfig extends AbstractFieldConfig{ + + private Long id; + /** + * 协议配置id + */ + private Long protocolId; + /** + * 上传下发是否有变化, 没有变化,可以直接组装 + */ + private String isReplyFix; + /** + * 按照字段评估进行字段解析 + */ + private Long fieldEvaluatorId; + /** + * 回复规则 + */ + private String replyRule; + + private String ownerId; + private Date createTime; + private Date lastTime; + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java index 3b53493..febf835 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java @@ -6,18 +6,40 @@ import java.util.Date; /** - * 加密字段解析和规则有关,事件调到该流程下面 + * @author cz + * todo: 匹配协议对应业务实例 + * 1、一个协议可以多种的流程规则 + * 2、规则可以支持递归规则流程 */ @Data @TableName("rule_config") public class RuleConfig { - private Long id; private String protocolId; - private String isBizField; - private String parseRuleJson; + /** + * 是否完成规则配置,没有完成, + * 则需要根据规则继续匹配 + */ + private String isFinishMatch; + /** + * 待匹配解析规则 + * {“data_field”:"data_value"} + */ + private String matchRuleJson; + /** + * 待解析字段ids + */ private String dataFieldIds; - private String aviatorFilterJson; + + /** + * 待解析组合字段ids + */ + private String combinedFieldIds; + + /** + * aviator + */ + private String conditionExpression; private Date createTime; private Date lastTime; } diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleDict.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleDict.java deleted file mode 100644 index cc7f389..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleDict.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.casic.missiles.pojo; - -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -@Data -@TableName("rule_dict") -public class RuleDict { - - private Long id; - private Long pid; - private String name; - private String code; - private String ownerId; - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleEvaluator.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleEvaluator.java deleted file mode 100644 index ed16610..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleEvaluator.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.pojo; - -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -import java.util.Date; - -@TableName("rule_evaluator") -@Data -public class RuleEvaluator { - - private Long id; - private String name; - private String desc; - private String condition; - private String excuteOperation; - private Date lasTime; - private Date createTime; - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/CombinedFieldConfigRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/CombinedFieldConfigRegistry.java new file mode 100644 index 0000000..fa59b90 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/CombinedFieldConfigRegistry.java @@ -0,0 +1,12 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.CombinedFieldConfig; + +import java.util.List; + +public interface CombinedFieldConfigRegistry { + + List getCombinedFieldConfigList(Long ruleId); + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/CommandEventRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/CommandEventRegistry.java new file mode 100644 index 0000000..fb97d87 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/CommandEventRegistry.java @@ -0,0 +1,8 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.CommandEventConfig; + +public interface CommandEventRegistry { + + CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName); +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/DatagramEventRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/DatagramEventRegistry.java new file mode 100644 index 0000000..fb34641 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/DatagramEventRegistry.java @@ -0,0 +1,11 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.DatagramEventConfig; + +import java.util.List; + +public interface DatagramEventRegistry{ + + List getDatagramEventList(Long ruleId); + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/FieldConfigRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/FieldConfigRegistry.java new file mode 100644 index 0000000..759642e --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/FieldConfigRegistry.java @@ -0,0 +1,20 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.FieldConfig; + +import java.util.List; + +public interface FieldConfigRegistry { + + + List getFieldConfigList(Long ruleId); + + FieldConfig getFieldConfigById(String fieldId); + + List getFieldConfigs(String protocolId, Integer isFixed); + + List getStorageFieldConfig(String protocolId); + + +} + diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/FieldRuleConfigRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/FieldRuleConfigRegistry.java new file mode 100644 index 0000000..33da70c --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/FieldRuleConfigRegistry.java @@ -0,0 +1,11 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.FieldRuleConfig; + +import java.util.List; + +public interface FieldRuleConfigRegistry { + + List getFieldRuleConfigList(Long ruleId); + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/ProtocolConfigRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/ProtocolConfigRegistry.java new file mode 100644 index 0000000..1725189 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/ProtocolConfigRegistry.java @@ -0,0 +1,12 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.ProtocolConfig; + +import java.util.List; + +public interface ProtocolConfigRegistry { + + List getProtocolConfigList(String firstChar); + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java index 608af3a..32cc8a4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java @@ -2,48 +2,47 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.delivery.decorator.ByteDecorator; +import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @AllArgsConstructor public class FieldDecoratorManger { - private final RuleDictDao ruleDictDao; + private final RuleConfigRegistry ruleDictDao; // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 // (1)静态的业务字段是字典里面可以配置的 // (2)动态的业务字段是通过规则生成的 public String contentMerge(String ruleJson, String sceneConent, String dynamicContent) { - List ruleDictList = ruleDictDao.getRuleDictConfig(); - Map ruleDictMap = ruleDictList.stream().collect( - Collectors.toMap(RuleDict::getId, e -> e)); - List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); - for (Map ruleMap : ruleMapList) { - String ruleType = String.valueOf(ruleMap.get("ruleType")); - ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); - NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); - byteDecorator.nodeDecoratorRule(nodeDecoratorParm); - } +// List ruleDictList = ruleDictDao.getRuleDictConfig(); +// Map ruleDictMap = ruleDictList.stream().collect( +// Collectors.toMap(RuleDict::getId, e -> e)); +// List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); +// for (Map ruleMap : ruleMapList) { +// String ruleType = String.valueOf(ruleMap.get("ruleType")); +// ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); +// NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); +// byteDecorator.nodeDecoratorRule(nodeDecoratorParm); +// } return null; } - - private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { - NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() - .contents(sceneConent) - .dynamicContent(dynamicContent) - .ruletypeId(ruletypeId) - .ruleDictMap(ruleDictMap) - .build(); - return nodeDecoratorParm; - } +// +// private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { +// NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() +// .contents(sceneConent) +// .dynamicContent(dynamicContent) +// .ruletypeId(ruletypeId) +// .ruleDictMap(ruleDictMap) +// .build(); +// return nodeDecoratorParm; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java index 652970c..b204ac3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java @@ -1,56 +1,56 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@AllArgsConstructor -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", - JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Component; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Component("logicalDecorator") +//@AllArgsConstructor +//@Slf4j +//public class LogicalShiftDecorator implements ByteDecorator { +// +//// private final FieldRuleEngineMapper fieldRuleEngineMapper; +//// +//// //字节位移 +//// @Override +//// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +//// String logicalValue = ""; +//// RuleEvaluator fieldRuleEngine = new RuleEvaluator(); +//// try { +//// Map env2 = new HashMap(); +//// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +//// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +//// for (String contentId : contentIdList) { +//// RuleDict ruleDict = ruleDictMap.get(contentId); +//// if (ruleDict.getCode().contains("#")) { +//// //使用动态的值 +//// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +//// } +//// env2.put(ruleDict.getName(), ruleDict.getCode()); +//// } +//// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +//// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +//// return null; +//// } +//// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +//// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +//// return values; +//// } catch (Exception ex) { +//// log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", +//// JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +//// return null; +//// } +//// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java index 346468f..822fead 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@AllArgsConstructor -@Slf4j -public class OperationDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("optionDecorator") +//@AllArgsConstructor +//@Slf4j +//public class OperationDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //混合运算,有常量或者乘除的缩放 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java index 50fb0a7..7a8bccb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@AllArgsConstructor -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +////精度计算 +//@AllArgsConstructor +//@Registry("precisionDecorator") +//@Slf4j +//public class PrecisionDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java index da39235..27f9cc7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java @@ -1,54 +1,53 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@AllArgsConstructor -@Slf4j -public class RuleDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("ruleDecorator") +//@AllArgsConstructor +//@Slf4j +//public class RuleDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //吃我一套正则表达式 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (Exception ex) { +// log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java index 7f5cbf3..c043f97 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java @@ -2,6 +2,6 @@ import java.util.Map; -public interface ComandeEventService { +public interface ComandeEventService{ Map loadComandeEventConfig(String protocolId,String scene); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java index 476ad84..aaf1837 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java @@ -2,46 +2,46 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.dao.CommandEventDao; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @Slf4j @AllArgsConstructor -public class ComandeEventServiceImpl implements ComandeEventService { +public class ComandeEventServiceImpl implements ComandeEventRegistry { - private final CommandEventDao commandEventDao; + // private final CommandEventDao commandEventDao; // 加密bean 固定字段出现变化的字段解析,业务字段的有序内容 @Override - public Map loadComandeEventConfig(String protocolId,String sceneName) { - CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); - if (ObjectUtil.isEmpty(commandEventConfig)) { - log.error("协议{},没有配置成功接收回复配置,清排查原因"); - return null; - } - String replyJson = commandEventConfig.getReplyContentJson(); - List> replyMapList = JSONArray.parseObject(replyJson, List.class); - List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); - Map fixMap = fixList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); - List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) - .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) - .collect(Collectors.toList()); - Map commandConfigMap = new HashMap<>(); - commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); - commandConfigMap.put("fixContent", fixMap); - commandConfigMap.put("bizContent", contentList); - return commandConfigMap; + public Map loadComandeEventConfig(String protocolId, String sceneName) { +// CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); +// if (ObjectUtil.isEmpty(commandEventConfig)) { +// log.error("协议{},没有配置成功接收回复配置,清排查原因"); +// return null; +// } +// String replyJson = commandEventConfig.getReplyContentJson(); +// List> replyMapList = JSONArray.parseObject(replyJson, List.class); +// List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); +// Map fixMap = fixList.stream() +// .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); +// List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) +// .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) +// .collect(Collectors.toList()); +// Map commandConfigMap = new HashMap<>(); +// commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); +// commandConfigMap.put("fixContent", fixMap); +// commandConfigMap.put("bizContent", contentList); +// return commandConfigMap; + return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 128b09d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java deleted file mode 100644 index 4016b0b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface DatagramEventMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java deleted file mode 100644 index 597c306..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.apache.ibatis.annotations.Mapper; - -public interface FieldConfigMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java deleted file mode 100644 index a31680a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.PreRuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface PreRuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java deleted file mode 100644 index 9060a69..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface ProtocolConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java deleted file mode 100644 index 6fa6936..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java deleted file mode 100644 index 582a705..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleDict; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleDictMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java deleted file mode 100644 index 6e302c8..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.CommandEventMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Optional; - -@Component -public class CommandEventDao { - - @Resource - private CommandEventMapper commandEventMapper; - - public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId) - .eq("scene", sceneName) - .eq("enabled", 1); - List commandEventConfig = commandEventMapper.selectList(queryWrapper); - Optional optionalEventConfig = commandEventConfig.stream().findFirst(); - return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java deleted file mode 100644 index 9137e4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.FieldConfigMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class FieldConfigDao { - - @Resource - private FieldConfigMapper fieldConfigMapper; - - public FieldConfig getFieldConfigById(String fieldId) { - FieldConfig fieldConfig = fieldConfigMapper.selectById(fieldId); - return fieldConfig; - } - - public List getFieldConfigs(String protocolId,Integer isFixed) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",isFixed); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - - public List getStorageFieldConfig(String protocolId) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",1) - .eq("is_storage",1); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java deleted file mode 100644 index 67bff6b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.mapper.PreRuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class PreRuleConfigDao { - - @Resource - private PreRuleConfigMapper preRuleConfigMapper; - - public List getPreRuleList(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return preRuleConfigMapper.selectList(queryWrapper); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java deleted file mode 100644 index d69ea85..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.RuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleConfigDao { - - @Resource - private RuleConfigMapper ruleConfigMapper; - - public RuleConfig getNextRuleConfig(String ruleFields) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("parse_rule_json", ruleFields); - return ruleConfigMapper.selectOne(queryWrapper); - } - - - public List getRuleConfigById(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return ruleConfigMapper.selectList(queryWrapper); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java deleted file mode 100644 index 932c185..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.RuleDictMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleDictDao { - - @Resource - private RuleDictMapper ruleDictMapper; - - public List getRuleDictConfig() { - List ruleDictList = ruleDictMapper.selectList(null); - return ruleDictList; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java index 9f9e279..43bc4d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java @@ -10,20 +10,15 @@ import io.netty.channel.socket.nio.NioServerSocketChannel; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import javax.annotation.PreDestroy; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static cn.hutool.core.util.ClassUtil.getClasses; /** * SensorhubServer netty服务端 */ @Slf4j -@Service +@Component public class SensorhubServer { /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java index 2c79ff5..9a28c36 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java @@ -11,13 +11,13 @@ import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioSocketChannel; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClient 客户端 */ @Slf4j -@Service +@Registry public final class SensorhubClient { public static void main(String[] args) throws Exception { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java index 9774be0..477c3f7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java @@ -6,12 +6,12 @@ import io.netty.channel.socket.SocketChannel; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientChannelInitialHandler */ -@Service +@Registry public class SensorhubClientChannelInitialHandler extends ChannelInitializer { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java index 346f4b3..73560e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java @@ -5,13 +5,13 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientHandler */ @Slf4j -@Service +@Registry public class SensorhubClientHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java index 5c1c6f2..d990af5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java @@ -4,12 +4,12 @@ import com.casic.missiles.pojo.Msg; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** * SensorhubServerHandler */ -@Service +@Component public class SensorhubServerHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 67283ae..af3172c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,41 +1,37 @@ package com.casic.missiles.parser; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultProtocolConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.*; +import com.casic.missiles.registry.FieldConfigRegistry; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; -import java.nio.charset.Charset; import java.util.HashMap; import java.util.List; import java.util.Map; -@Service("genericProtocolParser") +/** + * @author + */ +@Component("genericProtocolParser") @Slf4j -@AllArgsConstructor +@RequiredArgsConstructor public class GenericProtocolParser implements ProtocolParser { - private final LeadingCodeMatcher leadingCodeMatcher; private final List frameStructDispenserList; - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorInstanceSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; // 匹配首字母前导码=> 帧结构匹配前导码=> // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 @@ -44,18 +40,19 @@ public Boolean doParseProtocol(ByteBuf byteBuf) { String protocolContent = ByteBufUtil.hexDump(byteBuf); //匹配前导码 - List preCodeConfigs = leadingCodeMatcher.matchLeadingCode(protocolContent); + List preCodeConfigs = LeadingCodeMatcher.matchFrameLeadingCode(protocolContent); //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 if (preCodeConfigs.size() == 0) { - return rematch(byteBuf,protocolContent); + return rematch(byteBuf, protocolContent); } - //暂时先取第一个 + //暂时先取第一个,提升速度,使用享元模式, 减少类的创建销毁与构建 ProtocolConfig protocolConfig = preCodeConfigs.get(0); + AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); ByteBuf wholeDatagramByte = null; //通过匹配帧结构获取完整的数据包 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, preCodeConfigs.get(0))) != null) { + if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, protocolFactory)) != null) { break; } } @@ -68,76 +65,78 @@ * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 */ - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId, wholeDatagramByte); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap, protocolId); - //选取规则对应的流程实例 - DatagramEventConfig datagramEventConfig = processorInstanceSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); + //进行规则字段解析,进行匹配规则 + RuleConfig ruleConfig = getRuleConfig(protocolFactory, wholeDatagramByte); + if (ruleConfig == null) { + return false; + } //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, wholeDatagramByte); + ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte); + //以下进行业务的规则解析,同时选定流程实例 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); + DatagramEventProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain, + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText, protocolId); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain); //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); + datagramEventProvider.storeData(bizDataMap); return true; } - private Boolean rematch(ByteBuf byteBuf,String protocolContent) { + /** + * 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 + */ + private Boolean rematch(ByteBuf byteBuf, String protocolContent) { //重置位判断 byteBuf.resetReaderIndex(); //判断重置是否前移,如果没有前移,则直接判为匹配失败 if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { return false; } else { + //递归执行 return doParseProtocol(byteBuf); } } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; + //获取匹配规则->匹配规则 + private RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + //取出其中参与逻辑provider并判空 + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); + String rulePrepareFields = protocolConfig.getRulePrepareFields(); + //固定字段 + if (StringUtils.isNotEmpty(rulePrepareFields)) { + //获取统一固定字段解析 + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + //获取该协议的字段配置,用于协议规则匹配 + List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); + //获取规则 + RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, + rulePrepareFields, protocolFieldConfigs); + return ruleConfig; + } + return null; } - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + //数据构建,获取固定字段的store和业务字段store + private Map buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + Map bizDataMap = new HashMap<>(); + Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); + Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); + bizDataMap.putAll(ruleStoreObjectMap); + bizDataMap.putAll(protocolStoreObjectMap); return bizDataMap; } - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java index 8a46e32..16ce2e5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java @@ -3,6 +3,7 @@ import io.netty.buffer.ByteBuf; public interface ProtocolParser { + Boolean doParseProtocol(ByteBuf byteBuf); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java new file mode 100644 index 0000000..f7814af --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java @@ -0,0 +1,35 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.ProtocolConfigProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.ProtocolConfig; + +/** + * 存放基本协议的的加载信息 + */ +public class AbstractProtocolConfigFactory { + private final ProtocolConfigProvider protocolConfigProvider; + private final ProtocolFieldConfigProvider protocolFieldConfigProvider; + private final RuleConfigProvider ruleConfigProvider; + + public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { + this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); + this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); + this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); + } + + public ProtocolConfigProvider getProtocolConfigProvider() { + return protocolConfigProvider; + } + + public ProtocolFieldConfigProvider getProtocolFieldConfigProvider() { + return protocolFieldConfigProvider; + } + + public RuleConfigProvider getRuleConfigProvider() { + return ruleConfigProvider; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java new file mode 100644 index 0000000..6e36147 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java @@ -0,0 +1,57 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.CombinedFieldConfigProvider; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.FieldConfigProvider; +import com.casic.missiles.parser.provider.FieldRuleConfigProvider; + +/** + * 存放规则相关的的的加载信息 + */ +public class AbstractRuleConfigFactory { + + /** + * 处理字节 + */ + private final FieldConfigProvider fieldConfigProvider; + /** + * 处理组合字节解析的解码器 + */ + private final CombinedFieldConfigProvider combinedFieldConfigProvider; + /** + * 处理负责字节解析的规则配置 + */ + private final FieldRuleConfigProvider fieldRuleConfigProvider; + /** + * 处理实例流程 + */ + private final DatagramEventProvider datagramEventProvider; + + + public AbstractRuleConfigFactory(Long ruleId) { + this.fieldConfigProvider = new FieldConfigProvider(ruleId); + this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); + this.fieldRuleConfigProvider = new FieldRuleConfigProvider(ruleId); + this.datagramEventProvider = new DatagramEventProvider(ruleId); + } + + public FieldConfigProvider getFieldConfigProvider() { + return fieldConfigProvider; + } + + public CombinedFieldConfigProvider getCombinedFieldConfigProvider() { + return combinedFieldConfigProvider; + } + + public FieldRuleConfigProvider getFieldRuleConfigProvider() { + return fieldRuleConfigProvider; + } + + public DatagramEventProvider getDatagramEventProvider() { + return datagramEventProvider; + } + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java deleted file mode 100644 index 6e1719a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.factory; - - -import com.casic.missiles.pojo.ProtocolConfig; - -import java.util.List; - -/** - * 数据库访问优化(暂时未做) - *

- * 1、初始化协议解析配置,并存放到处存放缓存,对协议基本配置进行管理 - * 2、其中流程中所有的配置都经过此类进行管理,进行调用获取,增强解析速度 - */ -public interface DatagramFactory { - - /** - * 初始化 - */ - List datagramInit(); - - /** - * 根据前导码配置匹配,模糊匹配获取所有的报文项 - */ - List match(); - - /** - * 根据前导码匹配,返回报文项 - */ - List filer(); - - /** - * 保证数据的唯一性选择器 - */ - List selectOne(); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java new file mode 100644 index 0000000..87444a0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java @@ -0,0 +1,18 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +import java.util.List; + +/** + * 直接用,还是边用边创建 + */ +public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { + + + public DefaultProtocolConfigFactory(ProtocolConfig protocolConfig) { + super(protocolConfig); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java new file mode 100644 index 0000000..cce0c7c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java @@ -0,0 +1,12 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; + +public class DefaultRuleFactory extends AbstractRuleConfigFactory { + + public DefaultRuleFactory(Long ruleId) { + super(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java deleted file mode 100644 index 9ee97e0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.casic.missiles.parser.instance; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service -@Slf4j -@AllArgsConstructor -public class GeneralProcessor { - - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; - - /** - * 统一固定字段解析=>进行规则的查询的判断 - * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 - * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 - */ - @Deprecated - public boolean parseWholeDatagram(ByteBuf buffer, ProtocolConfig protocolConfig) { - try { - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap,protocolId); - //选取规则对应的流程= - DatagramEventConfig datagramEventConfig = processorSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); - //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); - //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); - //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); - //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); - //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); - return true; - } catch (Exception ex) { - log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", - ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); - return false; - } - } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; - } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); - } - - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); - return bizDataMap; - } - - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java index 25e7ad8..6a5777e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java @@ -1,23 +1,31 @@ package com.casic.missiles.parser.instance.impl; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.mapper.DatagramEventMapper; import com.casic.missiles.pojo.DatagramEventConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.SpringContextUtil; -@Service -@AllArgsConstructor +import java.util.List; +import java.util.Optional; + +/** + * @author cz + * + */ public class DefaultProcessorInstanceSelector implements ProcessorInstanceSelector { - private final DatagramEventMapper datagramEventMapper; + private static List datagramEventConfigs; + + static { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + datagramEventConfigs = datagramEventRegistry.getDatagramEventList(); + } @Override public DatagramEventConfig getProcessorInstance(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("rule_id", protocolId); - return datagramEventMapper.selectOne(queryWrapper); + Optional optionalSelectInstance = datagramEventConfigs.stream() + .filter(e -> e.getId().equals(protocolId)).limit(1).findFirst(); + return optionalSelectInstance.isPresent() ? optionalSelectInstance.get() : null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a778671..7b56a43 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,16 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import io.netty.buffer.ByteBuf; /** - * 分析匹配情况 - * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 - * 2、匹配不成功,有后续帧,可以进行下次匹配。 - * 3、匹配不成功,无后续帧,可以进行丢弃。 + * 分析匹配情况 + * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 + * 2、匹配不成功,有后续帧,可以进行下次匹配。 + * 3、匹配不成功,无后续帧,可以进行丢弃。 */ -public interface FrameStructMatcher{ +public interface FrameStructMatcher { - ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig); + ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 05320ab..8ebea78 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,23 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.ProtocolConfigMapper; +import com.casic.missiles.parser.provider.ProtocolConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Component; import java.util.List; import java.util.stream.Collectors; -@Component -@AllArgsConstructor public class LeadingCodeMatcher { - private final ProtocolConfigMapper protocolMapper; - //** 1、首字母匹配前导码, // 2、以匹配出的前导码是否在报文中条件进行前导码的匹配二次筛选 - public List matchLeadingCode(String protocolContent){ + public static List matchFrameLeadingCode(String protocolContent){ List initialConfigs = initialMatch(protocolContent); List preCodeConfigs = initialConfigs.stream() .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) @@ -26,13 +19,16 @@ } //初始化匹配前导码内容 - private List initialMatch(String protocolContent) { - String protocolStr = protocolContent.charAt(0) + ""; - QueryWrapper queryWrapper = new QueryWrapper() - .likeRight("pre_fix", protocolStr); - List protocolConfigList = protocolMapper.selectList(queryWrapper); - return protocolConfigList; + private static List initialMatch(String protocolContent) { + String firstFrameChar = protocolContent.charAt(0) + ""; + ProtocolConfigProvider protocolConfigProvider=new ProtocolConfigProvider(firstFrameChar); + return protocolConfigProvider.getMatchList(); } + + + + + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index cf2113d..e915877 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -1,32 +1,35 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(0) -@Service +@Component public class FrameLengthMatcher implements FrameStructMatcher { - @Autowired - private FieldParser fieldParser; - //超过长度 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { String dataGramContent = ByteBufUtil.hexDump(byteBuf); - if (StringUtils.isEmpty(protocolConfig.getUnpackId()) && StringUtils.isEmpty(protocolConfig.getTailStr())) { - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + //当不存在结尾标志和拆包标志,可以直接使用长度进行匹配 + if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { if (dataGramContent.length() >= totalLength) {//等于长度返回true,超出长度,切断 - ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, protocolConfig, totalLength); + ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, totalLength); return wholeDatagramByte; } else { //读的标志位前移舍弃 @@ -38,7 +41,7 @@ return null; } - private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, Integer totalLength) { byteBuf.readBytes(totalLength); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, totalLength - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 2bfc213..d527ad0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; @@ -13,7 +13,7 @@ import lombok.AllArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.nio.charset.Charset; import java.util.Map; @@ -22,32 +22,30 @@ * 后续标志验证 */ @Order(1) -@Service +@Component @AllArgsConstructor -public class FrameMarkMatcher implements FrameStructMatcher { - - private final FieldConfigDao fieldConfigDao; - private final FieldParser fieldParser; - private final FieldResolver fieldResolverManger; +public class FrameMarkMatcher implements FrameStructMatcher, FixedPropertyEnum { //帧后续标志=>结束,进行帧的重组=>有后续,1、帧移位判别 2、继续接收帧 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig UnpackConfig = StringUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getUnpackId()); - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); - Integer upback = 0; + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); ByteBuf mergeWholeFrameByte = null; - if (!ObjectUtil.isEmpty(UnpackConfig)) { - while (hasNextFullFrame(byteBuf, protocolConfig)) { - upback = (Integer) fieldResolverManger.filedParserManger(byteBuf, UnpackConfig, null); + if (!ObjectUtil.isEmpty(unpackFlag)) { + while (hasNextFullFrame(byteBuf, protocolConfig, protocolFieldConfigProvider)) { //是否存在后续位 - if (upback == 1) {//使用esayRule + if (unpackFlag == 1) {//使用esayRule //表示可以截取 - mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolConfig, totalLength); + mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolFieldConfigProvider, protocolConfig); return mergeWholeFrameByte; } else { - byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig)); + byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig, protocolFieldConfigProvider)); } } } @@ -56,7 +54,8 @@ //选取第一个帧,将业务内容和后面部分分开 //计算数据报文-业务内容 - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolFieldConfigProvider protocolFieldConfigProvider, ProtocolConfig protocolConfig) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); //截取完整报文 byteBuf.readBytes(totalLength); ByteBuf byteBufContent = byteBuf.slice(0, byteBuf.readerIndex()); @@ -68,15 +67,15 @@ String tail = ""; System.out.println(ByteBufUtil.hexDump(byteBufContent)); //会存在多个帧拼接在一起的的情况,进行合并处理 - while (hasNextFullFrame(byteBufContent, protocolConfig)) { - Integer currentFrameLength = fieldParser.getTotalLength(protocolConfig, byteBufContent); + while (hasNextFullFrame(byteBufContent, protocolConfig, protocolFieldConfigProvider)) { + Integer currentFrameLength = protocolFieldConfigProvider.getTotalLength(byteBufContent, protocolConfig); byteBufContent.readBytes(currentFrameLength); ByteBuf currentbyteBuf = byteBufContent.slice(0, byteBufContent.readerIndex()); byteBufContent.markReaderIndex();//读的标志位前移 System.out.println(ByteBufUtil.hexDump(byteBufContent)); String hexDump = currentbyteBuf.toString(Charset.forName("ISO-8859-1")); //获取当前固定帧结构的关系map - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, currentbyteBuf); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(currentbyteBuf, protocolConfig); if (StringUtils.isEmpty(mergeFrameStr)) { //首次获取业务数据报文 mergeFrameStr += hexDump.substring(0, currentFrameFixedProperty.get("tailPosition")); @@ -95,22 +94,22 @@ /** * 获取平移到下一帧起始位置 */ - public int getNextFrameOffset(ByteBuf buffer, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, buffer); - return currentFrameFixedProperty.get("totalLength"); + public int getNextFrameOffset(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + return currentFrameFixedProperty.get(TOTAL_LENGTH); } /** * 判断是否出错进行整个帧的 */ - public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, byteBuf); + public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); //保证读取位置不在固定位置,是可变的业务内容 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("fixedPosition")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(FIXED_POSITION)) { return false; } //判断读取是否操作帧长度 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("totalLength")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(TOTAL_LENGTH)) { return false; } return true; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 76a3784..c3a1bab 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -1,50 +1,50 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.parser.instance.GeneralProcessor; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; +import io.netty.buffer.ByteBufUtil;; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(2) -@Service +@Component public class FrameTailMatcher implements FrameStructMatcher { - @Resource - private FieldConfigDao fieldConfigDao; - @Autowired - private GeneralProcessor generalProcessor; - //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig tailFieldConfig = StringUtils.isEmpty(protocolConfig.getTailStr()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getTailStr()); - if (!ObjectUtil.isEmpty(tailFieldConfig)) { - String tailStr = tailFieldConfig.getFieldName(); + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfig protocolFieldConfig = ObjectUtils.isEmpty(protocolConfig.getTailStr()) ? null : + fieldConfigProvider.getFieldConfigById(protocolConfig.getTailStr()); + if (!ObjectUtil.isEmpty(protocolFieldConfig)) { + String tailStr = protocolFieldConfig.getFieldName(); String dataGramContent = ByteBufUtil.hexDump(byteBuf); Boolean tailFlag = ByteBufUtil.hexDump(byteBuf).contains(tailStr); if (!tailFlag) { //使用esayRule return null; } else if (dataGramContent.indexOf(tailStr) < dataGramContent.length() - tailStr.length()) { Integer length = dataGramContent.indexOf(tailStr) + tailStr.length(); - ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, protocolConfig, length); + ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, length); return wholeDatagramByte; //存在粘包 } } return null; } - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer length) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, Integer length) { byteBuf.readBytes(length); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, length - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java new file mode 100644 index 0000000..5f1c177 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java @@ -0,0 +1,73 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.combined.GenericCombinedFieldResolver; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.CombinedFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class CombinedFieldConfigProvider { + + + /** + * 作为临时配置列表缓存使用 + */ + private final List combinedFieldConfigList; + private Map storeObjectMap = new HashMap<>(); + + public CombinedFieldConfigProvider(Long ruleId) { + CombinedFieldConfigRegistry combinedFieldConfigRegistry = SpringContextUtil.getBean(CombinedFieldConfigRegistry.class); + combinedFieldConfigList = combinedFieldConfigRegistry.getCombinedFieldConfigList(ruleId); + } + + public void parseDataField(RuleConfig ruleConfig, String clearZeroPlain,Map fieldConfigsMap ) { + if (showSkip()) { + return; + } + //匹配对应的数据,然后进行相关的字段解析 + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver(); + combinedFieldResolver.parseDataField(combinedFieldConfigList, byteBuf, storeObjectMap,fieldConfigsMap); + } + + + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getCombinedFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return combinedFieldConfigList.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public List getCombinedFieldConfigList() { + return combinedFieldConfigList; + } + + /* 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(combinedFieldConfigList) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java new file mode 100644 index 0000000..f3cfedc --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java @@ -0,0 +1,11 @@ +package com.casic.missiles.parser.provider; + +/** + * @author cz + * @date 2023-6-12 + */ +public class CommandEventProvider{ + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java new file mode 100644 index 0000000..70eec5e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java @@ -0,0 +1,77 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.safe.SafeStrategy; +import com.casic.missiles.parser.sender.DataSubscribeProvider; +import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class DatagramEventProvider { + + private final DatagramEventConfig processorInstance; + + public DatagramEventProvider(Long ruleId) { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + List datagramEventConfigList = + datagramEventRegistry.getDatagramEventList(ruleId); + processorInstance = this.getProcessorInstance(datagramEventConfigList); + } + + public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { + if (showSkip()) { + return null; + } + return datagramEventConfigList.get(0); + } + + // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 + public String getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap) { + String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? + processorInstance.getSafeBean() : + fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); + if (!StringUtils.isEmpty(safeName)) { + //需要加密 + SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); + String plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); + return clearComplementZero(plain); + } + return ByteBufUtil.hexDump(bizDataContent); + } + + //解密清零操作 + private String clearComplementZero(String plain) { + plain = plain.substring(0, plain.lastIndexOf("00")); + return plain; + } + + //数据发送,数据发送者暂未构建 + public void storeData(Map bizDataMap) { + DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); +// dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return ObjectUtils.isNotEmpty(processorInstance) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java new file mode 100644 index 0000000..7e1fe0a --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java @@ -0,0 +1,97 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.FieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class FieldConfigProvider { + + + private final List fieldConfigs; + private Map storeObjectMap = new HashMap<>(); +// private Map singleObjects = new ConcurrentHashMap<>(); + + public FieldConfigProvider(Long ruleId) { + FieldConfigRegistry fieldConfigRegistry = SpringContextUtil.getBean(FieldConfigRegistry.class); + fieldConfigs = fieldConfigRegistry.getFieldConfigList(ruleId); + } + + public List getFieldConfigs() { + return fieldConfigs; + } + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public Map parseDataField(RuleConfig ruleConfig, String clearZeroPlain) { + if (showSkip()) { + return null; + } + List prepareFieldConfig = prepareParseField(ruleConfig); + if (CollectionUtils.isNotEmpty(prepareFieldConfig)) { + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(fieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + return fixDataMap; + } + } + return null; + } + + /** + * 得到需要处理的业务内容 + * + * @return + */ + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return fieldConfigs.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public Map getFieldConfigsMap() { + return fieldConfigs.stream().collect( + Collectors.toMap(FieldConfig::getId, e -> e) + ); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(fieldConfigs) ? false : true; + } + + +} + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java new file mode 100644 index 0000000..817bfaf --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java @@ -0,0 +1,19 @@ +package com.casic.missiles.parser.provider; + +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.registry.FieldRuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; + +public class FieldRuleConfigProvider { + + private final List fieldRuleConfigList; + + public FieldRuleConfigProvider(Long ruleId) { + FieldRuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(FieldRuleConfigRegistry.class); + fieldRuleConfigList = ruleConfigRegistry.getFieldRuleConfigList(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java new file mode 100644 index 0000000..99a1b06 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java @@ -0,0 +1,53 @@ +package com.casic.missiles.parser.provider; + + +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.registry.ProtocolConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolConfigProvider { + + private final List protocolConfigList; + + public ProtocolConfigProvider(String firstChar) { + ProtocolConfigRegistry registry = SpringContextUtil.getBean(ProtocolConfigRegistry.class); + protocolConfigList = registry.getProtocolConfigList(firstChar); + } + + public List getMatchList() { + return protocolConfigList; + } + + /** + * 设置当前协议 + * + * @param protocolConfig + */ + public ProtocolConfigProvider(ProtocolConfig protocolConfig) { + List protocolConfigs = new ArrayList<>(); + protocolConfigs.add(protocolConfig); + protocolConfigList = protocolConfigs; + } + + /** + * 获取当前协议 + * + * @return + */ + public ProtocolConfig getCurrentProtocolConfig() { + if (this.protocolConfigList == null) { + return null; + } else { + return protocolConfigList.get(0); + } + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java new file mode 100644 index 0000000..043927d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java @@ -0,0 +1,213 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.registry.ProtocolFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolFieldConfigProvider { + + private static final String FIXED_FIELD_DS = "fixedFieldDs"; + private static final String CONTENT_FIELD_DS = "contentFieldDs"; + private static final String PROTOCOL_LENGTH = "protocolLength"; + private static final String PROTOCOL_FIELD_ID = "protocolFieldId"; + private static final String PROTOCOL_POSITION = "protocolPosition"; + + private final List protocolFieldConfigs; + private Map singleObjects = new ConcurrentHashMap<>(); + private Map storeObjectMap = new HashMap<>(); + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public ProtocolFieldConfigProvider(Long protocolId) { + ProtocolFieldConfigRegistry protocolFieldConfigRegistry = SpringContextUtil.getBean(ProtocolFieldConfigRegistry.class); + protocolFieldConfigs = protocolFieldConfigRegistry.getProtocolFieldConfigList(protocolId); + } + + public List getProtocolFieldConfigs() { + return protocolFieldConfigs; + } + + public ProtocolFieldConfig getFieldConfigById(Long fieldId) { + Optional optionalConfig = protocolFieldConfigs.stream().filter( + e -> e.getId().equals(fieldId) + ).findFirst(); + return optionalConfig.isPresent() ? optionalConfig.get() : null; + } + + public Integer getProtocolFieldValue(Long protocolFieldId, ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_FIELD_ID + protocolFieldId + ByteBufUtil.hexDump(byteBuf); + //获取缓存 + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + //加载固定长度数据集合 + Map fixDataMap = this.getProtocolDataMap(byteBuf); + ProtocolFieldConfig protocolFieldConfig = selectFieldConfig(protocolFieldId); + Integer protocolFieldValue = 0; + //获取约定字段的总长度 + if (fixDataMap.containsKey(protocolFieldConfig.getFieldName())) { + Object appointUnpackObject = fixDataMap.get(protocolFieldConfig.getFieldName()); + if (ObjectUtils.isNotEmpty(appointUnpackObject)) { + protocolFieldValue = (Integer) appointUnpackObject; + } + } + if (protocolFieldValue != null) { + //加入缓存 + if (ObjectUtils.isNotEmpty(protocolFieldValue)) { + this.singleObjects.put(catchKey, protocolFieldValue); + return protocolFieldValue; + } + } + return null; + } + + /** + * 获取帧固定位置信息 + * + * @param byteBuf + * @param protocolConfig + * @return + */ + public Map getFixedProperty(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_POSITION + protocolConfig.getId(); + if (this.singleObjects.containsKey(catchKey)) { + return (Map) singleObjects.get(catchKey); + } + Map fixedPropertyMap = new HashMap<>(); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + fixedPropertyMap = fieldParser.doGetFixedProperty(protocolFieldConfigs, this.getTotalLength(byteBuf,protocolConfig)); + if (CollectionUtils.isNotEmpty(fixedPropertyMap)) { + this.singleObjects.put(catchKey, fixedPropertyMap); + return fixedPropertyMap; + } + return fixedPropertyMap; + } + + /** + * 获取帧结构应有的总长度 + */ + public Integer getTotalLength(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_LENGTH + ByteBufUtil.hexDump(byteBuf); + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + Integer appointFrameLength = getProtocolFieldValue(protocolConfig.getTotalLengthId(), byteBuf); + if (appointFrameLength != null) { + //获取过滤的字段集合总长度 + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Integer totalFilterLength = fieldParser.getTotalFilterLength(protocolConfig, byteBuf, getFixFieldConfigMap()); + //计算总长度 + Integer totalLength = appointFrameLength + totalFilterLength; + //加入缓存 + if (ObjectUtils.isNotEmpty(totalLength)) { + this.singleObjects.put(catchKey, totalLength); + return totalLength; + } + } + return null; + } + + /** + * 获取协议有关字段解析内容 + * storeObjectMap存储代转存的数据 + * + * @return + */ + public Map getProtocolDataMap(ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(FIXED_FIELD_DS)) { + return (Map) singleObjects.get(FIXED_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(protocolFieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + this.singleObjects.put(FIXED_FIELD_DS, fixDataMap); + return fixDataMap; + } + return null; + } + + /** + * 获取业务报文内容的content字节 + * + * @param wholeDatagramByte + * @return + */ + public ByteBuf getDataContentBuf(ByteBuf wholeDatagramByte) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(CONTENT_FIELD_DS)) { + return (ByteBuf) singleObjects.get(CONTENT_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + ByteBuf bizDataByteBuf = fieldParser.getDataContentBuf(protocolFieldConfigs, wholeDatagramByte); + if (bizDataByteBuf != null) { + this.singleObjects.put(CONTENT_FIELD_DS, bizDataByteBuf); + return bizDataByteBuf; + } + return null; + } + + + private ProtocolFieldConfig selectFieldConfig(Long id) { + Optional optionalProtocolFieldConfig = this.protocolFieldConfigs.stream().filter( + e -> e.getId().equals(id) + ).findFirst(); + return optionalProtocolFieldConfig.isPresent() ? optionalProtocolFieldConfig.get() : null; + } + + + private Map getFixFieldConfigMap() { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, e -> e) + ); + return fixDataFieldMap; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(protocolFieldConfigs) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java new file mode 100644 index 0000000..dafba1c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java @@ -0,0 +1,56 @@ +package com.casic.missiles.parser.provider; + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.rule.GenericRuleResolver; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.RuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleConfigProvider { + + private final List ruleConfigs; + + public List getRuleConfigs() { + return ruleConfigs; + } + + public RuleConfigProvider(Long protocolId) { + RuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(RuleConfigRegistry.class); + ruleConfigs = ruleConfigRegistry.getRuleConfigById(protocolId); + } + + /** + * 获取规则匹配结果 + * + * @param parseFixedDataMap + * @param protocolFieldConfigs + * @return + */ + public RuleConfig doGetRule(Map parseFixedDataMap, + String ids, + List protocolFieldConfigs) { + if (showSkip()) { + return null; + } + RuleConfig ruleConfig = GenericRuleResolver.machRule(parseFixedDataMap, ids, protocolFieldConfigs, ruleConfigs); + return ruleConfig; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(ruleConfigs) ? false : true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java index 3c05891..856b399 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java @@ -1,18 +1,11 @@ package com.casic.missiles.parser.resolver; -import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.springframework.web.bind.annotation.RequestBody; -import javax.annotation.Resource; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -20,19 +13,17 @@ @Slf4j public class ByteMergeProvider { - @Resource - private FieldRuleEngineMapper fieldRuleEngineMapper; - //拿到所有的值合并到一个值 - public String resolveByteMerge(List valueList, String ruletypeId, String vaildRange) { + public static String resolveByteMerge(List valueList, String ruleTypeId, String vaildRange) { String values = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Map vaildMap = getValidRangeMap(vaildRange); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(ruletypeId); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } + //暂时不处理 +// fieldRuleEngine = fieldRuleConfigMapper.selectById(ruleTypeId); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } Map env2 = new HashMap(); for (int i = 0; i < valueList.size(); i++) { if (vaildMap.containsKey(i)) { @@ -47,7 +38,7 @@ } } - private Map getValidRangeMap(String vaildRange) { + private static Map getValidRangeMap(String vaildRange) { String[] range = vaildRange.split(","); Map vaildMap = new HashMap(); for (int i = 0; i < range.length; i++) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 8d821cd..85d6bbf 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -1,9 +1,12 @@ package com.casic.missiles.parser.resolver; +import com.casic.missiles.pojo.AbstractFieldConfig; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; import io.netty.buffer.ByteBuf; +import java.util.List; import java.util.Map; /** @@ -11,18 +14,14 @@ */ public interface FieldParser { -// Map fieldProcess(String protocolContent,); - Map dataParser(RuleConfig ruleConfig, String lightText,String protocolId); + Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength); - Map fixDataParser(String protocolId, ByteBuf buffer); + Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap); - Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf); + ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer); - ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer); - - ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer); - - Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer); + Integer getTotalFilterLength(ProtocolConfig protocolConfig, ByteBuf byteBuf, Map protocolFieldConfigMap); } + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java new file mode 100644 index 0000000..9e0c00e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java @@ -0,0 +1,52 @@ +package com.casic.missiles.parser.resolver; + +import com.casic.missiles.pojo.AbstractFieldConfig; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.util.List; + +public class FieldParserSupport { + + //分别计算bit和byte长度=> 合并长度 + protected Integer calculateLength(List fieldConfigList) { + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + Integer fixedLength = bytefixedLength + bitfixedLength / 8; + return fixedLength; + } + + //找到最大值=> 根据最大值计算业务数据下标 + protected Integer calculatePosition(List fieldConfigList) { + String rex = "[0-9]+"; + Integer max = -1; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) + && Integer.valueOf(fieldConfig.getOriginPositionByte()) > max) { + max = Integer.valueOf(fieldConfig.getOriginPositionByte()); + } + } + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) && fieldConfig.getOriginPositionByte().equals(max)) { + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + } + } + Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; + return maxFixedPosition; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java deleted file mode 100644 index dd3a6cd..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java +++ /dev/null @@ -1,170 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.ByteResolverParam; -import io.netty.buffer.ByteBuf; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -/** - * 字段解析管理总类 - */ -@Service -@Slf4j -@AllArgsConstructor -public class FieldResolver extends ByteMergeProvider { - - //1、字段截取 => 2、简单的字节解析和复杂的字节解析 - public Object filedParserManger(ByteBuf byteBuf, FieldConfig fieldConfig, Integer maxFixedPosition) { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - //最大固定位置不为空, - if (!ObjectUtil.isEmpty(maxFixedPosition)) { - orignPosition -= maxFixedPosition; - } - Object fieldValue = 0; - //待优化 - if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { - fieldValue = bitToResolver(byteBuf, fieldConfig); - } else { - ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); - fieldValue = parsingFields(fieldBytes, fieldConfig.getRuleJson()); - } - return fieldValue; - } - - //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, - //目前默认配置的规则设置暂不支持配置化,由实现完成 - private Object parsingFields(ByteBuf byteBuf, String ruleJson) { - Object fieldsResolveValue = null; - List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); - if (ObjectUtil.isEmpty(ruleMapList)) { - fieldsResolveValue = defaultResolveBuilder(byteBuf); - } else { - fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); - } - return fieldsResolveValue; - } - - private Object defaultResolveBuilder(ByteBuf byteBuf) { - Integer defaultResolveValue = 0; - for (int i = 0; i < byteBuf.writerIndex(); i++) { - defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; - } - return defaultResolveValue; - } - - //字段解析构建器(针对字节单位的) - //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 - // 字节归并结束或者规则结束=>继续根据规则进行判断 - private Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { - Object customizeResolveValue = null; - try { - List bytStrList = new ArrayList<>(); - //存放到数组里面 - for (int i = 0; i < byteBuf.writerIndex(); i++) { - bytStrList.add(byteBuf.readByte()); - } - int i = 0; - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - customizeResolveValue = this.resolveByteMerge(bytStrList, ruletypeId,vaildRange); - break; - } else { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - List tempBytStr = new ArrayList<>(); - for (int k = 0; i < bytStrList.size(); i++) { - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(k) - .value(bytStrList.get(k)) - .ruletypeId(ruletypeId).build(); - tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); - } - bytStrList = tempBytStr; - } - i++; - } - //字节归并到一起=>继续根据规则进行判断 - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(customizeResolveValue) - .ruletypeId(ruletypeId).build(); - customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(customizeResolveValue)); - return customizeResolveValue; - } catch (RuntimeException ex) { - log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); - return null; - } - } - - /** - * 1、单个字节情况表示字段 - * 2、多字节情况表示字段(暂未处理) - */ - private Object bitToResolver(ByteBuf byteBuf, FieldConfig fieldConfig) { - Object fieldValue = new Object(); - try { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - byte fields = 0x00; - if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); - } else { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); - } - - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { - if (!StringUtils.isEmpty(fieldConfig.getExactOrignPosition())) { - fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getExactOrignPosition())).byteValue() - >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); - } else { - fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); - } - } else { - fieldValue = Integer.valueOf(fields & 0xff); - } - if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { - return fieldValue; - } - List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); - int i = 0; - //字节归并到一起=>继续根据规则进行判断 - while (i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(fieldValue) - .ruletypeId(ruletypeId).build(); - fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(fieldValue)); - return fieldValue; - } catch (RuntimeException ex) { - log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); - return null; - } - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java new file mode 100644 index 0000000..1d2aeab --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java @@ -0,0 +1,36 @@ +package com.casic.missiles.parser.resolver.bytes; + +import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.mapper.FieldRuleConfigMapper; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.pojo.ByteResolverParam; +import com.googlecode.aviator.AviatorEvaluator; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; +//转换规则 +@Component("convert") +@AllArgsConstructor +@Slf4j +public class ByteRuleResolver implements ByteResolver { + + private final FieldRuleConfigMapper fieldRuleConfigMapper; + + @Override + public Object resolveOperationRule(ByteResolverParam byteResolverParam){ + FieldRuleConfig fieldRuleEngine=fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); + if(ObjectUtil.isEmpty(fieldRuleEngine)){ + return byteResolverParam.getValue(); + } + String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); + Map env2 = new HashMap(); + env2.put("value", (byte) byteResolverParam.getValue()); + String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); + return values; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java index 103821c..786b71c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java @@ -2,34 +2,34 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("logicalShift") +@Component("logicalShift") @AllArgsConstructor @Slf4j public class LogicalShiftResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //字节位移 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { Integer index = byteResolverParam.getIndex(); - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return byteResolverParam.getValue(); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java index 476747d..01149bd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("operation") +@Component("operation") @AllArgsConstructor @Slf4j public class OperationResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //混合运算,有常量或者乘除的缩放 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java index 0b82cf4..79abcce 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.casic.missiles.pojo.ByteResolverParam; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; //精度计算 -@Service("precision") +@Component("precision") @AllArgsConstructor @Slf4j public class PrecisionResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java deleted file mode 100644 index 5c3f332..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; -//转换规则 -@Service("convert") -@AllArgsConstructor -@Slf4j -public class RuleResolver implements ByteResolver { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam){ - RuleEvaluator fieldRuleEngine=fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); - if(ObjectUtil.isEmpty(fieldRuleEngine)){ - return byteResolverParam.getValue(); - } - String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); - Map env2 = new HashMap(); - env2.put("value", (byte) byteResolverParam.getValue()); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java new file mode 100644 index 0000000..d3bbd91 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java @@ -0,0 +1,15 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; + +import java.util.List; +import java.util.Map; +// 前导码匹配->长度字段 +public interface AbstractCombinedFieldProcessor { + + Map invoke(Map map, ByteBuf byteBuf, List combinedFieldConfigList, + Map fieldConfigsMap, Map storeObjectMap); + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java new file mode 100644 index 0000000..03c8480 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java @@ -0,0 +1,59 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-13 + */ +//依次递增进行数据的解析, +public class GenericCombinedFieldResolver { + + + //通过查询,字段长度长度随机 + public void parseDataField(List combinedFieldConfigList, ByteBuf byteBuf, + Map storeObjectMap, Map fieldConfigsMap) { + Integer frameLength = Integer.valueOf(ByteBufUtil.hexDump(byteBuf)); + //添加前置处理器 + com.casic.missiles.util.ClassUtil classUtil = new com.casic.missiles.util.ClassUtil(); + List abstractCombinedProcessors = classUtil.getSubClassList(AbstractCombinedFieldProcessor.class); + + Map fieldFixedMap = combinedFieldLeadCodeMap(combinedFieldConfigList); + //frameLength + Map combinedProcessorFields = null; + while (byteBuf.readableBytes() < frameLength) { + //一直处理 + for (AbstractCombinedFieldProcessor abstractCombinedProcessor : abstractCombinedProcessors) { + combinedProcessorFields = abstractCombinedProcessor.invoke(combinedProcessorFields, byteBuf, + combinedFieldConfigList, + fieldConfigsMap, storeObjectMap); + if (combinedProcessorFields == null || byteBuf.readableBytes() < frameLength) { + return; + } + } + + } + } + + /** + * 取出前导码匹配集合 + */ + private Map combinedFieldLeadCodeMap(List combinedFieldConfigList) { + Map fieldFixedMap = combinedFieldConfigList + .stream() + .collect(Collectors.toMap(CombinedFieldConfig::getPrefixCode, e -> e)); + return fieldFixedMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java new file mode 100644 index 0000000..643a934 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java @@ -0,0 +1,100 @@ +package com.casic.missiles.parser.resolver.fields; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.FieldParserSupport; +import com.casic.missiles.pojo.*; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 保存使用时最基本的信息,并且使用原型模式 + */ +@Slf4j +public class DefaultProtocolFieldParser extends FieldParserSupport implements FieldParser, FixedPropertyEnum { + + //通过传入的配置和报文进行字段解析 + @Override + public Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap) { + Map dataMap = new HashMap<>(); + for (AbstractFieldConfig protocolFieldConfig : protocolFieldConfigs) { + if (!ObjectUtils.isEmpty(protocolFieldConfig.getOriginPositionByte())) { + Object fieldValue = FieldResolver.parseField(buffer, protocolFieldConfig, null); + if (protocolFieldConfig.getIsStorage() == 1) { + storeObjectMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + dataMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + } + return dataMap; + } + + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength) { + Map fixedPropertyMap = new HashMap<>(); + Integer fixedLength = calculateLength(protocolFieldConfigs); + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + fixedPropertyMap.put(FIXED_POSITION, maxFixedPosition); + fixedPropertyMap.put(TOTAL_LENGTH, totalLength); + fixedPropertyMap.put(TAIL_POSITION, totalLength - fixedLength + maxFixedPosition); + return fixedPropertyMap; + } + + //** 获取业务内容的byteBuf + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer) { + //计算固定长度 + Integer fixedLength = calculateLength(protocolFieldConfigs); + //总长度获取 + String lightText = buffer.toString(Charset.forName("ISO-8859-1")); + Integer totalLength = lightText.length(); + //计算固定长度最大长度 + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + //计算数据报文内容 + ByteBuf bizDataFields = buffer.slice(maxFixedPosition - 1, (totalLength - fixedLength)); + return bizDataFields; + } + + /** + * 获取过滤字段的长度 + */ + @Override + public Integer getTotalFilterLength(ProtocolConfig protocolConfig, + ByteBuf byteBuf, + Map protocolFieldConfigMap) { + if (ByteBufUtil.hexDump(byteBuf).equals("")) { + return 0; + } + int totalFilterLength = 0; + String filterFields = protocolConfig.getTotalLengthFilterFields(); + try { + if (!StringUtils.isEmpty(filterFields)) { + String[] filterFieldList = filterFields.split(","); + for (String filterFieldId : filterFieldList) { + if (StringUtils.isNotEmpty(filterFieldId)) { + ProtocolFieldConfig fieldConfig = protocolFieldConfigMap.get(Long.valueOf(filterFieldId)); + //这里都是按字节计算,没有对位进行区分,可能会出现错误 + // 如果对位有需求,需要进一步跟进 + totalFilterLength += fieldConfig.getOffsetLength(); + } + } + } + return totalFilterLength; + } catch (Exception ex) { + log.error("报文确认分发阶段,获取报文总长度过滤长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); + } + return totalFilterLength; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java new file mode 100644 index 0000000..d51e887 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java @@ -0,0 +1,169 @@ +package com.casic.missiles.parser.resolver.fields; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.parser.resolver.ByteMergeProvider; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.AbstractFieldConfig; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.pojo.ByteResolverParam; +import io.netty.buffer.ByteBuf; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * 字段解析管理总类 + */ +@Slf4j +public class FieldResolver extends ByteMergeProvider { + + //1、字段截取 => 2、简单的字节解析和复杂的字节解析 + public static Object parseField(ByteBuf byteBuf,AbstractFieldConfig fieldConfig, Integer maxFixedPosition) { + Integer orignPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + //最大固定位置不为空, + if (!ObjectUtil.isEmpty(maxFixedPosition)) { + orignPosition -= maxFixedPosition; + } + Object fieldValue = 0; + //待优化 + if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { + fieldValue = doParseBitField(byteBuf, fieldConfig); + } else { + ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); + fieldValue = doParseByteField(fieldBytes, fieldConfig.getRuleJson()); + } + return fieldValue; + } + + //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, + //目前默认配置的规则设置暂不支持配置化,由实现完成 + private static Object doParseByteField(ByteBuf byteBuf, String ruleJson) { + Object fieldsResolveValue = null; + List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); + if (ObjectUtil.isEmpty(ruleMapList)) { + fieldsResolveValue = defaultResolveBuilder(byteBuf); + } else { + fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); + } + return fieldsResolveValue; + } + + private static Object defaultResolveBuilder(ByteBuf byteBuf) { + Integer defaultResolveValue = 0; + for (int i = 0; i < byteBuf.writerIndex(); i++) { + defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; + } + return defaultResolveValue; + } + + //字段解析构建器(针对字节单位的) + //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 + // 字节归并结束或者规则结束=>继续根据规则进行判断 + private static Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { + Object customizeResolveValue = null; + try { + List bytStrList = new ArrayList<>(); + //存放到数组里面 + for (int i = 0; i < byteBuf.writerIndex(); i++) { + bytStrList.add(byteBuf.readByte()); + } + int i = 0; + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { + if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + customizeResolveValue = resolveByteMerge(bytStrList, ruletypeId, vaildRange); + break; + } else { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + List tempBytStr = new ArrayList<>(); + for (int k = 0; i < bytStrList.size(); i++) { + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(k) + .value(bytStrList.get(k)) + .ruletypeId(ruletypeId).build(); + tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); + } + bytStrList = tempBytStr; + } + i++; + } + //字节归并到一起=>继续根据规则进行判断 + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(null) + .value(customizeResolveValue) + .ruletypeId(ruletypeId).build(); + customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); + i++; + } + System.out.println(JSON.toJSON(customizeResolveValue)); + return customizeResolveValue; + } catch (RuntimeException ex) { + log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); + return null; + } + } + + /** + * 1、单个字节情况表示字段 + * 2、多字节情况表示字段(暂未处理) + */ + private static Object doParseBitField(ByteBuf byteBuf,AbstractFieldConfig fieldConfig) { + Object fieldValue = new Object(); + try { + Integer orignPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + byte fields = 0x00; + if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { + fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); + } else { + fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); + } + + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { + if (!StringUtils.isEmpty(fieldConfig.getOriginPositionBit())) { + fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getOriginPositionBit())).byteValue() + >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); + } else { + fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); + } + } else { + fieldValue = Integer.valueOf(fields & 0xff); + } + if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { + return fieldValue; + } + List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); + int i = 0; + //字节归并到一起=>继续根据规则进行判断 + while (i < ruleMapList.size()) { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(null) + .value(fieldValue) + .ruletypeId(ruletypeId).build(); + fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); + i++; + } + System.out.println(JSON.toJSON(fieldValue)); + return fieldValue; + } catch (RuntimeException ex) { + log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); + return null; + } + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java deleted file mode 100644 index 35ae3d0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java +++ /dev/null @@ -1,183 +0,0 @@ -package com.casic.missiles.parser.resolver.fields; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufAllocator; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; -import org.springframework.util.ObjectUtils; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service("standard") -@AllArgsConstructor -@Slf4j -public class StandardFieldParser implements FieldParser { - - private final FieldConfigDao fieldConfigDao; - private final FieldResolver fieldResolver; - - //数据解析 - @Override - public Map dataParser(RuleConfig ruleConfig, String lightText, String protocolId) { - String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); - ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); - bufferContent.writeBytes(lightText.getBytes(Charset.forName("ISO-8859-1"))); - Map dataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - for (String dataFieldId : dataFieldIds) { - FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(dataFieldId); - if (!ObjectUtils.isEmpty(fieldConfig)) { - dataMap.put(fieldConfig.getFieldName(), String.valueOf(fieldResolver.filedParserManger(bufferContent, fieldConfig, maxFixedPosition))); - } - } - return dataMap; - } - - //数据解析 - @Override - public Map fixDataParser(String protocolId, ByteBuf buffer) { - List dataFieldIdList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Map dataMap = new HashMap<>(); - for (FieldConfig dataField : dataFieldIdList) { - if (!ObjectUtils.isEmpty(dataField.getOrignPosition())) { - Object fieldValue = (Integer) fieldResolver.filedParserManger(buffer, dataField, null); - dataMap.put(dataField.getFieldName(), fieldValue); - } - } - return dataMap; - } - - @Override - public Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf) { - if (ByteBufUtil.hexDump(byteBuf).equals("")) { - return 0; - } - String filterFields = protocolConfig.getTotalLengthFilterField(); - Integer totalLength = 0; - try { - FieldConfig totalFieldConfig = fieldConfigDao.getFieldConfigById(protocolConfig.getTotalLengthId()); - int totalFilterLength = 0; - if (!StringUtils.isEmpty(filterFields)) { - String[] filterFieldList = filterFields.split(","); - for (String filterField : filterFieldList) { - FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(filterField); - //这里都是按字节计算,没有对位进行区分,可能会出现错误 - - // 如果对位有需求,需要进一步跟进 - totalFilterLength += fieldConfig.getOffsetLength(); - } - } - totalLength = (Integer) fieldResolver.filedParserManger(byteBuf, totalFieldConfig, null) + totalFilterLength; - } catch (Exception ex) { - log.error("报文确认分发阶段,获取报文总长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); - } - return totalLength; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer) { - //业务内容 - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - String protocolId = String.valueOf(protocolConfig.getId()); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - //计算固定长度 - Integer fixedLength = calculateLength(fieldConfigList); -// Integer totalLength = this.getTotalLength(protocolConfig, buffer); - //总长度获取 - Integer totalLength = lightText.length(); - //计算固定长度最大长度 - Integer maxFixedPosition = calculatePosition(fieldConfigList); -// buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - //计算数据报文内容 - ByteBuf bizDataFields = buffer.slice(maxFixedPosition-1, (totalLength - fixedLength)); - return bizDataFields; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer) { - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - String protocolId = String.valueOf(protocolConfig.getId()); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer fixedLength = calculateLength(fieldConfigList); -// Integer totalLength = this.getTotalLength(protocolConfig, buffer); - Integer totalLength = lightText.length(); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - ByteBuf fixDataFields = buffer.slice(0, maxFixedPosition); - return fixDataFields; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer) { - String protocolId = String.valueOf(protocolConfig.getId()); - Map fixedPropertyMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer fixedLength = calculateLength(fieldConfigList); - Integer totalLength = this.getTotalLength(protocolConfig, buffer); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - fixedPropertyMap.put("fixedPosition", maxFixedPosition); - fixedPropertyMap.put("totalLength", totalLength); - fixedPropertyMap.put("tailPosition", totalLength - fixedLength + maxFixedPosition); - return fixedPropertyMap; - } - - //分别计算bit和byte长度=> 合并长度 - private Integer calculateLength(List fieldConfigList) { - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (FieldConfig fieldConfig : fieldConfigList) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - Integer fixedLength = bytefixedLength + bitfixedLength / 8; - return fixedLength; - } - - //找到最大值=> 根据最大值计算业务数据下标 - private Integer calculatePosition(List fieldConfigList) { - String rex = "[0-9]+"; - Integer max = -1; - for (FieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOrignPosition()) - && Integer.valueOf(fieldConfig.getOrignPosition()) > max) { - max = Integer.valueOf(fieldConfig.getOrignPosition()); - } - } - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (FieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOrignPosition()) && fieldConfig.getOrignPosition().equals(max)) { - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - } - } - Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; - return maxFixedPosition; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java new file mode 100644 index 0000000..d4ec6c7 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java @@ -0,0 +1,76 @@ +package com.casic.missiles.parser.rule; + +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import org.apache.commons.lang3.StringUtils; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class GenericRuleResolver { + + //根据前置字段的值,找到指定的规则 + //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 + //=>循环判断=>通过规则得到业务字段 + public static RuleConfig machRule(Map fixDataMap, + String ids, + List protocolFieldConfigs, + List ruleConfigs) { + List preRuleConfigList = getPreRuleList(ids, protocolFieldConfigs); + //获取前置规则字段 + final Map metaDataMap = getPreRuleFields(preRuleConfigList, fixDataMap); + //准备固定的字段集合 + Map fixDataFieldMap = getFixDataFieldMap(protocolFieldConfigs); + return RuleResolverCore.doMachRule(ruleConfigs, metaDataMap, fixDataMap, fixDataFieldMap); + } + + private static Map getFixDataFieldMap(List protocolFieldConfigs) { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, ProtocolFieldConfig::getFieldName) + ); + return fixDataFieldMap; + } + + + /** + * 查询前置规则的字段配置 + * + * @param ids + * @return + */ + private static List getPreRuleList(String ids, List protocolFieldConfigs) { + String[] idList = ids.split(","); + Map prepareMaps = new HashMap<>(); + for (String id : idList) { + if (StringUtils.isNotEmpty(id)) { + prepareMaps.put(Long.valueOf(id), ""); + } + } + List preRuleConfigList = protocolFieldConfigs + .stream() + .filter(e -> prepareMaps.containsKey(e.getId())) + .collect(Collectors.toList()); + return preRuleConfigList; + } + + /** + * 获取前置规则解析字段 + */ + private static Map getPreRuleFields(List preRuleFieldConfigList, Map fixDataMap) { + Map ruleFieldMap = new HashMap<>(); + preRuleFieldConfigList.stream() + .forEach( + preRuleFieldConfig -> { + String fieldName = preRuleFieldConfig.getFieldName(); + if (fixDataMap.containsKey(fieldName)) { + ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); + } + } + ); + return ruleFieldMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java new file mode 100644 index 0000000..baae7e8 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -0,0 +1,68 @@ +package com.casic.missiles.parser.rule; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.casic.missiles.pojo.RuleConfig; + +import java.util.*; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleResolverCore { + + + public static RuleConfig doMachRule(List ruleConfigList, Map metaDataMap, + Map fixDataMap, + Map fixDataFieldMap) { + Optional ruleConfigOptional = ruleConfigList.stream() + .filter(ruleConfig -> machRuleConfig( + JSON.parseObject(ruleConfig.getMatchRuleJson(), Map.class), metaDataMap)) + .findFirst(); + if (ObjectUtil.isEmpty(ruleConfigOptional)) { + return null; + } + String[] ruleFields = ruleConfigOptional.get().getDataFieldIds().split(","); + Map ruleMetaDataMap = getRuleFields(ruleFields, fixDataMap, fixDataFieldMap); + //递归选定解析规则,进行规则解析 + if (!ruleConfigOptional.get().getIsFinishMatch().equals("1")) { + //递归选定规则 + doMachRule(ruleConfigList, ruleMetaDataMap, fixDataMap, fixDataFieldMap); + } + return ruleConfigOptional.get(); + } + + + private static Map getRuleFields(String[] preRuleConfigList, Map fixedDataMap, + Map fixedFieldMap) { + Map ruleFieldMap = new HashMap<>(); + for (String preRuleConfigId : preRuleConfigList) { + String fieldName = fixedFieldMap.get(preRuleConfigId); + if (fixedDataMap.containsKey(fieldName)) { + ruleFieldMap.put(fieldName, String.valueOf(fixedDataMap.get(fieldName))); + } + } + return ruleFieldMap; + } + + + //匹配规则配置 + private static Boolean machRuleConfig(Map ruleMap, Map metaDataMap) { + if (ruleMap == null || metaDataMap == null) { + return null; + } + //所有的字段在规则里面必须有有配置 + for (String key : metaDataMap.keySet()) { + if (ruleMap.containsKey(key)) { + if (!ruleMap.get(key).equals(metaDataMap.get(key))) { + return false; + } + } else { + return false; + } + } + return true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java deleted file mode 100644 index 664088d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java +++ /dev/null @@ -1,92 +0,0 @@ -package com.casic.missiles.parser.rule; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.mapper.dao.PreRuleConfigDao; -import com.casic.missiles.mapper.dao.RuleConfigDao; -import lombok.AllArgsConstructor; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.*; -import java.util.stream.Collectors; - -@Service -@AllArgsConstructor -public class RulerProvider { - - private final FieldConfigDao fieldConfigDao; - private final PreRuleConfigDao preRuleConfigDao; - private final RuleConfigDao ruleConfigDao; - - //根据前置字段的值,找到指定的规则 - //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 - //=>循环判断=>通过规则得到业务字段 - public RuleConfig ruleConfig(Map fixDataMap, String protocolId) { - //批量获取规则 - List preRuleConfigList = preRuleConfigDao.getPreRuleList(protocolId); - //获取固定字段 - Map fixFieldMap = getAllFieldMap(protocolId); - //获取前置规则字段 - final String preRuleFields = getPreRuleFields(preRuleConfigList, fixDataMap, fixFieldMap); - List ruleConfigList = ruleConfigDao.getRuleConfigById(protocolId); - Optional ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig ->preRuleFields.equals( ruleConfig.getParseRuleJson())).findFirst(); - //递归选定解析规则,进行规则解析 - while (!ObjectUtil.isEmpty(ruleConfigOptional) && !ruleConfigOptional.get().getIsBizField().equals("1")) { - String ruleFields = getRuleFields(ruleConfigOptional.get().getDataFieldIds().split(","), fixDataMap, fixFieldMap); - ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig -> ruleConfig.getParseRuleJson().equals(ruleFields)).findFirst(); - } - return ruleConfigOptional.get(); - } - - /** - * 获取前置规则解析字段 - */ - private String getPreRuleFields(List preRuleConfigList, Map fixDataMap, Map fixFieldMap) { - Map ruleFieldMap= new HashMap<>(); - preRuleConfigList.stream() - .forEach( - preRuleConfig -> { - String fieldName = fixFieldMap.get(Long.valueOf(preRuleConfig.getRuleFieldId())); - if (fixDataMap.containsKey(fieldName)) { - ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); - } - } - ); - return JSONObject.toJSONString(ruleFieldMap); - } - - private Map getAllFieldMap(String protocolId) { - List fieldList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Map fixFieldMap = fieldList.stream().collect( - Collectors.toMap(FieldConfig::getId, FieldConfig::getFieldName) - ); - return fixFieldMap; - } - - private String getRuleFields(String[] preRuleConfigList, Map fixDataMap, Map fixFieldMap) { - Map ruleFieldMap= new HashMap<>(); - for (String preRuleConfigId : preRuleConfigList) { - String fieldName = fixFieldMap.get(preRuleConfigId); - if (fixDataMap.containsKey(fieldName)) { - ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); - } - } - return JSONObject.toJSONString(ruleFieldMap); - } - - //弃置 - private String ListToString(List ruleFieldList) { - String ruleFields = ""; - for (String ruleField : ruleFieldList) { - ruleFields += ruleField + ","; - } - ruleFields = StringUtils.isEmpty(ruleFields) ? ruleFields : ruleFields.substring(0, ruleFields.length() - 1); - return ruleFields; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java index 6177e10..bfa87a5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java @@ -2,7 +2,7 @@ public interface SafeStrategy { - String decryption(byte[] bytes); + String decryption(String cipher); String encryption(String lightText); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java index 618716c..6236302 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java @@ -9,9 +9,9 @@ //十六进制的字符串转换成字节数组 byte[] bytes = hexStrToBinaryStr(msg); //计算CRC8 - byte crc8 = CRC8(bytes, 0, bytes.length); - String crc8ToStr = "" + Integer.toHexString(0xff & crc8); - return crc8ToStr; +// String crc8ToStr = "" + Integer.toHexString(0xff & crc8); +// return crc8ToStr; + return null; } /** @@ -33,50 +33,5 @@ return bytes; } - /** - * CRC8 校验 多项式 x8+x2+x+1 - * - * @param b - * @param off - * @param len - * @return - */ - public static byte CRC8(final byte[] b, final int off, final int len) { - byte result = 0x00; - for (int i = 0; i < len; i++) { - result = CHECKSUM_TABLE[(result ^ (b[i + off] & 0xFF)) & 0xFF]; - } - return (byte) (result & 0xFFL); - } - - private final static byte[] CHECKSUM_TABLE = {(byte) 0x00, (byte) 0x07, (byte) 0x0e, (byte) 0x09, (byte) 0x1c, (byte) 0x1b, - (byte) 0x12, (byte) 0x15, (byte) 0x38, (byte) 0x3f, (byte) 0x36, (byte) 0x31, (byte) 0x24, (byte) 0x23, (byte) 0x2a, - (byte) 0x2d, (byte) 0x70, (byte) 0x77, (byte) 0x7e, (byte) 0x79, (byte) 0x6c, (byte) 0x6b, (byte) 0x62, (byte) 0x65, - (byte) 0x48, (byte) 0x4f, (byte) 0x46, (byte) 0x41, (byte) 0x54, (byte) 0x53, (byte) 0x5a, (byte) 0x5d, (byte) 0xe0, - (byte) 0xe7, (byte) 0xee, (byte) 0xe9, (byte) 0xfc, (byte) 0xfb, (byte) 0xf2, (byte) 0xf5, (byte) 0xd8, (byte) 0xdf, - (byte) 0xd6, (byte) 0xd1, (byte) 0xc4, (byte) 0xc3, (byte) 0xca, (byte) 0xcd, (byte) 0x90, (byte) 0x97, (byte) 0x9e, - (byte) 0x99, (byte) 0x8c, (byte) 0x8b, (byte) 0x82, (byte) 0x85, (byte) 0xa8, (byte) 0xaf, (byte) 0xa6, (byte) 0xa1, - (byte) 0xb4, (byte) 0xb3, (byte) 0xba, (byte) 0xbd, (byte) 0xc7, (byte) 0xc0, (byte) 0xc9, (byte) 0xce, (byte) 0xdb, - (byte) 0xdc, (byte) 0xd5, (byte) 0xd2, (byte) 0xff, (byte) 0xf8, (byte) 0xf1, (byte) 0xf6, (byte) 0xe3, (byte) 0xe4, - (byte) 0xed, (byte) 0xea, (byte) 0xb7, (byte) 0xb0, (byte) 0xb9, (byte) 0xbe, (byte) 0xab, (byte) 0xac, (byte) 0xa5, - (byte) 0xa2, (byte) 0x8f, (byte) 0x88, (byte) 0x81, (byte) 0x86, (byte) 0x93, (byte) 0x94, (byte) 0x9d, (byte) 0x9a, - (byte) 0x27, (byte) 0x20, (byte) 0x29, (byte) 0x2e, (byte) 0x3b, (byte) 0x3c, (byte) 0x35, (byte) 0x32, (byte) 0x1f, - (byte) 0x18, (byte) 0x11, (byte) 0x16, (byte) 0x03, (byte) 0x04, (byte) 0x0d, (byte) 0x0a, (byte) 0x57, (byte) 0x50, - (byte) 0x59, (byte) 0x5e, (byte) 0x4b, (byte) 0x4c, (byte) 0x45, (byte) 0x42, (byte) 0x6f, (byte) 0x68, (byte) 0x61, - (byte) 0x66, (byte) 0x73, (byte) 0x74, (byte) 0x7d, (byte) 0x7a, (byte) 0x89, (byte) 0x8e, (byte) 0x87, (byte) 0x80, - (byte) 0x95, (byte) 0x92, (byte) 0x9b, (byte) 0x9c, (byte) 0xb1, (byte) 0xb6, (byte) 0xbf, (byte) 0xb8, (byte) 0xad, - (byte) 0xaa, (byte) 0xa3, (byte) 0xa4, (byte) 0xf9, (byte) 0xfe, (byte) 0xf7, (byte) 0xf0, (byte) 0xe5, (byte) 0xe2, - (byte) 0xeb, (byte) 0xec, (byte) 0xc1, (byte) 0xc6, (byte) 0xcf, (byte) 0xc8, (byte) 0xdd, (byte) 0xda, (byte) 0xd3, - (byte) 0xd4, (byte) 0x69, (byte) 0x6e, (byte) 0x67, (byte) 0x60, (byte) 0x75, (byte) 0x72, (byte) 0x7b, (byte) 0x7c, - (byte) 0x51, (byte) 0x56, (byte) 0x5f, (byte) 0x58, (byte) 0x4d, (byte) 0x4a, (byte) 0x43, (byte) 0x44, (byte) 0x19, - (byte) 0x1e, (byte) 0x17, (byte) 0x10, (byte) 0x05, (byte) 0x02, (byte) 0x0b, (byte) 0x0c, (byte) 0x21, (byte) 0x26, - (byte) 0x2f, (byte) 0x28, (byte) 0x3d, (byte) 0x3a, (byte) 0x33, (byte) 0x34, (byte) 0x4e, (byte) 0x49, (byte) 0x40, - (byte) 0x47, (byte) 0x52, (byte) 0x55, (byte) 0x5c, (byte) 0x5b, (byte) 0x76, (byte) 0x71, (byte) 0x78, (byte) 0x7f, - (byte) 0x6a, (byte) 0x6d, (byte) 0x64, (byte) 0x63, (byte) 0x3e, (byte) 0x39, (byte) 0x30, (byte) 0x37, (byte) 0x22, - (byte) 0x25, (byte) 0x2c, (byte) 0x2b, (byte) 0x06, (byte) 0x01, (byte) 0x08, (byte) 0x0f, (byte) 0x1a, (byte) 0x1d, - (byte) 0x14, (byte) 0x13, (byte) 0xae, (byte) 0xa9, (byte) 0xa0, (byte) 0xa7, (byte) 0xb2, (byte) 0xb5, (byte) 0xbc, - (byte) 0xbb, (byte) 0x96, (byte) 0x91, (byte) 0x98, (byte) 0x9f, (byte) 0x8a, (byte) 0x8d, (byte) 0x84, (byte) 0x83, - (byte) 0xde, (byte) 0xd9, (byte) 0xd0, (byte) 0xd7, (byte) 0xc2, (byte) 0xc5, (byte) 0xcc, (byte) 0xcb, (byte) 0xe6, - (byte) 0xe1, (byte) 0xe8, (byte) 0xef, (byte) 0xfa, (byte) 0xfd, (byte) 0xf4, (byte) 0xf3}; } \ No newline at end of file diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java index 27c2838..6e078a3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java @@ -1,9 +1,6 @@ package com.casic.missiles.parser.safe.impl; -import cn.hutool.core.util.CharsetUtil; -import cn.hutool.crypto.symmetric.SM4; -import cn.hutool.crypto.symmetric.SymmetricCrypto; - +import com.casic.missiles.parser.safe.SafeStrategy; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; @@ -11,19 +8,44 @@ import org.bouncycastle.crypto.engines.SM4Engine; import org.bouncycastle.crypto.params.KeyParameter; import org.bouncycastle.util.encoders.Hex; - -import static cn.hutool.crypto.Mode.ECB; -import static cn.hutool.crypto.Padding.NoPadding; +import org.springframework.stereotype.Component; /** * SM4算法工具类 */ @Slf4j -public class Sm4 { +@Component("sm4") +public class Sm4 implements SafeStrategy { //加解密的字节快大小 public static final int BlockSize = 16; + @Override + public String decryption(String cipher) { + byte[] keyByte = { + 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 + }; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(keyByte); + byte[] in = Hex.decode(cipher); + byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); + String plain = EcbDecrypt(in, keyBytes); + return plain; + } + + @Override + public String encryption(String cipher) { + byte[] keyByte = { + 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 + }; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(keyByte); + byte[] in = Hex.decode(cipher); + byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); + String plain = EcbDecrypt(in, keyBytes); + return plain; + } + /** * SM4ECB加密算法,对内 * @@ -32,8 +54,6 @@ * @return */ private static byte[] ecb_encrypt(byte[] in, byte[] keyBytes) { - - SM4Engine sm4Engine = new SM4Engine(); sm4Engine.init(true, new KeyParameter(keyBytes)); byte[] out = new byte[in.length]; @@ -58,27 +78,6 @@ return cipher; } - - /** - * hutool 解密SM4 - * - * @param encodeContent - * @return - */ - public static String decode(String encodeContent) { - String key = "24ad182507479a5da3ad94d9d78ea203"; - try { - SymmetricCrypto sm4 = new SM4(ECB, NoPadding, key.getBytes()); - String decryptStr = sm4.decryptStr(encodeContent, CharsetUtil.CHARSET_UTF_8); - return decryptStr; - } catch (Exception e) { - e.printStackTrace(); - log.error("SM4解密失败"); - } - return null; - } - - /** * SM4的ECB加密算法 * @@ -129,20 +128,6 @@ return plain; } - /** - * SM4的ECB解密算法 - * - * @param cipher 输入的密文字符串 - * @param key 密钥 - * @return - */ - public static String EcbDecrypt(String cipher, String key) { - byte[] in = Hex.decode(cipher); - byte[] keyBytes = Hex.decode(key); - - String plain = EcbDecrypt(in, keyBytes); - return plain; - } /** * 主函数 @@ -151,28 +136,24 @@ */ public static void main(String[] args) { byte[] ciphertext = { + 0x4B, (byte) 0x8C, (byte) 0x9D, 0x08, (byte) 0xE4, (byte) 0xD3, 0x64, 0x42, (byte) 0xB9, (byte) 0xA5, (byte) 0xFE, (byte) 0xCD, (byte) 0x91, 0x1B, 0x38, (byte) 0xAC, (byte) 0xE9, 0x1C, (byte) 0xCD, 0x53, 0x02, (byte) 0xD7, 0x0C, (byte) 0x9B, (byte) 0x96, 0x30, 0x62, (byte) 0xE8, (byte) 0xFB, (byte) 0xEF, (byte) 0xB9, (byte) 0xFF, (byte) 0xDE, 0x19, (byte) 0x80, 0x35, 0x3E, (byte) 0x90, 0x4F, 0x2F, 0x12, 0x2B, 0x19, (byte) 0x8B, 0x6C, 0x7A, (byte) 0x85, (byte) 0xA1, (byte) 0xB1, (byte) 0x86, (byte) 0xA3, 0x7A, 0x46, 0x0C, 0x2F, (byte) 0x94, 0x4F, 0x7F, 0x2C, 0x56, 0x14, (byte) 0xF3, (byte) 0x89, (byte) 0xC3, - 0x3F, 0x20, (byte) 0xF9, (byte) 0x87, (byte) 0xA1, 0x60, (byte) 0xD9, (byte) 0xA8, (byte) 0xFD, (byte) 0xD7, (byte) 0x9B, 0x4B, 0x26, 0x06, 0x30, 0x44}; + 0x3F, 0x20, (byte) 0xF9, (byte) 0x87, (byte) 0xA1, 0x60, (byte) 0xD9, (byte) 0xA8, (byte) 0xFD, (byte) 0xD7, (byte) 0x9B, 0x4B, 0x26, 0x06, 0x30, 0x44 + }; ByteBuf in = ByteBufAllocator.DEFAULT.heapBuffer(); in.writeBytes(ciphertext); - byte[] keyByte = { 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 }; ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); - key.writeBytes(ciphertext); - String resCipherData = decode(ByteBufUtil.hexDump(in)); - ByteBuf out = ByteBufAllocator.DEFAULT.heapBuffer(); -// out.writeBytes(resCipherData); -// System.out.println(hexBytes); - System.out.println(resCipherData.toString()); -// String resPlainData = EcbDecrypt(resCipherData, key); -// System.out.println("原始明文:" + data); -// System.out.println("解密后明文:" + resPlainData); + key.writeBytes(keyByte); +// String resCipherData = EcbDecrypt(ByteBufUtil.hexDump(in), ByteBufUtil.hexDump(key)); +// System.out.println(resCipherData); } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java index 1395a51..ac5f957 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java @@ -1,7 +1,7 @@ package com.casic.missiles.parser.safe.impl; import io.netty.buffer.ByteBufUtil; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** *

@@ -14,9 +14,8 @@ * @author hyl * @version v1.0: Tea.java, v 0.1 2021/3/12 13:48 $ */ -@Service("tea") -///tea算法类 - +//tea算法类 +@Component("tea") public class Tea { public static byte[] MyTea_Encrypt(byte[] MyTeaContent, int ByteLen, byte[] MyTeakey) { @@ -99,7 +98,6 @@ // for(int i32Index = 0; i32Index < 8; i32Index++) { // System.out.print("0x" + Integer.toHexString(MyContent[i32Index]) + " "); // } - // System.out.println("密钥为:"); // for(int i32Index = 0; i32Index < 16; i32Index++) { // System.out.print("0x" + Integer.toHexString(MyKeys[i32Index]) + " "); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java index bdd0721..bd1516a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java @@ -3,7 +3,7 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.parser.sender.DataSubscribeProvider; import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponents; import org.springframework.web.util.UriComponentsBuilder; @@ -12,7 +12,7 @@ import java.util.Collections; import java.util.Map; -@Service("functionCallback") +@Component("functionCallback") public class FunctionCallback implements DataSubscribeProvider { @Resource diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java index 0b44fb9..7526de2 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.Map; -@Service("middleware") +@Component("middleware") public class MiddlewareSubscribe implements DataSubscribeProvider { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java index 5dcee3f..e2f1192 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.Map; -@Service("nosql") +@Component("nosql") public class NoSqlSubscribe implements DataSubscribeProvider { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java b/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java new file mode 100644 index 0000000..81a5324 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java @@ -0,0 +1,86 @@ +package com.casic.missiles.pojo; + +import lombok.Data; + +/** + * 协议 + */ +@Data +public class Msg { + + /** + * 前导码 + */ + private String preamble; + + /** + * 版本号 + */ + private String version; + + /** + * 内容长度 + */ + private int leng; + + /** + * 设备ID + */ + private String deviceId; + + /** + * 通讯方式 + */ + private Integer connType; + + /** + * 加密方式 + */ + private Integer encryType; + + /** + * 目标地址 + */ + private String destAddr; + + /** + * PDUType + */ + private String PDUType; + + /** + * 操作类型 + */ + private Integer operateType; + + /** + * 传输控制位 PDUType.bit7=0时,表示存在后续的访问;当PDUType.bit7=1时,表示无后续的访问。 + */ + private Integer transControlFlag; + + /** + * 设备类型 + */ + private Integer deviceType; + + /** + * 序号 + */ + private Integer seq; + + /** + * tagList + */ + private String tagList; + + /** + * OidList + */ + private String OidList; + + /** + * CRC + */ + private String CRC; + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java index 40a5265..97cc984 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java @@ -40,7 +40,7 @@ String httpContent = msg.toString(Charset.defaultCharset()); log.info(" String : " + msg.toString(Charset.defaultCharset())); String majorContent = httpContent.substring(httpContent.indexOf("{"), httpContent.lastIndexOf("}") + 1); - String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("serviceData")).get("Value")); + String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("RegistryData")).get("Value")); log.info("----------------------------------" + values); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); bufferContent.writeBytes(values.getBytes(Charset.forName("ISO-8859-1"))); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java index 1b132a7..e3ced4b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java @@ -35,7 +35,7 @@ String httpContent = msg.toString(Charset.defaultCharset()); log.info(" String : " + msg.toString(Charset.defaultCharset())); String majorContent = httpContent.substring(httpContent.indexOf("{"), httpContent.lastIndexOf("}") + 1); - String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("serviceData")).get("Value")); + String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("RegistryData")).get("Value")); log.info("----------------------------------" + values); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); bufferContent.writeBytes(values.getBytes(Charset.forName("ISO-8859-1"))); diff --git a/sensorhub-core/src/main/resources/application.properties b/sensorhub-core/src/main/resources/application.properties deleted file mode 100644 index 8b13789..0000000 --- a/sensorhub-core/src/main/resources/application.properties +++ /dev/null @@ -1 +0,0 @@ - diff --git a/sensorhub-core/src/main/resources/config/application-dev.yml b/sensorhub-core/src/main/resources/config/application-dev.yml index 4f897a8..dcc4c2d 100644 --- a/sensorhub-core/src/main/resources/config/application-dev.yml +++ b/sensorhub-core/src/main/resources/config/application-dev.yml @@ -4,9 +4,9 @@ spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true + url: jdbc:mysql://127.0.0.1:3306/sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true username: root - password: Casic203 + password: root session: store-type: redis redis: diff --git a/sensorhub-core/src/main/resources/config/application.yml b/sensorhub-core/src/main/resources/config/application.yml index ae89f9d..7965da1 100644 --- a/sensorhub-core/src/main/resources/config/application.yml +++ b/sensorhub-core/src/main/resources/config/application.yml @@ -30,6 +30,13 @@ port: 6379 password: ew5T4K3#203lwh config-prefix: 'Casic:' +#代码生成器配置 +code: + generate: + #作者 + author: cz + #待生成对象表名 + table-name: bussiness_field_config,combined_field_config sensorhub: config: port: 7091 diff --git a/sensorhub-support/pom.xml b/sensorhub-support/pom.xml index 9a71296..761601c 100644 --- a/sensorhub-support/pom.xml +++ b/sensorhub-support/pom.xml @@ -42,6 +42,12 @@ ${redis.version} + + com.baomidou + mybatis-plus-generator + ${mybatis-plus-generator.version} + + org.reflections diff --git a/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java b/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java new file mode 100644 index 0000000..515ca53 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java @@ -0,0 +1,14 @@ +package com.casic.missiles.enums; + +/** + * @author + * @date + */ +public interface FixedPropertyEnum { + + String FIXED_POSITION = "fixedPosition"; + + String TOTAL_LENGTH = "totalLength"; + + String TAIL_POSITION = "tailPosition"; +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/CombinedFieldMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CombinedFieldMapper.java new file mode 100644 index 0000000..38e8f42 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CombinedFieldMapper.java @@ -0,0 +1,15 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.CombinedFieldConfig; +import org.apache.ibatis.annotations.Mapper; + +/** + * @author cz + * + */ +@Mapper +public interface CombinedFieldMapper extends BaseMapper { + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java new file mode 100644 index 0000000..128b09d --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java @@ -0,0 +1,10 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.CommandEventConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface CommandEventMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java new file mode 100644 index 0000000..042eb3c --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.DatagramEventConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface DatagramEventConfigMapper extends BaseMapper { +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java new file mode 100644 index 0000000..fc95cf4 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java @@ -0,0 +1,8 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.FieldConfig; + +public interface FieldConfigMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldRuleConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldRuleConfigMapper.java new file mode 100644 index 0000000..b310a08 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldRuleConfigMapper.java @@ -0,0 +1,10 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.FieldRuleConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface FieldRuleConfigMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java new file mode 100644 index 0000000..9060a69 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.ProtocolConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface ProtocolConfigMapper extends BaseMapper { +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolFieldConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolFieldConfigMapper.java new file mode 100644 index 0000000..1b47180 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolFieldConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +public interface ProtocolFieldConfigMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java new file mode 100644 index 0000000..6fa6936 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.RuleConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface RuleConfigMapper extends BaseMapper { +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/AbstractFieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/AbstractFieldConfig.java new file mode 100644 index 0000000..ba9aea2 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/AbstractFieldConfig.java @@ -0,0 +1,38 @@ +package com.casic.missiles.pojo; + +import lombok.Data; + +@Data +public class AbstractFieldConfig { + /** + * 字段名称 + */ + private String fieldName; + /** + * 按照字段评估进行字段解析 + */ + private String ruleJson; + /** + * 起始位置(单位byte) + */ + private Integer OriginPositionByte; + /** + * 起始位置,是否需要bit位置(单位bit)小于8, 没有不需要填写 + */ + private String OriginPositionBit; + /** + * 偏移长度 + */ + private Integer offsetLength; + /** + * 偏移单位(bit/byte) + */ + private String offsetUnit; + /** + * 是否需要转存 + */ + private Integer isStorage; + + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/CombinedFieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/CombinedFieldConfig.java new file mode 100644 index 0000000..4f4de6a --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/CombinedFieldConfig.java @@ -0,0 +1,41 @@ +package com.casic.missiles.pojo; + +import lombok.Data; + +import java.util.Date; + +/** + * 组合配置 + * + * @author cz + * @date 20 + */ +@Data +public class CombinedFieldConfig { + + private Long id; + private Long ruleId; + /** + * 前缀编码 + */ + private String prefixCode; + + /** + * 字段动态的id + */ + private Long dynamicLengthId; + /** + * 对应的要解析字段的ids + */ + private String dataFieldIds; + + /** + * 字段动态的id + */ + private String combinedFieldIds; + + private Date lastTime; + + private Date createTime; + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldConfig.java index a07d20d..8304dc6 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldConfig.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldConfig.java @@ -5,31 +5,28 @@ import java.util.Date; +/** + * @author cz + * 1、该表与实际解析的内容实例解析有关 + * 2、该表字段是随机出现的,和帧结构无关,无法预料的 + * 3、该表字段解析根据FieldEvaluatorConfig进行字段解析 + */ @Data -@TableName("field_config") -public class FieldConfig { +@TableName("business_field_config") +public class FieldConfig extends AbstractFieldConfig { private Long id; -// private String preFieldConfig; - private Long protocolId; - - private String isFixed; - private String uploadDeliveryChange; - - private String replyRule; - private String ruleJson; - + /** + * 协议配置id + */ + private Long ruleId; + /** + * 字段名称 + */ private String fieldName; - private String isStorage; - private Integer orignPosition; - private String exactOrignPosition; - - private Integer offsetLength; - private String offsetUnit; private String ownerId; private Date createTime; private Date lastTime; - } diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldRuleConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldRuleConfig.java new file mode 100644 index 0000000..2e09879 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldRuleConfig.java @@ -0,0 +1,20 @@ +package com.casic.missiles.pojo; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +@TableName("field_rule_config") +@Data +public class FieldRuleConfig { + + private Long id; + private String name; + private String desc; + private String condition; + private String excuteOperation; + private Date lasTime; + private Date createTime; + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/Msg.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/Msg.java deleted file mode 100644 index 81a5324..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/Msg.java +++ /dev/null @@ -1,86 +0,0 @@ -package com.casic.missiles.pojo; - -import lombok.Data; - -/** - * 协议 - */ -@Data -public class Msg { - - /** - * 前导码 - */ - private String preamble; - - /** - * 版本号 - */ - private String version; - - /** - * 内容长度 - */ - private int leng; - - /** - * 设备ID - */ - private String deviceId; - - /** - * 通讯方式 - */ - private Integer connType; - - /** - * 加密方式 - */ - private Integer encryType; - - /** - * 目标地址 - */ - private String destAddr; - - /** - * PDUType - */ - private String PDUType; - - /** - * 操作类型 - */ - private Integer operateType; - - /** - * 传输控制位 PDUType.bit7=0时,表示存在后续的访问;当PDUType.bit7=1时,表示无后续的访问。 - */ - private Integer transControlFlag; - - /** - * 设备类型 - */ - private Integer deviceType; - - /** - * 序号 - */ - private Integer seq; - - /** - * tagList - */ - private String tagList; - - /** - * OidList - */ - private String OidList; - - /** - * CRC - */ - private String CRC; - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/PreRuleConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/PreRuleConfig.java deleted file mode 100644 index bfcf914..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/PreRuleConfig.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.casic.missiles.pojo; - -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -import java.util.Date; - -@Data -@TableName("pre_rule_config") -public class PreRuleConfig { - - private Long id; - private String protocolId; - private String ruleFieldId; - private String ownerId; - private Date createTime; - private Date lastTime; -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolConfig.java index 274ad42..bdac11f 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolConfig.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolConfig.java @@ -5,18 +5,52 @@ import java.util.Date; +/** + * 协议配置表,协议配置与帧结构有关 + * 1、层级关系,协议之后是规则,规则对应设备类型的各种上数规则 + * 2、规则对应协议配置的实例流程 + * 3、每种可根据设备类型和操作类型进行上数规则进行区分 + */ @Data @TableName("protocol_config") public class ProtocolConfig { private Long id; + /** + * 前导码 + */ private String preFix; - private String unpackId; - private String totalLengthId; - private String totalLengthFilterField; + /** + * 拆包id + */ + private Long unpackId; + /** + * 总长度id + */ + private Long totalLengthId; + /** + * + */ + private String totalLengthFilterFields; + /** + * 动态长度ids + */ private String dynamicLengthId; + /** + * 动态长度json(预留字段) + */ private String dynamicLengthJson; - private String tailStr; + /** + * 规则字段所解析预准备的字段 + */ + private String rulePrepareFields; + /** + * 结尾标志 + */ + private Long tailStr; + /** + * 备注 + */ private String remark; private String ownerId; private Date createTime; diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolFieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolFieldConfig.java new file mode 100644 index 0000000..db794bd --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolFieldConfig.java @@ -0,0 +1,43 @@ +package com.casic.missiles.pojo; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +/** + * 协议字段配置表 + * 该表用户存放帧结构固定格式的字段 + * 有以下两个用途 + * (1)、固定格式的字段可用于规则匹配 + * (2)、固定格式的字段可用于报文回复 + * @author cz + * @date 2023-06-09 + */ +@Data +@TableName("protocol_field_config") +public class ProtocolFieldConfig extends AbstractFieldConfig{ + + private Long id; + /** + * 协议配置id + */ + private Long protocolId; + /** + * 上传下发是否有变化, 没有变化,可以直接组装 + */ + private String isReplyFix; + /** + * 按照字段评估进行字段解析 + */ + private Long fieldEvaluatorId; + /** + * 回复规则 + */ + private String replyRule; + + private String ownerId; + private Date createTime; + private Date lastTime; + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java index 3b53493..febf835 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java @@ -6,18 +6,40 @@ import java.util.Date; /** - * 加密字段解析和规则有关,事件调到该流程下面 + * @author cz + * todo: 匹配协议对应业务实例 + * 1、一个协议可以多种的流程规则 + * 2、规则可以支持递归规则流程 */ @Data @TableName("rule_config") public class RuleConfig { - private Long id; private String protocolId; - private String isBizField; - private String parseRuleJson; + /** + * 是否完成规则配置,没有完成, + * 则需要根据规则继续匹配 + */ + private String isFinishMatch; + /** + * 待匹配解析规则 + * {“data_field”:"data_value"} + */ + private String matchRuleJson; + /** + * 待解析字段ids + */ private String dataFieldIds; - private String aviatorFilterJson; + + /** + * 待解析组合字段ids + */ + private String combinedFieldIds; + + /** + * aviator + */ + private String conditionExpression; private Date createTime; private Date lastTime; } diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleDict.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleDict.java deleted file mode 100644 index cc7f389..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleDict.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.casic.missiles.pojo; - -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -@Data -@TableName("rule_dict") -public class RuleDict { - - private Long id; - private Long pid; - private String name; - private String code; - private String ownerId; - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleEvaluator.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleEvaluator.java deleted file mode 100644 index ed16610..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleEvaluator.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.pojo; - -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -import java.util.Date; - -@TableName("rule_evaluator") -@Data -public class RuleEvaluator { - - private Long id; - private String name; - private String desc; - private String condition; - private String excuteOperation; - private Date lasTime; - private Date createTime; - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/CombinedFieldConfigRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/CombinedFieldConfigRegistry.java new file mode 100644 index 0000000..fa59b90 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/CombinedFieldConfigRegistry.java @@ -0,0 +1,12 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.CombinedFieldConfig; + +import java.util.List; + +public interface CombinedFieldConfigRegistry { + + List getCombinedFieldConfigList(Long ruleId); + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/CommandEventRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/CommandEventRegistry.java new file mode 100644 index 0000000..fb97d87 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/CommandEventRegistry.java @@ -0,0 +1,8 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.CommandEventConfig; + +public interface CommandEventRegistry { + + CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName); +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/DatagramEventRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/DatagramEventRegistry.java new file mode 100644 index 0000000..fb34641 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/DatagramEventRegistry.java @@ -0,0 +1,11 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.DatagramEventConfig; + +import java.util.List; + +public interface DatagramEventRegistry{ + + List getDatagramEventList(Long ruleId); + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/FieldConfigRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/FieldConfigRegistry.java new file mode 100644 index 0000000..759642e --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/FieldConfigRegistry.java @@ -0,0 +1,20 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.FieldConfig; + +import java.util.List; + +public interface FieldConfigRegistry { + + + List getFieldConfigList(Long ruleId); + + FieldConfig getFieldConfigById(String fieldId); + + List getFieldConfigs(String protocolId, Integer isFixed); + + List getStorageFieldConfig(String protocolId); + + +} + diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/FieldRuleConfigRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/FieldRuleConfigRegistry.java new file mode 100644 index 0000000..33da70c --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/FieldRuleConfigRegistry.java @@ -0,0 +1,11 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.FieldRuleConfig; + +import java.util.List; + +public interface FieldRuleConfigRegistry { + + List getFieldRuleConfigList(Long ruleId); + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/ProtocolConfigRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/ProtocolConfigRegistry.java new file mode 100644 index 0000000..1725189 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/ProtocolConfigRegistry.java @@ -0,0 +1,12 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.ProtocolConfig; + +import java.util.List; + +public interface ProtocolConfigRegistry { + + List getProtocolConfigList(String firstChar); + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/ProtocolFieldConfigRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/ProtocolFieldConfigRegistry.java new file mode 100644 index 0000000..19d1b9a --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/ProtocolFieldConfigRegistry.java @@ -0,0 +1,14 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.ProtocolFieldConfig; + +import java.util.List; + +public interface ProtocolFieldConfigRegistry { + + + List getProtocolFieldConfigList(Long protocolId); + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java index 608af3a..32cc8a4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java @@ -2,48 +2,47 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.delivery.decorator.ByteDecorator; +import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @AllArgsConstructor public class FieldDecoratorManger { - private final RuleDictDao ruleDictDao; + private final RuleConfigRegistry ruleDictDao; // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 // (1)静态的业务字段是字典里面可以配置的 // (2)动态的业务字段是通过规则生成的 public String contentMerge(String ruleJson, String sceneConent, String dynamicContent) { - List ruleDictList = ruleDictDao.getRuleDictConfig(); - Map ruleDictMap = ruleDictList.stream().collect( - Collectors.toMap(RuleDict::getId, e -> e)); - List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); - for (Map ruleMap : ruleMapList) { - String ruleType = String.valueOf(ruleMap.get("ruleType")); - ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); - NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); - byteDecorator.nodeDecoratorRule(nodeDecoratorParm); - } +// List ruleDictList = ruleDictDao.getRuleDictConfig(); +// Map ruleDictMap = ruleDictList.stream().collect( +// Collectors.toMap(RuleDict::getId, e -> e)); +// List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); +// for (Map ruleMap : ruleMapList) { +// String ruleType = String.valueOf(ruleMap.get("ruleType")); +// ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); +// NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); +// byteDecorator.nodeDecoratorRule(nodeDecoratorParm); +// } return null; } - - private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { - NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() - .contents(sceneConent) - .dynamicContent(dynamicContent) - .ruletypeId(ruletypeId) - .ruleDictMap(ruleDictMap) - .build(); - return nodeDecoratorParm; - } +// +// private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { +// NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() +// .contents(sceneConent) +// .dynamicContent(dynamicContent) +// .ruletypeId(ruletypeId) +// .ruleDictMap(ruleDictMap) +// .build(); +// return nodeDecoratorParm; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java index 652970c..b204ac3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java @@ -1,56 +1,56 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@AllArgsConstructor -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", - JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Component; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Component("logicalDecorator") +//@AllArgsConstructor +//@Slf4j +//public class LogicalShiftDecorator implements ByteDecorator { +// +//// private final FieldRuleEngineMapper fieldRuleEngineMapper; +//// +//// //字节位移 +//// @Override +//// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +//// String logicalValue = ""; +//// RuleEvaluator fieldRuleEngine = new RuleEvaluator(); +//// try { +//// Map env2 = new HashMap(); +//// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +//// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +//// for (String contentId : contentIdList) { +//// RuleDict ruleDict = ruleDictMap.get(contentId); +//// if (ruleDict.getCode().contains("#")) { +//// //使用动态的值 +//// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +//// } +//// env2.put(ruleDict.getName(), ruleDict.getCode()); +//// } +//// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +//// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +//// return null; +//// } +//// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +//// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +//// return values; +//// } catch (Exception ex) { +//// log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", +//// JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +//// return null; +//// } +//// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java index 346468f..822fead 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@AllArgsConstructor -@Slf4j -public class OperationDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("optionDecorator") +//@AllArgsConstructor +//@Slf4j +//public class OperationDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //混合运算,有常量或者乘除的缩放 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java index 50fb0a7..7a8bccb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@AllArgsConstructor -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +////精度计算 +//@AllArgsConstructor +//@Registry("precisionDecorator") +//@Slf4j +//public class PrecisionDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java index da39235..27f9cc7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java @@ -1,54 +1,53 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@AllArgsConstructor -@Slf4j -public class RuleDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("ruleDecorator") +//@AllArgsConstructor +//@Slf4j +//public class RuleDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //吃我一套正则表达式 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (Exception ex) { +// log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java index 7f5cbf3..c043f97 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java @@ -2,6 +2,6 @@ import java.util.Map; -public interface ComandeEventService { +public interface ComandeEventService{ Map loadComandeEventConfig(String protocolId,String scene); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java index 476ad84..aaf1837 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java @@ -2,46 +2,46 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.dao.CommandEventDao; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @Slf4j @AllArgsConstructor -public class ComandeEventServiceImpl implements ComandeEventService { +public class ComandeEventServiceImpl implements ComandeEventRegistry { - private final CommandEventDao commandEventDao; + // private final CommandEventDao commandEventDao; // 加密bean 固定字段出现变化的字段解析,业务字段的有序内容 @Override - public Map loadComandeEventConfig(String protocolId,String sceneName) { - CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); - if (ObjectUtil.isEmpty(commandEventConfig)) { - log.error("协议{},没有配置成功接收回复配置,清排查原因"); - return null; - } - String replyJson = commandEventConfig.getReplyContentJson(); - List> replyMapList = JSONArray.parseObject(replyJson, List.class); - List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); - Map fixMap = fixList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); - List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) - .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) - .collect(Collectors.toList()); - Map commandConfigMap = new HashMap<>(); - commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); - commandConfigMap.put("fixContent", fixMap); - commandConfigMap.put("bizContent", contentList); - return commandConfigMap; + public Map loadComandeEventConfig(String protocolId, String sceneName) { +// CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); +// if (ObjectUtil.isEmpty(commandEventConfig)) { +// log.error("协议{},没有配置成功接收回复配置,清排查原因"); +// return null; +// } +// String replyJson = commandEventConfig.getReplyContentJson(); +// List> replyMapList = JSONArray.parseObject(replyJson, List.class); +// List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); +// Map fixMap = fixList.stream() +// .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); +// List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) +// .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) +// .collect(Collectors.toList()); +// Map commandConfigMap = new HashMap<>(); +// commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); +// commandConfigMap.put("fixContent", fixMap); +// commandConfigMap.put("bizContent", contentList); +// return commandConfigMap; + return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 128b09d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java deleted file mode 100644 index 4016b0b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface DatagramEventMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java deleted file mode 100644 index 597c306..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.apache.ibatis.annotations.Mapper; - -public interface FieldConfigMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java deleted file mode 100644 index a31680a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.PreRuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface PreRuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java deleted file mode 100644 index 9060a69..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface ProtocolConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java deleted file mode 100644 index 6fa6936..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java deleted file mode 100644 index 582a705..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleDict; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleDictMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java deleted file mode 100644 index 6e302c8..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.CommandEventMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Optional; - -@Component -public class CommandEventDao { - - @Resource - private CommandEventMapper commandEventMapper; - - public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId) - .eq("scene", sceneName) - .eq("enabled", 1); - List commandEventConfig = commandEventMapper.selectList(queryWrapper); - Optional optionalEventConfig = commandEventConfig.stream().findFirst(); - return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java deleted file mode 100644 index 9137e4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.FieldConfigMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class FieldConfigDao { - - @Resource - private FieldConfigMapper fieldConfigMapper; - - public FieldConfig getFieldConfigById(String fieldId) { - FieldConfig fieldConfig = fieldConfigMapper.selectById(fieldId); - return fieldConfig; - } - - public List getFieldConfigs(String protocolId,Integer isFixed) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",isFixed); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - - public List getStorageFieldConfig(String protocolId) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",1) - .eq("is_storage",1); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java deleted file mode 100644 index 67bff6b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.mapper.PreRuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class PreRuleConfigDao { - - @Resource - private PreRuleConfigMapper preRuleConfigMapper; - - public List getPreRuleList(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return preRuleConfigMapper.selectList(queryWrapper); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java deleted file mode 100644 index d69ea85..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.RuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleConfigDao { - - @Resource - private RuleConfigMapper ruleConfigMapper; - - public RuleConfig getNextRuleConfig(String ruleFields) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("parse_rule_json", ruleFields); - return ruleConfigMapper.selectOne(queryWrapper); - } - - - public List getRuleConfigById(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return ruleConfigMapper.selectList(queryWrapper); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java deleted file mode 100644 index 932c185..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.RuleDictMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleDictDao { - - @Resource - private RuleDictMapper ruleDictMapper; - - public List getRuleDictConfig() { - List ruleDictList = ruleDictMapper.selectList(null); - return ruleDictList; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java index 9f9e279..43bc4d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java @@ -10,20 +10,15 @@ import io.netty.channel.socket.nio.NioServerSocketChannel; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import javax.annotation.PreDestroy; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static cn.hutool.core.util.ClassUtil.getClasses; /** * SensorhubServer netty服务端 */ @Slf4j -@Service +@Component public class SensorhubServer { /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java index 2c79ff5..9a28c36 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java @@ -11,13 +11,13 @@ import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioSocketChannel; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClient 客户端 */ @Slf4j -@Service +@Registry public final class SensorhubClient { public static void main(String[] args) throws Exception { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java index 9774be0..477c3f7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java @@ -6,12 +6,12 @@ import io.netty.channel.socket.SocketChannel; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientChannelInitialHandler */ -@Service +@Registry public class SensorhubClientChannelInitialHandler extends ChannelInitializer { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java index 346f4b3..73560e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java @@ -5,13 +5,13 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientHandler */ @Slf4j -@Service +@Registry public class SensorhubClientHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java index 5c1c6f2..d990af5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java @@ -4,12 +4,12 @@ import com.casic.missiles.pojo.Msg; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** * SensorhubServerHandler */ -@Service +@Component public class SensorhubServerHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 67283ae..af3172c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,41 +1,37 @@ package com.casic.missiles.parser; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultProtocolConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.*; +import com.casic.missiles.registry.FieldConfigRegistry; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; -import java.nio.charset.Charset; import java.util.HashMap; import java.util.List; import java.util.Map; -@Service("genericProtocolParser") +/** + * @author + */ +@Component("genericProtocolParser") @Slf4j -@AllArgsConstructor +@RequiredArgsConstructor public class GenericProtocolParser implements ProtocolParser { - private final LeadingCodeMatcher leadingCodeMatcher; private final List frameStructDispenserList; - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorInstanceSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; // 匹配首字母前导码=> 帧结构匹配前导码=> // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 @@ -44,18 +40,19 @@ public Boolean doParseProtocol(ByteBuf byteBuf) { String protocolContent = ByteBufUtil.hexDump(byteBuf); //匹配前导码 - List preCodeConfigs = leadingCodeMatcher.matchLeadingCode(protocolContent); + List preCodeConfigs = LeadingCodeMatcher.matchFrameLeadingCode(protocolContent); //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 if (preCodeConfigs.size() == 0) { - return rematch(byteBuf,protocolContent); + return rematch(byteBuf, protocolContent); } - //暂时先取第一个 + //暂时先取第一个,提升速度,使用享元模式, 减少类的创建销毁与构建 ProtocolConfig protocolConfig = preCodeConfigs.get(0); + AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); ByteBuf wholeDatagramByte = null; //通过匹配帧结构获取完整的数据包 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, preCodeConfigs.get(0))) != null) { + if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, protocolFactory)) != null) { break; } } @@ -68,76 +65,78 @@ * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 */ - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId, wholeDatagramByte); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap, protocolId); - //选取规则对应的流程实例 - DatagramEventConfig datagramEventConfig = processorInstanceSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); + //进行规则字段解析,进行匹配规则 + RuleConfig ruleConfig = getRuleConfig(protocolFactory, wholeDatagramByte); + if (ruleConfig == null) { + return false; + } //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, wholeDatagramByte); + ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte); + //以下进行业务的规则解析,同时选定流程实例 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); + DatagramEventProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain, + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText, protocolId); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain); //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); + datagramEventProvider.storeData(bizDataMap); return true; } - private Boolean rematch(ByteBuf byteBuf,String protocolContent) { + /** + * 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 + */ + private Boolean rematch(ByteBuf byteBuf, String protocolContent) { //重置位判断 byteBuf.resetReaderIndex(); //判断重置是否前移,如果没有前移,则直接判为匹配失败 if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { return false; } else { + //递归执行 return doParseProtocol(byteBuf); } } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; + //获取匹配规则->匹配规则 + private RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + //取出其中参与逻辑provider并判空 + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); + String rulePrepareFields = protocolConfig.getRulePrepareFields(); + //固定字段 + if (StringUtils.isNotEmpty(rulePrepareFields)) { + //获取统一固定字段解析 + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + //获取该协议的字段配置,用于协议规则匹配 + List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); + //获取规则 + RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, + rulePrepareFields, protocolFieldConfigs); + return ruleConfig; + } + return null; } - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + //数据构建,获取固定字段的store和业务字段store + private Map buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + Map bizDataMap = new HashMap<>(); + Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); + Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); + bizDataMap.putAll(ruleStoreObjectMap); + bizDataMap.putAll(protocolStoreObjectMap); return bizDataMap; } - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java index 8a46e32..16ce2e5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java @@ -3,6 +3,7 @@ import io.netty.buffer.ByteBuf; public interface ProtocolParser { + Boolean doParseProtocol(ByteBuf byteBuf); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java new file mode 100644 index 0000000..f7814af --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java @@ -0,0 +1,35 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.ProtocolConfigProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.ProtocolConfig; + +/** + * 存放基本协议的的加载信息 + */ +public class AbstractProtocolConfigFactory { + private final ProtocolConfigProvider protocolConfigProvider; + private final ProtocolFieldConfigProvider protocolFieldConfigProvider; + private final RuleConfigProvider ruleConfigProvider; + + public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { + this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); + this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); + this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); + } + + public ProtocolConfigProvider getProtocolConfigProvider() { + return protocolConfigProvider; + } + + public ProtocolFieldConfigProvider getProtocolFieldConfigProvider() { + return protocolFieldConfigProvider; + } + + public RuleConfigProvider getRuleConfigProvider() { + return ruleConfigProvider; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java new file mode 100644 index 0000000..6e36147 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java @@ -0,0 +1,57 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.CombinedFieldConfigProvider; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.FieldConfigProvider; +import com.casic.missiles.parser.provider.FieldRuleConfigProvider; + +/** + * 存放规则相关的的的加载信息 + */ +public class AbstractRuleConfigFactory { + + /** + * 处理字节 + */ + private final FieldConfigProvider fieldConfigProvider; + /** + * 处理组合字节解析的解码器 + */ + private final CombinedFieldConfigProvider combinedFieldConfigProvider; + /** + * 处理负责字节解析的规则配置 + */ + private final FieldRuleConfigProvider fieldRuleConfigProvider; + /** + * 处理实例流程 + */ + private final DatagramEventProvider datagramEventProvider; + + + public AbstractRuleConfigFactory(Long ruleId) { + this.fieldConfigProvider = new FieldConfigProvider(ruleId); + this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); + this.fieldRuleConfigProvider = new FieldRuleConfigProvider(ruleId); + this.datagramEventProvider = new DatagramEventProvider(ruleId); + } + + public FieldConfigProvider getFieldConfigProvider() { + return fieldConfigProvider; + } + + public CombinedFieldConfigProvider getCombinedFieldConfigProvider() { + return combinedFieldConfigProvider; + } + + public FieldRuleConfigProvider getFieldRuleConfigProvider() { + return fieldRuleConfigProvider; + } + + public DatagramEventProvider getDatagramEventProvider() { + return datagramEventProvider; + } + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java deleted file mode 100644 index 6e1719a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.factory; - - -import com.casic.missiles.pojo.ProtocolConfig; - -import java.util.List; - -/** - * 数据库访问优化(暂时未做) - *

- * 1、初始化协议解析配置,并存放到处存放缓存,对协议基本配置进行管理 - * 2、其中流程中所有的配置都经过此类进行管理,进行调用获取,增强解析速度 - */ -public interface DatagramFactory { - - /** - * 初始化 - */ - List datagramInit(); - - /** - * 根据前导码配置匹配,模糊匹配获取所有的报文项 - */ - List match(); - - /** - * 根据前导码匹配,返回报文项 - */ - List filer(); - - /** - * 保证数据的唯一性选择器 - */ - List selectOne(); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java new file mode 100644 index 0000000..87444a0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java @@ -0,0 +1,18 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +import java.util.List; + +/** + * 直接用,还是边用边创建 + */ +public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { + + + public DefaultProtocolConfigFactory(ProtocolConfig protocolConfig) { + super(protocolConfig); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java new file mode 100644 index 0000000..cce0c7c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java @@ -0,0 +1,12 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; + +public class DefaultRuleFactory extends AbstractRuleConfigFactory { + + public DefaultRuleFactory(Long ruleId) { + super(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java deleted file mode 100644 index 9ee97e0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.casic.missiles.parser.instance; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service -@Slf4j -@AllArgsConstructor -public class GeneralProcessor { - - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; - - /** - * 统一固定字段解析=>进行规则的查询的判断 - * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 - * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 - */ - @Deprecated - public boolean parseWholeDatagram(ByteBuf buffer, ProtocolConfig protocolConfig) { - try { - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap,protocolId); - //选取规则对应的流程= - DatagramEventConfig datagramEventConfig = processorSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); - //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); - //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); - //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); - //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); - //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); - return true; - } catch (Exception ex) { - log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", - ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); - return false; - } - } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; - } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); - } - - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); - return bizDataMap; - } - - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java index 25e7ad8..6a5777e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java @@ -1,23 +1,31 @@ package com.casic.missiles.parser.instance.impl; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.mapper.DatagramEventMapper; import com.casic.missiles.pojo.DatagramEventConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.SpringContextUtil; -@Service -@AllArgsConstructor +import java.util.List; +import java.util.Optional; + +/** + * @author cz + * + */ public class DefaultProcessorInstanceSelector implements ProcessorInstanceSelector { - private final DatagramEventMapper datagramEventMapper; + private static List datagramEventConfigs; + + static { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + datagramEventConfigs = datagramEventRegistry.getDatagramEventList(); + } @Override public DatagramEventConfig getProcessorInstance(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("rule_id", protocolId); - return datagramEventMapper.selectOne(queryWrapper); + Optional optionalSelectInstance = datagramEventConfigs.stream() + .filter(e -> e.getId().equals(protocolId)).limit(1).findFirst(); + return optionalSelectInstance.isPresent() ? optionalSelectInstance.get() : null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a778671..7b56a43 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,16 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import io.netty.buffer.ByteBuf; /** - * 分析匹配情况 - * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 - * 2、匹配不成功,有后续帧,可以进行下次匹配。 - * 3、匹配不成功,无后续帧,可以进行丢弃。 + * 分析匹配情况 + * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 + * 2、匹配不成功,有后续帧,可以进行下次匹配。 + * 3、匹配不成功,无后续帧,可以进行丢弃。 */ -public interface FrameStructMatcher{ +public interface FrameStructMatcher { - ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig); + ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 05320ab..8ebea78 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,23 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.ProtocolConfigMapper; +import com.casic.missiles.parser.provider.ProtocolConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Component; import java.util.List; import java.util.stream.Collectors; -@Component -@AllArgsConstructor public class LeadingCodeMatcher { - private final ProtocolConfigMapper protocolMapper; - //** 1、首字母匹配前导码, // 2、以匹配出的前导码是否在报文中条件进行前导码的匹配二次筛选 - public List matchLeadingCode(String protocolContent){ + public static List matchFrameLeadingCode(String protocolContent){ List initialConfigs = initialMatch(protocolContent); List preCodeConfigs = initialConfigs.stream() .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) @@ -26,13 +19,16 @@ } //初始化匹配前导码内容 - private List initialMatch(String protocolContent) { - String protocolStr = protocolContent.charAt(0) + ""; - QueryWrapper queryWrapper = new QueryWrapper() - .likeRight("pre_fix", protocolStr); - List protocolConfigList = protocolMapper.selectList(queryWrapper); - return protocolConfigList; + private static List initialMatch(String protocolContent) { + String firstFrameChar = protocolContent.charAt(0) + ""; + ProtocolConfigProvider protocolConfigProvider=new ProtocolConfigProvider(firstFrameChar); + return protocolConfigProvider.getMatchList(); } + + + + + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index cf2113d..e915877 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -1,32 +1,35 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(0) -@Service +@Component public class FrameLengthMatcher implements FrameStructMatcher { - @Autowired - private FieldParser fieldParser; - //超过长度 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { String dataGramContent = ByteBufUtil.hexDump(byteBuf); - if (StringUtils.isEmpty(protocolConfig.getUnpackId()) && StringUtils.isEmpty(protocolConfig.getTailStr())) { - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + //当不存在结尾标志和拆包标志,可以直接使用长度进行匹配 + if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { if (dataGramContent.length() >= totalLength) {//等于长度返回true,超出长度,切断 - ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, protocolConfig, totalLength); + ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, totalLength); return wholeDatagramByte; } else { //读的标志位前移舍弃 @@ -38,7 +41,7 @@ return null; } - private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, Integer totalLength) { byteBuf.readBytes(totalLength); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, totalLength - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 2bfc213..d527ad0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; @@ -13,7 +13,7 @@ import lombok.AllArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.nio.charset.Charset; import java.util.Map; @@ -22,32 +22,30 @@ * 后续标志验证 */ @Order(1) -@Service +@Component @AllArgsConstructor -public class FrameMarkMatcher implements FrameStructMatcher { - - private final FieldConfigDao fieldConfigDao; - private final FieldParser fieldParser; - private final FieldResolver fieldResolverManger; +public class FrameMarkMatcher implements FrameStructMatcher, FixedPropertyEnum { //帧后续标志=>结束,进行帧的重组=>有后续,1、帧移位判别 2、继续接收帧 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig UnpackConfig = StringUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getUnpackId()); - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); - Integer upback = 0; + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); ByteBuf mergeWholeFrameByte = null; - if (!ObjectUtil.isEmpty(UnpackConfig)) { - while (hasNextFullFrame(byteBuf, protocolConfig)) { - upback = (Integer) fieldResolverManger.filedParserManger(byteBuf, UnpackConfig, null); + if (!ObjectUtil.isEmpty(unpackFlag)) { + while (hasNextFullFrame(byteBuf, protocolConfig, protocolFieldConfigProvider)) { //是否存在后续位 - if (upback == 1) {//使用esayRule + if (unpackFlag == 1) {//使用esayRule //表示可以截取 - mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolConfig, totalLength); + mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolFieldConfigProvider, protocolConfig); return mergeWholeFrameByte; } else { - byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig)); + byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig, protocolFieldConfigProvider)); } } } @@ -56,7 +54,8 @@ //选取第一个帧,将业务内容和后面部分分开 //计算数据报文-业务内容 - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolFieldConfigProvider protocolFieldConfigProvider, ProtocolConfig protocolConfig) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); //截取完整报文 byteBuf.readBytes(totalLength); ByteBuf byteBufContent = byteBuf.slice(0, byteBuf.readerIndex()); @@ -68,15 +67,15 @@ String tail = ""; System.out.println(ByteBufUtil.hexDump(byteBufContent)); //会存在多个帧拼接在一起的的情况,进行合并处理 - while (hasNextFullFrame(byteBufContent, protocolConfig)) { - Integer currentFrameLength = fieldParser.getTotalLength(protocolConfig, byteBufContent); + while (hasNextFullFrame(byteBufContent, protocolConfig, protocolFieldConfigProvider)) { + Integer currentFrameLength = protocolFieldConfigProvider.getTotalLength(byteBufContent, protocolConfig); byteBufContent.readBytes(currentFrameLength); ByteBuf currentbyteBuf = byteBufContent.slice(0, byteBufContent.readerIndex()); byteBufContent.markReaderIndex();//读的标志位前移 System.out.println(ByteBufUtil.hexDump(byteBufContent)); String hexDump = currentbyteBuf.toString(Charset.forName("ISO-8859-1")); //获取当前固定帧结构的关系map - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, currentbyteBuf); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(currentbyteBuf, protocolConfig); if (StringUtils.isEmpty(mergeFrameStr)) { //首次获取业务数据报文 mergeFrameStr += hexDump.substring(0, currentFrameFixedProperty.get("tailPosition")); @@ -95,22 +94,22 @@ /** * 获取平移到下一帧起始位置 */ - public int getNextFrameOffset(ByteBuf buffer, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, buffer); - return currentFrameFixedProperty.get("totalLength"); + public int getNextFrameOffset(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + return currentFrameFixedProperty.get(TOTAL_LENGTH); } /** * 判断是否出错进行整个帧的 */ - public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, byteBuf); + public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); //保证读取位置不在固定位置,是可变的业务内容 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("fixedPosition")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(FIXED_POSITION)) { return false; } //判断读取是否操作帧长度 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("totalLength")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(TOTAL_LENGTH)) { return false; } return true; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 76a3784..c3a1bab 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -1,50 +1,50 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.parser.instance.GeneralProcessor; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; +import io.netty.buffer.ByteBufUtil;; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(2) -@Service +@Component public class FrameTailMatcher implements FrameStructMatcher { - @Resource - private FieldConfigDao fieldConfigDao; - @Autowired - private GeneralProcessor generalProcessor; - //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig tailFieldConfig = StringUtils.isEmpty(protocolConfig.getTailStr()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getTailStr()); - if (!ObjectUtil.isEmpty(tailFieldConfig)) { - String tailStr = tailFieldConfig.getFieldName(); + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfig protocolFieldConfig = ObjectUtils.isEmpty(protocolConfig.getTailStr()) ? null : + fieldConfigProvider.getFieldConfigById(protocolConfig.getTailStr()); + if (!ObjectUtil.isEmpty(protocolFieldConfig)) { + String tailStr = protocolFieldConfig.getFieldName(); String dataGramContent = ByteBufUtil.hexDump(byteBuf); Boolean tailFlag = ByteBufUtil.hexDump(byteBuf).contains(tailStr); if (!tailFlag) { //使用esayRule return null; } else if (dataGramContent.indexOf(tailStr) < dataGramContent.length() - tailStr.length()) { Integer length = dataGramContent.indexOf(tailStr) + tailStr.length(); - ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, protocolConfig, length); + ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, length); return wholeDatagramByte; //存在粘包 } } return null; } - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer length) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, Integer length) { byteBuf.readBytes(length); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, length - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java new file mode 100644 index 0000000..5f1c177 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java @@ -0,0 +1,73 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.combined.GenericCombinedFieldResolver; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.CombinedFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class CombinedFieldConfigProvider { + + + /** + * 作为临时配置列表缓存使用 + */ + private final List combinedFieldConfigList; + private Map storeObjectMap = new HashMap<>(); + + public CombinedFieldConfigProvider(Long ruleId) { + CombinedFieldConfigRegistry combinedFieldConfigRegistry = SpringContextUtil.getBean(CombinedFieldConfigRegistry.class); + combinedFieldConfigList = combinedFieldConfigRegistry.getCombinedFieldConfigList(ruleId); + } + + public void parseDataField(RuleConfig ruleConfig, String clearZeroPlain,Map fieldConfigsMap ) { + if (showSkip()) { + return; + } + //匹配对应的数据,然后进行相关的字段解析 + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver(); + combinedFieldResolver.parseDataField(combinedFieldConfigList, byteBuf, storeObjectMap,fieldConfigsMap); + } + + + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getCombinedFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return combinedFieldConfigList.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public List getCombinedFieldConfigList() { + return combinedFieldConfigList; + } + + /* 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(combinedFieldConfigList) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java new file mode 100644 index 0000000..f3cfedc --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java @@ -0,0 +1,11 @@ +package com.casic.missiles.parser.provider; + +/** + * @author cz + * @date 2023-6-12 + */ +public class CommandEventProvider{ + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java new file mode 100644 index 0000000..70eec5e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java @@ -0,0 +1,77 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.safe.SafeStrategy; +import com.casic.missiles.parser.sender.DataSubscribeProvider; +import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class DatagramEventProvider { + + private final DatagramEventConfig processorInstance; + + public DatagramEventProvider(Long ruleId) { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + List datagramEventConfigList = + datagramEventRegistry.getDatagramEventList(ruleId); + processorInstance = this.getProcessorInstance(datagramEventConfigList); + } + + public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { + if (showSkip()) { + return null; + } + return datagramEventConfigList.get(0); + } + + // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 + public String getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap) { + String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? + processorInstance.getSafeBean() : + fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); + if (!StringUtils.isEmpty(safeName)) { + //需要加密 + SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); + String plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); + return clearComplementZero(plain); + } + return ByteBufUtil.hexDump(bizDataContent); + } + + //解密清零操作 + private String clearComplementZero(String plain) { + plain = plain.substring(0, plain.lastIndexOf("00")); + return plain; + } + + //数据发送,数据发送者暂未构建 + public void storeData(Map bizDataMap) { + DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); +// dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return ObjectUtils.isNotEmpty(processorInstance) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java new file mode 100644 index 0000000..7e1fe0a --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java @@ -0,0 +1,97 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.FieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class FieldConfigProvider { + + + private final List fieldConfigs; + private Map storeObjectMap = new HashMap<>(); +// private Map singleObjects = new ConcurrentHashMap<>(); + + public FieldConfigProvider(Long ruleId) { + FieldConfigRegistry fieldConfigRegistry = SpringContextUtil.getBean(FieldConfigRegistry.class); + fieldConfigs = fieldConfigRegistry.getFieldConfigList(ruleId); + } + + public List getFieldConfigs() { + return fieldConfigs; + } + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public Map parseDataField(RuleConfig ruleConfig, String clearZeroPlain) { + if (showSkip()) { + return null; + } + List prepareFieldConfig = prepareParseField(ruleConfig); + if (CollectionUtils.isNotEmpty(prepareFieldConfig)) { + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(fieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + return fixDataMap; + } + } + return null; + } + + /** + * 得到需要处理的业务内容 + * + * @return + */ + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return fieldConfigs.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public Map getFieldConfigsMap() { + return fieldConfigs.stream().collect( + Collectors.toMap(FieldConfig::getId, e -> e) + ); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(fieldConfigs) ? false : true; + } + + +} + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java new file mode 100644 index 0000000..817bfaf --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java @@ -0,0 +1,19 @@ +package com.casic.missiles.parser.provider; + +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.registry.FieldRuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; + +public class FieldRuleConfigProvider { + + private final List fieldRuleConfigList; + + public FieldRuleConfigProvider(Long ruleId) { + FieldRuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(FieldRuleConfigRegistry.class); + fieldRuleConfigList = ruleConfigRegistry.getFieldRuleConfigList(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java new file mode 100644 index 0000000..99a1b06 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java @@ -0,0 +1,53 @@ +package com.casic.missiles.parser.provider; + + +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.registry.ProtocolConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolConfigProvider { + + private final List protocolConfigList; + + public ProtocolConfigProvider(String firstChar) { + ProtocolConfigRegistry registry = SpringContextUtil.getBean(ProtocolConfigRegistry.class); + protocolConfigList = registry.getProtocolConfigList(firstChar); + } + + public List getMatchList() { + return protocolConfigList; + } + + /** + * 设置当前协议 + * + * @param protocolConfig + */ + public ProtocolConfigProvider(ProtocolConfig protocolConfig) { + List protocolConfigs = new ArrayList<>(); + protocolConfigs.add(protocolConfig); + protocolConfigList = protocolConfigs; + } + + /** + * 获取当前协议 + * + * @return + */ + public ProtocolConfig getCurrentProtocolConfig() { + if (this.protocolConfigList == null) { + return null; + } else { + return protocolConfigList.get(0); + } + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java new file mode 100644 index 0000000..043927d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java @@ -0,0 +1,213 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.registry.ProtocolFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolFieldConfigProvider { + + private static final String FIXED_FIELD_DS = "fixedFieldDs"; + private static final String CONTENT_FIELD_DS = "contentFieldDs"; + private static final String PROTOCOL_LENGTH = "protocolLength"; + private static final String PROTOCOL_FIELD_ID = "protocolFieldId"; + private static final String PROTOCOL_POSITION = "protocolPosition"; + + private final List protocolFieldConfigs; + private Map singleObjects = new ConcurrentHashMap<>(); + private Map storeObjectMap = new HashMap<>(); + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public ProtocolFieldConfigProvider(Long protocolId) { + ProtocolFieldConfigRegistry protocolFieldConfigRegistry = SpringContextUtil.getBean(ProtocolFieldConfigRegistry.class); + protocolFieldConfigs = protocolFieldConfigRegistry.getProtocolFieldConfigList(protocolId); + } + + public List getProtocolFieldConfigs() { + return protocolFieldConfigs; + } + + public ProtocolFieldConfig getFieldConfigById(Long fieldId) { + Optional optionalConfig = protocolFieldConfigs.stream().filter( + e -> e.getId().equals(fieldId) + ).findFirst(); + return optionalConfig.isPresent() ? optionalConfig.get() : null; + } + + public Integer getProtocolFieldValue(Long protocolFieldId, ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_FIELD_ID + protocolFieldId + ByteBufUtil.hexDump(byteBuf); + //获取缓存 + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + //加载固定长度数据集合 + Map fixDataMap = this.getProtocolDataMap(byteBuf); + ProtocolFieldConfig protocolFieldConfig = selectFieldConfig(protocolFieldId); + Integer protocolFieldValue = 0; + //获取约定字段的总长度 + if (fixDataMap.containsKey(protocolFieldConfig.getFieldName())) { + Object appointUnpackObject = fixDataMap.get(protocolFieldConfig.getFieldName()); + if (ObjectUtils.isNotEmpty(appointUnpackObject)) { + protocolFieldValue = (Integer) appointUnpackObject; + } + } + if (protocolFieldValue != null) { + //加入缓存 + if (ObjectUtils.isNotEmpty(protocolFieldValue)) { + this.singleObjects.put(catchKey, protocolFieldValue); + return protocolFieldValue; + } + } + return null; + } + + /** + * 获取帧固定位置信息 + * + * @param byteBuf + * @param protocolConfig + * @return + */ + public Map getFixedProperty(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_POSITION + protocolConfig.getId(); + if (this.singleObjects.containsKey(catchKey)) { + return (Map) singleObjects.get(catchKey); + } + Map fixedPropertyMap = new HashMap<>(); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + fixedPropertyMap = fieldParser.doGetFixedProperty(protocolFieldConfigs, this.getTotalLength(byteBuf,protocolConfig)); + if (CollectionUtils.isNotEmpty(fixedPropertyMap)) { + this.singleObjects.put(catchKey, fixedPropertyMap); + return fixedPropertyMap; + } + return fixedPropertyMap; + } + + /** + * 获取帧结构应有的总长度 + */ + public Integer getTotalLength(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_LENGTH + ByteBufUtil.hexDump(byteBuf); + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + Integer appointFrameLength = getProtocolFieldValue(protocolConfig.getTotalLengthId(), byteBuf); + if (appointFrameLength != null) { + //获取过滤的字段集合总长度 + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Integer totalFilterLength = fieldParser.getTotalFilterLength(protocolConfig, byteBuf, getFixFieldConfigMap()); + //计算总长度 + Integer totalLength = appointFrameLength + totalFilterLength; + //加入缓存 + if (ObjectUtils.isNotEmpty(totalLength)) { + this.singleObjects.put(catchKey, totalLength); + return totalLength; + } + } + return null; + } + + /** + * 获取协议有关字段解析内容 + * storeObjectMap存储代转存的数据 + * + * @return + */ + public Map getProtocolDataMap(ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(FIXED_FIELD_DS)) { + return (Map) singleObjects.get(FIXED_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(protocolFieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + this.singleObjects.put(FIXED_FIELD_DS, fixDataMap); + return fixDataMap; + } + return null; + } + + /** + * 获取业务报文内容的content字节 + * + * @param wholeDatagramByte + * @return + */ + public ByteBuf getDataContentBuf(ByteBuf wholeDatagramByte) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(CONTENT_FIELD_DS)) { + return (ByteBuf) singleObjects.get(CONTENT_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + ByteBuf bizDataByteBuf = fieldParser.getDataContentBuf(protocolFieldConfigs, wholeDatagramByte); + if (bizDataByteBuf != null) { + this.singleObjects.put(CONTENT_FIELD_DS, bizDataByteBuf); + return bizDataByteBuf; + } + return null; + } + + + private ProtocolFieldConfig selectFieldConfig(Long id) { + Optional optionalProtocolFieldConfig = this.protocolFieldConfigs.stream().filter( + e -> e.getId().equals(id) + ).findFirst(); + return optionalProtocolFieldConfig.isPresent() ? optionalProtocolFieldConfig.get() : null; + } + + + private Map getFixFieldConfigMap() { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, e -> e) + ); + return fixDataFieldMap; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(protocolFieldConfigs) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java new file mode 100644 index 0000000..dafba1c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java @@ -0,0 +1,56 @@ +package com.casic.missiles.parser.provider; + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.rule.GenericRuleResolver; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.RuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleConfigProvider { + + private final List ruleConfigs; + + public List getRuleConfigs() { + return ruleConfigs; + } + + public RuleConfigProvider(Long protocolId) { + RuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(RuleConfigRegistry.class); + ruleConfigs = ruleConfigRegistry.getRuleConfigById(protocolId); + } + + /** + * 获取规则匹配结果 + * + * @param parseFixedDataMap + * @param protocolFieldConfigs + * @return + */ + public RuleConfig doGetRule(Map parseFixedDataMap, + String ids, + List protocolFieldConfigs) { + if (showSkip()) { + return null; + } + RuleConfig ruleConfig = GenericRuleResolver.machRule(parseFixedDataMap, ids, protocolFieldConfigs, ruleConfigs); + return ruleConfig; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(ruleConfigs) ? false : true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java index 3c05891..856b399 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java @@ -1,18 +1,11 @@ package com.casic.missiles.parser.resolver; -import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.springframework.web.bind.annotation.RequestBody; -import javax.annotation.Resource; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -20,19 +13,17 @@ @Slf4j public class ByteMergeProvider { - @Resource - private FieldRuleEngineMapper fieldRuleEngineMapper; - //拿到所有的值合并到一个值 - public String resolveByteMerge(List valueList, String ruletypeId, String vaildRange) { + public static String resolveByteMerge(List valueList, String ruleTypeId, String vaildRange) { String values = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Map vaildMap = getValidRangeMap(vaildRange); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(ruletypeId); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } + //暂时不处理 +// fieldRuleEngine = fieldRuleConfigMapper.selectById(ruleTypeId); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } Map env2 = new HashMap(); for (int i = 0; i < valueList.size(); i++) { if (vaildMap.containsKey(i)) { @@ -47,7 +38,7 @@ } } - private Map getValidRangeMap(String vaildRange) { + private static Map getValidRangeMap(String vaildRange) { String[] range = vaildRange.split(","); Map vaildMap = new HashMap(); for (int i = 0; i < range.length; i++) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 8d821cd..85d6bbf 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -1,9 +1,12 @@ package com.casic.missiles.parser.resolver; +import com.casic.missiles.pojo.AbstractFieldConfig; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; import io.netty.buffer.ByteBuf; +import java.util.List; import java.util.Map; /** @@ -11,18 +14,14 @@ */ public interface FieldParser { -// Map fieldProcess(String protocolContent,); - Map dataParser(RuleConfig ruleConfig, String lightText,String protocolId); + Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength); - Map fixDataParser(String protocolId, ByteBuf buffer); + Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap); - Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf); + ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer); - ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer); - - ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer); - - Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer); + Integer getTotalFilterLength(ProtocolConfig protocolConfig, ByteBuf byteBuf, Map protocolFieldConfigMap); } + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java new file mode 100644 index 0000000..9e0c00e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java @@ -0,0 +1,52 @@ +package com.casic.missiles.parser.resolver; + +import com.casic.missiles.pojo.AbstractFieldConfig; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.util.List; + +public class FieldParserSupport { + + //分别计算bit和byte长度=> 合并长度 + protected Integer calculateLength(List fieldConfigList) { + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + Integer fixedLength = bytefixedLength + bitfixedLength / 8; + return fixedLength; + } + + //找到最大值=> 根据最大值计算业务数据下标 + protected Integer calculatePosition(List fieldConfigList) { + String rex = "[0-9]+"; + Integer max = -1; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) + && Integer.valueOf(fieldConfig.getOriginPositionByte()) > max) { + max = Integer.valueOf(fieldConfig.getOriginPositionByte()); + } + } + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) && fieldConfig.getOriginPositionByte().equals(max)) { + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + } + } + Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; + return maxFixedPosition; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java deleted file mode 100644 index dd3a6cd..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java +++ /dev/null @@ -1,170 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.ByteResolverParam; -import io.netty.buffer.ByteBuf; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -/** - * 字段解析管理总类 - */ -@Service -@Slf4j -@AllArgsConstructor -public class FieldResolver extends ByteMergeProvider { - - //1、字段截取 => 2、简单的字节解析和复杂的字节解析 - public Object filedParserManger(ByteBuf byteBuf, FieldConfig fieldConfig, Integer maxFixedPosition) { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - //最大固定位置不为空, - if (!ObjectUtil.isEmpty(maxFixedPosition)) { - orignPosition -= maxFixedPosition; - } - Object fieldValue = 0; - //待优化 - if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { - fieldValue = bitToResolver(byteBuf, fieldConfig); - } else { - ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); - fieldValue = parsingFields(fieldBytes, fieldConfig.getRuleJson()); - } - return fieldValue; - } - - //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, - //目前默认配置的规则设置暂不支持配置化,由实现完成 - private Object parsingFields(ByteBuf byteBuf, String ruleJson) { - Object fieldsResolveValue = null; - List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); - if (ObjectUtil.isEmpty(ruleMapList)) { - fieldsResolveValue = defaultResolveBuilder(byteBuf); - } else { - fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); - } - return fieldsResolveValue; - } - - private Object defaultResolveBuilder(ByteBuf byteBuf) { - Integer defaultResolveValue = 0; - for (int i = 0; i < byteBuf.writerIndex(); i++) { - defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; - } - return defaultResolveValue; - } - - //字段解析构建器(针对字节单位的) - //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 - // 字节归并结束或者规则结束=>继续根据规则进行判断 - private Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { - Object customizeResolveValue = null; - try { - List bytStrList = new ArrayList<>(); - //存放到数组里面 - for (int i = 0; i < byteBuf.writerIndex(); i++) { - bytStrList.add(byteBuf.readByte()); - } - int i = 0; - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - customizeResolveValue = this.resolveByteMerge(bytStrList, ruletypeId,vaildRange); - break; - } else { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - List tempBytStr = new ArrayList<>(); - for (int k = 0; i < bytStrList.size(); i++) { - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(k) - .value(bytStrList.get(k)) - .ruletypeId(ruletypeId).build(); - tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); - } - bytStrList = tempBytStr; - } - i++; - } - //字节归并到一起=>继续根据规则进行判断 - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(customizeResolveValue) - .ruletypeId(ruletypeId).build(); - customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(customizeResolveValue)); - return customizeResolveValue; - } catch (RuntimeException ex) { - log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); - return null; - } - } - - /** - * 1、单个字节情况表示字段 - * 2、多字节情况表示字段(暂未处理) - */ - private Object bitToResolver(ByteBuf byteBuf, FieldConfig fieldConfig) { - Object fieldValue = new Object(); - try { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - byte fields = 0x00; - if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); - } else { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); - } - - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { - if (!StringUtils.isEmpty(fieldConfig.getExactOrignPosition())) { - fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getExactOrignPosition())).byteValue() - >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); - } else { - fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); - } - } else { - fieldValue = Integer.valueOf(fields & 0xff); - } - if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { - return fieldValue; - } - List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); - int i = 0; - //字节归并到一起=>继续根据规则进行判断 - while (i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(fieldValue) - .ruletypeId(ruletypeId).build(); - fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(fieldValue)); - return fieldValue; - } catch (RuntimeException ex) { - log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); - return null; - } - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java new file mode 100644 index 0000000..1d2aeab --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java @@ -0,0 +1,36 @@ +package com.casic.missiles.parser.resolver.bytes; + +import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.mapper.FieldRuleConfigMapper; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.pojo.ByteResolverParam; +import com.googlecode.aviator.AviatorEvaluator; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; +//转换规则 +@Component("convert") +@AllArgsConstructor +@Slf4j +public class ByteRuleResolver implements ByteResolver { + + private final FieldRuleConfigMapper fieldRuleConfigMapper; + + @Override + public Object resolveOperationRule(ByteResolverParam byteResolverParam){ + FieldRuleConfig fieldRuleEngine=fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); + if(ObjectUtil.isEmpty(fieldRuleEngine)){ + return byteResolverParam.getValue(); + } + String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); + Map env2 = new HashMap(); + env2.put("value", (byte) byteResolverParam.getValue()); + String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); + return values; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java index 103821c..786b71c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java @@ -2,34 +2,34 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("logicalShift") +@Component("logicalShift") @AllArgsConstructor @Slf4j public class LogicalShiftResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //字节位移 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { Integer index = byteResolverParam.getIndex(); - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return byteResolverParam.getValue(); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java index 476747d..01149bd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("operation") +@Component("operation") @AllArgsConstructor @Slf4j public class OperationResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //混合运算,有常量或者乘除的缩放 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java index 0b82cf4..79abcce 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.casic.missiles.pojo.ByteResolverParam; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; //精度计算 -@Service("precision") +@Component("precision") @AllArgsConstructor @Slf4j public class PrecisionResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java deleted file mode 100644 index 5c3f332..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; -//转换规则 -@Service("convert") -@AllArgsConstructor -@Slf4j -public class RuleResolver implements ByteResolver { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam){ - RuleEvaluator fieldRuleEngine=fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); - if(ObjectUtil.isEmpty(fieldRuleEngine)){ - return byteResolverParam.getValue(); - } - String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); - Map env2 = new HashMap(); - env2.put("value", (byte) byteResolverParam.getValue()); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java new file mode 100644 index 0000000..d3bbd91 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java @@ -0,0 +1,15 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; + +import java.util.List; +import java.util.Map; +// 前导码匹配->长度字段 +public interface AbstractCombinedFieldProcessor { + + Map invoke(Map map, ByteBuf byteBuf, List combinedFieldConfigList, + Map fieldConfigsMap, Map storeObjectMap); + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java new file mode 100644 index 0000000..03c8480 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java @@ -0,0 +1,59 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-13 + */ +//依次递增进行数据的解析, +public class GenericCombinedFieldResolver { + + + //通过查询,字段长度长度随机 + public void parseDataField(List combinedFieldConfigList, ByteBuf byteBuf, + Map storeObjectMap, Map fieldConfigsMap) { + Integer frameLength = Integer.valueOf(ByteBufUtil.hexDump(byteBuf)); + //添加前置处理器 + com.casic.missiles.util.ClassUtil classUtil = new com.casic.missiles.util.ClassUtil(); + List abstractCombinedProcessors = classUtil.getSubClassList(AbstractCombinedFieldProcessor.class); + + Map fieldFixedMap = combinedFieldLeadCodeMap(combinedFieldConfigList); + //frameLength + Map combinedProcessorFields = null; + while (byteBuf.readableBytes() < frameLength) { + //一直处理 + for (AbstractCombinedFieldProcessor abstractCombinedProcessor : abstractCombinedProcessors) { + combinedProcessorFields = abstractCombinedProcessor.invoke(combinedProcessorFields, byteBuf, + combinedFieldConfigList, + fieldConfigsMap, storeObjectMap); + if (combinedProcessorFields == null || byteBuf.readableBytes() < frameLength) { + return; + } + } + + } + } + + /** + * 取出前导码匹配集合 + */ + private Map combinedFieldLeadCodeMap(List combinedFieldConfigList) { + Map fieldFixedMap = combinedFieldConfigList + .stream() + .collect(Collectors.toMap(CombinedFieldConfig::getPrefixCode, e -> e)); + return fieldFixedMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java new file mode 100644 index 0000000..643a934 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java @@ -0,0 +1,100 @@ +package com.casic.missiles.parser.resolver.fields; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.FieldParserSupport; +import com.casic.missiles.pojo.*; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 保存使用时最基本的信息,并且使用原型模式 + */ +@Slf4j +public class DefaultProtocolFieldParser extends FieldParserSupport implements FieldParser, FixedPropertyEnum { + + //通过传入的配置和报文进行字段解析 + @Override + public Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap) { + Map dataMap = new HashMap<>(); + for (AbstractFieldConfig protocolFieldConfig : protocolFieldConfigs) { + if (!ObjectUtils.isEmpty(protocolFieldConfig.getOriginPositionByte())) { + Object fieldValue = FieldResolver.parseField(buffer, protocolFieldConfig, null); + if (protocolFieldConfig.getIsStorage() == 1) { + storeObjectMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + dataMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + } + return dataMap; + } + + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength) { + Map fixedPropertyMap = new HashMap<>(); + Integer fixedLength = calculateLength(protocolFieldConfigs); + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + fixedPropertyMap.put(FIXED_POSITION, maxFixedPosition); + fixedPropertyMap.put(TOTAL_LENGTH, totalLength); + fixedPropertyMap.put(TAIL_POSITION, totalLength - fixedLength + maxFixedPosition); + return fixedPropertyMap; + } + + //** 获取业务内容的byteBuf + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer) { + //计算固定长度 + Integer fixedLength = calculateLength(protocolFieldConfigs); + //总长度获取 + String lightText = buffer.toString(Charset.forName("ISO-8859-1")); + Integer totalLength = lightText.length(); + //计算固定长度最大长度 + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + //计算数据报文内容 + ByteBuf bizDataFields = buffer.slice(maxFixedPosition - 1, (totalLength - fixedLength)); + return bizDataFields; + } + + /** + * 获取过滤字段的长度 + */ + @Override + public Integer getTotalFilterLength(ProtocolConfig protocolConfig, + ByteBuf byteBuf, + Map protocolFieldConfigMap) { + if (ByteBufUtil.hexDump(byteBuf).equals("")) { + return 0; + } + int totalFilterLength = 0; + String filterFields = protocolConfig.getTotalLengthFilterFields(); + try { + if (!StringUtils.isEmpty(filterFields)) { + String[] filterFieldList = filterFields.split(","); + for (String filterFieldId : filterFieldList) { + if (StringUtils.isNotEmpty(filterFieldId)) { + ProtocolFieldConfig fieldConfig = protocolFieldConfigMap.get(Long.valueOf(filterFieldId)); + //这里都是按字节计算,没有对位进行区分,可能会出现错误 + // 如果对位有需求,需要进一步跟进 + totalFilterLength += fieldConfig.getOffsetLength(); + } + } + } + return totalFilterLength; + } catch (Exception ex) { + log.error("报文确认分发阶段,获取报文总长度过滤长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); + } + return totalFilterLength; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java new file mode 100644 index 0000000..d51e887 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java @@ -0,0 +1,169 @@ +package com.casic.missiles.parser.resolver.fields; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.parser.resolver.ByteMergeProvider; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.AbstractFieldConfig; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.pojo.ByteResolverParam; +import io.netty.buffer.ByteBuf; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * 字段解析管理总类 + */ +@Slf4j +public class FieldResolver extends ByteMergeProvider { + + //1、字段截取 => 2、简单的字节解析和复杂的字节解析 + public static Object parseField(ByteBuf byteBuf,AbstractFieldConfig fieldConfig, Integer maxFixedPosition) { + Integer orignPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + //最大固定位置不为空, + if (!ObjectUtil.isEmpty(maxFixedPosition)) { + orignPosition -= maxFixedPosition; + } + Object fieldValue = 0; + //待优化 + if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { + fieldValue = doParseBitField(byteBuf, fieldConfig); + } else { + ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); + fieldValue = doParseByteField(fieldBytes, fieldConfig.getRuleJson()); + } + return fieldValue; + } + + //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, + //目前默认配置的规则设置暂不支持配置化,由实现完成 + private static Object doParseByteField(ByteBuf byteBuf, String ruleJson) { + Object fieldsResolveValue = null; + List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); + if (ObjectUtil.isEmpty(ruleMapList)) { + fieldsResolveValue = defaultResolveBuilder(byteBuf); + } else { + fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); + } + return fieldsResolveValue; + } + + private static Object defaultResolveBuilder(ByteBuf byteBuf) { + Integer defaultResolveValue = 0; + for (int i = 0; i < byteBuf.writerIndex(); i++) { + defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; + } + return defaultResolveValue; + } + + //字段解析构建器(针对字节单位的) + //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 + // 字节归并结束或者规则结束=>继续根据规则进行判断 + private static Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { + Object customizeResolveValue = null; + try { + List bytStrList = new ArrayList<>(); + //存放到数组里面 + for (int i = 0; i < byteBuf.writerIndex(); i++) { + bytStrList.add(byteBuf.readByte()); + } + int i = 0; + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { + if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + customizeResolveValue = resolveByteMerge(bytStrList, ruletypeId, vaildRange); + break; + } else { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + List tempBytStr = new ArrayList<>(); + for (int k = 0; i < bytStrList.size(); i++) { + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(k) + .value(bytStrList.get(k)) + .ruletypeId(ruletypeId).build(); + tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); + } + bytStrList = tempBytStr; + } + i++; + } + //字节归并到一起=>继续根据规则进行判断 + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(null) + .value(customizeResolveValue) + .ruletypeId(ruletypeId).build(); + customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); + i++; + } + System.out.println(JSON.toJSON(customizeResolveValue)); + return customizeResolveValue; + } catch (RuntimeException ex) { + log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); + return null; + } + } + + /** + * 1、单个字节情况表示字段 + * 2、多字节情况表示字段(暂未处理) + */ + private static Object doParseBitField(ByteBuf byteBuf,AbstractFieldConfig fieldConfig) { + Object fieldValue = new Object(); + try { + Integer orignPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + byte fields = 0x00; + if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { + fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); + } else { + fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); + } + + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { + if (!StringUtils.isEmpty(fieldConfig.getOriginPositionBit())) { + fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getOriginPositionBit())).byteValue() + >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); + } else { + fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); + } + } else { + fieldValue = Integer.valueOf(fields & 0xff); + } + if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { + return fieldValue; + } + List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); + int i = 0; + //字节归并到一起=>继续根据规则进行判断 + while (i < ruleMapList.size()) { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(null) + .value(fieldValue) + .ruletypeId(ruletypeId).build(); + fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); + i++; + } + System.out.println(JSON.toJSON(fieldValue)); + return fieldValue; + } catch (RuntimeException ex) { + log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); + return null; + } + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java deleted file mode 100644 index 35ae3d0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java +++ /dev/null @@ -1,183 +0,0 @@ -package com.casic.missiles.parser.resolver.fields; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufAllocator; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; -import org.springframework.util.ObjectUtils; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service("standard") -@AllArgsConstructor -@Slf4j -public class StandardFieldParser implements FieldParser { - - private final FieldConfigDao fieldConfigDao; - private final FieldResolver fieldResolver; - - //数据解析 - @Override - public Map dataParser(RuleConfig ruleConfig, String lightText, String protocolId) { - String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); - ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); - bufferContent.writeBytes(lightText.getBytes(Charset.forName("ISO-8859-1"))); - Map dataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - for (String dataFieldId : dataFieldIds) { - FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(dataFieldId); - if (!ObjectUtils.isEmpty(fieldConfig)) { - dataMap.put(fieldConfig.getFieldName(), String.valueOf(fieldResolver.filedParserManger(bufferContent, fieldConfig, maxFixedPosition))); - } - } - return dataMap; - } - - //数据解析 - @Override - public Map fixDataParser(String protocolId, ByteBuf buffer) { - List dataFieldIdList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Map dataMap = new HashMap<>(); - for (FieldConfig dataField : dataFieldIdList) { - if (!ObjectUtils.isEmpty(dataField.getOrignPosition())) { - Object fieldValue = (Integer) fieldResolver.filedParserManger(buffer, dataField, null); - dataMap.put(dataField.getFieldName(), fieldValue); - } - } - return dataMap; - } - - @Override - public Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf) { - if (ByteBufUtil.hexDump(byteBuf).equals("")) { - return 0; - } - String filterFields = protocolConfig.getTotalLengthFilterField(); - Integer totalLength = 0; - try { - FieldConfig totalFieldConfig = fieldConfigDao.getFieldConfigById(protocolConfig.getTotalLengthId()); - int totalFilterLength = 0; - if (!StringUtils.isEmpty(filterFields)) { - String[] filterFieldList = filterFields.split(","); - for (String filterField : filterFieldList) { - FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(filterField); - //这里都是按字节计算,没有对位进行区分,可能会出现错误 - - // 如果对位有需求,需要进一步跟进 - totalFilterLength += fieldConfig.getOffsetLength(); - } - } - totalLength = (Integer) fieldResolver.filedParserManger(byteBuf, totalFieldConfig, null) + totalFilterLength; - } catch (Exception ex) { - log.error("报文确认分发阶段,获取报文总长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); - } - return totalLength; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer) { - //业务内容 - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - String protocolId = String.valueOf(protocolConfig.getId()); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - //计算固定长度 - Integer fixedLength = calculateLength(fieldConfigList); -// Integer totalLength = this.getTotalLength(protocolConfig, buffer); - //总长度获取 - Integer totalLength = lightText.length(); - //计算固定长度最大长度 - Integer maxFixedPosition = calculatePosition(fieldConfigList); -// buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - //计算数据报文内容 - ByteBuf bizDataFields = buffer.slice(maxFixedPosition-1, (totalLength - fixedLength)); - return bizDataFields; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer) { - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - String protocolId = String.valueOf(protocolConfig.getId()); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer fixedLength = calculateLength(fieldConfigList); -// Integer totalLength = this.getTotalLength(protocolConfig, buffer); - Integer totalLength = lightText.length(); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - ByteBuf fixDataFields = buffer.slice(0, maxFixedPosition); - return fixDataFields; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer) { - String protocolId = String.valueOf(protocolConfig.getId()); - Map fixedPropertyMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer fixedLength = calculateLength(fieldConfigList); - Integer totalLength = this.getTotalLength(protocolConfig, buffer); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - fixedPropertyMap.put("fixedPosition", maxFixedPosition); - fixedPropertyMap.put("totalLength", totalLength); - fixedPropertyMap.put("tailPosition", totalLength - fixedLength + maxFixedPosition); - return fixedPropertyMap; - } - - //分别计算bit和byte长度=> 合并长度 - private Integer calculateLength(List fieldConfigList) { - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (FieldConfig fieldConfig : fieldConfigList) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - Integer fixedLength = bytefixedLength + bitfixedLength / 8; - return fixedLength; - } - - //找到最大值=> 根据最大值计算业务数据下标 - private Integer calculatePosition(List fieldConfigList) { - String rex = "[0-9]+"; - Integer max = -1; - for (FieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOrignPosition()) - && Integer.valueOf(fieldConfig.getOrignPosition()) > max) { - max = Integer.valueOf(fieldConfig.getOrignPosition()); - } - } - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (FieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOrignPosition()) && fieldConfig.getOrignPosition().equals(max)) { - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - } - } - Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; - return maxFixedPosition; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java new file mode 100644 index 0000000..d4ec6c7 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java @@ -0,0 +1,76 @@ +package com.casic.missiles.parser.rule; + +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import org.apache.commons.lang3.StringUtils; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class GenericRuleResolver { + + //根据前置字段的值,找到指定的规则 + //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 + //=>循环判断=>通过规则得到业务字段 + public static RuleConfig machRule(Map fixDataMap, + String ids, + List protocolFieldConfigs, + List ruleConfigs) { + List preRuleConfigList = getPreRuleList(ids, protocolFieldConfigs); + //获取前置规则字段 + final Map metaDataMap = getPreRuleFields(preRuleConfigList, fixDataMap); + //准备固定的字段集合 + Map fixDataFieldMap = getFixDataFieldMap(protocolFieldConfigs); + return RuleResolverCore.doMachRule(ruleConfigs, metaDataMap, fixDataMap, fixDataFieldMap); + } + + private static Map getFixDataFieldMap(List protocolFieldConfigs) { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, ProtocolFieldConfig::getFieldName) + ); + return fixDataFieldMap; + } + + + /** + * 查询前置规则的字段配置 + * + * @param ids + * @return + */ + private static List getPreRuleList(String ids, List protocolFieldConfigs) { + String[] idList = ids.split(","); + Map prepareMaps = new HashMap<>(); + for (String id : idList) { + if (StringUtils.isNotEmpty(id)) { + prepareMaps.put(Long.valueOf(id), ""); + } + } + List preRuleConfigList = protocolFieldConfigs + .stream() + .filter(e -> prepareMaps.containsKey(e.getId())) + .collect(Collectors.toList()); + return preRuleConfigList; + } + + /** + * 获取前置规则解析字段 + */ + private static Map getPreRuleFields(List preRuleFieldConfigList, Map fixDataMap) { + Map ruleFieldMap = new HashMap<>(); + preRuleFieldConfigList.stream() + .forEach( + preRuleFieldConfig -> { + String fieldName = preRuleFieldConfig.getFieldName(); + if (fixDataMap.containsKey(fieldName)) { + ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); + } + } + ); + return ruleFieldMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java new file mode 100644 index 0000000..baae7e8 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -0,0 +1,68 @@ +package com.casic.missiles.parser.rule; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.casic.missiles.pojo.RuleConfig; + +import java.util.*; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleResolverCore { + + + public static RuleConfig doMachRule(List ruleConfigList, Map metaDataMap, + Map fixDataMap, + Map fixDataFieldMap) { + Optional ruleConfigOptional = ruleConfigList.stream() + .filter(ruleConfig -> machRuleConfig( + JSON.parseObject(ruleConfig.getMatchRuleJson(), Map.class), metaDataMap)) + .findFirst(); + if (ObjectUtil.isEmpty(ruleConfigOptional)) { + return null; + } + String[] ruleFields = ruleConfigOptional.get().getDataFieldIds().split(","); + Map ruleMetaDataMap = getRuleFields(ruleFields, fixDataMap, fixDataFieldMap); + //递归选定解析规则,进行规则解析 + if (!ruleConfigOptional.get().getIsFinishMatch().equals("1")) { + //递归选定规则 + doMachRule(ruleConfigList, ruleMetaDataMap, fixDataMap, fixDataFieldMap); + } + return ruleConfigOptional.get(); + } + + + private static Map getRuleFields(String[] preRuleConfigList, Map fixedDataMap, + Map fixedFieldMap) { + Map ruleFieldMap = new HashMap<>(); + for (String preRuleConfigId : preRuleConfigList) { + String fieldName = fixedFieldMap.get(preRuleConfigId); + if (fixedDataMap.containsKey(fieldName)) { + ruleFieldMap.put(fieldName, String.valueOf(fixedDataMap.get(fieldName))); + } + } + return ruleFieldMap; + } + + + //匹配规则配置 + private static Boolean machRuleConfig(Map ruleMap, Map metaDataMap) { + if (ruleMap == null || metaDataMap == null) { + return null; + } + //所有的字段在规则里面必须有有配置 + for (String key : metaDataMap.keySet()) { + if (ruleMap.containsKey(key)) { + if (!ruleMap.get(key).equals(metaDataMap.get(key))) { + return false; + } + } else { + return false; + } + } + return true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java deleted file mode 100644 index 664088d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java +++ /dev/null @@ -1,92 +0,0 @@ -package com.casic.missiles.parser.rule; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.mapper.dao.PreRuleConfigDao; -import com.casic.missiles.mapper.dao.RuleConfigDao; -import lombok.AllArgsConstructor; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.*; -import java.util.stream.Collectors; - -@Service -@AllArgsConstructor -public class RulerProvider { - - private final FieldConfigDao fieldConfigDao; - private final PreRuleConfigDao preRuleConfigDao; - private final RuleConfigDao ruleConfigDao; - - //根据前置字段的值,找到指定的规则 - //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 - //=>循环判断=>通过规则得到业务字段 - public RuleConfig ruleConfig(Map fixDataMap, String protocolId) { - //批量获取规则 - List preRuleConfigList = preRuleConfigDao.getPreRuleList(protocolId); - //获取固定字段 - Map fixFieldMap = getAllFieldMap(protocolId); - //获取前置规则字段 - final String preRuleFields = getPreRuleFields(preRuleConfigList, fixDataMap, fixFieldMap); - List ruleConfigList = ruleConfigDao.getRuleConfigById(protocolId); - Optional ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig ->preRuleFields.equals( ruleConfig.getParseRuleJson())).findFirst(); - //递归选定解析规则,进行规则解析 - while (!ObjectUtil.isEmpty(ruleConfigOptional) && !ruleConfigOptional.get().getIsBizField().equals("1")) { - String ruleFields = getRuleFields(ruleConfigOptional.get().getDataFieldIds().split(","), fixDataMap, fixFieldMap); - ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig -> ruleConfig.getParseRuleJson().equals(ruleFields)).findFirst(); - } - return ruleConfigOptional.get(); - } - - /** - * 获取前置规则解析字段 - */ - private String getPreRuleFields(List preRuleConfigList, Map fixDataMap, Map fixFieldMap) { - Map ruleFieldMap= new HashMap<>(); - preRuleConfigList.stream() - .forEach( - preRuleConfig -> { - String fieldName = fixFieldMap.get(Long.valueOf(preRuleConfig.getRuleFieldId())); - if (fixDataMap.containsKey(fieldName)) { - ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); - } - } - ); - return JSONObject.toJSONString(ruleFieldMap); - } - - private Map getAllFieldMap(String protocolId) { - List fieldList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Map fixFieldMap = fieldList.stream().collect( - Collectors.toMap(FieldConfig::getId, FieldConfig::getFieldName) - ); - return fixFieldMap; - } - - private String getRuleFields(String[] preRuleConfigList, Map fixDataMap, Map fixFieldMap) { - Map ruleFieldMap= new HashMap<>(); - for (String preRuleConfigId : preRuleConfigList) { - String fieldName = fixFieldMap.get(preRuleConfigId); - if (fixDataMap.containsKey(fieldName)) { - ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); - } - } - return JSONObject.toJSONString(ruleFieldMap); - } - - //弃置 - private String ListToString(List ruleFieldList) { - String ruleFields = ""; - for (String ruleField : ruleFieldList) { - ruleFields += ruleField + ","; - } - ruleFields = StringUtils.isEmpty(ruleFields) ? ruleFields : ruleFields.substring(0, ruleFields.length() - 1); - return ruleFields; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java index 6177e10..bfa87a5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java @@ -2,7 +2,7 @@ public interface SafeStrategy { - String decryption(byte[] bytes); + String decryption(String cipher); String encryption(String lightText); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java index 618716c..6236302 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java @@ -9,9 +9,9 @@ //十六进制的字符串转换成字节数组 byte[] bytes = hexStrToBinaryStr(msg); //计算CRC8 - byte crc8 = CRC8(bytes, 0, bytes.length); - String crc8ToStr = "" + Integer.toHexString(0xff & crc8); - return crc8ToStr; +// String crc8ToStr = "" + Integer.toHexString(0xff & crc8); +// return crc8ToStr; + return null; } /** @@ -33,50 +33,5 @@ return bytes; } - /** - * CRC8 校验 多项式 x8+x2+x+1 - * - * @param b - * @param off - * @param len - * @return - */ - public static byte CRC8(final byte[] b, final int off, final int len) { - byte result = 0x00; - for (int i = 0; i < len; i++) { - result = CHECKSUM_TABLE[(result ^ (b[i + off] & 0xFF)) & 0xFF]; - } - return (byte) (result & 0xFFL); - } - - private final static byte[] CHECKSUM_TABLE = {(byte) 0x00, (byte) 0x07, (byte) 0x0e, (byte) 0x09, (byte) 0x1c, (byte) 0x1b, - (byte) 0x12, (byte) 0x15, (byte) 0x38, (byte) 0x3f, (byte) 0x36, (byte) 0x31, (byte) 0x24, (byte) 0x23, (byte) 0x2a, - (byte) 0x2d, (byte) 0x70, (byte) 0x77, (byte) 0x7e, (byte) 0x79, (byte) 0x6c, (byte) 0x6b, (byte) 0x62, (byte) 0x65, - (byte) 0x48, (byte) 0x4f, (byte) 0x46, (byte) 0x41, (byte) 0x54, (byte) 0x53, (byte) 0x5a, (byte) 0x5d, (byte) 0xe0, - (byte) 0xe7, (byte) 0xee, (byte) 0xe9, (byte) 0xfc, (byte) 0xfb, (byte) 0xf2, (byte) 0xf5, (byte) 0xd8, (byte) 0xdf, - (byte) 0xd6, (byte) 0xd1, (byte) 0xc4, (byte) 0xc3, (byte) 0xca, (byte) 0xcd, (byte) 0x90, (byte) 0x97, (byte) 0x9e, - (byte) 0x99, (byte) 0x8c, (byte) 0x8b, (byte) 0x82, (byte) 0x85, (byte) 0xa8, (byte) 0xaf, (byte) 0xa6, (byte) 0xa1, - (byte) 0xb4, (byte) 0xb3, (byte) 0xba, (byte) 0xbd, (byte) 0xc7, (byte) 0xc0, (byte) 0xc9, (byte) 0xce, (byte) 0xdb, - (byte) 0xdc, (byte) 0xd5, (byte) 0xd2, (byte) 0xff, (byte) 0xf8, (byte) 0xf1, (byte) 0xf6, (byte) 0xe3, (byte) 0xe4, - (byte) 0xed, (byte) 0xea, (byte) 0xb7, (byte) 0xb0, (byte) 0xb9, (byte) 0xbe, (byte) 0xab, (byte) 0xac, (byte) 0xa5, - (byte) 0xa2, (byte) 0x8f, (byte) 0x88, (byte) 0x81, (byte) 0x86, (byte) 0x93, (byte) 0x94, (byte) 0x9d, (byte) 0x9a, - (byte) 0x27, (byte) 0x20, (byte) 0x29, (byte) 0x2e, (byte) 0x3b, (byte) 0x3c, (byte) 0x35, (byte) 0x32, (byte) 0x1f, - (byte) 0x18, (byte) 0x11, (byte) 0x16, (byte) 0x03, (byte) 0x04, (byte) 0x0d, (byte) 0x0a, (byte) 0x57, (byte) 0x50, - (byte) 0x59, (byte) 0x5e, (byte) 0x4b, (byte) 0x4c, (byte) 0x45, (byte) 0x42, (byte) 0x6f, (byte) 0x68, (byte) 0x61, - (byte) 0x66, (byte) 0x73, (byte) 0x74, (byte) 0x7d, (byte) 0x7a, (byte) 0x89, (byte) 0x8e, (byte) 0x87, (byte) 0x80, - (byte) 0x95, (byte) 0x92, (byte) 0x9b, (byte) 0x9c, (byte) 0xb1, (byte) 0xb6, (byte) 0xbf, (byte) 0xb8, (byte) 0xad, - (byte) 0xaa, (byte) 0xa3, (byte) 0xa4, (byte) 0xf9, (byte) 0xfe, (byte) 0xf7, (byte) 0xf0, (byte) 0xe5, (byte) 0xe2, - (byte) 0xeb, (byte) 0xec, (byte) 0xc1, (byte) 0xc6, (byte) 0xcf, (byte) 0xc8, (byte) 0xdd, (byte) 0xda, (byte) 0xd3, - (byte) 0xd4, (byte) 0x69, (byte) 0x6e, (byte) 0x67, (byte) 0x60, (byte) 0x75, (byte) 0x72, (byte) 0x7b, (byte) 0x7c, - (byte) 0x51, (byte) 0x56, (byte) 0x5f, (byte) 0x58, (byte) 0x4d, (byte) 0x4a, (byte) 0x43, (byte) 0x44, (byte) 0x19, - (byte) 0x1e, (byte) 0x17, (byte) 0x10, (byte) 0x05, (byte) 0x02, (byte) 0x0b, (byte) 0x0c, (byte) 0x21, (byte) 0x26, - (byte) 0x2f, (byte) 0x28, (byte) 0x3d, (byte) 0x3a, (byte) 0x33, (byte) 0x34, (byte) 0x4e, (byte) 0x49, (byte) 0x40, - (byte) 0x47, (byte) 0x52, (byte) 0x55, (byte) 0x5c, (byte) 0x5b, (byte) 0x76, (byte) 0x71, (byte) 0x78, (byte) 0x7f, - (byte) 0x6a, (byte) 0x6d, (byte) 0x64, (byte) 0x63, (byte) 0x3e, (byte) 0x39, (byte) 0x30, (byte) 0x37, (byte) 0x22, - (byte) 0x25, (byte) 0x2c, (byte) 0x2b, (byte) 0x06, (byte) 0x01, (byte) 0x08, (byte) 0x0f, (byte) 0x1a, (byte) 0x1d, - (byte) 0x14, (byte) 0x13, (byte) 0xae, (byte) 0xa9, (byte) 0xa0, (byte) 0xa7, (byte) 0xb2, (byte) 0xb5, (byte) 0xbc, - (byte) 0xbb, (byte) 0x96, (byte) 0x91, (byte) 0x98, (byte) 0x9f, (byte) 0x8a, (byte) 0x8d, (byte) 0x84, (byte) 0x83, - (byte) 0xde, (byte) 0xd9, (byte) 0xd0, (byte) 0xd7, (byte) 0xc2, (byte) 0xc5, (byte) 0xcc, (byte) 0xcb, (byte) 0xe6, - (byte) 0xe1, (byte) 0xe8, (byte) 0xef, (byte) 0xfa, (byte) 0xfd, (byte) 0xf4, (byte) 0xf3}; } \ No newline at end of file diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java index 27c2838..6e078a3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java @@ -1,9 +1,6 @@ package com.casic.missiles.parser.safe.impl; -import cn.hutool.core.util.CharsetUtil; -import cn.hutool.crypto.symmetric.SM4; -import cn.hutool.crypto.symmetric.SymmetricCrypto; - +import com.casic.missiles.parser.safe.SafeStrategy; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; @@ -11,19 +8,44 @@ import org.bouncycastle.crypto.engines.SM4Engine; import org.bouncycastle.crypto.params.KeyParameter; import org.bouncycastle.util.encoders.Hex; - -import static cn.hutool.crypto.Mode.ECB; -import static cn.hutool.crypto.Padding.NoPadding; +import org.springframework.stereotype.Component; /** * SM4算法工具类 */ @Slf4j -public class Sm4 { +@Component("sm4") +public class Sm4 implements SafeStrategy { //加解密的字节快大小 public static final int BlockSize = 16; + @Override + public String decryption(String cipher) { + byte[] keyByte = { + 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 + }; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(keyByte); + byte[] in = Hex.decode(cipher); + byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); + String plain = EcbDecrypt(in, keyBytes); + return plain; + } + + @Override + public String encryption(String cipher) { + byte[] keyByte = { + 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 + }; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(keyByte); + byte[] in = Hex.decode(cipher); + byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); + String plain = EcbDecrypt(in, keyBytes); + return plain; + } + /** * SM4ECB加密算法,对内 * @@ -32,8 +54,6 @@ * @return */ private static byte[] ecb_encrypt(byte[] in, byte[] keyBytes) { - - SM4Engine sm4Engine = new SM4Engine(); sm4Engine.init(true, new KeyParameter(keyBytes)); byte[] out = new byte[in.length]; @@ -58,27 +78,6 @@ return cipher; } - - /** - * hutool 解密SM4 - * - * @param encodeContent - * @return - */ - public static String decode(String encodeContent) { - String key = "24ad182507479a5da3ad94d9d78ea203"; - try { - SymmetricCrypto sm4 = new SM4(ECB, NoPadding, key.getBytes()); - String decryptStr = sm4.decryptStr(encodeContent, CharsetUtil.CHARSET_UTF_8); - return decryptStr; - } catch (Exception e) { - e.printStackTrace(); - log.error("SM4解密失败"); - } - return null; - } - - /** * SM4的ECB加密算法 * @@ -129,20 +128,6 @@ return plain; } - /** - * SM4的ECB解密算法 - * - * @param cipher 输入的密文字符串 - * @param key 密钥 - * @return - */ - public static String EcbDecrypt(String cipher, String key) { - byte[] in = Hex.decode(cipher); - byte[] keyBytes = Hex.decode(key); - - String plain = EcbDecrypt(in, keyBytes); - return plain; - } /** * 主函数 @@ -151,28 +136,24 @@ */ public static void main(String[] args) { byte[] ciphertext = { + 0x4B, (byte) 0x8C, (byte) 0x9D, 0x08, (byte) 0xE4, (byte) 0xD3, 0x64, 0x42, (byte) 0xB9, (byte) 0xA5, (byte) 0xFE, (byte) 0xCD, (byte) 0x91, 0x1B, 0x38, (byte) 0xAC, (byte) 0xE9, 0x1C, (byte) 0xCD, 0x53, 0x02, (byte) 0xD7, 0x0C, (byte) 0x9B, (byte) 0x96, 0x30, 0x62, (byte) 0xE8, (byte) 0xFB, (byte) 0xEF, (byte) 0xB9, (byte) 0xFF, (byte) 0xDE, 0x19, (byte) 0x80, 0x35, 0x3E, (byte) 0x90, 0x4F, 0x2F, 0x12, 0x2B, 0x19, (byte) 0x8B, 0x6C, 0x7A, (byte) 0x85, (byte) 0xA1, (byte) 0xB1, (byte) 0x86, (byte) 0xA3, 0x7A, 0x46, 0x0C, 0x2F, (byte) 0x94, 0x4F, 0x7F, 0x2C, 0x56, 0x14, (byte) 0xF3, (byte) 0x89, (byte) 0xC3, - 0x3F, 0x20, (byte) 0xF9, (byte) 0x87, (byte) 0xA1, 0x60, (byte) 0xD9, (byte) 0xA8, (byte) 0xFD, (byte) 0xD7, (byte) 0x9B, 0x4B, 0x26, 0x06, 0x30, 0x44}; + 0x3F, 0x20, (byte) 0xF9, (byte) 0x87, (byte) 0xA1, 0x60, (byte) 0xD9, (byte) 0xA8, (byte) 0xFD, (byte) 0xD7, (byte) 0x9B, 0x4B, 0x26, 0x06, 0x30, 0x44 + }; ByteBuf in = ByteBufAllocator.DEFAULT.heapBuffer(); in.writeBytes(ciphertext); - byte[] keyByte = { 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 }; ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); - key.writeBytes(ciphertext); - String resCipherData = decode(ByteBufUtil.hexDump(in)); - ByteBuf out = ByteBufAllocator.DEFAULT.heapBuffer(); -// out.writeBytes(resCipherData); -// System.out.println(hexBytes); - System.out.println(resCipherData.toString()); -// String resPlainData = EcbDecrypt(resCipherData, key); -// System.out.println("原始明文:" + data); -// System.out.println("解密后明文:" + resPlainData); + key.writeBytes(keyByte); +// String resCipherData = EcbDecrypt(ByteBufUtil.hexDump(in), ByteBufUtil.hexDump(key)); +// System.out.println(resCipherData); } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java index 1395a51..ac5f957 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java @@ -1,7 +1,7 @@ package com.casic.missiles.parser.safe.impl; import io.netty.buffer.ByteBufUtil; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** *

@@ -14,9 +14,8 @@ * @author hyl * @version v1.0: Tea.java, v 0.1 2021/3/12 13:48 $ */ -@Service("tea") -///tea算法类 - +//tea算法类 +@Component("tea") public class Tea { public static byte[] MyTea_Encrypt(byte[] MyTeaContent, int ByteLen, byte[] MyTeakey) { @@ -99,7 +98,6 @@ // for(int i32Index = 0; i32Index < 8; i32Index++) { // System.out.print("0x" + Integer.toHexString(MyContent[i32Index]) + " "); // } - // System.out.println("密钥为:"); // for(int i32Index = 0; i32Index < 16; i32Index++) { // System.out.print("0x" + Integer.toHexString(MyKeys[i32Index]) + " "); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java index bdd0721..bd1516a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java @@ -3,7 +3,7 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.parser.sender.DataSubscribeProvider; import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponents; import org.springframework.web.util.UriComponentsBuilder; @@ -12,7 +12,7 @@ import java.util.Collections; import java.util.Map; -@Service("functionCallback") +@Component("functionCallback") public class FunctionCallback implements DataSubscribeProvider { @Resource diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java index 0b44fb9..7526de2 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.Map; -@Service("middleware") +@Component("middleware") public class MiddlewareSubscribe implements DataSubscribeProvider { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java index 5dcee3f..e2f1192 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.Map; -@Service("nosql") +@Component("nosql") public class NoSqlSubscribe implements DataSubscribeProvider { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java b/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java new file mode 100644 index 0000000..81a5324 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java @@ -0,0 +1,86 @@ +package com.casic.missiles.pojo; + +import lombok.Data; + +/** + * 协议 + */ +@Data +public class Msg { + + /** + * 前导码 + */ + private String preamble; + + /** + * 版本号 + */ + private String version; + + /** + * 内容长度 + */ + private int leng; + + /** + * 设备ID + */ + private String deviceId; + + /** + * 通讯方式 + */ + private Integer connType; + + /** + * 加密方式 + */ + private Integer encryType; + + /** + * 目标地址 + */ + private String destAddr; + + /** + * PDUType + */ + private String PDUType; + + /** + * 操作类型 + */ + private Integer operateType; + + /** + * 传输控制位 PDUType.bit7=0时,表示存在后续的访问;当PDUType.bit7=1时,表示无后续的访问。 + */ + private Integer transControlFlag; + + /** + * 设备类型 + */ + private Integer deviceType; + + /** + * 序号 + */ + private Integer seq; + + /** + * tagList + */ + private String tagList; + + /** + * OidList + */ + private String OidList; + + /** + * CRC + */ + private String CRC; + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java index 40a5265..97cc984 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java @@ -40,7 +40,7 @@ String httpContent = msg.toString(Charset.defaultCharset()); log.info(" String : " + msg.toString(Charset.defaultCharset())); String majorContent = httpContent.substring(httpContent.indexOf("{"), httpContent.lastIndexOf("}") + 1); - String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("serviceData")).get("Value")); + String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("RegistryData")).get("Value")); log.info("----------------------------------" + values); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); bufferContent.writeBytes(values.getBytes(Charset.forName("ISO-8859-1"))); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java index 1b132a7..e3ced4b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java @@ -35,7 +35,7 @@ String httpContent = msg.toString(Charset.defaultCharset()); log.info(" String : " + msg.toString(Charset.defaultCharset())); String majorContent = httpContent.substring(httpContent.indexOf("{"), httpContent.lastIndexOf("}") + 1); - String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("serviceData")).get("Value")); + String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("RegistryData")).get("Value")); log.info("----------------------------------" + values); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); bufferContent.writeBytes(values.getBytes(Charset.forName("ISO-8859-1"))); diff --git a/sensorhub-core/src/main/resources/application.properties b/sensorhub-core/src/main/resources/application.properties deleted file mode 100644 index 8b13789..0000000 --- a/sensorhub-core/src/main/resources/application.properties +++ /dev/null @@ -1 +0,0 @@ - diff --git a/sensorhub-core/src/main/resources/config/application-dev.yml b/sensorhub-core/src/main/resources/config/application-dev.yml index 4f897a8..dcc4c2d 100644 --- a/sensorhub-core/src/main/resources/config/application-dev.yml +++ b/sensorhub-core/src/main/resources/config/application-dev.yml @@ -4,9 +4,9 @@ spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true + url: jdbc:mysql://127.0.0.1:3306/sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true username: root - password: Casic203 + password: root session: store-type: redis redis: diff --git a/sensorhub-core/src/main/resources/config/application.yml b/sensorhub-core/src/main/resources/config/application.yml index ae89f9d..7965da1 100644 --- a/sensorhub-core/src/main/resources/config/application.yml +++ b/sensorhub-core/src/main/resources/config/application.yml @@ -30,6 +30,13 @@ port: 6379 password: ew5T4K3#203lwh config-prefix: 'Casic:' +#代码生成器配置 +code: + generate: + #作者 + author: cz + #待生成对象表名 + table-name: bussiness_field_config,combined_field_config sensorhub: config: port: 7091 diff --git a/sensorhub-support/pom.xml b/sensorhub-support/pom.xml index 9a71296..761601c 100644 --- a/sensorhub-support/pom.xml +++ b/sensorhub-support/pom.xml @@ -42,6 +42,12 @@ ${redis.version} + + com.baomidou + mybatis-plus-generator + ${mybatis-plus-generator.version} + + org.reflections diff --git a/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java b/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java new file mode 100644 index 0000000..515ca53 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java @@ -0,0 +1,14 @@ +package com.casic.missiles.enums; + +/** + * @author + * @date + */ +public interface FixedPropertyEnum { + + String FIXED_POSITION = "fixedPosition"; + + String TOTAL_LENGTH = "totalLength"; + + String TAIL_POSITION = "tailPosition"; +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/CombinedFieldMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CombinedFieldMapper.java new file mode 100644 index 0000000..38e8f42 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CombinedFieldMapper.java @@ -0,0 +1,15 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.CombinedFieldConfig; +import org.apache.ibatis.annotations.Mapper; + +/** + * @author cz + * + */ +@Mapper +public interface CombinedFieldMapper extends BaseMapper { + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java new file mode 100644 index 0000000..128b09d --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java @@ -0,0 +1,10 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.CommandEventConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface CommandEventMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java new file mode 100644 index 0000000..042eb3c --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.DatagramEventConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface DatagramEventConfigMapper extends BaseMapper { +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java new file mode 100644 index 0000000..fc95cf4 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java @@ -0,0 +1,8 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.FieldConfig; + +public interface FieldConfigMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldRuleConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldRuleConfigMapper.java new file mode 100644 index 0000000..b310a08 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldRuleConfigMapper.java @@ -0,0 +1,10 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.FieldRuleConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface FieldRuleConfigMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java new file mode 100644 index 0000000..9060a69 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.ProtocolConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface ProtocolConfigMapper extends BaseMapper { +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolFieldConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolFieldConfigMapper.java new file mode 100644 index 0000000..1b47180 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolFieldConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +public interface ProtocolFieldConfigMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java new file mode 100644 index 0000000..6fa6936 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.RuleConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface RuleConfigMapper extends BaseMapper { +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/AbstractFieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/AbstractFieldConfig.java new file mode 100644 index 0000000..ba9aea2 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/AbstractFieldConfig.java @@ -0,0 +1,38 @@ +package com.casic.missiles.pojo; + +import lombok.Data; + +@Data +public class AbstractFieldConfig { + /** + * 字段名称 + */ + private String fieldName; + /** + * 按照字段评估进行字段解析 + */ + private String ruleJson; + /** + * 起始位置(单位byte) + */ + private Integer OriginPositionByte; + /** + * 起始位置,是否需要bit位置(单位bit)小于8, 没有不需要填写 + */ + private String OriginPositionBit; + /** + * 偏移长度 + */ + private Integer offsetLength; + /** + * 偏移单位(bit/byte) + */ + private String offsetUnit; + /** + * 是否需要转存 + */ + private Integer isStorage; + + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/CombinedFieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/CombinedFieldConfig.java new file mode 100644 index 0000000..4f4de6a --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/CombinedFieldConfig.java @@ -0,0 +1,41 @@ +package com.casic.missiles.pojo; + +import lombok.Data; + +import java.util.Date; + +/** + * 组合配置 + * + * @author cz + * @date 20 + */ +@Data +public class CombinedFieldConfig { + + private Long id; + private Long ruleId; + /** + * 前缀编码 + */ + private String prefixCode; + + /** + * 字段动态的id + */ + private Long dynamicLengthId; + /** + * 对应的要解析字段的ids + */ + private String dataFieldIds; + + /** + * 字段动态的id + */ + private String combinedFieldIds; + + private Date lastTime; + + private Date createTime; + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldConfig.java index a07d20d..8304dc6 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldConfig.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldConfig.java @@ -5,31 +5,28 @@ import java.util.Date; +/** + * @author cz + * 1、该表与实际解析的内容实例解析有关 + * 2、该表字段是随机出现的,和帧结构无关,无法预料的 + * 3、该表字段解析根据FieldEvaluatorConfig进行字段解析 + */ @Data -@TableName("field_config") -public class FieldConfig { +@TableName("business_field_config") +public class FieldConfig extends AbstractFieldConfig { private Long id; -// private String preFieldConfig; - private Long protocolId; - - private String isFixed; - private String uploadDeliveryChange; - - private String replyRule; - private String ruleJson; - + /** + * 协议配置id + */ + private Long ruleId; + /** + * 字段名称 + */ private String fieldName; - private String isStorage; - private Integer orignPosition; - private String exactOrignPosition; - - private Integer offsetLength; - private String offsetUnit; private String ownerId; private Date createTime; private Date lastTime; - } diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldRuleConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldRuleConfig.java new file mode 100644 index 0000000..2e09879 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldRuleConfig.java @@ -0,0 +1,20 @@ +package com.casic.missiles.pojo; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +@TableName("field_rule_config") +@Data +public class FieldRuleConfig { + + private Long id; + private String name; + private String desc; + private String condition; + private String excuteOperation; + private Date lasTime; + private Date createTime; + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/Msg.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/Msg.java deleted file mode 100644 index 81a5324..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/Msg.java +++ /dev/null @@ -1,86 +0,0 @@ -package com.casic.missiles.pojo; - -import lombok.Data; - -/** - * 协议 - */ -@Data -public class Msg { - - /** - * 前导码 - */ - private String preamble; - - /** - * 版本号 - */ - private String version; - - /** - * 内容长度 - */ - private int leng; - - /** - * 设备ID - */ - private String deviceId; - - /** - * 通讯方式 - */ - private Integer connType; - - /** - * 加密方式 - */ - private Integer encryType; - - /** - * 目标地址 - */ - private String destAddr; - - /** - * PDUType - */ - private String PDUType; - - /** - * 操作类型 - */ - private Integer operateType; - - /** - * 传输控制位 PDUType.bit7=0时,表示存在后续的访问;当PDUType.bit7=1时,表示无后续的访问。 - */ - private Integer transControlFlag; - - /** - * 设备类型 - */ - private Integer deviceType; - - /** - * 序号 - */ - private Integer seq; - - /** - * tagList - */ - private String tagList; - - /** - * OidList - */ - private String OidList; - - /** - * CRC - */ - private String CRC; - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/PreRuleConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/PreRuleConfig.java deleted file mode 100644 index bfcf914..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/PreRuleConfig.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.casic.missiles.pojo; - -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -import java.util.Date; - -@Data -@TableName("pre_rule_config") -public class PreRuleConfig { - - private Long id; - private String protocolId; - private String ruleFieldId; - private String ownerId; - private Date createTime; - private Date lastTime; -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolConfig.java index 274ad42..bdac11f 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolConfig.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolConfig.java @@ -5,18 +5,52 @@ import java.util.Date; +/** + * 协议配置表,协议配置与帧结构有关 + * 1、层级关系,协议之后是规则,规则对应设备类型的各种上数规则 + * 2、规则对应协议配置的实例流程 + * 3、每种可根据设备类型和操作类型进行上数规则进行区分 + */ @Data @TableName("protocol_config") public class ProtocolConfig { private Long id; + /** + * 前导码 + */ private String preFix; - private String unpackId; - private String totalLengthId; - private String totalLengthFilterField; + /** + * 拆包id + */ + private Long unpackId; + /** + * 总长度id + */ + private Long totalLengthId; + /** + * + */ + private String totalLengthFilterFields; + /** + * 动态长度ids + */ private String dynamicLengthId; + /** + * 动态长度json(预留字段) + */ private String dynamicLengthJson; - private String tailStr; + /** + * 规则字段所解析预准备的字段 + */ + private String rulePrepareFields; + /** + * 结尾标志 + */ + private Long tailStr; + /** + * 备注 + */ private String remark; private String ownerId; private Date createTime; diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolFieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolFieldConfig.java new file mode 100644 index 0000000..db794bd --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolFieldConfig.java @@ -0,0 +1,43 @@ +package com.casic.missiles.pojo; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +/** + * 协议字段配置表 + * 该表用户存放帧结构固定格式的字段 + * 有以下两个用途 + * (1)、固定格式的字段可用于规则匹配 + * (2)、固定格式的字段可用于报文回复 + * @author cz + * @date 2023-06-09 + */ +@Data +@TableName("protocol_field_config") +public class ProtocolFieldConfig extends AbstractFieldConfig{ + + private Long id; + /** + * 协议配置id + */ + private Long protocolId; + /** + * 上传下发是否有变化, 没有变化,可以直接组装 + */ + private String isReplyFix; + /** + * 按照字段评估进行字段解析 + */ + private Long fieldEvaluatorId; + /** + * 回复规则 + */ + private String replyRule; + + private String ownerId; + private Date createTime; + private Date lastTime; + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java index 3b53493..febf835 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java @@ -6,18 +6,40 @@ import java.util.Date; /** - * 加密字段解析和规则有关,事件调到该流程下面 + * @author cz + * todo: 匹配协议对应业务实例 + * 1、一个协议可以多种的流程规则 + * 2、规则可以支持递归规则流程 */ @Data @TableName("rule_config") public class RuleConfig { - private Long id; private String protocolId; - private String isBizField; - private String parseRuleJson; + /** + * 是否完成规则配置,没有完成, + * 则需要根据规则继续匹配 + */ + private String isFinishMatch; + /** + * 待匹配解析规则 + * {“data_field”:"data_value"} + */ + private String matchRuleJson; + /** + * 待解析字段ids + */ private String dataFieldIds; - private String aviatorFilterJson; + + /** + * 待解析组合字段ids + */ + private String combinedFieldIds; + + /** + * aviator + */ + private String conditionExpression; private Date createTime; private Date lastTime; } diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleDict.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleDict.java deleted file mode 100644 index cc7f389..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleDict.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.casic.missiles.pojo; - -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -@Data -@TableName("rule_dict") -public class RuleDict { - - private Long id; - private Long pid; - private String name; - private String code; - private String ownerId; - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleEvaluator.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleEvaluator.java deleted file mode 100644 index ed16610..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleEvaluator.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.pojo; - -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -import java.util.Date; - -@TableName("rule_evaluator") -@Data -public class RuleEvaluator { - - private Long id; - private String name; - private String desc; - private String condition; - private String excuteOperation; - private Date lasTime; - private Date createTime; - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/CombinedFieldConfigRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/CombinedFieldConfigRegistry.java new file mode 100644 index 0000000..fa59b90 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/CombinedFieldConfigRegistry.java @@ -0,0 +1,12 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.CombinedFieldConfig; + +import java.util.List; + +public interface CombinedFieldConfigRegistry { + + List getCombinedFieldConfigList(Long ruleId); + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/CommandEventRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/CommandEventRegistry.java new file mode 100644 index 0000000..fb97d87 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/CommandEventRegistry.java @@ -0,0 +1,8 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.CommandEventConfig; + +public interface CommandEventRegistry { + + CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName); +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/DatagramEventRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/DatagramEventRegistry.java new file mode 100644 index 0000000..fb34641 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/DatagramEventRegistry.java @@ -0,0 +1,11 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.DatagramEventConfig; + +import java.util.List; + +public interface DatagramEventRegistry{ + + List getDatagramEventList(Long ruleId); + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/FieldConfigRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/FieldConfigRegistry.java new file mode 100644 index 0000000..759642e --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/FieldConfigRegistry.java @@ -0,0 +1,20 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.FieldConfig; + +import java.util.List; + +public interface FieldConfigRegistry { + + + List getFieldConfigList(Long ruleId); + + FieldConfig getFieldConfigById(String fieldId); + + List getFieldConfigs(String protocolId, Integer isFixed); + + List getStorageFieldConfig(String protocolId); + + +} + diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/FieldRuleConfigRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/FieldRuleConfigRegistry.java new file mode 100644 index 0000000..33da70c --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/FieldRuleConfigRegistry.java @@ -0,0 +1,11 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.FieldRuleConfig; + +import java.util.List; + +public interface FieldRuleConfigRegistry { + + List getFieldRuleConfigList(Long ruleId); + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/ProtocolConfigRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/ProtocolConfigRegistry.java new file mode 100644 index 0000000..1725189 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/ProtocolConfigRegistry.java @@ -0,0 +1,12 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.ProtocolConfig; + +import java.util.List; + +public interface ProtocolConfigRegistry { + + List getProtocolConfigList(String firstChar); + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/ProtocolFieldConfigRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/ProtocolFieldConfigRegistry.java new file mode 100644 index 0000000..19d1b9a --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/ProtocolFieldConfigRegistry.java @@ -0,0 +1,14 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.ProtocolFieldConfig; + +import java.util.List; + +public interface ProtocolFieldConfigRegistry { + + + List getProtocolFieldConfigList(Long protocolId); + + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/RuleConfigRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/RuleConfigRegistry.java new file mode 100644 index 0000000..3d2a75c --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/RuleConfigRegistry.java @@ -0,0 +1,14 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.RuleConfig; + +import java.util.List; + +public interface RuleConfigRegistry { + + RuleConfig getNextRuleConfig(String ruleFields); + + + List getRuleConfigById(Long protocolId); + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java index 608af3a..32cc8a4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java @@ -2,48 +2,47 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.delivery.decorator.ByteDecorator; +import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @AllArgsConstructor public class FieldDecoratorManger { - private final RuleDictDao ruleDictDao; + private final RuleConfigRegistry ruleDictDao; // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 // (1)静态的业务字段是字典里面可以配置的 // (2)动态的业务字段是通过规则生成的 public String contentMerge(String ruleJson, String sceneConent, String dynamicContent) { - List ruleDictList = ruleDictDao.getRuleDictConfig(); - Map ruleDictMap = ruleDictList.stream().collect( - Collectors.toMap(RuleDict::getId, e -> e)); - List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); - for (Map ruleMap : ruleMapList) { - String ruleType = String.valueOf(ruleMap.get("ruleType")); - ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); - NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); - byteDecorator.nodeDecoratorRule(nodeDecoratorParm); - } +// List ruleDictList = ruleDictDao.getRuleDictConfig(); +// Map ruleDictMap = ruleDictList.stream().collect( +// Collectors.toMap(RuleDict::getId, e -> e)); +// List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); +// for (Map ruleMap : ruleMapList) { +// String ruleType = String.valueOf(ruleMap.get("ruleType")); +// ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); +// NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); +// byteDecorator.nodeDecoratorRule(nodeDecoratorParm); +// } return null; } - - private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { - NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() - .contents(sceneConent) - .dynamicContent(dynamicContent) - .ruletypeId(ruletypeId) - .ruleDictMap(ruleDictMap) - .build(); - return nodeDecoratorParm; - } +// +// private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { +// NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() +// .contents(sceneConent) +// .dynamicContent(dynamicContent) +// .ruletypeId(ruletypeId) +// .ruleDictMap(ruleDictMap) +// .build(); +// return nodeDecoratorParm; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java index 652970c..b204ac3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java @@ -1,56 +1,56 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@AllArgsConstructor -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", - JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Component; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Component("logicalDecorator") +//@AllArgsConstructor +//@Slf4j +//public class LogicalShiftDecorator implements ByteDecorator { +// +//// private final FieldRuleEngineMapper fieldRuleEngineMapper; +//// +//// //字节位移 +//// @Override +//// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +//// String logicalValue = ""; +//// RuleEvaluator fieldRuleEngine = new RuleEvaluator(); +//// try { +//// Map env2 = new HashMap(); +//// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +//// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +//// for (String contentId : contentIdList) { +//// RuleDict ruleDict = ruleDictMap.get(contentId); +//// if (ruleDict.getCode().contains("#")) { +//// //使用动态的值 +//// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +//// } +//// env2.put(ruleDict.getName(), ruleDict.getCode()); +//// } +//// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +//// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +//// return null; +//// } +//// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +//// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +//// return values; +//// } catch (Exception ex) { +//// log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", +//// JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +//// return null; +//// } +//// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java index 346468f..822fead 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@AllArgsConstructor -@Slf4j -public class OperationDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("optionDecorator") +//@AllArgsConstructor +//@Slf4j +//public class OperationDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //混合运算,有常量或者乘除的缩放 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java index 50fb0a7..7a8bccb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@AllArgsConstructor -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +////精度计算 +//@AllArgsConstructor +//@Registry("precisionDecorator") +//@Slf4j +//public class PrecisionDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java index da39235..27f9cc7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java @@ -1,54 +1,53 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@AllArgsConstructor -@Slf4j -public class RuleDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("ruleDecorator") +//@AllArgsConstructor +//@Slf4j +//public class RuleDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //吃我一套正则表达式 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (Exception ex) { +// log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java index 7f5cbf3..c043f97 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java @@ -2,6 +2,6 @@ import java.util.Map; -public interface ComandeEventService { +public interface ComandeEventService{ Map loadComandeEventConfig(String protocolId,String scene); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java index 476ad84..aaf1837 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java @@ -2,46 +2,46 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.dao.CommandEventDao; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @Slf4j @AllArgsConstructor -public class ComandeEventServiceImpl implements ComandeEventService { +public class ComandeEventServiceImpl implements ComandeEventRegistry { - private final CommandEventDao commandEventDao; + // private final CommandEventDao commandEventDao; // 加密bean 固定字段出现变化的字段解析,业务字段的有序内容 @Override - public Map loadComandeEventConfig(String protocolId,String sceneName) { - CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); - if (ObjectUtil.isEmpty(commandEventConfig)) { - log.error("协议{},没有配置成功接收回复配置,清排查原因"); - return null; - } - String replyJson = commandEventConfig.getReplyContentJson(); - List> replyMapList = JSONArray.parseObject(replyJson, List.class); - List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); - Map fixMap = fixList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); - List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) - .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) - .collect(Collectors.toList()); - Map commandConfigMap = new HashMap<>(); - commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); - commandConfigMap.put("fixContent", fixMap); - commandConfigMap.put("bizContent", contentList); - return commandConfigMap; + public Map loadComandeEventConfig(String protocolId, String sceneName) { +// CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); +// if (ObjectUtil.isEmpty(commandEventConfig)) { +// log.error("协议{},没有配置成功接收回复配置,清排查原因"); +// return null; +// } +// String replyJson = commandEventConfig.getReplyContentJson(); +// List> replyMapList = JSONArray.parseObject(replyJson, List.class); +// List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); +// Map fixMap = fixList.stream() +// .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); +// List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) +// .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) +// .collect(Collectors.toList()); +// Map commandConfigMap = new HashMap<>(); +// commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); +// commandConfigMap.put("fixContent", fixMap); +// commandConfigMap.put("bizContent", contentList); +// return commandConfigMap; + return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 128b09d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java deleted file mode 100644 index 4016b0b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface DatagramEventMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java deleted file mode 100644 index 597c306..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.apache.ibatis.annotations.Mapper; - -public interface FieldConfigMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java deleted file mode 100644 index a31680a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.PreRuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface PreRuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java deleted file mode 100644 index 9060a69..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface ProtocolConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java deleted file mode 100644 index 6fa6936..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java deleted file mode 100644 index 582a705..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleDict; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleDictMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java deleted file mode 100644 index 6e302c8..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.CommandEventMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Optional; - -@Component -public class CommandEventDao { - - @Resource - private CommandEventMapper commandEventMapper; - - public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId) - .eq("scene", sceneName) - .eq("enabled", 1); - List commandEventConfig = commandEventMapper.selectList(queryWrapper); - Optional optionalEventConfig = commandEventConfig.stream().findFirst(); - return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java deleted file mode 100644 index 9137e4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.FieldConfigMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class FieldConfigDao { - - @Resource - private FieldConfigMapper fieldConfigMapper; - - public FieldConfig getFieldConfigById(String fieldId) { - FieldConfig fieldConfig = fieldConfigMapper.selectById(fieldId); - return fieldConfig; - } - - public List getFieldConfigs(String protocolId,Integer isFixed) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",isFixed); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - - public List getStorageFieldConfig(String protocolId) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",1) - .eq("is_storage",1); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java deleted file mode 100644 index 67bff6b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.mapper.PreRuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class PreRuleConfigDao { - - @Resource - private PreRuleConfigMapper preRuleConfigMapper; - - public List getPreRuleList(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return preRuleConfigMapper.selectList(queryWrapper); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java deleted file mode 100644 index d69ea85..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.RuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleConfigDao { - - @Resource - private RuleConfigMapper ruleConfigMapper; - - public RuleConfig getNextRuleConfig(String ruleFields) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("parse_rule_json", ruleFields); - return ruleConfigMapper.selectOne(queryWrapper); - } - - - public List getRuleConfigById(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return ruleConfigMapper.selectList(queryWrapper); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java deleted file mode 100644 index 932c185..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.RuleDictMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleDictDao { - - @Resource - private RuleDictMapper ruleDictMapper; - - public List getRuleDictConfig() { - List ruleDictList = ruleDictMapper.selectList(null); - return ruleDictList; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java index 9f9e279..43bc4d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java @@ -10,20 +10,15 @@ import io.netty.channel.socket.nio.NioServerSocketChannel; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import javax.annotation.PreDestroy; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static cn.hutool.core.util.ClassUtil.getClasses; /** * SensorhubServer netty服务端 */ @Slf4j -@Service +@Component public class SensorhubServer { /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java index 2c79ff5..9a28c36 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java @@ -11,13 +11,13 @@ import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioSocketChannel; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClient 客户端 */ @Slf4j -@Service +@Registry public final class SensorhubClient { public static void main(String[] args) throws Exception { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java index 9774be0..477c3f7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java @@ -6,12 +6,12 @@ import io.netty.channel.socket.SocketChannel; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientChannelInitialHandler */ -@Service +@Registry public class SensorhubClientChannelInitialHandler extends ChannelInitializer { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java index 346f4b3..73560e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java @@ -5,13 +5,13 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientHandler */ @Slf4j -@Service +@Registry public class SensorhubClientHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java index 5c1c6f2..d990af5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java @@ -4,12 +4,12 @@ import com.casic.missiles.pojo.Msg; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** * SensorhubServerHandler */ -@Service +@Component public class SensorhubServerHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 67283ae..af3172c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,41 +1,37 @@ package com.casic.missiles.parser; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultProtocolConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.*; +import com.casic.missiles.registry.FieldConfigRegistry; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; -import java.nio.charset.Charset; import java.util.HashMap; import java.util.List; import java.util.Map; -@Service("genericProtocolParser") +/** + * @author + */ +@Component("genericProtocolParser") @Slf4j -@AllArgsConstructor +@RequiredArgsConstructor public class GenericProtocolParser implements ProtocolParser { - private final LeadingCodeMatcher leadingCodeMatcher; private final List frameStructDispenserList; - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorInstanceSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; // 匹配首字母前导码=> 帧结构匹配前导码=> // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 @@ -44,18 +40,19 @@ public Boolean doParseProtocol(ByteBuf byteBuf) { String protocolContent = ByteBufUtil.hexDump(byteBuf); //匹配前导码 - List preCodeConfigs = leadingCodeMatcher.matchLeadingCode(protocolContent); + List preCodeConfigs = LeadingCodeMatcher.matchFrameLeadingCode(protocolContent); //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 if (preCodeConfigs.size() == 0) { - return rematch(byteBuf,protocolContent); + return rematch(byteBuf, protocolContent); } - //暂时先取第一个 + //暂时先取第一个,提升速度,使用享元模式, 减少类的创建销毁与构建 ProtocolConfig protocolConfig = preCodeConfigs.get(0); + AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); ByteBuf wholeDatagramByte = null; //通过匹配帧结构获取完整的数据包 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, preCodeConfigs.get(0))) != null) { + if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, protocolFactory)) != null) { break; } } @@ -68,76 +65,78 @@ * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 */ - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId, wholeDatagramByte); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap, protocolId); - //选取规则对应的流程实例 - DatagramEventConfig datagramEventConfig = processorInstanceSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); + //进行规则字段解析,进行匹配规则 + RuleConfig ruleConfig = getRuleConfig(protocolFactory, wholeDatagramByte); + if (ruleConfig == null) { + return false; + } //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, wholeDatagramByte); + ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte); + //以下进行业务的规则解析,同时选定流程实例 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); + DatagramEventProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain, + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText, protocolId); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain); //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); + datagramEventProvider.storeData(bizDataMap); return true; } - private Boolean rematch(ByteBuf byteBuf,String protocolContent) { + /** + * 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 + */ + private Boolean rematch(ByteBuf byteBuf, String protocolContent) { //重置位判断 byteBuf.resetReaderIndex(); //判断重置是否前移,如果没有前移,则直接判为匹配失败 if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { return false; } else { + //递归执行 return doParseProtocol(byteBuf); } } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; + //获取匹配规则->匹配规则 + private RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + //取出其中参与逻辑provider并判空 + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); + String rulePrepareFields = protocolConfig.getRulePrepareFields(); + //固定字段 + if (StringUtils.isNotEmpty(rulePrepareFields)) { + //获取统一固定字段解析 + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + //获取该协议的字段配置,用于协议规则匹配 + List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); + //获取规则 + RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, + rulePrepareFields, protocolFieldConfigs); + return ruleConfig; + } + return null; } - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + //数据构建,获取固定字段的store和业务字段store + private Map buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + Map bizDataMap = new HashMap<>(); + Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); + Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); + bizDataMap.putAll(ruleStoreObjectMap); + bizDataMap.putAll(protocolStoreObjectMap); return bizDataMap; } - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java index 8a46e32..16ce2e5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java @@ -3,6 +3,7 @@ import io.netty.buffer.ByteBuf; public interface ProtocolParser { + Boolean doParseProtocol(ByteBuf byteBuf); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java new file mode 100644 index 0000000..f7814af --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java @@ -0,0 +1,35 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.ProtocolConfigProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.ProtocolConfig; + +/** + * 存放基本协议的的加载信息 + */ +public class AbstractProtocolConfigFactory { + private final ProtocolConfigProvider protocolConfigProvider; + private final ProtocolFieldConfigProvider protocolFieldConfigProvider; + private final RuleConfigProvider ruleConfigProvider; + + public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { + this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); + this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); + this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); + } + + public ProtocolConfigProvider getProtocolConfigProvider() { + return protocolConfigProvider; + } + + public ProtocolFieldConfigProvider getProtocolFieldConfigProvider() { + return protocolFieldConfigProvider; + } + + public RuleConfigProvider getRuleConfigProvider() { + return ruleConfigProvider; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java new file mode 100644 index 0000000..6e36147 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java @@ -0,0 +1,57 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.CombinedFieldConfigProvider; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.FieldConfigProvider; +import com.casic.missiles.parser.provider.FieldRuleConfigProvider; + +/** + * 存放规则相关的的的加载信息 + */ +public class AbstractRuleConfigFactory { + + /** + * 处理字节 + */ + private final FieldConfigProvider fieldConfigProvider; + /** + * 处理组合字节解析的解码器 + */ + private final CombinedFieldConfigProvider combinedFieldConfigProvider; + /** + * 处理负责字节解析的规则配置 + */ + private final FieldRuleConfigProvider fieldRuleConfigProvider; + /** + * 处理实例流程 + */ + private final DatagramEventProvider datagramEventProvider; + + + public AbstractRuleConfigFactory(Long ruleId) { + this.fieldConfigProvider = new FieldConfigProvider(ruleId); + this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); + this.fieldRuleConfigProvider = new FieldRuleConfigProvider(ruleId); + this.datagramEventProvider = new DatagramEventProvider(ruleId); + } + + public FieldConfigProvider getFieldConfigProvider() { + return fieldConfigProvider; + } + + public CombinedFieldConfigProvider getCombinedFieldConfigProvider() { + return combinedFieldConfigProvider; + } + + public FieldRuleConfigProvider getFieldRuleConfigProvider() { + return fieldRuleConfigProvider; + } + + public DatagramEventProvider getDatagramEventProvider() { + return datagramEventProvider; + } + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java deleted file mode 100644 index 6e1719a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.factory; - - -import com.casic.missiles.pojo.ProtocolConfig; - -import java.util.List; - -/** - * 数据库访问优化(暂时未做) - *

- * 1、初始化协议解析配置,并存放到处存放缓存,对协议基本配置进行管理 - * 2、其中流程中所有的配置都经过此类进行管理,进行调用获取,增强解析速度 - */ -public interface DatagramFactory { - - /** - * 初始化 - */ - List datagramInit(); - - /** - * 根据前导码配置匹配,模糊匹配获取所有的报文项 - */ - List match(); - - /** - * 根据前导码匹配,返回报文项 - */ - List filer(); - - /** - * 保证数据的唯一性选择器 - */ - List selectOne(); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java new file mode 100644 index 0000000..87444a0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java @@ -0,0 +1,18 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +import java.util.List; + +/** + * 直接用,还是边用边创建 + */ +public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { + + + public DefaultProtocolConfigFactory(ProtocolConfig protocolConfig) { + super(protocolConfig); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java new file mode 100644 index 0000000..cce0c7c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java @@ -0,0 +1,12 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; + +public class DefaultRuleFactory extends AbstractRuleConfigFactory { + + public DefaultRuleFactory(Long ruleId) { + super(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java deleted file mode 100644 index 9ee97e0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.casic.missiles.parser.instance; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service -@Slf4j -@AllArgsConstructor -public class GeneralProcessor { - - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; - - /** - * 统一固定字段解析=>进行规则的查询的判断 - * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 - * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 - */ - @Deprecated - public boolean parseWholeDatagram(ByteBuf buffer, ProtocolConfig protocolConfig) { - try { - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap,protocolId); - //选取规则对应的流程= - DatagramEventConfig datagramEventConfig = processorSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); - //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); - //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); - //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); - //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); - //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); - return true; - } catch (Exception ex) { - log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", - ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); - return false; - } - } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; - } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); - } - - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); - return bizDataMap; - } - - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java index 25e7ad8..6a5777e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java @@ -1,23 +1,31 @@ package com.casic.missiles.parser.instance.impl; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.mapper.DatagramEventMapper; import com.casic.missiles.pojo.DatagramEventConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.SpringContextUtil; -@Service -@AllArgsConstructor +import java.util.List; +import java.util.Optional; + +/** + * @author cz + * + */ public class DefaultProcessorInstanceSelector implements ProcessorInstanceSelector { - private final DatagramEventMapper datagramEventMapper; + private static List datagramEventConfigs; + + static { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + datagramEventConfigs = datagramEventRegistry.getDatagramEventList(); + } @Override public DatagramEventConfig getProcessorInstance(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("rule_id", protocolId); - return datagramEventMapper.selectOne(queryWrapper); + Optional optionalSelectInstance = datagramEventConfigs.stream() + .filter(e -> e.getId().equals(protocolId)).limit(1).findFirst(); + return optionalSelectInstance.isPresent() ? optionalSelectInstance.get() : null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a778671..7b56a43 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,16 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import io.netty.buffer.ByteBuf; /** - * 分析匹配情况 - * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 - * 2、匹配不成功,有后续帧,可以进行下次匹配。 - * 3、匹配不成功,无后续帧,可以进行丢弃。 + * 分析匹配情况 + * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 + * 2、匹配不成功,有后续帧,可以进行下次匹配。 + * 3、匹配不成功,无后续帧,可以进行丢弃。 */ -public interface FrameStructMatcher{ +public interface FrameStructMatcher { - ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig); + ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 05320ab..8ebea78 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,23 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.ProtocolConfigMapper; +import com.casic.missiles.parser.provider.ProtocolConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Component; import java.util.List; import java.util.stream.Collectors; -@Component -@AllArgsConstructor public class LeadingCodeMatcher { - private final ProtocolConfigMapper protocolMapper; - //** 1、首字母匹配前导码, // 2、以匹配出的前导码是否在报文中条件进行前导码的匹配二次筛选 - public List matchLeadingCode(String protocolContent){ + public static List matchFrameLeadingCode(String protocolContent){ List initialConfigs = initialMatch(protocolContent); List preCodeConfigs = initialConfigs.stream() .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) @@ -26,13 +19,16 @@ } //初始化匹配前导码内容 - private List initialMatch(String protocolContent) { - String protocolStr = protocolContent.charAt(0) + ""; - QueryWrapper queryWrapper = new QueryWrapper() - .likeRight("pre_fix", protocolStr); - List protocolConfigList = protocolMapper.selectList(queryWrapper); - return protocolConfigList; + private static List initialMatch(String protocolContent) { + String firstFrameChar = protocolContent.charAt(0) + ""; + ProtocolConfigProvider protocolConfigProvider=new ProtocolConfigProvider(firstFrameChar); + return protocolConfigProvider.getMatchList(); } + + + + + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index cf2113d..e915877 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -1,32 +1,35 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(0) -@Service +@Component public class FrameLengthMatcher implements FrameStructMatcher { - @Autowired - private FieldParser fieldParser; - //超过长度 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { String dataGramContent = ByteBufUtil.hexDump(byteBuf); - if (StringUtils.isEmpty(protocolConfig.getUnpackId()) && StringUtils.isEmpty(protocolConfig.getTailStr())) { - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + //当不存在结尾标志和拆包标志,可以直接使用长度进行匹配 + if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { if (dataGramContent.length() >= totalLength) {//等于长度返回true,超出长度,切断 - ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, protocolConfig, totalLength); + ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, totalLength); return wholeDatagramByte; } else { //读的标志位前移舍弃 @@ -38,7 +41,7 @@ return null; } - private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, Integer totalLength) { byteBuf.readBytes(totalLength); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, totalLength - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 2bfc213..d527ad0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; @@ -13,7 +13,7 @@ import lombok.AllArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.nio.charset.Charset; import java.util.Map; @@ -22,32 +22,30 @@ * 后续标志验证 */ @Order(1) -@Service +@Component @AllArgsConstructor -public class FrameMarkMatcher implements FrameStructMatcher { - - private final FieldConfigDao fieldConfigDao; - private final FieldParser fieldParser; - private final FieldResolver fieldResolverManger; +public class FrameMarkMatcher implements FrameStructMatcher, FixedPropertyEnum { //帧后续标志=>结束,进行帧的重组=>有后续,1、帧移位判别 2、继续接收帧 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig UnpackConfig = StringUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getUnpackId()); - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); - Integer upback = 0; + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); ByteBuf mergeWholeFrameByte = null; - if (!ObjectUtil.isEmpty(UnpackConfig)) { - while (hasNextFullFrame(byteBuf, protocolConfig)) { - upback = (Integer) fieldResolverManger.filedParserManger(byteBuf, UnpackConfig, null); + if (!ObjectUtil.isEmpty(unpackFlag)) { + while (hasNextFullFrame(byteBuf, protocolConfig, protocolFieldConfigProvider)) { //是否存在后续位 - if (upback == 1) {//使用esayRule + if (unpackFlag == 1) {//使用esayRule //表示可以截取 - mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolConfig, totalLength); + mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolFieldConfigProvider, protocolConfig); return mergeWholeFrameByte; } else { - byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig)); + byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig, protocolFieldConfigProvider)); } } } @@ -56,7 +54,8 @@ //选取第一个帧,将业务内容和后面部分分开 //计算数据报文-业务内容 - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolFieldConfigProvider protocolFieldConfigProvider, ProtocolConfig protocolConfig) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); //截取完整报文 byteBuf.readBytes(totalLength); ByteBuf byteBufContent = byteBuf.slice(0, byteBuf.readerIndex()); @@ -68,15 +67,15 @@ String tail = ""; System.out.println(ByteBufUtil.hexDump(byteBufContent)); //会存在多个帧拼接在一起的的情况,进行合并处理 - while (hasNextFullFrame(byteBufContent, protocolConfig)) { - Integer currentFrameLength = fieldParser.getTotalLength(protocolConfig, byteBufContent); + while (hasNextFullFrame(byteBufContent, protocolConfig, protocolFieldConfigProvider)) { + Integer currentFrameLength = protocolFieldConfigProvider.getTotalLength(byteBufContent, protocolConfig); byteBufContent.readBytes(currentFrameLength); ByteBuf currentbyteBuf = byteBufContent.slice(0, byteBufContent.readerIndex()); byteBufContent.markReaderIndex();//读的标志位前移 System.out.println(ByteBufUtil.hexDump(byteBufContent)); String hexDump = currentbyteBuf.toString(Charset.forName("ISO-8859-1")); //获取当前固定帧结构的关系map - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, currentbyteBuf); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(currentbyteBuf, protocolConfig); if (StringUtils.isEmpty(mergeFrameStr)) { //首次获取业务数据报文 mergeFrameStr += hexDump.substring(0, currentFrameFixedProperty.get("tailPosition")); @@ -95,22 +94,22 @@ /** * 获取平移到下一帧起始位置 */ - public int getNextFrameOffset(ByteBuf buffer, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, buffer); - return currentFrameFixedProperty.get("totalLength"); + public int getNextFrameOffset(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + return currentFrameFixedProperty.get(TOTAL_LENGTH); } /** * 判断是否出错进行整个帧的 */ - public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, byteBuf); + public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); //保证读取位置不在固定位置,是可变的业务内容 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("fixedPosition")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(FIXED_POSITION)) { return false; } //判断读取是否操作帧长度 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("totalLength")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(TOTAL_LENGTH)) { return false; } return true; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 76a3784..c3a1bab 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -1,50 +1,50 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.parser.instance.GeneralProcessor; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; +import io.netty.buffer.ByteBufUtil;; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(2) -@Service +@Component public class FrameTailMatcher implements FrameStructMatcher { - @Resource - private FieldConfigDao fieldConfigDao; - @Autowired - private GeneralProcessor generalProcessor; - //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig tailFieldConfig = StringUtils.isEmpty(protocolConfig.getTailStr()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getTailStr()); - if (!ObjectUtil.isEmpty(tailFieldConfig)) { - String tailStr = tailFieldConfig.getFieldName(); + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfig protocolFieldConfig = ObjectUtils.isEmpty(protocolConfig.getTailStr()) ? null : + fieldConfigProvider.getFieldConfigById(protocolConfig.getTailStr()); + if (!ObjectUtil.isEmpty(protocolFieldConfig)) { + String tailStr = protocolFieldConfig.getFieldName(); String dataGramContent = ByteBufUtil.hexDump(byteBuf); Boolean tailFlag = ByteBufUtil.hexDump(byteBuf).contains(tailStr); if (!tailFlag) { //使用esayRule return null; } else if (dataGramContent.indexOf(tailStr) < dataGramContent.length() - tailStr.length()) { Integer length = dataGramContent.indexOf(tailStr) + tailStr.length(); - ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, protocolConfig, length); + ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, length); return wholeDatagramByte; //存在粘包 } } return null; } - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer length) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, Integer length) { byteBuf.readBytes(length); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, length - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java new file mode 100644 index 0000000..5f1c177 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java @@ -0,0 +1,73 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.combined.GenericCombinedFieldResolver; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.CombinedFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class CombinedFieldConfigProvider { + + + /** + * 作为临时配置列表缓存使用 + */ + private final List combinedFieldConfigList; + private Map storeObjectMap = new HashMap<>(); + + public CombinedFieldConfigProvider(Long ruleId) { + CombinedFieldConfigRegistry combinedFieldConfigRegistry = SpringContextUtil.getBean(CombinedFieldConfigRegistry.class); + combinedFieldConfigList = combinedFieldConfigRegistry.getCombinedFieldConfigList(ruleId); + } + + public void parseDataField(RuleConfig ruleConfig, String clearZeroPlain,Map fieldConfigsMap ) { + if (showSkip()) { + return; + } + //匹配对应的数据,然后进行相关的字段解析 + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver(); + combinedFieldResolver.parseDataField(combinedFieldConfigList, byteBuf, storeObjectMap,fieldConfigsMap); + } + + + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getCombinedFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return combinedFieldConfigList.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public List getCombinedFieldConfigList() { + return combinedFieldConfigList; + } + + /* 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(combinedFieldConfigList) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java new file mode 100644 index 0000000..f3cfedc --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java @@ -0,0 +1,11 @@ +package com.casic.missiles.parser.provider; + +/** + * @author cz + * @date 2023-6-12 + */ +public class CommandEventProvider{ + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java new file mode 100644 index 0000000..70eec5e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java @@ -0,0 +1,77 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.safe.SafeStrategy; +import com.casic.missiles.parser.sender.DataSubscribeProvider; +import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class DatagramEventProvider { + + private final DatagramEventConfig processorInstance; + + public DatagramEventProvider(Long ruleId) { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + List datagramEventConfigList = + datagramEventRegistry.getDatagramEventList(ruleId); + processorInstance = this.getProcessorInstance(datagramEventConfigList); + } + + public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { + if (showSkip()) { + return null; + } + return datagramEventConfigList.get(0); + } + + // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 + public String getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap) { + String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? + processorInstance.getSafeBean() : + fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); + if (!StringUtils.isEmpty(safeName)) { + //需要加密 + SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); + String plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); + return clearComplementZero(plain); + } + return ByteBufUtil.hexDump(bizDataContent); + } + + //解密清零操作 + private String clearComplementZero(String plain) { + plain = plain.substring(0, plain.lastIndexOf("00")); + return plain; + } + + //数据发送,数据发送者暂未构建 + public void storeData(Map bizDataMap) { + DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); +// dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return ObjectUtils.isNotEmpty(processorInstance) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java new file mode 100644 index 0000000..7e1fe0a --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java @@ -0,0 +1,97 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.FieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class FieldConfigProvider { + + + private final List fieldConfigs; + private Map storeObjectMap = new HashMap<>(); +// private Map singleObjects = new ConcurrentHashMap<>(); + + public FieldConfigProvider(Long ruleId) { + FieldConfigRegistry fieldConfigRegistry = SpringContextUtil.getBean(FieldConfigRegistry.class); + fieldConfigs = fieldConfigRegistry.getFieldConfigList(ruleId); + } + + public List getFieldConfigs() { + return fieldConfigs; + } + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public Map parseDataField(RuleConfig ruleConfig, String clearZeroPlain) { + if (showSkip()) { + return null; + } + List prepareFieldConfig = prepareParseField(ruleConfig); + if (CollectionUtils.isNotEmpty(prepareFieldConfig)) { + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(fieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + return fixDataMap; + } + } + return null; + } + + /** + * 得到需要处理的业务内容 + * + * @return + */ + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return fieldConfigs.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public Map getFieldConfigsMap() { + return fieldConfigs.stream().collect( + Collectors.toMap(FieldConfig::getId, e -> e) + ); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(fieldConfigs) ? false : true; + } + + +} + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java new file mode 100644 index 0000000..817bfaf --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java @@ -0,0 +1,19 @@ +package com.casic.missiles.parser.provider; + +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.registry.FieldRuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; + +public class FieldRuleConfigProvider { + + private final List fieldRuleConfigList; + + public FieldRuleConfigProvider(Long ruleId) { + FieldRuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(FieldRuleConfigRegistry.class); + fieldRuleConfigList = ruleConfigRegistry.getFieldRuleConfigList(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java new file mode 100644 index 0000000..99a1b06 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java @@ -0,0 +1,53 @@ +package com.casic.missiles.parser.provider; + + +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.registry.ProtocolConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolConfigProvider { + + private final List protocolConfigList; + + public ProtocolConfigProvider(String firstChar) { + ProtocolConfigRegistry registry = SpringContextUtil.getBean(ProtocolConfigRegistry.class); + protocolConfigList = registry.getProtocolConfigList(firstChar); + } + + public List getMatchList() { + return protocolConfigList; + } + + /** + * 设置当前协议 + * + * @param protocolConfig + */ + public ProtocolConfigProvider(ProtocolConfig protocolConfig) { + List protocolConfigs = new ArrayList<>(); + protocolConfigs.add(protocolConfig); + protocolConfigList = protocolConfigs; + } + + /** + * 获取当前协议 + * + * @return + */ + public ProtocolConfig getCurrentProtocolConfig() { + if (this.protocolConfigList == null) { + return null; + } else { + return protocolConfigList.get(0); + } + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java new file mode 100644 index 0000000..043927d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java @@ -0,0 +1,213 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.registry.ProtocolFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolFieldConfigProvider { + + private static final String FIXED_FIELD_DS = "fixedFieldDs"; + private static final String CONTENT_FIELD_DS = "contentFieldDs"; + private static final String PROTOCOL_LENGTH = "protocolLength"; + private static final String PROTOCOL_FIELD_ID = "protocolFieldId"; + private static final String PROTOCOL_POSITION = "protocolPosition"; + + private final List protocolFieldConfigs; + private Map singleObjects = new ConcurrentHashMap<>(); + private Map storeObjectMap = new HashMap<>(); + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public ProtocolFieldConfigProvider(Long protocolId) { + ProtocolFieldConfigRegistry protocolFieldConfigRegistry = SpringContextUtil.getBean(ProtocolFieldConfigRegistry.class); + protocolFieldConfigs = protocolFieldConfigRegistry.getProtocolFieldConfigList(protocolId); + } + + public List getProtocolFieldConfigs() { + return protocolFieldConfigs; + } + + public ProtocolFieldConfig getFieldConfigById(Long fieldId) { + Optional optionalConfig = protocolFieldConfigs.stream().filter( + e -> e.getId().equals(fieldId) + ).findFirst(); + return optionalConfig.isPresent() ? optionalConfig.get() : null; + } + + public Integer getProtocolFieldValue(Long protocolFieldId, ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_FIELD_ID + protocolFieldId + ByteBufUtil.hexDump(byteBuf); + //获取缓存 + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + //加载固定长度数据集合 + Map fixDataMap = this.getProtocolDataMap(byteBuf); + ProtocolFieldConfig protocolFieldConfig = selectFieldConfig(protocolFieldId); + Integer protocolFieldValue = 0; + //获取约定字段的总长度 + if (fixDataMap.containsKey(protocolFieldConfig.getFieldName())) { + Object appointUnpackObject = fixDataMap.get(protocolFieldConfig.getFieldName()); + if (ObjectUtils.isNotEmpty(appointUnpackObject)) { + protocolFieldValue = (Integer) appointUnpackObject; + } + } + if (protocolFieldValue != null) { + //加入缓存 + if (ObjectUtils.isNotEmpty(protocolFieldValue)) { + this.singleObjects.put(catchKey, protocolFieldValue); + return protocolFieldValue; + } + } + return null; + } + + /** + * 获取帧固定位置信息 + * + * @param byteBuf + * @param protocolConfig + * @return + */ + public Map getFixedProperty(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_POSITION + protocolConfig.getId(); + if (this.singleObjects.containsKey(catchKey)) { + return (Map) singleObjects.get(catchKey); + } + Map fixedPropertyMap = new HashMap<>(); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + fixedPropertyMap = fieldParser.doGetFixedProperty(protocolFieldConfigs, this.getTotalLength(byteBuf,protocolConfig)); + if (CollectionUtils.isNotEmpty(fixedPropertyMap)) { + this.singleObjects.put(catchKey, fixedPropertyMap); + return fixedPropertyMap; + } + return fixedPropertyMap; + } + + /** + * 获取帧结构应有的总长度 + */ + public Integer getTotalLength(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_LENGTH + ByteBufUtil.hexDump(byteBuf); + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + Integer appointFrameLength = getProtocolFieldValue(protocolConfig.getTotalLengthId(), byteBuf); + if (appointFrameLength != null) { + //获取过滤的字段集合总长度 + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Integer totalFilterLength = fieldParser.getTotalFilterLength(protocolConfig, byteBuf, getFixFieldConfigMap()); + //计算总长度 + Integer totalLength = appointFrameLength + totalFilterLength; + //加入缓存 + if (ObjectUtils.isNotEmpty(totalLength)) { + this.singleObjects.put(catchKey, totalLength); + return totalLength; + } + } + return null; + } + + /** + * 获取协议有关字段解析内容 + * storeObjectMap存储代转存的数据 + * + * @return + */ + public Map getProtocolDataMap(ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(FIXED_FIELD_DS)) { + return (Map) singleObjects.get(FIXED_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(protocolFieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + this.singleObjects.put(FIXED_FIELD_DS, fixDataMap); + return fixDataMap; + } + return null; + } + + /** + * 获取业务报文内容的content字节 + * + * @param wholeDatagramByte + * @return + */ + public ByteBuf getDataContentBuf(ByteBuf wholeDatagramByte) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(CONTENT_FIELD_DS)) { + return (ByteBuf) singleObjects.get(CONTENT_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + ByteBuf bizDataByteBuf = fieldParser.getDataContentBuf(protocolFieldConfigs, wholeDatagramByte); + if (bizDataByteBuf != null) { + this.singleObjects.put(CONTENT_FIELD_DS, bizDataByteBuf); + return bizDataByteBuf; + } + return null; + } + + + private ProtocolFieldConfig selectFieldConfig(Long id) { + Optional optionalProtocolFieldConfig = this.protocolFieldConfigs.stream().filter( + e -> e.getId().equals(id) + ).findFirst(); + return optionalProtocolFieldConfig.isPresent() ? optionalProtocolFieldConfig.get() : null; + } + + + private Map getFixFieldConfigMap() { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, e -> e) + ); + return fixDataFieldMap; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(protocolFieldConfigs) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java new file mode 100644 index 0000000..dafba1c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java @@ -0,0 +1,56 @@ +package com.casic.missiles.parser.provider; + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.rule.GenericRuleResolver; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.RuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleConfigProvider { + + private final List ruleConfigs; + + public List getRuleConfigs() { + return ruleConfigs; + } + + public RuleConfigProvider(Long protocolId) { + RuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(RuleConfigRegistry.class); + ruleConfigs = ruleConfigRegistry.getRuleConfigById(protocolId); + } + + /** + * 获取规则匹配结果 + * + * @param parseFixedDataMap + * @param protocolFieldConfigs + * @return + */ + public RuleConfig doGetRule(Map parseFixedDataMap, + String ids, + List protocolFieldConfigs) { + if (showSkip()) { + return null; + } + RuleConfig ruleConfig = GenericRuleResolver.machRule(parseFixedDataMap, ids, protocolFieldConfigs, ruleConfigs); + return ruleConfig; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(ruleConfigs) ? false : true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java index 3c05891..856b399 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java @@ -1,18 +1,11 @@ package com.casic.missiles.parser.resolver; -import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.springframework.web.bind.annotation.RequestBody; -import javax.annotation.Resource; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -20,19 +13,17 @@ @Slf4j public class ByteMergeProvider { - @Resource - private FieldRuleEngineMapper fieldRuleEngineMapper; - //拿到所有的值合并到一个值 - public String resolveByteMerge(List valueList, String ruletypeId, String vaildRange) { + public static String resolveByteMerge(List valueList, String ruleTypeId, String vaildRange) { String values = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Map vaildMap = getValidRangeMap(vaildRange); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(ruletypeId); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } + //暂时不处理 +// fieldRuleEngine = fieldRuleConfigMapper.selectById(ruleTypeId); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } Map env2 = new HashMap(); for (int i = 0; i < valueList.size(); i++) { if (vaildMap.containsKey(i)) { @@ -47,7 +38,7 @@ } } - private Map getValidRangeMap(String vaildRange) { + private static Map getValidRangeMap(String vaildRange) { String[] range = vaildRange.split(","); Map vaildMap = new HashMap(); for (int i = 0; i < range.length; i++) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 8d821cd..85d6bbf 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -1,9 +1,12 @@ package com.casic.missiles.parser.resolver; +import com.casic.missiles.pojo.AbstractFieldConfig; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; import io.netty.buffer.ByteBuf; +import java.util.List; import java.util.Map; /** @@ -11,18 +14,14 @@ */ public interface FieldParser { -// Map fieldProcess(String protocolContent,); - Map dataParser(RuleConfig ruleConfig, String lightText,String protocolId); + Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength); - Map fixDataParser(String protocolId, ByteBuf buffer); + Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap); - Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf); + ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer); - ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer); - - ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer); - - Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer); + Integer getTotalFilterLength(ProtocolConfig protocolConfig, ByteBuf byteBuf, Map protocolFieldConfigMap); } + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java new file mode 100644 index 0000000..9e0c00e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java @@ -0,0 +1,52 @@ +package com.casic.missiles.parser.resolver; + +import com.casic.missiles.pojo.AbstractFieldConfig; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.util.List; + +public class FieldParserSupport { + + //分别计算bit和byte长度=> 合并长度 + protected Integer calculateLength(List fieldConfigList) { + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + Integer fixedLength = bytefixedLength + bitfixedLength / 8; + return fixedLength; + } + + //找到最大值=> 根据最大值计算业务数据下标 + protected Integer calculatePosition(List fieldConfigList) { + String rex = "[0-9]+"; + Integer max = -1; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) + && Integer.valueOf(fieldConfig.getOriginPositionByte()) > max) { + max = Integer.valueOf(fieldConfig.getOriginPositionByte()); + } + } + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) && fieldConfig.getOriginPositionByte().equals(max)) { + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + } + } + Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; + return maxFixedPosition; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java deleted file mode 100644 index dd3a6cd..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java +++ /dev/null @@ -1,170 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.ByteResolverParam; -import io.netty.buffer.ByteBuf; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -/** - * 字段解析管理总类 - */ -@Service -@Slf4j -@AllArgsConstructor -public class FieldResolver extends ByteMergeProvider { - - //1、字段截取 => 2、简单的字节解析和复杂的字节解析 - public Object filedParserManger(ByteBuf byteBuf, FieldConfig fieldConfig, Integer maxFixedPosition) { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - //最大固定位置不为空, - if (!ObjectUtil.isEmpty(maxFixedPosition)) { - orignPosition -= maxFixedPosition; - } - Object fieldValue = 0; - //待优化 - if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { - fieldValue = bitToResolver(byteBuf, fieldConfig); - } else { - ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); - fieldValue = parsingFields(fieldBytes, fieldConfig.getRuleJson()); - } - return fieldValue; - } - - //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, - //目前默认配置的规则设置暂不支持配置化,由实现完成 - private Object parsingFields(ByteBuf byteBuf, String ruleJson) { - Object fieldsResolveValue = null; - List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); - if (ObjectUtil.isEmpty(ruleMapList)) { - fieldsResolveValue = defaultResolveBuilder(byteBuf); - } else { - fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); - } - return fieldsResolveValue; - } - - private Object defaultResolveBuilder(ByteBuf byteBuf) { - Integer defaultResolveValue = 0; - for (int i = 0; i < byteBuf.writerIndex(); i++) { - defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; - } - return defaultResolveValue; - } - - //字段解析构建器(针对字节单位的) - //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 - // 字节归并结束或者规则结束=>继续根据规则进行判断 - private Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { - Object customizeResolveValue = null; - try { - List bytStrList = new ArrayList<>(); - //存放到数组里面 - for (int i = 0; i < byteBuf.writerIndex(); i++) { - bytStrList.add(byteBuf.readByte()); - } - int i = 0; - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - customizeResolveValue = this.resolveByteMerge(bytStrList, ruletypeId,vaildRange); - break; - } else { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - List tempBytStr = new ArrayList<>(); - for (int k = 0; i < bytStrList.size(); i++) { - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(k) - .value(bytStrList.get(k)) - .ruletypeId(ruletypeId).build(); - tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); - } - bytStrList = tempBytStr; - } - i++; - } - //字节归并到一起=>继续根据规则进行判断 - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(customizeResolveValue) - .ruletypeId(ruletypeId).build(); - customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(customizeResolveValue)); - return customizeResolveValue; - } catch (RuntimeException ex) { - log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); - return null; - } - } - - /** - * 1、单个字节情况表示字段 - * 2、多字节情况表示字段(暂未处理) - */ - private Object bitToResolver(ByteBuf byteBuf, FieldConfig fieldConfig) { - Object fieldValue = new Object(); - try { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - byte fields = 0x00; - if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); - } else { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); - } - - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { - if (!StringUtils.isEmpty(fieldConfig.getExactOrignPosition())) { - fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getExactOrignPosition())).byteValue() - >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); - } else { - fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); - } - } else { - fieldValue = Integer.valueOf(fields & 0xff); - } - if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { - return fieldValue; - } - List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); - int i = 0; - //字节归并到一起=>继续根据规则进行判断 - while (i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(fieldValue) - .ruletypeId(ruletypeId).build(); - fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(fieldValue)); - return fieldValue; - } catch (RuntimeException ex) { - log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); - return null; - } - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java new file mode 100644 index 0000000..1d2aeab --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java @@ -0,0 +1,36 @@ +package com.casic.missiles.parser.resolver.bytes; + +import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.mapper.FieldRuleConfigMapper; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.pojo.ByteResolverParam; +import com.googlecode.aviator.AviatorEvaluator; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; +//转换规则 +@Component("convert") +@AllArgsConstructor +@Slf4j +public class ByteRuleResolver implements ByteResolver { + + private final FieldRuleConfigMapper fieldRuleConfigMapper; + + @Override + public Object resolveOperationRule(ByteResolverParam byteResolverParam){ + FieldRuleConfig fieldRuleEngine=fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); + if(ObjectUtil.isEmpty(fieldRuleEngine)){ + return byteResolverParam.getValue(); + } + String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); + Map env2 = new HashMap(); + env2.put("value", (byte) byteResolverParam.getValue()); + String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); + return values; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java index 103821c..786b71c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java @@ -2,34 +2,34 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("logicalShift") +@Component("logicalShift") @AllArgsConstructor @Slf4j public class LogicalShiftResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //字节位移 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { Integer index = byteResolverParam.getIndex(); - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return byteResolverParam.getValue(); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java index 476747d..01149bd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("operation") +@Component("operation") @AllArgsConstructor @Slf4j public class OperationResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //混合运算,有常量或者乘除的缩放 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java index 0b82cf4..79abcce 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.casic.missiles.pojo.ByteResolverParam; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; //精度计算 -@Service("precision") +@Component("precision") @AllArgsConstructor @Slf4j public class PrecisionResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java deleted file mode 100644 index 5c3f332..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; -//转换规则 -@Service("convert") -@AllArgsConstructor -@Slf4j -public class RuleResolver implements ByteResolver { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam){ - RuleEvaluator fieldRuleEngine=fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); - if(ObjectUtil.isEmpty(fieldRuleEngine)){ - return byteResolverParam.getValue(); - } - String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); - Map env2 = new HashMap(); - env2.put("value", (byte) byteResolverParam.getValue()); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java new file mode 100644 index 0000000..d3bbd91 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java @@ -0,0 +1,15 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; + +import java.util.List; +import java.util.Map; +// 前导码匹配->长度字段 +public interface AbstractCombinedFieldProcessor { + + Map invoke(Map map, ByteBuf byteBuf, List combinedFieldConfigList, + Map fieldConfigsMap, Map storeObjectMap); + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java new file mode 100644 index 0000000..03c8480 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java @@ -0,0 +1,59 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-13 + */ +//依次递增进行数据的解析, +public class GenericCombinedFieldResolver { + + + //通过查询,字段长度长度随机 + public void parseDataField(List combinedFieldConfigList, ByteBuf byteBuf, + Map storeObjectMap, Map fieldConfigsMap) { + Integer frameLength = Integer.valueOf(ByteBufUtil.hexDump(byteBuf)); + //添加前置处理器 + com.casic.missiles.util.ClassUtil classUtil = new com.casic.missiles.util.ClassUtil(); + List abstractCombinedProcessors = classUtil.getSubClassList(AbstractCombinedFieldProcessor.class); + + Map fieldFixedMap = combinedFieldLeadCodeMap(combinedFieldConfigList); + //frameLength + Map combinedProcessorFields = null; + while (byteBuf.readableBytes() < frameLength) { + //一直处理 + for (AbstractCombinedFieldProcessor abstractCombinedProcessor : abstractCombinedProcessors) { + combinedProcessorFields = abstractCombinedProcessor.invoke(combinedProcessorFields, byteBuf, + combinedFieldConfigList, + fieldConfigsMap, storeObjectMap); + if (combinedProcessorFields == null || byteBuf.readableBytes() < frameLength) { + return; + } + } + + } + } + + /** + * 取出前导码匹配集合 + */ + private Map combinedFieldLeadCodeMap(List combinedFieldConfigList) { + Map fieldFixedMap = combinedFieldConfigList + .stream() + .collect(Collectors.toMap(CombinedFieldConfig::getPrefixCode, e -> e)); + return fieldFixedMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java new file mode 100644 index 0000000..643a934 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java @@ -0,0 +1,100 @@ +package com.casic.missiles.parser.resolver.fields; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.FieldParserSupport; +import com.casic.missiles.pojo.*; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 保存使用时最基本的信息,并且使用原型模式 + */ +@Slf4j +public class DefaultProtocolFieldParser extends FieldParserSupport implements FieldParser, FixedPropertyEnum { + + //通过传入的配置和报文进行字段解析 + @Override + public Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap) { + Map dataMap = new HashMap<>(); + for (AbstractFieldConfig protocolFieldConfig : protocolFieldConfigs) { + if (!ObjectUtils.isEmpty(protocolFieldConfig.getOriginPositionByte())) { + Object fieldValue = FieldResolver.parseField(buffer, protocolFieldConfig, null); + if (protocolFieldConfig.getIsStorage() == 1) { + storeObjectMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + dataMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + } + return dataMap; + } + + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength) { + Map fixedPropertyMap = new HashMap<>(); + Integer fixedLength = calculateLength(protocolFieldConfigs); + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + fixedPropertyMap.put(FIXED_POSITION, maxFixedPosition); + fixedPropertyMap.put(TOTAL_LENGTH, totalLength); + fixedPropertyMap.put(TAIL_POSITION, totalLength - fixedLength + maxFixedPosition); + return fixedPropertyMap; + } + + //** 获取业务内容的byteBuf + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer) { + //计算固定长度 + Integer fixedLength = calculateLength(protocolFieldConfigs); + //总长度获取 + String lightText = buffer.toString(Charset.forName("ISO-8859-1")); + Integer totalLength = lightText.length(); + //计算固定长度最大长度 + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + //计算数据报文内容 + ByteBuf bizDataFields = buffer.slice(maxFixedPosition - 1, (totalLength - fixedLength)); + return bizDataFields; + } + + /** + * 获取过滤字段的长度 + */ + @Override + public Integer getTotalFilterLength(ProtocolConfig protocolConfig, + ByteBuf byteBuf, + Map protocolFieldConfigMap) { + if (ByteBufUtil.hexDump(byteBuf).equals("")) { + return 0; + } + int totalFilterLength = 0; + String filterFields = protocolConfig.getTotalLengthFilterFields(); + try { + if (!StringUtils.isEmpty(filterFields)) { + String[] filterFieldList = filterFields.split(","); + for (String filterFieldId : filterFieldList) { + if (StringUtils.isNotEmpty(filterFieldId)) { + ProtocolFieldConfig fieldConfig = protocolFieldConfigMap.get(Long.valueOf(filterFieldId)); + //这里都是按字节计算,没有对位进行区分,可能会出现错误 + // 如果对位有需求,需要进一步跟进 + totalFilterLength += fieldConfig.getOffsetLength(); + } + } + } + return totalFilterLength; + } catch (Exception ex) { + log.error("报文确认分发阶段,获取报文总长度过滤长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); + } + return totalFilterLength; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java new file mode 100644 index 0000000..d51e887 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java @@ -0,0 +1,169 @@ +package com.casic.missiles.parser.resolver.fields; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.parser.resolver.ByteMergeProvider; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.AbstractFieldConfig; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.pojo.ByteResolverParam; +import io.netty.buffer.ByteBuf; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * 字段解析管理总类 + */ +@Slf4j +public class FieldResolver extends ByteMergeProvider { + + //1、字段截取 => 2、简单的字节解析和复杂的字节解析 + public static Object parseField(ByteBuf byteBuf,AbstractFieldConfig fieldConfig, Integer maxFixedPosition) { + Integer orignPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + //最大固定位置不为空, + if (!ObjectUtil.isEmpty(maxFixedPosition)) { + orignPosition -= maxFixedPosition; + } + Object fieldValue = 0; + //待优化 + if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { + fieldValue = doParseBitField(byteBuf, fieldConfig); + } else { + ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); + fieldValue = doParseByteField(fieldBytes, fieldConfig.getRuleJson()); + } + return fieldValue; + } + + //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, + //目前默认配置的规则设置暂不支持配置化,由实现完成 + private static Object doParseByteField(ByteBuf byteBuf, String ruleJson) { + Object fieldsResolveValue = null; + List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); + if (ObjectUtil.isEmpty(ruleMapList)) { + fieldsResolveValue = defaultResolveBuilder(byteBuf); + } else { + fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); + } + return fieldsResolveValue; + } + + private static Object defaultResolveBuilder(ByteBuf byteBuf) { + Integer defaultResolveValue = 0; + for (int i = 0; i < byteBuf.writerIndex(); i++) { + defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; + } + return defaultResolveValue; + } + + //字段解析构建器(针对字节单位的) + //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 + // 字节归并结束或者规则结束=>继续根据规则进行判断 + private static Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { + Object customizeResolveValue = null; + try { + List bytStrList = new ArrayList<>(); + //存放到数组里面 + for (int i = 0; i < byteBuf.writerIndex(); i++) { + bytStrList.add(byteBuf.readByte()); + } + int i = 0; + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { + if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + customizeResolveValue = resolveByteMerge(bytStrList, ruletypeId, vaildRange); + break; + } else { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + List tempBytStr = new ArrayList<>(); + for (int k = 0; i < bytStrList.size(); i++) { + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(k) + .value(bytStrList.get(k)) + .ruletypeId(ruletypeId).build(); + tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); + } + bytStrList = tempBytStr; + } + i++; + } + //字节归并到一起=>继续根据规则进行判断 + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(null) + .value(customizeResolveValue) + .ruletypeId(ruletypeId).build(); + customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); + i++; + } + System.out.println(JSON.toJSON(customizeResolveValue)); + return customizeResolveValue; + } catch (RuntimeException ex) { + log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); + return null; + } + } + + /** + * 1、单个字节情况表示字段 + * 2、多字节情况表示字段(暂未处理) + */ + private static Object doParseBitField(ByteBuf byteBuf,AbstractFieldConfig fieldConfig) { + Object fieldValue = new Object(); + try { + Integer orignPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + byte fields = 0x00; + if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { + fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); + } else { + fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); + } + + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { + if (!StringUtils.isEmpty(fieldConfig.getOriginPositionBit())) { + fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getOriginPositionBit())).byteValue() + >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); + } else { + fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); + } + } else { + fieldValue = Integer.valueOf(fields & 0xff); + } + if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { + return fieldValue; + } + List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); + int i = 0; + //字节归并到一起=>继续根据规则进行判断 + while (i < ruleMapList.size()) { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(null) + .value(fieldValue) + .ruletypeId(ruletypeId).build(); + fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); + i++; + } + System.out.println(JSON.toJSON(fieldValue)); + return fieldValue; + } catch (RuntimeException ex) { + log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); + return null; + } + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java deleted file mode 100644 index 35ae3d0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java +++ /dev/null @@ -1,183 +0,0 @@ -package com.casic.missiles.parser.resolver.fields; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufAllocator; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; -import org.springframework.util.ObjectUtils; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service("standard") -@AllArgsConstructor -@Slf4j -public class StandardFieldParser implements FieldParser { - - private final FieldConfigDao fieldConfigDao; - private final FieldResolver fieldResolver; - - //数据解析 - @Override - public Map dataParser(RuleConfig ruleConfig, String lightText, String protocolId) { - String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); - ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); - bufferContent.writeBytes(lightText.getBytes(Charset.forName("ISO-8859-1"))); - Map dataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - for (String dataFieldId : dataFieldIds) { - FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(dataFieldId); - if (!ObjectUtils.isEmpty(fieldConfig)) { - dataMap.put(fieldConfig.getFieldName(), String.valueOf(fieldResolver.filedParserManger(bufferContent, fieldConfig, maxFixedPosition))); - } - } - return dataMap; - } - - //数据解析 - @Override - public Map fixDataParser(String protocolId, ByteBuf buffer) { - List dataFieldIdList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Map dataMap = new HashMap<>(); - for (FieldConfig dataField : dataFieldIdList) { - if (!ObjectUtils.isEmpty(dataField.getOrignPosition())) { - Object fieldValue = (Integer) fieldResolver.filedParserManger(buffer, dataField, null); - dataMap.put(dataField.getFieldName(), fieldValue); - } - } - return dataMap; - } - - @Override - public Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf) { - if (ByteBufUtil.hexDump(byteBuf).equals("")) { - return 0; - } - String filterFields = protocolConfig.getTotalLengthFilterField(); - Integer totalLength = 0; - try { - FieldConfig totalFieldConfig = fieldConfigDao.getFieldConfigById(protocolConfig.getTotalLengthId()); - int totalFilterLength = 0; - if (!StringUtils.isEmpty(filterFields)) { - String[] filterFieldList = filterFields.split(","); - for (String filterField : filterFieldList) { - FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(filterField); - //这里都是按字节计算,没有对位进行区分,可能会出现错误 - - // 如果对位有需求,需要进一步跟进 - totalFilterLength += fieldConfig.getOffsetLength(); - } - } - totalLength = (Integer) fieldResolver.filedParserManger(byteBuf, totalFieldConfig, null) + totalFilterLength; - } catch (Exception ex) { - log.error("报文确认分发阶段,获取报文总长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); - } - return totalLength; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer) { - //业务内容 - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - String protocolId = String.valueOf(protocolConfig.getId()); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - //计算固定长度 - Integer fixedLength = calculateLength(fieldConfigList); -// Integer totalLength = this.getTotalLength(protocolConfig, buffer); - //总长度获取 - Integer totalLength = lightText.length(); - //计算固定长度最大长度 - Integer maxFixedPosition = calculatePosition(fieldConfigList); -// buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - //计算数据报文内容 - ByteBuf bizDataFields = buffer.slice(maxFixedPosition-1, (totalLength - fixedLength)); - return bizDataFields; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer) { - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - String protocolId = String.valueOf(protocolConfig.getId()); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer fixedLength = calculateLength(fieldConfigList); -// Integer totalLength = this.getTotalLength(protocolConfig, buffer); - Integer totalLength = lightText.length(); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - ByteBuf fixDataFields = buffer.slice(0, maxFixedPosition); - return fixDataFields; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer) { - String protocolId = String.valueOf(protocolConfig.getId()); - Map fixedPropertyMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer fixedLength = calculateLength(fieldConfigList); - Integer totalLength = this.getTotalLength(protocolConfig, buffer); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - fixedPropertyMap.put("fixedPosition", maxFixedPosition); - fixedPropertyMap.put("totalLength", totalLength); - fixedPropertyMap.put("tailPosition", totalLength - fixedLength + maxFixedPosition); - return fixedPropertyMap; - } - - //分别计算bit和byte长度=> 合并长度 - private Integer calculateLength(List fieldConfigList) { - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (FieldConfig fieldConfig : fieldConfigList) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - Integer fixedLength = bytefixedLength + bitfixedLength / 8; - return fixedLength; - } - - //找到最大值=> 根据最大值计算业务数据下标 - private Integer calculatePosition(List fieldConfigList) { - String rex = "[0-9]+"; - Integer max = -1; - for (FieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOrignPosition()) - && Integer.valueOf(fieldConfig.getOrignPosition()) > max) { - max = Integer.valueOf(fieldConfig.getOrignPosition()); - } - } - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (FieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOrignPosition()) && fieldConfig.getOrignPosition().equals(max)) { - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - } - } - Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; - return maxFixedPosition; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java new file mode 100644 index 0000000..d4ec6c7 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java @@ -0,0 +1,76 @@ +package com.casic.missiles.parser.rule; + +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import org.apache.commons.lang3.StringUtils; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class GenericRuleResolver { + + //根据前置字段的值,找到指定的规则 + //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 + //=>循环判断=>通过规则得到业务字段 + public static RuleConfig machRule(Map fixDataMap, + String ids, + List protocolFieldConfigs, + List ruleConfigs) { + List preRuleConfigList = getPreRuleList(ids, protocolFieldConfigs); + //获取前置规则字段 + final Map metaDataMap = getPreRuleFields(preRuleConfigList, fixDataMap); + //准备固定的字段集合 + Map fixDataFieldMap = getFixDataFieldMap(protocolFieldConfigs); + return RuleResolverCore.doMachRule(ruleConfigs, metaDataMap, fixDataMap, fixDataFieldMap); + } + + private static Map getFixDataFieldMap(List protocolFieldConfigs) { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, ProtocolFieldConfig::getFieldName) + ); + return fixDataFieldMap; + } + + + /** + * 查询前置规则的字段配置 + * + * @param ids + * @return + */ + private static List getPreRuleList(String ids, List protocolFieldConfigs) { + String[] idList = ids.split(","); + Map prepareMaps = new HashMap<>(); + for (String id : idList) { + if (StringUtils.isNotEmpty(id)) { + prepareMaps.put(Long.valueOf(id), ""); + } + } + List preRuleConfigList = protocolFieldConfigs + .stream() + .filter(e -> prepareMaps.containsKey(e.getId())) + .collect(Collectors.toList()); + return preRuleConfigList; + } + + /** + * 获取前置规则解析字段 + */ + private static Map getPreRuleFields(List preRuleFieldConfigList, Map fixDataMap) { + Map ruleFieldMap = new HashMap<>(); + preRuleFieldConfigList.stream() + .forEach( + preRuleFieldConfig -> { + String fieldName = preRuleFieldConfig.getFieldName(); + if (fixDataMap.containsKey(fieldName)) { + ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); + } + } + ); + return ruleFieldMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java new file mode 100644 index 0000000..baae7e8 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -0,0 +1,68 @@ +package com.casic.missiles.parser.rule; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.casic.missiles.pojo.RuleConfig; + +import java.util.*; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleResolverCore { + + + public static RuleConfig doMachRule(List ruleConfigList, Map metaDataMap, + Map fixDataMap, + Map fixDataFieldMap) { + Optional ruleConfigOptional = ruleConfigList.stream() + .filter(ruleConfig -> machRuleConfig( + JSON.parseObject(ruleConfig.getMatchRuleJson(), Map.class), metaDataMap)) + .findFirst(); + if (ObjectUtil.isEmpty(ruleConfigOptional)) { + return null; + } + String[] ruleFields = ruleConfigOptional.get().getDataFieldIds().split(","); + Map ruleMetaDataMap = getRuleFields(ruleFields, fixDataMap, fixDataFieldMap); + //递归选定解析规则,进行规则解析 + if (!ruleConfigOptional.get().getIsFinishMatch().equals("1")) { + //递归选定规则 + doMachRule(ruleConfigList, ruleMetaDataMap, fixDataMap, fixDataFieldMap); + } + return ruleConfigOptional.get(); + } + + + private static Map getRuleFields(String[] preRuleConfigList, Map fixedDataMap, + Map fixedFieldMap) { + Map ruleFieldMap = new HashMap<>(); + for (String preRuleConfigId : preRuleConfigList) { + String fieldName = fixedFieldMap.get(preRuleConfigId); + if (fixedDataMap.containsKey(fieldName)) { + ruleFieldMap.put(fieldName, String.valueOf(fixedDataMap.get(fieldName))); + } + } + return ruleFieldMap; + } + + + //匹配规则配置 + private static Boolean machRuleConfig(Map ruleMap, Map metaDataMap) { + if (ruleMap == null || metaDataMap == null) { + return null; + } + //所有的字段在规则里面必须有有配置 + for (String key : metaDataMap.keySet()) { + if (ruleMap.containsKey(key)) { + if (!ruleMap.get(key).equals(metaDataMap.get(key))) { + return false; + } + } else { + return false; + } + } + return true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java deleted file mode 100644 index 664088d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java +++ /dev/null @@ -1,92 +0,0 @@ -package com.casic.missiles.parser.rule; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.mapper.dao.PreRuleConfigDao; -import com.casic.missiles.mapper.dao.RuleConfigDao; -import lombok.AllArgsConstructor; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.*; -import java.util.stream.Collectors; - -@Service -@AllArgsConstructor -public class RulerProvider { - - private final FieldConfigDao fieldConfigDao; - private final PreRuleConfigDao preRuleConfigDao; - private final RuleConfigDao ruleConfigDao; - - //根据前置字段的值,找到指定的规则 - //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 - //=>循环判断=>通过规则得到业务字段 - public RuleConfig ruleConfig(Map fixDataMap, String protocolId) { - //批量获取规则 - List preRuleConfigList = preRuleConfigDao.getPreRuleList(protocolId); - //获取固定字段 - Map fixFieldMap = getAllFieldMap(protocolId); - //获取前置规则字段 - final String preRuleFields = getPreRuleFields(preRuleConfigList, fixDataMap, fixFieldMap); - List ruleConfigList = ruleConfigDao.getRuleConfigById(protocolId); - Optional ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig ->preRuleFields.equals( ruleConfig.getParseRuleJson())).findFirst(); - //递归选定解析规则,进行规则解析 - while (!ObjectUtil.isEmpty(ruleConfigOptional) && !ruleConfigOptional.get().getIsBizField().equals("1")) { - String ruleFields = getRuleFields(ruleConfigOptional.get().getDataFieldIds().split(","), fixDataMap, fixFieldMap); - ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig -> ruleConfig.getParseRuleJson().equals(ruleFields)).findFirst(); - } - return ruleConfigOptional.get(); - } - - /** - * 获取前置规则解析字段 - */ - private String getPreRuleFields(List preRuleConfigList, Map fixDataMap, Map fixFieldMap) { - Map ruleFieldMap= new HashMap<>(); - preRuleConfigList.stream() - .forEach( - preRuleConfig -> { - String fieldName = fixFieldMap.get(Long.valueOf(preRuleConfig.getRuleFieldId())); - if (fixDataMap.containsKey(fieldName)) { - ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); - } - } - ); - return JSONObject.toJSONString(ruleFieldMap); - } - - private Map getAllFieldMap(String protocolId) { - List fieldList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Map fixFieldMap = fieldList.stream().collect( - Collectors.toMap(FieldConfig::getId, FieldConfig::getFieldName) - ); - return fixFieldMap; - } - - private String getRuleFields(String[] preRuleConfigList, Map fixDataMap, Map fixFieldMap) { - Map ruleFieldMap= new HashMap<>(); - for (String preRuleConfigId : preRuleConfigList) { - String fieldName = fixFieldMap.get(preRuleConfigId); - if (fixDataMap.containsKey(fieldName)) { - ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); - } - } - return JSONObject.toJSONString(ruleFieldMap); - } - - //弃置 - private String ListToString(List ruleFieldList) { - String ruleFields = ""; - for (String ruleField : ruleFieldList) { - ruleFields += ruleField + ","; - } - ruleFields = StringUtils.isEmpty(ruleFields) ? ruleFields : ruleFields.substring(0, ruleFields.length() - 1); - return ruleFields; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java index 6177e10..bfa87a5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java @@ -2,7 +2,7 @@ public interface SafeStrategy { - String decryption(byte[] bytes); + String decryption(String cipher); String encryption(String lightText); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java index 618716c..6236302 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java @@ -9,9 +9,9 @@ //十六进制的字符串转换成字节数组 byte[] bytes = hexStrToBinaryStr(msg); //计算CRC8 - byte crc8 = CRC8(bytes, 0, bytes.length); - String crc8ToStr = "" + Integer.toHexString(0xff & crc8); - return crc8ToStr; +// String crc8ToStr = "" + Integer.toHexString(0xff & crc8); +// return crc8ToStr; + return null; } /** @@ -33,50 +33,5 @@ return bytes; } - /** - * CRC8 校验 多项式 x8+x2+x+1 - * - * @param b - * @param off - * @param len - * @return - */ - public static byte CRC8(final byte[] b, final int off, final int len) { - byte result = 0x00; - for (int i = 0; i < len; i++) { - result = CHECKSUM_TABLE[(result ^ (b[i + off] & 0xFF)) & 0xFF]; - } - return (byte) (result & 0xFFL); - } - - private final static byte[] CHECKSUM_TABLE = {(byte) 0x00, (byte) 0x07, (byte) 0x0e, (byte) 0x09, (byte) 0x1c, (byte) 0x1b, - (byte) 0x12, (byte) 0x15, (byte) 0x38, (byte) 0x3f, (byte) 0x36, (byte) 0x31, (byte) 0x24, (byte) 0x23, (byte) 0x2a, - (byte) 0x2d, (byte) 0x70, (byte) 0x77, (byte) 0x7e, (byte) 0x79, (byte) 0x6c, (byte) 0x6b, (byte) 0x62, (byte) 0x65, - (byte) 0x48, (byte) 0x4f, (byte) 0x46, (byte) 0x41, (byte) 0x54, (byte) 0x53, (byte) 0x5a, (byte) 0x5d, (byte) 0xe0, - (byte) 0xe7, (byte) 0xee, (byte) 0xe9, (byte) 0xfc, (byte) 0xfb, (byte) 0xf2, (byte) 0xf5, (byte) 0xd8, (byte) 0xdf, - (byte) 0xd6, (byte) 0xd1, (byte) 0xc4, (byte) 0xc3, (byte) 0xca, (byte) 0xcd, (byte) 0x90, (byte) 0x97, (byte) 0x9e, - (byte) 0x99, (byte) 0x8c, (byte) 0x8b, (byte) 0x82, (byte) 0x85, (byte) 0xa8, (byte) 0xaf, (byte) 0xa6, (byte) 0xa1, - (byte) 0xb4, (byte) 0xb3, (byte) 0xba, (byte) 0xbd, (byte) 0xc7, (byte) 0xc0, (byte) 0xc9, (byte) 0xce, (byte) 0xdb, - (byte) 0xdc, (byte) 0xd5, (byte) 0xd2, (byte) 0xff, (byte) 0xf8, (byte) 0xf1, (byte) 0xf6, (byte) 0xe3, (byte) 0xe4, - (byte) 0xed, (byte) 0xea, (byte) 0xb7, (byte) 0xb0, (byte) 0xb9, (byte) 0xbe, (byte) 0xab, (byte) 0xac, (byte) 0xa5, - (byte) 0xa2, (byte) 0x8f, (byte) 0x88, (byte) 0x81, (byte) 0x86, (byte) 0x93, (byte) 0x94, (byte) 0x9d, (byte) 0x9a, - (byte) 0x27, (byte) 0x20, (byte) 0x29, (byte) 0x2e, (byte) 0x3b, (byte) 0x3c, (byte) 0x35, (byte) 0x32, (byte) 0x1f, - (byte) 0x18, (byte) 0x11, (byte) 0x16, (byte) 0x03, (byte) 0x04, (byte) 0x0d, (byte) 0x0a, (byte) 0x57, (byte) 0x50, - (byte) 0x59, (byte) 0x5e, (byte) 0x4b, (byte) 0x4c, (byte) 0x45, (byte) 0x42, (byte) 0x6f, (byte) 0x68, (byte) 0x61, - (byte) 0x66, (byte) 0x73, (byte) 0x74, (byte) 0x7d, (byte) 0x7a, (byte) 0x89, (byte) 0x8e, (byte) 0x87, (byte) 0x80, - (byte) 0x95, (byte) 0x92, (byte) 0x9b, (byte) 0x9c, (byte) 0xb1, (byte) 0xb6, (byte) 0xbf, (byte) 0xb8, (byte) 0xad, - (byte) 0xaa, (byte) 0xa3, (byte) 0xa4, (byte) 0xf9, (byte) 0xfe, (byte) 0xf7, (byte) 0xf0, (byte) 0xe5, (byte) 0xe2, - (byte) 0xeb, (byte) 0xec, (byte) 0xc1, (byte) 0xc6, (byte) 0xcf, (byte) 0xc8, (byte) 0xdd, (byte) 0xda, (byte) 0xd3, - (byte) 0xd4, (byte) 0x69, (byte) 0x6e, (byte) 0x67, (byte) 0x60, (byte) 0x75, (byte) 0x72, (byte) 0x7b, (byte) 0x7c, - (byte) 0x51, (byte) 0x56, (byte) 0x5f, (byte) 0x58, (byte) 0x4d, (byte) 0x4a, (byte) 0x43, (byte) 0x44, (byte) 0x19, - (byte) 0x1e, (byte) 0x17, (byte) 0x10, (byte) 0x05, (byte) 0x02, (byte) 0x0b, (byte) 0x0c, (byte) 0x21, (byte) 0x26, - (byte) 0x2f, (byte) 0x28, (byte) 0x3d, (byte) 0x3a, (byte) 0x33, (byte) 0x34, (byte) 0x4e, (byte) 0x49, (byte) 0x40, - (byte) 0x47, (byte) 0x52, (byte) 0x55, (byte) 0x5c, (byte) 0x5b, (byte) 0x76, (byte) 0x71, (byte) 0x78, (byte) 0x7f, - (byte) 0x6a, (byte) 0x6d, (byte) 0x64, (byte) 0x63, (byte) 0x3e, (byte) 0x39, (byte) 0x30, (byte) 0x37, (byte) 0x22, - (byte) 0x25, (byte) 0x2c, (byte) 0x2b, (byte) 0x06, (byte) 0x01, (byte) 0x08, (byte) 0x0f, (byte) 0x1a, (byte) 0x1d, - (byte) 0x14, (byte) 0x13, (byte) 0xae, (byte) 0xa9, (byte) 0xa0, (byte) 0xa7, (byte) 0xb2, (byte) 0xb5, (byte) 0xbc, - (byte) 0xbb, (byte) 0x96, (byte) 0x91, (byte) 0x98, (byte) 0x9f, (byte) 0x8a, (byte) 0x8d, (byte) 0x84, (byte) 0x83, - (byte) 0xde, (byte) 0xd9, (byte) 0xd0, (byte) 0xd7, (byte) 0xc2, (byte) 0xc5, (byte) 0xcc, (byte) 0xcb, (byte) 0xe6, - (byte) 0xe1, (byte) 0xe8, (byte) 0xef, (byte) 0xfa, (byte) 0xfd, (byte) 0xf4, (byte) 0xf3}; } \ No newline at end of file diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java index 27c2838..6e078a3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java @@ -1,9 +1,6 @@ package com.casic.missiles.parser.safe.impl; -import cn.hutool.core.util.CharsetUtil; -import cn.hutool.crypto.symmetric.SM4; -import cn.hutool.crypto.symmetric.SymmetricCrypto; - +import com.casic.missiles.parser.safe.SafeStrategy; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; @@ -11,19 +8,44 @@ import org.bouncycastle.crypto.engines.SM4Engine; import org.bouncycastle.crypto.params.KeyParameter; import org.bouncycastle.util.encoders.Hex; - -import static cn.hutool.crypto.Mode.ECB; -import static cn.hutool.crypto.Padding.NoPadding; +import org.springframework.stereotype.Component; /** * SM4算法工具类 */ @Slf4j -public class Sm4 { +@Component("sm4") +public class Sm4 implements SafeStrategy { //加解密的字节快大小 public static final int BlockSize = 16; + @Override + public String decryption(String cipher) { + byte[] keyByte = { + 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 + }; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(keyByte); + byte[] in = Hex.decode(cipher); + byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); + String plain = EcbDecrypt(in, keyBytes); + return plain; + } + + @Override + public String encryption(String cipher) { + byte[] keyByte = { + 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 + }; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(keyByte); + byte[] in = Hex.decode(cipher); + byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); + String plain = EcbDecrypt(in, keyBytes); + return plain; + } + /** * SM4ECB加密算法,对内 * @@ -32,8 +54,6 @@ * @return */ private static byte[] ecb_encrypt(byte[] in, byte[] keyBytes) { - - SM4Engine sm4Engine = new SM4Engine(); sm4Engine.init(true, new KeyParameter(keyBytes)); byte[] out = new byte[in.length]; @@ -58,27 +78,6 @@ return cipher; } - - /** - * hutool 解密SM4 - * - * @param encodeContent - * @return - */ - public static String decode(String encodeContent) { - String key = "24ad182507479a5da3ad94d9d78ea203"; - try { - SymmetricCrypto sm4 = new SM4(ECB, NoPadding, key.getBytes()); - String decryptStr = sm4.decryptStr(encodeContent, CharsetUtil.CHARSET_UTF_8); - return decryptStr; - } catch (Exception e) { - e.printStackTrace(); - log.error("SM4解密失败"); - } - return null; - } - - /** * SM4的ECB加密算法 * @@ -129,20 +128,6 @@ return plain; } - /** - * SM4的ECB解密算法 - * - * @param cipher 输入的密文字符串 - * @param key 密钥 - * @return - */ - public static String EcbDecrypt(String cipher, String key) { - byte[] in = Hex.decode(cipher); - byte[] keyBytes = Hex.decode(key); - - String plain = EcbDecrypt(in, keyBytes); - return plain; - } /** * 主函数 @@ -151,28 +136,24 @@ */ public static void main(String[] args) { byte[] ciphertext = { + 0x4B, (byte) 0x8C, (byte) 0x9D, 0x08, (byte) 0xE4, (byte) 0xD3, 0x64, 0x42, (byte) 0xB9, (byte) 0xA5, (byte) 0xFE, (byte) 0xCD, (byte) 0x91, 0x1B, 0x38, (byte) 0xAC, (byte) 0xE9, 0x1C, (byte) 0xCD, 0x53, 0x02, (byte) 0xD7, 0x0C, (byte) 0x9B, (byte) 0x96, 0x30, 0x62, (byte) 0xE8, (byte) 0xFB, (byte) 0xEF, (byte) 0xB9, (byte) 0xFF, (byte) 0xDE, 0x19, (byte) 0x80, 0x35, 0x3E, (byte) 0x90, 0x4F, 0x2F, 0x12, 0x2B, 0x19, (byte) 0x8B, 0x6C, 0x7A, (byte) 0x85, (byte) 0xA1, (byte) 0xB1, (byte) 0x86, (byte) 0xA3, 0x7A, 0x46, 0x0C, 0x2F, (byte) 0x94, 0x4F, 0x7F, 0x2C, 0x56, 0x14, (byte) 0xF3, (byte) 0x89, (byte) 0xC3, - 0x3F, 0x20, (byte) 0xF9, (byte) 0x87, (byte) 0xA1, 0x60, (byte) 0xD9, (byte) 0xA8, (byte) 0xFD, (byte) 0xD7, (byte) 0x9B, 0x4B, 0x26, 0x06, 0x30, 0x44}; + 0x3F, 0x20, (byte) 0xF9, (byte) 0x87, (byte) 0xA1, 0x60, (byte) 0xD9, (byte) 0xA8, (byte) 0xFD, (byte) 0xD7, (byte) 0x9B, 0x4B, 0x26, 0x06, 0x30, 0x44 + }; ByteBuf in = ByteBufAllocator.DEFAULT.heapBuffer(); in.writeBytes(ciphertext); - byte[] keyByte = { 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 }; ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); - key.writeBytes(ciphertext); - String resCipherData = decode(ByteBufUtil.hexDump(in)); - ByteBuf out = ByteBufAllocator.DEFAULT.heapBuffer(); -// out.writeBytes(resCipherData); -// System.out.println(hexBytes); - System.out.println(resCipherData.toString()); -// String resPlainData = EcbDecrypt(resCipherData, key); -// System.out.println("原始明文:" + data); -// System.out.println("解密后明文:" + resPlainData); + key.writeBytes(keyByte); +// String resCipherData = EcbDecrypt(ByteBufUtil.hexDump(in), ByteBufUtil.hexDump(key)); +// System.out.println(resCipherData); } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java index 1395a51..ac5f957 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java @@ -1,7 +1,7 @@ package com.casic.missiles.parser.safe.impl; import io.netty.buffer.ByteBufUtil; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** *

@@ -14,9 +14,8 @@ * @author hyl * @version v1.0: Tea.java, v 0.1 2021/3/12 13:48 $ */ -@Service("tea") -///tea算法类 - +//tea算法类 +@Component("tea") public class Tea { public static byte[] MyTea_Encrypt(byte[] MyTeaContent, int ByteLen, byte[] MyTeakey) { @@ -99,7 +98,6 @@ // for(int i32Index = 0; i32Index < 8; i32Index++) { // System.out.print("0x" + Integer.toHexString(MyContent[i32Index]) + " "); // } - // System.out.println("密钥为:"); // for(int i32Index = 0; i32Index < 16; i32Index++) { // System.out.print("0x" + Integer.toHexString(MyKeys[i32Index]) + " "); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java index bdd0721..bd1516a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java @@ -3,7 +3,7 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.parser.sender.DataSubscribeProvider; import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponents; import org.springframework.web.util.UriComponentsBuilder; @@ -12,7 +12,7 @@ import java.util.Collections; import java.util.Map; -@Service("functionCallback") +@Component("functionCallback") public class FunctionCallback implements DataSubscribeProvider { @Resource diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java index 0b44fb9..7526de2 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.Map; -@Service("middleware") +@Component("middleware") public class MiddlewareSubscribe implements DataSubscribeProvider { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java index 5dcee3f..e2f1192 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.Map; -@Service("nosql") +@Component("nosql") public class NoSqlSubscribe implements DataSubscribeProvider { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java b/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java new file mode 100644 index 0000000..81a5324 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java @@ -0,0 +1,86 @@ +package com.casic.missiles.pojo; + +import lombok.Data; + +/** + * 协议 + */ +@Data +public class Msg { + + /** + * 前导码 + */ + private String preamble; + + /** + * 版本号 + */ + private String version; + + /** + * 内容长度 + */ + private int leng; + + /** + * 设备ID + */ + private String deviceId; + + /** + * 通讯方式 + */ + private Integer connType; + + /** + * 加密方式 + */ + private Integer encryType; + + /** + * 目标地址 + */ + private String destAddr; + + /** + * PDUType + */ + private String PDUType; + + /** + * 操作类型 + */ + private Integer operateType; + + /** + * 传输控制位 PDUType.bit7=0时,表示存在后续的访问;当PDUType.bit7=1时,表示无后续的访问。 + */ + private Integer transControlFlag; + + /** + * 设备类型 + */ + private Integer deviceType; + + /** + * 序号 + */ + private Integer seq; + + /** + * tagList + */ + private String tagList; + + /** + * OidList + */ + private String OidList; + + /** + * CRC + */ + private String CRC; + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java index 40a5265..97cc984 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java @@ -40,7 +40,7 @@ String httpContent = msg.toString(Charset.defaultCharset()); log.info(" String : " + msg.toString(Charset.defaultCharset())); String majorContent = httpContent.substring(httpContent.indexOf("{"), httpContent.lastIndexOf("}") + 1); - String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("serviceData")).get("Value")); + String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("RegistryData")).get("Value")); log.info("----------------------------------" + values); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); bufferContent.writeBytes(values.getBytes(Charset.forName("ISO-8859-1"))); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java index 1b132a7..e3ced4b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java @@ -35,7 +35,7 @@ String httpContent = msg.toString(Charset.defaultCharset()); log.info(" String : " + msg.toString(Charset.defaultCharset())); String majorContent = httpContent.substring(httpContent.indexOf("{"), httpContent.lastIndexOf("}") + 1); - String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("serviceData")).get("Value")); + String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("RegistryData")).get("Value")); log.info("----------------------------------" + values); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); bufferContent.writeBytes(values.getBytes(Charset.forName("ISO-8859-1"))); diff --git a/sensorhub-core/src/main/resources/application.properties b/sensorhub-core/src/main/resources/application.properties deleted file mode 100644 index 8b13789..0000000 --- a/sensorhub-core/src/main/resources/application.properties +++ /dev/null @@ -1 +0,0 @@ - diff --git a/sensorhub-core/src/main/resources/config/application-dev.yml b/sensorhub-core/src/main/resources/config/application-dev.yml index 4f897a8..dcc4c2d 100644 --- a/sensorhub-core/src/main/resources/config/application-dev.yml +++ b/sensorhub-core/src/main/resources/config/application-dev.yml @@ -4,9 +4,9 @@ spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true + url: jdbc:mysql://127.0.0.1:3306/sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true username: root - password: Casic203 + password: root session: store-type: redis redis: diff --git a/sensorhub-core/src/main/resources/config/application.yml b/sensorhub-core/src/main/resources/config/application.yml index ae89f9d..7965da1 100644 --- a/sensorhub-core/src/main/resources/config/application.yml +++ b/sensorhub-core/src/main/resources/config/application.yml @@ -30,6 +30,13 @@ port: 6379 password: ew5T4K3#203lwh config-prefix: 'Casic:' +#代码生成器配置 +code: + generate: + #作者 + author: cz + #待生成对象表名 + table-name: bussiness_field_config,combined_field_config sensorhub: config: port: 7091 diff --git a/sensorhub-support/pom.xml b/sensorhub-support/pom.xml index 9a71296..761601c 100644 --- a/sensorhub-support/pom.xml +++ b/sensorhub-support/pom.xml @@ -42,6 +42,12 @@ ${redis.version} + + com.baomidou + mybatis-plus-generator + ${mybatis-plus-generator.version} + + org.reflections diff --git a/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java b/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java new file mode 100644 index 0000000..515ca53 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java @@ -0,0 +1,14 @@ +package com.casic.missiles.enums; + +/** + * @author + * @date + */ +public interface FixedPropertyEnum { + + String FIXED_POSITION = "fixedPosition"; + + String TOTAL_LENGTH = "totalLength"; + + String TAIL_POSITION = "tailPosition"; +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/CombinedFieldMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CombinedFieldMapper.java new file mode 100644 index 0000000..38e8f42 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CombinedFieldMapper.java @@ -0,0 +1,15 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.CombinedFieldConfig; +import org.apache.ibatis.annotations.Mapper; + +/** + * @author cz + * + */ +@Mapper +public interface CombinedFieldMapper extends BaseMapper { + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java new file mode 100644 index 0000000..128b09d --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java @@ -0,0 +1,10 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.CommandEventConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface CommandEventMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java new file mode 100644 index 0000000..042eb3c --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.DatagramEventConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface DatagramEventConfigMapper extends BaseMapper { +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java new file mode 100644 index 0000000..fc95cf4 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java @@ -0,0 +1,8 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.FieldConfig; + +public interface FieldConfigMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldRuleConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldRuleConfigMapper.java new file mode 100644 index 0000000..b310a08 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldRuleConfigMapper.java @@ -0,0 +1,10 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.FieldRuleConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface FieldRuleConfigMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java new file mode 100644 index 0000000..9060a69 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.ProtocolConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface ProtocolConfigMapper extends BaseMapper { +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolFieldConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolFieldConfigMapper.java new file mode 100644 index 0000000..1b47180 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolFieldConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +public interface ProtocolFieldConfigMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java new file mode 100644 index 0000000..6fa6936 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.RuleConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface RuleConfigMapper extends BaseMapper { +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/AbstractFieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/AbstractFieldConfig.java new file mode 100644 index 0000000..ba9aea2 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/AbstractFieldConfig.java @@ -0,0 +1,38 @@ +package com.casic.missiles.pojo; + +import lombok.Data; + +@Data +public class AbstractFieldConfig { + /** + * 字段名称 + */ + private String fieldName; + /** + * 按照字段评估进行字段解析 + */ + private String ruleJson; + /** + * 起始位置(单位byte) + */ + private Integer OriginPositionByte; + /** + * 起始位置,是否需要bit位置(单位bit)小于8, 没有不需要填写 + */ + private String OriginPositionBit; + /** + * 偏移长度 + */ + private Integer offsetLength; + /** + * 偏移单位(bit/byte) + */ + private String offsetUnit; + /** + * 是否需要转存 + */ + private Integer isStorage; + + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/CombinedFieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/CombinedFieldConfig.java new file mode 100644 index 0000000..4f4de6a --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/CombinedFieldConfig.java @@ -0,0 +1,41 @@ +package com.casic.missiles.pojo; + +import lombok.Data; + +import java.util.Date; + +/** + * 组合配置 + * + * @author cz + * @date 20 + */ +@Data +public class CombinedFieldConfig { + + private Long id; + private Long ruleId; + /** + * 前缀编码 + */ + private String prefixCode; + + /** + * 字段动态的id + */ + private Long dynamicLengthId; + /** + * 对应的要解析字段的ids + */ + private String dataFieldIds; + + /** + * 字段动态的id + */ + private String combinedFieldIds; + + private Date lastTime; + + private Date createTime; + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldConfig.java index a07d20d..8304dc6 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldConfig.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldConfig.java @@ -5,31 +5,28 @@ import java.util.Date; +/** + * @author cz + * 1、该表与实际解析的内容实例解析有关 + * 2、该表字段是随机出现的,和帧结构无关,无法预料的 + * 3、该表字段解析根据FieldEvaluatorConfig进行字段解析 + */ @Data -@TableName("field_config") -public class FieldConfig { +@TableName("business_field_config") +public class FieldConfig extends AbstractFieldConfig { private Long id; -// private String preFieldConfig; - private Long protocolId; - - private String isFixed; - private String uploadDeliveryChange; - - private String replyRule; - private String ruleJson; - + /** + * 协议配置id + */ + private Long ruleId; + /** + * 字段名称 + */ private String fieldName; - private String isStorage; - private Integer orignPosition; - private String exactOrignPosition; - - private Integer offsetLength; - private String offsetUnit; private String ownerId; private Date createTime; private Date lastTime; - } diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldRuleConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldRuleConfig.java new file mode 100644 index 0000000..2e09879 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldRuleConfig.java @@ -0,0 +1,20 @@ +package com.casic.missiles.pojo; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +@TableName("field_rule_config") +@Data +public class FieldRuleConfig { + + private Long id; + private String name; + private String desc; + private String condition; + private String excuteOperation; + private Date lasTime; + private Date createTime; + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/Msg.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/Msg.java deleted file mode 100644 index 81a5324..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/Msg.java +++ /dev/null @@ -1,86 +0,0 @@ -package com.casic.missiles.pojo; - -import lombok.Data; - -/** - * 协议 - */ -@Data -public class Msg { - - /** - * 前导码 - */ - private String preamble; - - /** - * 版本号 - */ - private String version; - - /** - * 内容长度 - */ - private int leng; - - /** - * 设备ID - */ - private String deviceId; - - /** - * 通讯方式 - */ - private Integer connType; - - /** - * 加密方式 - */ - private Integer encryType; - - /** - * 目标地址 - */ - private String destAddr; - - /** - * PDUType - */ - private String PDUType; - - /** - * 操作类型 - */ - private Integer operateType; - - /** - * 传输控制位 PDUType.bit7=0时,表示存在后续的访问;当PDUType.bit7=1时,表示无后续的访问。 - */ - private Integer transControlFlag; - - /** - * 设备类型 - */ - private Integer deviceType; - - /** - * 序号 - */ - private Integer seq; - - /** - * tagList - */ - private String tagList; - - /** - * OidList - */ - private String OidList; - - /** - * CRC - */ - private String CRC; - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/PreRuleConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/PreRuleConfig.java deleted file mode 100644 index bfcf914..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/PreRuleConfig.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.casic.missiles.pojo; - -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -import java.util.Date; - -@Data -@TableName("pre_rule_config") -public class PreRuleConfig { - - private Long id; - private String protocolId; - private String ruleFieldId; - private String ownerId; - private Date createTime; - private Date lastTime; -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolConfig.java index 274ad42..bdac11f 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolConfig.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolConfig.java @@ -5,18 +5,52 @@ import java.util.Date; +/** + * 协议配置表,协议配置与帧结构有关 + * 1、层级关系,协议之后是规则,规则对应设备类型的各种上数规则 + * 2、规则对应协议配置的实例流程 + * 3、每种可根据设备类型和操作类型进行上数规则进行区分 + */ @Data @TableName("protocol_config") public class ProtocolConfig { private Long id; + /** + * 前导码 + */ private String preFix; - private String unpackId; - private String totalLengthId; - private String totalLengthFilterField; + /** + * 拆包id + */ + private Long unpackId; + /** + * 总长度id + */ + private Long totalLengthId; + /** + * + */ + private String totalLengthFilterFields; + /** + * 动态长度ids + */ private String dynamicLengthId; + /** + * 动态长度json(预留字段) + */ private String dynamicLengthJson; - private String tailStr; + /** + * 规则字段所解析预准备的字段 + */ + private String rulePrepareFields; + /** + * 结尾标志 + */ + private Long tailStr; + /** + * 备注 + */ private String remark; private String ownerId; private Date createTime; diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolFieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolFieldConfig.java new file mode 100644 index 0000000..db794bd --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolFieldConfig.java @@ -0,0 +1,43 @@ +package com.casic.missiles.pojo; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +/** + * 协议字段配置表 + * 该表用户存放帧结构固定格式的字段 + * 有以下两个用途 + * (1)、固定格式的字段可用于规则匹配 + * (2)、固定格式的字段可用于报文回复 + * @author cz + * @date 2023-06-09 + */ +@Data +@TableName("protocol_field_config") +public class ProtocolFieldConfig extends AbstractFieldConfig{ + + private Long id; + /** + * 协议配置id + */ + private Long protocolId; + /** + * 上传下发是否有变化, 没有变化,可以直接组装 + */ + private String isReplyFix; + /** + * 按照字段评估进行字段解析 + */ + private Long fieldEvaluatorId; + /** + * 回复规则 + */ + private String replyRule; + + private String ownerId; + private Date createTime; + private Date lastTime; + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java index 3b53493..febf835 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java @@ -6,18 +6,40 @@ import java.util.Date; /** - * 加密字段解析和规则有关,事件调到该流程下面 + * @author cz + * todo: 匹配协议对应业务实例 + * 1、一个协议可以多种的流程规则 + * 2、规则可以支持递归规则流程 */ @Data @TableName("rule_config") public class RuleConfig { - private Long id; private String protocolId; - private String isBizField; - private String parseRuleJson; + /** + * 是否完成规则配置,没有完成, + * 则需要根据规则继续匹配 + */ + private String isFinishMatch; + /** + * 待匹配解析规则 + * {“data_field”:"data_value"} + */ + private String matchRuleJson; + /** + * 待解析字段ids + */ private String dataFieldIds; - private String aviatorFilterJson; + + /** + * 待解析组合字段ids + */ + private String combinedFieldIds; + + /** + * aviator + */ + private String conditionExpression; private Date createTime; private Date lastTime; } diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleDict.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleDict.java deleted file mode 100644 index cc7f389..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleDict.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.casic.missiles.pojo; - -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -@Data -@TableName("rule_dict") -public class RuleDict { - - private Long id; - private Long pid; - private String name; - private String code; - private String ownerId; - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleEvaluator.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleEvaluator.java deleted file mode 100644 index ed16610..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleEvaluator.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.pojo; - -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -import java.util.Date; - -@TableName("rule_evaluator") -@Data -public class RuleEvaluator { - - private Long id; - private String name; - private String desc; - private String condition; - private String excuteOperation; - private Date lasTime; - private Date createTime; - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/CombinedFieldConfigRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/CombinedFieldConfigRegistry.java new file mode 100644 index 0000000..fa59b90 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/CombinedFieldConfigRegistry.java @@ -0,0 +1,12 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.CombinedFieldConfig; + +import java.util.List; + +public interface CombinedFieldConfigRegistry { + + List getCombinedFieldConfigList(Long ruleId); + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/CommandEventRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/CommandEventRegistry.java new file mode 100644 index 0000000..fb97d87 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/CommandEventRegistry.java @@ -0,0 +1,8 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.CommandEventConfig; + +public interface CommandEventRegistry { + + CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName); +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/DatagramEventRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/DatagramEventRegistry.java new file mode 100644 index 0000000..fb34641 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/DatagramEventRegistry.java @@ -0,0 +1,11 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.DatagramEventConfig; + +import java.util.List; + +public interface DatagramEventRegistry{ + + List getDatagramEventList(Long ruleId); + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/FieldConfigRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/FieldConfigRegistry.java new file mode 100644 index 0000000..759642e --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/FieldConfigRegistry.java @@ -0,0 +1,20 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.FieldConfig; + +import java.util.List; + +public interface FieldConfigRegistry { + + + List getFieldConfigList(Long ruleId); + + FieldConfig getFieldConfigById(String fieldId); + + List getFieldConfigs(String protocolId, Integer isFixed); + + List getStorageFieldConfig(String protocolId); + + +} + diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/FieldRuleConfigRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/FieldRuleConfigRegistry.java new file mode 100644 index 0000000..33da70c --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/FieldRuleConfigRegistry.java @@ -0,0 +1,11 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.FieldRuleConfig; + +import java.util.List; + +public interface FieldRuleConfigRegistry { + + List getFieldRuleConfigList(Long ruleId); + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/ProtocolConfigRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/ProtocolConfigRegistry.java new file mode 100644 index 0000000..1725189 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/ProtocolConfigRegistry.java @@ -0,0 +1,12 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.ProtocolConfig; + +import java.util.List; + +public interface ProtocolConfigRegistry { + + List getProtocolConfigList(String firstChar); + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/ProtocolFieldConfigRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/ProtocolFieldConfigRegistry.java new file mode 100644 index 0000000..19d1b9a --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/ProtocolFieldConfigRegistry.java @@ -0,0 +1,14 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.ProtocolFieldConfig; + +import java.util.List; + +public interface ProtocolFieldConfigRegistry { + + + List getProtocolFieldConfigList(Long protocolId); + + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/RuleConfigRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/RuleConfigRegistry.java new file mode 100644 index 0000000..3d2a75c --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/RuleConfigRegistry.java @@ -0,0 +1,14 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.RuleConfig; + +import java.util.List; + +public interface RuleConfigRegistry { + + RuleConfig getNextRuleConfig(String ruleFields); + + + List getRuleConfigById(Long protocolId); + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CombinedFieldConfigRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CombinedFieldConfigRegistryImpl.java new file mode 100644 index 0000000..822cac6 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CombinedFieldConfigRegistryImpl.java @@ -0,0 +1,24 @@ +package com.casic.missiles.registry.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.CombinedFieldMapper; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.registry.CombinedFieldConfigRegistry; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class CombinedFieldConfigRegistryImpl extends ServiceImpl implements CombinedFieldConfigRegistry { + + @Override + public List getCombinedFieldConfigList(Long ruleId) { + QueryWrapper queryWrapper = new QueryWrapper() + .eq("rule_id", ruleId); + List combinedFieldConfigs = this.baseMapper.selectList(queryWrapper); + return combinedFieldConfigs; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java index 608af3a..32cc8a4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java @@ -2,48 +2,47 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.delivery.decorator.ByteDecorator; +import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @AllArgsConstructor public class FieldDecoratorManger { - private final RuleDictDao ruleDictDao; + private final RuleConfigRegistry ruleDictDao; // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 // (1)静态的业务字段是字典里面可以配置的 // (2)动态的业务字段是通过规则生成的 public String contentMerge(String ruleJson, String sceneConent, String dynamicContent) { - List ruleDictList = ruleDictDao.getRuleDictConfig(); - Map ruleDictMap = ruleDictList.stream().collect( - Collectors.toMap(RuleDict::getId, e -> e)); - List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); - for (Map ruleMap : ruleMapList) { - String ruleType = String.valueOf(ruleMap.get("ruleType")); - ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); - NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); - byteDecorator.nodeDecoratorRule(nodeDecoratorParm); - } +// List ruleDictList = ruleDictDao.getRuleDictConfig(); +// Map ruleDictMap = ruleDictList.stream().collect( +// Collectors.toMap(RuleDict::getId, e -> e)); +// List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); +// for (Map ruleMap : ruleMapList) { +// String ruleType = String.valueOf(ruleMap.get("ruleType")); +// ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); +// NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); +// byteDecorator.nodeDecoratorRule(nodeDecoratorParm); +// } return null; } - - private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { - NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() - .contents(sceneConent) - .dynamicContent(dynamicContent) - .ruletypeId(ruletypeId) - .ruleDictMap(ruleDictMap) - .build(); - return nodeDecoratorParm; - } +// +// private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { +// NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() +// .contents(sceneConent) +// .dynamicContent(dynamicContent) +// .ruletypeId(ruletypeId) +// .ruleDictMap(ruleDictMap) +// .build(); +// return nodeDecoratorParm; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java index 652970c..b204ac3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java @@ -1,56 +1,56 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@AllArgsConstructor -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", - JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Component; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Component("logicalDecorator") +//@AllArgsConstructor +//@Slf4j +//public class LogicalShiftDecorator implements ByteDecorator { +// +//// private final FieldRuleEngineMapper fieldRuleEngineMapper; +//// +//// //字节位移 +//// @Override +//// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +//// String logicalValue = ""; +//// RuleEvaluator fieldRuleEngine = new RuleEvaluator(); +//// try { +//// Map env2 = new HashMap(); +//// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +//// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +//// for (String contentId : contentIdList) { +//// RuleDict ruleDict = ruleDictMap.get(contentId); +//// if (ruleDict.getCode().contains("#")) { +//// //使用动态的值 +//// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +//// } +//// env2.put(ruleDict.getName(), ruleDict.getCode()); +//// } +//// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +//// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +//// return null; +//// } +//// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +//// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +//// return values; +//// } catch (Exception ex) { +//// log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", +//// JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +//// return null; +//// } +//// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java index 346468f..822fead 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@AllArgsConstructor -@Slf4j -public class OperationDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("optionDecorator") +//@AllArgsConstructor +//@Slf4j +//public class OperationDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //混合运算,有常量或者乘除的缩放 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java index 50fb0a7..7a8bccb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@AllArgsConstructor -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +////精度计算 +//@AllArgsConstructor +//@Registry("precisionDecorator") +//@Slf4j +//public class PrecisionDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java index da39235..27f9cc7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java @@ -1,54 +1,53 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@AllArgsConstructor -@Slf4j -public class RuleDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("ruleDecorator") +//@AllArgsConstructor +//@Slf4j +//public class RuleDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //吃我一套正则表达式 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (Exception ex) { +// log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java index 7f5cbf3..c043f97 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java @@ -2,6 +2,6 @@ import java.util.Map; -public interface ComandeEventService { +public interface ComandeEventService{ Map loadComandeEventConfig(String protocolId,String scene); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java index 476ad84..aaf1837 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java @@ -2,46 +2,46 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.dao.CommandEventDao; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @Slf4j @AllArgsConstructor -public class ComandeEventServiceImpl implements ComandeEventService { +public class ComandeEventServiceImpl implements ComandeEventRegistry { - private final CommandEventDao commandEventDao; + // private final CommandEventDao commandEventDao; // 加密bean 固定字段出现变化的字段解析,业务字段的有序内容 @Override - public Map loadComandeEventConfig(String protocolId,String sceneName) { - CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); - if (ObjectUtil.isEmpty(commandEventConfig)) { - log.error("协议{},没有配置成功接收回复配置,清排查原因"); - return null; - } - String replyJson = commandEventConfig.getReplyContentJson(); - List> replyMapList = JSONArray.parseObject(replyJson, List.class); - List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); - Map fixMap = fixList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); - List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) - .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) - .collect(Collectors.toList()); - Map commandConfigMap = new HashMap<>(); - commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); - commandConfigMap.put("fixContent", fixMap); - commandConfigMap.put("bizContent", contentList); - return commandConfigMap; + public Map loadComandeEventConfig(String protocolId, String sceneName) { +// CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); +// if (ObjectUtil.isEmpty(commandEventConfig)) { +// log.error("协议{},没有配置成功接收回复配置,清排查原因"); +// return null; +// } +// String replyJson = commandEventConfig.getReplyContentJson(); +// List> replyMapList = JSONArray.parseObject(replyJson, List.class); +// List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); +// Map fixMap = fixList.stream() +// .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); +// List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) +// .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) +// .collect(Collectors.toList()); +// Map commandConfigMap = new HashMap<>(); +// commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); +// commandConfigMap.put("fixContent", fixMap); +// commandConfigMap.put("bizContent", contentList); +// return commandConfigMap; + return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 128b09d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java deleted file mode 100644 index 4016b0b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface DatagramEventMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java deleted file mode 100644 index 597c306..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.apache.ibatis.annotations.Mapper; - -public interface FieldConfigMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java deleted file mode 100644 index a31680a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.PreRuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface PreRuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java deleted file mode 100644 index 9060a69..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface ProtocolConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java deleted file mode 100644 index 6fa6936..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java deleted file mode 100644 index 582a705..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleDict; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleDictMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java deleted file mode 100644 index 6e302c8..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.CommandEventMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Optional; - -@Component -public class CommandEventDao { - - @Resource - private CommandEventMapper commandEventMapper; - - public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId) - .eq("scene", sceneName) - .eq("enabled", 1); - List commandEventConfig = commandEventMapper.selectList(queryWrapper); - Optional optionalEventConfig = commandEventConfig.stream().findFirst(); - return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java deleted file mode 100644 index 9137e4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.FieldConfigMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class FieldConfigDao { - - @Resource - private FieldConfigMapper fieldConfigMapper; - - public FieldConfig getFieldConfigById(String fieldId) { - FieldConfig fieldConfig = fieldConfigMapper.selectById(fieldId); - return fieldConfig; - } - - public List getFieldConfigs(String protocolId,Integer isFixed) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",isFixed); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - - public List getStorageFieldConfig(String protocolId) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",1) - .eq("is_storage",1); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java deleted file mode 100644 index 67bff6b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.mapper.PreRuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class PreRuleConfigDao { - - @Resource - private PreRuleConfigMapper preRuleConfigMapper; - - public List getPreRuleList(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return preRuleConfigMapper.selectList(queryWrapper); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java deleted file mode 100644 index d69ea85..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.RuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleConfigDao { - - @Resource - private RuleConfigMapper ruleConfigMapper; - - public RuleConfig getNextRuleConfig(String ruleFields) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("parse_rule_json", ruleFields); - return ruleConfigMapper.selectOne(queryWrapper); - } - - - public List getRuleConfigById(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return ruleConfigMapper.selectList(queryWrapper); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java deleted file mode 100644 index 932c185..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.RuleDictMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleDictDao { - - @Resource - private RuleDictMapper ruleDictMapper; - - public List getRuleDictConfig() { - List ruleDictList = ruleDictMapper.selectList(null); - return ruleDictList; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java index 9f9e279..43bc4d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java @@ -10,20 +10,15 @@ import io.netty.channel.socket.nio.NioServerSocketChannel; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import javax.annotation.PreDestroy; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static cn.hutool.core.util.ClassUtil.getClasses; /** * SensorhubServer netty服务端 */ @Slf4j -@Service +@Component public class SensorhubServer { /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java index 2c79ff5..9a28c36 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java @@ -11,13 +11,13 @@ import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioSocketChannel; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClient 客户端 */ @Slf4j -@Service +@Registry public final class SensorhubClient { public static void main(String[] args) throws Exception { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java index 9774be0..477c3f7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java @@ -6,12 +6,12 @@ import io.netty.channel.socket.SocketChannel; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientChannelInitialHandler */ -@Service +@Registry public class SensorhubClientChannelInitialHandler extends ChannelInitializer { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java index 346f4b3..73560e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java @@ -5,13 +5,13 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientHandler */ @Slf4j -@Service +@Registry public class SensorhubClientHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java index 5c1c6f2..d990af5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java @@ -4,12 +4,12 @@ import com.casic.missiles.pojo.Msg; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** * SensorhubServerHandler */ -@Service +@Component public class SensorhubServerHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 67283ae..af3172c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,41 +1,37 @@ package com.casic.missiles.parser; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultProtocolConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.*; +import com.casic.missiles.registry.FieldConfigRegistry; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; -import java.nio.charset.Charset; import java.util.HashMap; import java.util.List; import java.util.Map; -@Service("genericProtocolParser") +/** + * @author + */ +@Component("genericProtocolParser") @Slf4j -@AllArgsConstructor +@RequiredArgsConstructor public class GenericProtocolParser implements ProtocolParser { - private final LeadingCodeMatcher leadingCodeMatcher; private final List frameStructDispenserList; - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorInstanceSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; // 匹配首字母前导码=> 帧结构匹配前导码=> // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 @@ -44,18 +40,19 @@ public Boolean doParseProtocol(ByteBuf byteBuf) { String protocolContent = ByteBufUtil.hexDump(byteBuf); //匹配前导码 - List preCodeConfigs = leadingCodeMatcher.matchLeadingCode(protocolContent); + List preCodeConfigs = LeadingCodeMatcher.matchFrameLeadingCode(protocolContent); //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 if (preCodeConfigs.size() == 0) { - return rematch(byteBuf,protocolContent); + return rematch(byteBuf, protocolContent); } - //暂时先取第一个 + //暂时先取第一个,提升速度,使用享元模式, 减少类的创建销毁与构建 ProtocolConfig protocolConfig = preCodeConfigs.get(0); + AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); ByteBuf wholeDatagramByte = null; //通过匹配帧结构获取完整的数据包 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, preCodeConfigs.get(0))) != null) { + if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, protocolFactory)) != null) { break; } } @@ -68,76 +65,78 @@ * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 */ - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId, wholeDatagramByte); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap, protocolId); - //选取规则对应的流程实例 - DatagramEventConfig datagramEventConfig = processorInstanceSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); + //进行规则字段解析,进行匹配规则 + RuleConfig ruleConfig = getRuleConfig(protocolFactory, wholeDatagramByte); + if (ruleConfig == null) { + return false; + } //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, wholeDatagramByte); + ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte); + //以下进行业务的规则解析,同时选定流程实例 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); + DatagramEventProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain, + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText, protocolId); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain); //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); + datagramEventProvider.storeData(bizDataMap); return true; } - private Boolean rematch(ByteBuf byteBuf,String protocolContent) { + /** + * 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 + */ + private Boolean rematch(ByteBuf byteBuf, String protocolContent) { //重置位判断 byteBuf.resetReaderIndex(); //判断重置是否前移,如果没有前移,则直接判为匹配失败 if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { return false; } else { + //递归执行 return doParseProtocol(byteBuf); } } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; + //获取匹配规则->匹配规则 + private RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + //取出其中参与逻辑provider并判空 + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); + String rulePrepareFields = protocolConfig.getRulePrepareFields(); + //固定字段 + if (StringUtils.isNotEmpty(rulePrepareFields)) { + //获取统一固定字段解析 + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + //获取该协议的字段配置,用于协议规则匹配 + List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); + //获取规则 + RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, + rulePrepareFields, protocolFieldConfigs); + return ruleConfig; + } + return null; } - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + //数据构建,获取固定字段的store和业务字段store + private Map buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + Map bizDataMap = new HashMap<>(); + Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); + Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); + bizDataMap.putAll(ruleStoreObjectMap); + bizDataMap.putAll(protocolStoreObjectMap); return bizDataMap; } - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java index 8a46e32..16ce2e5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java @@ -3,6 +3,7 @@ import io.netty.buffer.ByteBuf; public interface ProtocolParser { + Boolean doParseProtocol(ByteBuf byteBuf); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java new file mode 100644 index 0000000..f7814af --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java @@ -0,0 +1,35 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.ProtocolConfigProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.ProtocolConfig; + +/** + * 存放基本协议的的加载信息 + */ +public class AbstractProtocolConfigFactory { + private final ProtocolConfigProvider protocolConfigProvider; + private final ProtocolFieldConfigProvider protocolFieldConfigProvider; + private final RuleConfigProvider ruleConfigProvider; + + public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { + this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); + this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); + this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); + } + + public ProtocolConfigProvider getProtocolConfigProvider() { + return protocolConfigProvider; + } + + public ProtocolFieldConfigProvider getProtocolFieldConfigProvider() { + return protocolFieldConfigProvider; + } + + public RuleConfigProvider getRuleConfigProvider() { + return ruleConfigProvider; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java new file mode 100644 index 0000000..6e36147 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java @@ -0,0 +1,57 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.CombinedFieldConfigProvider; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.FieldConfigProvider; +import com.casic.missiles.parser.provider.FieldRuleConfigProvider; + +/** + * 存放规则相关的的的加载信息 + */ +public class AbstractRuleConfigFactory { + + /** + * 处理字节 + */ + private final FieldConfigProvider fieldConfigProvider; + /** + * 处理组合字节解析的解码器 + */ + private final CombinedFieldConfigProvider combinedFieldConfigProvider; + /** + * 处理负责字节解析的规则配置 + */ + private final FieldRuleConfigProvider fieldRuleConfigProvider; + /** + * 处理实例流程 + */ + private final DatagramEventProvider datagramEventProvider; + + + public AbstractRuleConfigFactory(Long ruleId) { + this.fieldConfigProvider = new FieldConfigProvider(ruleId); + this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); + this.fieldRuleConfigProvider = new FieldRuleConfigProvider(ruleId); + this.datagramEventProvider = new DatagramEventProvider(ruleId); + } + + public FieldConfigProvider getFieldConfigProvider() { + return fieldConfigProvider; + } + + public CombinedFieldConfigProvider getCombinedFieldConfigProvider() { + return combinedFieldConfigProvider; + } + + public FieldRuleConfigProvider getFieldRuleConfigProvider() { + return fieldRuleConfigProvider; + } + + public DatagramEventProvider getDatagramEventProvider() { + return datagramEventProvider; + } + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java deleted file mode 100644 index 6e1719a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.factory; - - -import com.casic.missiles.pojo.ProtocolConfig; - -import java.util.List; - -/** - * 数据库访问优化(暂时未做) - *

- * 1、初始化协议解析配置,并存放到处存放缓存,对协议基本配置进行管理 - * 2、其中流程中所有的配置都经过此类进行管理,进行调用获取,增强解析速度 - */ -public interface DatagramFactory { - - /** - * 初始化 - */ - List datagramInit(); - - /** - * 根据前导码配置匹配,模糊匹配获取所有的报文项 - */ - List match(); - - /** - * 根据前导码匹配,返回报文项 - */ - List filer(); - - /** - * 保证数据的唯一性选择器 - */ - List selectOne(); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java new file mode 100644 index 0000000..87444a0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java @@ -0,0 +1,18 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +import java.util.List; + +/** + * 直接用,还是边用边创建 + */ +public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { + + + public DefaultProtocolConfigFactory(ProtocolConfig protocolConfig) { + super(protocolConfig); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java new file mode 100644 index 0000000..cce0c7c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java @@ -0,0 +1,12 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; + +public class DefaultRuleFactory extends AbstractRuleConfigFactory { + + public DefaultRuleFactory(Long ruleId) { + super(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java deleted file mode 100644 index 9ee97e0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.casic.missiles.parser.instance; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service -@Slf4j -@AllArgsConstructor -public class GeneralProcessor { - - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; - - /** - * 统一固定字段解析=>进行规则的查询的判断 - * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 - * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 - */ - @Deprecated - public boolean parseWholeDatagram(ByteBuf buffer, ProtocolConfig protocolConfig) { - try { - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap,protocolId); - //选取规则对应的流程= - DatagramEventConfig datagramEventConfig = processorSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); - //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); - //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); - //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); - //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); - //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); - return true; - } catch (Exception ex) { - log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", - ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); - return false; - } - } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; - } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); - } - - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); - return bizDataMap; - } - - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java index 25e7ad8..6a5777e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java @@ -1,23 +1,31 @@ package com.casic.missiles.parser.instance.impl; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.mapper.DatagramEventMapper; import com.casic.missiles.pojo.DatagramEventConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.SpringContextUtil; -@Service -@AllArgsConstructor +import java.util.List; +import java.util.Optional; + +/** + * @author cz + * + */ public class DefaultProcessorInstanceSelector implements ProcessorInstanceSelector { - private final DatagramEventMapper datagramEventMapper; + private static List datagramEventConfigs; + + static { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + datagramEventConfigs = datagramEventRegistry.getDatagramEventList(); + } @Override public DatagramEventConfig getProcessorInstance(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("rule_id", protocolId); - return datagramEventMapper.selectOne(queryWrapper); + Optional optionalSelectInstance = datagramEventConfigs.stream() + .filter(e -> e.getId().equals(protocolId)).limit(1).findFirst(); + return optionalSelectInstance.isPresent() ? optionalSelectInstance.get() : null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a778671..7b56a43 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,16 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import io.netty.buffer.ByteBuf; /** - * 分析匹配情况 - * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 - * 2、匹配不成功,有后续帧,可以进行下次匹配。 - * 3、匹配不成功,无后续帧,可以进行丢弃。 + * 分析匹配情况 + * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 + * 2、匹配不成功,有后续帧,可以进行下次匹配。 + * 3、匹配不成功,无后续帧,可以进行丢弃。 */ -public interface FrameStructMatcher{ +public interface FrameStructMatcher { - ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig); + ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 05320ab..8ebea78 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,23 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.ProtocolConfigMapper; +import com.casic.missiles.parser.provider.ProtocolConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Component; import java.util.List; import java.util.stream.Collectors; -@Component -@AllArgsConstructor public class LeadingCodeMatcher { - private final ProtocolConfigMapper protocolMapper; - //** 1、首字母匹配前导码, // 2、以匹配出的前导码是否在报文中条件进行前导码的匹配二次筛选 - public List matchLeadingCode(String protocolContent){ + public static List matchFrameLeadingCode(String protocolContent){ List initialConfigs = initialMatch(protocolContent); List preCodeConfigs = initialConfigs.stream() .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) @@ -26,13 +19,16 @@ } //初始化匹配前导码内容 - private List initialMatch(String protocolContent) { - String protocolStr = protocolContent.charAt(0) + ""; - QueryWrapper queryWrapper = new QueryWrapper() - .likeRight("pre_fix", protocolStr); - List protocolConfigList = protocolMapper.selectList(queryWrapper); - return protocolConfigList; + private static List initialMatch(String protocolContent) { + String firstFrameChar = protocolContent.charAt(0) + ""; + ProtocolConfigProvider protocolConfigProvider=new ProtocolConfigProvider(firstFrameChar); + return protocolConfigProvider.getMatchList(); } + + + + + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index cf2113d..e915877 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -1,32 +1,35 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(0) -@Service +@Component public class FrameLengthMatcher implements FrameStructMatcher { - @Autowired - private FieldParser fieldParser; - //超过长度 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { String dataGramContent = ByteBufUtil.hexDump(byteBuf); - if (StringUtils.isEmpty(protocolConfig.getUnpackId()) && StringUtils.isEmpty(protocolConfig.getTailStr())) { - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + //当不存在结尾标志和拆包标志,可以直接使用长度进行匹配 + if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { if (dataGramContent.length() >= totalLength) {//等于长度返回true,超出长度,切断 - ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, protocolConfig, totalLength); + ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, totalLength); return wholeDatagramByte; } else { //读的标志位前移舍弃 @@ -38,7 +41,7 @@ return null; } - private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, Integer totalLength) { byteBuf.readBytes(totalLength); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, totalLength - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 2bfc213..d527ad0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; @@ -13,7 +13,7 @@ import lombok.AllArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.nio.charset.Charset; import java.util.Map; @@ -22,32 +22,30 @@ * 后续标志验证 */ @Order(1) -@Service +@Component @AllArgsConstructor -public class FrameMarkMatcher implements FrameStructMatcher { - - private final FieldConfigDao fieldConfigDao; - private final FieldParser fieldParser; - private final FieldResolver fieldResolverManger; +public class FrameMarkMatcher implements FrameStructMatcher, FixedPropertyEnum { //帧后续标志=>结束,进行帧的重组=>有后续,1、帧移位判别 2、继续接收帧 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig UnpackConfig = StringUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getUnpackId()); - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); - Integer upback = 0; + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); ByteBuf mergeWholeFrameByte = null; - if (!ObjectUtil.isEmpty(UnpackConfig)) { - while (hasNextFullFrame(byteBuf, protocolConfig)) { - upback = (Integer) fieldResolverManger.filedParserManger(byteBuf, UnpackConfig, null); + if (!ObjectUtil.isEmpty(unpackFlag)) { + while (hasNextFullFrame(byteBuf, protocolConfig, protocolFieldConfigProvider)) { //是否存在后续位 - if (upback == 1) {//使用esayRule + if (unpackFlag == 1) {//使用esayRule //表示可以截取 - mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolConfig, totalLength); + mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolFieldConfigProvider, protocolConfig); return mergeWholeFrameByte; } else { - byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig)); + byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig, protocolFieldConfigProvider)); } } } @@ -56,7 +54,8 @@ //选取第一个帧,将业务内容和后面部分分开 //计算数据报文-业务内容 - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolFieldConfigProvider protocolFieldConfigProvider, ProtocolConfig protocolConfig) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); //截取完整报文 byteBuf.readBytes(totalLength); ByteBuf byteBufContent = byteBuf.slice(0, byteBuf.readerIndex()); @@ -68,15 +67,15 @@ String tail = ""; System.out.println(ByteBufUtil.hexDump(byteBufContent)); //会存在多个帧拼接在一起的的情况,进行合并处理 - while (hasNextFullFrame(byteBufContent, protocolConfig)) { - Integer currentFrameLength = fieldParser.getTotalLength(protocolConfig, byteBufContent); + while (hasNextFullFrame(byteBufContent, protocolConfig, protocolFieldConfigProvider)) { + Integer currentFrameLength = protocolFieldConfigProvider.getTotalLength(byteBufContent, protocolConfig); byteBufContent.readBytes(currentFrameLength); ByteBuf currentbyteBuf = byteBufContent.slice(0, byteBufContent.readerIndex()); byteBufContent.markReaderIndex();//读的标志位前移 System.out.println(ByteBufUtil.hexDump(byteBufContent)); String hexDump = currentbyteBuf.toString(Charset.forName("ISO-8859-1")); //获取当前固定帧结构的关系map - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, currentbyteBuf); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(currentbyteBuf, protocolConfig); if (StringUtils.isEmpty(mergeFrameStr)) { //首次获取业务数据报文 mergeFrameStr += hexDump.substring(0, currentFrameFixedProperty.get("tailPosition")); @@ -95,22 +94,22 @@ /** * 获取平移到下一帧起始位置 */ - public int getNextFrameOffset(ByteBuf buffer, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, buffer); - return currentFrameFixedProperty.get("totalLength"); + public int getNextFrameOffset(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + return currentFrameFixedProperty.get(TOTAL_LENGTH); } /** * 判断是否出错进行整个帧的 */ - public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, byteBuf); + public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); //保证读取位置不在固定位置,是可变的业务内容 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("fixedPosition")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(FIXED_POSITION)) { return false; } //判断读取是否操作帧长度 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("totalLength")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(TOTAL_LENGTH)) { return false; } return true; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 76a3784..c3a1bab 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -1,50 +1,50 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.parser.instance.GeneralProcessor; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; +import io.netty.buffer.ByteBufUtil;; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(2) -@Service +@Component public class FrameTailMatcher implements FrameStructMatcher { - @Resource - private FieldConfigDao fieldConfigDao; - @Autowired - private GeneralProcessor generalProcessor; - //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig tailFieldConfig = StringUtils.isEmpty(protocolConfig.getTailStr()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getTailStr()); - if (!ObjectUtil.isEmpty(tailFieldConfig)) { - String tailStr = tailFieldConfig.getFieldName(); + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfig protocolFieldConfig = ObjectUtils.isEmpty(protocolConfig.getTailStr()) ? null : + fieldConfigProvider.getFieldConfigById(protocolConfig.getTailStr()); + if (!ObjectUtil.isEmpty(protocolFieldConfig)) { + String tailStr = protocolFieldConfig.getFieldName(); String dataGramContent = ByteBufUtil.hexDump(byteBuf); Boolean tailFlag = ByteBufUtil.hexDump(byteBuf).contains(tailStr); if (!tailFlag) { //使用esayRule return null; } else if (dataGramContent.indexOf(tailStr) < dataGramContent.length() - tailStr.length()) { Integer length = dataGramContent.indexOf(tailStr) + tailStr.length(); - ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, protocolConfig, length); + ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, length); return wholeDatagramByte; //存在粘包 } } return null; } - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer length) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, Integer length) { byteBuf.readBytes(length); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, length - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java new file mode 100644 index 0000000..5f1c177 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java @@ -0,0 +1,73 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.combined.GenericCombinedFieldResolver; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.CombinedFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class CombinedFieldConfigProvider { + + + /** + * 作为临时配置列表缓存使用 + */ + private final List combinedFieldConfigList; + private Map storeObjectMap = new HashMap<>(); + + public CombinedFieldConfigProvider(Long ruleId) { + CombinedFieldConfigRegistry combinedFieldConfigRegistry = SpringContextUtil.getBean(CombinedFieldConfigRegistry.class); + combinedFieldConfigList = combinedFieldConfigRegistry.getCombinedFieldConfigList(ruleId); + } + + public void parseDataField(RuleConfig ruleConfig, String clearZeroPlain,Map fieldConfigsMap ) { + if (showSkip()) { + return; + } + //匹配对应的数据,然后进行相关的字段解析 + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver(); + combinedFieldResolver.parseDataField(combinedFieldConfigList, byteBuf, storeObjectMap,fieldConfigsMap); + } + + + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getCombinedFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return combinedFieldConfigList.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public List getCombinedFieldConfigList() { + return combinedFieldConfigList; + } + + /* 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(combinedFieldConfigList) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java new file mode 100644 index 0000000..f3cfedc --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java @@ -0,0 +1,11 @@ +package com.casic.missiles.parser.provider; + +/** + * @author cz + * @date 2023-6-12 + */ +public class CommandEventProvider{ + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java new file mode 100644 index 0000000..70eec5e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java @@ -0,0 +1,77 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.safe.SafeStrategy; +import com.casic.missiles.parser.sender.DataSubscribeProvider; +import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class DatagramEventProvider { + + private final DatagramEventConfig processorInstance; + + public DatagramEventProvider(Long ruleId) { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + List datagramEventConfigList = + datagramEventRegistry.getDatagramEventList(ruleId); + processorInstance = this.getProcessorInstance(datagramEventConfigList); + } + + public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { + if (showSkip()) { + return null; + } + return datagramEventConfigList.get(0); + } + + // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 + public String getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap) { + String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? + processorInstance.getSafeBean() : + fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); + if (!StringUtils.isEmpty(safeName)) { + //需要加密 + SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); + String plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); + return clearComplementZero(plain); + } + return ByteBufUtil.hexDump(bizDataContent); + } + + //解密清零操作 + private String clearComplementZero(String plain) { + plain = plain.substring(0, plain.lastIndexOf("00")); + return plain; + } + + //数据发送,数据发送者暂未构建 + public void storeData(Map bizDataMap) { + DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); +// dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return ObjectUtils.isNotEmpty(processorInstance) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java new file mode 100644 index 0000000..7e1fe0a --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java @@ -0,0 +1,97 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.FieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class FieldConfigProvider { + + + private final List fieldConfigs; + private Map storeObjectMap = new HashMap<>(); +// private Map singleObjects = new ConcurrentHashMap<>(); + + public FieldConfigProvider(Long ruleId) { + FieldConfigRegistry fieldConfigRegistry = SpringContextUtil.getBean(FieldConfigRegistry.class); + fieldConfigs = fieldConfigRegistry.getFieldConfigList(ruleId); + } + + public List getFieldConfigs() { + return fieldConfigs; + } + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public Map parseDataField(RuleConfig ruleConfig, String clearZeroPlain) { + if (showSkip()) { + return null; + } + List prepareFieldConfig = prepareParseField(ruleConfig); + if (CollectionUtils.isNotEmpty(prepareFieldConfig)) { + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(fieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + return fixDataMap; + } + } + return null; + } + + /** + * 得到需要处理的业务内容 + * + * @return + */ + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return fieldConfigs.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public Map getFieldConfigsMap() { + return fieldConfigs.stream().collect( + Collectors.toMap(FieldConfig::getId, e -> e) + ); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(fieldConfigs) ? false : true; + } + + +} + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java new file mode 100644 index 0000000..817bfaf --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java @@ -0,0 +1,19 @@ +package com.casic.missiles.parser.provider; + +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.registry.FieldRuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; + +public class FieldRuleConfigProvider { + + private final List fieldRuleConfigList; + + public FieldRuleConfigProvider(Long ruleId) { + FieldRuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(FieldRuleConfigRegistry.class); + fieldRuleConfigList = ruleConfigRegistry.getFieldRuleConfigList(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java new file mode 100644 index 0000000..99a1b06 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java @@ -0,0 +1,53 @@ +package com.casic.missiles.parser.provider; + + +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.registry.ProtocolConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolConfigProvider { + + private final List protocolConfigList; + + public ProtocolConfigProvider(String firstChar) { + ProtocolConfigRegistry registry = SpringContextUtil.getBean(ProtocolConfigRegistry.class); + protocolConfigList = registry.getProtocolConfigList(firstChar); + } + + public List getMatchList() { + return protocolConfigList; + } + + /** + * 设置当前协议 + * + * @param protocolConfig + */ + public ProtocolConfigProvider(ProtocolConfig protocolConfig) { + List protocolConfigs = new ArrayList<>(); + protocolConfigs.add(protocolConfig); + protocolConfigList = protocolConfigs; + } + + /** + * 获取当前协议 + * + * @return + */ + public ProtocolConfig getCurrentProtocolConfig() { + if (this.protocolConfigList == null) { + return null; + } else { + return protocolConfigList.get(0); + } + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java new file mode 100644 index 0000000..043927d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java @@ -0,0 +1,213 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.registry.ProtocolFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolFieldConfigProvider { + + private static final String FIXED_FIELD_DS = "fixedFieldDs"; + private static final String CONTENT_FIELD_DS = "contentFieldDs"; + private static final String PROTOCOL_LENGTH = "protocolLength"; + private static final String PROTOCOL_FIELD_ID = "protocolFieldId"; + private static final String PROTOCOL_POSITION = "protocolPosition"; + + private final List protocolFieldConfigs; + private Map singleObjects = new ConcurrentHashMap<>(); + private Map storeObjectMap = new HashMap<>(); + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public ProtocolFieldConfigProvider(Long protocolId) { + ProtocolFieldConfigRegistry protocolFieldConfigRegistry = SpringContextUtil.getBean(ProtocolFieldConfigRegistry.class); + protocolFieldConfigs = protocolFieldConfigRegistry.getProtocolFieldConfigList(protocolId); + } + + public List getProtocolFieldConfigs() { + return protocolFieldConfigs; + } + + public ProtocolFieldConfig getFieldConfigById(Long fieldId) { + Optional optionalConfig = protocolFieldConfigs.stream().filter( + e -> e.getId().equals(fieldId) + ).findFirst(); + return optionalConfig.isPresent() ? optionalConfig.get() : null; + } + + public Integer getProtocolFieldValue(Long protocolFieldId, ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_FIELD_ID + protocolFieldId + ByteBufUtil.hexDump(byteBuf); + //获取缓存 + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + //加载固定长度数据集合 + Map fixDataMap = this.getProtocolDataMap(byteBuf); + ProtocolFieldConfig protocolFieldConfig = selectFieldConfig(protocolFieldId); + Integer protocolFieldValue = 0; + //获取约定字段的总长度 + if (fixDataMap.containsKey(protocolFieldConfig.getFieldName())) { + Object appointUnpackObject = fixDataMap.get(protocolFieldConfig.getFieldName()); + if (ObjectUtils.isNotEmpty(appointUnpackObject)) { + protocolFieldValue = (Integer) appointUnpackObject; + } + } + if (protocolFieldValue != null) { + //加入缓存 + if (ObjectUtils.isNotEmpty(protocolFieldValue)) { + this.singleObjects.put(catchKey, protocolFieldValue); + return protocolFieldValue; + } + } + return null; + } + + /** + * 获取帧固定位置信息 + * + * @param byteBuf + * @param protocolConfig + * @return + */ + public Map getFixedProperty(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_POSITION + protocolConfig.getId(); + if (this.singleObjects.containsKey(catchKey)) { + return (Map) singleObjects.get(catchKey); + } + Map fixedPropertyMap = new HashMap<>(); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + fixedPropertyMap = fieldParser.doGetFixedProperty(protocolFieldConfigs, this.getTotalLength(byteBuf,protocolConfig)); + if (CollectionUtils.isNotEmpty(fixedPropertyMap)) { + this.singleObjects.put(catchKey, fixedPropertyMap); + return fixedPropertyMap; + } + return fixedPropertyMap; + } + + /** + * 获取帧结构应有的总长度 + */ + public Integer getTotalLength(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_LENGTH + ByteBufUtil.hexDump(byteBuf); + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + Integer appointFrameLength = getProtocolFieldValue(protocolConfig.getTotalLengthId(), byteBuf); + if (appointFrameLength != null) { + //获取过滤的字段集合总长度 + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Integer totalFilterLength = fieldParser.getTotalFilterLength(protocolConfig, byteBuf, getFixFieldConfigMap()); + //计算总长度 + Integer totalLength = appointFrameLength + totalFilterLength; + //加入缓存 + if (ObjectUtils.isNotEmpty(totalLength)) { + this.singleObjects.put(catchKey, totalLength); + return totalLength; + } + } + return null; + } + + /** + * 获取协议有关字段解析内容 + * storeObjectMap存储代转存的数据 + * + * @return + */ + public Map getProtocolDataMap(ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(FIXED_FIELD_DS)) { + return (Map) singleObjects.get(FIXED_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(protocolFieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + this.singleObjects.put(FIXED_FIELD_DS, fixDataMap); + return fixDataMap; + } + return null; + } + + /** + * 获取业务报文内容的content字节 + * + * @param wholeDatagramByte + * @return + */ + public ByteBuf getDataContentBuf(ByteBuf wholeDatagramByte) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(CONTENT_FIELD_DS)) { + return (ByteBuf) singleObjects.get(CONTENT_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + ByteBuf bizDataByteBuf = fieldParser.getDataContentBuf(protocolFieldConfigs, wholeDatagramByte); + if (bizDataByteBuf != null) { + this.singleObjects.put(CONTENT_FIELD_DS, bizDataByteBuf); + return bizDataByteBuf; + } + return null; + } + + + private ProtocolFieldConfig selectFieldConfig(Long id) { + Optional optionalProtocolFieldConfig = this.protocolFieldConfigs.stream().filter( + e -> e.getId().equals(id) + ).findFirst(); + return optionalProtocolFieldConfig.isPresent() ? optionalProtocolFieldConfig.get() : null; + } + + + private Map getFixFieldConfigMap() { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, e -> e) + ); + return fixDataFieldMap; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(protocolFieldConfigs) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java new file mode 100644 index 0000000..dafba1c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java @@ -0,0 +1,56 @@ +package com.casic.missiles.parser.provider; + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.rule.GenericRuleResolver; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.RuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleConfigProvider { + + private final List ruleConfigs; + + public List getRuleConfigs() { + return ruleConfigs; + } + + public RuleConfigProvider(Long protocolId) { + RuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(RuleConfigRegistry.class); + ruleConfigs = ruleConfigRegistry.getRuleConfigById(protocolId); + } + + /** + * 获取规则匹配结果 + * + * @param parseFixedDataMap + * @param protocolFieldConfigs + * @return + */ + public RuleConfig doGetRule(Map parseFixedDataMap, + String ids, + List protocolFieldConfigs) { + if (showSkip()) { + return null; + } + RuleConfig ruleConfig = GenericRuleResolver.machRule(parseFixedDataMap, ids, protocolFieldConfigs, ruleConfigs); + return ruleConfig; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(ruleConfigs) ? false : true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java index 3c05891..856b399 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java @@ -1,18 +1,11 @@ package com.casic.missiles.parser.resolver; -import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.springframework.web.bind.annotation.RequestBody; -import javax.annotation.Resource; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -20,19 +13,17 @@ @Slf4j public class ByteMergeProvider { - @Resource - private FieldRuleEngineMapper fieldRuleEngineMapper; - //拿到所有的值合并到一个值 - public String resolveByteMerge(List valueList, String ruletypeId, String vaildRange) { + public static String resolveByteMerge(List valueList, String ruleTypeId, String vaildRange) { String values = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Map vaildMap = getValidRangeMap(vaildRange); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(ruletypeId); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } + //暂时不处理 +// fieldRuleEngine = fieldRuleConfigMapper.selectById(ruleTypeId); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } Map env2 = new HashMap(); for (int i = 0; i < valueList.size(); i++) { if (vaildMap.containsKey(i)) { @@ -47,7 +38,7 @@ } } - private Map getValidRangeMap(String vaildRange) { + private static Map getValidRangeMap(String vaildRange) { String[] range = vaildRange.split(","); Map vaildMap = new HashMap(); for (int i = 0; i < range.length; i++) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 8d821cd..85d6bbf 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -1,9 +1,12 @@ package com.casic.missiles.parser.resolver; +import com.casic.missiles.pojo.AbstractFieldConfig; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; import io.netty.buffer.ByteBuf; +import java.util.List; import java.util.Map; /** @@ -11,18 +14,14 @@ */ public interface FieldParser { -// Map fieldProcess(String protocolContent,); - Map dataParser(RuleConfig ruleConfig, String lightText,String protocolId); + Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength); - Map fixDataParser(String protocolId, ByteBuf buffer); + Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap); - Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf); + ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer); - ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer); - - ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer); - - Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer); + Integer getTotalFilterLength(ProtocolConfig protocolConfig, ByteBuf byteBuf, Map protocolFieldConfigMap); } + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java new file mode 100644 index 0000000..9e0c00e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java @@ -0,0 +1,52 @@ +package com.casic.missiles.parser.resolver; + +import com.casic.missiles.pojo.AbstractFieldConfig; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.util.List; + +public class FieldParserSupport { + + //分别计算bit和byte长度=> 合并长度 + protected Integer calculateLength(List fieldConfigList) { + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + Integer fixedLength = bytefixedLength + bitfixedLength / 8; + return fixedLength; + } + + //找到最大值=> 根据最大值计算业务数据下标 + protected Integer calculatePosition(List fieldConfigList) { + String rex = "[0-9]+"; + Integer max = -1; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) + && Integer.valueOf(fieldConfig.getOriginPositionByte()) > max) { + max = Integer.valueOf(fieldConfig.getOriginPositionByte()); + } + } + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) && fieldConfig.getOriginPositionByte().equals(max)) { + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + } + } + Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; + return maxFixedPosition; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java deleted file mode 100644 index dd3a6cd..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java +++ /dev/null @@ -1,170 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.ByteResolverParam; -import io.netty.buffer.ByteBuf; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -/** - * 字段解析管理总类 - */ -@Service -@Slf4j -@AllArgsConstructor -public class FieldResolver extends ByteMergeProvider { - - //1、字段截取 => 2、简单的字节解析和复杂的字节解析 - public Object filedParserManger(ByteBuf byteBuf, FieldConfig fieldConfig, Integer maxFixedPosition) { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - //最大固定位置不为空, - if (!ObjectUtil.isEmpty(maxFixedPosition)) { - orignPosition -= maxFixedPosition; - } - Object fieldValue = 0; - //待优化 - if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { - fieldValue = bitToResolver(byteBuf, fieldConfig); - } else { - ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); - fieldValue = parsingFields(fieldBytes, fieldConfig.getRuleJson()); - } - return fieldValue; - } - - //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, - //目前默认配置的规则设置暂不支持配置化,由实现完成 - private Object parsingFields(ByteBuf byteBuf, String ruleJson) { - Object fieldsResolveValue = null; - List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); - if (ObjectUtil.isEmpty(ruleMapList)) { - fieldsResolveValue = defaultResolveBuilder(byteBuf); - } else { - fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); - } - return fieldsResolveValue; - } - - private Object defaultResolveBuilder(ByteBuf byteBuf) { - Integer defaultResolveValue = 0; - for (int i = 0; i < byteBuf.writerIndex(); i++) { - defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; - } - return defaultResolveValue; - } - - //字段解析构建器(针对字节单位的) - //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 - // 字节归并结束或者规则结束=>继续根据规则进行判断 - private Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { - Object customizeResolveValue = null; - try { - List bytStrList = new ArrayList<>(); - //存放到数组里面 - for (int i = 0; i < byteBuf.writerIndex(); i++) { - bytStrList.add(byteBuf.readByte()); - } - int i = 0; - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - customizeResolveValue = this.resolveByteMerge(bytStrList, ruletypeId,vaildRange); - break; - } else { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - List tempBytStr = new ArrayList<>(); - for (int k = 0; i < bytStrList.size(); i++) { - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(k) - .value(bytStrList.get(k)) - .ruletypeId(ruletypeId).build(); - tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); - } - bytStrList = tempBytStr; - } - i++; - } - //字节归并到一起=>继续根据规则进行判断 - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(customizeResolveValue) - .ruletypeId(ruletypeId).build(); - customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(customizeResolveValue)); - return customizeResolveValue; - } catch (RuntimeException ex) { - log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); - return null; - } - } - - /** - * 1、单个字节情况表示字段 - * 2、多字节情况表示字段(暂未处理) - */ - private Object bitToResolver(ByteBuf byteBuf, FieldConfig fieldConfig) { - Object fieldValue = new Object(); - try { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - byte fields = 0x00; - if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); - } else { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); - } - - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { - if (!StringUtils.isEmpty(fieldConfig.getExactOrignPosition())) { - fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getExactOrignPosition())).byteValue() - >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); - } else { - fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); - } - } else { - fieldValue = Integer.valueOf(fields & 0xff); - } - if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { - return fieldValue; - } - List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); - int i = 0; - //字节归并到一起=>继续根据规则进行判断 - while (i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(fieldValue) - .ruletypeId(ruletypeId).build(); - fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(fieldValue)); - return fieldValue; - } catch (RuntimeException ex) { - log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); - return null; - } - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java new file mode 100644 index 0000000..1d2aeab --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java @@ -0,0 +1,36 @@ +package com.casic.missiles.parser.resolver.bytes; + +import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.mapper.FieldRuleConfigMapper; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.pojo.ByteResolverParam; +import com.googlecode.aviator.AviatorEvaluator; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; +//转换规则 +@Component("convert") +@AllArgsConstructor +@Slf4j +public class ByteRuleResolver implements ByteResolver { + + private final FieldRuleConfigMapper fieldRuleConfigMapper; + + @Override + public Object resolveOperationRule(ByteResolverParam byteResolverParam){ + FieldRuleConfig fieldRuleEngine=fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); + if(ObjectUtil.isEmpty(fieldRuleEngine)){ + return byteResolverParam.getValue(); + } + String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); + Map env2 = new HashMap(); + env2.put("value", (byte) byteResolverParam.getValue()); + String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); + return values; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java index 103821c..786b71c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java @@ -2,34 +2,34 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("logicalShift") +@Component("logicalShift") @AllArgsConstructor @Slf4j public class LogicalShiftResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //字节位移 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { Integer index = byteResolverParam.getIndex(); - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return byteResolverParam.getValue(); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java index 476747d..01149bd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("operation") +@Component("operation") @AllArgsConstructor @Slf4j public class OperationResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //混合运算,有常量或者乘除的缩放 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java index 0b82cf4..79abcce 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.casic.missiles.pojo.ByteResolverParam; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; //精度计算 -@Service("precision") +@Component("precision") @AllArgsConstructor @Slf4j public class PrecisionResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java deleted file mode 100644 index 5c3f332..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; -//转换规则 -@Service("convert") -@AllArgsConstructor -@Slf4j -public class RuleResolver implements ByteResolver { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam){ - RuleEvaluator fieldRuleEngine=fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); - if(ObjectUtil.isEmpty(fieldRuleEngine)){ - return byteResolverParam.getValue(); - } - String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); - Map env2 = new HashMap(); - env2.put("value", (byte) byteResolverParam.getValue()); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java new file mode 100644 index 0000000..d3bbd91 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java @@ -0,0 +1,15 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; + +import java.util.List; +import java.util.Map; +// 前导码匹配->长度字段 +public interface AbstractCombinedFieldProcessor { + + Map invoke(Map map, ByteBuf byteBuf, List combinedFieldConfigList, + Map fieldConfigsMap, Map storeObjectMap); + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java new file mode 100644 index 0000000..03c8480 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java @@ -0,0 +1,59 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-13 + */ +//依次递增进行数据的解析, +public class GenericCombinedFieldResolver { + + + //通过查询,字段长度长度随机 + public void parseDataField(List combinedFieldConfigList, ByteBuf byteBuf, + Map storeObjectMap, Map fieldConfigsMap) { + Integer frameLength = Integer.valueOf(ByteBufUtil.hexDump(byteBuf)); + //添加前置处理器 + com.casic.missiles.util.ClassUtil classUtil = new com.casic.missiles.util.ClassUtil(); + List abstractCombinedProcessors = classUtil.getSubClassList(AbstractCombinedFieldProcessor.class); + + Map fieldFixedMap = combinedFieldLeadCodeMap(combinedFieldConfigList); + //frameLength + Map combinedProcessorFields = null; + while (byteBuf.readableBytes() < frameLength) { + //一直处理 + for (AbstractCombinedFieldProcessor abstractCombinedProcessor : abstractCombinedProcessors) { + combinedProcessorFields = abstractCombinedProcessor.invoke(combinedProcessorFields, byteBuf, + combinedFieldConfigList, + fieldConfigsMap, storeObjectMap); + if (combinedProcessorFields == null || byteBuf.readableBytes() < frameLength) { + return; + } + } + + } + } + + /** + * 取出前导码匹配集合 + */ + private Map combinedFieldLeadCodeMap(List combinedFieldConfigList) { + Map fieldFixedMap = combinedFieldConfigList + .stream() + .collect(Collectors.toMap(CombinedFieldConfig::getPrefixCode, e -> e)); + return fieldFixedMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java new file mode 100644 index 0000000..643a934 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java @@ -0,0 +1,100 @@ +package com.casic.missiles.parser.resolver.fields; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.FieldParserSupport; +import com.casic.missiles.pojo.*; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 保存使用时最基本的信息,并且使用原型模式 + */ +@Slf4j +public class DefaultProtocolFieldParser extends FieldParserSupport implements FieldParser, FixedPropertyEnum { + + //通过传入的配置和报文进行字段解析 + @Override + public Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap) { + Map dataMap = new HashMap<>(); + for (AbstractFieldConfig protocolFieldConfig : protocolFieldConfigs) { + if (!ObjectUtils.isEmpty(protocolFieldConfig.getOriginPositionByte())) { + Object fieldValue = FieldResolver.parseField(buffer, protocolFieldConfig, null); + if (protocolFieldConfig.getIsStorage() == 1) { + storeObjectMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + dataMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + } + return dataMap; + } + + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength) { + Map fixedPropertyMap = new HashMap<>(); + Integer fixedLength = calculateLength(protocolFieldConfigs); + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + fixedPropertyMap.put(FIXED_POSITION, maxFixedPosition); + fixedPropertyMap.put(TOTAL_LENGTH, totalLength); + fixedPropertyMap.put(TAIL_POSITION, totalLength - fixedLength + maxFixedPosition); + return fixedPropertyMap; + } + + //** 获取业务内容的byteBuf + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer) { + //计算固定长度 + Integer fixedLength = calculateLength(protocolFieldConfigs); + //总长度获取 + String lightText = buffer.toString(Charset.forName("ISO-8859-1")); + Integer totalLength = lightText.length(); + //计算固定长度最大长度 + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + //计算数据报文内容 + ByteBuf bizDataFields = buffer.slice(maxFixedPosition - 1, (totalLength - fixedLength)); + return bizDataFields; + } + + /** + * 获取过滤字段的长度 + */ + @Override + public Integer getTotalFilterLength(ProtocolConfig protocolConfig, + ByteBuf byteBuf, + Map protocolFieldConfigMap) { + if (ByteBufUtil.hexDump(byteBuf).equals("")) { + return 0; + } + int totalFilterLength = 0; + String filterFields = protocolConfig.getTotalLengthFilterFields(); + try { + if (!StringUtils.isEmpty(filterFields)) { + String[] filterFieldList = filterFields.split(","); + for (String filterFieldId : filterFieldList) { + if (StringUtils.isNotEmpty(filterFieldId)) { + ProtocolFieldConfig fieldConfig = protocolFieldConfigMap.get(Long.valueOf(filterFieldId)); + //这里都是按字节计算,没有对位进行区分,可能会出现错误 + // 如果对位有需求,需要进一步跟进 + totalFilterLength += fieldConfig.getOffsetLength(); + } + } + } + return totalFilterLength; + } catch (Exception ex) { + log.error("报文确认分发阶段,获取报文总长度过滤长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); + } + return totalFilterLength; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java new file mode 100644 index 0000000..d51e887 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java @@ -0,0 +1,169 @@ +package com.casic.missiles.parser.resolver.fields; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.parser.resolver.ByteMergeProvider; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.AbstractFieldConfig; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.pojo.ByteResolverParam; +import io.netty.buffer.ByteBuf; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * 字段解析管理总类 + */ +@Slf4j +public class FieldResolver extends ByteMergeProvider { + + //1、字段截取 => 2、简单的字节解析和复杂的字节解析 + public static Object parseField(ByteBuf byteBuf,AbstractFieldConfig fieldConfig, Integer maxFixedPosition) { + Integer orignPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + //最大固定位置不为空, + if (!ObjectUtil.isEmpty(maxFixedPosition)) { + orignPosition -= maxFixedPosition; + } + Object fieldValue = 0; + //待优化 + if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { + fieldValue = doParseBitField(byteBuf, fieldConfig); + } else { + ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); + fieldValue = doParseByteField(fieldBytes, fieldConfig.getRuleJson()); + } + return fieldValue; + } + + //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, + //目前默认配置的规则设置暂不支持配置化,由实现完成 + private static Object doParseByteField(ByteBuf byteBuf, String ruleJson) { + Object fieldsResolveValue = null; + List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); + if (ObjectUtil.isEmpty(ruleMapList)) { + fieldsResolveValue = defaultResolveBuilder(byteBuf); + } else { + fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); + } + return fieldsResolveValue; + } + + private static Object defaultResolveBuilder(ByteBuf byteBuf) { + Integer defaultResolveValue = 0; + for (int i = 0; i < byteBuf.writerIndex(); i++) { + defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; + } + return defaultResolveValue; + } + + //字段解析构建器(针对字节单位的) + //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 + // 字节归并结束或者规则结束=>继续根据规则进行判断 + private static Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { + Object customizeResolveValue = null; + try { + List bytStrList = new ArrayList<>(); + //存放到数组里面 + for (int i = 0; i < byteBuf.writerIndex(); i++) { + bytStrList.add(byteBuf.readByte()); + } + int i = 0; + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { + if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + customizeResolveValue = resolveByteMerge(bytStrList, ruletypeId, vaildRange); + break; + } else { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + List tempBytStr = new ArrayList<>(); + for (int k = 0; i < bytStrList.size(); i++) { + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(k) + .value(bytStrList.get(k)) + .ruletypeId(ruletypeId).build(); + tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); + } + bytStrList = tempBytStr; + } + i++; + } + //字节归并到一起=>继续根据规则进行判断 + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(null) + .value(customizeResolveValue) + .ruletypeId(ruletypeId).build(); + customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); + i++; + } + System.out.println(JSON.toJSON(customizeResolveValue)); + return customizeResolveValue; + } catch (RuntimeException ex) { + log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); + return null; + } + } + + /** + * 1、单个字节情况表示字段 + * 2、多字节情况表示字段(暂未处理) + */ + private static Object doParseBitField(ByteBuf byteBuf,AbstractFieldConfig fieldConfig) { + Object fieldValue = new Object(); + try { + Integer orignPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + byte fields = 0x00; + if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { + fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); + } else { + fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); + } + + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { + if (!StringUtils.isEmpty(fieldConfig.getOriginPositionBit())) { + fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getOriginPositionBit())).byteValue() + >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); + } else { + fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); + } + } else { + fieldValue = Integer.valueOf(fields & 0xff); + } + if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { + return fieldValue; + } + List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); + int i = 0; + //字节归并到一起=>继续根据规则进行判断 + while (i < ruleMapList.size()) { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(null) + .value(fieldValue) + .ruletypeId(ruletypeId).build(); + fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); + i++; + } + System.out.println(JSON.toJSON(fieldValue)); + return fieldValue; + } catch (RuntimeException ex) { + log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); + return null; + } + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java deleted file mode 100644 index 35ae3d0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java +++ /dev/null @@ -1,183 +0,0 @@ -package com.casic.missiles.parser.resolver.fields; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufAllocator; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; -import org.springframework.util.ObjectUtils; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service("standard") -@AllArgsConstructor -@Slf4j -public class StandardFieldParser implements FieldParser { - - private final FieldConfigDao fieldConfigDao; - private final FieldResolver fieldResolver; - - //数据解析 - @Override - public Map dataParser(RuleConfig ruleConfig, String lightText, String protocolId) { - String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); - ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); - bufferContent.writeBytes(lightText.getBytes(Charset.forName("ISO-8859-1"))); - Map dataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - for (String dataFieldId : dataFieldIds) { - FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(dataFieldId); - if (!ObjectUtils.isEmpty(fieldConfig)) { - dataMap.put(fieldConfig.getFieldName(), String.valueOf(fieldResolver.filedParserManger(bufferContent, fieldConfig, maxFixedPosition))); - } - } - return dataMap; - } - - //数据解析 - @Override - public Map fixDataParser(String protocolId, ByteBuf buffer) { - List dataFieldIdList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Map dataMap = new HashMap<>(); - for (FieldConfig dataField : dataFieldIdList) { - if (!ObjectUtils.isEmpty(dataField.getOrignPosition())) { - Object fieldValue = (Integer) fieldResolver.filedParserManger(buffer, dataField, null); - dataMap.put(dataField.getFieldName(), fieldValue); - } - } - return dataMap; - } - - @Override - public Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf) { - if (ByteBufUtil.hexDump(byteBuf).equals("")) { - return 0; - } - String filterFields = protocolConfig.getTotalLengthFilterField(); - Integer totalLength = 0; - try { - FieldConfig totalFieldConfig = fieldConfigDao.getFieldConfigById(protocolConfig.getTotalLengthId()); - int totalFilterLength = 0; - if (!StringUtils.isEmpty(filterFields)) { - String[] filterFieldList = filterFields.split(","); - for (String filterField : filterFieldList) { - FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(filterField); - //这里都是按字节计算,没有对位进行区分,可能会出现错误 - - // 如果对位有需求,需要进一步跟进 - totalFilterLength += fieldConfig.getOffsetLength(); - } - } - totalLength = (Integer) fieldResolver.filedParserManger(byteBuf, totalFieldConfig, null) + totalFilterLength; - } catch (Exception ex) { - log.error("报文确认分发阶段,获取报文总长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); - } - return totalLength; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer) { - //业务内容 - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - String protocolId = String.valueOf(protocolConfig.getId()); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - //计算固定长度 - Integer fixedLength = calculateLength(fieldConfigList); -// Integer totalLength = this.getTotalLength(protocolConfig, buffer); - //总长度获取 - Integer totalLength = lightText.length(); - //计算固定长度最大长度 - Integer maxFixedPosition = calculatePosition(fieldConfigList); -// buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - //计算数据报文内容 - ByteBuf bizDataFields = buffer.slice(maxFixedPosition-1, (totalLength - fixedLength)); - return bizDataFields; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer) { - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - String protocolId = String.valueOf(protocolConfig.getId()); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer fixedLength = calculateLength(fieldConfigList); -// Integer totalLength = this.getTotalLength(protocolConfig, buffer); - Integer totalLength = lightText.length(); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - ByteBuf fixDataFields = buffer.slice(0, maxFixedPosition); - return fixDataFields; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer) { - String protocolId = String.valueOf(protocolConfig.getId()); - Map fixedPropertyMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer fixedLength = calculateLength(fieldConfigList); - Integer totalLength = this.getTotalLength(protocolConfig, buffer); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - fixedPropertyMap.put("fixedPosition", maxFixedPosition); - fixedPropertyMap.put("totalLength", totalLength); - fixedPropertyMap.put("tailPosition", totalLength - fixedLength + maxFixedPosition); - return fixedPropertyMap; - } - - //分别计算bit和byte长度=> 合并长度 - private Integer calculateLength(List fieldConfigList) { - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (FieldConfig fieldConfig : fieldConfigList) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - Integer fixedLength = bytefixedLength + bitfixedLength / 8; - return fixedLength; - } - - //找到最大值=> 根据最大值计算业务数据下标 - private Integer calculatePosition(List fieldConfigList) { - String rex = "[0-9]+"; - Integer max = -1; - for (FieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOrignPosition()) - && Integer.valueOf(fieldConfig.getOrignPosition()) > max) { - max = Integer.valueOf(fieldConfig.getOrignPosition()); - } - } - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (FieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOrignPosition()) && fieldConfig.getOrignPosition().equals(max)) { - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - } - } - Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; - return maxFixedPosition; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java new file mode 100644 index 0000000..d4ec6c7 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java @@ -0,0 +1,76 @@ +package com.casic.missiles.parser.rule; + +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import org.apache.commons.lang3.StringUtils; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class GenericRuleResolver { + + //根据前置字段的值,找到指定的规则 + //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 + //=>循环判断=>通过规则得到业务字段 + public static RuleConfig machRule(Map fixDataMap, + String ids, + List protocolFieldConfigs, + List ruleConfigs) { + List preRuleConfigList = getPreRuleList(ids, protocolFieldConfigs); + //获取前置规则字段 + final Map metaDataMap = getPreRuleFields(preRuleConfigList, fixDataMap); + //准备固定的字段集合 + Map fixDataFieldMap = getFixDataFieldMap(protocolFieldConfigs); + return RuleResolverCore.doMachRule(ruleConfigs, metaDataMap, fixDataMap, fixDataFieldMap); + } + + private static Map getFixDataFieldMap(List protocolFieldConfigs) { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, ProtocolFieldConfig::getFieldName) + ); + return fixDataFieldMap; + } + + + /** + * 查询前置规则的字段配置 + * + * @param ids + * @return + */ + private static List getPreRuleList(String ids, List protocolFieldConfigs) { + String[] idList = ids.split(","); + Map prepareMaps = new HashMap<>(); + for (String id : idList) { + if (StringUtils.isNotEmpty(id)) { + prepareMaps.put(Long.valueOf(id), ""); + } + } + List preRuleConfigList = protocolFieldConfigs + .stream() + .filter(e -> prepareMaps.containsKey(e.getId())) + .collect(Collectors.toList()); + return preRuleConfigList; + } + + /** + * 获取前置规则解析字段 + */ + private static Map getPreRuleFields(List preRuleFieldConfigList, Map fixDataMap) { + Map ruleFieldMap = new HashMap<>(); + preRuleFieldConfigList.stream() + .forEach( + preRuleFieldConfig -> { + String fieldName = preRuleFieldConfig.getFieldName(); + if (fixDataMap.containsKey(fieldName)) { + ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); + } + } + ); + return ruleFieldMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java new file mode 100644 index 0000000..baae7e8 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -0,0 +1,68 @@ +package com.casic.missiles.parser.rule; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.casic.missiles.pojo.RuleConfig; + +import java.util.*; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleResolverCore { + + + public static RuleConfig doMachRule(List ruleConfigList, Map metaDataMap, + Map fixDataMap, + Map fixDataFieldMap) { + Optional ruleConfigOptional = ruleConfigList.stream() + .filter(ruleConfig -> machRuleConfig( + JSON.parseObject(ruleConfig.getMatchRuleJson(), Map.class), metaDataMap)) + .findFirst(); + if (ObjectUtil.isEmpty(ruleConfigOptional)) { + return null; + } + String[] ruleFields = ruleConfigOptional.get().getDataFieldIds().split(","); + Map ruleMetaDataMap = getRuleFields(ruleFields, fixDataMap, fixDataFieldMap); + //递归选定解析规则,进行规则解析 + if (!ruleConfigOptional.get().getIsFinishMatch().equals("1")) { + //递归选定规则 + doMachRule(ruleConfigList, ruleMetaDataMap, fixDataMap, fixDataFieldMap); + } + return ruleConfigOptional.get(); + } + + + private static Map getRuleFields(String[] preRuleConfigList, Map fixedDataMap, + Map fixedFieldMap) { + Map ruleFieldMap = new HashMap<>(); + for (String preRuleConfigId : preRuleConfigList) { + String fieldName = fixedFieldMap.get(preRuleConfigId); + if (fixedDataMap.containsKey(fieldName)) { + ruleFieldMap.put(fieldName, String.valueOf(fixedDataMap.get(fieldName))); + } + } + return ruleFieldMap; + } + + + //匹配规则配置 + private static Boolean machRuleConfig(Map ruleMap, Map metaDataMap) { + if (ruleMap == null || metaDataMap == null) { + return null; + } + //所有的字段在规则里面必须有有配置 + for (String key : metaDataMap.keySet()) { + if (ruleMap.containsKey(key)) { + if (!ruleMap.get(key).equals(metaDataMap.get(key))) { + return false; + } + } else { + return false; + } + } + return true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java deleted file mode 100644 index 664088d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java +++ /dev/null @@ -1,92 +0,0 @@ -package com.casic.missiles.parser.rule; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.mapper.dao.PreRuleConfigDao; -import com.casic.missiles.mapper.dao.RuleConfigDao; -import lombok.AllArgsConstructor; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.*; -import java.util.stream.Collectors; - -@Service -@AllArgsConstructor -public class RulerProvider { - - private final FieldConfigDao fieldConfigDao; - private final PreRuleConfigDao preRuleConfigDao; - private final RuleConfigDao ruleConfigDao; - - //根据前置字段的值,找到指定的规则 - //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 - //=>循环判断=>通过规则得到业务字段 - public RuleConfig ruleConfig(Map fixDataMap, String protocolId) { - //批量获取规则 - List preRuleConfigList = preRuleConfigDao.getPreRuleList(protocolId); - //获取固定字段 - Map fixFieldMap = getAllFieldMap(protocolId); - //获取前置规则字段 - final String preRuleFields = getPreRuleFields(preRuleConfigList, fixDataMap, fixFieldMap); - List ruleConfigList = ruleConfigDao.getRuleConfigById(protocolId); - Optional ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig ->preRuleFields.equals( ruleConfig.getParseRuleJson())).findFirst(); - //递归选定解析规则,进行规则解析 - while (!ObjectUtil.isEmpty(ruleConfigOptional) && !ruleConfigOptional.get().getIsBizField().equals("1")) { - String ruleFields = getRuleFields(ruleConfigOptional.get().getDataFieldIds().split(","), fixDataMap, fixFieldMap); - ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig -> ruleConfig.getParseRuleJson().equals(ruleFields)).findFirst(); - } - return ruleConfigOptional.get(); - } - - /** - * 获取前置规则解析字段 - */ - private String getPreRuleFields(List preRuleConfigList, Map fixDataMap, Map fixFieldMap) { - Map ruleFieldMap= new HashMap<>(); - preRuleConfigList.stream() - .forEach( - preRuleConfig -> { - String fieldName = fixFieldMap.get(Long.valueOf(preRuleConfig.getRuleFieldId())); - if (fixDataMap.containsKey(fieldName)) { - ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); - } - } - ); - return JSONObject.toJSONString(ruleFieldMap); - } - - private Map getAllFieldMap(String protocolId) { - List fieldList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Map fixFieldMap = fieldList.stream().collect( - Collectors.toMap(FieldConfig::getId, FieldConfig::getFieldName) - ); - return fixFieldMap; - } - - private String getRuleFields(String[] preRuleConfigList, Map fixDataMap, Map fixFieldMap) { - Map ruleFieldMap= new HashMap<>(); - for (String preRuleConfigId : preRuleConfigList) { - String fieldName = fixFieldMap.get(preRuleConfigId); - if (fixDataMap.containsKey(fieldName)) { - ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); - } - } - return JSONObject.toJSONString(ruleFieldMap); - } - - //弃置 - private String ListToString(List ruleFieldList) { - String ruleFields = ""; - for (String ruleField : ruleFieldList) { - ruleFields += ruleField + ","; - } - ruleFields = StringUtils.isEmpty(ruleFields) ? ruleFields : ruleFields.substring(0, ruleFields.length() - 1); - return ruleFields; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java index 6177e10..bfa87a5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java @@ -2,7 +2,7 @@ public interface SafeStrategy { - String decryption(byte[] bytes); + String decryption(String cipher); String encryption(String lightText); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java index 618716c..6236302 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java @@ -9,9 +9,9 @@ //十六进制的字符串转换成字节数组 byte[] bytes = hexStrToBinaryStr(msg); //计算CRC8 - byte crc8 = CRC8(bytes, 0, bytes.length); - String crc8ToStr = "" + Integer.toHexString(0xff & crc8); - return crc8ToStr; +// String crc8ToStr = "" + Integer.toHexString(0xff & crc8); +// return crc8ToStr; + return null; } /** @@ -33,50 +33,5 @@ return bytes; } - /** - * CRC8 校验 多项式 x8+x2+x+1 - * - * @param b - * @param off - * @param len - * @return - */ - public static byte CRC8(final byte[] b, final int off, final int len) { - byte result = 0x00; - for (int i = 0; i < len; i++) { - result = CHECKSUM_TABLE[(result ^ (b[i + off] & 0xFF)) & 0xFF]; - } - return (byte) (result & 0xFFL); - } - - private final static byte[] CHECKSUM_TABLE = {(byte) 0x00, (byte) 0x07, (byte) 0x0e, (byte) 0x09, (byte) 0x1c, (byte) 0x1b, - (byte) 0x12, (byte) 0x15, (byte) 0x38, (byte) 0x3f, (byte) 0x36, (byte) 0x31, (byte) 0x24, (byte) 0x23, (byte) 0x2a, - (byte) 0x2d, (byte) 0x70, (byte) 0x77, (byte) 0x7e, (byte) 0x79, (byte) 0x6c, (byte) 0x6b, (byte) 0x62, (byte) 0x65, - (byte) 0x48, (byte) 0x4f, (byte) 0x46, (byte) 0x41, (byte) 0x54, (byte) 0x53, (byte) 0x5a, (byte) 0x5d, (byte) 0xe0, - (byte) 0xe7, (byte) 0xee, (byte) 0xe9, (byte) 0xfc, (byte) 0xfb, (byte) 0xf2, (byte) 0xf5, (byte) 0xd8, (byte) 0xdf, - (byte) 0xd6, (byte) 0xd1, (byte) 0xc4, (byte) 0xc3, (byte) 0xca, (byte) 0xcd, (byte) 0x90, (byte) 0x97, (byte) 0x9e, - (byte) 0x99, (byte) 0x8c, (byte) 0x8b, (byte) 0x82, (byte) 0x85, (byte) 0xa8, (byte) 0xaf, (byte) 0xa6, (byte) 0xa1, - (byte) 0xb4, (byte) 0xb3, (byte) 0xba, (byte) 0xbd, (byte) 0xc7, (byte) 0xc0, (byte) 0xc9, (byte) 0xce, (byte) 0xdb, - (byte) 0xdc, (byte) 0xd5, (byte) 0xd2, (byte) 0xff, (byte) 0xf8, (byte) 0xf1, (byte) 0xf6, (byte) 0xe3, (byte) 0xe4, - (byte) 0xed, (byte) 0xea, (byte) 0xb7, (byte) 0xb0, (byte) 0xb9, (byte) 0xbe, (byte) 0xab, (byte) 0xac, (byte) 0xa5, - (byte) 0xa2, (byte) 0x8f, (byte) 0x88, (byte) 0x81, (byte) 0x86, (byte) 0x93, (byte) 0x94, (byte) 0x9d, (byte) 0x9a, - (byte) 0x27, (byte) 0x20, (byte) 0x29, (byte) 0x2e, (byte) 0x3b, (byte) 0x3c, (byte) 0x35, (byte) 0x32, (byte) 0x1f, - (byte) 0x18, (byte) 0x11, (byte) 0x16, (byte) 0x03, (byte) 0x04, (byte) 0x0d, (byte) 0x0a, (byte) 0x57, (byte) 0x50, - (byte) 0x59, (byte) 0x5e, (byte) 0x4b, (byte) 0x4c, (byte) 0x45, (byte) 0x42, (byte) 0x6f, (byte) 0x68, (byte) 0x61, - (byte) 0x66, (byte) 0x73, (byte) 0x74, (byte) 0x7d, (byte) 0x7a, (byte) 0x89, (byte) 0x8e, (byte) 0x87, (byte) 0x80, - (byte) 0x95, (byte) 0x92, (byte) 0x9b, (byte) 0x9c, (byte) 0xb1, (byte) 0xb6, (byte) 0xbf, (byte) 0xb8, (byte) 0xad, - (byte) 0xaa, (byte) 0xa3, (byte) 0xa4, (byte) 0xf9, (byte) 0xfe, (byte) 0xf7, (byte) 0xf0, (byte) 0xe5, (byte) 0xe2, - (byte) 0xeb, (byte) 0xec, (byte) 0xc1, (byte) 0xc6, (byte) 0xcf, (byte) 0xc8, (byte) 0xdd, (byte) 0xda, (byte) 0xd3, - (byte) 0xd4, (byte) 0x69, (byte) 0x6e, (byte) 0x67, (byte) 0x60, (byte) 0x75, (byte) 0x72, (byte) 0x7b, (byte) 0x7c, - (byte) 0x51, (byte) 0x56, (byte) 0x5f, (byte) 0x58, (byte) 0x4d, (byte) 0x4a, (byte) 0x43, (byte) 0x44, (byte) 0x19, - (byte) 0x1e, (byte) 0x17, (byte) 0x10, (byte) 0x05, (byte) 0x02, (byte) 0x0b, (byte) 0x0c, (byte) 0x21, (byte) 0x26, - (byte) 0x2f, (byte) 0x28, (byte) 0x3d, (byte) 0x3a, (byte) 0x33, (byte) 0x34, (byte) 0x4e, (byte) 0x49, (byte) 0x40, - (byte) 0x47, (byte) 0x52, (byte) 0x55, (byte) 0x5c, (byte) 0x5b, (byte) 0x76, (byte) 0x71, (byte) 0x78, (byte) 0x7f, - (byte) 0x6a, (byte) 0x6d, (byte) 0x64, (byte) 0x63, (byte) 0x3e, (byte) 0x39, (byte) 0x30, (byte) 0x37, (byte) 0x22, - (byte) 0x25, (byte) 0x2c, (byte) 0x2b, (byte) 0x06, (byte) 0x01, (byte) 0x08, (byte) 0x0f, (byte) 0x1a, (byte) 0x1d, - (byte) 0x14, (byte) 0x13, (byte) 0xae, (byte) 0xa9, (byte) 0xa0, (byte) 0xa7, (byte) 0xb2, (byte) 0xb5, (byte) 0xbc, - (byte) 0xbb, (byte) 0x96, (byte) 0x91, (byte) 0x98, (byte) 0x9f, (byte) 0x8a, (byte) 0x8d, (byte) 0x84, (byte) 0x83, - (byte) 0xde, (byte) 0xd9, (byte) 0xd0, (byte) 0xd7, (byte) 0xc2, (byte) 0xc5, (byte) 0xcc, (byte) 0xcb, (byte) 0xe6, - (byte) 0xe1, (byte) 0xe8, (byte) 0xef, (byte) 0xfa, (byte) 0xfd, (byte) 0xf4, (byte) 0xf3}; } \ No newline at end of file diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java index 27c2838..6e078a3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java @@ -1,9 +1,6 @@ package com.casic.missiles.parser.safe.impl; -import cn.hutool.core.util.CharsetUtil; -import cn.hutool.crypto.symmetric.SM4; -import cn.hutool.crypto.symmetric.SymmetricCrypto; - +import com.casic.missiles.parser.safe.SafeStrategy; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; @@ -11,19 +8,44 @@ import org.bouncycastle.crypto.engines.SM4Engine; import org.bouncycastle.crypto.params.KeyParameter; import org.bouncycastle.util.encoders.Hex; - -import static cn.hutool.crypto.Mode.ECB; -import static cn.hutool.crypto.Padding.NoPadding; +import org.springframework.stereotype.Component; /** * SM4算法工具类 */ @Slf4j -public class Sm4 { +@Component("sm4") +public class Sm4 implements SafeStrategy { //加解密的字节快大小 public static final int BlockSize = 16; + @Override + public String decryption(String cipher) { + byte[] keyByte = { + 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 + }; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(keyByte); + byte[] in = Hex.decode(cipher); + byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); + String plain = EcbDecrypt(in, keyBytes); + return plain; + } + + @Override + public String encryption(String cipher) { + byte[] keyByte = { + 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 + }; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(keyByte); + byte[] in = Hex.decode(cipher); + byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); + String plain = EcbDecrypt(in, keyBytes); + return plain; + } + /** * SM4ECB加密算法,对内 * @@ -32,8 +54,6 @@ * @return */ private static byte[] ecb_encrypt(byte[] in, byte[] keyBytes) { - - SM4Engine sm4Engine = new SM4Engine(); sm4Engine.init(true, new KeyParameter(keyBytes)); byte[] out = new byte[in.length]; @@ -58,27 +78,6 @@ return cipher; } - - /** - * hutool 解密SM4 - * - * @param encodeContent - * @return - */ - public static String decode(String encodeContent) { - String key = "24ad182507479a5da3ad94d9d78ea203"; - try { - SymmetricCrypto sm4 = new SM4(ECB, NoPadding, key.getBytes()); - String decryptStr = sm4.decryptStr(encodeContent, CharsetUtil.CHARSET_UTF_8); - return decryptStr; - } catch (Exception e) { - e.printStackTrace(); - log.error("SM4解密失败"); - } - return null; - } - - /** * SM4的ECB加密算法 * @@ -129,20 +128,6 @@ return plain; } - /** - * SM4的ECB解密算法 - * - * @param cipher 输入的密文字符串 - * @param key 密钥 - * @return - */ - public static String EcbDecrypt(String cipher, String key) { - byte[] in = Hex.decode(cipher); - byte[] keyBytes = Hex.decode(key); - - String plain = EcbDecrypt(in, keyBytes); - return plain; - } /** * 主函数 @@ -151,28 +136,24 @@ */ public static void main(String[] args) { byte[] ciphertext = { + 0x4B, (byte) 0x8C, (byte) 0x9D, 0x08, (byte) 0xE4, (byte) 0xD3, 0x64, 0x42, (byte) 0xB9, (byte) 0xA5, (byte) 0xFE, (byte) 0xCD, (byte) 0x91, 0x1B, 0x38, (byte) 0xAC, (byte) 0xE9, 0x1C, (byte) 0xCD, 0x53, 0x02, (byte) 0xD7, 0x0C, (byte) 0x9B, (byte) 0x96, 0x30, 0x62, (byte) 0xE8, (byte) 0xFB, (byte) 0xEF, (byte) 0xB9, (byte) 0xFF, (byte) 0xDE, 0x19, (byte) 0x80, 0x35, 0x3E, (byte) 0x90, 0x4F, 0x2F, 0x12, 0x2B, 0x19, (byte) 0x8B, 0x6C, 0x7A, (byte) 0x85, (byte) 0xA1, (byte) 0xB1, (byte) 0x86, (byte) 0xA3, 0x7A, 0x46, 0x0C, 0x2F, (byte) 0x94, 0x4F, 0x7F, 0x2C, 0x56, 0x14, (byte) 0xF3, (byte) 0x89, (byte) 0xC3, - 0x3F, 0x20, (byte) 0xF9, (byte) 0x87, (byte) 0xA1, 0x60, (byte) 0xD9, (byte) 0xA8, (byte) 0xFD, (byte) 0xD7, (byte) 0x9B, 0x4B, 0x26, 0x06, 0x30, 0x44}; + 0x3F, 0x20, (byte) 0xF9, (byte) 0x87, (byte) 0xA1, 0x60, (byte) 0xD9, (byte) 0xA8, (byte) 0xFD, (byte) 0xD7, (byte) 0x9B, 0x4B, 0x26, 0x06, 0x30, 0x44 + }; ByteBuf in = ByteBufAllocator.DEFAULT.heapBuffer(); in.writeBytes(ciphertext); - byte[] keyByte = { 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 }; ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); - key.writeBytes(ciphertext); - String resCipherData = decode(ByteBufUtil.hexDump(in)); - ByteBuf out = ByteBufAllocator.DEFAULT.heapBuffer(); -// out.writeBytes(resCipherData); -// System.out.println(hexBytes); - System.out.println(resCipherData.toString()); -// String resPlainData = EcbDecrypt(resCipherData, key); -// System.out.println("原始明文:" + data); -// System.out.println("解密后明文:" + resPlainData); + key.writeBytes(keyByte); +// String resCipherData = EcbDecrypt(ByteBufUtil.hexDump(in), ByteBufUtil.hexDump(key)); +// System.out.println(resCipherData); } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java index 1395a51..ac5f957 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java @@ -1,7 +1,7 @@ package com.casic.missiles.parser.safe.impl; import io.netty.buffer.ByteBufUtil; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** *

@@ -14,9 +14,8 @@ * @author hyl * @version v1.0: Tea.java, v 0.1 2021/3/12 13:48 $ */ -@Service("tea") -///tea算法类 - +//tea算法类 +@Component("tea") public class Tea { public static byte[] MyTea_Encrypt(byte[] MyTeaContent, int ByteLen, byte[] MyTeakey) { @@ -99,7 +98,6 @@ // for(int i32Index = 0; i32Index < 8; i32Index++) { // System.out.print("0x" + Integer.toHexString(MyContent[i32Index]) + " "); // } - // System.out.println("密钥为:"); // for(int i32Index = 0; i32Index < 16; i32Index++) { // System.out.print("0x" + Integer.toHexString(MyKeys[i32Index]) + " "); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java index bdd0721..bd1516a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java @@ -3,7 +3,7 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.parser.sender.DataSubscribeProvider; import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponents; import org.springframework.web.util.UriComponentsBuilder; @@ -12,7 +12,7 @@ import java.util.Collections; import java.util.Map; -@Service("functionCallback") +@Component("functionCallback") public class FunctionCallback implements DataSubscribeProvider { @Resource diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java index 0b44fb9..7526de2 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.Map; -@Service("middleware") +@Component("middleware") public class MiddlewareSubscribe implements DataSubscribeProvider { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java index 5dcee3f..e2f1192 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.Map; -@Service("nosql") +@Component("nosql") public class NoSqlSubscribe implements DataSubscribeProvider { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java b/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java new file mode 100644 index 0000000..81a5324 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java @@ -0,0 +1,86 @@ +package com.casic.missiles.pojo; + +import lombok.Data; + +/** + * 协议 + */ +@Data +public class Msg { + + /** + * 前导码 + */ + private String preamble; + + /** + * 版本号 + */ + private String version; + + /** + * 内容长度 + */ + private int leng; + + /** + * 设备ID + */ + private String deviceId; + + /** + * 通讯方式 + */ + private Integer connType; + + /** + * 加密方式 + */ + private Integer encryType; + + /** + * 目标地址 + */ + private String destAddr; + + /** + * PDUType + */ + private String PDUType; + + /** + * 操作类型 + */ + private Integer operateType; + + /** + * 传输控制位 PDUType.bit7=0时,表示存在后续的访问;当PDUType.bit7=1时,表示无后续的访问。 + */ + private Integer transControlFlag; + + /** + * 设备类型 + */ + private Integer deviceType; + + /** + * 序号 + */ + private Integer seq; + + /** + * tagList + */ + private String tagList; + + /** + * OidList + */ + private String OidList; + + /** + * CRC + */ + private String CRC; + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java index 40a5265..97cc984 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java @@ -40,7 +40,7 @@ String httpContent = msg.toString(Charset.defaultCharset()); log.info(" String : " + msg.toString(Charset.defaultCharset())); String majorContent = httpContent.substring(httpContent.indexOf("{"), httpContent.lastIndexOf("}") + 1); - String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("serviceData")).get("Value")); + String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("RegistryData")).get("Value")); log.info("----------------------------------" + values); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); bufferContent.writeBytes(values.getBytes(Charset.forName("ISO-8859-1"))); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java index 1b132a7..e3ced4b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java @@ -35,7 +35,7 @@ String httpContent = msg.toString(Charset.defaultCharset()); log.info(" String : " + msg.toString(Charset.defaultCharset())); String majorContent = httpContent.substring(httpContent.indexOf("{"), httpContent.lastIndexOf("}") + 1); - String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("serviceData")).get("Value")); + String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("RegistryData")).get("Value")); log.info("----------------------------------" + values); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); bufferContent.writeBytes(values.getBytes(Charset.forName("ISO-8859-1"))); diff --git a/sensorhub-core/src/main/resources/application.properties b/sensorhub-core/src/main/resources/application.properties deleted file mode 100644 index 8b13789..0000000 --- a/sensorhub-core/src/main/resources/application.properties +++ /dev/null @@ -1 +0,0 @@ - diff --git a/sensorhub-core/src/main/resources/config/application-dev.yml b/sensorhub-core/src/main/resources/config/application-dev.yml index 4f897a8..dcc4c2d 100644 --- a/sensorhub-core/src/main/resources/config/application-dev.yml +++ b/sensorhub-core/src/main/resources/config/application-dev.yml @@ -4,9 +4,9 @@ spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true + url: jdbc:mysql://127.0.0.1:3306/sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true username: root - password: Casic203 + password: root session: store-type: redis redis: diff --git a/sensorhub-core/src/main/resources/config/application.yml b/sensorhub-core/src/main/resources/config/application.yml index ae89f9d..7965da1 100644 --- a/sensorhub-core/src/main/resources/config/application.yml +++ b/sensorhub-core/src/main/resources/config/application.yml @@ -30,6 +30,13 @@ port: 6379 password: ew5T4K3#203lwh config-prefix: 'Casic:' +#代码生成器配置 +code: + generate: + #作者 + author: cz + #待生成对象表名 + table-name: bussiness_field_config,combined_field_config sensorhub: config: port: 7091 diff --git a/sensorhub-support/pom.xml b/sensorhub-support/pom.xml index 9a71296..761601c 100644 --- a/sensorhub-support/pom.xml +++ b/sensorhub-support/pom.xml @@ -42,6 +42,12 @@ ${redis.version} + + com.baomidou + mybatis-plus-generator + ${mybatis-plus-generator.version} + + org.reflections diff --git a/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java b/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java new file mode 100644 index 0000000..515ca53 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java @@ -0,0 +1,14 @@ +package com.casic.missiles.enums; + +/** + * @author + * @date + */ +public interface FixedPropertyEnum { + + String FIXED_POSITION = "fixedPosition"; + + String TOTAL_LENGTH = "totalLength"; + + String TAIL_POSITION = "tailPosition"; +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/CombinedFieldMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CombinedFieldMapper.java new file mode 100644 index 0000000..38e8f42 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CombinedFieldMapper.java @@ -0,0 +1,15 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.CombinedFieldConfig; +import org.apache.ibatis.annotations.Mapper; + +/** + * @author cz + * + */ +@Mapper +public interface CombinedFieldMapper extends BaseMapper { + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java new file mode 100644 index 0000000..128b09d --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java @@ -0,0 +1,10 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.CommandEventConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface CommandEventMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java new file mode 100644 index 0000000..042eb3c --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.DatagramEventConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface DatagramEventConfigMapper extends BaseMapper { +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java new file mode 100644 index 0000000..fc95cf4 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java @@ -0,0 +1,8 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.FieldConfig; + +public interface FieldConfigMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldRuleConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldRuleConfigMapper.java new file mode 100644 index 0000000..b310a08 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldRuleConfigMapper.java @@ -0,0 +1,10 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.FieldRuleConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface FieldRuleConfigMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java new file mode 100644 index 0000000..9060a69 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.ProtocolConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface ProtocolConfigMapper extends BaseMapper { +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolFieldConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolFieldConfigMapper.java new file mode 100644 index 0000000..1b47180 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolFieldConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +public interface ProtocolFieldConfigMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java new file mode 100644 index 0000000..6fa6936 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.RuleConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface RuleConfigMapper extends BaseMapper { +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/AbstractFieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/AbstractFieldConfig.java new file mode 100644 index 0000000..ba9aea2 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/AbstractFieldConfig.java @@ -0,0 +1,38 @@ +package com.casic.missiles.pojo; + +import lombok.Data; + +@Data +public class AbstractFieldConfig { + /** + * 字段名称 + */ + private String fieldName; + /** + * 按照字段评估进行字段解析 + */ + private String ruleJson; + /** + * 起始位置(单位byte) + */ + private Integer OriginPositionByte; + /** + * 起始位置,是否需要bit位置(单位bit)小于8, 没有不需要填写 + */ + private String OriginPositionBit; + /** + * 偏移长度 + */ + private Integer offsetLength; + /** + * 偏移单位(bit/byte) + */ + private String offsetUnit; + /** + * 是否需要转存 + */ + private Integer isStorage; + + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/CombinedFieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/CombinedFieldConfig.java new file mode 100644 index 0000000..4f4de6a --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/CombinedFieldConfig.java @@ -0,0 +1,41 @@ +package com.casic.missiles.pojo; + +import lombok.Data; + +import java.util.Date; + +/** + * 组合配置 + * + * @author cz + * @date 20 + */ +@Data +public class CombinedFieldConfig { + + private Long id; + private Long ruleId; + /** + * 前缀编码 + */ + private String prefixCode; + + /** + * 字段动态的id + */ + private Long dynamicLengthId; + /** + * 对应的要解析字段的ids + */ + private String dataFieldIds; + + /** + * 字段动态的id + */ + private String combinedFieldIds; + + private Date lastTime; + + private Date createTime; + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldConfig.java index a07d20d..8304dc6 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldConfig.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldConfig.java @@ -5,31 +5,28 @@ import java.util.Date; +/** + * @author cz + * 1、该表与实际解析的内容实例解析有关 + * 2、该表字段是随机出现的,和帧结构无关,无法预料的 + * 3、该表字段解析根据FieldEvaluatorConfig进行字段解析 + */ @Data -@TableName("field_config") -public class FieldConfig { +@TableName("business_field_config") +public class FieldConfig extends AbstractFieldConfig { private Long id; -// private String preFieldConfig; - private Long protocolId; - - private String isFixed; - private String uploadDeliveryChange; - - private String replyRule; - private String ruleJson; - + /** + * 协议配置id + */ + private Long ruleId; + /** + * 字段名称 + */ private String fieldName; - private String isStorage; - private Integer orignPosition; - private String exactOrignPosition; - - private Integer offsetLength; - private String offsetUnit; private String ownerId; private Date createTime; private Date lastTime; - } diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldRuleConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldRuleConfig.java new file mode 100644 index 0000000..2e09879 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldRuleConfig.java @@ -0,0 +1,20 @@ +package com.casic.missiles.pojo; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +@TableName("field_rule_config") +@Data +public class FieldRuleConfig { + + private Long id; + private String name; + private String desc; + private String condition; + private String excuteOperation; + private Date lasTime; + private Date createTime; + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/Msg.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/Msg.java deleted file mode 100644 index 81a5324..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/Msg.java +++ /dev/null @@ -1,86 +0,0 @@ -package com.casic.missiles.pojo; - -import lombok.Data; - -/** - * 协议 - */ -@Data -public class Msg { - - /** - * 前导码 - */ - private String preamble; - - /** - * 版本号 - */ - private String version; - - /** - * 内容长度 - */ - private int leng; - - /** - * 设备ID - */ - private String deviceId; - - /** - * 通讯方式 - */ - private Integer connType; - - /** - * 加密方式 - */ - private Integer encryType; - - /** - * 目标地址 - */ - private String destAddr; - - /** - * PDUType - */ - private String PDUType; - - /** - * 操作类型 - */ - private Integer operateType; - - /** - * 传输控制位 PDUType.bit7=0时,表示存在后续的访问;当PDUType.bit7=1时,表示无后续的访问。 - */ - private Integer transControlFlag; - - /** - * 设备类型 - */ - private Integer deviceType; - - /** - * 序号 - */ - private Integer seq; - - /** - * tagList - */ - private String tagList; - - /** - * OidList - */ - private String OidList; - - /** - * CRC - */ - private String CRC; - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/PreRuleConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/PreRuleConfig.java deleted file mode 100644 index bfcf914..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/PreRuleConfig.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.casic.missiles.pojo; - -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -import java.util.Date; - -@Data -@TableName("pre_rule_config") -public class PreRuleConfig { - - private Long id; - private String protocolId; - private String ruleFieldId; - private String ownerId; - private Date createTime; - private Date lastTime; -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolConfig.java index 274ad42..bdac11f 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolConfig.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolConfig.java @@ -5,18 +5,52 @@ import java.util.Date; +/** + * 协议配置表,协议配置与帧结构有关 + * 1、层级关系,协议之后是规则,规则对应设备类型的各种上数规则 + * 2、规则对应协议配置的实例流程 + * 3、每种可根据设备类型和操作类型进行上数规则进行区分 + */ @Data @TableName("protocol_config") public class ProtocolConfig { private Long id; + /** + * 前导码 + */ private String preFix; - private String unpackId; - private String totalLengthId; - private String totalLengthFilterField; + /** + * 拆包id + */ + private Long unpackId; + /** + * 总长度id + */ + private Long totalLengthId; + /** + * + */ + private String totalLengthFilterFields; + /** + * 动态长度ids + */ private String dynamicLengthId; + /** + * 动态长度json(预留字段) + */ private String dynamicLengthJson; - private String tailStr; + /** + * 规则字段所解析预准备的字段 + */ + private String rulePrepareFields; + /** + * 结尾标志 + */ + private Long tailStr; + /** + * 备注 + */ private String remark; private String ownerId; private Date createTime; diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolFieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolFieldConfig.java new file mode 100644 index 0000000..db794bd --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolFieldConfig.java @@ -0,0 +1,43 @@ +package com.casic.missiles.pojo; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +/** + * 协议字段配置表 + * 该表用户存放帧结构固定格式的字段 + * 有以下两个用途 + * (1)、固定格式的字段可用于规则匹配 + * (2)、固定格式的字段可用于报文回复 + * @author cz + * @date 2023-06-09 + */ +@Data +@TableName("protocol_field_config") +public class ProtocolFieldConfig extends AbstractFieldConfig{ + + private Long id; + /** + * 协议配置id + */ + private Long protocolId; + /** + * 上传下发是否有变化, 没有变化,可以直接组装 + */ + private String isReplyFix; + /** + * 按照字段评估进行字段解析 + */ + private Long fieldEvaluatorId; + /** + * 回复规则 + */ + private String replyRule; + + private String ownerId; + private Date createTime; + private Date lastTime; + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java index 3b53493..febf835 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java @@ -6,18 +6,40 @@ import java.util.Date; /** - * 加密字段解析和规则有关,事件调到该流程下面 + * @author cz + * todo: 匹配协议对应业务实例 + * 1、一个协议可以多种的流程规则 + * 2、规则可以支持递归规则流程 */ @Data @TableName("rule_config") public class RuleConfig { - private Long id; private String protocolId; - private String isBizField; - private String parseRuleJson; + /** + * 是否完成规则配置,没有完成, + * 则需要根据规则继续匹配 + */ + private String isFinishMatch; + /** + * 待匹配解析规则 + * {“data_field”:"data_value"} + */ + private String matchRuleJson; + /** + * 待解析字段ids + */ private String dataFieldIds; - private String aviatorFilterJson; + + /** + * 待解析组合字段ids + */ + private String combinedFieldIds; + + /** + * aviator + */ + private String conditionExpression; private Date createTime; private Date lastTime; } diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleDict.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleDict.java deleted file mode 100644 index cc7f389..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleDict.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.casic.missiles.pojo; - -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -@Data -@TableName("rule_dict") -public class RuleDict { - - private Long id; - private Long pid; - private String name; - private String code; - private String ownerId; - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleEvaluator.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleEvaluator.java deleted file mode 100644 index ed16610..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleEvaluator.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.pojo; - -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -import java.util.Date; - -@TableName("rule_evaluator") -@Data -public class RuleEvaluator { - - private Long id; - private String name; - private String desc; - private String condition; - private String excuteOperation; - private Date lasTime; - private Date createTime; - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/CombinedFieldConfigRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/CombinedFieldConfigRegistry.java new file mode 100644 index 0000000..fa59b90 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/CombinedFieldConfigRegistry.java @@ -0,0 +1,12 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.CombinedFieldConfig; + +import java.util.List; + +public interface CombinedFieldConfigRegistry { + + List getCombinedFieldConfigList(Long ruleId); + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/CommandEventRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/CommandEventRegistry.java new file mode 100644 index 0000000..fb97d87 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/CommandEventRegistry.java @@ -0,0 +1,8 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.CommandEventConfig; + +public interface CommandEventRegistry { + + CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName); +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/DatagramEventRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/DatagramEventRegistry.java new file mode 100644 index 0000000..fb34641 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/DatagramEventRegistry.java @@ -0,0 +1,11 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.DatagramEventConfig; + +import java.util.List; + +public interface DatagramEventRegistry{ + + List getDatagramEventList(Long ruleId); + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/FieldConfigRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/FieldConfigRegistry.java new file mode 100644 index 0000000..759642e --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/FieldConfigRegistry.java @@ -0,0 +1,20 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.FieldConfig; + +import java.util.List; + +public interface FieldConfigRegistry { + + + List getFieldConfigList(Long ruleId); + + FieldConfig getFieldConfigById(String fieldId); + + List getFieldConfigs(String protocolId, Integer isFixed); + + List getStorageFieldConfig(String protocolId); + + +} + diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/FieldRuleConfigRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/FieldRuleConfigRegistry.java new file mode 100644 index 0000000..33da70c --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/FieldRuleConfigRegistry.java @@ -0,0 +1,11 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.FieldRuleConfig; + +import java.util.List; + +public interface FieldRuleConfigRegistry { + + List getFieldRuleConfigList(Long ruleId); + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/ProtocolConfigRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/ProtocolConfigRegistry.java new file mode 100644 index 0000000..1725189 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/ProtocolConfigRegistry.java @@ -0,0 +1,12 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.ProtocolConfig; + +import java.util.List; + +public interface ProtocolConfigRegistry { + + List getProtocolConfigList(String firstChar); + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/ProtocolFieldConfigRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/ProtocolFieldConfigRegistry.java new file mode 100644 index 0000000..19d1b9a --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/ProtocolFieldConfigRegistry.java @@ -0,0 +1,14 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.ProtocolFieldConfig; + +import java.util.List; + +public interface ProtocolFieldConfigRegistry { + + + List getProtocolFieldConfigList(Long protocolId); + + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/RuleConfigRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/RuleConfigRegistry.java new file mode 100644 index 0000000..3d2a75c --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/RuleConfigRegistry.java @@ -0,0 +1,14 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.RuleConfig; + +import java.util.List; + +public interface RuleConfigRegistry { + + RuleConfig getNextRuleConfig(String ruleFields); + + + List getRuleConfigById(Long protocolId); + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CombinedFieldConfigRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CombinedFieldConfigRegistryImpl.java new file mode 100644 index 0000000..822cac6 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CombinedFieldConfigRegistryImpl.java @@ -0,0 +1,24 @@ +package com.casic.missiles.registry.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.CombinedFieldMapper; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.registry.CombinedFieldConfigRegistry; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class CombinedFieldConfigRegistryImpl extends ServiceImpl implements CombinedFieldConfigRegistry { + + @Override + public List getCombinedFieldConfigList(Long ruleId) { + QueryWrapper queryWrapper = new QueryWrapper() + .eq("rule_id", ruleId); + List combinedFieldConfigs = this.baseMapper.selectList(queryWrapper); + return combinedFieldConfigs; + } + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CommandEventRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CommandEventRegistryImpl.java new file mode 100644 index 0000000..f0d3559 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CommandEventRegistryImpl.java @@ -0,0 +1,25 @@ +package com.casic.missiles.registry.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.CommandEventMapper; +import com.casic.missiles.pojo.CommandEventConfig; +import com.casic.missiles.registry.CommandEventRegistry; + +import java.util.List; +import java.util.Optional; + +public class CommandEventRegistryImpl extends ServiceImpl implements CommandEventRegistry { + + @Override + public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { + QueryWrapper queryWrapper = new QueryWrapper() + .eq("protocol_id", protocolId) + .eq("scene", sceneName) + .eq("enabled", 1); + List commandEventConfig = this.baseMapper.selectList(queryWrapper); + Optional optionalEventConfig = commandEventConfig.stream().findFirst(); + return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java index 608af3a..32cc8a4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java @@ -2,48 +2,47 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.delivery.decorator.ByteDecorator; +import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @AllArgsConstructor public class FieldDecoratorManger { - private final RuleDictDao ruleDictDao; + private final RuleConfigRegistry ruleDictDao; // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 // (1)静态的业务字段是字典里面可以配置的 // (2)动态的业务字段是通过规则生成的 public String contentMerge(String ruleJson, String sceneConent, String dynamicContent) { - List ruleDictList = ruleDictDao.getRuleDictConfig(); - Map ruleDictMap = ruleDictList.stream().collect( - Collectors.toMap(RuleDict::getId, e -> e)); - List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); - for (Map ruleMap : ruleMapList) { - String ruleType = String.valueOf(ruleMap.get("ruleType")); - ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); - NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); - byteDecorator.nodeDecoratorRule(nodeDecoratorParm); - } +// List ruleDictList = ruleDictDao.getRuleDictConfig(); +// Map ruleDictMap = ruleDictList.stream().collect( +// Collectors.toMap(RuleDict::getId, e -> e)); +// List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); +// for (Map ruleMap : ruleMapList) { +// String ruleType = String.valueOf(ruleMap.get("ruleType")); +// ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); +// NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); +// byteDecorator.nodeDecoratorRule(nodeDecoratorParm); +// } return null; } - - private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { - NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() - .contents(sceneConent) - .dynamicContent(dynamicContent) - .ruletypeId(ruletypeId) - .ruleDictMap(ruleDictMap) - .build(); - return nodeDecoratorParm; - } +// +// private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { +// NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() +// .contents(sceneConent) +// .dynamicContent(dynamicContent) +// .ruletypeId(ruletypeId) +// .ruleDictMap(ruleDictMap) +// .build(); +// return nodeDecoratorParm; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java index 652970c..b204ac3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java @@ -1,56 +1,56 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@AllArgsConstructor -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", - JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Component; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Component("logicalDecorator") +//@AllArgsConstructor +//@Slf4j +//public class LogicalShiftDecorator implements ByteDecorator { +// +//// private final FieldRuleEngineMapper fieldRuleEngineMapper; +//// +//// //字节位移 +//// @Override +//// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +//// String logicalValue = ""; +//// RuleEvaluator fieldRuleEngine = new RuleEvaluator(); +//// try { +//// Map env2 = new HashMap(); +//// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +//// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +//// for (String contentId : contentIdList) { +//// RuleDict ruleDict = ruleDictMap.get(contentId); +//// if (ruleDict.getCode().contains("#")) { +//// //使用动态的值 +//// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +//// } +//// env2.put(ruleDict.getName(), ruleDict.getCode()); +//// } +//// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +//// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +//// return null; +//// } +//// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +//// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +//// return values; +//// } catch (Exception ex) { +//// log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", +//// JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +//// return null; +//// } +//// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java index 346468f..822fead 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@AllArgsConstructor -@Slf4j -public class OperationDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("optionDecorator") +//@AllArgsConstructor +//@Slf4j +//public class OperationDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //混合运算,有常量或者乘除的缩放 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java index 50fb0a7..7a8bccb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@AllArgsConstructor -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +////精度计算 +//@AllArgsConstructor +//@Registry("precisionDecorator") +//@Slf4j +//public class PrecisionDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java index da39235..27f9cc7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java @@ -1,54 +1,53 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@AllArgsConstructor -@Slf4j -public class RuleDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("ruleDecorator") +//@AllArgsConstructor +//@Slf4j +//public class RuleDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //吃我一套正则表达式 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (Exception ex) { +// log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java index 7f5cbf3..c043f97 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java @@ -2,6 +2,6 @@ import java.util.Map; -public interface ComandeEventService { +public interface ComandeEventService{ Map loadComandeEventConfig(String protocolId,String scene); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java index 476ad84..aaf1837 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java @@ -2,46 +2,46 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.dao.CommandEventDao; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @Slf4j @AllArgsConstructor -public class ComandeEventServiceImpl implements ComandeEventService { +public class ComandeEventServiceImpl implements ComandeEventRegistry { - private final CommandEventDao commandEventDao; + // private final CommandEventDao commandEventDao; // 加密bean 固定字段出现变化的字段解析,业务字段的有序内容 @Override - public Map loadComandeEventConfig(String protocolId,String sceneName) { - CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); - if (ObjectUtil.isEmpty(commandEventConfig)) { - log.error("协议{},没有配置成功接收回复配置,清排查原因"); - return null; - } - String replyJson = commandEventConfig.getReplyContentJson(); - List> replyMapList = JSONArray.parseObject(replyJson, List.class); - List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); - Map fixMap = fixList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); - List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) - .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) - .collect(Collectors.toList()); - Map commandConfigMap = new HashMap<>(); - commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); - commandConfigMap.put("fixContent", fixMap); - commandConfigMap.put("bizContent", contentList); - return commandConfigMap; + public Map loadComandeEventConfig(String protocolId, String sceneName) { +// CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); +// if (ObjectUtil.isEmpty(commandEventConfig)) { +// log.error("协议{},没有配置成功接收回复配置,清排查原因"); +// return null; +// } +// String replyJson = commandEventConfig.getReplyContentJson(); +// List> replyMapList = JSONArray.parseObject(replyJson, List.class); +// List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); +// Map fixMap = fixList.stream() +// .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); +// List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) +// .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) +// .collect(Collectors.toList()); +// Map commandConfigMap = new HashMap<>(); +// commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); +// commandConfigMap.put("fixContent", fixMap); +// commandConfigMap.put("bizContent", contentList); +// return commandConfigMap; + return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 128b09d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java deleted file mode 100644 index 4016b0b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface DatagramEventMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java deleted file mode 100644 index 597c306..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.apache.ibatis.annotations.Mapper; - -public interface FieldConfigMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java deleted file mode 100644 index a31680a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.PreRuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface PreRuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java deleted file mode 100644 index 9060a69..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface ProtocolConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java deleted file mode 100644 index 6fa6936..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java deleted file mode 100644 index 582a705..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleDict; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleDictMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java deleted file mode 100644 index 6e302c8..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.CommandEventMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Optional; - -@Component -public class CommandEventDao { - - @Resource - private CommandEventMapper commandEventMapper; - - public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId) - .eq("scene", sceneName) - .eq("enabled", 1); - List commandEventConfig = commandEventMapper.selectList(queryWrapper); - Optional optionalEventConfig = commandEventConfig.stream().findFirst(); - return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java deleted file mode 100644 index 9137e4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.FieldConfigMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class FieldConfigDao { - - @Resource - private FieldConfigMapper fieldConfigMapper; - - public FieldConfig getFieldConfigById(String fieldId) { - FieldConfig fieldConfig = fieldConfigMapper.selectById(fieldId); - return fieldConfig; - } - - public List getFieldConfigs(String protocolId,Integer isFixed) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",isFixed); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - - public List getStorageFieldConfig(String protocolId) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",1) - .eq("is_storage",1); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java deleted file mode 100644 index 67bff6b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.mapper.PreRuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class PreRuleConfigDao { - - @Resource - private PreRuleConfigMapper preRuleConfigMapper; - - public List getPreRuleList(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return preRuleConfigMapper.selectList(queryWrapper); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java deleted file mode 100644 index d69ea85..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.RuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleConfigDao { - - @Resource - private RuleConfigMapper ruleConfigMapper; - - public RuleConfig getNextRuleConfig(String ruleFields) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("parse_rule_json", ruleFields); - return ruleConfigMapper.selectOne(queryWrapper); - } - - - public List getRuleConfigById(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return ruleConfigMapper.selectList(queryWrapper); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java deleted file mode 100644 index 932c185..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.RuleDictMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleDictDao { - - @Resource - private RuleDictMapper ruleDictMapper; - - public List getRuleDictConfig() { - List ruleDictList = ruleDictMapper.selectList(null); - return ruleDictList; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java index 9f9e279..43bc4d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java @@ -10,20 +10,15 @@ import io.netty.channel.socket.nio.NioServerSocketChannel; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import javax.annotation.PreDestroy; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static cn.hutool.core.util.ClassUtil.getClasses; /** * SensorhubServer netty服务端 */ @Slf4j -@Service +@Component public class SensorhubServer { /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java index 2c79ff5..9a28c36 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java @@ -11,13 +11,13 @@ import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioSocketChannel; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClient 客户端 */ @Slf4j -@Service +@Registry public final class SensorhubClient { public static void main(String[] args) throws Exception { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java index 9774be0..477c3f7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java @@ -6,12 +6,12 @@ import io.netty.channel.socket.SocketChannel; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientChannelInitialHandler */ -@Service +@Registry public class SensorhubClientChannelInitialHandler extends ChannelInitializer { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java index 346f4b3..73560e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java @@ -5,13 +5,13 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientHandler */ @Slf4j -@Service +@Registry public class SensorhubClientHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java index 5c1c6f2..d990af5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java @@ -4,12 +4,12 @@ import com.casic.missiles.pojo.Msg; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** * SensorhubServerHandler */ -@Service +@Component public class SensorhubServerHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 67283ae..af3172c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,41 +1,37 @@ package com.casic.missiles.parser; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultProtocolConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.*; +import com.casic.missiles.registry.FieldConfigRegistry; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; -import java.nio.charset.Charset; import java.util.HashMap; import java.util.List; import java.util.Map; -@Service("genericProtocolParser") +/** + * @author + */ +@Component("genericProtocolParser") @Slf4j -@AllArgsConstructor +@RequiredArgsConstructor public class GenericProtocolParser implements ProtocolParser { - private final LeadingCodeMatcher leadingCodeMatcher; private final List frameStructDispenserList; - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorInstanceSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; // 匹配首字母前导码=> 帧结构匹配前导码=> // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 @@ -44,18 +40,19 @@ public Boolean doParseProtocol(ByteBuf byteBuf) { String protocolContent = ByteBufUtil.hexDump(byteBuf); //匹配前导码 - List preCodeConfigs = leadingCodeMatcher.matchLeadingCode(protocolContent); + List preCodeConfigs = LeadingCodeMatcher.matchFrameLeadingCode(protocolContent); //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 if (preCodeConfigs.size() == 0) { - return rematch(byteBuf,protocolContent); + return rematch(byteBuf, protocolContent); } - //暂时先取第一个 + //暂时先取第一个,提升速度,使用享元模式, 减少类的创建销毁与构建 ProtocolConfig protocolConfig = preCodeConfigs.get(0); + AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); ByteBuf wholeDatagramByte = null; //通过匹配帧结构获取完整的数据包 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, preCodeConfigs.get(0))) != null) { + if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, protocolFactory)) != null) { break; } } @@ -68,76 +65,78 @@ * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 */ - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId, wholeDatagramByte); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap, protocolId); - //选取规则对应的流程实例 - DatagramEventConfig datagramEventConfig = processorInstanceSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); + //进行规则字段解析,进行匹配规则 + RuleConfig ruleConfig = getRuleConfig(protocolFactory, wholeDatagramByte); + if (ruleConfig == null) { + return false; + } //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, wholeDatagramByte); + ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte); + //以下进行业务的规则解析,同时选定流程实例 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); + DatagramEventProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain, + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText, protocolId); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain); //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); + datagramEventProvider.storeData(bizDataMap); return true; } - private Boolean rematch(ByteBuf byteBuf,String protocolContent) { + /** + * 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 + */ + private Boolean rematch(ByteBuf byteBuf, String protocolContent) { //重置位判断 byteBuf.resetReaderIndex(); //判断重置是否前移,如果没有前移,则直接判为匹配失败 if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { return false; } else { + //递归执行 return doParseProtocol(byteBuf); } } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; + //获取匹配规则->匹配规则 + private RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + //取出其中参与逻辑provider并判空 + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); + String rulePrepareFields = protocolConfig.getRulePrepareFields(); + //固定字段 + if (StringUtils.isNotEmpty(rulePrepareFields)) { + //获取统一固定字段解析 + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + //获取该协议的字段配置,用于协议规则匹配 + List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); + //获取规则 + RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, + rulePrepareFields, protocolFieldConfigs); + return ruleConfig; + } + return null; } - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + //数据构建,获取固定字段的store和业务字段store + private Map buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + Map bizDataMap = new HashMap<>(); + Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); + Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); + bizDataMap.putAll(ruleStoreObjectMap); + bizDataMap.putAll(protocolStoreObjectMap); return bizDataMap; } - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java index 8a46e32..16ce2e5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java @@ -3,6 +3,7 @@ import io.netty.buffer.ByteBuf; public interface ProtocolParser { + Boolean doParseProtocol(ByteBuf byteBuf); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java new file mode 100644 index 0000000..f7814af --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java @@ -0,0 +1,35 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.ProtocolConfigProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.ProtocolConfig; + +/** + * 存放基本协议的的加载信息 + */ +public class AbstractProtocolConfigFactory { + private final ProtocolConfigProvider protocolConfigProvider; + private final ProtocolFieldConfigProvider protocolFieldConfigProvider; + private final RuleConfigProvider ruleConfigProvider; + + public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { + this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); + this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); + this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); + } + + public ProtocolConfigProvider getProtocolConfigProvider() { + return protocolConfigProvider; + } + + public ProtocolFieldConfigProvider getProtocolFieldConfigProvider() { + return protocolFieldConfigProvider; + } + + public RuleConfigProvider getRuleConfigProvider() { + return ruleConfigProvider; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java new file mode 100644 index 0000000..6e36147 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java @@ -0,0 +1,57 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.CombinedFieldConfigProvider; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.FieldConfigProvider; +import com.casic.missiles.parser.provider.FieldRuleConfigProvider; + +/** + * 存放规则相关的的的加载信息 + */ +public class AbstractRuleConfigFactory { + + /** + * 处理字节 + */ + private final FieldConfigProvider fieldConfigProvider; + /** + * 处理组合字节解析的解码器 + */ + private final CombinedFieldConfigProvider combinedFieldConfigProvider; + /** + * 处理负责字节解析的规则配置 + */ + private final FieldRuleConfigProvider fieldRuleConfigProvider; + /** + * 处理实例流程 + */ + private final DatagramEventProvider datagramEventProvider; + + + public AbstractRuleConfigFactory(Long ruleId) { + this.fieldConfigProvider = new FieldConfigProvider(ruleId); + this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); + this.fieldRuleConfigProvider = new FieldRuleConfigProvider(ruleId); + this.datagramEventProvider = new DatagramEventProvider(ruleId); + } + + public FieldConfigProvider getFieldConfigProvider() { + return fieldConfigProvider; + } + + public CombinedFieldConfigProvider getCombinedFieldConfigProvider() { + return combinedFieldConfigProvider; + } + + public FieldRuleConfigProvider getFieldRuleConfigProvider() { + return fieldRuleConfigProvider; + } + + public DatagramEventProvider getDatagramEventProvider() { + return datagramEventProvider; + } + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java deleted file mode 100644 index 6e1719a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.factory; - - -import com.casic.missiles.pojo.ProtocolConfig; - -import java.util.List; - -/** - * 数据库访问优化(暂时未做) - *

- * 1、初始化协议解析配置,并存放到处存放缓存,对协议基本配置进行管理 - * 2、其中流程中所有的配置都经过此类进行管理,进行调用获取,增强解析速度 - */ -public interface DatagramFactory { - - /** - * 初始化 - */ - List datagramInit(); - - /** - * 根据前导码配置匹配,模糊匹配获取所有的报文项 - */ - List match(); - - /** - * 根据前导码匹配,返回报文项 - */ - List filer(); - - /** - * 保证数据的唯一性选择器 - */ - List selectOne(); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java new file mode 100644 index 0000000..87444a0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java @@ -0,0 +1,18 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +import java.util.List; + +/** + * 直接用,还是边用边创建 + */ +public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { + + + public DefaultProtocolConfigFactory(ProtocolConfig protocolConfig) { + super(protocolConfig); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java new file mode 100644 index 0000000..cce0c7c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java @@ -0,0 +1,12 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; + +public class DefaultRuleFactory extends AbstractRuleConfigFactory { + + public DefaultRuleFactory(Long ruleId) { + super(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java deleted file mode 100644 index 9ee97e0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.casic.missiles.parser.instance; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service -@Slf4j -@AllArgsConstructor -public class GeneralProcessor { - - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; - - /** - * 统一固定字段解析=>进行规则的查询的判断 - * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 - * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 - */ - @Deprecated - public boolean parseWholeDatagram(ByteBuf buffer, ProtocolConfig protocolConfig) { - try { - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap,protocolId); - //选取规则对应的流程= - DatagramEventConfig datagramEventConfig = processorSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); - //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); - //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); - //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); - //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); - //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); - return true; - } catch (Exception ex) { - log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", - ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); - return false; - } - } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; - } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); - } - - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); - return bizDataMap; - } - - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java index 25e7ad8..6a5777e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java @@ -1,23 +1,31 @@ package com.casic.missiles.parser.instance.impl; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.mapper.DatagramEventMapper; import com.casic.missiles.pojo.DatagramEventConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.SpringContextUtil; -@Service -@AllArgsConstructor +import java.util.List; +import java.util.Optional; + +/** + * @author cz + * + */ public class DefaultProcessorInstanceSelector implements ProcessorInstanceSelector { - private final DatagramEventMapper datagramEventMapper; + private static List datagramEventConfigs; + + static { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + datagramEventConfigs = datagramEventRegistry.getDatagramEventList(); + } @Override public DatagramEventConfig getProcessorInstance(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("rule_id", protocolId); - return datagramEventMapper.selectOne(queryWrapper); + Optional optionalSelectInstance = datagramEventConfigs.stream() + .filter(e -> e.getId().equals(protocolId)).limit(1).findFirst(); + return optionalSelectInstance.isPresent() ? optionalSelectInstance.get() : null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a778671..7b56a43 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,16 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import io.netty.buffer.ByteBuf; /** - * 分析匹配情况 - * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 - * 2、匹配不成功,有后续帧,可以进行下次匹配。 - * 3、匹配不成功,无后续帧,可以进行丢弃。 + * 分析匹配情况 + * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 + * 2、匹配不成功,有后续帧,可以进行下次匹配。 + * 3、匹配不成功,无后续帧,可以进行丢弃。 */ -public interface FrameStructMatcher{ +public interface FrameStructMatcher { - ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig); + ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 05320ab..8ebea78 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,23 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.ProtocolConfigMapper; +import com.casic.missiles.parser.provider.ProtocolConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Component; import java.util.List; import java.util.stream.Collectors; -@Component -@AllArgsConstructor public class LeadingCodeMatcher { - private final ProtocolConfigMapper protocolMapper; - //** 1、首字母匹配前导码, // 2、以匹配出的前导码是否在报文中条件进行前导码的匹配二次筛选 - public List matchLeadingCode(String protocolContent){ + public static List matchFrameLeadingCode(String protocolContent){ List initialConfigs = initialMatch(protocolContent); List preCodeConfigs = initialConfigs.stream() .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) @@ -26,13 +19,16 @@ } //初始化匹配前导码内容 - private List initialMatch(String protocolContent) { - String protocolStr = protocolContent.charAt(0) + ""; - QueryWrapper queryWrapper = new QueryWrapper() - .likeRight("pre_fix", protocolStr); - List protocolConfigList = protocolMapper.selectList(queryWrapper); - return protocolConfigList; + private static List initialMatch(String protocolContent) { + String firstFrameChar = protocolContent.charAt(0) + ""; + ProtocolConfigProvider protocolConfigProvider=new ProtocolConfigProvider(firstFrameChar); + return protocolConfigProvider.getMatchList(); } + + + + + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index cf2113d..e915877 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -1,32 +1,35 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(0) -@Service +@Component public class FrameLengthMatcher implements FrameStructMatcher { - @Autowired - private FieldParser fieldParser; - //超过长度 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { String dataGramContent = ByteBufUtil.hexDump(byteBuf); - if (StringUtils.isEmpty(protocolConfig.getUnpackId()) && StringUtils.isEmpty(protocolConfig.getTailStr())) { - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + //当不存在结尾标志和拆包标志,可以直接使用长度进行匹配 + if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { if (dataGramContent.length() >= totalLength) {//等于长度返回true,超出长度,切断 - ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, protocolConfig, totalLength); + ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, totalLength); return wholeDatagramByte; } else { //读的标志位前移舍弃 @@ -38,7 +41,7 @@ return null; } - private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, Integer totalLength) { byteBuf.readBytes(totalLength); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, totalLength - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 2bfc213..d527ad0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; @@ -13,7 +13,7 @@ import lombok.AllArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.nio.charset.Charset; import java.util.Map; @@ -22,32 +22,30 @@ * 后续标志验证 */ @Order(1) -@Service +@Component @AllArgsConstructor -public class FrameMarkMatcher implements FrameStructMatcher { - - private final FieldConfigDao fieldConfigDao; - private final FieldParser fieldParser; - private final FieldResolver fieldResolverManger; +public class FrameMarkMatcher implements FrameStructMatcher, FixedPropertyEnum { //帧后续标志=>结束,进行帧的重组=>有后续,1、帧移位判别 2、继续接收帧 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig UnpackConfig = StringUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getUnpackId()); - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); - Integer upback = 0; + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); ByteBuf mergeWholeFrameByte = null; - if (!ObjectUtil.isEmpty(UnpackConfig)) { - while (hasNextFullFrame(byteBuf, protocolConfig)) { - upback = (Integer) fieldResolverManger.filedParserManger(byteBuf, UnpackConfig, null); + if (!ObjectUtil.isEmpty(unpackFlag)) { + while (hasNextFullFrame(byteBuf, protocolConfig, protocolFieldConfigProvider)) { //是否存在后续位 - if (upback == 1) {//使用esayRule + if (unpackFlag == 1) {//使用esayRule //表示可以截取 - mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolConfig, totalLength); + mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolFieldConfigProvider, protocolConfig); return mergeWholeFrameByte; } else { - byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig)); + byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig, protocolFieldConfigProvider)); } } } @@ -56,7 +54,8 @@ //选取第一个帧,将业务内容和后面部分分开 //计算数据报文-业务内容 - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolFieldConfigProvider protocolFieldConfigProvider, ProtocolConfig protocolConfig) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); //截取完整报文 byteBuf.readBytes(totalLength); ByteBuf byteBufContent = byteBuf.slice(0, byteBuf.readerIndex()); @@ -68,15 +67,15 @@ String tail = ""; System.out.println(ByteBufUtil.hexDump(byteBufContent)); //会存在多个帧拼接在一起的的情况,进行合并处理 - while (hasNextFullFrame(byteBufContent, protocolConfig)) { - Integer currentFrameLength = fieldParser.getTotalLength(protocolConfig, byteBufContent); + while (hasNextFullFrame(byteBufContent, protocolConfig, protocolFieldConfigProvider)) { + Integer currentFrameLength = protocolFieldConfigProvider.getTotalLength(byteBufContent, protocolConfig); byteBufContent.readBytes(currentFrameLength); ByteBuf currentbyteBuf = byteBufContent.slice(0, byteBufContent.readerIndex()); byteBufContent.markReaderIndex();//读的标志位前移 System.out.println(ByteBufUtil.hexDump(byteBufContent)); String hexDump = currentbyteBuf.toString(Charset.forName("ISO-8859-1")); //获取当前固定帧结构的关系map - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, currentbyteBuf); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(currentbyteBuf, protocolConfig); if (StringUtils.isEmpty(mergeFrameStr)) { //首次获取业务数据报文 mergeFrameStr += hexDump.substring(0, currentFrameFixedProperty.get("tailPosition")); @@ -95,22 +94,22 @@ /** * 获取平移到下一帧起始位置 */ - public int getNextFrameOffset(ByteBuf buffer, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, buffer); - return currentFrameFixedProperty.get("totalLength"); + public int getNextFrameOffset(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + return currentFrameFixedProperty.get(TOTAL_LENGTH); } /** * 判断是否出错进行整个帧的 */ - public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, byteBuf); + public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); //保证读取位置不在固定位置,是可变的业务内容 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("fixedPosition")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(FIXED_POSITION)) { return false; } //判断读取是否操作帧长度 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("totalLength")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(TOTAL_LENGTH)) { return false; } return true; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 76a3784..c3a1bab 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -1,50 +1,50 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.parser.instance.GeneralProcessor; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; +import io.netty.buffer.ByteBufUtil;; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(2) -@Service +@Component public class FrameTailMatcher implements FrameStructMatcher { - @Resource - private FieldConfigDao fieldConfigDao; - @Autowired - private GeneralProcessor generalProcessor; - //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig tailFieldConfig = StringUtils.isEmpty(protocolConfig.getTailStr()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getTailStr()); - if (!ObjectUtil.isEmpty(tailFieldConfig)) { - String tailStr = tailFieldConfig.getFieldName(); + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfig protocolFieldConfig = ObjectUtils.isEmpty(protocolConfig.getTailStr()) ? null : + fieldConfigProvider.getFieldConfigById(protocolConfig.getTailStr()); + if (!ObjectUtil.isEmpty(protocolFieldConfig)) { + String tailStr = protocolFieldConfig.getFieldName(); String dataGramContent = ByteBufUtil.hexDump(byteBuf); Boolean tailFlag = ByteBufUtil.hexDump(byteBuf).contains(tailStr); if (!tailFlag) { //使用esayRule return null; } else if (dataGramContent.indexOf(tailStr) < dataGramContent.length() - tailStr.length()) { Integer length = dataGramContent.indexOf(tailStr) + tailStr.length(); - ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, protocolConfig, length); + ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, length); return wholeDatagramByte; //存在粘包 } } return null; } - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer length) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, Integer length) { byteBuf.readBytes(length); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, length - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java new file mode 100644 index 0000000..5f1c177 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java @@ -0,0 +1,73 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.combined.GenericCombinedFieldResolver; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.CombinedFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class CombinedFieldConfigProvider { + + + /** + * 作为临时配置列表缓存使用 + */ + private final List combinedFieldConfigList; + private Map storeObjectMap = new HashMap<>(); + + public CombinedFieldConfigProvider(Long ruleId) { + CombinedFieldConfigRegistry combinedFieldConfigRegistry = SpringContextUtil.getBean(CombinedFieldConfigRegistry.class); + combinedFieldConfigList = combinedFieldConfigRegistry.getCombinedFieldConfigList(ruleId); + } + + public void parseDataField(RuleConfig ruleConfig, String clearZeroPlain,Map fieldConfigsMap ) { + if (showSkip()) { + return; + } + //匹配对应的数据,然后进行相关的字段解析 + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver(); + combinedFieldResolver.parseDataField(combinedFieldConfigList, byteBuf, storeObjectMap,fieldConfigsMap); + } + + + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getCombinedFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return combinedFieldConfigList.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public List getCombinedFieldConfigList() { + return combinedFieldConfigList; + } + + /* 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(combinedFieldConfigList) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java new file mode 100644 index 0000000..f3cfedc --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java @@ -0,0 +1,11 @@ +package com.casic.missiles.parser.provider; + +/** + * @author cz + * @date 2023-6-12 + */ +public class CommandEventProvider{ + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java new file mode 100644 index 0000000..70eec5e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java @@ -0,0 +1,77 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.safe.SafeStrategy; +import com.casic.missiles.parser.sender.DataSubscribeProvider; +import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class DatagramEventProvider { + + private final DatagramEventConfig processorInstance; + + public DatagramEventProvider(Long ruleId) { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + List datagramEventConfigList = + datagramEventRegistry.getDatagramEventList(ruleId); + processorInstance = this.getProcessorInstance(datagramEventConfigList); + } + + public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { + if (showSkip()) { + return null; + } + return datagramEventConfigList.get(0); + } + + // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 + public String getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap) { + String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? + processorInstance.getSafeBean() : + fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); + if (!StringUtils.isEmpty(safeName)) { + //需要加密 + SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); + String plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); + return clearComplementZero(plain); + } + return ByteBufUtil.hexDump(bizDataContent); + } + + //解密清零操作 + private String clearComplementZero(String plain) { + plain = plain.substring(0, plain.lastIndexOf("00")); + return plain; + } + + //数据发送,数据发送者暂未构建 + public void storeData(Map bizDataMap) { + DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); +// dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return ObjectUtils.isNotEmpty(processorInstance) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java new file mode 100644 index 0000000..7e1fe0a --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java @@ -0,0 +1,97 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.FieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class FieldConfigProvider { + + + private final List fieldConfigs; + private Map storeObjectMap = new HashMap<>(); +// private Map singleObjects = new ConcurrentHashMap<>(); + + public FieldConfigProvider(Long ruleId) { + FieldConfigRegistry fieldConfigRegistry = SpringContextUtil.getBean(FieldConfigRegistry.class); + fieldConfigs = fieldConfigRegistry.getFieldConfigList(ruleId); + } + + public List getFieldConfigs() { + return fieldConfigs; + } + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public Map parseDataField(RuleConfig ruleConfig, String clearZeroPlain) { + if (showSkip()) { + return null; + } + List prepareFieldConfig = prepareParseField(ruleConfig); + if (CollectionUtils.isNotEmpty(prepareFieldConfig)) { + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(fieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + return fixDataMap; + } + } + return null; + } + + /** + * 得到需要处理的业务内容 + * + * @return + */ + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return fieldConfigs.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public Map getFieldConfigsMap() { + return fieldConfigs.stream().collect( + Collectors.toMap(FieldConfig::getId, e -> e) + ); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(fieldConfigs) ? false : true; + } + + +} + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java new file mode 100644 index 0000000..817bfaf --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java @@ -0,0 +1,19 @@ +package com.casic.missiles.parser.provider; + +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.registry.FieldRuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; + +public class FieldRuleConfigProvider { + + private final List fieldRuleConfigList; + + public FieldRuleConfigProvider(Long ruleId) { + FieldRuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(FieldRuleConfigRegistry.class); + fieldRuleConfigList = ruleConfigRegistry.getFieldRuleConfigList(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java new file mode 100644 index 0000000..99a1b06 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java @@ -0,0 +1,53 @@ +package com.casic.missiles.parser.provider; + + +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.registry.ProtocolConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolConfigProvider { + + private final List protocolConfigList; + + public ProtocolConfigProvider(String firstChar) { + ProtocolConfigRegistry registry = SpringContextUtil.getBean(ProtocolConfigRegistry.class); + protocolConfigList = registry.getProtocolConfigList(firstChar); + } + + public List getMatchList() { + return protocolConfigList; + } + + /** + * 设置当前协议 + * + * @param protocolConfig + */ + public ProtocolConfigProvider(ProtocolConfig protocolConfig) { + List protocolConfigs = new ArrayList<>(); + protocolConfigs.add(protocolConfig); + protocolConfigList = protocolConfigs; + } + + /** + * 获取当前协议 + * + * @return + */ + public ProtocolConfig getCurrentProtocolConfig() { + if (this.protocolConfigList == null) { + return null; + } else { + return protocolConfigList.get(0); + } + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java new file mode 100644 index 0000000..043927d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java @@ -0,0 +1,213 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.registry.ProtocolFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolFieldConfigProvider { + + private static final String FIXED_FIELD_DS = "fixedFieldDs"; + private static final String CONTENT_FIELD_DS = "contentFieldDs"; + private static final String PROTOCOL_LENGTH = "protocolLength"; + private static final String PROTOCOL_FIELD_ID = "protocolFieldId"; + private static final String PROTOCOL_POSITION = "protocolPosition"; + + private final List protocolFieldConfigs; + private Map singleObjects = new ConcurrentHashMap<>(); + private Map storeObjectMap = new HashMap<>(); + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public ProtocolFieldConfigProvider(Long protocolId) { + ProtocolFieldConfigRegistry protocolFieldConfigRegistry = SpringContextUtil.getBean(ProtocolFieldConfigRegistry.class); + protocolFieldConfigs = protocolFieldConfigRegistry.getProtocolFieldConfigList(protocolId); + } + + public List getProtocolFieldConfigs() { + return protocolFieldConfigs; + } + + public ProtocolFieldConfig getFieldConfigById(Long fieldId) { + Optional optionalConfig = protocolFieldConfigs.stream().filter( + e -> e.getId().equals(fieldId) + ).findFirst(); + return optionalConfig.isPresent() ? optionalConfig.get() : null; + } + + public Integer getProtocolFieldValue(Long protocolFieldId, ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_FIELD_ID + protocolFieldId + ByteBufUtil.hexDump(byteBuf); + //获取缓存 + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + //加载固定长度数据集合 + Map fixDataMap = this.getProtocolDataMap(byteBuf); + ProtocolFieldConfig protocolFieldConfig = selectFieldConfig(protocolFieldId); + Integer protocolFieldValue = 0; + //获取约定字段的总长度 + if (fixDataMap.containsKey(protocolFieldConfig.getFieldName())) { + Object appointUnpackObject = fixDataMap.get(protocolFieldConfig.getFieldName()); + if (ObjectUtils.isNotEmpty(appointUnpackObject)) { + protocolFieldValue = (Integer) appointUnpackObject; + } + } + if (protocolFieldValue != null) { + //加入缓存 + if (ObjectUtils.isNotEmpty(protocolFieldValue)) { + this.singleObjects.put(catchKey, protocolFieldValue); + return protocolFieldValue; + } + } + return null; + } + + /** + * 获取帧固定位置信息 + * + * @param byteBuf + * @param protocolConfig + * @return + */ + public Map getFixedProperty(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_POSITION + protocolConfig.getId(); + if (this.singleObjects.containsKey(catchKey)) { + return (Map) singleObjects.get(catchKey); + } + Map fixedPropertyMap = new HashMap<>(); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + fixedPropertyMap = fieldParser.doGetFixedProperty(protocolFieldConfigs, this.getTotalLength(byteBuf,protocolConfig)); + if (CollectionUtils.isNotEmpty(fixedPropertyMap)) { + this.singleObjects.put(catchKey, fixedPropertyMap); + return fixedPropertyMap; + } + return fixedPropertyMap; + } + + /** + * 获取帧结构应有的总长度 + */ + public Integer getTotalLength(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_LENGTH + ByteBufUtil.hexDump(byteBuf); + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + Integer appointFrameLength = getProtocolFieldValue(protocolConfig.getTotalLengthId(), byteBuf); + if (appointFrameLength != null) { + //获取过滤的字段集合总长度 + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Integer totalFilterLength = fieldParser.getTotalFilterLength(protocolConfig, byteBuf, getFixFieldConfigMap()); + //计算总长度 + Integer totalLength = appointFrameLength + totalFilterLength; + //加入缓存 + if (ObjectUtils.isNotEmpty(totalLength)) { + this.singleObjects.put(catchKey, totalLength); + return totalLength; + } + } + return null; + } + + /** + * 获取协议有关字段解析内容 + * storeObjectMap存储代转存的数据 + * + * @return + */ + public Map getProtocolDataMap(ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(FIXED_FIELD_DS)) { + return (Map) singleObjects.get(FIXED_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(protocolFieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + this.singleObjects.put(FIXED_FIELD_DS, fixDataMap); + return fixDataMap; + } + return null; + } + + /** + * 获取业务报文内容的content字节 + * + * @param wholeDatagramByte + * @return + */ + public ByteBuf getDataContentBuf(ByteBuf wholeDatagramByte) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(CONTENT_FIELD_DS)) { + return (ByteBuf) singleObjects.get(CONTENT_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + ByteBuf bizDataByteBuf = fieldParser.getDataContentBuf(protocolFieldConfigs, wholeDatagramByte); + if (bizDataByteBuf != null) { + this.singleObjects.put(CONTENT_FIELD_DS, bizDataByteBuf); + return bizDataByteBuf; + } + return null; + } + + + private ProtocolFieldConfig selectFieldConfig(Long id) { + Optional optionalProtocolFieldConfig = this.protocolFieldConfigs.stream().filter( + e -> e.getId().equals(id) + ).findFirst(); + return optionalProtocolFieldConfig.isPresent() ? optionalProtocolFieldConfig.get() : null; + } + + + private Map getFixFieldConfigMap() { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, e -> e) + ); + return fixDataFieldMap; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(protocolFieldConfigs) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java new file mode 100644 index 0000000..dafba1c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java @@ -0,0 +1,56 @@ +package com.casic.missiles.parser.provider; + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.rule.GenericRuleResolver; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.RuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleConfigProvider { + + private final List ruleConfigs; + + public List getRuleConfigs() { + return ruleConfigs; + } + + public RuleConfigProvider(Long protocolId) { + RuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(RuleConfigRegistry.class); + ruleConfigs = ruleConfigRegistry.getRuleConfigById(protocolId); + } + + /** + * 获取规则匹配结果 + * + * @param parseFixedDataMap + * @param protocolFieldConfigs + * @return + */ + public RuleConfig doGetRule(Map parseFixedDataMap, + String ids, + List protocolFieldConfigs) { + if (showSkip()) { + return null; + } + RuleConfig ruleConfig = GenericRuleResolver.machRule(parseFixedDataMap, ids, protocolFieldConfigs, ruleConfigs); + return ruleConfig; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(ruleConfigs) ? false : true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java index 3c05891..856b399 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java @@ -1,18 +1,11 @@ package com.casic.missiles.parser.resolver; -import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.springframework.web.bind.annotation.RequestBody; -import javax.annotation.Resource; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -20,19 +13,17 @@ @Slf4j public class ByteMergeProvider { - @Resource - private FieldRuleEngineMapper fieldRuleEngineMapper; - //拿到所有的值合并到一个值 - public String resolveByteMerge(List valueList, String ruletypeId, String vaildRange) { + public static String resolveByteMerge(List valueList, String ruleTypeId, String vaildRange) { String values = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Map vaildMap = getValidRangeMap(vaildRange); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(ruletypeId); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } + //暂时不处理 +// fieldRuleEngine = fieldRuleConfigMapper.selectById(ruleTypeId); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } Map env2 = new HashMap(); for (int i = 0; i < valueList.size(); i++) { if (vaildMap.containsKey(i)) { @@ -47,7 +38,7 @@ } } - private Map getValidRangeMap(String vaildRange) { + private static Map getValidRangeMap(String vaildRange) { String[] range = vaildRange.split(","); Map vaildMap = new HashMap(); for (int i = 0; i < range.length; i++) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 8d821cd..85d6bbf 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -1,9 +1,12 @@ package com.casic.missiles.parser.resolver; +import com.casic.missiles.pojo.AbstractFieldConfig; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; import io.netty.buffer.ByteBuf; +import java.util.List; import java.util.Map; /** @@ -11,18 +14,14 @@ */ public interface FieldParser { -// Map fieldProcess(String protocolContent,); - Map dataParser(RuleConfig ruleConfig, String lightText,String protocolId); + Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength); - Map fixDataParser(String protocolId, ByteBuf buffer); + Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap); - Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf); + ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer); - ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer); - - ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer); - - Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer); + Integer getTotalFilterLength(ProtocolConfig protocolConfig, ByteBuf byteBuf, Map protocolFieldConfigMap); } + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java new file mode 100644 index 0000000..9e0c00e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java @@ -0,0 +1,52 @@ +package com.casic.missiles.parser.resolver; + +import com.casic.missiles.pojo.AbstractFieldConfig; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.util.List; + +public class FieldParserSupport { + + //分别计算bit和byte长度=> 合并长度 + protected Integer calculateLength(List fieldConfigList) { + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + Integer fixedLength = bytefixedLength + bitfixedLength / 8; + return fixedLength; + } + + //找到最大值=> 根据最大值计算业务数据下标 + protected Integer calculatePosition(List fieldConfigList) { + String rex = "[0-9]+"; + Integer max = -1; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) + && Integer.valueOf(fieldConfig.getOriginPositionByte()) > max) { + max = Integer.valueOf(fieldConfig.getOriginPositionByte()); + } + } + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) && fieldConfig.getOriginPositionByte().equals(max)) { + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + } + } + Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; + return maxFixedPosition; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java deleted file mode 100644 index dd3a6cd..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java +++ /dev/null @@ -1,170 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.ByteResolverParam; -import io.netty.buffer.ByteBuf; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -/** - * 字段解析管理总类 - */ -@Service -@Slf4j -@AllArgsConstructor -public class FieldResolver extends ByteMergeProvider { - - //1、字段截取 => 2、简单的字节解析和复杂的字节解析 - public Object filedParserManger(ByteBuf byteBuf, FieldConfig fieldConfig, Integer maxFixedPosition) { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - //最大固定位置不为空, - if (!ObjectUtil.isEmpty(maxFixedPosition)) { - orignPosition -= maxFixedPosition; - } - Object fieldValue = 0; - //待优化 - if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { - fieldValue = bitToResolver(byteBuf, fieldConfig); - } else { - ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); - fieldValue = parsingFields(fieldBytes, fieldConfig.getRuleJson()); - } - return fieldValue; - } - - //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, - //目前默认配置的规则设置暂不支持配置化,由实现完成 - private Object parsingFields(ByteBuf byteBuf, String ruleJson) { - Object fieldsResolveValue = null; - List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); - if (ObjectUtil.isEmpty(ruleMapList)) { - fieldsResolveValue = defaultResolveBuilder(byteBuf); - } else { - fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); - } - return fieldsResolveValue; - } - - private Object defaultResolveBuilder(ByteBuf byteBuf) { - Integer defaultResolveValue = 0; - for (int i = 0; i < byteBuf.writerIndex(); i++) { - defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; - } - return defaultResolveValue; - } - - //字段解析构建器(针对字节单位的) - //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 - // 字节归并结束或者规则结束=>继续根据规则进行判断 - private Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { - Object customizeResolveValue = null; - try { - List bytStrList = new ArrayList<>(); - //存放到数组里面 - for (int i = 0; i < byteBuf.writerIndex(); i++) { - bytStrList.add(byteBuf.readByte()); - } - int i = 0; - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - customizeResolveValue = this.resolveByteMerge(bytStrList, ruletypeId,vaildRange); - break; - } else { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - List tempBytStr = new ArrayList<>(); - for (int k = 0; i < bytStrList.size(); i++) { - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(k) - .value(bytStrList.get(k)) - .ruletypeId(ruletypeId).build(); - tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); - } - bytStrList = tempBytStr; - } - i++; - } - //字节归并到一起=>继续根据规则进行判断 - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(customizeResolveValue) - .ruletypeId(ruletypeId).build(); - customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(customizeResolveValue)); - return customizeResolveValue; - } catch (RuntimeException ex) { - log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); - return null; - } - } - - /** - * 1、单个字节情况表示字段 - * 2、多字节情况表示字段(暂未处理) - */ - private Object bitToResolver(ByteBuf byteBuf, FieldConfig fieldConfig) { - Object fieldValue = new Object(); - try { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - byte fields = 0x00; - if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); - } else { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); - } - - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { - if (!StringUtils.isEmpty(fieldConfig.getExactOrignPosition())) { - fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getExactOrignPosition())).byteValue() - >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); - } else { - fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); - } - } else { - fieldValue = Integer.valueOf(fields & 0xff); - } - if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { - return fieldValue; - } - List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); - int i = 0; - //字节归并到一起=>继续根据规则进行判断 - while (i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(fieldValue) - .ruletypeId(ruletypeId).build(); - fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(fieldValue)); - return fieldValue; - } catch (RuntimeException ex) { - log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); - return null; - } - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java new file mode 100644 index 0000000..1d2aeab --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java @@ -0,0 +1,36 @@ +package com.casic.missiles.parser.resolver.bytes; + +import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.mapper.FieldRuleConfigMapper; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.pojo.ByteResolverParam; +import com.googlecode.aviator.AviatorEvaluator; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; +//转换规则 +@Component("convert") +@AllArgsConstructor +@Slf4j +public class ByteRuleResolver implements ByteResolver { + + private final FieldRuleConfigMapper fieldRuleConfigMapper; + + @Override + public Object resolveOperationRule(ByteResolverParam byteResolverParam){ + FieldRuleConfig fieldRuleEngine=fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); + if(ObjectUtil.isEmpty(fieldRuleEngine)){ + return byteResolverParam.getValue(); + } + String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); + Map env2 = new HashMap(); + env2.put("value", (byte) byteResolverParam.getValue()); + String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); + return values; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java index 103821c..786b71c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java @@ -2,34 +2,34 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("logicalShift") +@Component("logicalShift") @AllArgsConstructor @Slf4j public class LogicalShiftResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //字节位移 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { Integer index = byteResolverParam.getIndex(); - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return byteResolverParam.getValue(); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java index 476747d..01149bd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("operation") +@Component("operation") @AllArgsConstructor @Slf4j public class OperationResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //混合运算,有常量或者乘除的缩放 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java index 0b82cf4..79abcce 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.casic.missiles.pojo.ByteResolverParam; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; //精度计算 -@Service("precision") +@Component("precision") @AllArgsConstructor @Slf4j public class PrecisionResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java deleted file mode 100644 index 5c3f332..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; -//转换规则 -@Service("convert") -@AllArgsConstructor -@Slf4j -public class RuleResolver implements ByteResolver { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam){ - RuleEvaluator fieldRuleEngine=fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); - if(ObjectUtil.isEmpty(fieldRuleEngine)){ - return byteResolverParam.getValue(); - } - String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); - Map env2 = new HashMap(); - env2.put("value", (byte) byteResolverParam.getValue()); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java new file mode 100644 index 0000000..d3bbd91 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java @@ -0,0 +1,15 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; + +import java.util.List; +import java.util.Map; +// 前导码匹配->长度字段 +public interface AbstractCombinedFieldProcessor { + + Map invoke(Map map, ByteBuf byteBuf, List combinedFieldConfigList, + Map fieldConfigsMap, Map storeObjectMap); + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java new file mode 100644 index 0000000..03c8480 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java @@ -0,0 +1,59 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-13 + */ +//依次递增进行数据的解析, +public class GenericCombinedFieldResolver { + + + //通过查询,字段长度长度随机 + public void parseDataField(List combinedFieldConfigList, ByteBuf byteBuf, + Map storeObjectMap, Map fieldConfigsMap) { + Integer frameLength = Integer.valueOf(ByteBufUtil.hexDump(byteBuf)); + //添加前置处理器 + com.casic.missiles.util.ClassUtil classUtil = new com.casic.missiles.util.ClassUtil(); + List abstractCombinedProcessors = classUtil.getSubClassList(AbstractCombinedFieldProcessor.class); + + Map fieldFixedMap = combinedFieldLeadCodeMap(combinedFieldConfigList); + //frameLength + Map combinedProcessorFields = null; + while (byteBuf.readableBytes() < frameLength) { + //一直处理 + for (AbstractCombinedFieldProcessor abstractCombinedProcessor : abstractCombinedProcessors) { + combinedProcessorFields = abstractCombinedProcessor.invoke(combinedProcessorFields, byteBuf, + combinedFieldConfigList, + fieldConfigsMap, storeObjectMap); + if (combinedProcessorFields == null || byteBuf.readableBytes() < frameLength) { + return; + } + } + + } + } + + /** + * 取出前导码匹配集合 + */ + private Map combinedFieldLeadCodeMap(List combinedFieldConfigList) { + Map fieldFixedMap = combinedFieldConfigList + .stream() + .collect(Collectors.toMap(CombinedFieldConfig::getPrefixCode, e -> e)); + return fieldFixedMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java new file mode 100644 index 0000000..643a934 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java @@ -0,0 +1,100 @@ +package com.casic.missiles.parser.resolver.fields; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.FieldParserSupport; +import com.casic.missiles.pojo.*; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 保存使用时最基本的信息,并且使用原型模式 + */ +@Slf4j +public class DefaultProtocolFieldParser extends FieldParserSupport implements FieldParser, FixedPropertyEnum { + + //通过传入的配置和报文进行字段解析 + @Override + public Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap) { + Map dataMap = new HashMap<>(); + for (AbstractFieldConfig protocolFieldConfig : protocolFieldConfigs) { + if (!ObjectUtils.isEmpty(protocolFieldConfig.getOriginPositionByte())) { + Object fieldValue = FieldResolver.parseField(buffer, protocolFieldConfig, null); + if (protocolFieldConfig.getIsStorage() == 1) { + storeObjectMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + dataMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + } + return dataMap; + } + + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength) { + Map fixedPropertyMap = new HashMap<>(); + Integer fixedLength = calculateLength(protocolFieldConfigs); + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + fixedPropertyMap.put(FIXED_POSITION, maxFixedPosition); + fixedPropertyMap.put(TOTAL_LENGTH, totalLength); + fixedPropertyMap.put(TAIL_POSITION, totalLength - fixedLength + maxFixedPosition); + return fixedPropertyMap; + } + + //** 获取业务内容的byteBuf + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer) { + //计算固定长度 + Integer fixedLength = calculateLength(protocolFieldConfigs); + //总长度获取 + String lightText = buffer.toString(Charset.forName("ISO-8859-1")); + Integer totalLength = lightText.length(); + //计算固定长度最大长度 + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + //计算数据报文内容 + ByteBuf bizDataFields = buffer.slice(maxFixedPosition - 1, (totalLength - fixedLength)); + return bizDataFields; + } + + /** + * 获取过滤字段的长度 + */ + @Override + public Integer getTotalFilterLength(ProtocolConfig protocolConfig, + ByteBuf byteBuf, + Map protocolFieldConfigMap) { + if (ByteBufUtil.hexDump(byteBuf).equals("")) { + return 0; + } + int totalFilterLength = 0; + String filterFields = protocolConfig.getTotalLengthFilterFields(); + try { + if (!StringUtils.isEmpty(filterFields)) { + String[] filterFieldList = filterFields.split(","); + for (String filterFieldId : filterFieldList) { + if (StringUtils.isNotEmpty(filterFieldId)) { + ProtocolFieldConfig fieldConfig = protocolFieldConfigMap.get(Long.valueOf(filterFieldId)); + //这里都是按字节计算,没有对位进行区分,可能会出现错误 + // 如果对位有需求,需要进一步跟进 + totalFilterLength += fieldConfig.getOffsetLength(); + } + } + } + return totalFilterLength; + } catch (Exception ex) { + log.error("报文确认分发阶段,获取报文总长度过滤长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); + } + return totalFilterLength; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java new file mode 100644 index 0000000..d51e887 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java @@ -0,0 +1,169 @@ +package com.casic.missiles.parser.resolver.fields; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.parser.resolver.ByteMergeProvider; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.AbstractFieldConfig; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.pojo.ByteResolverParam; +import io.netty.buffer.ByteBuf; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * 字段解析管理总类 + */ +@Slf4j +public class FieldResolver extends ByteMergeProvider { + + //1、字段截取 => 2、简单的字节解析和复杂的字节解析 + public static Object parseField(ByteBuf byteBuf,AbstractFieldConfig fieldConfig, Integer maxFixedPosition) { + Integer orignPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + //最大固定位置不为空, + if (!ObjectUtil.isEmpty(maxFixedPosition)) { + orignPosition -= maxFixedPosition; + } + Object fieldValue = 0; + //待优化 + if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { + fieldValue = doParseBitField(byteBuf, fieldConfig); + } else { + ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); + fieldValue = doParseByteField(fieldBytes, fieldConfig.getRuleJson()); + } + return fieldValue; + } + + //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, + //目前默认配置的规则设置暂不支持配置化,由实现完成 + private static Object doParseByteField(ByteBuf byteBuf, String ruleJson) { + Object fieldsResolveValue = null; + List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); + if (ObjectUtil.isEmpty(ruleMapList)) { + fieldsResolveValue = defaultResolveBuilder(byteBuf); + } else { + fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); + } + return fieldsResolveValue; + } + + private static Object defaultResolveBuilder(ByteBuf byteBuf) { + Integer defaultResolveValue = 0; + for (int i = 0; i < byteBuf.writerIndex(); i++) { + defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; + } + return defaultResolveValue; + } + + //字段解析构建器(针对字节单位的) + //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 + // 字节归并结束或者规则结束=>继续根据规则进行判断 + private static Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { + Object customizeResolveValue = null; + try { + List bytStrList = new ArrayList<>(); + //存放到数组里面 + for (int i = 0; i < byteBuf.writerIndex(); i++) { + bytStrList.add(byteBuf.readByte()); + } + int i = 0; + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { + if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + customizeResolveValue = resolveByteMerge(bytStrList, ruletypeId, vaildRange); + break; + } else { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + List tempBytStr = new ArrayList<>(); + for (int k = 0; i < bytStrList.size(); i++) { + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(k) + .value(bytStrList.get(k)) + .ruletypeId(ruletypeId).build(); + tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); + } + bytStrList = tempBytStr; + } + i++; + } + //字节归并到一起=>继续根据规则进行判断 + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(null) + .value(customizeResolveValue) + .ruletypeId(ruletypeId).build(); + customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); + i++; + } + System.out.println(JSON.toJSON(customizeResolveValue)); + return customizeResolveValue; + } catch (RuntimeException ex) { + log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); + return null; + } + } + + /** + * 1、单个字节情况表示字段 + * 2、多字节情况表示字段(暂未处理) + */ + private static Object doParseBitField(ByteBuf byteBuf,AbstractFieldConfig fieldConfig) { + Object fieldValue = new Object(); + try { + Integer orignPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + byte fields = 0x00; + if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { + fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); + } else { + fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); + } + + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { + if (!StringUtils.isEmpty(fieldConfig.getOriginPositionBit())) { + fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getOriginPositionBit())).byteValue() + >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); + } else { + fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); + } + } else { + fieldValue = Integer.valueOf(fields & 0xff); + } + if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { + return fieldValue; + } + List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); + int i = 0; + //字节归并到一起=>继续根据规则进行判断 + while (i < ruleMapList.size()) { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(null) + .value(fieldValue) + .ruletypeId(ruletypeId).build(); + fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); + i++; + } + System.out.println(JSON.toJSON(fieldValue)); + return fieldValue; + } catch (RuntimeException ex) { + log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); + return null; + } + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java deleted file mode 100644 index 35ae3d0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java +++ /dev/null @@ -1,183 +0,0 @@ -package com.casic.missiles.parser.resolver.fields; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufAllocator; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; -import org.springframework.util.ObjectUtils; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service("standard") -@AllArgsConstructor -@Slf4j -public class StandardFieldParser implements FieldParser { - - private final FieldConfigDao fieldConfigDao; - private final FieldResolver fieldResolver; - - //数据解析 - @Override - public Map dataParser(RuleConfig ruleConfig, String lightText, String protocolId) { - String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); - ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); - bufferContent.writeBytes(lightText.getBytes(Charset.forName("ISO-8859-1"))); - Map dataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - for (String dataFieldId : dataFieldIds) { - FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(dataFieldId); - if (!ObjectUtils.isEmpty(fieldConfig)) { - dataMap.put(fieldConfig.getFieldName(), String.valueOf(fieldResolver.filedParserManger(bufferContent, fieldConfig, maxFixedPosition))); - } - } - return dataMap; - } - - //数据解析 - @Override - public Map fixDataParser(String protocolId, ByteBuf buffer) { - List dataFieldIdList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Map dataMap = new HashMap<>(); - for (FieldConfig dataField : dataFieldIdList) { - if (!ObjectUtils.isEmpty(dataField.getOrignPosition())) { - Object fieldValue = (Integer) fieldResolver.filedParserManger(buffer, dataField, null); - dataMap.put(dataField.getFieldName(), fieldValue); - } - } - return dataMap; - } - - @Override - public Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf) { - if (ByteBufUtil.hexDump(byteBuf).equals("")) { - return 0; - } - String filterFields = protocolConfig.getTotalLengthFilterField(); - Integer totalLength = 0; - try { - FieldConfig totalFieldConfig = fieldConfigDao.getFieldConfigById(protocolConfig.getTotalLengthId()); - int totalFilterLength = 0; - if (!StringUtils.isEmpty(filterFields)) { - String[] filterFieldList = filterFields.split(","); - for (String filterField : filterFieldList) { - FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(filterField); - //这里都是按字节计算,没有对位进行区分,可能会出现错误 - - // 如果对位有需求,需要进一步跟进 - totalFilterLength += fieldConfig.getOffsetLength(); - } - } - totalLength = (Integer) fieldResolver.filedParserManger(byteBuf, totalFieldConfig, null) + totalFilterLength; - } catch (Exception ex) { - log.error("报文确认分发阶段,获取报文总长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); - } - return totalLength; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer) { - //业务内容 - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - String protocolId = String.valueOf(protocolConfig.getId()); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - //计算固定长度 - Integer fixedLength = calculateLength(fieldConfigList); -// Integer totalLength = this.getTotalLength(protocolConfig, buffer); - //总长度获取 - Integer totalLength = lightText.length(); - //计算固定长度最大长度 - Integer maxFixedPosition = calculatePosition(fieldConfigList); -// buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - //计算数据报文内容 - ByteBuf bizDataFields = buffer.slice(maxFixedPosition-1, (totalLength - fixedLength)); - return bizDataFields; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer) { - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - String protocolId = String.valueOf(protocolConfig.getId()); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer fixedLength = calculateLength(fieldConfigList); -// Integer totalLength = this.getTotalLength(protocolConfig, buffer); - Integer totalLength = lightText.length(); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - ByteBuf fixDataFields = buffer.slice(0, maxFixedPosition); - return fixDataFields; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer) { - String protocolId = String.valueOf(protocolConfig.getId()); - Map fixedPropertyMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer fixedLength = calculateLength(fieldConfigList); - Integer totalLength = this.getTotalLength(protocolConfig, buffer); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - fixedPropertyMap.put("fixedPosition", maxFixedPosition); - fixedPropertyMap.put("totalLength", totalLength); - fixedPropertyMap.put("tailPosition", totalLength - fixedLength + maxFixedPosition); - return fixedPropertyMap; - } - - //分别计算bit和byte长度=> 合并长度 - private Integer calculateLength(List fieldConfigList) { - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (FieldConfig fieldConfig : fieldConfigList) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - Integer fixedLength = bytefixedLength + bitfixedLength / 8; - return fixedLength; - } - - //找到最大值=> 根据最大值计算业务数据下标 - private Integer calculatePosition(List fieldConfigList) { - String rex = "[0-9]+"; - Integer max = -1; - for (FieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOrignPosition()) - && Integer.valueOf(fieldConfig.getOrignPosition()) > max) { - max = Integer.valueOf(fieldConfig.getOrignPosition()); - } - } - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (FieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOrignPosition()) && fieldConfig.getOrignPosition().equals(max)) { - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - } - } - Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; - return maxFixedPosition; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java new file mode 100644 index 0000000..d4ec6c7 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java @@ -0,0 +1,76 @@ +package com.casic.missiles.parser.rule; + +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import org.apache.commons.lang3.StringUtils; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class GenericRuleResolver { + + //根据前置字段的值,找到指定的规则 + //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 + //=>循环判断=>通过规则得到业务字段 + public static RuleConfig machRule(Map fixDataMap, + String ids, + List protocolFieldConfigs, + List ruleConfigs) { + List preRuleConfigList = getPreRuleList(ids, protocolFieldConfigs); + //获取前置规则字段 + final Map metaDataMap = getPreRuleFields(preRuleConfigList, fixDataMap); + //准备固定的字段集合 + Map fixDataFieldMap = getFixDataFieldMap(protocolFieldConfigs); + return RuleResolverCore.doMachRule(ruleConfigs, metaDataMap, fixDataMap, fixDataFieldMap); + } + + private static Map getFixDataFieldMap(List protocolFieldConfigs) { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, ProtocolFieldConfig::getFieldName) + ); + return fixDataFieldMap; + } + + + /** + * 查询前置规则的字段配置 + * + * @param ids + * @return + */ + private static List getPreRuleList(String ids, List protocolFieldConfigs) { + String[] idList = ids.split(","); + Map prepareMaps = new HashMap<>(); + for (String id : idList) { + if (StringUtils.isNotEmpty(id)) { + prepareMaps.put(Long.valueOf(id), ""); + } + } + List preRuleConfigList = protocolFieldConfigs + .stream() + .filter(e -> prepareMaps.containsKey(e.getId())) + .collect(Collectors.toList()); + return preRuleConfigList; + } + + /** + * 获取前置规则解析字段 + */ + private static Map getPreRuleFields(List preRuleFieldConfigList, Map fixDataMap) { + Map ruleFieldMap = new HashMap<>(); + preRuleFieldConfigList.stream() + .forEach( + preRuleFieldConfig -> { + String fieldName = preRuleFieldConfig.getFieldName(); + if (fixDataMap.containsKey(fieldName)) { + ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); + } + } + ); + return ruleFieldMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java new file mode 100644 index 0000000..baae7e8 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -0,0 +1,68 @@ +package com.casic.missiles.parser.rule; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.casic.missiles.pojo.RuleConfig; + +import java.util.*; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleResolverCore { + + + public static RuleConfig doMachRule(List ruleConfigList, Map metaDataMap, + Map fixDataMap, + Map fixDataFieldMap) { + Optional ruleConfigOptional = ruleConfigList.stream() + .filter(ruleConfig -> machRuleConfig( + JSON.parseObject(ruleConfig.getMatchRuleJson(), Map.class), metaDataMap)) + .findFirst(); + if (ObjectUtil.isEmpty(ruleConfigOptional)) { + return null; + } + String[] ruleFields = ruleConfigOptional.get().getDataFieldIds().split(","); + Map ruleMetaDataMap = getRuleFields(ruleFields, fixDataMap, fixDataFieldMap); + //递归选定解析规则,进行规则解析 + if (!ruleConfigOptional.get().getIsFinishMatch().equals("1")) { + //递归选定规则 + doMachRule(ruleConfigList, ruleMetaDataMap, fixDataMap, fixDataFieldMap); + } + return ruleConfigOptional.get(); + } + + + private static Map getRuleFields(String[] preRuleConfigList, Map fixedDataMap, + Map fixedFieldMap) { + Map ruleFieldMap = new HashMap<>(); + for (String preRuleConfigId : preRuleConfigList) { + String fieldName = fixedFieldMap.get(preRuleConfigId); + if (fixedDataMap.containsKey(fieldName)) { + ruleFieldMap.put(fieldName, String.valueOf(fixedDataMap.get(fieldName))); + } + } + return ruleFieldMap; + } + + + //匹配规则配置 + private static Boolean machRuleConfig(Map ruleMap, Map metaDataMap) { + if (ruleMap == null || metaDataMap == null) { + return null; + } + //所有的字段在规则里面必须有有配置 + for (String key : metaDataMap.keySet()) { + if (ruleMap.containsKey(key)) { + if (!ruleMap.get(key).equals(metaDataMap.get(key))) { + return false; + } + } else { + return false; + } + } + return true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java deleted file mode 100644 index 664088d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java +++ /dev/null @@ -1,92 +0,0 @@ -package com.casic.missiles.parser.rule; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.mapper.dao.PreRuleConfigDao; -import com.casic.missiles.mapper.dao.RuleConfigDao; -import lombok.AllArgsConstructor; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.*; -import java.util.stream.Collectors; - -@Service -@AllArgsConstructor -public class RulerProvider { - - private final FieldConfigDao fieldConfigDao; - private final PreRuleConfigDao preRuleConfigDao; - private final RuleConfigDao ruleConfigDao; - - //根据前置字段的值,找到指定的规则 - //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 - //=>循环判断=>通过规则得到业务字段 - public RuleConfig ruleConfig(Map fixDataMap, String protocolId) { - //批量获取规则 - List preRuleConfigList = preRuleConfigDao.getPreRuleList(protocolId); - //获取固定字段 - Map fixFieldMap = getAllFieldMap(protocolId); - //获取前置规则字段 - final String preRuleFields = getPreRuleFields(preRuleConfigList, fixDataMap, fixFieldMap); - List ruleConfigList = ruleConfigDao.getRuleConfigById(protocolId); - Optional ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig ->preRuleFields.equals( ruleConfig.getParseRuleJson())).findFirst(); - //递归选定解析规则,进行规则解析 - while (!ObjectUtil.isEmpty(ruleConfigOptional) && !ruleConfigOptional.get().getIsBizField().equals("1")) { - String ruleFields = getRuleFields(ruleConfigOptional.get().getDataFieldIds().split(","), fixDataMap, fixFieldMap); - ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig -> ruleConfig.getParseRuleJson().equals(ruleFields)).findFirst(); - } - return ruleConfigOptional.get(); - } - - /** - * 获取前置规则解析字段 - */ - private String getPreRuleFields(List preRuleConfigList, Map fixDataMap, Map fixFieldMap) { - Map ruleFieldMap= new HashMap<>(); - preRuleConfigList.stream() - .forEach( - preRuleConfig -> { - String fieldName = fixFieldMap.get(Long.valueOf(preRuleConfig.getRuleFieldId())); - if (fixDataMap.containsKey(fieldName)) { - ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); - } - } - ); - return JSONObject.toJSONString(ruleFieldMap); - } - - private Map getAllFieldMap(String protocolId) { - List fieldList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Map fixFieldMap = fieldList.stream().collect( - Collectors.toMap(FieldConfig::getId, FieldConfig::getFieldName) - ); - return fixFieldMap; - } - - private String getRuleFields(String[] preRuleConfigList, Map fixDataMap, Map fixFieldMap) { - Map ruleFieldMap= new HashMap<>(); - for (String preRuleConfigId : preRuleConfigList) { - String fieldName = fixFieldMap.get(preRuleConfigId); - if (fixDataMap.containsKey(fieldName)) { - ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); - } - } - return JSONObject.toJSONString(ruleFieldMap); - } - - //弃置 - private String ListToString(List ruleFieldList) { - String ruleFields = ""; - for (String ruleField : ruleFieldList) { - ruleFields += ruleField + ","; - } - ruleFields = StringUtils.isEmpty(ruleFields) ? ruleFields : ruleFields.substring(0, ruleFields.length() - 1); - return ruleFields; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java index 6177e10..bfa87a5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java @@ -2,7 +2,7 @@ public interface SafeStrategy { - String decryption(byte[] bytes); + String decryption(String cipher); String encryption(String lightText); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java index 618716c..6236302 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java @@ -9,9 +9,9 @@ //十六进制的字符串转换成字节数组 byte[] bytes = hexStrToBinaryStr(msg); //计算CRC8 - byte crc8 = CRC8(bytes, 0, bytes.length); - String crc8ToStr = "" + Integer.toHexString(0xff & crc8); - return crc8ToStr; +// String crc8ToStr = "" + Integer.toHexString(0xff & crc8); +// return crc8ToStr; + return null; } /** @@ -33,50 +33,5 @@ return bytes; } - /** - * CRC8 校验 多项式 x8+x2+x+1 - * - * @param b - * @param off - * @param len - * @return - */ - public static byte CRC8(final byte[] b, final int off, final int len) { - byte result = 0x00; - for (int i = 0; i < len; i++) { - result = CHECKSUM_TABLE[(result ^ (b[i + off] & 0xFF)) & 0xFF]; - } - return (byte) (result & 0xFFL); - } - - private final static byte[] CHECKSUM_TABLE = {(byte) 0x00, (byte) 0x07, (byte) 0x0e, (byte) 0x09, (byte) 0x1c, (byte) 0x1b, - (byte) 0x12, (byte) 0x15, (byte) 0x38, (byte) 0x3f, (byte) 0x36, (byte) 0x31, (byte) 0x24, (byte) 0x23, (byte) 0x2a, - (byte) 0x2d, (byte) 0x70, (byte) 0x77, (byte) 0x7e, (byte) 0x79, (byte) 0x6c, (byte) 0x6b, (byte) 0x62, (byte) 0x65, - (byte) 0x48, (byte) 0x4f, (byte) 0x46, (byte) 0x41, (byte) 0x54, (byte) 0x53, (byte) 0x5a, (byte) 0x5d, (byte) 0xe0, - (byte) 0xe7, (byte) 0xee, (byte) 0xe9, (byte) 0xfc, (byte) 0xfb, (byte) 0xf2, (byte) 0xf5, (byte) 0xd8, (byte) 0xdf, - (byte) 0xd6, (byte) 0xd1, (byte) 0xc4, (byte) 0xc3, (byte) 0xca, (byte) 0xcd, (byte) 0x90, (byte) 0x97, (byte) 0x9e, - (byte) 0x99, (byte) 0x8c, (byte) 0x8b, (byte) 0x82, (byte) 0x85, (byte) 0xa8, (byte) 0xaf, (byte) 0xa6, (byte) 0xa1, - (byte) 0xb4, (byte) 0xb3, (byte) 0xba, (byte) 0xbd, (byte) 0xc7, (byte) 0xc0, (byte) 0xc9, (byte) 0xce, (byte) 0xdb, - (byte) 0xdc, (byte) 0xd5, (byte) 0xd2, (byte) 0xff, (byte) 0xf8, (byte) 0xf1, (byte) 0xf6, (byte) 0xe3, (byte) 0xe4, - (byte) 0xed, (byte) 0xea, (byte) 0xb7, (byte) 0xb0, (byte) 0xb9, (byte) 0xbe, (byte) 0xab, (byte) 0xac, (byte) 0xa5, - (byte) 0xa2, (byte) 0x8f, (byte) 0x88, (byte) 0x81, (byte) 0x86, (byte) 0x93, (byte) 0x94, (byte) 0x9d, (byte) 0x9a, - (byte) 0x27, (byte) 0x20, (byte) 0x29, (byte) 0x2e, (byte) 0x3b, (byte) 0x3c, (byte) 0x35, (byte) 0x32, (byte) 0x1f, - (byte) 0x18, (byte) 0x11, (byte) 0x16, (byte) 0x03, (byte) 0x04, (byte) 0x0d, (byte) 0x0a, (byte) 0x57, (byte) 0x50, - (byte) 0x59, (byte) 0x5e, (byte) 0x4b, (byte) 0x4c, (byte) 0x45, (byte) 0x42, (byte) 0x6f, (byte) 0x68, (byte) 0x61, - (byte) 0x66, (byte) 0x73, (byte) 0x74, (byte) 0x7d, (byte) 0x7a, (byte) 0x89, (byte) 0x8e, (byte) 0x87, (byte) 0x80, - (byte) 0x95, (byte) 0x92, (byte) 0x9b, (byte) 0x9c, (byte) 0xb1, (byte) 0xb6, (byte) 0xbf, (byte) 0xb8, (byte) 0xad, - (byte) 0xaa, (byte) 0xa3, (byte) 0xa4, (byte) 0xf9, (byte) 0xfe, (byte) 0xf7, (byte) 0xf0, (byte) 0xe5, (byte) 0xe2, - (byte) 0xeb, (byte) 0xec, (byte) 0xc1, (byte) 0xc6, (byte) 0xcf, (byte) 0xc8, (byte) 0xdd, (byte) 0xda, (byte) 0xd3, - (byte) 0xd4, (byte) 0x69, (byte) 0x6e, (byte) 0x67, (byte) 0x60, (byte) 0x75, (byte) 0x72, (byte) 0x7b, (byte) 0x7c, - (byte) 0x51, (byte) 0x56, (byte) 0x5f, (byte) 0x58, (byte) 0x4d, (byte) 0x4a, (byte) 0x43, (byte) 0x44, (byte) 0x19, - (byte) 0x1e, (byte) 0x17, (byte) 0x10, (byte) 0x05, (byte) 0x02, (byte) 0x0b, (byte) 0x0c, (byte) 0x21, (byte) 0x26, - (byte) 0x2f, (byte) 0x28, (byte) 0x3d, (byte) 0x3a, (byte) 0x33, (byte) 0x34, (byte) 0x4e, (byte) 0x49, (byte) 0x40, - (byte) 0x47, (byte) 0x52, (byte) 0x55, (byte) 0x5c, (byte) 0x5b, (byte) 0x76, (byte) 0x71, (byte) 0x78, (byte) 0x7f, - (byte) 0x6a, (byte) 0x6d, (byte) 0x64, (byte) 0x63, (byte) 0x3e, (byte) 0x39, (byte) 0x30, (byte) 0x37, (byte) 0x22, - (byte) 0x25, (byte) 0x2c, (byte) 0x2b, (byte) 0x06, (byte) 0x01, (byte) 0x08, (byte) 0x0f, (byte) 0x1a, (byte) 0x1d, - (byte) 0x14, (byte) 0x13, (byte) 0xae, (byte) 0xa9, (byte) 0xa0, (byte) 0xa7, (byte) 0xb2, (byte) 0xb5, (byte) 0xbc, - (byte) 0xbb, (byte) 0x96, (byte) 0x91, (byte) 0x98, (byte) 0x9f, (byte) 0x8a, (byte) 0x8d, (byte) 0x84, (byte) 0x83, - (byte) 0xde, (byte) 0xd9, (byte) 0xd0, (byte) 0xd7, (byte) 0xc2, (byte) 0xc5, (byte) 0xcc, (byte) 0xcb, (byte) 0xe6, - (byte) 0xe1, (byte) 0xe8, (byte) 0xef, (byte) 0xfa, (byte) 0xfd, (byte) 0xf4, (byte) 0xf3}; } \ No newline at end of file diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java index 27c2838..6e078a3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java @@ -1,9 +1,6 @@ package com.casic.missiles.parser.safe.impl; -import cn.hutool.core.util.CharsetUtil; -import cn.hutool.crypto.symmetric.SM4; -import cn.hutool.crypto.symmetric.SymmetricCrypto; - +import com.casic.missiles.parser.safe.SafeStrategy; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; @@ -11,19 +8,44 @@ import org.bouncycastle.crypto.engines.SM4Engine; import org.bouncycastle.crypto.params.KeyParameter; import org.bouncycastle.util.encoders.Hex; - -import static cn.hutool.crypto.Mode.ECB; -import static cn.hutool.crypto.Padding.NoPadding; +import org.springframework.stereotype.Component; /** * SM4算法工具类 */ @Slf4j -public class Sm4 { +@Component("sm4") +public class Sm4 implements SafeStrategy { //加解密的字节快大小 public static final int BlockSize = 16; + @Override + public String decryption(String cipher) { + byte[] keyByte = { + 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 + }; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(keyByte); + byte[] in = Hex.decode(cipher); + byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); + String plain = EcbDecrypt(in, keyBytes); + return plain; + } + + @Override + public String encryption(String cipher) { + byte[] keyByte = { + 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 + }; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(keyByte); + byte[] in = Hex.decode(cipher); + byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); + String plain = EcbDecrypt(in, keyBytes); + return plain; + } + /** * SM4ECB加密算法,对内 * @@ -32,8 +54,6 @@ * @return */ private static byte[] ecb_encrypt(byte[] in, byte[] keyBytes) { - - SM4Engine sm4Engine = new SM4Engine(); sm4Engine.init(true, new KeyParameter(keyBytes)); byte[] out = new byte[in.length]; @@ -58,27 +78,6 @@ return cipher; } - - /** - * hutool 解密SM4 - * - * @param encodeContent - * @return - */ - public static String decode(String encodeContent) { - String key = "24ad182507479a5da3ad94d9d78ea203"; - try { - SymmetricCrypto sm4 = new SM4(ECB, NoPadding, key.getBytes()); - String decryptStr = sm4.decryptStr(encodeContent, CharsetUtil.CHARSET_UTF_8); - return decryptStr; - } catch (Exception e) { - e.printStackTrace(); - log.error("SM4解密失败"); - } - return null; - } - - /** * SM4的ECB加密算法 * @@ -129,20 +128,6 @@ return plain; } - /** - * SM4的ECB解密算法 - * - * @param cipher 输入的密文字符串 - * @param key 密钥 - * @return - */ - public static String EcbDecrypt(String cipher, String key) { - byte[] in = Hex.decode(cipher); - byte[] keyBytes = Hex.decode(key); - - String plain = EcbDecrypt(in, keyBytes); - return plain; - } /** * 主函数 @@ -151,28 +136,24 @@ */ public static void main(String[] args) { byte[] ciphertext = { + 0x4B, (byte) 0x8C, (byte) 0x9D, 0x08, (byte) 0xE4, (byte) 0xD3, 0x64, 0x42, (byte) 0xB9, (byte) 0xA5, (byte) 0xFE, (byte) 0xCD, (byte) 0x91, 0x1B, 0x38, (byte) 0xAC, (byte) 0xE9, 0x1C, (byte) 0xCD, 0x53, 0x02, (byte) 0xD7, 0x0C, (byte) 0x9B, (byte) 0x96, 0x30, 0x62, (byte) 0xE8, (byte) 0xFB, (byte) 0xEF, (byte) 0xB9, (byte) 0xFF, (byte) 0xDE, 0x19, (byte) 0x80, 0x35, 0x3E, (byte) 0x90, 0x4F, 0x2F, 0x12, 0x2B, 0x19, (byte) 0x8B, 0x6C, 0x7A, (byte) 0x85, (byte) 0xA1, (byte) 0xB1, (byte) 0x86, (byte) 0xA3, 0x7A, 0x46, 0x0C, 0x2F, (byte) 0x94, 0x4F, 0x7F, 0x2C, 0x56, 0x14, (byte) 0xF3, (byte) 0x89, (byte) 0xC3, - 0x3F, 0x20, (byte) 0xF9, (byte) 0x87, (byte) 0xA1, 0x60, (byte) 0xD9, (byte) 0xA8, (byte) 0xFD, (byte) 0xD7, (byte) 0x9B, 0x4B, 0x26, 0x06, 0x30, 0x44}; + 0x3F, 0x20, (byte) 0xF9, (byte) 0x87, (byte) 0xA1, 0x60, (byte) 0xD9, (byte) 0xA8, (byte) 0xFD, (byte) 0xD7, (byte) 0x9B, 0x4B, 0x26, 0x06, 0x30, 0x44 + }; ByteBuf in = ByteBufAllocator.DEFAULT.heapBuffer(); in.writeBytes(ciphertext); - byte[] keyByte = { 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 }; ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); - key.writeBytes(ciphertext); - String resCipherData = decode(ByteBufUtil.hexDump(in)); - ByteBuf out = ByteBufAllocator.DEFAULT.heapBuffer(); -// out.writeBytes(resCipherData); -// System.out.println(hexBytes); - System.out.println(resCipherData.toString()); -// String resPlainData = EcbDecrypt(resCipherData, key); -// System.out.println("原始明文:" + data); -// System.out.println("解密后明文:" + resPlainData); + key.writeBytes(keyByte); +// String resCipherData = EcbDecrypt(ByteBufUtil.hexDump(in), ByteBufUtil.hexDump(key)); +// System.out.println(resCipherData); } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java index 1395a51..ac5f957 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java @@ -1,7 +1,7 @@ package com.casic.missiles.parser.safe.impl; import io.netty.buffer.ByteBufUtil; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** *

@@ -14,9 +14,8 @@ * @author hyl * @version v1.0: Tea.java, v 0.1 2021/3/12 13:48 $ */ -@Service("tea") -///tea算法类 - +//tea算法类 +@Component("tea") public class Tea { public static byte[] MyTea_Encrypt(byte[] MyTeaContent, int ByteLen, byte[] MyTeakey) { @@ -99,7 +98,6 @@ // for(int i32Index = 0; i32Index < 8; i32Index++) { // System.out.print("0x" + Integer.toHexString(MyContent[i32Index]) + " "); // } - // System.out.println("密钥为:"); // for(int i32Index = 0; i32Index < 16; i32Index++) { // System.out.print("0x" + Integer.toHexString(MyKeys[i32Index]) + " "); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java index bdd0721..bd1516a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java @@ -3,7 +3,7 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.parser.sender.DataSubscribeProvider; import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponents; import org.springframework.web.util.UriComponentsBuilder; @@ -12,7 +12,7 @@ import java.util.Collections; import java.util.Map; -@Service("functionCallback") +@Component("functionCallback") public class FunctionCallback implements DataSubscribeProvider { @Resource diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java index 0b44fb9..7526de2 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.Map; -@Service("middleware") +@Component("middleware") public class MiddlewareSubscribe implements DataSubscribeProvider { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java index 5dcee3f..e2f1192 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.Map; -@Service("nosql") +@Component("nosql") public class NoSqlSubscribe implements DataSubscribeProvider { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java b/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java new file mode 100644 index 0000000..81a5324 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java @@ -0,0 +1,86 @@ +package com.casic.missiles.pojo; + +import lombok.Data; + +/** + * 协议 + */ +@Data +public class Msg { + + /** + * 前导码 + */ + private String preamble; + + /** + * 版本号 + */ + private String version; + + /** + * 内容长度 + */ + private int leng; + + /** + * 设备ID + */ + private String deviceId; + + /** + * 通讯方式 + */ + private Integer connType; + + /** + * 加密方式 + */ + private Integer encryType; + + /** + * 目标地址 + */ + private String destAddr; + + /** + * PDUType + */ + private String PDUType; + + /** + * 操作类型 + */ + private Integer operateType; + + /** + * 传输控制位 PDUType.bit7=0时,表示存在后续的访问;当PDUType.bit7=1时,表示无后续的访问。 + */ + private Integer transControlFlag; + + /** + * 设备类型 + */ + private Integer deviceType; + + /** + * 序号 + */ + private Integer seq; + + /** + * tagList + */ + private String tagList; + + /** + * OidList + */ + private String OidList; + + /** + * CRC + */ + private String CRC; + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java index 40a5265..97cc984 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java @@ -40,7 +40,7 @@ String httpContent = msg.toString(Charset.defaultCharset()); log.info(" String : " + msg.toString(Charset.defaultCharset())); String majorContent = httpContent.substring(httpContent.indexOf("{"), httpContent.lastIndexOf("}") + 1); - String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("serviceData")).get("Value")); + String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("RegistryData")).get("Value")); log.info("----------------------------------" + values); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); bufferContent.writeBytes(values.getBytes(Charset.forName("ISO-8859-1"))); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java index 1b132a7..e3ced4b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java @@ -35,7 +35,7 @@ String httpContent = msg.toString(Charset.defaultCharset()); log.info(" String : " + msg.toString(Charset.defaultCharset())); String majorContent = httpContent.substring(httpContent.indexOf("{"), httpContent.lastIndexOf("}") + 1); - String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("serviceData")).get("Value")); + String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("RegistryData")).get("Value")); log.info("----------------------------------" + values); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); bufferContent.writeBytes(values.getBytes(Charset.forName("ISO-8859-1"))); diff --git a/sensorhub-core/src/main/resources/application.properties b/sensorhub-core/src/main/resources/application.properties deleted file mode 100644 index 8b13789..0000000 --- a/sensorhub-core/src/main/resources/application.properties +++ /dev/null @@ -1 +0,0 @@ - diff --git a/sensorhub-core/src/main/resources/config/application-dev.yml b/sensorhub-core/src/main/resources/config/application-dev.yml index 4f897a8..dcc4c2d 100644 --- a/sensorhub-core/src/main/resources/config/application-dev.yml +++ b/sensorhub-core/src/main/resources/config/application-dev.yml @@ -4,9 +4,9 @@ spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true + url: jdbc:mysql://127.0.0.1:3306/sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true username: root - password: Casic203 + password: root session: store-type: redis redis: diff --git a/sensorhub-core/src/main/resources/config/application.yml b/sensorhub-core/src/main/resources/config/application.yml index ae89f9d..7965da1 100644 --- a/sensorhub-core/src/main/resources/config/application.yml +++ b/sensorhub-core/src/main/resources/config/application.yml @@ -30,6 +30,13 @@ port: 6379 password: ew5T4K3#203lwh config-prefix: 'Casic:' +#代码生成器配置 +code: + generate: + #作者 + author: cz + #待生成对象表名 + table-name: bussiness_field_config,combined_field_config sensorhub: config: port: 7091 diff --git a/sensorhub-support/pom.xml b/sensorhub-support/pom.xml index 9a71296..761601c 100644 --- a/sensorhub-support/pom.xml +++ b/sensorhub-support/pom.xml @@ -42,6 +42,12 @@ ${redis.version} + + com.baomidou + mybatis-plus-generator + ${mybatis-plus-generator.version} + + org.reflections diff --git a/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java b/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java new file mode 100644 index 0000000..515ca53 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java @@ -0,0 +1,14 @@ +package com.casic.missiles.enums; + +/** + * @author + * @date + */ +public interface FixedPropertyEnum { + + String FIXED_POSITION = "fixedPosition"; + + String TOTAL_LENGTH = "totalLength"; + + String TAIL_POSITION = "tailPosition"; +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/CombinedFieldMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CombinedFieldMapper.java new file mode 100644 index 0000000..38e8f42 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CombinedFieldMapper.java @@ -0,0 +1,15 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.CombinedFieldConfig; +import org.apache.ibatis.annotations.Mapper; + +/** + * @author cz + * + */ +@Mapper +public interface CombinedFieldMapper extends BaseMapper { + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java new file mode 100644 index 0000000..128b09d --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java @@ -0,0 +1,10 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.CommandEventConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface CommandEventMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java new file mode 100644 index 0000000..042eb3c --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.DatagramEventConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface DatagramEventConfigMapper extends BaseMapper { +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java new file mode 100644 index 0000000..fc95cf4 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java @@ -0,0 +1,8 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.FieldConfig; + +public interface FieldConfigMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldRuleConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldRuleConfigMapper.java new file mode 100644 index 0000000..b310a08 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldRuleConfigMapper.java @@ -0,0 +1,10 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.FieldRuleConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface FieldRuleConfigMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java new file mode 100644 index 0000000..9060a69 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.ProtocolConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface ProtocolConfigMapper extends BaseMapper { +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolFieldConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolFieldConfigMapper.java new file mode 100644 index 0000000..1b47180 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolFieldConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +public interface ProtocolFieldConfigMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java new file mode 100644 index 0000000..6fa6936 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.RuleConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface RuleConfigMapper extends BaseMapper { +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/AbstractFieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/AbstractFieldConfig.java new file mode 100644 index 0000000..ba9aea2 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/AbstractFieldConfig.java @@ -0,0 +1,38 @@ +package com.casic.missiles.pojo; + +import lombok.Data; + +@Data +public class AbstractFieldConfig { + /** + * 字段名称 + */ + private String fieldName; + /** + * 按照字段评估进行字段解析 + */ + private String ruleJson; + /** + * 起始位置(单位byte) + */ + private Integer OriginPositionByte; + /** + * 起始位置,是否需要bit位置(单位bit)小于8, 没有不需要填写 + */ + private String OriginPositionBit; + /** + * 偏移长度 + */ + private Integer offsetLength; + /** + * 偏移单位(bit/byte) + */ + private String offsetUnit; + /** + * 是否需要转存 + */ + private Integer isStorage; + + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/CombinedFieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/CombinedFieldConfig.java new file mode 100644 index 0000000..4f4de6a --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/CombinedFieldConfig.java @@ -0,0 +1,41 @@ +package com.casic.missiles.pojo; + +import lombok.Data; + +import java.util.Date; + +/** + * 组合配置 + * + * @author cz + * @date 20 + */ +@Data +public class CombinedFieldConfig { + + private Long id; + private Long ruleId; + /** + * 前缀编码 + */ + private String prefixCode; + + /** + * 字段动态的id + */ + private Long dynamicLengthId; + /** + * 对应的要解析字段的ids + */ + private String dataFieldIds; + + /** + * 字段动态的id + */ + private String combinedFieldIds; + + private Date lastTime; + + private Date createTime; + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldConfig.java index a07d20d..8304dc6 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldConfig.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldConfig.java @@ -5,31 +5,28 @@ import java.util.Date; +/** + * @author cz + * 1、该表与实际解析的内容实例解析有关 + * 2、该表字段是随机出现的,和帧结构无关,无法预料的 + * 3、该表字段解析根据FieldEvaluatorConfig进行字段解析 + */ @Data -@TableName("field_config") -public class FieldConfig { +@TableName("business_field_config") +public class FieldConfig extends AbstractFieldConfig { private Long id; -// private String preFieldConfig; - private Long protocolId; - - private String isFixed; - private String uploadDeliveryChange; - - private String replyRule; - private String ruleJson; - + /** + * 协议配置id + */ + private Long ruleId; + /** + * 字段名称 + */ private String fieldName; - private String isStorage; - private Integer orignPosition; - private String exactOrignPosition; - - private Integer offsetLength; - private String offsetUnit; private String ownerId; private Date createTime; private Date lastTime; - } diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldRuleConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldRuleConfig.java new file mode 100644 index 0000000..2e09879 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldRuleConfig.java @@ -0,0 +1,20 @@ +package com.casic.missiles.pojo; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +@TableName("field_rule_config") +@Data +public class FieldRuleConfig { + + private Long id; + private String name; + private String desc; + private String condition; + private String excuteOperation; + private Date lasTime; + private Date createTime; + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/Msg.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/Msg.java deleted file mode 100644 index 81a5324..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/Msg.java +++ /dev/null @@ -1,86 +0,0 @@ -package com.casic.missiles.pojo; - -import lombok.Data; - -/** - * 协议 - */ -@Data -public class Msg { - - /** - * 前导码 - */ - private String preamble; - - /** - * 版本号 - */ - private String version; - - /** - * 内容长度 - */ - private int leng; - - /** - * 设备ID - */ - private String deviceId; - - /** - * 通讯方式 - */ - private Integer connType; - - /** - * 加密方式 - */ - private Integer encryType; - - /** - * 目标地址 - */ - private String destAddr; - - /** - * PDUType - */ - private String PDUType; - - /** - * 操作类型 - */ - private Integer operateType; - - /** - * 传输控制位 PDUType.bit7=0时,表示存在后续的访问;当PDUType.bit7=1时,表示无后续的访问。 - */ - private Integer transControlFlag; - - /** - * 设备类型 - */ - private Integer deviceType; - - /** - * 序号 - */ - private Integer seq; - - /** - * tagList - */ - private String tagList; - - /** - * OidList - */ - private String OidList; - - /** - * CRC - */ - private String CRC; - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/PreRuleConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/PreRuleConfig.java deleted file mode 100644 index bfcf914..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/PreRuleConfig.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.casic.missiles.pojo; - -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -import java.util.Date; - -@Data -@TableName("pre_rule_config") -public class PreRuleConfig { - - private Long id; - private String protocolId; - private String ruleFieldId; - private String ownerId; - private Date createTime; - private Date lastTime; -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolConfig.java index 274ad42..bdac11f 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolConfig.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolConfig.java @@ -5,18 +5,52 @@ import java.util.Date; +/** + * 协议配置表,协议配置与帧结构有关 + * 1、层级关系,协议之后是规则,规则对应设备类型的各种上数规则 + * 2、规则对应协议配置的实例流程 + * 3、每种可根据设备类型和操作类型进行上数规则进行区分 + */ @Data @TableName("protocol_config") public class ProtocolConfig { private Long id; + /** + * 前导码 + */ private String preFix; - private String unpackId; - private String totalLengthId; - private String totalLengthFilterField; + /** + * 拆包id + */ + private Long unpackId; + /** + * 总长度id + */ + private Long totalLengthId; + /** + * + */ + private String totalLengthFilterFields; + /** + * 动态长度ids + */ private String dynamicLengthId; + /** + * 动态长度json(预留字段) + */ private String dynamicLengthJson; - private String tailStr; + /** + * 规则字段所解析预准备的字段 + */ + private String rulePrepareFields; + /** + * 结尾标志 + */ + private Long tailStr; + /** + * 备注 + */ private String remark; private String ownerId; private Date createTime; diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolFieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolFieldConfig.java new file mode 100644 index 0000000..db794bd --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolFieldConfig.java @@ -0,0 +1,43 @@ +package com.casic.missiles.pojo; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +/** + * 协议字段配置表 + * 该表用户存放帧结构固定格式的字段 + * 有以下两个用途 + * (1)、固定格式的字段可用于规则匹配 + * (2)、固定格式的字段可用于报文回复 + * @author cz + * @date 2023-06-09 + */ +@Data +@TableName("protocol_field_config") +public class ProtocolFieldConfig extends AbstractFieldConfig{ + + private Long id; + /** + * 协议配置id + */ + private Long protocolId; + /** + * 上传下发是否有变化, 没有变化,可以直接组装 + */ + private String isReplyFix; + /** + * 按照字段评估进行字段解析 + */ + private Long fieldEvaluatorId; + /** + * 回复规则 + */ + private String replyRule; + + private String ownerId; + private Date createTime; + private Date lastTime; + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java index 3b53493..febf835 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java @@ -6,18 +6,40 @@ import java.util.Date; /** - * 加密字段解析和规则有关,事件调到该流程下面 + * @author cz + * todo: 匹配协议对应业务实例 + * 1、一个协议可以多种的流程规则 + * 2、规则可以支持递归规则流程 */ @Data @TableName("rule_config") public class RuleConfig { - private Long id; private String protocolId; - private String isBizField; - private String parseRuleJson; + /** + * 是否完成规则配置,没有完成, + * 则需要根据规则继续匹配 + */ + private String isFinishMatch; + /** + * 待匹配解析规则 + * {“data_field”:"data_value"} + */ + private String matchRuleJson; + /** + * 待解析字段ids + */ private String dataFieldIds; - private String aviatorFilterJson; + + /** + * 待解析组合字段ids + */ + private String combinedFieldIds; + + /** + * aviator + */ + private String conditionExpression; private Date createTime; private Date lastTime; } diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleDict.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleDict.java deleted file mode 100644 index cc7f389..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleDict.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.casic.missiles.pojo; - -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -@Data -@TableName("rule_dict") -public class RuleDict { - - private Long id; - private Long pid; - private String name; - private String code; - private String ownerId; - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleEvaluator.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleEvaluator.java deleted file mode 100644 index ed16610..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleEvaluator.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.pojo; - -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -import java.util.Date; - -@TableName("rule_evaluator") -@Data -public class RuleEvaluator { - - private Long id; - private String name; - private String desc; - private String condition; - private String excuteOperation; - private Date lasTime; - private Date createTime; - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/CombinedFieldConfigRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/CombinedFieldConfigRegistry.java new file mode 100644 index 0000000..fa59b90 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/CombinedFieldConfigRegistry.java @@ -0,0 +1,12 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.CombinedFieldConfig; + +import java.util.List; + +public interface CombinedFieldConfigRegistry { + + List getCombinedFieldConfigList(Long ruleId); + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/CommandEventRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/CommandEventRegistry.java new file mode 100644 index 0000000..fb97d87 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/CommandEventRegistry.java @@ -0,0 +1,8 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.CommandEventConfig; + +public interface CommandEventRegistry { + + CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName); +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/DatagramEventRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/DatagramEventRegistry.java new file mode 100644 index 0000000..fb34641 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/DatagramEventRegistry.java @@ -0,0 +1,11 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.DatagramEventConfig; + +import java.util.List; + +public interface DatagramEventRegistry{ + + List getDatagramEventList(Long ruleId); + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/FieldConfigRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/FieldConfigRegistry.java new file mode 100644 index 0000000..759642e --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/FieldConfigRegistry.java @@ -0,0 +1,20 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.FieldConfig; + +import java.util.List; + +public interface FieldConfigRegistry { + + + List getFieldConfigList(Long ruleId); + + FieldConfig getFieldConfigById(String fieldId); + + List getFieldConfigs(String protocolId, Integer isFixed); + + List getStorageFieldConfig(String protocolId); + + +} + diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/FieldRuleConfigRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/FieldRuleConfigRegistry.java new file mode 100644 index 0000000..33da70c --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/FieldRuleConfigRegistry.java @@ -0,0 +1,11 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.FieldRuleConfig; + +import java.util.List; + +public interface FieldRuleConfigRegistry { + + List getFieldRuleConfigList(Long ruleId); + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/ProtocolConfigRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/ProtocolConfigRegistry.java new file mode 100644 index 0000000..1725189 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/ProtocolConfigRegistry.java @@ -0,0 +1,12 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.ProtocolConfig; + +import java.util.List; + +public interface ProtocolConfigRegistry { + + List getProtocolConfigList(String firstChar); + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/ProtocolFieldConfigRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/ProtocolFieldConfigRegistry.java new file mode 100644 index 0000000..19d1b9a --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/ProtocolFieldConfigRegistry.java @@ -0,0 +1,14 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.ProtocolFieldConfig; + +import java.util.List; + +public interface ProtocolFieldConfigRegistry { + + + List getProtocolFieldConfigList(Long protocolId); + + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/RuleConfigRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/RuleConfigRegistry.java new file mode 100644 index 0000000..3d2a75c --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/RuleConfigRegistry.java @@ -0,0 +1,14 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.RuleConfig; + +import java.util.List; + +public interface RuleConfigRegistry { + + RuleConfig getNextRuleConfig(String ruleFields); + + + List getRuleConfigById(Long protocolId); + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CombinedFieldConfigRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CombinedFieldConfigRegistryImpl.java new file mode 100644 index 0000000..822cac6 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CombinedFieldConfigRegistryImpl.java @@ -0,0 +1,24 @@ +package com.casic.missiles.registry.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.CombinedFieldMapper; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.registry.CombinedFieldConfigRegistry; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class CombinedFieldConfigRegistryImpl extends ServiceImpl implements CombinedFieldConfigRegistry { + + @Override + public List getCombinedFieldConfigList(Long ruleId) { + QueryWrapper queryWrapper = new QueryWrapper() + .eq("rule_id", ruleId); + List combinedFieldConfigs = this.baseMapper.selectList(queryWrapper); + return combinedFieldConfigs; + } + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CommandEventRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CommandEventRegistryImpl.java new file mode 100644 index 0000000..f0d3559 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CommandEventRegistryImpl.java @@ -0,0 +1,25 @@ +package com.casic.missiles.registry.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.CommandEventMapper; +import com.casic.missiles.pojo.CommandEventConfig; +import com.casic.missiles.registry.CommandEventRegistry; + +import java.util.List; +import java.util.Optional; + +public class CommandEventRegistryImpl extends ServiceImpl implements CommandEventRegistry { + + @Override + public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { + QueryWrapper queryWrapper = new QueryWrapper() + .eq("protocol_id", protocolId) + .eq("scene", sceneName) + .eq("enabled", 1); + List commandEventConfig = this.baseMapper.selectList(queryWrapper); + Optional optionalEventConfig = commandEventConfig.stream().findFirst(); + return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; + } + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/DatagramEventRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/DatagramEventRegistryImpl.java new file mode 100644 index 0000000..2e58698 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/DatagramEventRegistryImpl.java @@ -0,0 +1,26 @@ +package com.casic.missiles.registry.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.DatagramEventConfigMapper; +import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.registry.DatagramEventRegistry; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class DatagramEventRegistryImpl extends ServiceImpl implements DatagramEventRegistry { + + + @Override + public List getDatagramEventList(Long ruleId) { + QueryWrapper queryWrapper = new QueryWrapper() + .eq("rule_id", ruleId); + List fieldConfigList = this.baseMapper.selectList(queryWrapper); + return fieldConfigList; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java index 608af3a..32cc8a4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java @@ -2,48 +2,47 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.delivery.decorator.ByteDecorator; +import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @AllArgsConstructor public class FieldDecoratorManger { - private final RuleDictDao ruleDictDao; + private final RuleConfigRegistry ruleDictDao; // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 // (1)静态的业务字段是字典里面可以配置的 // (2)动态的业务字段是通过规则生成的 public String contentMerge(String ruleJson, String sceneConent, String dynamicContent) { - List ruleDictList = ruleDictDao.getRuleDictConfig(); - Map ruleDictMap = ruleDictList.stream().collect( - Collectors.toMap(RuleDict::getId, e -> e)); - List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); - for (Map ruleMap : ruleMapList) { - String ruleType = String.valueOf(ruleMap.get("ruleType")); - ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); - NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); - byteDecorator.nodeDecoratorRule(nodeDecoratorParm); - } +// List ruleDictList = ruleDictDao.getRuleDictConfig(); +// Map ruleDictMap = ruleDictList.stream().collect( +// Collectors.toMap(RuleDict::getId, e -> e)); +// List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); +// for (Map ruleMap : ruleMapList) { +// String ruleType = String.valueOf(ruleMap.get("ruleType")); +// ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); +// NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); +// byteDecorator.nodeDecoratorRule(nodeDecoratorParm); +// } return null; } - - private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { - NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() - .contents(sceneConent) - .dynamicContent(dynamicContent) - .ruletypeId(ruletypeId) - .ruleDictMap(ruleDictMap) - .build(); - return nodeDecoratorParm; - } +// +// private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { +// NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() +// .contents(sceneConent) +// .dynamicContent(dynamicContent) +// .ruletypeId(ruletypeId) +// .ruleDictMap(ruleDictMap) +// .build(); +// return nodeDecoratorParm; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java index 652970c..b204ac3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java @@ -1,56 +1,56 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@AllArgsConstructor -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", - JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Component; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Component("logicalDecorator") +//@AllArgsConstructor +//@Slf4j +//public class LogicalShiftDecorator implements ByteDecorator { +// +//// private final FieldRuleEngineMapper fieldRuleEngineMapper; +//// +//// //字节位移 +//// @Override +//// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +//// String logicalValue = ""; +//// RuleEvaluator fieldRuleEngine = new RuleEvaluator(); +//// try { +//// Map env2 = new HashMap(); +//// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +//// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +//// for (String contentId : contentIdList) { +//// RuleDict ruleDict = ruleDictMap.get(contentId); +//// if (ruleDict.getCode().contains("#")) { +//// //使用动态的值 +//// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +//// } +//// env2.put(ruleDict.getName(), ruleDict.getCode()); +//// } +//// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +//// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +//// return null; +//// } +//// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +//// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +//// return values; +//// } catch (Exception ex) { +//// log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", +//// JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +//// return null; +//// } +//// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java index 346468f..822fead 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@AllArgsConstructor -@Slf4j -public class OperationDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("optionDecorator") +//@AllArgsConstructor +//@Slf4j +//public class OperationDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //混合运算,有常量或者乘除的缩放 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java index 50fb0a7..7a8bccb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@AllArgsConstructor -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +////精度计算 +//@AllArgsConstructor +//@Registry("precisionDecorator") +//@Slf4j +//public class PrecisionDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java index da39235..27f9cc7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java @@ -1,54 +1,53 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@AllArgsConstructor -@Slf4j -public class RuleDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("ruleDecorator") +//@AllArgsConstructor +//@Slf4j +//public class RuleDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //吃我一套正则表达式 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (Exception ex) { +// log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java index 7f5cbf3..c043f97 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java @@ -2,6 +2,6 @@ import java.util.Map; -public interface ComandeEventService { +public interface ComandeEventService{ Map loadComandeEventConfig(String protocolId,String scene); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java index 476ad84..aaf1837 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java @@ -2,46 +2,46 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.dao.CommandEventDao; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @Slf4j @AllArgsConstructor -public class ComandeEventServiceImpl implements ComandeEventService { +public class ComandeEventServiceImpl implements ComandeEventRegistry { - private final CommandEventDao commandEventDao; + // private final CommandEventDao commandEventDao; // 加密bean 固定字段出现变化的字段解析,业务字段的有序内容 @Override - public Map loadComandeEventConfig(String protocolId,String sceneName) { - CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); - if (ObjectUtil.isEmpty(commandEventConfig)) { - log.error("协议{},没有配置成功接收回复配置,清排查原因"); - return null; - } - String replyJson = commandEventConfig.getReplyContentJson(); - List> replyMapList = JSONArray.parseObject(replyJson, List.class); - List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); - Map fixMap = fixList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); - List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) - .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) - .collect(Collectors.toList()); - Map commandConfigMap = new HashMap<>(); - commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); - commandConfigMap.put("fixContent", fixMap); - commandConfigMap.put("bizContent", contentList); - return commandConfigMap; + public Map loadComandeEventConfig(String protocolId, String sceneName) { +// CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); +// if (ObjectUtil.isEmpty(commandEventConfig)) { +// log.error("协议{},没有配置成功接收回复配置,清排查原因"); +// return null; +// } +// String replyJson = commandEventConfig.getReplyContentJson(); +// List> replyMapList = JSONArray.parseObject(replyJson, List.class); +// List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); +// Map fixMap = fixList.stream() +// .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); +// List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) +// .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) +// .collect(Collectors.toList()); +// Map commandConfigMap = new HashMap<>(); +// commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); +// commandConfigMap.put("fixContent", fixMap); +// commandConfigMap.put("bizContent", contentList); +// return commandConfigMap; + return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 128b09d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java deleted file mode 100644 index 4016b0b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface DatagramEventMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java deleted file mode 100644 index 597c306..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.apache.ibatis.annotations.Mapper; - -public interface FieldConfigMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java deleted file mode 100644 index a31680a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.PreRuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface PreRuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java deleted file mode 100644 index 9060a69..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface ProtocolConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java deleted file mode 100644 index 6fa6936..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java deleted file mode 100644 index 582a705..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleDict; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleDictMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java deleted file mode 100644 index 6e302c8..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.CommandEventMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Optional; - -@Component -public class CommandEventDao { - - @Resource - private CommandEventMapper commandEventMapper; - - public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId) - .eq("scene", sceneName) - .eq("enabled", 1); - List commandEventConfig = commandEventMapper.selectList(queryWrapper); - Optional optionalEventConfig = commandEventConfig.stream().findFirst(); - return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java deleted file mode 100644 index 9137e4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.FieldConfigMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class FieldConfigDao { - - @Resource - private FieldConfigMapper fieldConfigMapper; - - public FieldConfig getFieldConfigById(String fieldId) { - FieldConfig fieldConfig = fieldConfigMapper.selectById(fieldId); - return fieldConfig; - } - - public List getFieldConfigs(String protocolId,Integer isFixed) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",isFixed); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - - public List getStorageFieldConfig(String protocolId) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",1) - .eq("is_storage",1); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java deleted file mode 100644 index 67bff6b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.mapper.PreRuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class PreRuleConfigDao { - - @Resource - private PreRuleConfigMapper preRuleConfigMapper; - - public List getPreRuleList(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return preRuleConfigMapper.selectList(queryWrapper); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java deleted file mode 100644 index d69ea85..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.RuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleConfigDao { - - @Resource - private RuleConfigMapper ruleConfigMapper; - - public RuleConfig getNextRuleConfig(String ruleFields) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("parse_rule_json", ruleFields); - return ruleConfigMapper.selectOne(queryWrapper); - } - - - public List getRuleConfigById(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return ruleConfigMapper.selectList(queryWrapper); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java deleted file mode 100644 index 932c185..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.RuleDictMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleDictDao { - - @Resource - private RuleDictMapper ruleDictMapper; - - public List getRuleDictConfig() { - List ruleDictList = ruleDictMapper.selectList(null); - return ruleDictList; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java index 9f9e279..43bc4d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java @@ -10,20 +10,15 @@ import io.netty.channel.socket.nio.NioServerSocketChannel; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import javax.annotation.PreDestroy; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static cn.hutool.core.util.ClassUtil.getClasses; /** * SensorhubServer netty服务端 */ @Slf4j -@Service +@Component public class SensorhubServer { /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java index 2c79ff5..9a28c36 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java @@ -11,13 +11,13 @@ import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioSocketChannel; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClient 客户端 */ @Slf4j -@Service +@Registry public final class SensorhubClient { public static void main(String[] args) throws Exception { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java index 9774be0..477c3f7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java @@ -6,12 +6,12 @@ import io.netty.channel.socket.SocketChannel; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientChannelInitialHandler */ -@Service +@Registry public class SensorhubClientChannelInitialHandler extends ChannelInitializer { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java index 346f4b3..73560e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java @@ -5,13 +5,13 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientHandler */ @Slf4j -@Service +@Registry public class SensorhubClientHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java index 5c1c6f2..d990af5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java @@ -4,12 +4,12 @@ import com.casic.missiles.pojo.Msg; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** * SensorhubServerHandler */ -@Service +@Component public class SensorhubServerHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 67283ae..af3172c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,41 +1,37 @@ package com.casic.missiles.parser; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultProtocolConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.*; +import com.casic.missiles.registry.FieldConfigRegistry; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; -import java.nio.charset.Charset; import java.util.HashMap; import java.util.List; import java.util.Map; -@Service("genericProtocolParser") +/** + * @author + */ +@Component("genericProtocolParser") @Slf4j -@AllArgsConstructor +@RequiredArgsConstructor public class GenericProtocolParser implements ProtocolParser { - private final LeadingCodeMatcher leadingCodeMatcher; private final List frameStructDispenserList; - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorInstanceSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; // 匹配首字母前导码=> 帧结构匹配前导码=> // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 @@ -44,18 +40,19 @@ public Boolean doParseProtocol(ByteBuf byteBuf) { String protocolContent = ByteBufUtil.hexDump(byteBuf); //匹配前导码 - List preCodeConfigs = leadingCodeMatcher.matchLeadingCode(protocolContent); + List preCodeConfigs = LeadingCodeMatcher.matchFrameLeadingCode(protocolContent); //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 if (preCodeConfigs.size() == 0) { - return rematch(byteBuf,protocolContent); + return rematch(byteBuf, protocolContent); } - //暂时先取第一个 + //暂时先取第一个,提升速度,使用享元模式, 减少类的创建销毁与构建 ProtocolConfig protocolConfig = preCodeConfigs.get(0); + AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); ByteBuf wholeDatagramByte = null; //通过匹配帧结构获取完整的数据包 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, preCodeConfigs.get(0))) != null) { + if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, protocolFactory)) != null) { break; } } @@ -68,76 +65,78 @@ * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 */ - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId, wholeDatagramByte); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap, protocolId); - //选取规则对应的流程实例 - DatagramEventConfig datagramEventConfig = processorInstanceSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); + //进行规则字段解析,进行匹配规则 + RuleConfig ruleConfig = getRuleConfig(protocolFactory, wholeDatagramByte); + if (ruleConfig == null) { + return false; + } //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, wholeDatagramByte); + ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte); + //以下进行业务的规则解析,同时选定流程实例 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); + DatagramEventProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain, + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText, protocolId); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain); //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); + datagramEventProvider.storeData(bizDataMap); return true; } - private Boolean rematch(ByteBuf byteBuf,String protocolContent) { + /** + * 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 + */ + private Boolean rematch(ByteBuf byteBuf, String protocolContent) { //重置位判断 byteBuf.resetReaderIndex(); //判断重置是否前移,如果没有前移,则直接判为匹配失败 if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { return false; } else { + //递归执行 return doParseProtocol(byteBuf); } } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; + //获取匹配规则->匹配规则 + private RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + //取出其中参与逻辑provider并判空 + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); + String rulePrepareFields = protocolConfig.getRulePrepareFields(); + //固定字段 + if (StringUtils.isNotEmpty(rulePrepareFields)) { + //获取统一固定字段解析 + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + //获取该协议的字段配置,用于协议规则匹配 + List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); + //获取规则 + RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, + rulePrepareFields, protocolFieldConfigs); + return ruleConfig; + } + return null; } - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + //数据构建,获取固定字段的store和业务字段store + private Map buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + Map bizDataMap = new HashMap<>(); + Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); + Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); + bizDataMap.putAll(ruleStoreObjectMap); + bizDataMap.putAll(protocolStoreObjectMap); return bizDataMap; } - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java index 8a46e32..16ce2e5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java @@ -3,6 +3,7 @@ import io.netty.buffer.ByteBuf; public interface ProtocolParser { + Boolean doParseProtocol(ByteBuf byteBuf); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java new file mode 100644 index 0000000..f7814af --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java @@ -0,0 +1,35 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.ProtocolConfigProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.ProtocolConfig; + +/** + * 存放基本协议的的加载信息 + */ +public class AbstractProtocolConfigFactory { + private final ProtocolConfigProvider protocolConfigProvider; + private final ProtocolFieldConfigProvider protocolFieldConfigProvider; + private final RuleConfigProvider ruleConfigProvider; + + public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { + this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); + this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); + this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); + } + + public ProtocolConfigProvider getProtocolConfigProvider() { + return protocolConfigProvider; + } + + public ProtocolFieldConfigProvider getProtocolFieldConfigProvider() { + return protocolFieldConfigProvider; + } + + public RuleConfigProvider getRuleConfigProvider() { + return ruleConfigProvider; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java new file mode 100644 index 0000000..6e36147 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java @@ -0,0 +1,57 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.CombinedFieldConfigProvider; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.FieldConfigProvider; +import com.casic.missiles.parser.provider.FieldRuleConfigProvider; + +/** + * 存放规则相关的的的加载信息 + */ +public class AbstractRuleConfigFactory { + + /** + * 处理字节 + */ + private final FieldConfigProvider fieldConfigProvider; + /** + * 处理组合字节解析的解码器 + */ + private final CombinedFieldConfigProvider combinedFieldConfigProvider; + /** + * 处理负责字节解析的规则配置 + */ + private final FieldRuleConfigProvider fieldRuleConfigProvider; + /** + * 处理实例流程 + */ + private final DatagramEventProvider datagramEventProvider; + + + public AbstractRuleConfigFactory(Long ruleId) { + this.fieldConfigProvider = new FieldConfigProvider(ruleId); + this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); + this.fieldRuleConfigProvider = new FieldRuleConfigProvider(ruleId); + this.datagramEventProvider = new DatagramEventProvider(ruleId); + } + + public FieldConfigProvider getFieldConfigProvider() { + return fieldConfigProvider; + } + + public CombinedFieldConfigProvider getCombinedFieldConfigProvider() { + return combinedFieldConfigProvider; + } + + public FieldRuleConfigProvider getFieldRuleConfigProvider() { + return fieldRuleConfigProvider; + } + + public DatagramEventProvider getDatagramEventProvider() { + return datagramEventProvider; + } + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java deleted file mode 100644 index 6e1719a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.factory; - - -import com.casic.missiles.pojo.ProtocolConfig; - -import java.util.List; - -/** - * 数据库访问优化(暂时未做) - *

- * 1、初始化协议解析配置,并存放到处存放缓存,对协议基本配置进行管理 - * 2、其中流程中所有的配置都经过此类进行管理,进行调用获取,增强解析速度 - */ -public interface DatagramFactory { - - /** - * 初始化 - */ - List datagramInit(); - - /** - * 根据前导码配置匹配,模糊匹配获取所有的报文项 - */ - List match(); - - /** - * 根据前导码匹配,返回报文项 - */ - List filer(); - - /** - * 保证数据的唯一性选择器 - */ - List selectOne(); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java new file mode 100644 index 0000000..87444a0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java @@ -0,0 +1,18 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +import java.util.List; + +/** + * 直接用,还是边用边创建 + */ +public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { + + + public DefaultProtocolConfigFactory(ProtocolConfig protocolConfig) { + super(protocolConfig); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java new file mode 100644 index 0000000..cce0c7c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java @@ -0,0 +1,12 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; + +public class DefaultRuleFactory extends AbstractRuleConfigFactory { + + public DefaultRuleFactory(Long ruleId) { + super(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java deleted file mode 100644 index 9ee97e0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.casic.missiles.parser.instance; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service -@Slf4j -@AllArgsConstructor -public class GeneralProcessor { - - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; - - /** - * 统一固定字段解析=>进行规则的查询的判断 - * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 - * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 - */ - @Deprecated - public boolean parseWholeDatagram(ByteBuf buffer, ProtocolConfig protocolConfig) { - try { - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap,protocolId); - //选取规则对应的流程= - DatagramEventConfig datagramEventConfig = processorSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); - //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); - //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); - //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); - //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); - //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); - return true; - } catch (Exception ex) { - log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", - ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); - return false; - } - } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; - } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); - } - - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); - return bizDataMap; - } - - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java index 25e7ad8..6a5777e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java @@ -1,23 +1,31 @@ package com.casic.missiles.parser.instance.impl; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.mapper.DatagramEventMapper; import com.casic.missiles.pojo.DatagramEventConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.SpringContextUtil; -@Service -@AllArgsConstructor +import java.util.List; +import java.util.Optional; + +/** + * @author cz + * + */ public class DefaultProcessorInstanceSelector implements ProcessorInstanceSelector { - private final DatagramEventMapper datagramEventMapper; + private static List datagramEventConfigs; + + static { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + datagramEventConfigs = datagramEventRegistry.getDatagramEventList(); + } @Override public DatagramEventConfig getProcessorInstance(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("rule_id", protocolId); - return datagramEventMapper.selectOne(queryWrapper); + Optional optionalSelectInstance = datagramEventConfigs.stream() + .filter(e -> e.getId().equals(protocolId)).limit(1).findFirst(); + return optionalSelectInstance.isPresent() ? optionalSelectInstance.get() : null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a778671..7b56a43 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,16 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import io.netty.buffer.ByteBuf; /** - * 分析匹配情况 - * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 - * 2、匹配不成功,有后续帧,可以进行下次匹配。 - * 3、匹配不成功,无后续帧,可以进行丢弃。 + * 分析匹配情况 + * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 + * 2、匹配不成功,有后续帧,可以进行下次匹配。 + * 3、匹配不成功,无后续帧,可以进行丢弃。 */ -public interface FrameStructMatcher{ +public interface FrameStructMatcher { - ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig); + ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 05320ab..8ebea78 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,23 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.ProtocolConfigMapper; +import com.casic.missiles.parser.provider.ProtocolConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Component; import java.util.List; import java.util.stream.Collectors; -@Component -@AllArgsConstructor public class LeadingCodeMatcher { - private final ProtocolConfigMapper protocolMapper; - //** 1、首字母匹配前导码, // 2、以匹配出的前导码是否在报文中条件进行前导码的匹配二次筛选 - public List matchLeadingCode(String protocolContent){ + public static List matchFrameLeadingCode(String protocolContent){ List initialConfigs = initialMatch(protocolContent); List preCodeConfigs = initialConfigs.stream() .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) @@ -26,13 +19,16 @@ } //初始化匹配前导码内容 - private List initialMatch(String protocolContent) { - String protocolStr = protocolContent.charAt(0) + ""; - QueryWrapper queryWrapper = new QueryWrapper() - .likeRight("pre_fix", protocolStr); - List protocolConfigList = protocolMapper.selectList(queryWrapper); - return protocolConfigList; + private static List initialMatch(String protocolContent) { + String firstFrameChar = protocolContent.charAt(0) + ""; + ProtocolConfigProvider protocolConfigProvider=new ProtocolConfigProvider(firstFrameChar); + return protocolConfigProvider.getMatchList(); } + + + + + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index cf2113d..e915877 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -1,32 +1,35 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(0) -@Service +@Component public class FrameLengthMatcher implements FrameStructMatcher { - @Autowired - private FieldParser fieldParser; - //超过长度 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { String dataGramContent = ByteBufUtil.hexDump(byteBuf); - if (StringUtils.isEmpty(protocolConfig.getUnpackId()) && StringUtils.isEmpty(protocolConfig.getTailStr())) { - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + //当不存在结尾标志和拆包标志,可以直接使用长度进行匹配 + if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { if (dataGramContent.length() >= totalLength) {//等于长度返回true,超出长度,切断 - ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, protocolConfig, totalLength); + ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, totalLength); return wholeDatagramByte; } else { //读的标志位前移舍弃 @@ -38,7 +41,7 @@ return null; } - private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, Integer totalLength) { byteBuf.readBytes(totalLength); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, totalLength - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 2bfc213..d527ad0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; @@ -13,7 +13,7 @@ import lombok.AllArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.nio.charset.Charset; import java.util.Map; @@ -22,32 +22,30 @@ * 后续标志验证 */ @Order(1) -@Service +@Component @AllArgsConstructor -public class FrameMarkMatcher implements FrameStructMatcher { - - private final FieldConfigDao fieldConfigDao; - private final FieldParser fieldParser; - private final FieldResolver fieldResolverManger; +public class FrameMarkMatcher implements FrameStructMatcher, FixedPropertyEnum { //帧后续标志=>结束,进行帧的重组=>有后续,1、帧移位判别 2、继续接收帧 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig UnpackConfig = StringUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getUnpackId()); - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); - Integer upback = 0; + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); ByteBuf mergeWholeFrameByte = null; - if (!ObjectUtil.isEmpty(UnpackConfig)) { - while (hasNextFullFrame(byteBuf, protocolConfig)) { - upback = (Integer) fieldResolverManger.filedParserManger(byteBuf, UnpackConfig, null); + if (!ObjectUtil.isEmpty(unpackFlag)) { + while (hasNextFullFrame(byteBuf, protocolConfig, protocolFieldConfigProvider)) { //是否存在后续位 - if (upback == 1) {//使用esayRule + if (unpackFlag == 1) {//使用esayRule //表示可以截取 - mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolConfig, totalLength); + mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolFieldConfigProvider, protocolConfig); return mergeWholeFrameByte; } else { - byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig)); + byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig, protocolFieldConfigProvider)); } } } @@ -56,7 +54,8 @@ //选取第一个帧,将业务内容和后面部分分开 //计算数据报文-业务内容 - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolFieldConfigProvider protocolFieldConfigProvider, ProtocolConfig protocolConfig) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); //截取完整报文 byteBuf.readBytes(totalLength); ByteBuf byteBufContent = byteBuf.slice(0, byteBuf.readerIndex()); @@ -68,15 +67,15 @@ String tail = ""; System.out.println(ByteBufUtil.hexDump(byteBufContent)); //会存在多个帧拼接在一起的的情况,进行合并处理 - while (hasNextFullFrame(byteBufContent, protocolConfig)) { - Integer currentFrameLength = fieldParser.getTotalLength(protocolConfig, byteBufContent); + while (hasNextFullFrame(byteBufContent, protocolConfig, protocolFieldConfigProvider)) { + Integer currentFrameLength = protocolFieldConfigProvider.getTotalLength(byteBufContent, protocolConfig); byteBufContent.readBytes(currentFrameLength); ByteBuf currentbyteBuf = byteBufContent.slice(0, byteBufContent.readerIndex()); byteBufContent.markReaderIndex();//读的标志位前移 System.out.println(ByteBufUtil.hexDump(byteBufContent)); String hexDump = currentbyteBuf.toString(Charset.forName("ISO-8859-1")); //获取当前固定帧结构的关系map - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, currentbyteBuf); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(currentbyteBuf, protocolConfig); if (StringUtils.isEmpty(mergeFrameStr)) { //首次获取业务数据报文 mergeFrameStr += hexDump.substring(0, currentFrameFixedProperty.get("tailPosition")); @@ -95,22 +94,22 @@ /** * 获取平移到下一帧起始位置 */ - public int getNextFrameOffset(ByteBuf buffer, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, buffer); - return currentFrameFixedProperty.get("totalLength"); + public int getNextFrameOffset(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + return currentFrameFixedProperty.get(TOTAL_LENGTH); } /** * 判断是否出错进行整个帧的 */ - public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, byteBuf); + public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); //保证读取位置不在固定位置,是可变的业务内容 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("fixedPosition")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(FIXED_POSITION)) { return false; } //判断读取是否操作帧长度 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("totalLength")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(TOTAL_LENGTH)) { return false; } return true; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 76a3784..c3a1bab 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -1,50 +1,50 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.parser.instance.GeneralProcessor; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; +import io.netty.buffer.ByteBufUtil;; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(2) -@Service +@Component public class FrameTailMatcher implements FrameStructMatcher { - @Resource - private FieldConfigDao fieldConfigDao; - @Autowired - private GeneralProcessor generalProcessor; - //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig tailFieldConfig = StringUtils.isEmpty(protocolConfig.getTailStr()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getTailStr()); - if (!ObjectUtil.isEmpty(tailFieldConfig)) { - String tailStr = tailFieldConfig.getFieldName(); + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfig protocolFieldConfig = ObjectUtils.isEmpty(protocolConfig.getTailStr()) ? null : + fieldConfigProvider.getFieldConfigById(protocolConfig.getTailStr()); + if (!ObjectUtil.isEmpty(protocolFieldConfig)) { + String tailStr = protocolFieldConfig.getFieldName(); String dataGramContent = ByteBufUtil.hexDump(byteBuf); Boolean tailFlag = ByteBufUtil.hexDump(byteBuf).contains(tailStr); if (!tailFlag) { //使用esayRule return null; } else if (dataGramContent.indexOf(tailStr) < dataGramContent.length() - tailStr.length()) { Integer length = dataGramContent.indexOf(tailStr) + tailStr.length(); - ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, protocolConfig, length); + ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, length); return wholeDatagramByte; //存在粘包 } } return null; } - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer length) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, Integer length) { byteBuf.readBytes(length); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, length - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java new file mode 100644 index 0000000..5f1c177 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java @@ -0,0 +1,73 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.combined.GenericCombinedFieldResolver; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.CombinedFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class CombinedFieldConfigProvider { + + + /** + * 作为临时配置列表缓存使用 + */ + private final List combinedFieldConfigList; + private Map storeObjectMap = new HashMap<>(); + + public CombinedFieldConfigProvider(Long ruleId) { + CombinedFieldConfigRegistry combinedFieldConfigRegistry = SpringContextUtil.getBean(CombinedFieldConfigRegistry.class); + combinedFieldConfigList = combinedFieldConfigRegistry.getCombinedFieldConfigList(ruleId); + } + + public void parseDataField(RuleConfig ruleConfig, String clearZeroPlain,Map fieldConfigsMap ) { + if (showSkip()) { + return; + } + //匹配对应的数据,然后进行相关的字段解析 + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver(); + combinedFieldResolver.parseDataField(combinedFieldConfigList, byteBuf, storeObjectMap,fieldConfigsMap); + } + + + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getCombinedFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return combinedFieldConfigList.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public List getCombinedFieldConfigList() { + return combinedFieldConfigList; + } + + /* 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(combinedFieldConfigList) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java new file mode 100644 index 0000000..f3cfedc --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java @@ -0,0 +1,11 @@ +package com.casic.missiles.parser.provider; + +/** + * @author cz + * @date 2023-6-12 + */ +public class CommandEventProvider{ + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java new file mode 100644 index 0000000..70eec5e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java @@ -0,0 +1,77 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.safe.SafeStrategy; +import com.casic.missiles.parser.sender.DataSubscribeProvider; +import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class DatagramEventProvider { + + private final DatagramEventConfig processorInstance; + + public DatagramEventProvider(Long ruleId) { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + List datagramEventConfigList = + datagramEventRegistry.getDatagramEventList(ruleId); + processorInstance = this.getProcessorInstance(datagramEventConfigList); + } + + public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { + if (showSkip()) { + return null; + } + return datagramEventConfigList.get(0); + } + + // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 + public String getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap) { + String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? + processorInstance.getSafeBean() : + fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); + if (!StringUtils.isEmpty(safeName)) { + //需要加密 + SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); + String plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); + return clearComplementZero(plain); + } + return ByteBufUtil.hexDump(bizDataContent); + } + + //解密清零操作 + private String clearComplementZero(String plain) { + plain = plain.substring(0, plain.lastIndexOf("00")); + return plain; + } + + //数据发送,数据发送者暂未构建 + public void storeData(Map bizDataMap) { + DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); +// dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return ObjectUtils.isNotEmpty(processorInstance) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java new file mode 100644 index 0000000..7e1fe0a --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java @@ -0,0 +1,97 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.FieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class FieldConfigProvider { + + + private final List fieldConfigs; + private Map storeObjectMap = new HashMap<>(); +// private Map singleObjects = new ConcurrentHashMap<>(); + + public FieldConfigProvider(Long ruleId) { + FieldConfigRegistry fieldConfigRegistry = SpringContextUtil.getBean(FieldConfigRegistry.class); + fieldConfigs = fieldConfigRegistry.getFieldConfigList(ruleId); + } + + public List getFieldConfigs() { + return fieldConfigs; + } + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public Map parseDataField(RuleConfig ruleConfig, String clearZeroPlain) { + if (showSkip()) { + return null; + } + List prepareFieldConfig = prepareParseField(ruleConfig); + if (CollectionUtils.isNotEmpty(prepareFieldConfig)) { + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(fieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + return fixDataMap; + } + } + return null; + } + + /** + * 得到需要处理的业务内容 + * + * @return + */ + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return fieldConfigs.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public Map getFieldConfigsMap() { + return fieldConfigs.stream().collect( + Collectors.toMap(FieldConfig::getId, e -> e) + ); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(fieldConfigs) ? false : true; + } + + +} + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java new file mode 100644 index 0000000..817bfaf --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java @@ -0,0 +1,19 @@ +package com.casic.missiles.parser.provider; + +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.registry.FieldRuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; + +public class FieldRuleConfigProvider { + + private final List fieldRuleConfigList; + + public FieldRuleConfigProvider(Long ruleId) { + FieldRuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(FieldRuleConfigRegistry.class); + fieldRuleConfigList = ruleConfigRegistry.getFieldRuleConfigList(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java new file mode 100644 index 0000000..99a1b06 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java @@ -0,0 +1,53 @@ +package com.casic.missiles.parser.provider; + + +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.registry.ProtocolConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolConfigProvider { + + private final List protocolConfigList; + + public ProtocolConfigProvider(String firstChar) { + ProtocolConfigRegistry registry = SpringContextUtil.getBean(ProtocolConfigRegistry.class); + protocolConfigList = registry.getProtocolConfigList(firstChar); + } + + public List getMatchList() { + return protocolConfigList; + } + + /** + * 设置当前协议 + * + * @param protocolConfig + */ + public ProtocolConfigProvider(ProtocolConfig protocolConfig) { + List protocolConfigs = new ArrayList<>(); + protocolConfigs.add(protocolConfig); + protocolConfigList = protocolConfigs; + } + + /** + * 获取当前协议 + * + * @return + */ + public ProtocolConfig getCurrentProtocolConfig() { + if (this.protocolConfigList == null) { + return null; + } else { + return protocolConfigList.get(0); + } + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java new file mode 100644 index 0000000..043927d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java @@ -0,0 +1,213 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.registry.ProtocolFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolFieldConfigProvider { + + private static final String FIXED_FIELD_DS = "fixedFieldDs"; + private static final String CONTENT_FIELD_DS = "contentFieldDs"; + private static final String PROTOCOL_LENGTH = "protocolLength"; + private static final String PROTOCOL_FIELD_ID = "protocolFieldId"; + private static final String PROTOCOL_POSITION = "protocolPosition"; + + private final List protocolFieldConfigs; + private Map singleObjects = new ConcurrentHashMap<>(); + private Map storeObjectMap = new HashMap<>(); + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public ProtocolFieldConfigProvider(Long protocolId) { + ProtocolFieldConfigRegistry protocolFieldConfigRegistry = SpringContextUtil.getBean(ProtocolFieldConfigRegistry.class); + protocolFieldConfigs = protocolFieldConfigRegistry.getProtocolFieldConfigList(protocolId); + } + + public List getProtocolFieldConfigs() { + return protocolFieldConfigs; + } + + public ProtocolFieldConfig getFieldConfigById(Long fieldId) { + Optional optionalConfig = protocolFieldConfigs.stream().filter( + e -> e.getId().equals(fieldId) + ).findFirst(); + return optionalConfig.isPresent() ? optionalConfig.get() : null; + } + + public Integer getProtocolFieldValue(Long protocolFieldId, ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_FIELD_ID + protocolFieldId + ByteBufUtil.hexDump(byteBuf); + //获取缓存 + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + //加载固定长度数据集合 + Map fixDataMap = this.getProtocolDataMap(byteBuf); + ProtocolFieldConfig protocolFieldConfig = selectFieldConfig(protocolFieldId); + Integer protocolFieldValue = 0; + //获取约定字段的总长度 + if (fixDataMap.containsKey(protocolFieldConfig.getFieldName())) { + Object appointUnpackObject = fixDataMap.get(protocolFieldConfig.getFieldName()); + if (ObjectUtils.isNotEmpty(appointUnpackObject)) { + protocolFieldValue = (Integer) appointUnpackObject; + } + } + if (protocolFieldValue != null) { + //加入缓存 + if (ObjectUtils.isNotEmpty(protocolFieldValue)) { + this.singleObjects.put(catchKey, protocolFieldValue); + return protocolFieldValue; + } + } + return null; + } + + /** + * 获取帧固定位置信息 + * + * @param byteBuf + * @param protocolConfig + * @return + */ + public Map getFixedProperty(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_POSITION + protocolConfig.getId(); + if (this.singleObjects.containsKey(catchKey)) { + return (Map) singleObjects.get(catchKey); + } + Map fixedPropertyMap = new HashMap<>(); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + fixedPropertyMap = fieldParser.doGetFixedProperty(protocolFieldConfigs, this.getTotalLength(byteBuf,protocolConfig)); + if (CollectionUtils.isNotEmpty(fixedPropertyMap)) { + this.singleObjects.put(catchKey, fixedPropertyMap); + return fixedPropertyMap; + } + return fixedPropertyMap; + } + + /** + * 获取帧结构应有的总长度 + */ + public Integer getTotalLength(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_LENGTH + ByteBufUtil.hexDump(byteBuf); + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + Integer appointFrameLength = getProtocolFieldValue(protocolConfig.getTotalLengthId(), byteBuf); + if (appointFrameLength != null) { + //获取过滤的字段集合总长度 + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Integer totalFilterLength = fieldParser.getTotalFilterLength(protocolConfig, byteBuf, getFixFieldConfigMap()); + //计算总长度 + Integer totalLength = appointFrameLength + totalFilterLength; + //加入缓存 + if (ObjectUtils.isNotEmpty(totalLength)) { + this.singleObjects.put(catchKey, totalLength); + return totalLength; + } + } + return null; + } + + /** + * 获取协议有关字段解析内容 + * storeObjectMap存储代转存的数据 + * + * @return + */ + public Map getProtocolDataMap(ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(FIXED_FIELD_DS)) { + return (Map) singleObjects.get(FIXED_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(protocolFieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + this.singleObjects.put(FIXED_FIELD_DS, fixDataMap); + return fixDataMap; + } + return null; + } + + /** + * 获取业务报文内容的content字节 + * + * @param wholeDatagramByte + * @return + */ + public ByteBuf getDataContentBuf(ByteBuf wholeDatagramByte) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(CONTENT_FIELD_DS)) { + return (ByteBuf) singleObjects.get(CONTENT_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + ByteBuf bizDataByteBuf = fieldParser.getDataContentBuf(protocolFieldConfigs, wholeDatagramByte); + if (bizDataByteBuf != null) { + this.singleObjects.put(CONTENT_FIELD_DS, bizDataByteBuf); + return bizDataByteBuf; + } + return null; + } + + + private ProtocolFieldConfig selectFieldConfig(Long id) { + Optional optionalProtocolFieldConfig = this.protocolFieldConfigs.stream().filter( + e -> e.getId().equals(id) + ).findFirst(); + return optionalProtocolFieldConfig.isPresent() ? optionalProtocolFieldConfig.get() : null; + } + + + private Map getFixFieldConfigMap() { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, e -> e) + ); + return fixDataFieldMap; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(protocolFieldConfigs) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java new file mode 100644 index 0000000..dafba1c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java @@ -0,0 +1,56 @@ +package com.casic.missiles.parser.provider; + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.rule.GenericRuleResolver; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.RuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleConfigProvider { + + private final List ruleConfigs; + + public List getRuleConfigs() { + return ruleConfigs; + } + + public RuleConfigProvider(Long protocolId) { + RuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(RuleConfigRegistry.class); + ruleConfigs = ruleConfigRegistry.getRuleConfigById(protocolId); + } + + /** + * 获取规则匹配结果 + * + * @param parseFixedDataMap + * @param protocolFieldConfigs + * @return + */ + public RuleConfig doGetRule(Map parseFixedDataMap, + String ids, + List protocolFieldConfigs) { + if (showSkip()) { + return null; + } + RuleConfig ruleConfig = GenericRuleResolver.machRule(parseFixedDataMap, ids, protocolFieldConfigs, ruleConfigs); + return ruleConfig; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(ruleConfigs) ? false : true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java index 3c05891..856b399 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java @@ -1,18 +1,11 @@ package com.casic.missiles.parser.resolver; -import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.springframework.web.bind.annotation.RequestBody; -import javax.annotation.Resource; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -20,19 +13,17 @@ @Slf4j public class ByteMergeProvider { - @Resource - private FieldRuleEngineMapper fieldRuleEngineMapper; - //拿到所有的值合并到一个值 - public String resolveByteMerge(List valueList, String ruletypeId, String vaildRange) { + public static String resolveByteMerge(List valueList, String ruleTypeId, String vaildRange) { String values = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Map vaildMap = getValidRangeMap(vaildRange); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(ruletypeId); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } + //暂时不处理 +// fieldRuleEngine = fieldRuleConfigMapper.selectById(ruleTypeId); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } Map env2 = new HashMap(); for (int i = 0; i < valueList.size(); i++) { if (vaildMap.containsKey(i)) { @@ -47,7 +38,7 @@ } } - private Map getValidRangeMap(String vaildRange) { + private static Map getValidRangeMap(String vaildRange) { String[] range = vaildRange.split(","); Map vaildMap = new HashMap(); for (int i = 0; i < range.length; i++) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 8d821cd..85d6bbf 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -1,9 +1,12 @@ package com.casic.missiles.parser.resolver; +import com.casic.missiles.pojo.AbstractFieldConfig; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; import io.netty.buffer.ByteBuf; +import java.util.List; import java.util.Map; /** @@ -11,18 +14,14 @@ */ public interface FieldParser { -// Map fieldProcess(String protocolContent,); - Map dataParser(RuleConfig ruleConfig, String lightText,String protocolId); + Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength); - Map fixDataParser(String protocolId, ByteBuf buffer); + Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap); - Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf); + ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer); - ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer); - - ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer); - - Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer); + Integer getTotalFilterLength(ProtocolConfig protocolConfig, ByteBuf byteBuf, Map protocolFieldConfigMap); } + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java new file mode 100644 index 0000000..9e0c00e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java @@ -0,0 +1,52 @@ +package com.casic.missiles.parser.resolver; + +import com.casic.missiles.pojo.AbstractFieldConfig; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.util.List; + +public class FieldParserSupport { + + //分别计算bit和byte长度=> 合并长度 + protected Integer calculateLength(List fieldConfigList) { + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + Integer fixedLength = bytefixedLength + bitfixedLength / 8; + return fixedLength; + } + + //找到最大值=> 根据最大值计算业务数据下标 + protected Integer calculatePosition(List fieldConfigList) { + String rex = "[0-9]+"; + Integer max = -1; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) + && Integer.valueOf(fieldConfig.getOriginPositionByte()) > max) { + max = Integer.valueOf(fieldConfig.getOriginPositionByte()); + } + } + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) && fieldConfig.getOriginPositionByte().equals(max)) { + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + } + } + Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; + return maxFixedPosition; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java deleted file mode 100644 index dd3a6cd..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java +++ /dev/null @@ -1,170 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.ByteResolverParam; -import io.netty.buffer.ByteBuf; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -/** - * 字段解析管理总类 - */ -@Service -@Slf4j -@AllArgsConstructor -public class FieldResolver extends ByteMergeProvider { - - //1、字段截取 => 2、简单的字节解析和复杂的字节解析 - public Object filedParserManger(ByteBuf byteBuf, FieldConfig fieldConfig, Integer maxFixedPosition) { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - //最大固定位置不为空, - if (!ObjectUtil.isEmpty(maxFixedPosition)) { - orignPosition -= maxFixedPosition; - } - Object fieldValue = 0; - //待优化 - if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { - fieldValue = bitToResolver(byteBuf, fieldConfig); - } else { - ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); - fieldValue = parsingFields(fieldBytes, fieldConfig.getRuleJson()); - } - return fieldValue; - } - - //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, - //目前默认配置的规则设置暂不支持配置化,由实现完成 - private Object parsingFields(ByteBuf byteBuf, String ruleJson) { - Object fieldsResolveValue = null; - List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); - if (ObjectUtil.isEmpty(ruleMapList)) { - fieldsResolveValue = defaultResolveBuilder(byteBuf); - } else { - fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); - } - return fieldsResolveValue; - } - - private Object defaultResolveBuilder(ByteBuf byteBuf) { - Integer defaultResolveValue = 0; - for (int i = 0; i < byteBuf.writerIndex(); i++) { - defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; - } - return defaultResolveValue; - } - - //字段解析构建器(针对字节单位的) - //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 - // 字节归并结束或者规则结束=>继续根据规则进行判断 - private Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { - Object customizeResolveValue = null; - try { - List bytStrList = new ArrayList<>(); - //存放到数组里面 - for (int i = 0; i < byteBuf.writerIndex(); i++) { - bytStrList.add(byteBuf.readByte()); - } - int i = 0; - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - customizeResolveValue = this.resolveByteMerge(bytStrList, ruletypeId,vaildRange); - break; - } else { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - List tempBytStr = new ArrayList<>(); - for (int k = 0; i < bytStrList.size(); i++) { - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(k) - .value(bytStrList.get(k)) - .ruletypeId(ruletypeId).build(); - tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); - } - bytStrList = tempBytStr; - } - i++; - } - //字节归并到一起=>继续根据规则进行判断 - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(customizeResolveValue) - .ruletypeId(ruletypeId).build(); - customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(customizeResolveValue)); - return customizeResolveValue; - } catch (RuntimeException ex) { - log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); - return null; - } - } - - /** - * 1、单个字节情况表示字段 - * 2、多字节情况表示字段(暂未处理) - */ - private Object bitToResolver(ByteBuf byteBuf, FieldConfig fieldConfig) { - Object fieldValue = new Object(); - try { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - byte fields = 0x00; - if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); - } else { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); - } - - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { - if (!StringUtils.isEmpty(fieldConfig.getExactOrignPosition())) { - fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getExactOrignPosition())).byteValue() - >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); - } else { - fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); - } - } else { - fieldValue = Integer.valueOf(fields & 0xff); - } - if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { - return fieldValue; - } - List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); - int i = 0; - //字节归并到一起=>继续根据规则进行判断 - while (i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(fieldValue) - .ruletypeId(ruletypeId).build(); - fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(fieldValue)); - return fieldValue; - } catch (RuntimeException ex) { - log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); - return null; - } - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java new file mode 100644 index 0000000..1d2aeab --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java @@ -0,0 +1,36 @@ +package com.casic.missiles.parser.resolver.bytes; + +import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.mapper.FieldRuleConfigMapper; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.pojo.ByteResolverParam; +import com.googlecode.aviator.AviatorEvaluator; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; +//转换规则 +@Component("convert") +@AllArgsConstructor +@Slf4j +public class ByteRuleResolver implements ByteResolver { + + private final FieldRuleConfigMapper fieldRuleConfigMapper; + + @Override + public Object resolveOperationRule(ByteResolverParam byteResolverParam){ + FieldRuleConfig fieldRuleEngine=fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); + if(ObjectUtil.isEmpty(fieldRuleEngine)){ + return byteResolverParam.getValue(); + } + String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); + Map env2 = new HashMap(); + env2.put("value", (byte) byteResolverParam.getValue()); + String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); + return values; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java index 103821c..786b71c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java @@ -2,34 +2,34 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("logicalShift") +@Component("logicalShift") @AllArgsConstructor @Slf4j public class LogicalShiftResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //字节位移 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { Integer index = byteResolverParam.getIndex(); - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return byteResolverParam.getValue(); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java index 476747d..01149bd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("operation") +@Component("operation") @AllArgsConstructor @Slf4j public class OperationResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //混合运算,有常量或者乘除的缩放 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java index 0b82cf4..79abcce 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.casic.missiles.pojo.ByteResolverParam; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; //精度计算 -@Service("precision") +@Component("precision") @AllArgsConstructor @Slf4j public class PrecisionResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java deleted file mode 100644 index 5c3f332..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; -//转换规则 -@Service("convert") -@AllArgsConstructor -@Slf4j -public class RuleResolver implements ByteResolver { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam){ - RuleEvaluator fieldRuleEngine=fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); - if(ObjectUtil.isEmpty(fieldRuleEngine)){ - return byteResolverParam.getValue(); - } - String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); - Map env2 = new HashMap(); - env2.put("value", (byte) byteResolverParam.getValue()); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java new file mode 100644 index 0000000..d3bbd91 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java @@ -0,0 +1,15 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; + +import java.util.List; +import java.util.Map; +// 前导码匹配->长度字段 +public interface AbstractCombinedFieldProcessor { + + Map invoke(Map map, ByteBuf byteBuf, List combinedFieldConfigList, + Map fieldConfigsMap, Map storeObjectMap); + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java new file mode 100644 index 0000000..03c8480 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java @@ -0,0 +1,59 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-13 + */ +//依次递增进行数据的解析, +public class GenericCombinedFieldResolver { + + + //通过查询,字段长度长度随机 + public void parseDataField(List combinedFieldConfigList, ByteBuf byteBuf, + Map storeObjectMap, Map fieldConfigsMap) { + Integer frameLength = Integer.valueOf(ByteBufUtil.hexDump(byteBuf)); + //添加前置处理器 + com.casic.missiles.util.ClassUtil classUtil = new com.casic.missiles.util.ClassUtil(); + List abstractCombinedProcessors = classUtil.getSubClassList(AbstractCombinedFieldProcessor.class); + + Map fieldFixedMap = combinedFieldLeadCodeMap(combinedFieldConfigList); + //frameLength + Map combinedProcessorFields = null; + while (byteBuf.readableBytes() < frameLength) { + //一直处理 + for (AbstractCombinedFieldProcessor abstractCombinedProcessor : abstractCombinedProcessors) { + combinedProcessorFields = abstractCombinedProcessor.invoke(combinedProcessorFields, byteBuf, + combinedFieldConfigList, + fieldConfigsMap, storeObjectMap); + if (combinedProcessorFields == null || byteBuf.readableBytes() < frameLength) { + return; + } + } + + } + } + + /** + * 取出前导码匹配集合 + */ + private Map combinedFieldLeadCodeMap(List combinedFieldConfigList) { + Map fieldFixedMap = combinedFieldConfigList + .stream() + .collect(Collectors.toMap(CombinedFieldConfig::getPrefixCode, e -> e)); + return fieldFixedMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java new file mode 100644 index 0000000..643a934 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java @@ -0,0 +1,100 @@ +package com.casic.missiles.parser.resolver.fields; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.FieldParserSupport; +import com.casic.missiles.pojo.*; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 保存使用时最基本的信息,并且使用原型模式 + */ +@Slf4j +public class DefaultProtocolFieldParser extends FieldParserSupport implements FieldParser, FixedPropertyEnum { + + //通过传入的配置和报文进行字段解析 + @Override + public Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap) { + Map dataMap = new HashMap<>(); + for (AbstractFieldConfig protocolFieldConfig : protocolFieldConfigs) { + if (!ObjectUtils.isEmpty(protocolFieldConfig.getOriginPositionByte())) { + Object fieldValue = FieldResolver.parseField(buffer, protocolFieldConfig, null); + if (protocolFieldConfig.getIsStorage() == 1) { + storeObjectMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + dataMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + } + return dataMap; + } + + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength) { + Map fixedPropertyMap = new HashMap<>(); + Integer fixedLength = calculateLength(protocolFieldConfigs); + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + fixedPropertyMap.put(FIXED_POSITION, maxFixedPosition); + fixedPropertyMap.put(TOTAL_LENGTH, totalLength); + fixedPropertyMap.put(TAIL_POSITION, totalLength - fixedLength + maxFixedPosition); + return fixedPropertyMap; + } + + //** 获取业务内容的byteBuf + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer) { + //计算固定长度 + Integer fixedLength = calculateLength(protocolFieldConfigs); + //总长度获取 + String lightText = buffer.toString(Charset.forName("ISO-8859-1")); + Integer totalLength = lightText.length(); + //计算固定长度最大长度 + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + //计算数据报文内容 + ByteBuf bizDataFields = buffer.slice(maxFixedPosition - 1, (totalLength - fixedLength)); + return bizDataFields; + } + + /** + * 获取过滤字段的长度 + */ + @Override + public Integer getTotalFilterLength(ProtocolConfig protocolConfig, + ByteBuf byteBuf, + Map protocolFieldConfigMap) { + if (ByteBufUtil.hexDump(byteBuf).equals("")) { + return 0; + } + int totalFilterLength = 0; + String filterFields = protocolConfig.getTotalLengthFilterFields(); + try { + if (!StringUtils.isEmpty(filterFields)) { + String[] filterFieldList = filterFields.split(","); + for (String filterFieldId : filterFieldList) { + if (StringUtils.isNotEmpty(filterFieldId)) { + ProtocolFieldConfig fieldConfig = protocolFieldConfigMap.get(Long.valueOf(filterFieldId)); + //这里都是按字节计算,没有对位进行区分,可能会出现错误 + // 如果对位有需求,需要进一步跟进 + totalFilterLength += fieldConfig.getOffsetLength(); + } + } + } + return totalFilterLength; + } catch (Exception ex) { + log.error("报文确认分发阶段,获取报文总长度过滤长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); + } + return totalFilterLength; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java new file mode 100644 index 0000000..d51e887 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java @@ -0,0 +1,169 @@ +package com.casic.missiles.parser.resolver.fields; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.parser.resolver.ByteMergeProvider; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.AbstractFieldConfig; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.pojo.ByteResolverParam; +import io.netty.buffer.ByteBuf; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * 字段解析管理总类 + */ +@Slf4j +public class FieldResolver extends ByteMergeProvider { + + //1、字段截取 => 2、简单的字节解析和复杂的字节解析 + public static Object parseField(ByteBuf byteBuf,AbstractFieldConfig fieldConfig, Integer maxFixedPosition) { + Integer orignPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + //最大固定位置不为空, + if (!ObjectUtil.isEmpty(maxFixedPosition)) { + orignPosition -= maxFixedPosition; + } + Object fieldValue = 0; + //待优化 + if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { + fieldValue = doParseBitField(byteBuf, fieldConfig); + } else { + ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); + fieldValue = doParseByteField(fieldBytes, fieldConfig.getRuleJson()); + } + return fieldValue; + } + + //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, + //目前默认配置的规则设置暂不支持配置化,由实现完成 + private static Object doParseByteField(ByteBuf byteBuf, String ruleJson) { + Object fieldsResolveValue = null; + List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); + if (ObjectUtil.isEmpty(ruleMapList)) { + fieldsResolveValue = defaultResolveBuilder(byteBuf); + } else { + fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); + } + return fieldsResolveValue; + } + + private static Object defaultResolveBuilder(ByteBuf byteBuf) { + Integer defaultResolveValue = 0; + for (int i = 0; i < byteBuf.writerIndex(); i++) { + defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; + } + return defaultResolveValue; + } + + //字段解析构建器(针对字节单位的) + //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 + // 字节归并结束或者规则结束=>继续根据规则进行判断 + private static Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { + Object customizeResolveValue = null; + try { + List bytStrList = new ArrayList<>(); + //存放到数组里面 + for (int i = 0; i < byteBuf.writerIndex(); i++) { + bytStrList.add(byteBuf.readByte()); + } + int i = 0; + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { + if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + customizeResolveValue = resolveByteMerge(bytStrList, ruletypeId, vaildRange); + break; + } else { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + List tempBytStr = new ArrayList<>(); + for (int k = 0; i < bytStrList.size(); i++) { + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(k) + .value(bytStrList.get(k)) + .ruletypeId(ruletypeId).build(); + tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); + } + bytStrList = tempBytStr; + } + i++; + } + //字节归并到一起=>继续根据规则进行判断 + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(null) + .value(customizeResolveValue) + .ruletypeId(ruletypeId).build(); + customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); + i++; + } + System.out.println(JSON.toJSON(customizeResolveValue)); + return customizeResolveValue; + } catch (RuntimeException ex) { + log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); + return null; + } + } + + /** + * 1、单个字节情况表示字段 + * 2、多字节情况表示字段(暂未处理) + */ + private static Object doParseBitField(ByteBuf byteBuf,AbstractFieldConfig fieldConfig) { + Object fieldValue = new Object(); + try { + Integer orignPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + byte fields = 0x00; + if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { + fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); + } else { + fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); + } + + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { + if (!StringUtils.isEmpty(fieldConfig.getOriginPositionBit())) { + fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getOriginPositionBit())).byteValue() + >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); + } else { + fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); + } + } else { + fieldValue = Integer.valueOf(fields & 0xff); + } + if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { + return fieldValue; + } + List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); + int i = 0; + //字节归并到一起=>继续根据规则进行判断 + while (i < ruleMapList.size()) { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(null) + .value(fieldValue) + .ruletypeId(ruletypeId).build(); + fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); + i++; + } + System.out.println(JSON.toJSON(fieldValue)); + return fieldValue; + } catch (RuntimeException ex) { + log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); + return null; + } + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java deleted file mode 100644 index 35ae3d0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java +++ /dev/null @@ -1,183 +0,0 @@ -package com.casic.missiles.parser.resolver.fields; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufAllocator; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; -import org.springframework.util.ObjectUtils; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service("standard") -@AllArgsConstructor -@Slf4j -public class StandardFieldParser implements FieldParser { - - private final FieldConfigDao fieldConfigDao; - private final FieldResolver fieldResolver; - - //数据解析 - @Override - public Map dataParser(RuleConfig ruleConfig, String lightText, String protocolId) { - String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); - ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); - bufferContent.writeBytes(lightText.getBytes(Charset.forName("ISO-8859-1"))); - Map dataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - for (String dataFieldId : dataFieldIds) { - FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(dataFieldId); - if (!ObjectUtils.isEmpty(fieldConfig)) { - dataMap.put(fieldConfig.getFieldName(), String.valueOf(fieldResolver.filedParserManger(bufferContent, fieldConfig, maxFixedPosition))); - } - } - return dataMap; - } - - //数据解析 - @Override - public Map fixDataParser(String protocolId, ByteBuf buffer) { - List dataFieldIdList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Map dataMap = new HashMap<>(); - for (FieldConfig dataField : dataFieldIdList) { - if (!ObjectUtils.isEmpty(dataField.getOrignPosition())) { - Object fieldValue = (Integer) fieldResolver.filedParserManger(buffer, dataField, null); - dataMap.put(dataField.getFieldName(), fieldValue); - } - } - return dataMap; - } - - @Override - public Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf) { - if (ByteBufUtil.hexDump(byteBuf).equals("")) { - return 0; - } - String filterFields = protocolConfig.getTotalLengthFilterField(); - Integer totalLength = 0; - try { - FieldConfig totalFieldConfig = fieldConfigDao.getFieldConfigById(protocolConfig.getTotalLengthId()); - int totalFilterLength = 0; - if (!StringUtils.isEmpty(filterFields)) { - String[] filterFieldList = filterFields.split(","); - for (String filterField : filterFieldList) { - FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(filterField); - //这里都是按字节计算,没有对位进行区分,可能会出现错误 - - // 如果对位有需求,需要进一步跟进 - totalFilterLength += fieldConfig.getOffsetLength(); - } - } - totalLength = (Integer) fieldResolver.filedParserManger(byteBuf, totalFieldConfig, null) + totalFilterLength; - } catch (Exception ex) { - log.error("报文确认分发阶段,获取报文总长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); - } - return totalLength; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer) { - //业务内容 - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - String protocolId = String.valueOf(protocolConfig.getId()); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - //计算固定长度 - Integer fixedLength = calculateLength(fieldConfigList); -// Integer totalLength = this.getTotalLength(protocolConfig, buffer); - //总长度获取 - Integer totalLength = lightText.length(); - //计算固定长度最大长度 - Integer maxFixedPosition = calculatePosition(fieldConfigList); -// buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - //计算数据报文内容 - ByteBuf bizDataFields = buffer.slice(maxFixedPosition-1, (totalLength - fixedLength)); - return bizDataFields; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer) { - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - String protocolId = String.valueOf(protocolConfig.getId()); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer fixedLength = calculateLength(fieldConfigList); -// Integer totalLength = this.getTotalLength(protocolConfig, buffer); - Integer totalLength = lightText.length(); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - ByteBuf fixDataFields = buffer.slice(0, maxFixedPosition); - return fixDataFields; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer) { - String protocolId = String.valueOf(protocolConfig.getId()); - Map fixedPropertyMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer fixedLength = calculateLength(fieldConfigList); - Integer totalLength = this.getTotalLength(protocolConfig, buffer); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - fixedPropertyMap.put("fixedPosition", maxFixedPosition); - fixedPropertyMap.put("totalLength", totalLength); - fixedPropertyMap.put("tailPosition", totalLength - fixedLength + maxFixedPosition); - return fixedPropertyMap; - } - - //分别计算bit和byte长度=> 合并长度 - private Integer calculateLength(List fieldConfigList) { - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (FieldConfig fieldConfig : fieldConfigList) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - Integer fixedLength = bytefixedLength + bitfixedLength / 8; - return fixedLength; - } - - //找到最大值=> 根据最大值计算业务数据下标 - private Integer calculatePosition(List fieldConfigList) { - String rex = "[0-9]+"; - Integer max = -1; - for (FieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOrignPosition()) - && Integer.valueOf(fieldConfig.getOrignPosition()) > max) { - max = Integer.valueOf(fieldConfig.getOrignPosition()); - } - } - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (FieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOrignPosition()) && fieldConfig.getOrignPosition().equals(max)) { - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - } - } - Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; - return maxFixedPosition; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java new file mode 100644 index 0000000..d4ec6c7 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java @@ -0,0 +1,76 @@ +package com.casic.missiles.parser.rule; + +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import org.apache.commons.lang3.StringUtils; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class GenericRuleResolver { + + //根据前置字段的值,找到指定的规则 + //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 + //=>循环判断=>通过规则得到业务字段 + public static RuleConfig machRule(Map fixDataMap, + String ids, + List protocolFieldConfigs, + List ruleConfigs) { + List preRuleConfigList = getPreRuleList(ids, protocolFieldConfigs); + //获取前置规则字段 + final Map metaDataMap = getPreRuleFields(preRuleConfigList, fixDataMap); + //准备固定的字段集合 + Map fixDataFieldMap = getFixDataFieldMap(protocolFieldConfigs); + return RuleResolverCore.doMachRule(ruleConfigs, metaDataMap, fixDataMap, fixDataFieldMap); + } + + private static Map getFixDataFieldMap(List protocolFieldConfigs) { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, ProtocolFieldConfig::getFieldName) + ); + return fixDataFieldMap; + } + + + /** + * 查询前置规则的字段配置 + * + * @param ids + * @return + */ + private static List getPreRuleList(String ids, List protocolFieldConfigs) { + String[] idList = ids.split(","); + Map prepareMaps = new HashMap<>(); + for (String id : idList) { + if (StringUtils.isNotEmpty(id)) { + prepareMaps.put(Long.valueOf(id), ""); + } + } + List preRuleConfigList = protocolFieldConfigs + .stream() + .filter(e -> prepareMaps.containsKey(e.getId())) + .collect(Collectors.toList()); + return preRuleConfigList; + } + + /** + * 获取前置规则解析字段 + */ + private static Map getPreRuleFields(List preRuleFieldConfigList, Map fixDataMap) { + Map ruleFieldMap = new HashMap<>(); + preRuleFieldConfigList.stream() + .forEach( + preRuleFieldConfig -> { + String fieldName = preRuleFieldConfig.getFieldName(); + if (fixDataMap.containsKey(fieldName)) { + ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); + } + } + ); + return ruleFieldMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java new file mode 100644 index 0000000..baae7e8 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -0,0 +1,68 @@ +package com.casic.missiles.parser.rule; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.casic.missiles.pojo.RuleConfig; + +import java.util.*; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleResolverCore { + + + public static RuleConfig doMachRule(List ruleConfigList, Map metaDataMap, + Map fixDataMap, + Map fixDataFieldMap) { + Optional ruleConfigOptional = ruleConfigList.stream() + .filter(ruleConfig -> machRuleConfig( + JSON.parseObject(ruleConfig.getMatchRuleJson(), Map.class), metaDataMap)) + .findFirst(); + if (ObjectUtil.isEmpty(ruleConfigOptional)) { + return null; + } + String[] ruleFields = ruleConfigOptional.get().getDataFieldIds().split(","); + Map ruleMetaDataMap = getRuleFields(ruleFields, fixDataMap, fixDataFieldMap); + //递归选定解析规则,进行规则解析 + if (!ruleConfigOptional.get().getIsFinishMatch().equals("1")) { + //递归选定规则 + doMachRule(ruleConfigList, ruleMetaDataMap, fixDataMap, fixDataFieldMap); + } + return ruleConfigOptional.get(); + } + + + private static Map getRuleFields(String[] preRuleConfigList, Map fixedDataMap, + Map fixedFieldMap) { + Map ruleFieldMap = new HashMap<>(); + for (String preRuleConfigId : preRuleConfigList) { + String fieldName = fixedFieldMap.get(preRuleConfigId); + if (fixedDataMap.containsKey(fieldName)) { + ruleFieldMap.put(fieldName, String.valueOf(fixedDataMap.get(fieldName))); + } + } + return ruleFieldMap; + } + + + //匹配规则配置 + private static Boolean machRuleConfig(Map ruleMap, Map metaDataMap) { + if (ruleMap == null || metaDataMap == null) { + return null; + } + //所有的字段在规则里面必须有有配置 + for (String key : metaDataMap.keySet()) { + if (ruleMap.containsKey(key)) { + if (!ruleMap.get(key).equals(metaDataMap.get(key))) { + return false; + } + } else { + return false; + } + } + return true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java deleted file mode 100644 index 664088d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java +++ /dev/null @@ -1,92 +0,0 @@ -package com.casic.missiles.parser.rule; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.mapper.dao.PreRuleConfigDao; -import com.casic.missiles.mapper.dao.RuleConfigDao; -import lombok.AllArgsConstructor; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.*; -import java.util.stream.Collectors; - -@Service -@AllArgsConstructor -public class RulerProvider { - - private final FieldConfigDao fieldConfigDao; - private final PreRuleConfigDao preRuleConfigDao; - private final RuleConfigDao ruleConfigDao; - - //根据前置字段的值,找到指定的规则 - //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 - //=>循环判断=>通过规则得到业务字段 - public RuleConfig ruleConfig(Map fixDataMap, String protocolId) { - //批量获取规则 - List preRuleConfigList = preRuleConfigDao.getPreRuleList(protocolId); - //获取固定字段 - Map fixFieldMap = getAllFieldMap(protocolId); - //获取前置规则字段 - final String preRuleFields = getPreRuleFields(preRuleConfigList, fixDataMap, fixFieldMap); - List ruleConfigList = ruleConfigDao.getRuleConfigById(protocolId); - Optional ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig ->preRuleFields.equals( ruleConfig.getParseRuleJson())).findFirst(); - //递归选定解析规则,进行规则解析 - while (!ObjectUtil.isEmpty(ruleConfigOptional) && !ruleConfigOptional.get().getIsBizField().equals("1")) { - String ruleFields = getRuleFields(ruleConfigOptional.get().getDataFieldIds().split(","), fixDataMap, fixFieldMap); - ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig -> ruleConfig.getParseRuleJson().equals(ruleFields)).findFirst(); - } - return ruleConfigOptional.get(); - } - - /** - * 获取前置规则解析字段 - */ - private String getPreRuleFields(List preRuleConfigList, Map fixDataMap, Map fixFieldMap) { - Map ruleFieldMap= new HashMap<>(); - preRuleConfigList.stream() - .forEach( - preRuleConfig -> { - String fieldName = fixFieldMap.get(Long.valueOf(preRuleConfig.getRuleFieldId())); - if (fixDataMap.containsKey(fieldName)) { - ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); - } - } - ); - return JSONObject.toJSONString(ruleFieldMap); - } - - private Map getAllFieldMap(String protocolId) { - List fieldList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Map fixFieldMap = fieldList.stream().collect( - Collectors.toMap(FieldConfig::getId, FieldConfig::getFieldName) - ); - return fixFieldMap; - } - - private String getRuleFields(String[] preRuleConfigList, Map fixDataMap, Map fixFieldMap) { - Map ruleFieldMap= new HashMap<>(); - for (String preRuleConfigId : preRuleConfigList) { - String fieldName = fixFieldMap.get(preRuleConfigId); - if (fixDataMap.containsKey(fieldName)) { - ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); - } - } - return JSONObject.toJSONString(ruleFieldMap); - } - - //弃置 - private String ListToString(List ruleFieldList) { - String ruleFields = ""; - for (String ruleField : ruleFieldList) { - ruleFields += ruleField + ","; - } - ruleFields = StringUtils.isEmpty(ruleFields) ? ruleFields : ruleFields.substring(0, ruleFields.length() - 1); - return ruleFields; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java index 6177e10..bfa87a5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java @@ -2,7 +2,7 @@ public interface SafeStrategy { - String decryption(byte[] bytes); + String decryption(String cipher); String encryption(String lightText); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java index 618716c..6236302 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java @@ -9,9 +9,9 @@ //十六进制的字符串转换成字节数组 byte[] bytes = hexStrToBinaryStr(msg); //计算CRC8 - byte crc8 = CRC8(bytes, 0, bytes.length); - String crc8ToStr = "" + Integer.toHexString(0xff & crc8); - return crc8ToStr; +// String crc8ToStr = "" + Integer.toHexString(0xff & crc8); +// return crc8ToStr; + return null; } /** @@ -33,50 +33,5 @@ return bytes; } - /** - * CRC8 校验 多项式 x8+x2+x+1 - * - * @param b - * @param off - * @param len - * @return - */ - public static byte CRC8(final byte[] b, final int off, final int len) { - byte result = 0x00; - for (int i = 0; i < len; i++) { - result = CHECKSUM_TABLE[(result ^ (b[i + off] & 0xFF)) & 0xFF]; - } - return (byte) (result & 0xFFL); - } - - private final static byte[] CHECKSUM_TABLE = {(byte) 0x00, (byte) 0x07, (byte) 0x0e, (byte) 0x09, (byte) 0x1c, (byte) 0x1b, - (byte) 0x12, (byte) 0x15, (byte) 0x38, (byte) 0x3f, (byte) 0x36, (byte) 0x31, (byte) 0x24, (byte) 0x23, (byte) 0x2a, - (byte) 0x2d, (byte) 0x70, (byte) 0x77, (byte) 0x7e, (byte) 0x79, (byte) 0x6c, (byte) 0x6b, (byte) 0x62, (byte) 0x65, - (byte) 0x48, (byte) 0x4f, (byte) 0x46, (byte) 0x41, (byte) 0x54, (byte) 0x53, (byte) 0x5a, (byte) 0x5d, (byte) 0xe0, - (byte) 0xe7, (byte) 0xee, (byte) 0xe9, (byte) 0xfc, (byte) 0xfb, (byte) 0xf2, (byte) 0xf5, (byte) 0xd8, (byte) 0xdf, - (byte) 0xd6, (byte) 0xd1, (byte) 0xc4, (byte) 0xc3, (byte) 0xca, (byte) 0xcd, (byte) 0x90, (byte) 0x97, (byte) 0x9e, - (byte) 0x99, (byte) 0x8c, (byte) 0x8b, (byte) 0x82, (byte) 0x85, (byte) 0xa8, (byte) 0xaf, (byte) 0xa6, (byte) 0xa1, - (byte) 0xb4, (byte) 0xb3, (byte) 0xba, (byte) 0xbd, (byte) 0xc7, (byte) 0xc0, (byte) 0xc9, (byte) 0xce, (byte) 0xdb, - (byte) 0xdc, (byte) 0xd5, (byte) 0xd2, (byte) 0xff, (byte) 0xf8, (byte) 0xf1, (byte) 0xf6, (byte) 0xe3, (byte) 0xe4, - (byte) 0xed, (byte) 0xea, (byte) 0xb7, (byte) 0xb0, (byte) 0xb9, (byte) 0xbe, (byte) 0xab, (byte) 0xac, (byte) 0xa5, - (byte) 0xa2, (byte) 0x8f, (byte) 0x88, (byte) 0x81, (byte) 0x86, (byte) 0x93, (byte) 0x94, (byte) 0x9d, (byte) 0x9a, - (byte) 0x27, (byte) 0x20, (byte) 0x29, (byte) 0x2e, (byte) 0x3b, (byte) 0x3c, (byte) 0x35, (byte) 0x32, (byte) 0x1f, - (byte) 0x18, (byte) 0x11, (byte) 0x16, (byte) 0x03, (byte) 0x04, (byte) 0x0d, (byte) 0x0a, (byte) 0x57, (byte) 0x50, - (byte) 0x59, (byte) 0x5e, (byte) 0x4b, (byte) 0x4c, (byte) 0x45, (byte) 0x42, (byte) 0x6f, (byte) 0x68, (byte) 0x61, - (byte) 0x66, (byte) 0x73, (byte) 0x74, (byte) 0x7d, (byte) 0x7a, (byte) 0x89, (byte) 0x8e, (byte) 0x87, (byte) 0x80, - (byte) 0x95, (byte) 0x92, (byte) 0x9b, (byte) 0x9c, (byte) 0xb1, (byte) 0xb6, (byte) 0xbf, (byte) 0xb8, (byte) 0xad, - (byte) 0xaa, (byte) 0xa3, (byte) 0xa4, (byte) 0xf9, (byte) 0xfe, (byte) 0xf7, (byte) 0xf0, (byte) 0xe5, (byte) 0xe2, - (byte) 0xeb, (byte) 0xec, (byte) 0xc1, (byte) 0xc6, (byte) 0xcf, (byte) 0xc8, (byte) 0xdd, (byte) 0xda, (byte) 0xd3, - (byte) 0xd4, (byte) 0x69, (byte) 0x6e, (byte) 0x67, (byte) 0x60, (byte) 0x75, (byte) 0x72, (byte) 0x7b, (byte) 0x7c, - (byte) 0x51, (byte) 0x56, (byte) 0x5f, (byte) 0x58, (byte) 0x4d, (byte) 0x4a, (byte) 0x43, (byte) 0x44, (byte) 0x19, - (byte) 0x1e, (byte) 0x17, (byte) 0x10, (byte) 0x05, (byte) 0x02, (byte) 0x0b, (byte) 0x0c, (byte) 0x21, (byte) 0x26, - (byte) 0x2f, (byte) 0x28, (byte) 0x3d, (byte) 0x3a, (byte) 0x33, (byte) 0x34, (byte) 0x4e, (byte) 0x49, (byte) 0x40, - (byte) 0x47, (byte) 0x52, (byte) 0x55, (byte) 0x5c, (byte) 0x5b, (byte) 0x76, (byte) 0x71, (byte) 0x78, (byte) 0x7f, - (byte) 0x6a, (byte) 0x6d, (byte) 0x64, (byte) 0x63, (byte) 0x3e, (byte) 0x39, (byte) 0x30, (byte) 0x37, (byte) 0x22, - (byte) 0x25, (byte) 0x2c, (byte) 0x2b, (byte) 0x06, (byte) 0x01, (byte) 0x08, (byte) 0x0f, (byte) 0x1a, (byte) 0x1d, - (byte) 0x14, (byte) 0x13, (byte) 0xae, (byte) 0xa9, (byte) 0xa0, (byte) 0xa7, (byte) 0xb2, (byte) 0xb5, (byte) 0xbc, - (byte) 0xbb, (byte) 0x96, (byte) 0x91, (byte) 0x98, (byte) 0x9f, (byte) 0x8a, (byte) 0x8d, (byte) 0x84, (byte) 0x83, - (byte) 0xde, (byte) 0xd9, (byte) 0xd0, (byte) 0xd7, (byte) 0xc2, (byte) 0xc5, (byte) 0xcc, (byte) 0xcb, (byte) 0xe6, - (byte) 0xe1, (byte) 0xe8, (byte) 0xef, (byte) 0xfa, (byte) 0xfd, (byte) 0xf4, (byte) 0xf3}; } \ No newline at end of file diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java index 27c2838..6e078a3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java @@ -1,9 +1,6 @@ package com.casic.missiles.parser.safe.impl; -import cn.hutool.core.util.CharsetUtil; -import cn.hutool.crypto.symmetric.SM4; -import cn.hutool.crypto.symmetric.SymmetricCrypto; - +import com.casic.missiles.parser.safe.SafeStrategy; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; @@ -11,19 +8,44 @@ import org.bouncycastle.crypto.engines.SM4Engine; import org.bouncycastle.crypto.params.KeyParameter; import org.bouncycastle.util.encoders.Hex; - -import static cn.hutool.crypto.Mode.ECB; -import static cn.hutool.crypto.Padding.NoPadding; +import org.springframework.stereotype.Component; /** * SM4算法工具类 */ @Slf4j -public class Sm4 { +@Component("sm4") +public class Sm4 implements SafeStrategy { //加解密的字节快大小 public static final int BlockSize = 16; + @Override + public String decryption(String cipher) { + byte[] keyByte = { + 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 + }; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(keyByte); + byte[] in = Hex.decode(cipher); + byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); + String plain = EcbDecrypt(in, keyBytes); + return plain; + } + + @Override + public String encryption(String cipher) { + byte[] keyByte = { + 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 + }; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(keyByte); + byte[] in = Hex.decode(cipher); + byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); + String plain = EcbDecrypt(in, keyBytes); + return plain; + } + /** * SM4ECB加密算法,对内 * @@ -32,8 +54,6 @@ * @return */ private static byte[] ecb_encrypt(byte[] in, byte[] keyBytes) { - - SM4Engine sm4Engine = new SM4Engine(); sm4Engine.init(true, new KeyParameter(keyBytes)); byte[] out = new byte[in.length]; @@ -58,27 +78,6 @@ return cipher; } - - /** - * hutool 解密SM4 - * - * @param encodeContent - * @return - */ - public static String decode(String encodeContent) { - String key = "24ad182507479a5da3ad94d9d78ea203"; - try { - SymmetricCrypto sm4 = new SM4(ECB, NoPadding, key.getBytes()); - String decryptStr = sm4.decryptStr(encodeContent, CharsetUtil.CHARSET_UTF_8); - return decryptStr; - } catch (Exception e) { - e.printStackTrace(); - log.error("SM4解密失败"); - } - return null; - } - - /** * SM4的ECB加密算法 * @@ -129,20 +128,6 @@ return plain; } - /** - * SM4的ECB解密算法 - * - * @param cipher 输入的密文字符串 - * @param key 密钥 - * @return - */ - public static String EcbDecrypt(String cipher, String key) { - byte[] in = Hex.decode(cipher); - byte[] keyBytes = Hex.decode(key); - - String plain = EcbDecrypt(in, keyBytes); - return plain; - } /** * 主函数 @@ -151,28 +136,24 @@ */ public static void main(String[] args) { byte[] ciphertext = { + 0x4B, (byte) 0x8C, (byte) 0x9D, 0x08, (byte) 0xE4, (byte) 0xD3, 0x64, 0x42, (byte) 0xB9, (byte) 0xA5, (byte) 0xFE, (byte) 0xCD, (byte) 0x91, 0x1B, 0x38, (byte) 0xAC, (byte) 0xE9, 0x1C, (byte) 0xCD, 0x53, 0x02, (byte) 0xD7, 0x0C, (byte) 0x9B, (byte) 0x96, 0x30, 0x62, (byte) 0xE8, (byte) 0xFB, (byte) 0xEF, (byte) 0xB9, (byte) 0xFF, (byte) 0xDE, 0x19, (byte) 0x80, 0x35, 0x3E, (byte) 0x90, 0x4F, 0x2F, 0x12, 0x2B, 0x19, (byte) 0x8B, 0x6C, 0x7A, (byte) 0x85, (byte) 0xA1, (byte) 0xB1, (byte) 0x86, (byte) 0xA3, 0x7A, 0x46, 0x0C, 0x2F, (byte) 0x94, 0x4F, 0x7F, 0x2C, 0x56, 0x14, (byte) 0xF3, (byte) 0x89, (byte) 0xC3, - 0x3F, 0x20, (byte) 0xF9, (byte) 0x87, (byte) 0xA1, 0x60, (byte) 0xD9, (byte) 0xA8, (byte) 0xFD, (byte) 0xD7, (byte) 0x9B, 0x4B, 0x26, 0x06, 0x30, 0x44}; + 0x3F, 0x20, (byte) 0xF9, (byte) 0x87, (byte) 0xA1, 0x60, (byte) 0xD9, (byte) 0xA8, (byte) 0xFD, (byte) 0xD7, (byte) 0x9B, 0x4B, 0x26, 0x06, 0x30, 0x44 + }; ByteBuf in = ByteBufAllocator.DEFAULT.heapBuffer(); in.writeBytes(ciphertext); - byte[] keyByte = { 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 }; ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); - key.writeBytes(ciphertext); - String resCipherData = decode(ByteBufUtil.hexDump(in)); - ByteBuf out = ByteBufAllocator.DEFAULT.heapBuffer(); -// out.writeBytes(resCipherData); -// System.out.println(hexBytes); - System.out.println(resCipherData.toString()); -// String resPlainData = EcbDecrypt(resCipherData, key); -// System.out.println("原始明文:" + data); -// System.out.println("解密后明文:" + resPlainData); + key.writeBytes(keyByte); +// String resCipherData = EcbDecrypt(ByteBufUtil.hexDump(in), ByteBufUtil.hexDump(key)); +// System.out.println(resCipherData); } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java index 1395a51..ac5f957 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java @@ -1,7 +1,7 @@ package com.casic.missiles.parser.safe.impl; import io.netty.buffer.ByteBufUtil; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** *

@@ -14,9 +14,8 @@ * @author hyl * @version v1.0: Tea.java, v 0.1 2021/3/12 13:48 $ */ -@Service("tea") -///tea算法类 - +//tea算法类 +@Component("tea") public class Tea { public static byte[] MyTea_Encrypt(byte[] MyTeaContent, int ByteLen, byte[] MyTeakey) { @@ -99,7 +98,6 @@ // for(int i32Index = 0; i32Index < 8; i32Index++) { // System.out.print("0x" + Integer.toHexString(MyContent[i32Index]) + " "); // } - // System.out.println("密钥为:"); // for(int i32Index = 0; i32Index < 16; i32Index++) { // System.out.print("0x" + Integer.toHexString(MyKeys[i32Index]) + " "); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java index bdd0721..bd1516a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java @@ -3,7 +3,7 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.parser.sender.DataSubscribeProvider; import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponents; import org.springframework.web.util.UriComponentsBuilder; @@ -12,7 +12,7 @@ import java.util.Collections; import java.util.Map; -@Service("functionCallback") +@Component("functionCallback") public class FunctionCallback implements DataSubscribeProvider { @Resource diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java index 0b44fb9..7526de2 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.Map; -@Service("middleware") +@Component("middleware") public class MiddlewareSubscribe implements DataSubscribeProvider { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java index 5dcee3f..e2f1192 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.Map; -@Service("nosql") +@Component("nosql") public class NoSqlSubscribe implements DataSubscribeProvider { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java b/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java new file mode 100644 index 0000000..81a5324 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java @@ -0,0 +1,86 @@ +package com.casic.missiles.pojo; + +import lombok.Data; + +/** + * 协议 + */ +@Data +public class Msg { + + /** + * 前导码 + */ + private String preamble; + + /** + * 版本号 + */ + private String version; + + /** + * 内容长度 + */ + private int leng; + + /** + * 设备ID + */ + private String deviceId; + + /** + * 通讯方式 + */ + private Integer connType; + + /** + * 加密方式 + */ + private Integer encryType; + + /** + * 目标地址 + */ + private String destAddr; + + /** + * PDUType + */ + private String PDUType; + + /** + * 操作类型 + */ + private Integer operateType; + + /** + * 传输控制位 PDUType.bit7=0时,表示存在后续的访问;当PDUType.bit7=1时,表示无后续的访问。 + */ + private Integer transControlFlag; + + /** + * 设备类型 + */ + private Integer deviceType; + + /** + * 序号 + */ + private Integer seq; + + /** + * tagList + */ + private String tagList; + + /** + * OidList + */ + private String OidList; + + /** + * CRC + */ + private String CRC; + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java index 40a5265..97cc984 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java @@ -40,7 +40,7 @@ String httpContent = msg.toString(Charset.defaultCharset()); log.info(" String : " + msg.toString(Charset.defaultCharset())); String majorContent = httpContent.substring(httpContent.indexOf("{"), httpContent.lastIndexOf("}") + 1); - String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("serviceData")).get("Value")); + String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("RegistryData")).get("Value")); log.info("----------------------------------" + values); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); bufferContent.writeBytes(values.getBytes(Charset.forName("ISO-8859-1"))); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java index 1b132a7..e3ced4b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java @@ -35,7 +35,7 @@ String httpContent = msg.toString(Charset.defaultCharset()); log.info(" String : " + msg.toString(Charset.defaultCharset())); String majorContent = httpContent.substring(httpContent.indexOf("{"), httpContent.lastIndexOf("}") + 1); - String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("serviceData")).get("Value")); + String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("RegistryData")).get("Value")); log.info("----------------------------------" + values); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); bufferContent.writeBytes(values.getBytes(Charset.forName("ISO-8859-1"))); diff --git a/sensorhub-core/src/main/resources/application.properties b/sensorhub-core/src/main/resources/application.properties deleted file mode 100644 index 8b13789..0000000 --- a/sensorhub-core/src/main/resources/application.properties +++ /dev/null @@ -1 +0,0 @@ - diff --git a/sensorhub-core/src/main/resources/config/application-dev.yml b/sensorhub-core/src/main/resources/config/application-dev.yml index 4f897a8..dcc4c2d 100644 --- a/sensorhub-core/src/main/resources/config/application-dev.yml +++ b/sensorhub-core/src/main/resources/config/application-dev.yml @@ -4,9 +4,9 @@ spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true + url: jdbc:mysql://127.0.0.1:3306/sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true username: root - password: Casic203 + password: root session: store-type: redis redis: diff --git a/sensorhub-core/src/main/resources/config/application.yml b/sensorhub-core/src/main/resources/config/application.yml index ae89f9d..7965da1 100644 --- a/sensorhub-core/src/main/resources/config/application.yml +++ b/sensorhub-core/src/main/resources/config/application.yml @@ -30,6 +30,13 @@ port: 6379 password: ew5T4K3#203lwh config-prefix: 'Casic:' +#代码生成器配置 +code: + generate: + #作者 + author: cz + #待生成对象表名 + table-name: bussiness_field_config,combined_field_config sensorhub: config: port: 7091 diff --git a/sensorhub-support/pom.xml b/sensorhub-support/pom.xml index 9a71296..761601c 100644 --- a/sensorhub-support/pom.xml +++ b/sensorhub-support/pom.xml @@ -42,6 +42,12 @@ ${redis.version} + + com.baomidou + mybatis-plus-generator + ${mybatis-plus-generator.version} + + org.reflections diff --git a/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java b/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java new file mode 100644 index 0000000..515ca53 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java @@ -0,0 +1,14 @@ +package com.casic.missiles.enums; + +/** + * @author + * @date + */ +public interface FixedPropertyEnum { + + String FIXED_POSITION = "fixedPosition"; + + String TOTAL_LENGTH = "totalLength"; + + String TAIL_POSITION = "tailPosition"; +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/CombinedFieldMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CombinedFieldMapper.java new file mode 100644 index 0000000..38e8f42 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CombinedFieldMapper.java @@ -0,0 +1,15 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.CombinedFieldConfig; +import org.apache.ibatis.annotations.Mapper; + +/** + * @author cz + * + */ +@Mapper +public interface CombinedFieldMapper extends BaseMapper { + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java new file mode 100644 index 0000000..128b09d --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java @@ -0,0 +1,10 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.CommandEventConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface CommandEventMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java new file mode 100644 index 0000000..042eb3c --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.DatagramEventConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface DatagramEventConfigMapper extends BaseMapper { +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java new file mode 100644 index 0000000..fc95cf4 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java @@ -0,0 +1,8 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.FieldConfig; + +public interface FieldConfigMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldRuleConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldRuleConfigMapper.java new file mode 100644 index 0000000..b310a08 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldRuleConfigMapper.java @@ -0,0 +1,10 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.FieldRuleConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface FieldRuleConfigMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java new file mode 100644 index 0000000..9060a69 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.ProtocolConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface ProtocolConfigMapper extends BaseMapper { +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolFieldConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolFieldConfigMapper.java new file mode 100644 index 0000000..1b47180 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolFieldConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +public interface ProtocolFieldConfigMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java new file mode 100644 index 0000000..6fa6936 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.RuleConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface RuleConfigMapper extends BaseMapper { +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/AbstractFieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/AbstractFieldConfig.java new file mode 100644 index 0000000..ba9aea2 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/AbstractFieldConfig.java @@ -0,0 +1,38 @@ +package com.casic.missiles.pojo; + +import lombok.Data; + +@Data +public class AbstractFieldConfig { + /** + * 字段名称 + */ + private String fieldName; + /** + * 按照字段评估进行字段解析 + */ + private String ruleJson; + /** + * 起始位置(单位byte) + */ + private Integer OriginPositionByte; + /** + * 起始位置,是否需要bit位置(单位bit)小于8, 没有不需要填写 + */ + private String OriginPositionBit; + /** + * 偏移长度 + */ + private Integer offsetLength; + /** + * 偏移单位(bit/byte) + */ + private String offsetUnit; + /** + * 是否需要转存 + */ + private Integer isStorage; + + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/CombinedFieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/CombinedFieldConfig.java new file mode 100644 index 0000000..4f4de6a --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/CombinedFieldConfig.java @@ -0,0 +1,41 @@ +package com.casic.missiles.pojo; + +import lombok.Data; + +import java.util.Date; + +/** + * 组合配置 + * + * @author cz + * @date 20 + */ +@Data +public class CombinedFieldConfig { + + private Long id; + private Long ruleId; + /** + * 前缀编码 + */ + private String prefixCode; + + /** + * 字段动态的id + */ + private Long dynamicLengthId; + /** + * 对应的要解析字段的ids + */ + private String dataFieldIds; + + /** + * 字段动态的id + */ + private String combinedFieldIds; + + private Date lastTime; + + private Date createTime; + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldConfig.java index a07d20d..8304dc6 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldConfig.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldConfig.java @@ -5,31 +5,28 @@ import java.util.Date; +/** + * @author cz + * 1、该表与实际解析的内容实例解析有关 + * 2、该表字段是随机出现的,和帧结构无关,无法预料的 + * 3、该表字段解析根据FieldEvaluatorConfig进行字段解析 + */ @Data -@TableName("field_config") -public class FieldConfig { +@TableName("business_field_config") +public class FieldConfig extends AbstractFieldConfig { private Long id; -// private String preFieldConfig; - private Long protocolId; - - private String isFixed; - private String uploadDeliveryChange; - - private String replyRule; - private String ruleJson; - + /** + * 协议配置id + */ + private Long ruleId; + /** + * 字段名称 + */ private String fieldName; - private String isStorage; - private Integer orignPosition; - private String exactOrignPosition; - - private Integer offsetLength; - private String offsetUnit; private String ownerId; private Date createTime; private Date lastTime; - } diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldRuleConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldRuleConfig.java new file mode 100644 index 0000000..2e09879 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldRuleConfig.java @@ -0,0 +1,20 @@ +package com.casic.missiles.pojo; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +@TableName("field_rule_config") +@Data +public class FieldRuleConfig { + + private Long id; + private String name; + private String desc; + private String condition; + private String excuteOperation; + private Date lasTime; + private Date createTime; + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/Msg.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/Msg.java deleted file mode 100644 index 81a5324..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/Msg.java +++ /dev/null @@ -1,86 +0,0 @@ -package com.casic.missiles.pojo; - -import lombok.Data; - -/** - * 协议 - */ -@Data -public class Msg { - - /** - * 前导码 - */ - private String preamble; - - /** - * 版本号 - */ - private String version; - - /** - * 内容长度 - */ - private int leng; - - /** - * 设备ID - */ - private String deviceId; - - /** - * 通讯方式 - */ - private Integer connType; - - /** - * 加密方式 - */ - private Integer encryType; - - /** - * 目标地址 - */ - private String destAddr; - - /** - * PDUType - */ - private String PDUType; - - /** - * 操作类型 - */ - private Integer operateType; - - /** - * 传输控制位 PDUType.bit7=0时,表示存在后续的访问;当PDUType.bit7=1时,表示无后续的访问。 - */ - private Integer transControlFlag; - - /** - * 设备类型 - */ - private Integer deviceType; - - /** - * 序号 - */ - private Integer seq; - - /** - * tagList - */ - private String tagList; - - /** - * OidList - */ - private String OidList; - - /** - * CRC - */ - private String CRC; - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/PreRuleConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/PreRuleConfig.java deleted file mode 100644 index bfcf914..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/PreRuleConfig.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.casic.missiles.pojo; - -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -import java.util.Date; - -@Data -@TableName("pre_rule_config") -public class PreRuleConfig { - - private Long id; - private String protocolId; - private String ruleFieldId; - private String ownerId; - private Date createTime; - private Date lastTime; -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolConfig.java index 274ad42..bdac11f 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolConfig.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolConfig.java @@ -5,18 +5,52 @@ import java.util.Date; +/** + * 协议配置表,协议配置与帧结构有关 + * 1、层级关系,协议之后是规则,规则对应设备类型的各种上数规则 + * 2、规则对应协议配置的实例流程 + * 3、每种可根据设备类型和操作类型进行上数规则进行区分 + */ @Data @TableName("protocol_config") public class ProtocolConfig { private Long id; + /** + * 前导码 + */ private String preFix; - private String unpackId; - private String totalLengthId; - private String totalLengthFilterField; + /** + * 拆包id + */ + private Long unpackId; + /** + * 总长度id + */ + private Long totalLengthId; + /** + * + */ + private String totalLengthFilterFields; + /** + * 动态长度ids + */ private String dynamicLengthId; + /** + * 动态长度json(预留字段) + */ private String dynamicLengthJson; - private String tailStr; + /** + * 规则字段所解析预准备的字段 + */ + private String rulePrepareFields; + /** + * 结尾标志 + */ + private Long tailStr; + /** + * 备注 + */ private String remark; private String ownerId; private Date createTime; diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolFieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolFieldConfig.java new file mode 100644 index 0000000..db794bd --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolFieldConfig.java @@ -0,0 +1,43 @@ +package com.casic.missiles.pojo; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +/** + * 协议字段配置表 + * 该表用户存放帧结构固定格式的字段 + * 有以下两个用途 + * (1)、固定格式的字段可用于规则匹配 + * (2)、固定格式的字段可用于报文回复 + * @author cz + * @date 2023-06-09 + */ +@Data +@TableName("protocol_field_config") +public class ProtocolFieldConfig extends AbstractFieldConfig{ + + private Long id; + /** + * 协议配置id + */ + private Long protocolId; + /** + * 上传下发是否有变化, 没有变化,可以直接组装 + */ + private String isReplyFix; + /** + * 按照字段评估进行字段解析 + */ + private Long fieldEvaluatorId; + /** + * 回复规则 + */ + private String replyRule; + + private String ownerId; + private Date createTime; + private Date lastTime; + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java index 3b53493..febf835 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java @@ -6,18 +6,40 @@ import java.util.Date; /** - * 加密字段解析和规则有关,事件调到该流程下面 + * @author cz + * todo: 匹配协议对应业务实例 + * 1、一个协议可以多种的流程规则 + * 2、规则可以支持递归规则流程 */ @Data @TableName("rule_config") public class RuleConfig { - private Long id; private String protocolId; - private String isBizField; - private String parseRuleJson; + /** + * 是否完成规则配置,没有完成, + * 则需要根据规则继续匹配 + */ + private String isFinishMatch; + /** + * 待匹配解析规则 + * {“data_field”:"data_value"} + */ + private String matchRuleJson; + /** + * 待解析字段ids + */ private String dataFieldIds; - private String aviatorFilterJson; + + /** + * 待解析组合字段ids + */ + private String combinedFieldIds; + + /** + * aviator + */ + private String conditionExpression; private Date createTime; private Date lastTime; } diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleDict.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleDict.java deleted file mode 100644 index cc7f389..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleDict.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.casic.missiles.pojo; - -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -@Data -@TableName("rule_dict") -public class RuleDict { - - private Long id; - private Long pid; - private String name; - private String code; - private String ownerId; - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleEvaluator.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleEvaluator.java deleted file mode 100644 index ed16610..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleEvaluator.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.pojo; - -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -import java.util.Date; - -@TableName("rule_evaluator") -@Data -public class RuleEvaluator { - - private Long id; - private String name; - private String desc; - private String condition; - private String excuteOperation; - private Date lasTime; - private Date createTime; - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/CombinedFieldConfigRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/CombinedFieldConfigRegistry.java new file mode 100644 index 0000000..fa59b90 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/CombinedFieldConfigRegistry.java @@ -0,0 +1,12 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.CombinedFieldConfig; + +import java.util.List; + +public interface CombinedFieldConfigRegistry { + + List getCombinedFieldConfigList(Long ruleId); + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/CommandEventRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/CommandEventRegistry.java new file mode 100644 index 0000000..fb97d87 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/CommandEventRegistry.java @@ -0,0 +1,8 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.CommandEventConfig; + +public interface CommandEventRegistry { + + CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName); +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/DatagramEventRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/DatagramEventRegistry.java new file mode 100644 index 0000000..fb34641 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/DatagramEventRegistry.java @@ -0,0 +1,11 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.DatagramEventConfig; + +import java.util.List; + +public interface DatagramEventRegistry{ + + List getDatagramEventList(Long ruleId); + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/FieldConfigRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/FieldConfigRegistry.java new file mode 100644 index 0000000..759642e --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/FieldConfigRegistry.java @@ -0,0 +1,20 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.FieldConfig; + +import java.util.List; + +public interface FieldConfigRegistry { + + + List getFieldConfigList(Long ruleId); + + FieldConfig getFieldConfigById(String fieldId); + + List getFieldConfigs(String protocolId, Integer isFixed); + + List getStorageFieldConfig(String protocolId); + + +} + diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/FieldRuleConfigRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/FieldRuleConfigRegistry.java new file mode 100644 index 0000000..33da70c --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/FieldRuleConfigRegistry.java @@ -0,0 +1,11 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.FieldRuleConfig; + +import java.util.List; + +public interface FieldRuleConfigRegistry { + + List getFieldRuleConfigList(Long ruleId); + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/ProtocolConfigRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/ProtocolConfigRegistry.java new file mode 100644 index 0000000..1725189 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/ProtocolConfigRegistry.java @@ -0,0 +1,12 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.ProtocolConfig; + +import java.util.List; + +public interface ProtocolConfigRegistry { + + List getProtocolConfigList(String firstChar); + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/ProtocolFieldConfigRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/ProtocolFieldConfigRegistry.java new file mode 100644 index 0000000..19d1b9a --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/ProtocolFieldConfigRegistry.java @@ -0,0 +1,14 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.ProtocolFieldConfig; + +import java.util.List; + +public interface ProtocolFieldConfigRegistry { + + + List getProtocolFieldConfigList(Long protocolId); + + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/RuleConfigRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/RuleConfigRegistry.java new file mode 100644 index 0000000..3d2a75c --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/RuleConfigRegistry.java @@ -0,0 +1,14 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.RuleConfig; + +import java.util.List; + +public interface RuleConfigRegistry { + + RuleConfig getNextRuleConfig(String ruleFields); + + + List getRuleConfigById(Long protocolId); + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CombinedFieldConfigRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CombinedFieldConfigRegistryImpl.java new file mode 100644 index 0000000..822cac6 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CombinedFieldConfigRegistryImpl.java @@ -0,0 +1,24 @@ +package com.casic.missiles.registry.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.CombinedFieldMapper; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.registry.CombinedFieldConfigRegistry; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class CombinedFieldConfigRegistryImpl extends ServiceImpl implements CombinedFieldConfigRegistry { + + @Override + public List getCombinedFieldConfigList(Long ruleId) { + QueryWrapper queryWrapper = new QueryWrapper() + .eq("rule_id", ruleId); + List combinedFieldConfigs = this.baseMapper.selectList(queryWrapper); + return combinedFieldConfigs; + } + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CommandEventRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CommandEventRegistryImpl.java new file mode 100644 index 0000000..f0d3559 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CommandEventRegistryImpl.java @@ -0,0 +1,25 @@ +package com.casic.missiles.registry.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.CommandEventMapper; +import com.casic.missiles.pojo.CommandEventConfig; +import com.casic.missiles.registry.CommandEventRegistry; + +import java.util.List; +import java.util.Optional; + +public class CommandEventRegistryImpl extends ServiceImpl implements CommandEventRegistry { + + @Override + public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { + QueryWrapper queryWrapper = new QueryWrapper() + .eq("protocol_id", protocolId) + .eq("scene", sceneName) + .eq("enabled", 1); + List commandEventConfig = this.baseMapper.selectList(queryWrapper); + Optional optionalEventConfig = commandEventConfig.stream().findFirst(); + return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; + } + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/DatagramEventRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/DatagramEventRegistryImpl.java new file mode 100644 index 0000000..2e58698 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/DatagramEventRegistryImpl.java @@ -0,0 +1,26 @@ +package com.casic.missiles.registry.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.DatagramEventConfigMapper; +import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.registry.DatagramEventRegistry; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class DatagramEventRegistryImpl extends ServiceImpl implements DatagramEventRegistry { + + + @Override + public List getDatagramEventList(Long ruleId) { + QueryWrapper queryWrapper = new QueryWrapper() + .eq("rule_id", ruleId); + List fieldConfigList = this.baseMapper.selectList(queryWrapper); + return fieldConfigList; + } + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/FieldConfigRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/FieldConfigRegistryImpl.java new file mode 100644 index 0000000..6ae4422 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/FieldConfigRegistryImpl.java @@ -0,0 +1,50 @@ +package com.casic.missiles.registry.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.FieldConfigMapper; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.registry.FieldConfigRegistry; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * @author cz + */ +@Service +public class FieldConfigRegistryImpl extends ServiceImpl implements FieldConfigRegistry { + + @Override + public List getFieldConfigList(Long ruleId) { + QueryWrapper queryWrapper = new QueryWrapper() + .eq("rule_id", ruleId); + List fieldConfigList = this.baseMapper.selectList(queryWrapper); + return fieldConfigList; + } + + @Override + public FieldConfig getFieldConfigById(String fieldId) { + FieldConfig fieldConfig = this.baseMapper.selectById(fieldId); + return fieldConfig; + } + + @Override + public List getFieldConfigs(String protocolId, Integer isFixed) { + QueryWrapper queryWrapper = new QueryWrapper() + .eq("protocol_id", protocolId) + .eq("is_fixed", isFixed); + List fieldConfigList = this.baseMapper.selectList(queryWrapper); + return fieldConfigList; + } + + @Override + public List getStorageFieldConfig(String protocolId) { + QueryWrapper queryWrapper = new QueryWrapper() + .eq("protocol_id", protocolId) + .eq("is_fixed", 1) + .eq("is_storage", 1); + List fieldConfigList = this.baseMapper.selectList(queryWrapper); + return fieldConfigList; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java index 608af3a..32cc8a4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java @@ -2,48 +2,47 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.delivery.decorator.ByteDecorator; +import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @AllArgsConstructor public class FieldDecoratorManger { - private final RuleDictDao ruleDictDao; + private final RuleConfigRegistry ruleDictDao; // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 // (1)静态的业务字段是字典里面可以配置的 // (2)动态的业务字段是通过规则生成的 public String contentMerge(String ruleJson, String sceneConent, String dynamicContent) { - List ruleDictList = ruleDictDao.getRuleDictConfig(); - Map ruleDictMap = ruleDictList.stream().collect( - Collectors.toMap(RuleDict::getId, e -> e)); - List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); - for (Map ruleMap : ruleMapList) { - String ruleType = String.valueOf(ruleMap.get("ruleType")); - ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); - NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); - byteDecorator.nodeDecoratorRule(nodeDecoratorParm); - } +// List ruleDictList = ruleDictDao.getRuleDictConfig(); +// Map ruleDictMap = ruleDictList.stream().collect( +// Collectors.toMap(RuleDict::getId, e -> e)); +// List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); +// for (Map ruleMap : ruleMapList) { +// String ruleType = String.valueOf(ruleMap.get("ruleType")); +// ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); +// NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); +// byteDecorator.nodeDecoratorRule(nodeDecoratorParm); +// } return null; } - - private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { - NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() - .contents(sceneConent) - .dynamicContent(dynamicContent) - .ruletypeId(ruletypeId) - .ruleDictMap(ruleDictMap) - .build(); - return nodeDecoratorParm; - } +// +// private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { +// NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() +// .contents(sceneConent) +// .dynamicContent(dynamicContent) +// .ruletypeId(ruletypeId) +// .ruleDictMap(ruleDictMap) +// .build(); +// return nodeDecoratorParm; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java index 652970c..b204ac3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java @@ -1,56 +1,56 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@AllArgsConstructor -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", - JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Component; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Component("logicalDecorator") +//@AllArgsConstructor +//@Slf4j +//public class LogicalShiftDecorator implements ByteDecorator { +// +//// private final FieldRuleEngineMapper fieldRuleEngineMapper; +//// +//// //字节位移 +//// @Override +//// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +//// String logicalValue = ""; +//// RuleEvaluator fieldRuleEngine = new RuleEvaluator(); +//// try { +//// Map env2 = new HashMap(); +//// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +//// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +//// for (String contentId : contentIdList) { +//// RuleDict ruleDict = ruleDictMap.get(contentId); +//// if (ruleDict.getCode().contains("#")) { +//// //使用动态的值 +//// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +//// } +//// env2.put(ruleDict.getName(), ruleDict.getCode()); +//// } +//// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +//// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +//// return null; +//// } +//// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +//// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +//// return values; +//// } catch (Exception ex) { +//// log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", +//// JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +//// return null; +//// } +//// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java index 346468f..822fead 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@AllArgsConstructor -@Slf4j -public class OperationDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("optionDecorator") +//@AllArgsConstructor +//@Slf4j +//public class OperationDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //混合运算,有常量或者乘除的缩放 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java index 50fb0a7..7a8bccb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@AllArgsConstructor -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +////精度计算 +//@AllArgsConstructor +//@Registry("precisionDecorator") +//@Slf4j +//public class PrecisionDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java index da39235..27f9cc7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java @@ -1,54 +1,53 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@AllArgsConstructor -@Slf4j -public class RuleDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("ruleDecorator") +//@AllArgsConstructor +//@Slf4j +//public class RuleDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //吃我一套正则表达式 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (Exception ex) { +// log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java index 7f5cbf3..c043f97 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java @@ -2,6 +2,6 @@ import java.util.Map; -public interface ComandeEventService { +public interface ComandeEventService{ Map loadComandeEventConfig(String protocolId,String scene); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java index 476ad84..aaf1837 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java @@ -2,46 +2,46 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.dao.CommandEventDao; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @Slf4j @AllArgsConstructor -public class ComandeEventServiceImpl implements ComandeEventService { +public class ComandeEventServiceImpl implements ComandeEventRegistry { - private final CommandEventDao commandEventDao; + // private final CommandEventDao commandEventDao; // 加密bean 固定字段出现变化的字段解析,业务字段的有序内容 @Override - public Map loadComandeEventConfig(String protocolId,String sceneName) { - CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); - if (ObjectUtil.isEmpty(commandEventConfig)) { - log.error("协议{},没有配置成功接收回复配置,清排查原因"); - return null; - } - String replyJson = commandEventConfig.getReplyContentJson(); - List> replyMapList = JSONArray.parseObject(replyJson, List.class); - List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); - Map fixMap = fixList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); - List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) - .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) - .collect(Collectors.toList()); - Map commandConfigMap = new HashMap<>(); - commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); - commandConfigMap.put("fixContent", fixMap); - commandConfigMap.put("bizContent", contentList); - return commandConfigMap; + public Map loadComandeEventConfig(String protocolId, String sceneName) { +// CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); +// if (ObjectUtil.isEmpty(commandEventConfig)) { +// log.error("协议{},没有配置成功接收回复配置,清排查原因"); +// return null; +// } +// String replyJson = commandEventConfig.getReplyContentJson(); +// List> replyMapList = JSONArray.parseObject(replyJson, List.class); +// List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); +// Map fixMap = fixList.stream() +// .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); +// List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) +// .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) +// .collect(Collectors.toList()); +// Map commandConfigMap = new HashMap<>(); +// commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); +// commandConfigMap.put("fixContent", fixMap); +// commandConfigMap.put("bizContent", contentList); +// return commandConfigMap; + return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 128b09d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java deleted file mode 100644 index 4016b0b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface DatagramEventMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java deleted file mode 100644 index 597c306..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.apache.ibatis.annotations.Mapper; - -public interface FieldConfigMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java deleted file mode 100644 index a31680a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.PreRuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface PreRuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java deleted file mode 100644 index 9060a69..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface ProtocolConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java deleted file mode 100644 index 6fa6936..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java deleted file mode 100644 index 582a705..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleDict; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleDictMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java deleted file mode 100644 index 6e302c8..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.CommandEventMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Optional; - -@Component -public class CommandEventDao { - - @Resource - private CommandEventMapper commandEventMapper; - - public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId) - .eq("scene", sceneName) - .eq("enabled", 1); - List commandEventConfig = commandEventMapper.selectList(queryWrapper); - Optional optionalEventConfig = commandEventConfig.stream().findFirst(); - return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java deleted file mode 100644 index 9137e4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.FieldConfigMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class FieldConfigDao { - - @Resource - private FieldConfigMapper fieldConfigMapper; - - public FieldConfig getFieldConfigById(String fieldId) { - FieldConfig fieldConfig = fieldConfigMapper.selectById(fieldId); - return fieldConfig; - } - - public List getFieldConfigs(String protocolId,Integer isFixed) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",isFixed); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - - public List getStorageFieldConfig(String protocolId) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",1) - .eq("is_storage",1); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java deleted file mode 100644 index 67bff6b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.mapper.PreRuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class PreRuleConfigDao { - - @Resource - private PreRuleConfigMapper preRuleConfigMapper; - - public List getPreRuleList(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return preRuleConfigMapper.selectList(queryWrapper); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java deleted file mode 100644 index d69ea85..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.RuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleConfigDao { - - @Resource - private RuleConfigMapper ruleConfigMapper; - - public RuleConfig getNextRuleConfig(String ruleFields) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("parse_rule_json", ruleFields); - return ruleConfigMapper.selectOne(queryWrapper); - } - - - public List getRuleConfigById(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return ruleConfigMapper.selectList(queryWrapper); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java deleted file mode 100644 index 932c185..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.RuleDictMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleDictDao { - - @Resource - private RuleDictMapper ruleDictMapper; - - public List getRuleDictConfig() { - List ruleDictList = ruleDictMapper.selectList(null); - return ruleDictList; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java index 9f9e279..43bc4d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java @@ -10,20 +10,15 @@ import io.netty.channel.socket.nio.NioServerSocketChannel; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import javax.annotation.PreDestroy; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static cn.hutool.core.util.ClassUtil.getClasses; /** * SensorhubServer netty服务端 */ @Slf4j -@Service +@Component public class SensorhubServer { /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java index 2c79ff5..9a28c36 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java @@ -11,13 +11,13 @@ import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioSocketChannel; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClient 客户端 */ @Slf4j -@Service +@Registry public final class SensorhubClient { public static void main(String[] args) throws Exception { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java index 9774be0..477c3f7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java @@ -6,12 +6,12 @@ import io.netty.channel.socket.SocketChannel; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientChannelInitialHandler */ -@Service +@Registry public class SensorhubClientChannelInitialHandler extends ChannelInitializer { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java index 346f4b3..73560e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java @@ -5,13 +5,13 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientHandler */ @Slf4j -@Service +@Registry public class SensorhubClientHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java index 5c1c6f2..d990af5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java @@ -4,12 +4,12 @@ import com.casic.missiles.pojo.Msg; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** * SensorhubServerHandler */ -@Service +@Component public class SensorhubServerHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 67283ae..af3172c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,41 +1,37 @@ package com.casic.missiles.parser; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultProtocolConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.*; +import com.casic.missiles.registry.FieldConfigRegistry; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; -import java.nio.charset.Charset; import java.util.HashMap; import java.util.List; import java.util.Map; -@Service("genericProtocolParser") +/** + * @author + */ +@Component("genericProtocolParser") @Slf4j -@AllArgsConstructor +@RequiredArgsConstructor public class GenericProtocolParser implements ProtocolParser { - private final LeadingCodeMatcher leadingCodeMatcher; private final List frameStructDispenserList; - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorInstanceSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; // 匹配首字母前导码=> 帧结构匹配前导码=> // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 @@ -44,18 +40,19 @@ public Boolean doParseProtocol(ByteBuf byteBuf) { String protocolContent = ByteBufUtil.hexDump(byteBuf); //匹配前导码 - List preCodeConfigs = leadingCodeMatcher.matchLeadingCode(protocolContent); + List preCodeConfigs = LeadingCodeMatcher.matchFrameLeadingCode(protocolContent); //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 if (preCodeConfigs.size() == 0) { - return rematch(byteBuf,protocolContent); + return rematch(byteBuf, protocolContent); } - //暂时先取第一个 + //暂时先取第一个,提升速度,使用享元模式, 减少类的创建销毁与构建 ProtocolConfig protocolConfig = preCodeConfigs.get(0); + AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); ByteBuf wholeDatagramByte = null; //通过匹配帧结构获取完整的数据包 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, preCodeConfigs.get(0))) != null) { + if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, protocolFactory)) != null) { break; } } @@ -68,76 +65,78 @@ * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 */ - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId, wholeDatagramByte); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap, protocolId); - //选取规则对应的流程实例 - DatagramEventConfig datagramEventConfig = processorInstanceSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); + //进行规则字段解析,进行匹配规则 + RuleConfig ruleConfig = getRuleConfig(protocolFactory, wholeDatagramByte); + if (ruleConfig == null) { + return false; + } //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, wholeDatagramByte); + ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte); + //以下进行业务的规则解析,同时选定流程实例 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); + DatagramEventProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain, + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText, protocolId); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain); //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); + datagramEventProvider.storeData(bizDataMap); return true; } - private Boolean rematch(ByteBuf byteBuf,String protocolContent) { + /** + * 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 + */ + private Boolean rematch(ByteBuf byteBuf, String protocolContent) { //重置位判断 byteBuf.resetReaderIndex(); //判断重置是否前移,如果没有前移,则直接判为匹配失败 if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { return false; } else { + //递归执行 return doParseProtocol(byteBuf); } } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; + //获取匹配规则->匹配规则 + private RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + //取出其中参与逻辑provider并判空 + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); + String rulePrepareFields = protocolConfig.getRulePrepareFields(); + //固定字段 + if (StringUtils.isNotEmpty(rulePrepareFields)) { + //获取统一固定字段解析 + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + //获取该协议的字段配置,用于协议规则匹配 + List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); + //获取规则 + RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, + rulePrepareFields, protocolFieldConfigs); + return ruleConfig; + } + return null; } - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + //数据构建,获取固定字段的store和业务字段store + private Map buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + Map bizDataMap = new HashMap<>(); + Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); + Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); + bizDataMap.putAll(ruleStoreObjectMap); + bizDataMap.putAll(protocolStoreObjectMap); return bizDataMap; } - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java index 8a46e32..16ce2e5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java @@ -3,6 +3,7 @@ import io.netty.buffer.ByteBuf; public interface ProtocolParser { + Boolean doParseProtocol(ByteBuf byteBuf); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java new file mode 100644 index 0000000..f7814af --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java @@ -0,0 +1,35 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.ProtocolConfigProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.ProtocolConfig; + +/** + * 存放基本协议的的加载信息 + */ +public class AbstractProtocolConfigFactory { + private final ProtocolConfigProvider protocolConfigProvider; + private final ProtocolFieldConfigProvider protocolFieldConfigProvider; + private final RuleConfigProvider ruleConfigProvider; + + public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { + this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); + this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); + this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); + } + + public ProtocolConfigProvider getProtocolConfigProvider() { + return protocolConfigProvider; + } + + public ProtocolFieldConfigProvider getProtocolFieldConfigProvider() { + return protocolFieldConfigProvider; + } + + public RuleConfigProvider getRuleConfigProvider() { + return ruleConfigProvider; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java new file mode 100644 index 0000000..6e36147 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java @@ -0,0 +1,57 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.CombinedFieldConfigProvider; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.FieldConfigProvider; +import com.casic.missiles.parser.provider.FieldRuleConfigProvider; + +/** + * 存放规则相关的的的加载信息 + */ +public class AbstractRuleConfigFactory { + + /** + * 处理字节 + */ + private final FieldConfigProvider fieldConfigProvider; + /** + * 处理组合字节解析的解码器 + */ + private final CombinedFieldConfigProvider combinedFieldConfigProvider; + /** + * 处理负责字节解析的规则配置 + */ + private final FieldRuleConfigProvider fieldRuleConfigProvider; + /** + * 处理实例流程 + */ + private final DatagramEventProvider datagramEventProvider; + + + public AbstractRuleConfigFactory(Long ruleId) { + this.fieldConfigProvider = new FieldConfigProvider(ruleId); + this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); + this.fieldRuleConfigProvider = new FieldRuleConfigProvider(ruleId); + this.datagramEventProvider = new DatagramEventProvider(ruleId); + } + + public FieldConfigProvider getFieldConfigProvider() { + return fieldConfigProvider; + } + + public CombinedFieldConfigProvider getCombinedFieldConfigProvider() { + return combinedFieldConfigProvider; + } + + public FieldRuleConfigProvider getFieldRuleConfigProvider() { + return fieldRuleConfigProvider; + } + + public DatagramEventProvider getDatagramEventProvider() { + return datagramEventProvider; + } + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java deleted file mode 100644 index 6e1719a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.factory; - - -import com.casic.missiles.pojo.ProtocolConfig; - -import java.util.List; - -/** - * 数据库访问优化(暂时未做) - *

- * 1、初始化协议解析配置,并存放到处存放缓存,对协议基本配置进行管理 - * 2、其中流程中所有的配置都经过此类进行管理,进行调用获取,增强解析速度 - */ -public interface DatagramFactory { - - /** - * 初始化 - */ - List datagramInit(); - - /** - * 根据前导码配置匹配,模糊匹配获取所有的报文项 - */ - List match(); - - /** - * 根据前导码匹配,返回报文项 - */ - List filer(); - - /** - * 保证数据的唯一性选择器 - */ - List selectOne(); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java new file mode 100644 index 0000000..87444a0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java @@ -0,0 +1,18 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +import java.util.List; + +/** + * 直接用,还是边用边创建 + */ +public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { + + + public DefaultProtocolConfigFactory(ProtocolConfig protocolConfig) { + super(protocolConfig); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java new file mode 100644 index 0000000..cce0c7c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java @@ -0,0 +1,12 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; + +public class DefaultRuleFactory extends AbstractRuleConfigFactory { + + public DefaultRuleFactory(Long ruleId) { + super(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java deleted file mode 100644 index 9ee97e0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.casic.missiles.parser.instance; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service -@Slf4j -@AllArgsConstructor -public class GeneralProcessor { - - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; - - /** - * 统一固定字段解析=>进行规则的查询的判断 - * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 - * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 - */ - @Deprecated - public boolean parseWholeDatagram(ByteBuf buffer, ProtocolConfig protocolConfig) { - try { - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap,protocolId); - //选取规则对应的流程= - DatagramEventConfig datagramEventConfig = processorSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); - //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); - //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); - //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); - //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); - //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); - return true; - } catch (Exception ex) { - log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", - ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); - return false; - } - } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; - } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); - } - - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); - return bizDataMap; - } - - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java index 25e7ad8..6a5777e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java @@ -1,23 +1,31 @@ package com.casic.missiles.parser.instance.impl; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.mapper.DatagramEventMapper; import com.casic.missiles.pojo.DatagramEventConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.SpringContextUtil; -@Service -@AllArgsConstructor +import java.util.List; +import java.util.Optional; + +/** + * @author cz + * + */ public class DefaultProcessorInstanceSelector implements ProcessorInstanceSelector { - private final DatagramEventMapper datagramEventMapper; + private static List datagramEventConfigs; + + static { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + datagramEventConfigs = datagramEventRegistry.getDatagramEventList(); + } @Override public DatagramEventConfig getProcessorInstance(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("rule_id", protocolId); - return datagramEventMapper.selectOne(queryWrapper); + Optional optionalSelectInstance = datagramEventConfigs.stream() + .filter(e -> e.getId().equals(protocolId)).limit(1).findFirst(); + return optionalSelectInstance.isPresent() ? optionalSelectInstance.get() : null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a778671..7b56a43 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,16 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import io.netty.buffer.ByteBuf; /** - * 分析匹配情况 - * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 - * 2、匹配不成功,有后续帧,可以进行下次匹配。 - * 3、匹配不成功,无后续帧,可以进行丢弃。 + * 分析匹配情况 + * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 + * 2、匹配不成功,有后续帧,可以进行下次匹配。 + * 3、匹配不成功,无后续帧,可以进行丢弃。 */ -public interface FrameStructMatcher{ +public interface FrameStructMatcher { - ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig); + ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 05320ab..8ebea78 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,23 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.ProtocolConfigMapper; +import com.casic.missiles.parser.provider.ProtocolConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Component; import java.util.List; import java.util.stream.Collectors; -@Component -@AllArgsConstructor public class LeadingCodeMatcher { - private final ProtocolConfigMapper protocolMapper; - //** 1、首字母匹配前导码, // 2、以匹配出的前导码是否在报文中条件进行前导码的匹配二次筛选 - public List matchLeadingCode(String protocolContent){ + public static List matchFrameLeadingCode(String protocolContent){ List initialConfigs = initialMatch(protocolContent); List preCodeConfigs = initialConfigs.stream() .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) @@ -26,13 +19,16 @@ } //初始化匹配前导码内容 - private List initialMatch(String protocolContent) { - String protocolStr = protocolContent.charAt(0) + ""; - QueryWrapper queryWrapper = new QueryWrapper() - .likeRight("pre_fix", protocolStr); - List protocolConfigList = protocolMapper.selectList(queryWrapper); - return protocolConfigList; + private static List initialMatch(String protocolContent) { + String firstFrameChar = protocolContent.charAt(0) + ""; + ProtocolConfigProvider protocolConfigProvider=new ProtocolConfigProvider(firstFrameChar); + return protocolConfigProvider.getMatchList(); } + + + + + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index cf2113d..e915877 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -1,32 +1,35 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(0) -@Service +@Component public class FrameLengthMatcher implements FrameStructMatcher { - @Autowired - private FieldParser fieldParser; - //超过长度 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { String dataGramContent = ByteBufUtil.hexDump(byteBuf); - if (StringUtils.isEmpty(protocolConfig.getUnpackId()) && StringUtils.isEmpty(protocolConfig.getTailStr())) { - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + //当不存在结尾标志和拆包标志,可以直接使用长度进行匹配 + if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { if (dataGramContent.length() >= totalLength) {//等于长度返回true,超出长度,切断 - ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, protocolConfig, totalLength); + ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, totalLength); return wholeDatagramByte; } else { //读的标志位前移舍弃 @@ -38,7 +41,7 @@ return null; } - private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, Integer totalLength) { byteBuf.readBytes(totalLength); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, totalLength - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 2bfc213..d527ad0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; @@ -13,7 +13,7 @@ import lombok.AllArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.nio.charset.Charset; import java.util.Map; @@ -22,32 +22,30 @@ * 后续标志验证 */ @Order(1) -@Service +@Component @AllArgsConstructor -public class FrameMarkMatcher implements FrameStructMatcher { - - private final FieldConfigDao fieldConfigDao; - private final FieldParser fieldParser; - private final FieldResolver fieldResolverManger; +public class FrameMarkMatcher implements FrameStructMatcher, FixedPropertyEnum { //帧后续标志=>结束,进行帧的重组=>有后续,1、帧移位判别 2、继续接收帧 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig UnpackConfig = StringUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getUnpackId()); - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); - Integer upback = 0; + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); ByteBuf mergeWholeFrameByte = null; - if (!ObjectUtil.isEmpty(UnpackConfig)) { - while (hasNextFullFrame(byteBuf, protocolConfig)) { - upback = (Integer) fieldResolverManger.filedParserManger(byteBuf, UnpackConfig, null); + if (!ObjectUtil.isEmpty(unpackFlag)) { + while (hasNextFullFrame(byteBuf, protocolConfig, protocolFieldConfigProvider)) { //是否存在后续位 - if (upback == 1) {//使用esayRule + if (unpackFlag == 1) {//使用esayRule //表示可以截取 - mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolConfig, totalLength); + mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolFieldConfigProvider, protocolConfig); return mergeWholeFrameByte; } else { - byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig)); + byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig, protocolFieldConfigProvider)); } } } @@ -56,7 +54,8 @@ //选取第一个帧,将业务内容和后面部分分开 //计算数据报文-业务内容 - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolFieldConfigProvider protocolFieldConfigProvider, ProtocolConfig protocolConfig) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); //截取完整报文 byteBuf.readBytes(totalLength); ByteBuf byteBufContent = byteBuf.slice(0, byteBuf.readerIndex()); @@ -68,15 +67,15 @@ String tail = ""; System.out.println(ByteBufUtil.hexDump(byteBufContent)); //会存在多个帧拼接在一起的的情况,进行合并处理 - while (hasNextFullFrame(byteBufContent, protocolConfig)) { - Integer currentFrameLength = fieldParser.getTotalLength(protocolConfig, byteBufContent); + while (hasNextFullFrame(byteBufContent, protocolConfig, protocolFieldConfigProvider)) { + Integer currentFrameLength = protocolFieldConfigProvider.getTotalLength(byteBufContent, protocolConfig); byteBufContent.readBytes(currentFrameLength); ByteBuf currentbyteBuf = byteBufContent.slice(0, byteBufContent.readerIndex()); byteBufContent.markReaderIndex();//读的标志位前移 System.out.println(ByteBufUtil.hexDump(byteBufContent)); String hexDump = currentbyteBuf.toString(Charset.forName("ISO-8859-1")); //获取当前固定帧结构的关系map - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, currentbyteBuf); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(currentbyteBuf, protocolConfig); if (StringUtils.isEmpty(mergeFrameStr)) { //首次获取业务数据报文 mergeFrameStr += hexDump.substring(0, currentFrameFixedProperty.get("tailPosition")); @@ -95,22 +94,22 @@ /** * 获取平移到下一帧起始位置 */ - public int getNextFrameOffset(ByteBuf buffer, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, buffer); - return currentFrameFixedProperty.get("totalLength"); + public int getNextFrameOffset(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + return currentFrameFixedProperty.get(TOTAL_LENGTH); } /** * 判断是否出错进行整个帧的 */ - public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, byteBuf); + public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); //保证读取位置不在固定位置,是可变的业务内容 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("fixedPosition")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(FIXED_POSITION)) { return false; } //判断读取是否操作帧长度 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("totalLength")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(TOTAL_LENGTH)) { return false; } return true; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 76a3784..c3a1bab 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -1,50 +1,50 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.parser.instance.GeneralProcessor; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; +import io.netty.buffer.ByteBufUtil;; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(2) -@Service +@Component public class FrameTailMatcher implements FrameStructMatcher { - @Resource - private FieldConfigDao fieldConfigDao; - @Autowired - private GeneralProcessor generalProcessor; - //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig tailFieldConfig = StringUtils.isEmpty(protocolConfig.getTailStr()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getTailStr()); - if (!ObjectUtil.isEmpty(tailFieldConfig)) { - String tailStr = tailFieldConfig.getFieldName(); + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfig protocolFieldConfig = ObjectUtils.isEmpty(protocolConfig.getTailStr()) ? null : + fieldConfigProvider.getFieldConfigById(protocolConfig.getTailStr()); + if (!ObjectUtil.isEmpty(protocolFieldConfig)) { + String tailStr = protocolFieldConfig.getFieldName(); String dataGramContent = ByteBufUtil.hexDump(byteBuf); Boolean tailFlag = ByteBufUtil.hexDump(byteBuf).contains(tailStr); if (!tailFlag) { //使用esayRule return null; } else if (dataGramContent.indexOf(tailStr) < dataGramContent.length() - tailStr.length()) { Integer length = dataGramContent.indexOf(tailStr) + tailStr.length(); - ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, protocolConfig, length); + ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, length); return wholeDatagramByte; //存在粘包 } } return null; } - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer length) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, Integer length) { byteBuf.readBytes(length); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, length - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java new file mode 100644 index 0000000..5f1c177 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java @@ -0,0 +1,73 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.combined.GenericCombinedFieldResolver; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.CombinedFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class CombinedFieldConfigProvider { + + + /** + * 作为临时配置列表缓存使用 + */ + private final List combinedFieldConfigList; + private Map storeObjectMap = new HashMap<>(); + + public CombinedFieldConfigProvider(Long ruleId) { + CombinedFieldConfigRegistry combinedFieldConfigRegistry = SpringContextUtil.getBean(CombinedFieldConfigRegistry.class); + combinedFieldConfigList = combinedFieldConfigRegistry.getCombinedFieldConfigList(ruleId); + } + + public void parseDataField(RuleConfig ruleConfig, String clearZeroPlain,Map fieldConfigsMap ) { + if (showSkip()) { + return; + } + //匹配对应的数据,然后进行相关的字段解析 + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver(); + combinedFieldResolver.parseDataField(combinedFieldConfigList, byteBuf, storeObjectMap,fieldConfigsMap); + } + + + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getCombinedFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return combinedFieldConfigList.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public List getCombinedFieldConfigList() { + return combinedFieldConfigList; + } + + /* 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(combinedFieldConfigList) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java new file mode 100644 index 0000000..f3cfedc --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java @@ -0,0 +1,11 @@ +package com.casic.missiles.parser.provider; + +/** + * @author cz + * @date 2023-6-12 + */ +public class CommandEventProvider{ + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java new file mode 100644 index 0000000..70eec5e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java @@ -0,0 +1,77 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.safe.SafeStrategy; +import com.casic.missiles.parser.sender.DataSubscribeProvider; +import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class DatagramEventProvider { + + private final DatagramEventConfig processorInstance; + + public DatagramEventProvider(Long ruleId) { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + List datagramEventConfigList = + datagramEventRegistry.getDatagramEventList(ruleId); + processorInstance = this.getProcessorInstance(datagramEventConfigList); + } + + public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { + if (showSkip()) { + return null; + } + return datagramEventConfigList.get(0); + } + + // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 + public String getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap) { + String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? + processorInstance.getSafeBean() : + fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); + if (!StringUtils.isEmpty(safeName)) { + //需要加密 + SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); + String plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); + return clearComplementZero(plain); + } + return ByteBufUtil.hexDump(bizDataContent); + } + + //解密清零操作 + private String clearComplementZero(String plain) { + plain = plain.substring(0, plain.lastIndexOf("00")); + return plain; + } + + //数据发送,数据发送者暂未构建 + public void storeData(Map bizDataMap) { + DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); +// dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return ObjectUtils.isNotEmpty(processorInstance) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java new file mode 100644 index 0000000..7e1fe0a --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java @@ -0,0 +1,97 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.FieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class FieldConfigProvider { + + + private final List fieldConfigs; + private Map storeObjectMap = new HashMap<>(); +// private Map singleObjects = new ConcurrentHashMap<>(); + + public FieldConfigProvider(Long ruleId) { + FieldConfigRegistry fieldConfigRegistry = SpringContextUtil.getBean(FieldConfigRegistry.class); + fieldConfigs = fieldConfigRegistry.getFieldConfigList(ruleId); + } + + public List getFieldConfigs() { + return fieldConfigs; + } + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public Map parseDataField(RuleConfig ruleConfig, String clearZeroPlain) { + if (showSkip()) { + return null; + } + List prepareFieldConfig = prepareParseField(ruleConfig); + if (CollectionUtils.isNotEmpty(prepareFieldConfig)) { + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(fieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + return fixDataMap; + } + } + return null; + } + + /** + * 得到需要处理的业务内容 + * + * @return + */ + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return fieldConfigs.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public Map getFieldConfigsMap() { + return fieldConfigs.stream().collect( + Collectors.toMap(FieldConfig::getId, e -> e) + ); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(fieldConfigs) ? false : true; + } + + +} + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java new file mode 100644 index 0000000..817bfaf --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java @@ -0,0 +1,19 @@ +package com.casic.missiles.parser.provider; + +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.registry.FieldRuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; + +public class FieldRuleConfigProvider { + + private final List fieldRuleConfigList; + + public FieldRuleConfigProvider(Long ruleId) { + FieldRuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(FieldRuleConfigRegistry.class); + fieldRuleConfigList = ruleConfigRegistry.getFieldRuleConfigList(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java new file mode 100644 index 0000000..99a1b06 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java @@ -0,0 +1,53 @@ +package com.casic.missiles.parser.provider; + + +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.registry.ProtocolConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolConfigProvider { + + private final List protocolConfigList; + + public ProtocolConfigProvider(String firstChar) { + ProtocolConfigRegistry registry = SpringContextUtil.getBean(ProtocolConfigRegistry.class); + protocolConfigList = registry.getProtocolConfigList(firstChar); + } + + public List getMatchList() { + return protocolConfigList; + } + + /** + * 设置当前协议 + * + * @param protocolConfig + */ + public ProtocolConfigProvider(ProtocolConfig protocolConfig) { + List protocolConfigs = new ArrayList<>(); + protocolConfigs.add(protocolConfig); + protocolConfigList = protocolConfigs; + } + + /** + * 获取当前协议 + * + * @return + */ + public ProtocolConfig getCurrentProtocolConfig() { + if (this.protocolConfigList == null) { + return null; + } else { + return protocolConfigList.get(0); + } + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java new file mode 100644 index 0000000..043927d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java @@ -0,0 +1,213 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.registry.ProtocolFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolFieldConfigProvider { + + private static final String FIXED_FIELD_DS = "fixedFieldDs"; + private static final String CONTENT_FIELD_DS = "contentFieldDs"; + private static final String PROTOCOL_LENGTH = "protocolLength"; + private static final String PROTOCOL_FIELD_ID = "protocolFieldId"; + private static final String PROTOCOL_POSITION = "protocolPosition"; + + private final List protocolFieldConfigs; + private Map singleObjects = new ConcurrentHashMap<>(); + private Map storeObjectMap = new HashMap<>(); + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public ProtocolFieldConfigProvider(Long protocolId) { + ProtocolFieldConfigRegistry protocolFieldConfigRegistry = SpringContextUtil.getBean(ProtocolFieldConfigRegistry.class); + protocolFieldConfigs = protocolFieldConfigRegistry.getProtocolFieldConfigList(protocolId); + } + + public List getProtocolFieldConfigs() { + return protocolFieldConfigs; + } + + public ProtocolFieldConfig getFieldConfigById(Long fieldId) { + Optional optionalConfig = protocolFieldConfigs.stream().filter( + e -> e.getId().equals(fieldId) + ).findFirst(); + return optionalConfig.isPresent() ? optionalConfig.get() : null; + } + + public Integer getProtocolFieldValue(Long protocolFieldId, ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_FIELD_ID + protocolFieldId + ByteBufUtil.hexDump(byteBuf); + //获取缓存 + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + //加载固定长度数据集合 + Map fixDataMap = this.getProtocolDataMap(byteBuf); + ProtocolFieldConfig protocolFieldConfig = selectFieldConfig(protocolFieldId); + Integer protocolFieldValue = 0; + //获取约定字段的总长度 + if (fixDataMap.containsKey(protocolFieldConfig.getFieldName())) { + Object appointUnpackObject = fixDataMap.get(protocolFieldConfig.getFieldName()); + if (ObjectUtils.isNotEmpty(appointUnpackObject)) { + protocolFieldValue = (Integer) appointUnpackObject; + } + } + if (protocolFieldValue != null) { + //加入缓存 + if (ObjectUtils.isNotEmpty(protocolFieldValue)) { + this.singleObjects.put(catchKey, protocolFieldValue); + return protocolFieldValue; + } + } + return null; + } + + /** + * 获取帧固定位置信息 + * + * @param byteBuf + * @param protocolConfig + * @return + */ + public Map getFixedProperty(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_POSITION + protocolConfig.getId(); + if (this.singleObjects.containsKey(catchKey)) { + return (Map) singleObjects.get(catchKey); + } + Map fixedPropertyMap = new HashMap<>(); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + fixedPropertyMap = fieldParser.doGetFixedProperty(protocolFieldConfigs, this.getTotalLength(byteBuf,protocolConfig)); + if (CollectionUtils.isNotEmpty(fixedPropertyMap)) { + this.singleObjects.put(catchKey, fixedPropertyMap); + return fixedPropertyMap; + } + return fixedPropertyMap; + } + + /** + * 获取帧结构应有的总长度 + */ + public Integer getTotalLength(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_LENGTH + ByteBufUtil.hexDump(byteBuf); + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + Integer appointFrameLength = getProtocolFieldValue(protocolConfig.getTotalLengthId(), byteBuf); + if (appointFrameLength != null) { + //获取过滤的字段集合总长度 + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Integer totalFilterLength = fieldParser.getTotalFilterLength(protocolConfig, byteBuf, getFixFieldConfigMap()); + //计算总长度 + Integer totalLength = appointFrameLength + totalFilterLength; + //加入缓存 + if (ObjectUtils.isNotEmpty(totalLength)) { + this.singleObjects.put(catchKey, totalLength); + return totalLength; + } + } + return null; + } + + /** + * 获取协议有关字段解析内容 + * storeObjectMap存储代转存的数据 + * + * @return + */ + public Map getProtocolDataMap(ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(FIXED_FIELD_DS)) { + return (Map) singleObjects.get(FIXED_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(protocolFieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + this.singleObjects.put(FIXED_FIELD_DS, fixDataMap); + return fixDataMap; + } + return null; + } + + /** + * 获取业务报文内容的content字节 + * + * @param wholeDatagramByte + * @return + */ + public ByteBuf getDataContentBuf(ByteBuf wholeDatagramByte) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(CONTENT_FIELD_DS)) { + return (ByteBuf) singleObjects.get(CONTENT_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + ByteBuf bizDataByteBuf = fieldParser.getDataContentBuf(protocolFieldConfigs, wholeDatagramByte); + if (bizDataByteBuf != null) { + this.singleObjects.put(CONTENT_FIELD_DS, bizDataByteBuf); + return bizDataByteBuf; + } + return null; + } + + + private ProtocolFieldConfig selectFieldConfig(Long id) { + Optional optionalProtocolFieldConfig = this.protocolFieldConfigs.stream().filter( + e -> e.getId().equals(id) + ).findFirst(); + return optionalProtocolFieldConfig.isPresent() ? optionalProtocolFieldConfig.get() : null; + } + + + private Map getFixFieldConfigMap() { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, e -> e) + ); + return fixDataFieldMap; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(protocolFieldConfigs) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java new file mode 100644 index 0000000..dafba1c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java @@ -0,0 +1,56 @@ +package com.casic.missiles.parser.provider; + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.rule.GenericRuleResolver; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.RuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleConfigProvider { + + private final List ruleConfigs; + + public List getRuleConfigs() { + return ruleConfigs; + } + + public RuleConfigProvider(Long protocolId) { + RuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(RuleConfigRegistry.class); + ruleConfigs = ruleConfigRegistry.getRuleConfigById(protocolId); + } + + /** + * 获取规则匹配结果 + * + * @param parseFixedDataMap + * @param protocolFieldConfigs + * @return + */ + public RuleConfig doGetRule(Map parseFixedDataMap, + String ids, + List protocolFieldConfigs) { + if (showSkip()) { + return null; + } + RuleConfig ruleConfig = GenericRuleResolver.machRule(parseFixedDataMap, ids, protocolFieldConfigs, ruleConfigs); + return ruleConfig; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(ruleConfigs) ? false : true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java index 3c05891..856b399 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java @@ -1,18 +1,11 @@ package com.casic.missiles.parser.resolver; -import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.springframework.web.bind.annotation.RequestBody; -import javax.annotation.Resource; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -20,19 +13,17 @@ @Slf4j public class ByteMergeProvider { - @Resource - private FieldRuleEngineMapper fieldRuleEngineMapper; - //拿到所有的值合并到一个值 - public String resolveByteMerge(List valueList, String ruletypeId, String vaildRange) { + public static String resolveByteMerge(List valueList, String ruleTypeId, String vaildRange) { String values = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Map vaildMap = getValidRangeMap(vaildRange); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(ruletypeId); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } + //暂时不处理 +// fieldRuleEngine = fieldRuleConfigMapper.selectById(ruleTypeId); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } Map env2 = new HashMap(); for (int i = 0; i < valueList.size(); i++) { if (vaildMap.containsKey(i)) { @@ -47,7 +38,7 @@ } } - private Map getValidRangeMap(String vaildRange) { + private static Map getValidRangeMap(String vaildRange) { String[] range = vaildRange.split(","); Map vaildMap = new HashMap(); for (int i = 0; i < range.length; i++) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 8d821cd..85d6bbf 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -1,9 +1,12 @@ package com.casic.missiles.parser.resolver; +import com.casic.missiles.pojo.AbstractFieldConfig; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; import io.netty.buffer.ByteBuf; +import java.util.List; import java.util.Map; /** @@ -11,18 +14,14 @@ */ public interface FieldParser { -// Map fieldProcess(String protocolContent,); - Map dataParser(RuleConfig ruleConfig, String lightText,String protocolId); + Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength); - Map fixDataParser(String protocolId, ByteBuf buffer); + Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap); - Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf); + ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer); - ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer); - - ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer); - - Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer); + Integer getTotalFilterLength(ProtocolConfig protocolConfig, ByteBuf byteBuf, Map protocolFieldConfigMap); } + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java new file mode 100644 index 0000000..9e0c00e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java @@ -0,0 +1,52 @@ +package com.casic.missiles.parser.resolver; + +import com.casic.missiles.pojo.AbstractFieldConfig; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.util.List; + +public class FieldParserSupport { + + //分别计算bit和byte长度=> 合并长度 + protected Integer calculateLength(List fieldConfigList) { + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + Integer fixedLength = bytefixedLength + bitfixedLength / 8; + return fixedLength; + } + + //找到最大值=> 根据最大值计算业务数据下标 + protected Integer calculatePosition(List fieldConfigList) { + String rex = "[0-9]+"; + Integer max = -1; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) + && Integer.valueOf(fieldConfig.getOriginPositionByte()) > max) { + max = Integer.valueOf(fieldConfig.getOriginPositionByte()); + } + } + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) && fieldConfig.getOriginPositionByte().equals(max)) { + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + } + } + Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; + return maxFixedPosition; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java deleted file mode 100644 index dd3a6cd..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java +++ /dev/null @@ -1,170 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.ByteResolverParam; -import io.netty.buffer.ByteBuf; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -/** - * 字段解析管理总类 - */ -@Service -@Slf4j -@AllArgsConstructor -public class FieldResolver extends ByteMergeProvider { - - //1、字段截取 => 2、简单的字节解析和复杂的字节解析 - public Object filedParserManger(ByteBuf byteBuf, FieldConfig fieldConfig, Integer maxFixedPosition) { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - //最大固定位置不为空, - if (!ObjectUtil.isEmpty(maxFixedPosition)) { - orignPosition -= maxFixedPosition; - } - Object fieldValue = 0; - //待优化 - if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { - fieldValue = bitToResolver(byteBuf, fieldConfig); - } else { - ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); - fieldValue = parsingFields(fieldBytes, fieldConfig.getRuleJson()); - } - return fieldValue; - } - - //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, - //目前默认配置的规则设置暂不支持配置化,由实现完成 - private Object parsingFields(ByteBuf byteBuf, String ruleJson) { - Object fieldsResolveValue = null; - List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); - if (ObjectUtil.isEmpty(ruleMapList)) { - fieldsResolveValue = defaultResolveBuilder(byteBuf); - } else { - fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); - } - return fieldsResolveValue; - } - - private Object defaultResolveBuilder(ByteBuf byteBuf) { - Integer defaultResolveValue = 0; - for (int i = 0; i < byteBuf.writerIndex(); i++) { - defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; - } - return defaultResolveValue; - } - - //字段解析构建器(针对字节单位的) - //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 - // 字节归并结束或者规则结束=>继续根据规则进行判断 - private Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { - Object customizeResolveValue = null; - try { - List bytStrList = new ArrayList<>(); - //存放到数组里面 - for (int i = 0; i < byteBuf.writerIndex(); i++) { - bytStrList.add(byteBuf.readByte()); - } - int i = 0; - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - customizeResolveValue = this.resolveByteMerge(bytStrList, ruletypeId,vaildRange); - break; - } else { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - List tempBytStr = new ArrayList<>(); - for (int k = 0; i < bytStrList.size(); i++) { - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(k) - .value(bytStrList.get(k)) - .ruletypeId(ruletypeId).build(); - tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); - } - bytStrList = tempBytStr; - } - i++; - } - //字节归并到一起=>继续根据规则进行判断 - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(customizeResolveValue) - .ruletypeId(ruletypeId).build(); - customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(customizeResolveValue)); - return customizeResolveValue; - } catch (RuntimeException ex) { - log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); - return null; - } - } - - /** - * 1、单个字节情况表示字段 - * 2、多字节情况表示字段(暂未处理) - */ - private Object bitToResolver(ByteBuf byteBuf, FieldConfig fieldConfig) { - Object fieldValue = new Object(); - try { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - byte fields = 0x00; - if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); - } else { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); - } - - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { - if (!StringUtils.isEmpty(fieldConfig.getExactOrignPosition())) { - fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getExactOrignPosition())).byteValue() - >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); - } else { - fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); - } - } else { - fieldValue = Integer.valueOf(fields & 0xff); - } - if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { - return fieldValue; - } - List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); - int i = 0; - //字节归并到一起=>继续根据规则进行判断 - while (i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(fieldValue) - .ruletypeId(ruletypeId).build(); - fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(fieldValue)); - return fieldValue; - } catch (RuntimeException ex) { - log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); - return null; - } - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java new file mode 100644 index 0000000..1d2aeab --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java @@ -0,0 +1,36 @@ +package com.casic.missiles.parser.resolver.bytes; + +import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.mapper.FieldRuleConfigMapper; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.pojo.ByteResolverParam; +import com.googlecode.aviator.AviatorEvaluator; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; +//转换规则 +@Component("convert") +@AllArgsConstructor +@Slf4j +public class ByteRuleResolver implements ByteResolver { + + private final FieldRuleConfigMapper fieldRuleConfigMapper; + + @Override + public Object resolveOperationRule(ByteResolverParam byteResolverParam){ + FieldRuleConfig fieldRuleEngine=fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); + if(ObjectUtil.isEmpty(fieldRuleEngine)){ + return byteResolverParam.getValue(); + } + String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); + Map env2 = new HashMap(); + env2.put("value", (byte) byteResolverParam.getValue()); + String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); + return values; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java index 103821c..786b71c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java @@ -2,34 +2,34 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("logicalShift") +@Component("logicalShift") @AllArgsConstructor @Slf4j public class LogicalShiftResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //字节位移 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { Integer index = byteResolverParam.getIndex(); - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return byteResolverParam.getValue(); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java index 476747d..01149bd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("operation") +@Component("operation") @AllArgsConstructor @Slf4j public class OperationResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //混合运算,有常量或者乘除的缩放 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java index 0b82cf4..79abcce 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.casic.missiles.pojo.ByteResolverParam; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; //精度计算 -@Service("precision") +@Component("precision") @AllArgsConstructor @Slf4j public class PrecisionResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java deleted file mode 100644 index 5c3f332..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; -//转换规则 -@Service("convert") -@AllArgsConstructor -@Slf4j -public class RuleResolver implements ByteResolver { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam){ - RuleEvaluator fieldRuleEngine=fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); - if(ObjectUtil.isEmpty(fieldRuleEngine)){ - return byteResolverParam.getValue(); - } - String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); - Map env2 = new HashMap(); - env2.put("value", (byte) byteResolverParam.getValue()); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java new file mode 100644 index 0000000..d3bbd91 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java @@ -0,0 +1,15 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; + +import java.util.List; +import java.util.Map; +// 前导码匹配->长度字段 +public interface AbstractCombinedFieldProcessor { + + Map invoke(Map map, ByteBuf byteBuf, List combinedFieldConfigList, + Map fieldConfigsMap, Map storeObjectMap); + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java new file mode 100644 index 0000000..03c8480 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java @@ -0,0 +1,59 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-13 + */ +//依次递增进行数据的解析, +public class GenericCombinedFieldResolver { + + + //通过查询,字段长度长度随机 + public void parseDataField(List combinedFieldConfigList, ByteBuf byteBuf, + Map storeObjectMap, Map fieldConfigsMap) { + Integer frameLength = Integer.valueOf(ByteBufUtil.hexDump(byteBuf)); + //添加前置处理器 + com.casic.missiles.util.ClassUtil classUtil = new com.casic.missiles.util.ClassUtil(); + List abstractCombinedProcessors = classUtil.getSubClassList(AbstractCombinedFieldProcessor.class); + + Map fieldFixedMap = combinedFieldLeadCodeMap(combinedFieldConfigList); + //frameLength + Map combinedProcessorFields = null; + while (byteBuf.readableBytes() < frameLength) { + //一直处理 + for (AbstractCombinedFieldProcessor abstractCombinedProcessor : abstractCombinedProcessors) { + combinedProcessorFields = abstractCombinedProcessor.invoke(combinedProcessorFields, byteBuf, + combinedFieldConfigList, + fieldConfigsMap, storeObjectMap); + if (combinedProcessorFields == null || byteBuf.readableBytes() < frameLength) { + return; + } + } + + } + } + + /** + * 取出前导码匹配集合 + */ + private Map combinedFieldLeadCodeMap(List combinedFieldConfigList) { + Map fieldFixedMap = combinedFieldConfigList + .stream() + .collect(Collectors.toMap(CombinedFieldConfig::getPrefixCode, e -> e)); + return fieldFixedMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java new file mode 100644 index 0000000..643a934 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java @@ -0,0 +1,100 @@ +package com.casic.missiles.parser.resolver.fields; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.FieldParserSupport; +import com.casic.missiles.pojo.*; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 保存使用时最基本的信息,并且使用原型模式 + */ +@Slf4j +public class DefaultProtocolFieldParser extends FieldParserSupport implements FieldParser, FixedPropertyEnum { + + //通过传入的配置和报文进行字段解析 + @Override + public Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap) { + Map dataMap = new HashMap<>(); + for (AbstractFieldConfig protocolFieldConfig : protocolFieldConfigs) { + if (!ObjectUtils.isEmpty(protocolFieldConfig.getOriginPositionByte())) { + Object fieldValue = FieldResolver.parseField(buffer, protocolFieldConfig, null); + if (protocolFieldConfig.getIsStorage() == 1) { + storeObjectMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + dataMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + } + return dataMap; + } + + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength) { + Map fixedPropertyMap = new HashMap<>(); + Integer fixedLength = calculateLength(protocolFieldConfigs); + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + fixedPropertyMap.put(FIXED_POSITION, maxFixedPosition); + fixedPropertyMap.put(TOTAL_LENGTH, totalLength); + fixedPropertyMap.put(TAIL_POSITION, totalLength - fixedLength + maxFixedPosition); + return fixedPropertyMap; + } + + //** 获取业务内容的byteBuf + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer) { + //计算固定长度 + Integer fixedLength = calculateLength(protocolFieldConfigs); + //总长度获取 + String lightText = buffer.toString(Charset.forName("ISO-8859-1")); + Integer totalLength = lightText.length(); + //计算固定长度最大长度 + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + //计算数据报文内容 + ByteBuf bizDataFields = buffer.slice(maxFixedPosition - 1, (totalLength - fixedLength)); + return bizDataFields; + } + + /** + * 获取过滤字段的长度 + */ + @Override + public Integer getTotalFilterLength(ProtocolConfig protocolConfig, + ByteBuf byteBuf, + Map protocolFieldConfigMap) { + if (ByteBufUtil.hexDump(byteBuf).equals("")) { + return 0; + } + int totalFilterLength = 0; + String filterFields = protocolConfig.getTotalLengthFilterFields(); + try { + if (!StringUtils.isEmpty(filterFields)) { + String[] filterFieldList = filterFields.split(","); + for (String filterFieldId : filterFieldList) { + if (StringUtils.isNotEmpty(filterFieldId)) { + ProtocolFieldConfig fieldConfig = protocolFieldConfigMap.get(Long.valueOf(filterFieldId)); + //这里都是按字节计算,没有对位进行区分,可能会出现错误 + // 如果对位有需求,需要进一步跟进 + totalFilterLength += fieldConfig.getOffsetLength(); + } + } + } + return totalFilterLength; + } catch (Exception ex) { + log.error("报文确认分发阶段,获取报文总长度过滤长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); + } + return totalFilterLength; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java new file mode 100644 index 0000000..d51e887 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java @@ -0,0 +1,169 @@ +package com.casic.missiles.parser.resolver.fields; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.parser.resolver.ByteMergeProvider; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.AbstractFieldConfig; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.pojo.ByteResolverParam; +import io.netty.buffer.ByteBuf; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * 字段解析管理总类 + */ +@Slf4j +public class FieldResolver extends ByteMergeProvider { + + //1、字段截取 => 2、简单的字节解析和复杂的字节解析 + public static Object parseField(ByteBuf byteBuf,AbstractFieldConfig fieldConfig, Integer maxFixedPosition) { + Integer orignPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + //最大固定位置不为空, + if (!ObjectUtil.isEmpty(maxFixedPosition)) { + orignPosition -= maxFixedPosition; + } + Object fieldValue = 0; + //待优化 + if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { + fieldValue = doParseBitField(byteBuf, fieldConfig); + } else { + ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); + fieldValue = doParseByteField(fieldBytes, fieldConfig.getRuleJson()); + } + return fieldValue; + } + + //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, + //目前默认配置的规则设置暂不支持配置化,由实现完成 + private static Object doParseByteField(ByteBuf byteBuf, String ruleJson) { + Object fieldsResolveValue = null; + List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); + if (ObjectUtil.isEmpty(ruleMapList)) { + fieldsResolveValue = defaultResolveBuilder(byteBuf); + } else { + fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); + } + return fieldsResolveValue; + } + + private static Object defaultResolveBuilder(ByteBuf byteBuf) { + Integer defaultResolveValue = 0; + for (int i = 0; i < byteBuf.writerIndex(); i++) { + defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; + } + return defaultResolveValue; + } + + //字段解析构建器(针对字节单位的) + //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 + // 字节归并结束或者规则结束=>继续根据规则进行判断 + private static Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { + Object customizeResolveValue = null; + try { + List bytStrList = new ArrayList<>(); + //存放到数组里面 + for (int i = 0; i < byteBuf.writerIndex(); i++) { + bytStrList.add(byteBuf.readByte()); + } + int i = 0; + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { + if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + customizeResolveValue = resolveByteMerge(bytStrList, ruletypeId, vaildRange); + break; + } else { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + List tempBytStr = new ArrayList<>(); + for (int k = 0; i < bytStrList.size(); i++) { + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(k) + .value(bytStrList.get(k)) + .ruletypeId(ruletypeId).build(); + tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); + } + bytStrList = tempBytStr; + } + i++; + } + //字节归并到一起=>继续根据规则进行判断 + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(null) + .value(customizeResolveValue) + .ruletypeId(ruletypeId).build(); + customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); + i++; + } + System.out.println(JSON.toJSON(customizeResolveValue)); + return customizeResolveValue; + } catch (RuntimeException ex) { + log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); + return null; + } + } + + /** + * 1、单个字节情况表示字段 + * 2、多字节情况表示字段(暂未处理) + */ + private static Object doParseBitField(ByteBuf byteBuf,AbstractFieldConfig fieldConfig) { + Object fieldValue = new Object(); + try { + Integer orignPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + byte fields = 0x00; + if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { + fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); + } else { + fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); + } + + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { + if (!StringUtils.isEmpty(fieldConfig.getOriginPositionBit())) { + fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getOriginPositionBit())).byteValue() + >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); + } else { + fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); + } + } else { + fieldValue = Integer.valueOf(fields & 0xff); + } + if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { + return fieldValue; + } + List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); + int i = 0; + //字节归并到一起=>继续根据规则进行判断 + while (i < ruleMapList.size()) { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(null) + .value(fieldValue) + .ruletypeId(ruletypeId).build(); + fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); + i++; + } + System.out.println(JSON.toJSON(fieldValue)); + return fieldValue; + } catch (RuntimeException ex) { + log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); + return null; + } + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java deleted file mode 100644 index 35ae3d0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java +++ /dev/null @@ -1,183 +0,0 @@ -package com.casic.missiles.parser.resolver.fields; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufAllocator; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; -import org.springframework.util.ObjectUtils; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service("standard") -@AllArgsConstructor -@Slf4j -public class StandardFieldParser implements FieldParser { - - private final FieldConfigDao fieldConfigDao; - private final FieldResolver fieldResolver; - - //数据解析 - @Override - public Map dataParser(RuleConfig ruleConfig, String lightText, String protocolId) { - String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); - ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); - bufferContent.writeBytes(lightText.getBytes(Charset.forName("ISO-8859-1"))); - Map dataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - for (String dataFieldId : dataFieldIds) { - FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(dataFieldId); - if (!ObjectUtils.isEmpty(fieldConfig)) { - dataMap.put(fieldConfig.getFieldName(), String.valueOf(fieldResolver.filedParserManger(bufferContent, fieldConfig, maxFixedPosition))); - } - } - return dataMap; - } - - //数据解析 - @Override - public Map fixDataParser(String protocolId, ByteBuf buffer) { - List dataFieldIdList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Map dataMap = new HashMap<>(); - for (FieldConfig dataField : dataFieldIdList) { - if (!ObjectUtils.isEmpty(dataField.getOrignPosition())) { - Object fieldValue = (Integer) fieldResolver.filedParserManger(buffer, dataField, null); - dataMap.put(dataField.getFieldName(), fieldValue); - } - } - return dataMap; - } - - @Override - public Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf) { - if (ByteBufUtil.hexDump(byteBuf).equals("")) { - return 0; - } - String filterFields = protocolConfig.getTotalLengthFilterField(); - Integer totalLength = 0; - try { - FieldConfig totalFieldConfig = fieldConfigDao.getFieldConfigById(protocolConfig.getTotalLengthId()); - int totalFilterLength = 0; - if (!StringUtils.isEmpty(filterFields)) { - String[] filterFieldList = filterFields.split(","); - for (String filterField : filterFieldList) { - FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(filterField); - //这里都是按字节计算,没有对位进行区分,可能会出现错误 - - // 如果对位有需求,需要进一步跟进 - totalFilterLength += fieldConfig.getOffsetLength(); - } - } - totalLength = (Integer) fieldResolver.filedParserManger(byteBuf, totalFieldConfig, null) + totalFilterLength; - } catch (Exception ex) { - log.error("报文确认分发阶段,获取报文总长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); - } - return totalLength; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer) { - //业务内容 - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - String protocolId = String.valueOf(protocolConfig.getId()); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - //计算固定长度 - Integer fixedLength = calculateLength(fieldConfigList); -// Integer totalLength = this.getTotalLength(protocolConfig, buffer); - //总长度获取 - Integer totalLength = lightText.length(); - //计算固定长度最大长度 - Integer maxFixedPosition = calculatePosition(fieldConfigList); -// buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - //计算数据报文内容 - ByteBuf bizDataFields = buffer.slice(maxFixedPosition-1, (totalLength - fixedLength)); - return bizDataFields; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer) { - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - String protocolId = String.valueOf(protocolConfig.getId()); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer fixedLength = calculateLength(fieldConfigList); -// Integer totalLength = this.getTotalLength(protocolConfig, buffer); - Integer totalLength = lightText.length(); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - ByteBuf fixDataFields = buffer.slice(0, maxFixedPosition); - return fixDataFields; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer) { - String protocolId = String.valueOf(protocolConfig.getId()); - Map fixedPropertyMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer fixedLength = calculateLength(fieldConfigList); - Integer totalLength = this.getTotalLength(protocolConfig, buffer); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - fixedPropertyMap.put("fixedPosition", maxFixedPosition); - fixedPropertyMap.put("totalLength", totalLength); - fixedPropertyMap.put("tailPosition", totalLength - fixedLength + maxFixedPosition); - return fixedPropertyMap; - } - - //分别计算bit和byte长度=> 合并长度 - private Integer calculateLength(List fieldConfigList) { - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (FieldConfig fieldConfig : fieldConfigList) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - Integer fixedLength = bytefixedLength + bitfixedLength / 8; - return fixedLength; - } - - //找到最大值=> 根据最大值计算业务数据下标 - private Integer calculatePosition(List fieldConfigList) { - String rex = "[0-9]+"; - Integer max = -1; - for (FieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOrignPosition()) - && Integer.valueOf(fieldConfig.getOrignPosition()) > max) { - max = Integer.valueOf(fieldConfig.getOrignPosition()); - } - } - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (FieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOrignPosition()) && fieldConfig.getOrignPosition().equals(max)) { - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - } - } - Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; - return maxFixedPosition; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java new file mode 100644 index 0000000..d4ec6c7 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java @@ -0,0 +1,76 @@ +package com.casic.missiles.parser.rule; + +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import org.apache.commons.lang3.StringUtils; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class GenericRuleResolver { + + //根据前置字段的值,找到指定的规则 + //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 + //=>循环判断=>通过规则得到业务字段 + public static RuleConfig machRule(Map fixDataMap, + String ids, + List protocolFieldConfigs, + List ruleConfigs) { + List preRuleConfigList = getPreRuleList(ids, protocolFieldConfigs); + //获取前置规则字段 + final Map metaDataMap = getPreRuleFields(preRuleConfigList, fixDataMap); + //准备固定的字段集合 + Map fixDataFieldMap = getFixDataFieldMap(protocolFieldConfigs); + return RuleResolverCore.doMachRule(ruleConfigs, metaDataMap, fixDataMap, fixDataFieldMap); + } + + private static Map getFixDataFieldMap(List protocolFieldConfigs) { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, ProtocolFieldConfig::getFieldName) + ); + return fixDataFieldMap; + } + + + /** + * 查询前置规则的字段配置 + * + * @param ids + * @return + */ + private static List getPreRuleList(String ids, List protocolFieldConfigs) { + String[] idList = ids.split(","); + Map prepareMaps = new HashMap<>(); + for (String id : idList) { + if (StringUtils.isNotEmpty(id)) { + prepareMaps.put(Long.valueOf(id), ""); + } + } + List preRuleConfigList = protocolFieldConfigs + .stream() + .filter(e -> prepareMaps.containsKey(e.getId())) + .collect(Collectors.toList()); + return preRuleConfigList; + } + + /** + * 获取前置规则解析字段 + */ + private static Map getPreRuleFields(List preRuleFieldConfigList, Map fixDataMap) { + Map ruleFieldMap = new HashMap<>(); + preRuleFieldConfigList.stream() + .forEach( + preRuleFieldConfig -> { + String fieldName = preRuleFieldConfig.getFieldName(); + if (fixDataMap.containsKey(fieldName)) { + ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); + } + } + ); + return ruleFieldMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java new file mode 100644 index 0000000..baae7e8 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -0,0 +1,68 @@ +package com.casic.missiles.parser.rule; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.casic.missiles.pojo.RuleConfig; + +import java.util.*; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleResolverCore { + + + public static RuleConfig doMachRule(List ruleConfigList, Map metaDataMap, + Map fixDataMap, + Map fixDataFieldMap) { + Optional ruleConfigOptional = ruleConfigList.stream() + .filter(ruleConfig -> machRuleConfig( + JSON.parseObject(ruleConfig.getMatchRuleJson(), Map.class), metaDataMap)) + .findFirst(); + if (ObjectUtil.isEmpty(ruleConfigOptional)) { + return null; + } + String[] ruleFields = ruleConfigOptional.get().getDataFieldIds().split(","); + Map ruleMetaDataMap = getRuleFields(ruleFields, fixDataMap, fixDataFieldMap); + //递归选定解析规则,进行规则解析 + if (!ruleConfigOptional.get().getIsFinishMatch().equals("1")) { + //递归选定规则 + doMachRule(ruleConfigList, ruleMetaDataMap, fixDataMap, fixDataFieldMap); + } + return ruleConfigOptional.get(); + } + + + private static Map getRuleFields(String[] preRuleConfigList, Map fixedDataMap, + Map fixedFieldMap) { + Map ruleFieldMap = new HashMap<>(); + for (String preRuleConfigId : preRuleConfigList) { + String fieldName = fixedFieldMap.get(preRuleConfigId); + if (fixedDataMap.containsKey(fieldName)) { + ruleFieldMap.put(fieldName, String.valueOf(fixedDataMap.get(fieldName))); + } + } + return ruleFieldMap; + } + + + //匹配规则配置 + private static Boolean machRuleConfig(Map ruleMap, Map metaDataMap) { + if (ruleMap == null || metaDataMap == null) { + return null; + } + //所有的字段在规则里面必须有有配置 + for (String key : metaDataMap.keySet()) { + if (ruleMap.containsKey(key)) { + if (!ruleMap.get(key).equals(metaDataMap.get(key))) { + return false; + } + } else { + return false; + } + } + return true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java deleted file mode 100644 index 664088d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java +++ /dev/null @@ -1,92 +0,0 @@ -package com.casic.missiles.parser.rule; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.mapper.dao.PreRuleConfigDao; -import com.casic.missiles.mapper.dao.RuleConfigDao; -import lombok.AllArgsConstructor; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.*; -import java.util.stream.Collectors; - -@Service -@AllArgsConstructor -public class RulerProvider { - - private final FieldConfigDao fieldConfigDao; - private final PreRuleConfigDao preRuleConfigDao; - private final RuleConfigDao ruleConfigDao; - - //根据前置字段的值,找到指定的规则 - //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 - //=>循环判断=>通过规则得到业务字段 - public RuleConfig ruleConfig(Map fixDataMap, String protocolId) { - //批量获取规则 - List preRuleConfigList = preRuleConfigDao.getPreRuleList(protocolId); - //获取固定字段 - Map fixFieldMap = getAllFieldMap(protocolId); - //获取前置规则字段 - final String preRuleFields = getPreRuleFields(preRuleConfigList, fixDataMap, fixFieldMap); - List ruleConfigList = ruleConfigDao.getRuleConfigById(protocolId); - Optional ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig ->preRuleFields.equals( ruleConfig.getParseRuleJson())).findFirst(); - //递归选定解析规则,进行规则解析 - while (!ObjectUtil.isEmpty(ruleConfigOptional) && !ruleConfigOptional.get().getIsBizField().equals("1")) { - String ruleFields = getRuleFields(ruleConfigOptional.get().getDataFieldIds().split(","), fixDataMap, fixFieldMap); - ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig -> ruleConfig.getParseRuleJson().equals(ruleFields)).findFirst(); - } - return ruleConfigOptional.get(); - } - - /** - * 获取前置规则解析字段 - */ - private String getPreRuleFields(List preRuleConfigList, Map fixDataMap, Map fixFieldMap) { - Map ruleFieldMap= new HashMap<>(); - preRuleConfigList.stream() - .forEach( - preRuleConfig -> { - String fieldName = fixFieldMap.get(Long.valueOf(preRuleConfig.getRuleFieldId())); - if (fixDataMap.containsKey(fieldName)) { - ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); - } - } - ); - return JSONObject.toJSONString(ruleFieldMap); - } - - private Map getAllFieldMap(String protocolId) { - List fieldList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Map fixFieldMap = fieldList.stream().collect( - Collectors.toMap(FieldConfig::getId, FieldConfig::getFieldName) - ); - return fixFieldMap; - } - - private String getRuleFields(String[] preRuleConfigList, Map fixDataMap, Map fixFieldMap) { - Map ruleFieldMap= new HashMap<>(); - for (String preRuleConfigId : preRuleConfigList) { - String fieldName = fixFieldMap.get(preRuleConfigId); - if (fixDataMap.containsKey(fieldName)) { - ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); - } - } - return JSONObject.toJSONString(ruleFieldMap); - } - - //弃置 - private String ListToString(List ruleFieldList) { - String ruleFields = ""; - for (String ruleField : ruleFieldList) { - ruleFields += ruleField + ","; - } - ruleFields = StringUtils.isEmpty(ruleFields) ? ruleFields : ruleFields.substring(0, ruleFields.length() - 1); - return ruleFields; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java index 6177e10..bfa87a5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java @@ -2,7 +2,7 @@ public interface SafeStrategy { - String decryption(byte[] bytes); + String decryption(String cipher); String encryption(String lightText); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java index 618716c..6236302 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java @@ -9,9 +9,9 @@ //十六进制的字符串转换成字节数组 byte[] bytes = hexStrToBinaryStr(msg); //计算CRC8 - byte crc8 = CRC8(bytes, 0, bytes.length); - String crc8ToStr = "" + Integer.toHexString(0xff & crc8); - return crc8ToStr; +// String crc8ToStr = "" + Integer.toHexString(0xff & crc8); +// return crc8ToStr; + return null; } /** @@ -33,50 +33,5 @@ return bytes; } - /** - * CRC8 校验 多项式 x8+x2+x+1 - * - * @param b - * @param off - * @param len - * @return - */ - public static byte CRC8(final byte[] b, final int off, final int len) { - byte result = 0x00; - for (int i = 0; i < len; i++) { - result = CHECKSUM_TABLE[(result ^ (b[i + off] & 0xFF)) & 0xFF]; - } - return (byte) (result & 0xFFL); - } - - private final static byte[] CHECKSUM_TABLE = {(byte) 0x00, (byte) 0x07, (byte) 0x0e, (byte) 0x09, (byte) 0x1c, (byte) 0x1b, - (byte) 0x12, (byte) 0x15, (byte) 0x38, (byte) 0x3f, (byte) 0x36, (byte) 0x31, (byte) 0x24, (byte) 0x23, (byte) 0x2a, - (byte) 0x2d, (byte) 0x70, (byte) 0x77, (byte) 0x7e, (byte) 0x79, (byte) 0x6c, (byte) 0x6b, (byte) 0x62, (byte) 0x65, - (byte) 0x48, (byte) 0x4f, (byte) 0x46, (byte) 0x41, (byte) 0x54, (byte) 0x53, (byte) 0x5a, (byte) 0x5d, (byte) 0xe0, - (byte) 0xe7, (byte) 0xee, (byte) 0xe9, (byte) 0xfc, (byte) 0xfb, (byte) 0xf2, (byte) 0xf5, (byte) 0xd8, (byte) 0xdf, - (byte) 0xd6, (byte) 0xd1, (byte) 0xc4, (byte) 0xc3, (byte) 0xca, (byte) 0xcd, (byte) 0x90, (byte) 0x97, (byte) 0x9e, - (byte) 0x99, (byte) 0x8c, (byte) 0x8b, (byte) 0x82, (byte) 0x85, (byte) 0xa8, (byte) 0xaf, (byte) 0xa6, (byte) 0xa1, - (byte) 0xb4, (byte) 0xb3, (byte) 0xba, (byte) 0xbd, (byte) 0xc7, (byte) 0xc0, (byte) 0xc9, (byte) 0xce, (byte) 0xdb, - (byte) 0xdc, (byte) 0xd5, (byte) 0xd2, (byte) 0xff, (byte) 0xf8, (byte) 0xf1, (byte) 0xf6, (byte) 0xe3, (byte) 0xe4, - (byte) 0xed, (byte) 0xea, (byte) 0xb7, (byte) 0xb0, (byte) 0xb9, (byte) 0xbe, (byte) 0xab, (byte) 0xac, (byte) 0xa5, - (byte) 0xa2, (byte) 0x8f, (byte) 0x88, (byte) 0x81, (byte) 0x86, (byte) 0x93, (byte) 0x94, (byte) 0x9d, (byte) 0x9a, - (byte) 0x27, (byte) 0x20, (byte) 0x29, (byte) 0x2e, (byte) 0x3b, (byte) 0x3c, (byte) 0x35, (byte) 0x32, (byte) 0x1f, - (byte) 0x18, (byte) 0x11, (byte) 0x16, (byte) 0x03, (byte) 0x04, (byte) 0x0d, (byte) 0x0a, (byte) 0x57, (byte) 0x50, - (byte) 0x59, (byte) 0x5e, (byte) 0x4b, (byte) 0x4c, (byte) 0x45, (byte) 0x42, (byte) 0x6f, (byte) 0x68, (byte) 0x61, - (byte) 0x66, (byte) 0x73, (byte) 0x74, (byte) 0x7d, (byte) 0x7a, (byte) 0x89, (byte) 0x8e, (byte) 0x87, (byte) 0x80, - (byte) 0x95, (byte) 0x92, (byte) 0x9b, (byte) 0x9c, (byte) 0xb1, (byte) 0xb6, (byte) 0xbf, (byte) 0xb8, (byte) 0xad, - (byte) 0xaa, (byte) 0xa3, (byte) 0xa4, (byte) 0xf9, (byte) 0xfe, (byte) 0xf7, (byte) 0xf0, (byte) 0xe5, (byte) 0xe2, - (byte) 0xeb, (byte) 0xec, (byte) 0xc1, (byte) 0xc6, (byte) 0xcf, (byte) 0xc8, (byte) 0xdd, (byte) 0xda, (byte) 0xd3, - (byte) 0xd4, (byte) 0x69, (byte) 0x6e, (byte) 0x67, (byte) 0x60, (byte) 0x75, (byte) 0x72, (byte) 0x7b, (byte) 0x7c, - (byte) 0x51, (byte) 0x56, (byte) 0x5f, (byte) 0x58, (byte) 0x4d, (byte) 0x4a, (byte) 0x43, (byte) 0x44, (byte) 0x19, - (byte) 0x1e, (byte) 0x17, (byte) 0x10, (byte) 0x05, (byte) 0x02, (byte) 0x0b, (byte) 0x0c, (byte) 0x21, (byte) 0x26, - (byte) 0x2f, (byte) 0x28, (byte) 0x3d, (byte) 0x3a, (byte) 0x33, (byte) 0x34, (byte) 0x4e, (byte) 0x49, (byte) 0x40, - (byte) 0x47, (byte) 0x52, (byte) 0x55, (byte) 0x5c, (byte) 0x5b, (byte) 0x76, (byte) 0x71, (byte) 0x78, (byte) 0x7f, - (byte) 0x6a, (byte) 0x6d, (byte) 0x64, (byte) 0x63, (byte) 0x3e, (byte) 0x39, (byte) 0x30, (byte) 0x37, (byte) 0x22, - (byte) 0x25, (byte) 0x2c, (byte) 0x2b, (byte) 0x06, (byte) 0x01, (byte) 0x08, (byte) 0x0f, (byte) 0x1a, (byte) 0x1d, - (byte) 0x14, (byte) 0x13, (byte) 0xae, (byte) 0xa9, (byte) 0xa0, (byte) 0xa7, (byte) 0xb2, (byte) 0xb5, (byte) 0xbc, - (byte) 0xbb, (byte) 0x96, (byte) 0x91, (byte) 0x98, (byte) 0x9f, (byte) 0x8a, (byte) 0x8d, (byte) 0x84, (byte) 0x83, - (byte) 0xde, (byte) 0xd9, (byte) 0xd0, (byte) 0xd7, (byte) 0xc2, (byte) 0xc5, (byte) 0xcc, (byte) 0xcb, (byte) 0xe6, - (byte) 0xe1, (byte) 0xe8, (byte) 0xef, (byte) 0xfa, (byte) 0xfd, (byte) 0xf4, (byte) 0xf3}; } \ No newline at end of file diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java index 27c2838..6e078a3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java @@ -1,9 +1,6 @@ package com.casic.missiles.parser.safe.impl; -import cn.hutool.core.util.CharsetUtil; -import cn.hutool.crypto.symmetric.SM4; -import cn.hutool.crypto.symmetric.SymmetricCrypto; - +import com.casic.missiles.parser.safe.SafeStrategy; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; @@ -11,19 +8,44 @@ import org.bouncycastle.crypto.engines.SM4Engine; import org.bouncycastle.crypto.params.KeyParameter; import org.bouncycastle.util.encoders.Hex; - -import static cn.hutool.crypto.Mode.ECB; -import static cn.hutool.crypto.Padding.NoPadding; +import org.springframework.stereotype.Component; /** * SM4算法工具类 */ @Slf4j -public class Sm4 { +@Component("sm4") +public class Sm4 implements SafeStrategy { //加解密的字节快大小 public static final int BlockSize = 16; + @Override + public String decryption(String cipher) { + byte[] keyByte = { + 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 + }; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(keyByte); + byte[] in = Hex.decode(cipher); + byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); + String plain = EcbDecrypt(in, keyBytes); + return plain; + } + + @Override + public String encryption(String cipher) { + byte[] keyByte = { + 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 + }; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(keyByte); + byte[] in = Hex.decode(cipher); + byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); + String plain = EcbDecrypt(in, keyBytes); + return plain; + } + /** * SM4ECB加密算法,对内 * @@ -32,8 +54,6 @@ * @return */ private static byte[] ecb_encrypt(byte[] in, byte[] keyBytes) { - - SM4Engine sm4Engine = new SM4Engine(); sm4Engine.init(true, new KeyParameter(keyBytes)); byte[] out = new byte[in.length]; @@ -58,27 +78,6 @@ return cipher; } - - /** - * hutool 解密SM4 - * - * @param encodeContent - * @return - */ - public static String decode(String encodeContent) { - String key = "24ad182507479a5da3ad94d9d78ea203"; - try { - SymmetricCrypto sm4 = new SM4(ECB, NoPadding, key.getBytes()); - String decryptStr = sm4.decryptStr(encodeContent, CharsetUtil.CHARSET_UTF_8); - return decryptStr; - } catch (Exception e) { - e.printStackTrace(); - log.error("SM4解密失败"); - } - return null; - } - - /** * SM4的ECB加密算法 * @@ -129,20 +128,6 @@ return plain; } - /** - * SM4的ECB解密算法 - * - * @param cipher 输入的密文字符串 - * @param key 密钥 - * @return - */ - public static String EcbDecrypt(String cipher, String key) { - byte[] in = Hex.decode(cipher); - byte[] keyBytes = Hex.decode(key); - - String plain = EcbDecrypt(in, keyBytes); - return plain; - } /** * 主函数 @@ -151,28 +136,24 @@ */ public static void main(String[] args) { byte[] ciphertext = { + 0x4B, (byte) 0x8C, (byte) 0x9D, 0x08, (byte) 0xE4, (byte) 0xD3, 0x64, 0x42, (byte) 0xB9, (byte) 0xA5, (byte) 0xFE, (byte) 0xCD, (byte) 0x91, 0x1B, 0x38, (byte) 0xAC, (byte) 0xE9, 0x1C, (byte) 0xCD, 0x53, 0x02, (byte) 0xD7, 0x0C, (byte) 0x9B, (byte) 0x96, 0x30, 0x62, (byte) 0xE8, (byte) 0xFB, (byte) 0xEF, (byte) 0xB9, (byte) 0xFF, (byte) 0xDE, 0x19, (byte) 0x80, 0x35, 0x3E, (byte) 0x90, 0x4F, 0x2F, 0x12, 0x2B, 0x19, (byte) 0x8B, 0x6C, 0x7A, (byte) 0x85, (byte) 0xA1, (byte) 0xB1, (byte) 0x86, (byte) 0xA3, 0x7A, 0x46, 0x0C, 0x2F, (byte) 0x94, 0x4F, 0x7F, 0x2C, 0x56, 0x14, (byte) 0xF3, (byte) 0x89, (byte) 0xC3, - 0x3F, 0x20, (byte) 0xF9, (byte) 0x87, (byte) 0xA1, 0x60, (byte) 0xD9, (byte) 0xA8, (byte) 0xFD, (byte) 0xD7, (byte) 0x9B, 0x4B, 0x26, 0x06, 0x30, 0x44}; + 0x3F, 0x20, (byte) 0xF9, (byte) 0x87, (byte) 0xA1, 0x60, (byte) 0xD9, (byte) 0xA8, (byte) 0xFD, (byte) 0xD7, (byte) 0x9B, 0x4B, 0x26, 0x06, 0x30, 0x44 + }; ByteBuf in = ByteBufAllocator.DEFAULT.heapBuffer(); in.writeBytes(ciphertext); - byte[] keyByte = { 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 }; ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); - key.writeBytes(ciphertext); - String resCipherData = decode(ByteBufUtil.hexDump(in)); - ByteBuf out = ByteBufAllocator.DEFAULT.heapBuffer(); -// out.writeBytes(resCipherData); -// System.out.println(hexBytes); - System.out.println(resCipherData.toString()); -// String resPlainData = EcbDecrypt(resCipherData, key); -// System.out.println("原始明文:" + data); -// System.out.println("解密后明文:" + resPlainData); + key.writeBytes(keyByte); +// String resCipherData = EcbDecrypt(ByteBufUtil.hexDump(in), ByteBufUtil.hexDump(key)); +// System.out.println(resCipherData); } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java index 1395a51..ac5f957 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java @@ -1,7 +1,7 @@ package com.casic.missiles.parser.safe.impl; import io.netty.buffer.ByteBufUtil; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** *

@@ -14,9 +14,8 @@ * @author hyl * @version v1.0: Tea.java, v 0.1 2021/3/12 13:48 $ */ -@Service("tea") -///tea算法类 - +//tea算法类 +@Component("tea") public class Tea { public static byte[] MyTea_Encrypt(byte[] MyTeaContent, int ByteLen, byte[] MyTeakey) { @@ -99,7 +98,6 @@ // for(int i32Index = 0; i32Index < 8; i32Index++) { // System.out.print("0x" + Integer.toHexString(MyContent[i32Index]) + " "); // } - // System.out.println("密钥为:"); // for(int i32Index = 0; i32Index < 16; i32Index++) { // System.out.print("0x" + Integer.toHexString(MyKeys[i32Index]) + " "); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java index bdd0721..bd1516a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java @@ -3,7 +3,7 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.parser.sender.DataSubscribeProvider; import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponents; import org.springframework.web.util.UriComponentsBuilder; @@ -12,7 +12,7 @@ import java.util.Collections; import java.util.Map; -@Service("functionCallback") +@Component("functionCallback") public class FunctionCallback implements DataSubscribeProvider { @Resource diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java index 0b44fb9..7526de2 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.Map; -@Service("middleware") +@Component("middleware") public class MiddlewareSubscribe implements DataSubscribeProvider { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java index 5dcee3f..e2f1192 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.Map; -@Service("nosql") +@Component("nosql") public class NoSqlSubscribe implements DataSubscribeProvider { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java b/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java new file mode 100644 index 0000000..81a5324 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java @@ -0,0 +1,86 @@ +package com.casic.missiles.pojo; + +import lombok.Data; + +/** + * 协议 + */ +@Data +public class Msg { + + /** + * 前导码 + */ + private String preamble; + + /** + * 版本号 + */ + private String version; + + /** + * 内容长度 + */ + private int leng; + + /** + * 设备ID + */ + private String deviceId; + + /** + * 通讯方式 + */ + private Integer connType; + + /** + * 加密方式 + */ + private Integer encryType; + + /** + * 目标地址 + */ + private String destAddr; + + /** + * PDUType + */ + private String PDUType; + + /** + * 操作类型 + */ + private Integer operateType; + + /** + * 传输控制位 PDUType.bit7=0时,表示存在后续的访问;当PDUType.bit7=1时,表示无后续的访问。 + */ + private Integer transControlFlag; + + /** + * 设备类型 + */ + private Integer deviceType; + + /** + * 序号 + */ + private Integer seq; + + /** + * tagList + */ + private String tagList; + + /** + * OidList + */ + private String OidList; + + /** + * CRC + */ + private String CRC; + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java index 40a5265..97cc984 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java @@ -40,7 +40,7 @@ String httpContent = msg.toString(Charset.defaultCharset()); log.info(" String : " + msg.toString(Charset.defaultCharset())); String majorContent = httpContent.substring(httpContent.indexOf("{"), httpContent.lastIndexOf("}") + 1); - String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("serviceData")).get("Value")); + String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("RegistryData")).get("Value")); log.info("----------------------------------" + values); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); bufferContent.writeBytes(values.getBytes(Charset.forName("ISO-8859-1"))); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java index 1b132a7..e3ced4b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java @@ -35,7 +35,7 @@ String httpContent = msg.toString(Charset.defaultCharset()); log.info(" String : " + msg.toString(Charset.defaultCharset())); String majorContent = httpContent.substring(httpContent.indexOf("{"), httpContent.lastIndexOf("}") + 1); - String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("serviceData")).get("Value")); + String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("RegistryData")).get("Value")); log.info("----------------------------------" + values); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); bufferContent.writeBytes(values.getBytes(Charset.forName("ISO-8859-1"))); diff --git a/sensorhub-core/src/main/resources/application.properties b/sensorhub-core/src/main/resources/application.properties deleted file mode 100644 index 8b13789..0000000 --- a/sensorhub-core/src/main/resources/application.properties +++ /dev/null @@ -1 +0,0 @@ - diff --git a/sensorhub-core/src/main/resources/config/application-dev.yml b/sensorhub-core/src/main/resources/config/application-dev.yml index 4f897a8..dcc4c2d 100644 --- a/sensorhub-core/src/main/resources/config/application-dev.yml +++ b/sensorhub-core/src/main/resources/config/application-dev.yml @@ -4,9 +4,9 @@ spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true + url: jdbc:mysql://127.0.0.1:3306/sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true username: root - password: Casic203 + password: root session: store-type: redis redis: diff --git a/sensorhub-core/src/main/resources/config/application.yml b/sensorhub-core/src/main/resources/config/application.yml index ae89f9d..7965da1 100644 --- a/sensorhub-core/src/main/resources/config/application.yml +++ b/sensorhub-core/src/main/resources/config/application.yml @@ -30,6 +30,13 @@ port: 6379 password: ew5T4K3#203lwh config-prefix: 'Casic:' +#代码生成器配置 +code: + generate: + #作者 + author: cz + #待生成对象表名 + table-name: bussiness_field_config,combined_field_config sensorhub: config: port: 7091 diff --git a/sensorhub-support/pom.xml b/sensorhub-support/pom.xml index 9a71296..761601c 100644 --- a/sensorhub-support/pom.xml +++ b/sensorhub-support/pom.xml @@ -42,6 +42,12 @@ ${redis.version} + + com.baomidou + mybatis-plus-generator + ${mybatis-plus-generator.version} + + org.reflections diff --git a/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java b/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java new file mode 100644 index 0000000..515ca53 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java @@ -0,0 +1,14 @@ +package com.casic.missiles.enums; + +/** + * @author + * @date + */ +public interface FixedPropertyEnum { + + String FIXED_POSITION = "fixedPosition"; + + String TOTAL_LENGTH = "totalLength"; + + String TAIL_POSITION = "tailPosition"; +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/CombinedFieldMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CombinedFieldMapper.java new file mode 100644 index 0000000..38e8f42 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CombinedFieldMapper.java @@ -0,0 +1,15 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.CombinedFieldConfig; +import org.apache.ibatis.annotations.Mapper; + +/** + * @author cz + * + */ +@Mapper +public interface CombinedFieldMapper extends BaseMapper { + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java new file mode 100644 index 0000000..128b09d --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java @@ -0,0 +1,10 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.CommandEventConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface CommandEventMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java new file mode 100644 index 0000000..042eb3c --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.DatagramEventConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface DatagramEventConfigMapper extends BaseMapper { +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java new file mode 100644 index 0000000..fc95cf4 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java @@ -0,0 +1,8 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.FieldConfig; + +public interface FieldConfigMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldRuleConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldRuleConfigMapper.java new file mode 100644 index 0000000..b310a08 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldRuleConfigMapper.java @@ -0,0 +1,10 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.FieldRuleConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface FieldRuleConfigMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java new file mode 100644 index 0000000..9060a69 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.ProtocolConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface ProtocolConfigMapper extends BaseMapper { +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolFieldConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolFieldConfigMapper.java new file mode 100644 index 0000000..1b47180 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolFieldConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +public interface ProtocolFieldConfigMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java new file mode 100644 index 0000000..6fa6936 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.RuleConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface RuleConfigMapper extends BaseMapper { +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/AbstractFieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/AbstractFieldConfig.java new file mode 100644 index 0000000..ba9aea2 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/AbstractFieldConfig.java @@ -0,0 +1,38 @@ +package com.casic.missiles.pojo; + +import lombok.Data; + +@Data +public class AbstractFieldConfig { + /** + * 字段名称 + */ + private String fieldName; + /** + * 按照字段评估进行字段解析 + */ + private String ruleJson; + /** + * 起始位置(单位byte) + */ + private Integer OriginPositionByte; + /** + * 起始位置,是否需要bit位置(单位bit)小于8, 没有不需要填写 + */ + private String OriginPositionBit; + /** + * 偏移长度 + */ + private Integer offsetLength; + /** + * 偏移单位(bit/byte) + */ + private String offsetUnit; + /** + * 是否需要转存 + */ + private Integer isStorage; + + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/CombinedFieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/CombinedFieldConfig.java new file mode 100644 index 0000000..4f4de6a --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/CombinedFieldConfig.java @@ -0,0 +1,41 @@ +package com.casic.missiles.pojo; + +import lombok.Data; + +import java.util.Date; + +/** + * 组合配置 + * + * @author cz + * @date 20 + */ +@Data +public class CombinedFieldConfig { + + private Long id; + private Long ruleId; + /** + * 前缀编码 + */ + private String prefixCode; + + /** + * 字段动态的id + */ + private Long dynamicLengthId; + /** + * 对应的要解析字段的ids + */ + private String dataFieldIds; + + /** + * 字段动态的id + */ + private String combinedFieldIds; + + private Date lastTime; + + private Date createTime; + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldConfig.java index a07d20d..8304dc6 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldConfig.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldConfig.java @@ -5,31 +5,28 @@ import java.util.Date; +/** + * @author cz + * 1、该表与实际解析的内容实例解析有关 + * 2、该表字段是随机出现的,和帧结构无关,无法预料的 + * 3、该表字段解析根据FieldEvaluatorConfig进行字段解析 + */ @Data -@TableName("field_config") -public class FieldConfig { +@TableName("business_field_config") +public class FieldConfig extends AbstractFieldConfig { private Long id; -// private String preFieldConfig; - private Long protocolId; - - private String isFixed; - private String uploadDeliveryChange; - - private String replyRule; - private String ruleJson; - + /** + * 协议配置id + */ + private Long ruleId; + /** + * 字段名称 + */ private String fieldName; - private String isStorage; - private Integer orignPosition; - private String exactOrignPosition; - - private Integer offsetLength; - private String offsetUnit; private String ownerId; private Date createTime; private Date lastTime; - } diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldRuleConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldRuleConfig.java new file mode 100644 index 0000000..2e09879 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldRuleConfig.java @@ -0,0 +1,20 @@ +package com.casic.missiles.pojo; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +@TableName("field_rule_config") +@Data +public class FieldRuleConfig { + + private Long id; + private String name; + private String desc; + private String condition; + private String excuteOperation; + private Date lasTime; + private Date createTime; + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/Msg.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/Msg.java deleted file mode 100644 index 81a5324..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/Msg.java +++ /dev/null @@ -1,86 +0,0 @@ -package com.casic.missiles.pojo; - -import lombok.Data; - -/** - * 协议 - */ -@Data -public class Msg { - - /** - * 前导码 - */ - private String preamble; - - /** - * 版本号 - */ - private String version; - - /** - * 内容长度 - */ - private int leng; - - /** - * 设备ID - */ - private String deviceId; - - /** - * 通讯方式 - */ - private Integer connType; - - /** - * 加密方式 - */ - private Integer encryType; - - /** - * 目标地址 - */ - private String destAddr; - - /** - * PDUType - */ - private String PDUType; - - /** - * 操作类型 - */ - private Integer operateType; - - /** - * 传输控制位 PDUType.bit7=0时,表示存在后续的访问;当PDUType.bit7=1时,表示无后续的访问。 - */ - private Integer transControlFlag; - - /** - * 设备类型 - */ - private Integer deviceType; - - /** - * 序号 - */ - private Integer seq; - - /** - * tagList - */ - private String tagList; - - /** - * OidList - */ - private String OidList; - - /** - * CRC - */ - private String CRC; - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/PreRuleConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/PreRuleConfig.java deleted file mode 100644 index bfcf914..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/PreRuleConfig.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.casic.missiles.pojo; - -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -import java.util.Date; - -@Data -@TableName("pre_rule_config") -public class PreRuleConfig { - - private Long id; - private String protocolId; - private String ruleFieldId; - private String ownerId; - private Date createTime; - private Date lastTime; -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolConfig.java index 274ad42..bdac11f 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolConfig.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolConfig.java @@ -5,18 +5,52 @@ import java.util.Date; +/** + * 协议配置表,协议配置与帧结构有关 + * 1、层级关系,协议之后是规则,规则对应设备类型的各种上数规则 + * 2、规则对应协议配置的实例流程 + * 3、每种可根据设备类型和操作类型进行上数规则进行区分 + */ @Data @TableName("protocol_config") public class ProtocolConfig { private Long id; + /** + * 前导码 + */ private String preFix; - private String unpackId; - private String totalLengthId; - private String totalLengthFilterField; + /** + * 拆包id + */ + private Long unpackId; + /** + * 总长度id + */ + private Long totalLengthId; + /** + * + */ + private String totalLengthFilterFields; + /** + * 动态长度ids + */ private String dynamicLengthId; + /** + * 动态长度json(预留字段) + */ private String dynamicLengthJson; - private String tailStr; + /** + * 规则字段所解析预准备的字段 + */ + private String rulePrepareFields; + /** + * 结尾标志 + */ + private Long tailStr; + /** + * 备注 + */ private String remark; private String ownerId; private Date createTime; diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolFieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolFieldConfig.java new file mode 100644 index 0000000..db794bd --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolFieldConfig.java @@ -0,0 +1,43 @@ +package com.casic.missiles.pojo; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +/** + * 协议字段配置表 + * 该表用户存放帧结构固定格式的字段 + * 有以下两个用途 + * (1)、固定格式的字段可用于规则匹配 + * (2)、固定格式的字段可用于报文回复 + * @author cz + * @date 2023-06-09 + */ +@Data +@TableName("protocol_field_config") +public class ProtocolFieldConfig extends AbstractFieldConfig{ + + private Long id; + /** + * 协议配置id + */ + private Long protocolId; + /** + * 上传下发是否有变化, 没有变化,可以直接组装 + */ + private String isReplyFix; + /** + * 按照字段评估进行字段解析 + */ + private Long fieldEvaluatorId; + /** + * 回复规则 + */ + private String replyRule; + + private String ownerId; + private Date createTime; + private Date lastTime; + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java index 3b53493..febf835 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java @@ -6,18 +6,40 @@ import java.util.Date; /** - * 加密字段解析和规则有关,事件调到该流程下面 + * @author cz + * todo: 匹配协议对应业务实例 + * 1、一个协议可以多种的流程规则 + * 2、规则可以支持递归规则流程 */ @Data @TableName("rule_config") public class RuleConfig { - private Long id; private String protocolId; - private String isBizField; - private String parseRuleJson; + /** + * 是否完成规则配置,没有完成, + * 则需要根据规则继续匹配 + */ + private String isFinishMatch; + /** + * 待匹配解析规则 + * {“data_field”:"data_value"} + */ + private String matchRuleJson; + /** + * 待解析字段ids + */ private String dataFieldIds; - private String aviatorFilterJson; + + /** + * 待解析组合字段ids + */ + private String combinedFieldIds; + + /** + * aviator + */ + private String conditionExpression; private Date createTime; private Date lastTime; } diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleDict.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleDict.java deleted file mode 100644 index cc7f389..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleDict.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.casic.missiles.pojo; - -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -@Data -@TableName("rule_dict") -public class RuleDict { - - private Long id; - private Long pid; - private String name; - private String code; - private String ownerId; - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleEvaluator.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleEvaluator.java deleted file mode 100644 index ed16610..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleEvaluator.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.pojo; - -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -import java.util.Date; - -@TableName("rule_evaluator") -@Data -public class RuleEvaluator { - - private Long id; - private String name; - private String desc; - private String condition; - private String excuteOperation; - private Date lasTime; - private Date createTime; - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/CombinedFieldConfigRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/CombinedFieldConfigRegistry.java new file mode 100644 index 0000000..fa59b90 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/CombinedFieldConfigRegistry.java @@ -0,0 +1,12 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.CombinedFieldConfig; + +import java.util.List; + +public interface CombinedFieldConfigRegistry { + + List getCombinedFieldConfigList(Long ruleId); + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/CommandEventRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/CommandEventRegistry.java new file mode 100644 index 0000000..fb97d87 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/CommandEventRegistry.java @@ -0,0 +1,8 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.CommandEventConfig; + +public interface CommandEventRegistry { + + CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName); +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/DatagramEventRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/DatagramEventRegistry.java new file mode 100644 index 0000000..fb34641 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/DatagramEventRegistry.java @@ -0,0 +1,11 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.DatagramEventConfig; + +import java.util.List; + +public interface DatagramEventRegistry{ + + List getDatagramEventList(Long ruleId); + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/FieldConfigRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/FieldConfigRegistry.java new file mode 100644 index 0000000..759642e --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/FieldConfigRegistry.java @@ -0,0 +1,20 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.FieldConfig; + +import java.util.List; + +public interface FieldConfigRegistry { + + + List getFieldConfigList(Long ruleId); + + FieldConfig getFieldConfigById(String fieldId); + + List getFieldConfigs(String protocolId, Integer isFixed); + + List getStorageFieldConfig(String protocolId); + + +} + diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/FieldRuleConfigRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/FieldRuleConfigRegistry.java new file mode 100644 index 0000000..33da70c --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/FieldRuleConfigRegistry.java @@ -0,0 +1,11 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.FieldRuleConfig; + +import java.util.List; + +public interface FieldRuleConfigRegistry { + + List getFieldRuleConfigList(Long ruleId); + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/ProtocolConfigRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/ProtocolConfigRegistry.java new file mode 100644 index 0000000..1725189 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/ProtocolConfigRegistry.java @@ -0,0 +1,12 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.ProtocolConfig; + +import java.util.List; + +public interface ProtocolConfigRegistry { + + List getProtocolConfigList(String firstChar); + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/ProtocolFieldConfigRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/ProtocolFieldConfigRegistry.java new file mode 100644 index 0000000..19d1b9a --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/ProtocolFieldConfigRegistry.java @@ -0,0 +1,14 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.ProtocolFieldConfig; + +import java.util.List; + +public interface ProtocolFieldConfigRegistry { + + + List getProtocolFieldConfigList(Long protocolId); + + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/RuleConfigRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/RuleConfigRegistry.java new file mode 100644 index 0000000..3d2a75c --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/RuleConfigRegistry.java @@ -0,0 +1,14 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.RuleConfig; + +import java.util.List; + +public interface RuleConfigRegistry { + + RuleConfig getNextRuleConfig(String ruleFields); + + + List getRuleConfigById(Long protocolId); + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CombinedFieldConfigRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CombinedFieldConfigRegistryImpl.java new file mode 100644 index 0000000..822cac6 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CombinedFieldConfigRegistryImpl.java @@ -0,0 +1,24 @@ +package com.casic.missiles.registry.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.CombinedFieldMapper; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.registry.CombinedFieldConfigRegistry; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class CombinedFieldConfigRegistryImpl extends ServiceImpl implements CombinedFieldConfigRegistry { + + @Override + public List getCombinedFieldConfigList(Long ruleId) { + QueryWrapper queryWrapper = new QueryWrapper() + .eq("rule_id", ruleId); + List combinedFieldConfigs = this.baseMapper.selectList(queryWrapper); + return combinedFieldConfigs; + } + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CommandEventRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CommandEventRegistryImpl.java new file mode 100644 index 0000000..f0d3559 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CommandEventRegistryImpl.java @@ -0,0 +1,25 @@ +package com.casic.missiles.registry.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.CommandEventMapper; +import com.casic.missiles.pojo.CommandEventConfig; +import com.casic.missiles.registry.CommandEventRegistry; + +import java.util.List; +import java.util.Optional; + +public class CommandEventRegistryImpl extends ServiceImpl implements CommandEventRegistry { + + @Override + public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { + QueryWrapper queryWrapper = new QueryWrapper() + .eq("protocol_id", protocolId) + .eq("scene", sceneName) + .eq("enabled", 1); + List commandEventConfig = this.baseMapper.selectList(queryWrapper); + Optional optionalEventConfig = commandEventConfig.stream().findFirst(); + return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; + } + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/DatagramEventRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/DatagramEventRegistryImpl.java new file mode 100644 index 0000000..2e58698 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/DatagramEventRegistryImpl.java @@ -0,0 +1,26 @@ +package com.casic.missiles.registry.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.DatagramEventConfigMapper; +import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.registry.DatagramEventRegistry; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class DatagramEventRegistryImpl extends ServiceImpl implements DatagramEventRegistry { + + + @Override + public List getDatagramEventList(Long ruleId) { + QueryWrapper queryWrapper = new QueryWrapper() + .eq("rule_id", ruleId); + List fieldConfigList = this.baseMapper.selectList(queryWrapper); + return fieldConfigList; + } + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/FieldConfigRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/FieldConfigRegistryImpl.java new file mode 100644 index 0000000..6ae4422 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/FieldConfigRegistryImpl.java @@ -0,0 +1,50 @@ +package com.casic.missiles.registry.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.FieldConfigMapper; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.registry.FieldConfigRegistry; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * @author cz + */ +@Service +public class FieldConfigRegistryImpl extends ServiceImpl implements FieldConfigRegistry { + + @Override + public List getFieldConfigList(Long ruleId) { + QueryWrapper queryWrapper = new QueryWrapper() + .eq("rule_id", ruleId); + List fieldConfigList = this.baseMapper.selectList(queryWrapper); + return fieldConfigList; + } + + @Override + public FieldConfig getFieldConfigById(String fieldId) { + FieldConfig fieldConfig = this.baseMapper.selectById(fieldId); + return fieldConfig; + } + + @Override + public List getFieldConfigs(String protocolId, Integer isFixed) { + QueryWrapper queryWrapper = new QueryWrapper() + .eq("protocol_id", protocolId) + .eq("is_fixed", isFixed); + List fieldConfigList = this.baseMapper.selectList(queryWrapper); + return fieldConfigList; + } + + @Override + public List getStorageFieldConfig(String protocolId) { + QueryWrapper queryWrapper = new QueryWrapper() + .eq("protocol_id", protocolId) + .eq("is_fixed", 1) + .eq("is_storage", 1); + List fieldConfigList = this.baseMapper.selectList(queryWrapper); + return fieldConfigList; + } +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/FieldRuleConfigRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/FieldRuleConfigRegistryImpl.java new file mode 100644 index 0000000..406fe65 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/FieldRuleConfigRegistryImpl.java @@ -0,0 +1,23 @@ +package com.casic.missiles.registry.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.FieldRuleConfigMapper; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.registry.FieldRuleConfigRegistry; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class FieldRuleConfigRegistryImpl extends ServiceImpl implements FieldRuleConfigRegistry { + + @Override + public List getFieldRuleConfigList(Long ruleId) { + QueryWrapper queryWrapper = new QueryWrapper() + .eq("rule_id", ruleId); + List fieldRuleConfigList = this.baseMapper.selectList(queryWrapper); + return fieldRuleConfigList; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java index 608af3a..32cc8a4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java @@ -2,48 +2,47 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.delivery.decorator.ByteDecorator; +import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @AllArgsConstructor public class FieldDecoratorManger { - private final RuleDictDao ruleDictDao; + private final RuleConfigRegistry ruleDictDao; // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 // (1)静态的业务字段是字典里面可以配置的 // (2)动态的业务字段是通过规则生成的 public String contentMerge(String ruleJson, String sceneConent, String dynamicContent) { - List ruleDictList = ruleDictDao.getRuleDictConfig(); - Map ruleDictMap = ruleDictList.stream().collect( - Collectors.toMap(RuleDict::getId, e -> e)); - List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); - for (Map ruleMap : ruleMapList) { - String ruleType = String.valueOf(ruleMap.get("ruleType")); - ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); - NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); - byteDecorator.nodeDecoratorRule(nodeDecoratorParm); - } +// List ruleDictList = ruleDictDao.getRuleDictConfig(); +// Map ruleDictMap = ruleDictList.stream().collect( +// Collectors.toMap(RuleDict::getId, e -> e)); +// List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); +// for (Map ruleMap : ruleMapList) { +// String ruleType = String.valueOf(ruleMap.get("ruleType")); +// ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); +// NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); +// byteDecorator.nodeDecoratorRule(nodeDecoratorParm); +// } return null; } - - private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { - NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() - .contents(sceneConent) - .dynamicContent(dynamicContent) - .ruletypeId(ruletypeId) - .ruleDictMap(ruleDictMap) - .build(); - return nodeDecoratorParm; - } +// +// private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { +// NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() +// .contents(sceneConent) +// .dynamicContent(dynamicContent) +// .ruletypeId(ruletypeId) +// .ruleDictMap(ruleDictMap) +// .build(); +// return nodeDecoratorParm; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java index 652970c..b204ac3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java @@ -1,56 +1,56 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@AllArgsConstructor -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", - JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Component; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Component("logicalDecorator") +//@AllArgsConstructor +//@Slf4j +//public class LogicalShiftDecorator implements ByteDecorator { +// +//// private final FieldRuleEngineMapper fieldRuleEngineMapper; +//// +//// //字节位移 +//// @Override +//// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +//// String logicalValue = ""; +//// RuleEvaluator fieldRuleEngine = new RuleEvaluator(); +//// try { +//// Map env2 = new HashMap(); +//// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +//// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +//// for (String contentId : contentIdList) { +//// RuleDict ruleDict = ruleDictMap.get(contentId); +//// if (ruleDict.getCode().contains("#")) { +//// //使用动态的值 +//// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +//// } +//// env2.put(ruleDict.getName(), ruleDict.getCode()); +//// } +//// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +//// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +//// return null; +//// } +//// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +//// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +//// return values; +//// } catch (Exception ex) { +//// log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", +//// JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +//// return null; +//// } +//// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java index 346468f..822fead 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@AllArgsConstructor -@Slf4j -public class OperationDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("optionDecorator") +//@AllArgsConstructor +//@Slf4j +//public class OperationDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //混合运算,有常量或者乘除的缩放 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java index 50fb0a7..7a8bccb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@AllArgsConstructor -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +////精度计算 +//@AllArgsConstructor +//@Registry("precisionDecorator") +//@Slf4j +//public class PrecisionDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java index da39235..27f9cc7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java @@ -1,54 +1,53 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@AllArgsConstructor -@Slf4j -public class RuleDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("ruleDecorator") +//@AllArgsConstructor +//@Slf4j +//public class RuleDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //吃我一套正则表达式 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (Exception ex) { +// log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java index 7f5cbf3..c043f97 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java @@ -2,6 +2,6 @@ import java.util.Map; -public interface ComandeEventService { +public interface ComandeEventService{ Map loadComandeEventConfig(String protocolId,String scene); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java index 476ad84..aaf1837 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java @@ -2,46 +2,46 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.dao.CommandEventDao; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @Slf4j @AllArgsConstructor -public class ComandeEventServiceImpl implements ComandeEventService { +public class ComandeEventServiceImpl implements ComandeEventRegistry { - private final CommandEventDao commandEventDao; + // private final CommandEventDao commandEventDao; // 加密bean 固定字段出现变化的字段解析,业务字段的有序内容 @Override - public Map loadComandeEventConfig(String protocolId,String sceneName) { - CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); - if (ObjectUtil.isEmpty(commandEventConfig)) { - log.error("协议{},没有配置成功接收回复配置,清排查原因"); - return null; - } - String replyJson = commandEventConfig.getReplyContentJson(); - List> replyMapList = JSONArray.parseObject(replyJson, List.class); - List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); - Map fixMap = fixList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); - List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) - .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) - .collect(Collectors.toList()); - Map commandConfigMap = new HashMap<>(); - commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); - commandConfigMap.put("fixContent", fixMap); - commandConfigMap.put("bizContent", contentList); - return commandConfigMap; + public Map loadComandeEventConfig(String protocolId, String sceneName) { +// CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); +// if (ObjectUtil.isEmpty(commandEventConfig)) { +// log.error("协议{},没有配置成功接收回复配置,清排查原因"); +// return null; +// } +// String replyJson = commandEventConfig.getReplyContentJson(); +// List> replyMapList = JSONArray.parseObject(replyJson, List.class); +// List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); +// Map fixMap = fixList.stream() +// .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); +// List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) +// .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) +// .collect(Collectors.toList()); +// Map commandConfigMap = new HashMap<>(); +// commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); +// commandConfigMap.put("fixContent", fixMap); +// commandConfigMap.put("bizContent", contentList); +// return commandConfigMap; + return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 128b09d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java deleted file mode 100644 index 4016b0b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface DatagramEventMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java deleted file mode 100644 index 597c306..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.apache.ibatis.annotations.Mapper; - -public interface FieldConfigMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java deleted file mode 100644 index a31680a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.PreRuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface PreRuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java deleted file mode 100644 index 9060a69..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface ProtocolConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java deleted file mode 100644 index 6fa6936..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java deleted file mode 100644 index 582a705..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleDict; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleDictMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java deleted file mode 100644 index 6e302c8..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.CommandEventMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Optional; - -@Component -public class CommandEventDao { - - @Resource - private CommandEventMapper commandEventMapper; - - public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId) - .eq("scene", sceneName) - .eq("enabled", 1); - List commandEventConfig = commandEventMapper.selectList(queryWrapper); - Optional optionalEventConfig = commandEventConfig.stream().findFirst(); - return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java deleted file mode 100644 index 9137e4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.FieldConfigMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class FieldConfigDao { - - @Resource - private FieldConfigMapper fieldConfigMapper; - - public FieldConfig getFieldConfigById(String fieldId) { - FieldConfig fieldConfig = fieldConfigMapper.selectById(fieldId); - return fieldConfig; - } - - public List getFieldConfigs(String protocolId,Integer isFixed) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",isFixed); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - - public List getStorageFieldConfig(String protocolId) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",1) - .eq("is_storage",1); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java deleted file mode 100644 index 67bff6b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.mapper.PreRuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class PreRuleConfigDao { - - @Resource - private PreRuleConfigMapper preRuleConfigMapper; - - public List getPreRuleList(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return preRuleConfigMapper.selectList(queryWrapper); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java deleted file mode 100644 index d69ea85..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.RuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleConfigDao { - - @Resource - private RuleConfigMapper ruleConfigMapper; - - public RuleConfig getNextRuleConfig(String ruleFields) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("parse_rule_json", ruleFields); - return ruleConfigMapper.selectOne(queryWrapper); - } - - - public List getRuleConfigById(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return ruleConfigMapper.selectList(queryWrapper); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java deleted file mode 100644 index 932c185..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.RuleDictMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleDictDao { - - @Resource - private RuleDictMapper ruleDictMapper; - - public List getRuleDictConfig() { - List ruleDictList = ruleDictMapper.selectList(null); - return ruleDictList; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java index 9f9e279..43bc4d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java @@ -10,20 +10,15 @@ import io.netty.channel.socket.nio.NioServerSocketChannel; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import javax.annotation.PreDestroy; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static cn.hutool.core.util.ClassUtil.getClasses; /** * SensorhubServer netty服务端 */ @Slf4j -@Service +@Component public class SensorhubServer { /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java index 2c79ff5..9a28c36 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java @@ -11,13 +11,13 @@ import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioSocketChannel; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClient 客户端 */ @Slf4j -@Service +@Registry public final class SensorhubClient { public static void main(String[] args) throws Exception { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java index 9774be0..477c3f7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java @@ -6,12 +6,12 @@ import io.netty.channel.socket.SocketChannel; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientChannelInitialHandler */ -@Service +@Registry public class SensorhubClientChannelInitialHandler extends ChannelInitializer { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java index 346f4b3..73560e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java @@ -5,13 +5,13 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientHandler */ @Slf4j -@Service +@Registry public class SensorhubClientHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java index 5c1c6f2..d990af5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java @@ -4,12 +4,12 @@ import com.casic.missiles.pojo.Msg; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** * SensorhubServerHandler */ -@Service +@Component public class SensorhubServerHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 67283ae..af3172c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,41 +1,37 @@ package com.casic.missiles.parser; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultProtocolConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.*; +import com.casic.missiles.registry.FieldConfigRegistry; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; -import java.nio.charset.Charset; import java.util.HashMap; import java.util.List; import java.util.Map; -@Service("genericProtocolParser") +/** + * @author + */ +@Component("genericProtocolParser") @Slf4j -@AllArgsConstructor +@RequiredArgsConstructor public class GenericProtocolParser implements ProtocolParser { - private final LeadingCodeMatcher leadingCodeMatcher; private final List frameStructDispenserList; - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorInstanceSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; // 匹配首字母前导码=> 帧结构匹配前导码=> // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 @@ -44,18 +40,19 @@ public Boolean doParseProtocol(ByteBuf byteBuf) { String protocolContent = ByteBufUtil.hexDump(byteBuf); //匹配前导码 - List preCodeConfigs = leadingCodeMatcher.matchLeadingCode(protocolContent); + List preCodeConfigs = LeadingCodeMatcher.matchFrameLeadingCode(protocolContent); //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 if (preCodeConfigs.size() == 0) { - return rematch(byteBuf,protocolContent); + return rematch(byteBuf, protocolContent); } - //暂时先取第一个 + //暂时先取第一个,提升速度,使用享元模式, 减少类的创建销毁与构建 ProtocolConfig protocolConfig = preCodeConfigs.get(0); + AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); ByteBuf wholeDatagramByte = null; //通过匹配帧结构获取完整的数据包 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, preCodeConfigs.get(0))) != null) { + if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, protocolFactory)) != null) { break; } } @@ -68,76 +65,78 @@ * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 */ - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId, wholeDatagramByte); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap, protocolId); - //选取规则对应的流程实例 - DatagramEventConfig datagramEventConfig = processorInstanceSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); + //进行规则字段解析,进行匹配规则 + RuleConfig ruleConfig = getRuleConfig(protocolFactory, wholeDatagramByte); + if (ruleConfig == null) { + return false; + } //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, wholeDatagramByte); + ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte); + //以下进行业务的规则解析,同时选定流程实例 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); + DatagramEventProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain, + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText, protocolId); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain); //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); + datagramEventProvider.storeData(bizDataMap); return true; } - private Boolean rematch(ByteBuf byteBuf,String protocolContent) { + /** + * 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 + */ + private Boolean rematch(ByteBuf byteBuf, String protocolContent) { //重置位判断 byteBuf.resetReaderIndex(); //判断重置是否前移,如果没有前移,则直接判为匹配失败 if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { return false; } else { + //递归执行 return doParseProtocol(byteBuf); } } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; + //获取匹配规则->匹配规则 + private RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + //取出其中参与逻辑provider并判空 + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); + String rulePrepareFields = protocolConfig.getRulePrepareFields(); + //固定字段 + if (StringUtils.isNotEmpty(rulePrepareFields)) { + //获取统一固定字段解析 + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + //获取该协议的字段配置,用于协议规则匹配 + List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); + //获取规则 + RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, + rulePrepareFields, protocolFieldConfigs); + return ruleConfig; + } + return null; } - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + //数据构建,获取固定字段的store和业务字段store + private Map buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + Map bizDataMap = new HashMap<>(); + Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); + Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); + bizDataMap.putAll(ruleStoreObjectMap); + bizDataMap.putAll(protocolStoreObjectMap); return bizDataMap; } - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java index 8a46e32..16ce2e5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java @@ -3,6 +3,7 @@ import io.netty.buffer.ByteBuf; public interface ProtocolParser { + Boolean doParseProtocol(ByteBuf byteBuf); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java new file mode 100644 index 0000000..f7814af --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java @@ -0,0 +1,35 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.ProtocolConfigProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.ProtocolConfig; + +/** + * 存放基本协议的的加载信息 + */ +public class AbstractProtocolConfigFactory { + private final ProtocolConfigProvider protocolConfigProvider; + private final ProtocolFieldConfigProvider protocolFieldConfigProvider; + private final RuleConfigProvider ruleConfigProvider; + + public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { + this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); + this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); + this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); + } + + public ProtocolConfigProvider getProtocolConfigProvider() { + return protocolConfigProvider; + } + + public ProtocolFieldConfigProvider getProtocolFieldConfigProvider() { + return protocolFieldConfigProvider; + } + + public RuleConfigProvider getRuleConfigProvider() { + return ruleConfigProvider; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java new file mode 100644 index 0000000..6e36147 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java @@ -0,0 +1,57 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.CombinedFieldConfigProvider; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.FieldConfigProvider; +import com.casic.missiles.parser.provider.FieldRuleConfigProvider; + +/** + * 存放规则相关的的的加载信息 + */ +public class AbstractRuleConfigFactory { + + /** + * 处理字节 + */ + private final FieldConfigProvider fieldConfigProvider; + /** + * 处理组合字节解析的解码器 + */ + private final CombinedFieldConfigProvider combinedFieldConfigProvider; + /** + * 处理负责字节解析的规则配置 + */ + private final FieldRuleConfigProvider fieldRuleConfigProvider; + /** + * 处理实例流程 + */ + private final DatagramEventProvider datagramEventProvider; + + + public AbstractRuleConfigFactory(Long ruleId) { + this.fieldConfigProvider = new FieldConfigProvider(ruleId); + this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); + this.fieldRuleConfigProvider = new FieldRuleConfigProvider(ruleId); + this.datagramEventProvider = new DatagramEventProvider(ruleId); + } + + public FieldConfigProvider getFieldConfigProvider() { + return fieldConfigProvider; + } + + public CombinedFieldConfigProvider getCombinedFieldConfigProvider() { + return combinedFieldConfigProvider; + } + + public FieldRuleConfigProvider getFieldRuleConfigProvider() { + return fieldRuleConfigProvider; + } + + public DatagramEventProvider getDatagramEventProvider() { + return datagramEventProvider; + } + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java deleted file mode 100644 index 6e1719a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.factory; - - -import com.casic.missiles.pojo.ProtocolConfig; - -import java.util.List; - -/** - * 数据库访问优化(暂时未做) - *

- * 1、初始化协议解析配置,并存放到处存放缓存,对协议基本配置进行管理 - * 2、其中流程中所有的配置都经过此类进行管理,进行调用获取,增强解析速度 - */ -public interface DatagramFactory { - - /** - * 初始化 - */ - List datagramInit(); - - /** - * 根据前导码配置匹配,模糊匹配获取所有的报文项 - */ - List match(); - - /** - * 根据前导码匹配,返回报文项 - */ - List filer(); - - /** - * 保证数据的唯一性选择器 - */ - List selectOne(); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java new file mode 100644 index 0000000..87444a0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java @@ -0,0 +1,18 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +import java.util.List; + +/** + * 直接用,还是边用边创建 + */ +public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { + + + public DefaultProtocolConfigFactory(ProtocolConfig protocolConfig) { + super(protocolConfig); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java new file mode 100644 index 0000000..cce0c7c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java @@ -0,0 +1,12 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; + +public class DefaultRuleFactory extends AbstractRuleConfigFactory { + + public DefaultRuleFactory(Long ruleId) { + super(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java deleted file mode 100644 index 9ee97e0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.casic.missiles.parser.instance; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service -@Slf4j -@AllArgsConstructor -public class GeneralProcessor { - - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; - - /** - * 统一固定字段解析=>进行规则的查询的判断 - * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 - * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 - */ - @Deprecated - public boolean parseWholeDatagram(ByteBuf buffer, ProtocolConfig protocolConfig) { - try { - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap,protocolId); - //选取规则对应的流程= - DatagramEventConfig datagramEventConfig = processorSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); - //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); - //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); - //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); - //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); - //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); - return true; - } catch (Exception ex) { - log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", - ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); - return false; - } - } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; - } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); - } - - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); - return bizDataMap; - } - - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java index 25e7ad8..6a5777e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java @@ -1,23 +1,31 @@ package com.casic.missiles.parser.instance.impl; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.mapper.DatagramEventMapper; import com.casic.missiles.pojo.DatagramEventConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.SpringContextUtil; -@Service -@AllArgsConstructor +import java.util.List; +import java.util.Optional; + +/** + * @author cz + * + */ public class DefaultProcessorInstanceSelector implements ProcessorInstanceSelector { - private final DatagramEventMapper datagramEventMapper; + private static List datagramEventConfigs; + + static { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + datagramEventConfigs = datagramEventRegistry.getDatagramEventList(); + } @Override public DatagramEventConfig getProcessorInstance(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("rule_id", protocolId); - return datagramEventMapper.selectOne(queryWrapper); + Optional optionalSelectInstance = datagramEventConfigs.stream() + .filter(e -> e.getId().equals(protocolId)).limit(1).findFirst(); + return optionalSelectInstance.isPresent() ? optionalSelectInstance.get() : null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a778671..7b56a43 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,16 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import io.netty.buffer.ByteBuf; /** - * 分析匹配情况 - * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 - * 2、匹配不成功,有后续帧,可以进行下次匹配。 - * 3、匹配不成功,无后续帧,可以进行丢弃。 + * 分析匹配情况 + * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 + * 2、匹配不成功,有后续帧,可以进行下次匹配。 + * 3、匹配不成功,无后续帧,可以进行丢弃。 */ -public interface FrameStructMatcher{ +public interface FrameStructMatcher { - ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig); + ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 05320ab..8ebea78 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,23 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.ProtocolConfigMapper; +import com.casic.missiles.parser.provider.ProtocolConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Component; import java.util.List; import java.util.stream.Collectors; -@Component -@AllArgsConstructor public class LeadingCodeMatcher { - private final ProtocolConfigMapper protocolMapper; - //** 1、首字母匹配前导码, // 2、以匹配出的前导码是否在报文中条件进行前导码的匹配二次筛选 - public List matchLeadingCode(String protocolContent){ + public static List matchFrameLeadingCode(String protocolContent){ List initialConfigs = initialMatch(protocolContent); List preCodeConfigs = initialConfigs.stream() .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) @@ -26,13 +19,16 @@ } //初始化匹配前导码内容 - private List initialMatch(String protocolContent) { - String protocolStr = protocolContent.charAt(0) + ""; - QueryWrapper queryWrapper = new QueryWrapper() - .likeRight("pre_fix", protocolStr); - List protocolConfigList = protocolMapper.selectList(queryWrapper); - return protocolConfigList; + private static List initialMatch(String protocolContent) { + String firstFrameChar = protocolContent.charAt(0) + ""; + ProtocolConfigProvider protocolConfigProvider=new ProtocolConfigProvider(firstFrameChar); + return protocolConfigProvider.getMatchList(); } + + + + + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index cf2113d..e915877 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -1,32 +1,35 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(0) -@Service +@Component public class FrameLengthMatcher implements FrameStructMatcher { - @Autowired - private FieldParser fieldParser; - //超过长度 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { String dataGramContent = ByteBufUtil.hexDump(byteBuf); - if (StringUtils.isEmpty(protocolConfig.getUnpackId()) && StringUtils.isEmpty(protocolConfig.getTailStr())) { - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + //当不存在结尾标志和拆包标志,可以直接使用长度进行匹配 + if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { if (dataGramContent.length() >= totalLength) {//等于长度返回true,超出长度,切断 - ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, protocolConfig, totalLength); + ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, totalLength); return wholeDatagramByte; } else { //读的标志位前移舍弃 @@ -38,7 +41,7 @@ return null; } - private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, Integer totalLength) { byteBuf.readBytes(totalLength); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, totalLength - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 2bfc213..d527ad0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; @@ -13,7 +13,7 @@ import lombok.AllArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.nio.charset.Charset; import java.util.Map; @@ -22,32 +22,30 @@ * 后续标志验证 */ @Order(1) -@Service +@Component @AllArgsConstructor -public class FrameMarkMatcher implements FrameStructMatcher { - - private final FieldConfigDao fieldConfigDao; - private final FieldParser fieldParser; - private final FieldResolver fieldResolverManger; +public class FrameMarkMatcher implements FrameStructMatcher, FixedPropertyEnum { //帧后续标志=>结束,进行帧的重组=>有后续,1、帧移位判别 2、继续接收帧 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig UnpackConfig = StringUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getUnpackId()); - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); - Integer upback = 0; + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); ByteBuf mergeWholeFrameByte = null; - if (!ObjectUtil.isEmpty(UnpackConfig)) { - while (hasNextFullFrame(byteBuf, protocolConfig)) { - upback = (Integer) fieldResolverManger.filedParserManger(byteBuf, UnpackConfig, null); + if (!ObjectUtil.isEmpty(unpackFlag)) { + while (hasNextFullFrame(byteBuf, protocolConfig, protocolFieldConfigProvider)) { //是否存在后续位 - if (upback == 1) {//使用esayRule + if (unpackFlag == 1) {//使用esayRule //表示可以截取 - mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolConfig, totalLength); + mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolFieldConfigProvider, protocolConfig); return mergeWholeFrameByte; } else { - byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig)); + byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig, protocolFieldConfigProvider)); } } } @@ -56,7 +54,8 @@ //选取第一个帧,将业务内容和后面部分分开 //计算数据报文-业务内容 - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolFieldConfigProvider protocolFieldConfigProvider, ProtocolConfig protocolConfig) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); //截取完整报文 byteBuf.readBytes(totalLength); ByteBuf byteBufContent = byteBuf.slice(0, byteBuf.readerIndex()); @@ -68,15 +67,15 @@ String tail = ""; System.out.println(ByteBufUtil.hexDump(byteBufContent)); //会存在多个帧拼接在一起的的情况,进行合并处理 - while (hasNextFullFrame(byteBufContent, protocolConfig)) { - Integer currentFrameLength = fieldParser.getTotalLength(protocolConfig, byteBufContent); + while (hasNextFullFrame(byteBufContent, protocolConfig, protocolFieldConfigProvider)) { + Integer currentFrameLength = protocolFieldConfigProvider.getTotalLength(byteBufContent, protocolConfig); byteBufContent.readBytes(currentFrameLength); ByteBuf currentbyteBuf = byteBufContent.slice(0, byteBufContent.readerIndex()); byteBufContent.markReaderIndex();//读的标志位前移 System.out.println(ByteBufUtil.hexDump(byteBufContent)); String hexDump = currentbyteBuf.toString(Charset.forName("ISO-8859-1")); //获取当前固定帧结构的关系map - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, currentbyteBuf); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(currentbyteBuf, protocolConfig); if (StringUtils.isEmpty(mergeFrameStr)) { //首次获取业务数据报文 mergeFrameStr += hexDump.substring(0, currentFrameFixedProperty.get("tailPosition")); @@ -95,22 +94,22 @@ /** * 获取平移到下一帧起始位置 */ - public int getNextFrameOffset(ByteBuf buffer, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, buffer); - return currentFrameFixedProperty.get("totalLength"); + public int getNextFrameOffset(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + return currentFrameFixedProperty.get(TOTAL_LENGTH); } /** * 判断是否出错进行整个帧的 */ - public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, byteBuf); + public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); //保证读取位置不在固定位置,是可变的业务内容 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("fixedPosition")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(FIXED_POSITION)) { return false; } //判断读取是否操作帧长度 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("totalLength")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(TOTAL_LENGTH)) { return false; } return true; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 76a3784..c3a1bab 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -1,50 +1,50 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.parser.instance.GeneralProcessor; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; +import io.netty.buffer.ByteBufUtil;; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(2) -@Service +@Component public class FrameTailMatcher implements FrameStructMatcher { - @Resource - private FieldConfigDao fieldConfigDao; - @Autowired - private GeneralProcessor generalProcessor; - //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig tailFieldConfig = StringUtils.isEmpty(protocolConfig.getTailStr()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getTailStr()); - if (!ObjectUtil.isEmpty(tailFieldConfig)) { - String tailStr = tailFieldConfig.getFieldName(); + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfig protocolFieldConfig = ObjectUtils.isEmpty(protocolConfig.getTailStr()) ? null : + fieldConfigProvider.getFieldConfigById(protocolConfig.getTailStr()); + if (!ObjectUtil.isEmpty(protocolFieldConfig)) { + String tailStr = protocolFieldConfig.getFieldName(); String dataGramContent = ByteBufUtil.hexDump(byteBuf); Boolean tailFlag = ByteBufUtil.hexDump(byteBuf).contains(tailStr); if (!tailFlag) { //使用esayRule return null; } else if (dataGramContent.indexOf(tailStr) < dataGramContent.length() - tailStr.length()) { Integer length = dataGramContent.indexOf(tailStr) + tailStr.length(); - ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, protocolConfig, length); + ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, length); return wholeDatagramByte; //存在粘包 } } return null; } - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer length) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, Integer length) { byteBuf.readBytes(length); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, length - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java new file mode 100644 index 0000000..5f1c177 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java @@ -0,0 +1,73 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.combined.GenericCombinedFieldResolver; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.CombinedFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class CombinedFieldConfigProvider { + + + /** + * 作为临时配置列表缓存使用 + */ + private final List combinedFieldConfigList; + private Map storeObjectMap = new HashMap<>(); + + public CombinedFieldConfigProvider(Long ruleId) { + CombinedFieldConfigRegistry combinedFieldConfigRegistry = SpringContextUtil.getBean(CombinedFieldConfigRegistry.class); + combinedFieldConfigList = combinedFieldConfigRegistry.getCombinedFieldConfigList(ruleId); + } + + public void parseDataField(RuleConfig ruleConfig, String clearZeroPlain,Map fieldConfigsMap ) { + if (showSkip()) { + return; + } + //匹配对应的数据,然后进行相关的字段解析 + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver(); + combinedFieldResolver.parseDataField(combinedFieldConfigList, byteBuf, storeObjectMap,fieldConfigsMap); + } + + + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getCombinedFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return combinedFieldConfigList.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public List getCombinedFieldConfigList() { + return combinedFieldConfigList; + } + + /* 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(combinedFieldConfigList) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java new file mode 100644 index 0000000..f3cfedc --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java @@ -0,0 +1,11 @@ +package com.casic.missiles.parser.provider; + +/** + * @author cz + * @date 2023-6-12 + */ +public class CommandEventProvider{ + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java new file mode 100644 index 0000000..70eec5e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java @@ -0,0 +1,77 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.safe.SafeStrategy; +import com.casic.missiles.parser.sender.DataSubscribeProvider; +import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class DatagramEventProvider { + + private final DatagramEventConfig processorInstance; + + public DatagramEventProvider(Long ruleId) { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + List datagramEventConfigList = + datagramEventRegistry.getDatagramEventList(ruleId); + processorInstance = this.getProcessorInstance(datagramEventConfigList); + } + + public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { + if (showSkip()) { + return null; + } + return datagramEventConfigList.get(0); + } + + // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 + public String getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap) { + String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? + processorInstance.getSafeBean() : + fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); + if (!StringUtils.isEmpty(safeName)) { + //需要加密 + SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); + String plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); + return clearComplementZero(plain); + } + return ByteBufUtil.hexDump(bizDataContent); + } + + //解密清零操作 + private String clearComplementZero(String plain) { + plain = plain.substring(0, plain.lastIndexOf("00")); + return plain; + } + + //数据发送,数据发送者暂未构建 + public void storeData(Map bizDataMap) { + DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); +// dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return ObjectUtils.isNotEmpty(processorInstance) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java new file mode 100644 index 0000000..7e1fe0a --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java @@ -0,0 +1,97 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.FieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class FieldConfigProvider { + + + private final List fieldConfigs; + private Map storeObjectMap = new HashMap<>(); +// private Map singleObjects = new ConcurrentHashMap<>(); + + public FieldConfigProvider(Long ruleId) { + FieldConfigRegistry fieldConfigRegistry = SpringContextUtil.getBean(FieldConfigRegistry.class); + fieldConfigs = fieldConfigRegistry.getFieldConfigList(ruleId); + } + + public List getFieldConfigs() { + return fieldConfigs; + } + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public Map parseDataField(RuleConfig ruleConfig, String clearZeroPlain) { + if (showSkip()) { + return null; + } + List prepareFieldConfig = prepareParseField(ruleConfig); + if (CollectionUtils.isNotEmpty(prepareFieldConfig)) { + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(fieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + return fixDataMap; + } + } + return null; + } + + /** + * 得到需要处理的业务内容 + * + * @return + */ + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return fieldConfigs.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public Map getFieldConfigsMap() { + return fieldConfigs.stream().collect( + Collectors.toMap(FieldConfig::getId, e -> e) + ); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(fieldConfigs) ? false : true; + } + + +} + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java new file mode 100644 index 0000000..817bfaf --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java @@ -0,0 +1,19 @@ +package com.casic.missiles.parser.provider; + +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.registry.FieldRuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; + +public class FieldRuleConfigProvider { + + private final List fieldRuleConfigList; + + public FieldRuleConfigProvider(Long ruleId) { + FieldRuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(FieldRuleConfigRegistry.class); + fieldRuleConfigList = ruleConfigRegistry.getFieldRuleConfigList(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java new file mode 100644 index 0000000..99a1b06 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java @@ -0,0 +1,53 @@ +package com.casic.missiles.parser.provider; + + +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.registry.ProtocolConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolConfigProvider { + + private final List protocolConfigList; + + public ProtocolConfigProvider(String firstChar) { + ProtocolConfigRegistry registry = SpringContextUtil.getBean(ProtocolConfigRegistry.class); + protocolConfigList = registry.getProtocolConfigList(firstChar); + } + + public List getMatchList() { + return protocolConfigList; + } + + /** + * 设置当前协议 + * + * @param protocolConfig + */ + public ProtocolConfigProvider(ProtocolConfig protocolConfig) { + List protocolConfigs = new ArrayList<>(); + protocolConfigs.add(protocolConfig); + protocolConfigList = protocolConfigs; + } + + /** + * 获取当前协议 + * + * @return + */ + public ProtocolConfig getCurrentProtocolConfig() { + if (this.protocolConfigList == null) { + return null; + } else { + return protocolConfigList.get(0); + } + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java new file mode 100644 index 0000000..043927d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java @@ -0,0 +1,213 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.registry.ProtocolFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolFieldConfigProvider { + + private static final String FIXED_FIELD_DS = "fixedFieldDs"; + private static final String CONTENT_FIELD_DS = "contentFieldDs"; + private static final String PROTOCOL_LENGTH = "protocolLength"; + private static final String PROTOCOL_FIELD_ID = "protocolFieldId"; + private static final String PROTOCOL_POSITION = "protocolPosition"; + + private final List protocolFieldConfigs; + private Map singleObjects = new ConcurrentHashMap<>(); + private Map storeObjectMap = new HashMap<>(); + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public ProtocolFieldConfigProvider(Long protocolId) { + ProtocolFieldConfigRegistry protocolFieldConfigRegistry = SpringContextUtil.getBean(ProtocolFieldConfigRegistry.class); + protocolFieldConfigs = protocolFieldConfigRegistry.getProtocolFieldConfigList(protocolId); + } + + public List getProtocolFieldConfigs() { + return protocolFieldConfigs; + } + + public ProtocolFieldConfig getFieldConfigById(Long fieldId) { + Optional optionalConfig = protocolFieldConfigs.stream().filter( + e -> e.getId().equals(fieldId) + ).findFirst(); + return optionalConfig.isPresent() ? optionalConfig.get() : null; + } + + public Integer getProtocolFieldValue(Long protocolFieldId, ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_FIELD_ID + protocolFieldId + ByteBufUtil.hexDump(byteBuf); + //获取缓存 + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + //加载固定长度数据集合 + Map fixDataMap = this.getProtocolDataMap(byteBuf); + ProtocolFieldConfig protocolFieldConfig = selectFieldConfig(protocolFieldId); + Integer protocolFieldValue = 0; + //获取约定字段的总长度 + if (fixDataMap.containsKey(protocolFieldConfig.getFieldName())) { + Object appointUnpackObject = fixDataMap.get(protocolFieldConfig.getFieldName()); + if (ObjectUtils.isNotEmpty(appointUnpackObject)) { + protocolFieldValue = (Integer) appointUnpackObject; + } + } + if (protocolFieldValue != null) { + //加入缓存 + if (ObjectUtils.isNotEmpty(protocolFieldValue)) { + this.singleObjects.put(catchKey, protocolFieldValue); + return protocolFieldValue; + } + } + return null; + } + + /** + * 获取帧固定位置信息 + * + * @param byteBuf + * @param protocolConfig + * @return + */ + public Map getFixedProperty(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_POSITION + protocolConfig.getId(); + if (this.singleObjects.containsKey(catchKey)) { + return (Map) singleObjects.get(catchKey); + } + Map fixedPropertyMap = new HashMap<>(); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + fixedPropertyMap = fieldParser.doGetFixedProperty(protocolFieldConfigs, this.getTotalLength(byteBuf,protocolConfig)); + if (CollectionUtils.isNotEmpty(fixedPropertyMap)) { + this.singleObjects.put(catchKey, fixedPropertyMap); + return fixedPropertyMap; + } + return fixedPropertyMap; + } + + /** + * 获取帧结构应有的总长度 + */ + public Integer getTotalLength(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_LENGTH + ByteBufUtil.hexDump(byteBuf); + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + Integer appointFrameLength = getProtocolFieldValue(protocolConfig.getTotalLengthId(), byteBuf); + if (appointFrameLength != null) { + //获取过滤的字段集合总长度 + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Integer totalFilterLength = fieldParser.getTotalFilterLength(protocolConfig, byteBuf, getFixFieldConfigMap()); + //计算总长度 + Integer totalLength = appointFrameLength + totalFilterLength; + //加入缓存 + if (ObjectUtils.isNotEmpty(totalLength)) { + this.singleObjects.put(catchKey, totalLength); + return totalLength; + } + } + return null; + } + + /** + * 获取协议有关字段解析内容 + * storeObjectMap存储代转存的数据 + * + * @return + */ + public Map getProtocolDataMap(ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(FIXED_FIELD_DS)) { + return (Map) singleObjects.get(FIXED_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(protocolFieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + this.singleObjects.put(FIXED_FIELD_DS, fixDataMap); + return fixDataMap; + } + return null; + } + + /** + * 获取业务报文内容的content字节 + * + * @param wholeDatagramByte + * @return + */ + public ByteBuf getDataContentBuf(ByteBuf wholeDatagramByte) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(CONTENT_FIELD_DS)) { + return (ByteBuf) singleObjects.get(CONTENT_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + ByteBuf bizDataByteBuf = fieldParser.getDataContentBuf(protocolFieldConfigs, wholeDatagramByte); + if (bizDataByteBuf != null) { + this.singleObjects.put(CONTENT_FIELD_DS, bizDataByteBuf); + return bizDataByteBuf; + } + return null; + } + + + private ProtocolFieldConfig selectFieldConfig(Long id) { + Optional optionalProtocolFieldConfig = this.protocolFieldConfigs.stream().filter( + e -> e.getId().equals(id) + ).findFirst(); + return optionalProtocolFieldConfig.isPresent() ? optionalProtocolFieldConfig.get() : null; + } + + + private Map getFixFieldConfigMap() { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, e -> e) + ); + return fixDataFieldMap; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(protocolFieldConfigs) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java new file mode 100644 index 0000000..dafba1c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java @@ -0,0 +1,56 @@ +package com.casic.missiles.parser.provider; + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.rule.GenericRuleResolver; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.RuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleConfigProvider { + + private final List ruleConfigs; + + public List getRuleConfigs() { + return ruleConfigs; + } + + public RuleConfigProvider(Long protocolId) { + RuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(RuleConfigRegistry.class); + ruleConfigs = ruleConfigRegistry.getRuleConfigById(protocolId); + } + + /** + * 获取规则匹配结果 + * + * @param parseFixedDataMap + * @param protocolFieldConfigs + * @return + */ + public RuleConfig doGetRule(Map parseFixedDataMap, + String ids, + List protocolFieldConfigs) { + if (showSkip()) { + return null; + } + RuleConfig ruleConfig = GenericRuleResolver.machRule(parseFixedDataMap, ids, protocolFieldConfigs, ruleConfigs); + return ruleConfig; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(ruleConfigs) ? false : true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java index 3c05891..856b399 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java @@ -1,18 +1,11 @@ package com.casic.missiles.parser.resolver; -import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.springframework.web.bind.annotation.RequestBody; -import javax.annotation.Resource; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -20,19 +13,17 @@ @Slf4j public class ByteMergeProvider { - @Resource - private FieldRuleEngineMapper fieldRuleEngineMapper; - //拿到所有的值合并到一个值 - public String resolveByteMerge(List valueList, String ruletypeId, String vaildRange) { + public static String resolveByteMerge(List valueList, String ruleTypeId, String vaildRange) { String values = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Map vaildMap = getValidRangeMap(vaildRange); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(ruletypeId); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } + //暂时不处理 +// fieldRuleEngine = fieldRuleConfigMapper.selectById(ruleTypeId); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } Map env2 = new HashMap(); for (int i = 0; i < valueList.size(); i++) { if (vaildMap.containsKey(i)) { @@ -47,7 +38,7 @@ } } - private Map getValidRangeMap(String vaildRange) { + private static Map getValidRangeMap(String vaildRange) { String[] range = vaildRange.split(","); Map vaildMap = new HashMap(); for (int i = 0; i < range.length; i++) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 8d821cd..85d6bbf 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -1,9 +1,12 @@ package com.casic.missiles.parser.resolver; +import com.casic.missiles.pojo.AbstractFieldConfig; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; import io.netty.buffer.ByteBuf; +import java.util.List; import java.util.Map; /** @@ -11,18 +14,14 @@ */ public interface FieldParser { -// Map fieldProcess(String protocolContent,); - Map dataParser(RuleConfig ruleConfig, String lightText,String protocolId); + Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength); - Map fixDataParser(String protocolId, ByteBuf buffer); + Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap); - Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf); + ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer); - ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer); - - ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer); - - Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer); + Integer getTotalFilterLength(ProtocolConfig protocolConfig, ByteBuf byteBuf, Map protocolFieldConfigMap); } + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java new file mode 100644 index 0000000..9e0c00e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java @@ -0,0 +1,52 @@ +package com.casic.missiles.parser.resolver; + +import com.casic.missiles.pojo.AbstractFieldConfig; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.util.List; + +public class FieldParserSupport { + + //分别计算bit和byte长度=> 合并长度 + protected Integer calculateLength(List fieldConfigList) { + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + Integer fixedLength = bytefixedLength + bitfixedLength / 8; + return fixedLength; + } + + //找到最大值=> 根据最大值计算业务数据下标 + protected Integer calculatePosition(List fieldConfigList) { + String rex = "[0-9]+"; + Integer max = -1; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) + && Integer.valueOf(fieldConfig.getOriginPositionByte()) > max) { + max = Integer.valueOf(fieldConfig.getOriginPositionByte()); + } + } + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) && fieldConfig.getOriginPositionByte().equals(max)) { + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + } + } + Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; + return maxFixedPosition; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java deleted file mode 100644 index dd3a6cd..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java +++ /dev/null @@ -1,170 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.ByteResolverParam; -import io.netty.buffer.ByteBuf; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -/** - * 字段解析管理总类 - */ -@Service -@Slf4j -@AllArgsConstructor -public class FieldResolver extends ByteMergeProvider { - - //1、字段截取 => 2、简单的字节解析和复杂的字节解析 - public Object filedParserManger(ByteBuf byteBuf, FieldConfig fieldConfig, Integer maxFixedPosition) { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - //最大固定位置不为空, - if (!ObjectUtil.isEmpty(maxFixedPosition)) { - orignPosition -= maxFixedPosition; - } - Object fieldValue = 0; - //待优化 - if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { - fieldValue = bitToResolver(byteBuf, fieldConfig); - } else { - ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); - fieldValue = parsingFields(fieldBytes, fieldConfig.getRuleJson()); - } - return fieldValue; - } - - //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, - //目前默认配置的规则设置暂不支持配置化,由实现完成 - private Object parsingFields(ByteBuf byteBuf, String ruleJson) { - Object fieldsResolveValue = null; - List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); - if (ObjectUtil.isEmpty(ruleMapList)) { - fieldsResolveValue = defaultResolveBuilder(byteBuf); - } else { - fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); - } - return fieldsResolveValue; - } - - private Object defaultResolveBuilder(ByteBuf byteBuf) { - Integer defaultResolveValue = 0; - for (int i = 0; i < byteBuf.writerIndex(); i++) { - defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; - } - return defaultResolveValue; - } - - //字段解析构建器(针对字节单位的) - //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 - // 字节归并结束或者规则结束=>继续根据规则进行判断 - private Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { - Object customizeResolveValue = null; - try { - List bytStrList = new ArrayList<>(); - //存放到数组里面 - for (int i = 0; i < byteBuf.writerIndex(); i++) { - bytStrList.add(byteBuf.readByte()); - } - int i = 0; - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - customizeResolveValue = this.resolveByteMerge(bytStrList, ruletypeId,vaildRange); - break; - } else { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - List tempBytStr = new ArrayList<>(); - for (int k = 0; i < bytStrList.size(); i++) { - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(k) - .value(bytStrList.get(k)) - .ruletypeId(ruletypeId).build(); - tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); - } - bytStrList = tempBytStr; - } - i++; - } - //字节归并到一起=>继续根据规则进行判断 - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(customizeResolveValue) - .ruletypeId(ruletypeId).build(); - customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(customizeResolveValue)); - return customizeResolveValue; - } catch (RuntimeException ex) { - log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); - return null; - } - } - - /** - * 1、单个字节情况表示字段 - * 2、多字节情况表示字段(暂未处理) - */ - private Object bitToResolver(ByteBuf byteBuf, FieldConfig fieldConfig) { - Object fieldValue = new Object(); - try { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - byte fields = 0x00; - if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); - } else { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); - } - - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { - if (!StringUtils.isEmpty(fieldConfig.getExactOrignPosition())) { - fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getExactOrignPosition())).byteValue() - >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); - } else { - fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); - } - } else { - fieldValue = Integer.valueOf(fields & 0xff); - } - if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { - return fieldValue; - } - List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); - int i = 0; - //字节归并到一起=>继续根据规则进行判断 - while (i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(fieldValue) - .ruletypeId(ruletypeId).build(); - fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(fieldValue)); - return fieldValue; - } catch (RuntimeException ex) { - log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); - return null; - } - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java new file mode 100644 index 0000000..1d2aeab --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java @@ -0,0 +1,36 @@ +package com.casic.missiles.parser.resolver.bytes; + +import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.mapper.FieldRuleConfigMapper; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.pojo.ByteResolverParam; +import com.googlecode.aviator.AviatorEvaluator; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; +//转换规则 +@Component("convert") +@AllArgsConstructor +@Slf4j +public class ByteRuleResolver implements ByteResolver { + + private final FieldRuleConfigMapper fieldRuleConfigMapper; + + @Override + public Object resolveOperationRule(ByteResolverParam byteResolverParam){ + FieldRuleConfig fieldRuleEngine=fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); + if(ObjectUtil.isEmpty(fieldRuleEngine)){ + return byteResolverParam.getValue(); + } + String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); + Map env2 = new HashMap(); + env2.put("value", (byte) byteResolverParam.getValue()); + String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); + return values; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java index 103821c..786b71c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java @@ -2,34 +2,34 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("logicalShift") +@Component("logicalShift") @AllArgsConstructor @Slf4j public class LogicalShiftResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //字节位移 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { Integer index = byteResolverParam.getIndex(); - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return byteResolverParam.getValue(); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java index 476747d..01149bd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("operation") +@Component("operation") @AllArgsConstructor @Slf4j public class OperationResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //混合运算,有常量或者乘除的缩放 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java index 0b82cf4..79abcce 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.casic.missiles.pojo.ByteResolverParam; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; //精度计算 -@Service("precision") +@Component("precision") @AllArgsConstructor @Slf4j public class PrecisionResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java deleted file mode 100644 index 5c3f332..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; -//转换规则 -@Service("convert") -@AllArgsConstructor -@Slf4j -public class RuleResolver implements ByteResolver { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam){ - RuleEvaluator fieldRuleEngine=fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); - if(ObjectUtil.isEmpty(fieldRuleEngine)){ - return byteResolverParam.getValue(); - } - String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); - Map env2 = new HashMap(); - env2.put("value", (byte) byteResolverParam.getValue()); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java new file mode 100644 index 0000000..d3bbd91 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java @@ -0,0 +1,15 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; + +import java.util.List; +import java.util.Map; +// 前导码匹配->长度字段 +public interface AbstractCombinedFieldProcessor { + + Map invoke(Map map, ByteBuf byteBuf, List combinedFieldConfigList, + Map fieldConfigsMap, Map storeObjectMap); + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java new file mode 100644 index 0000000..03c8480 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java @@ -0,0 +1,59 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-13 + */ +//依次递增进行数据的解析, +public class GenericCombinedFieldResolver { + + + //通过查询,字段长度长度随机 + public void parseDataField(List combinedFieldConfigList, ByteBuf byteBuf, + Map storeObjectMap, Map fieldConfigsMap) { + Integer frameLength = Integer.valueOf(ByteBufUtil.hexDump(byteBuf)); + //添加前置处理器 + com.casic.missiles.util.ClassUtil classUtil = new com.casic.missiles.util.ClassUtil(); + List abstractCombinedProcessors = classUtil.getSubClassList(AbstractCombinedFieldProcessor.class); + + Map fieldFixedMap = combinedFieldLeadCodeMap(combinedFieldConfigList); + //frameLength + Map combinedProcessorFields = null; + while (byteBuf.readableBytes() < frameLength) { + //一直处理 + for (AbstractCombinedFieldProcessor abstractCombinedProcessor : abstractCombinedProcessors) { + combinedProcessorFields = abstractCombinedProcessor.invoke(combinedProcessorFields, byteBuf, + combinedFieldConfigList, + fieldConfigsMap, storeObjectMap); + if (combinedProcessorFields == null || byteBuf.readableBytes() < frameLength) { + return; + } + } + + } + } + + /** + * 取出前导码匹配集合 + */ + private Map combinedFieldLeadCodeMap(List combinedFieldConfigList) { + Map fieldFixedMap = combinedFieldConfigList + .stream() + .collect(Collectors.toMap(CombinedFieldConfig::getPrefixCode, e -> e)); + return fieldFixedMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java new file mode 100644 index 0000000..643a934 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java @@ -0,0 +1,100 @@ +package com.casic.missiles.parser.resolver.fields; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.FieldParserSupport; +import com.casic.missiles.pojo.*; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 保存使用时最基本的信息,并且使用原型模式 + */ +@Slf4j +public class DefaultProtocolFieldParser extends FieldParserSupport implements FieldParser, FixedPropertyEnum { + + //通过传入的配置和报文进行字段解析 + @Override + public Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap) { + Map dataMap = new HashMap<>(); + for (AbstractFieldConfig protocolFieldConfig : protocolFieldConfigs) { + if (!ObjectUtils.isEmpty(protocolFieldConfig.getOriginPositionByte())) { + Object fieldValue = FieldResolver.parseField(buffer, protocolFieldConfig, null); + if (protocolFieldConfig.getIsStorage() == 1) { + storeObjectMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + dataMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + } + return dataMap; + } + + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength) { + Map fixedPropertyMap = new HashMap<>(); + Integer fixedLength = calculateLength(protocolFieldConfigs); + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + fixedPropertyMap.put(FIXED_POSITION, maxFixedPosition); + fixedPropertyMap.put(TOTAL_LENGTH, totalLength); + fixedPropertyMap.put(TAIL_POSITION, totalLength - fixedLength + maxFixedPosition); + return fixedPropertyMap; + } + + //** 获取业务内容的byteBuf + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer) { + //计算固定长度 + Integer fixedLength = calculateLength(protocolFieldConfigs); + //总长度获取 + String lightText = buffer.toString(Charset.forName("ISO-8859-1")); + Integer totalLength = lightText.length(); + //计算固定长度最大长度 + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + //计算数据报文内容 + ByteBuf bizDataFields = buffer.slice(maxFixedPosition - 1, (totalLength - fixedLength)); + return bizDataFields; + } + + /** + * 获取过滤字段的长度 + */ + @Override + public Integer getTotalFilterLength(ProtocolConfig protocolConfig, + ByteBuf byteBuf, + Map protocolFieldConfigMap) { + if (ByteBufUtil.hexDump(byteBuf).equals("")) { + return 0; + } + int totalFilterLength = 0; + String filterFields = protocolConfig.getTotalLengthFilterFields(); + try { + if (!StringUtils.isEmpty(filterFields)) { + String[] filterFieldList = filterFields.split(","); + for (String filterFieldId : filterFieldList) { + if (StringUtils.isNotEmpty(filterFieldId)) { + ProtocolFieldConfig fieldConfig = protocolFieldConfigMap.get(Long.valueOf(filterFieldId)); + //这里都是按字节计算,没有对位进行区分,可能会出现错误 + // 如果对位有需求,需要进一步跟进 + totalFilterLength += fieldConfig.getOffsetLength(); + } + } + } + return totalFilterLength; + } catch (Exception ex) { + log.error("报文确认分发阶段,获取报文总长度过滤长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); + } + return totalFilterLength; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java new file mode 100644 index 0000000..d51e887 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java @@ -0,0 +1,169 @@ +package com.casic.missiles.parser.resolver.fields; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.parser.resolver.ByteMergeProvider; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.AbstractFieldConfig; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.pojo.ByteResolverParam; +import io.netty.buffer.ByteBuf; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * 字段解析管理总类 + */ +@Slf4j +public class FieldResolver extends ByteMergeProvider { + + //1、字段截取 => 2、简单的字节解析和复杂的字节解析 + public static Object parseField(ByteBuf byteBuf,AbstractFieldConfig fieldConfig, Integer maxFixedPosition) { + Integer orignPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + //最大固定位置不为空, + if (!ObjectUtil.isEmpty(maxFixedPosition)) { + orignPosition -= maxFixedPosition; + } + Object fieldValue = 0; + //待优化 + if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { + fieldValue = doParseBitField(byteBuf, fieldConfig); + } else { + ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); + fieldValue = doParseByteField(fieldBytes, fieldConfig.getRuleJson()); + } + return fieldValue; + } + + //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, + //目前默认配置的规则设置暂不支持配置化,由实现完成 + private static Object doParseByteField(ByteBuf byteBuf, String ruleJson) { + Object fieldsResolveValue = null; + List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); + if (ObjectUtil.isEmpty(ruleMapList)) { + fieldsResolveValue = defaultResolveBuilder(byteBuf); + } else { + fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); + } + return fieldsResolveValue; + } + + private static Object defaultResolveBuilder(ByteBuf byteBuf) { + Integer defaultResolveValue = 0; + for (int i = 0; i < byteBuf.writerIndex(); i++) { + defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; + } + return defaultResolveValue; + } + + //字段解析构建器(针对字节单位的) + //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 + // 字节归并结束或者规则结束=>继续根据规则进行判断 + private static Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { + Object customizeResolveValue = null; + try { + List bytStrList = new ArrayList<>(); + //存放到数组里面 + for (int i = 0; i < byteBuf.writerIndex(); i++) { + bytStrList.add(byteBuf.readByte()); + } + int i = 0; + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { + if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + customizeResolveValue = resolveByteMerge(bytStrList, ruletypeId, vaildRange); + break; + } else { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + List tempBytStr = new ArrayList<>(); + for (int k = 0; i < bytStrList.size(); i++) { + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(k) + .value(bytStrList.get(k)) + .ruletypeId(ruletypeId).build(); + tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); + } + bytStrList = tempBytStr; + } + i++; + } + //字节归并到一起=>继续根据规则进行判断 + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(null) + .value(customizeResolveValue) + .ruletypeId(ruletypeId).build(); + customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); + i++; + } + System.out.println(JSON.toJSON(customizeResolveValue)); + return customizeResolveValue; + } catch (RuntimeException ex) { + log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); + return null; + } + } + + /** + * 1、单个字节情况表示字段 + * 2、多字节情况表示字段(暂未处理) + */ + private static Object doParseBitField(ByteBuf byteBuf,AbstractFieldConfig fieldConfig) { + Object fieldValue = new Object(); + try { + Integer orignPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + byte fields = 0x00; + if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { + fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); + } else { + fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); + } + + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { + if (!StringUtils.isEmpty(fieldConfig.getOriginPositionBit())) { + fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getOriginPositionBit())).byteValue() + >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); + } else { + fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); + } + } else { + fieldValue = Integer.valueOf(fields & 0xff); + } + if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { + return fieldValue; + } + List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); + int i = 0; + //字节归并到一起=>继续根据规则进行判断 + while (i < ruleMapList.size()) { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(null) + .value(fieldValue) + .ruletypeId(ruletypeId).build(); + fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); + i++; + } + System.out.println(JSON.toJSON(fieldValue)); + return fieldValue; + } catch (RuntimeException ex) { + log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); + return null; + } + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java deleted file mode 100644 index 35ae3d0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java +++ /dev/null @@ -1,183 +0,0 @@ -package com.casic.missiles.parser.resolver.fields; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufAllocator; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; -import org.springframework.util.ObjectUtils; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service("standard") -@AllArgsConstructor -@Slf4j -public class StandardFieldParser implements FieldParser { - - private final FieldConfigDao fieldConfigDao; - private final FieldResolver fieldResolver; - - //数据解析 - @Override - public Map dataParser(RuleConfig ruleConfig, String lightText, String protocolId) { - String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); - ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); - bufferContent.writeBytes(lightText.getBytes(Charset.forName("ISO-8859-1"))); - Map dataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - for (String dataFieldId : dataFieldIds) { - FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(dataFieldId); - if (!ObjectUtils.isEmpty(fieldConfig)) { - dataMap.put(fieldConfig.getFieldName(), String.valueOf(fieldResolver.filedParserManger(bufferContent, fieldConfig, maxFixedPosition))); - } - } - return dataMap; - } - - //数据解析 - @Override - public Map fixDataParser(String protocolId, ByteBuf buffer) { - List dataFieldIdList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Map dataMap = new HashMap<>(); - for (FieldConfig dataField : dataFieldIdList) { - if (!ObjectUtils.isEmpty(dataField.getOrignPosition())) { - Object fieldValue = (Integer) fieldResolver.filedParserManger(buffer, dataField, null); - dataMap.put(dataField.getFieldName(), fieldValue); - } - } - return dataMap; - } - - @Override - public Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf) { - if (ByteBufUtil.hexDump(byteBuf).equals("")) { - return 0; - } - String filterFields = protocolConfig.getTotalLengthFilterField(); - Integer totalLength = 0; - try { - FieldConfig totalFieldConfig = fieldConfigDao.getFieldConfigById(protocolConfig.getTotalLengthId()); - int totalFilterLength = 0; - if (!StringUtils.isEmpty(filterFields)) { - String[] filterFieldList = filterFields.split(","); - for (String filterField : filterFieldList) { - FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(filterField); - //这里都是按字节计算,没有对位进行区分,可能会出现错误 - - // 如果对位有需求,需要进一步跟进 - totalFilterLength += fieldConfig.getOffsetLength(); - } - } - totalLength = (Integer) fieldResolver.filedParserManger(byteBuf, totalFieldConfig, null) + totalFilterLength; - } catch (Exception ex) { - log.error("报文确认分发阶段,获取报文总长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); - } - return totalLength; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer) { - //业务内容 - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - String protocolId = String.valueOf(protocolConfig.getId()); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - //计算固定长度 - Integer fixedLength = calculateLength(fieldConfigList); -// Integer totalLength = this.getTotalLength(protocolConfig, buffer); - //总长度获取 - Integer totalLength = lightText.length(); - //计算固定长度最大长度 - Integer maxFixedPosition = calculatePosition(fieldConfigList); -// buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - //计算数据报文内容 - ByteBuf bizDataFields = buffer.slice(maxFixedPosition-1, (totalLength - fixedLength)); - return bizDataFields; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer) { - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - String protocolId = String.valueOf(protocolConfig.getId()); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer fixedLength = calculateLength(fieldConfigList); -// Integer totalLength = this.getTotalLength(protocolConfig, buffer); - Integer totalLength = lightText.length(); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - ByteBuf fixDataFields = buffer.slice(0, maxFixedPosition); - return fixDataFields; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer) { - String protocolId = String.valueOf(protocolConfig.getId()); - Map fixedPropertyMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer fixedLength = calculateLength(fieldConfigList); - Integer totalLength = this.getTotalLength(protocolConfig, buffer); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - fixedPropertyMap.put("fixedPosition", maxFixedPosition); - fixedPropertyMap.put("totalLength", totalLength); - fixedPropertyMap.put("tailPosition", totalLength - fixedLength + maxFixedPosition); - return fixedPropertyMap; - } - - //分别计算bit和byte长度=> 合并长度 - private Integer calculateLength(List fieldConfigList) { - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (FieldConfig fieldConfig : fieldConfigList) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - Integer fixedLength = bytefixedLength + bitfixedLength / 8; - return fixedLength; - } - - //找到最大值=> 根据最大值计算业务数据下标 - private Integer calculatePosition(List fieldConfigList) { - String rex = "[0-9]+"; - Integer max = -1; - for (FieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOrignPosition()) - && Integer.valueOf(fieldConfig.getOrignPosition()) > max) { - max = Integer.valueOf(fieldConfig.getOrignPosition()); - } - } - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (FieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOrignPosition()) && fieldConfig.getOrignPosition().equals(max)) { - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - } - } - Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; - return maxFixedPosition; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java new file mode 100644 index 0000000..d4ec6c7 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java @@ -0,0 +1,76 @@ +package com.casic.missiles.parser.rule; + +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import org.apache.commons.lang3.StringUtils; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class GenericRuleResolver { + + //根据前置字段的值,找到指定的规则 + //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 + //=>循环判断=>通过规则得到业务字段 + public static RuleConfig machRule(Map fixDataMap, + String ids, + List protocolFieldConfigs, + List ruleConfigs) { + List preRuleConfigList = getPreRuleList(ids, protocolFieldConfigs); + //获取前置规则字段 + final Map metaDataMap = getPreRuleFields(preRuleConfigList, fixDataMap); + //准备固定的字段集合 + Map fixDataFieldMap = getFixDataFieldMap(protocolFieldConfigs); + return RuleResolverCore.doMachRule(ruleConfigs, metaDataMap, fixDataMap, fixDataFieldMap); + } + + private static Map getFixDataFieldMap(List protocolFieldConfigs) { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, ProtocolFieldConfig::getFieldName) + ); + return fixDataFieldMap; + } + + + /** + * 查询前置规则的字段配置 + * + * @param ids + * @return + */ + private static List getPreRuleList(String ids, List protocolFieldConfigs) { + String[] idList = ids.split(","); + Map prepareMaps = new HashMap<>(); + for (String id : idList) { + if (StringUtils.isNotEmpty(id)) { + prepareMaps.put(Long.valueOf(id), ""); + } + } + List preRuleConfigList = protocolFieldConfigs + .stream() + .filter(e -> prepareMaps.containsKey(e.getId())) + .collect(Collectors.toList()); + return preRuleConfigList; + } + + /** + * 获取前置规则解析字段 + */ + private static Map getPreRuleFields(List preRuleFieldConfigList, Map fixDataMap) { + Map ruleFieldMap = new HashMap<>(); + preRuleFieldConfigList.stream() + .forEach( + preRuleFieldConfig -> { + String fieldName = preRuleFieldConfig.getFieldName(); + if (fixDataMap.containsKey(fieldName)) { + ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); + } + } + ); + return ruleFieldMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java new file mode 100644 index 0000000..baae7e8 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -0,0 +1,68 @@ +package com.casic.missiles.parser.rule; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.casic.missiles.pojo.RuleConfig; + +import java.util.*; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleResolverCore { + + + public static RuleConfig doMachRule(List ruleConfigList, Map metaDataMap, + Map fixDataMap, + Map fixDataFieldMap) { + Optional ruleConfigOptional = ruleConfigList.stream() + .filter(ruleConfig -> machRuleConfig( + JSON.parseObject(ruleConfig.getMatchRuleJson(), Map.class), metaDataMap)) + .findFirst(); + if (ObjectUtil.isEmpty(ruleConfigOptional)) { + return null; + } + String[] ruleFields = ruleConfigOptional.get().getDataFieldIds().split(","); + Map ruleMetaDataMap = getRuleFields(ruleFields, fixDataMap, fixDataFieldMap); + //递归选定解析规则,进行规则解析 + if (!ruleConfigOptional.get().getIsFinishMatch().equals("1")) { + //递归选定规则 + doMachRule(ruleConfigList, ruleMetaDataMap, fixDataMap, fixDataFieldMap); + } + return ruleConfigOptional.get(); + } + + + private static Map getRuleFields(String[] preRuleConfigList, Map fixedDataMap, + Map fixedFieldMap) { + Map ruleFieldMap = new HashMap<>(); + for (String preRuleConfigId : preRuleConfigList) { + String fieldName = fixedFieldMap.get(preRuleConfigId); + if (fixedDataMap.containsKey(fieldName)) { + ruleFieldMap.put(fieldName, String.valueOf(fixedDataMap.get(fieldName))); + } + } + return ruleFieldMap; + } + + + //匹配规则配置 + private static Boolean machRuleConfig(Map ruleMap, Map metaDataMap) { + if (ruleMap == null || metaDataMap == null) { + return null; + } + //所有的字段在规则里面必须有有配置 + for (String key : metaDataMap.keySet()) { + if (ruleMap.containsKey(key)) { + if (!ruleMap.get(key).equals(metaDataMap.get(key))) { + return false; + } + } else { + return false; + } + } + return true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java deleted file mode 100644 index 664088d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java +++ /dev/null @@ -1,92 +0,0 @@ -package com.casic.missiles.parser.rule; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.mapper.dao.PreRuleConfigDao; -import com.casic.missiles.mapper.dao.RuleConfigDao; -import lombok.AllArgsConstructor; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.*; -import java.util.stream.Collectors; - -@Service -@AllArgsConstructor -public class RulerProvider { - - private final FieldConfigDao fieldConfigDao; - private final PreRuleConfigDao preRuleConfigDao; - private final RuleConfigDao ruleConfigDao; - - //根据前置字段的值,找到指定的规则 - //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 - //=>循环判断=>通过规则得到业务字段 - public RuleConfig ruleConfig(Map fixDataMap, String protocolId) { - //批量获取规则 - List preRuleConfigList = preRuleConfigDao.getPreRuleList(protocolId); - //获取固定字段 - Map fixFieldMap = getAllFieldMap(protocolId); - //获取前置规则字段 - final String preRuleFields = getPreRuleFields(preRuleConfigList, fixDataMap, fixFieldMap); - List ruleConfigList = ruleConfigDao.getRuleConfigById(protocolId); - Optional ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig ->preRuleFields.equals( ruleConfig.getParseRuleJson())).findFirst(); - //递归选定解析规则,进行规则解析 - while (!ObjectUtil.isEmpty(ruleConfigOptional) && !ruleConfigOptional.get().getIsBizField().equals("1")) { - String ruleFields = getRuleFields(ruleConfigOptional.get().getDataFieldIds().split(","), fixDataMap, fixFieldMap); - ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig -> ruleConfig.getParseRuleJson().equals(ruleFields)).findFirst(); - } - return ruleConfigOptional.get(); - } - - /** - * 获取前置规则解析字段 - */ - private String getPreRuleFields(List preRuleConfigList, Map fixDataMap, Map fixFieldMap) { - Map ruleFieldMap= new HashMap<>(); - preRuleConfigList.stream() - .forEach( - preRuleConfig -> { - String fieldName = fixFieldMap.get(Long.valueOf(preRuleConfig.getRuleFieldId())); - if (fixDataMap.containsKey(fieldName)) { - ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); - } - } - ); - return JSONObject.toJSONString(ruleFieldMap); - } - - private Map getAllFieldMap(String protocolId) { - List fieldList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Map fixFieldMap = fieldList.stream().collect( - Collectors.toMap(FieldConfig::getId, FieldConfig::getFieldName) - ); - return fixFieldMap; - } - - private String getRuleFields(String[] preRuleConfigList, Map fixDataMap, Map fixFieldMap) { - Map ruleFieldMap= new HashMap<>(); - for (String preRuleConfigId : preRuleConfigList) { - String fieldName = fixFieldMap.get(preRuleConfigId); - if (fixDataMap.containsKey(fieldName)) { - ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); - } - } - return JSONObject.toJSONString(ruleFieldMap); - } - - //弃置 - private String ListToString(List ruleFieldList) { - String ruleFields = ""; - for (String ruleField : ruleFieldList) { - ruleFields += ruleField + ","; - } - ruleFields = StringUtils.isEmpty(ruleFields) ? ruleFields : ruleFields.substring(0, ruleFields.length() - 1); - return ruleFields; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java index 6177e10..bfa87a5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java @@ -2,7 +2,7 @@ public interface SafeStrategy { - String decryption(byte[] bytes); + String decryption(String cipher); String encryption(String lightText); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java index 618716c..6236302 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java @@ -9,9 +9,9 @@ //十六进制的字符串转换成字节数组 byte[] bytes = hexStrToBinaryStr(msg); //计算CRC8 - byte crc8 = CRC8(bytes, 0, bytes.length); - String crc8ToStr = "" + Integer.toHexString(0xff & crc8); - return crc8ToStr; +// String crc8ToStr = "" + Integer.toHexString(0xff & crc8); +// return crc8ToStr; + return null; } /** @@ -33,50 +33,5 @@ return bytes; } - /** - * CRC8 校验 多项式 x8+x2+x+1 - * - * @param b - * @param off - * @param len - * @return - */ - public static byte CRC8(final byte[] b, final int off, final int len) { - byte result = 0x00; - for (int i = 0; i < len; i++) { - result = CHECKSUM_TABLE[(result ^ (b[i + off] & 0xFF)) & 0xFF]; - } - return (byte) (result & 0xFFL); - } - - private final static byte[] CHECKSUM_TABLE = {(byte) 0x00, (byte) 0x07, (byte) 0x0e, (byte) 0x09, (byte) 0x1c, (byte) 0x1b, - (byte) 0x12, (byte) 0x15, (byte) 0x38, (byte) 0x3f, (byte) 0x36, (byte) 0x31, (byte) 0x24, (byte) 0x23, (byte) 0x2a, - (byte) 0x2d, (byte) 0x70, (byte) 0x77, (byte) 0x7e, (byte) 0x79, (byte) 0x6c, (byte) 0x6b, (byte) 0x62, (byte) 0x65, - (byte) 0x48, (byte) 0x4f, (byte) 0x46, (byte) 0x41, (byte) 0x54, (byte) 0x53, (byte) 0x5a, (byte) 0x5d, (byte) 0xe0, - (byte) 0xe7, (byte) 0xee, (byte) 0xe9, (byte) 0xfc, (byte) 0xfb, (byte) 0xf2, (byte) 0xf5, (byte) 0xd8, (byte) 0xdf, - (byte) 0xd6, (byte) 0xd1, (byte) 0xc4, (byte) 0xc3, (byte) 0xca, (byte) 0xcd, (byte) 0x90, (byte) 0x97, (byte) 0x9e, - (byte) 0x99, (byte) 0x8c, (byte) 0x8b, (byte) 0x82, (byte) 0x85, (byte) 0xa8, (byte) 0xaf, (byte) 0xa6, (byte) 0xa1, - (byte) 0xb4, (byte) 0xb3, (byte) 0xba, (byte) 0xbd, (byte) 0xc7, (byte) 0xc0, (byte) 0xc9, (byte) 0xce, (byte) 0xdb, - (byte) 0xdc, (byte) 0xd5, (byte) 0xd2, (byte) 0xff, (byte) 0xf8, (byte) 0xf1, (byte) 0xf6, (byte) 0xe3, (byte) 0xe4, - (byte) 0xed, (byte) 0xea, (byte) 0xb7, (byte) 0xb0, (byte) 0xb9, (byte) 0xbe, (byte) 0xab, (byte) 0xac, (byte) 0xa5, - (byte) 0xa2, (byte) 0x8f, (byte) 0x88, (byte) 0x81, (byte) 0x86, (byte) 0x93, (byte) 0x94, (byte) 0x9d, (byte) 0x9a, - (byte) 0x27, (byte) 0x20, (byte) 0x29, (byte) 0x2e, (byte) 0x3b, (byte) 0x3c, (byte) 0x35, (byte) 0x32, (byte) 0x1f, - (byte) 0x18, (byte) 0x11, (byte) 0x16, (byte) 0x03, (byte) 0x04, (byte) 0x0d, (byte) 0x0a, (byte) 0x57, (byte) 0x50, - (byte) 0x59, (byte) 0x5e, (byte) 0x4b, (byte) 0x4c, (byte) 0x45, (byte) 0x42, (byte) 0x6f, (byte) 0x68, (byte) 0x61, - (byte) 0x66, (byte) 0x73, (byte) 0x74, (byte) 0x7d, (byte) 0x7a, (byte) 0x89, (byte) 0x8e, (byte) 0x87, (byte) 0x80, - (byte) 0x95, (byte) 0x92, (byte) 0x9b, (byte) 0x9c, (byte) 0xb1, (byte) 0xb6, (byte) 0xbf, (byte) 0xb8, (byte) 0xad, - (byte) 0xaa, (byte) 0xa3, (byte) 0xa4, (byte) 0xf9, (byte) 0xfe, (byte) 0xf7, (byte) 0xf0, (byte) 0xe5, (byte) 0xe2, - (byte) 0xeb, (byte) 0xec, (byte) 0xc1, (byte) 0xc6, (byte) 0xcf, (byte) 0xc8, (byte) 0xdd, (byte) 0xda, (byte) 0xd3, - (byte) 0xd4, (byte) 0x69, (byte) 0x6e, (byte) 0x67, (byte) 0x60, (byte) 0x75, (byte) 0x72, (byte) 0x7b, (byte) 0x7c, - (byte) 0x51, (byte) 0x56, (byte) 0x5f, (byte) 0x58, (byte) 0x4d, (byte) 0x4a, (byte) 0x43, (byte) 0x44, (byte) 0x19, - (byte) 0x1e, (byte) 0x17, (byte) 0x10, (byte) 0x05, (byte) 0x02, (byte) 0x0b, (byte) 0x0c, (byte) 0x21, (byte) 0x26, - (byte) 0x2f, (byte) 0x28, (byte) 0x3d, (byte) 0x3a, (byte) 0x33, (byte) 0x34, (byte) 0x4e, (byte) 0x49, (byte) 0x40, - (byte) 0x47, (byte) 0x52, (byte) 0x55, (byte) 0x5c, (byte) 0x5b, (byte) 0x76, (byte) 0x71, (byte) 0x78, (byte) 0x7f, - (byte) 0x6a, (byte) 0x6d, (byte) 0x64, (byte) 0x63, (byte) 0x3e, (byte) 0x39, (byte) 0x30, (byte) 0x37, (byte) 0x22, - (byte) 0x25, (byte) 0x2c, (byte) 0x2b, (byte) 0x06, (byte) 0x01, (byte) 0x08, (byte) 0x0f, (byte) 0x1a, (byte) 0x1d, - (byte) 0x14, (byte) 0x13, (byte) 0xae, (byte) 0xa9, (byte) 0xa0, (byte) 0xa7, (byte) 0xb2, (byte) 0xb5, (byte) 0xbc, - (byte) 0xbb, (byte) 0x96, (byte) 0x91, (byte) 0x98, (byte) 0x9f, (byte) 0x8a, (byte) 0x8d, (byte) 0x84, (byte) 0x83, - (byte) 0xde, (byte) 0xd9, (byte) 0xd0, (byte) 0xd7, (byte) 0xc2, (byte) 0xc5, (byte) 0xcc, (byte) 0xcb, (byte) 0xe6, - (byte) 0xe1, (byte) 0xe8, (byte) 0xef, (byte) 0xfa, (byte) 0xfd, (byte) 0xf4, (byte) 0xf3}; } \ No newline at end of file diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java index 27c2838..6e078a3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java @@ -1,9 +1,6 @@ package com.casic.missiles.parser.safe.impl; -import cn.hutool.core.util.CharsetUtil; -import cn.hutool.crypto.symmetric.SM4; -import cn.hutool.crypto.symmetric.SymmetricCrypto; - +import com.casic.missiles.parser.safe.SafeStrategy; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; @@ -11,19 +8,44 @@ import org.bouncycastle.crypto.engines.SM4Engine; import org.bouncycastle.crypto.params.KeyParameter; import org.bouncycastle.util.encoders.Hex; - -import static cn.hutool.crypto.Mode.ECB; -import static cn.hutool.crypto.Padding.NoPadding; +import org.springframework.stereotype.Component; /** * SM4算法工具类 */ @Slf4j -public class Sm4 { +@Component("sm4") +public class Sm4 implements SafeStrategy { //加解密的字节快大小 public static final int BlockSize = 16; + @Override + public String decryption(String cipher) { + byte[] keyByte = { + 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 + }; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(keyByte); + byte[] in = Hex.decode(cipher); + byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); + String plain = EcbDecrypt(in, keyBytes); + return plain; + } + + @Override + public String encryption(String cipher) { + byte[] keyByte = { + 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 + }; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(keyByte); + byte[] in = Hex.decode(cipher); + byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); + String plain = EcbDecrypt(in, keyBytes); + return plain; + } + /** * SM4ECB加密算法,对内 * @@ -32,8 +54,6 @@ * @return */ private static byte[] ecb_encrypt(byte[] in, byte[] keyBytes) { - - SM4Engine sm4Engine = new SM4Engine(); sm4Engine.init(true, new KeyParameter(keyBytes)); byte[] out = new byte[in.length]; @@ -58,27 +78,6 @@ return cipher; } - - /** - * hutool 解密SM4 - * - * @param encodeContent - * @return - */ - public static String decode(String encodeContent) { - String key = "24ad182507479a5da3ad94d9d78ea203"; - try { - SymmetricCrypto sm4 = new SM4(ECB, NoPadding, key.getBytes()); - String decryptStr = sm4.decryptStr(encodeContent, CharsetUtil.CHARSET_UTF_8); - return decryptStr; - } catch (Exception e) { - e.printStackTrace(); - log.error("SM4解密失败"); - } - return null; - } - - /** * SM4的ECB加密算法 * @@ -129,20 +128,6 @@ return plain; } - /** - * SM4的ECB解密算法 - * - * @param cipher 输入的密文字符串 - * @param key 密钥 - * @return - */ - public static String EcbDecrypt(String cipher, String key) { - byte[] in = Hex.decode(cipher); - byte[] keyBytes = Hex.decode(key); - - String plain = EcbDecrypt(in, keyBytes); - return plain; - } /** * 主函数 @@ -151,28 +136,24 @@ */ public static void main(String[] args) { byte[] ciphertext = { + 0x4B, (byte) 0x8C, (byte) 0x9D, 0x08, (byte) 0xE4, (byte) 0xD3, 0x64, 0x42, (byte) 0xB9, (byte) 0xA5, (byte) 0xFE, (byte) 0xCD, (byte) 0x91, 0x1B, 0x38, (byte) 0xAC, (byte) 0xE9, 0x1C, (byte) 0xCD, 0x53, 0x02, (byte) 0xD7, 0x0C, (byte) 0x9B, (byte) 0x96, 0x30, 0x62, (byte) 0xE8, (byte) 0xFB, (byte) 0xEF, (byte) 0xB9, (byte) 0xFF, (byte) 0xDE, 0x19, (byte) 0x80, 0x35, 0x3E, (byte) 0x90, 0x4F, 0x2F, 0x12, 0x2B, 0x19, (byte) 0x8B, 0x6C, 0x7A, (byte) 0x85, (byte) 0xA1, (byte) 0xB1, (byte) 0x86, (byte) 0xA3, 0x7A, 0x46, 0x0C, 0x2F, (byte) 0x94, 0x4F, 0x7F, 0x2C, 0x56, 0x14, (byte) 0xF3, (byte) 0x89, (byte) 0xC3, - 0x3F, 0x20, (byte) 0xF9, (byte) 0x87, (byte) 0xA1, 0x60, (byte) 0xD9, (byte) 0xA8, (byte) 0xFD, (byte) 0xD7, (byte) 0x9B, 0x4B, 0x26, 0x06, 0x30, 0x44}; + 0x3F, 0x20, (byte) 0xF9, (byte) 0x87, (byte) 0xA1, 0x60, (byte) 0xD9, (byte) 0xA8, (byte) 0xFD, (byte) 0xD7, (byte) 0x9B, 0x4B, 0x26, 0x06, 0x30, 0x44 + }; ByteBuf in = ByteBufAllocator.DEFAULT.heapBuffer(); in.writeBytes(ciphertext); - byte[] keyByte = { 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 }; ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); - key.writeBytes(ciphertext); - String resCipherData = decode(ByteBufUtil.hexDump(in)); - ByteBuf out = ByteBufAllocator.DEFAULT.heapBuffer(); -// out.writeBytes(resCipherData); -// System.out.println(hexBytes); - System.out.println(resCipherData.toString()); -// String resPlainData = EcbDecrypt(resCipherData, key); -// System.out.println("原始明文:" + data); -// System.out.println("解密后明文:" + resPlainData); + key.writeBytes(keyByte); +// String resCipherData = EcbDecrypt(ByteBufUtil.hexDump(in), ByteBufUtil.hexDump(key)); +// System.out.println(resCipherData); } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java index 1395a51..ac5f957 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java @@ -1,7 +1,7 @@ package com.casic.missiles.parser.safe.impl; import io.netty.buffer.ByteBufUtil; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** *

@@ -14,9 +14,8 @@ * @author hyl * @version v1.0: Tea.java, v 0.1 2021/3/12 13:48 $ */ -@Service("tea") -///tea算法类 - +//tea算法类 +@Component("tea") public class Tea { public static byte[] MyTea_Encrypt(byte[] MyTeaContent, int ByteLen, byte[] MyTeakey) { @@ -99,7 +98,6 @@ // for(int i32Index = 0; i32Index < 8; i32Index++) { // System.out.print("0x" + Integer.toHexString(MyContent[i32Index]) + " "); // } - // System.out.println("密钥为:"); // for(int i32Index = 0; i32Index < 16; i32Index++) { // System.out.print("0x" + Integer.toHexString(MyKeys[i32Index]) + " "); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java index bdd0721..bd1516a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java @@ -3,7 +3,7 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.parser.sender.DataSubscribeProvider; import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponents; import org.springframework.web.util.UriComponentsBuilder; @@ -12,7 +12,7 @@ import java.util.Collections; import java.util.Map; -@Service("functionCallback") +@Component("functionCallback") public class FunctionCallback implements DataSubscribeProvider { @Resource diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java index 0b44fb9..7526de2 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.Map; -@Service("middleware") +@Component("middleware") public class MiddlewareSubscribe implements DataSubscribeProvider { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java index 5dcee3f..e2f1192 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.Map; -@Service("nosql") +@Component("nosql") public class NoSqlSubscribe implements DataSubscribeProvider { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java b/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java new file mode 100644 index 0000000..81a5324 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java @@ -0,0 +1,86 @@ +package com.casic.missiles.pojo; + +import lombok.Data; + +/** + * 协议 + */ +@Data +public class Msg { + + /** + * 前导码 + */ + private String preamble; + + /** + * 版本号 + */ + private String version; + + /** + * 内容长度 + */ + private int leng; + + /** + * 设备ID + */ + private String deviceId; + + /** + * 通讯方式 + */ + private Integer connType; + + /** + * 加密方式 + */ + private Integer encryType; + + /** + * 目标地址 + */ + private String destAddr; + + /** + * PDUType + */ + private String PDUType; + + /** + * 操作类型 + */ + private Integer operateType; + + /** + * 传输控制位 PDUType.bit7=0时,表示存在后续的访问;当PDUType.bit7=1时,表示无后续的访问。 + */ + private Integer transControlFlag; + + /** + * 设备类型 + */ + private Integer deviceType; + + /** + * 序号 + */ + private Integer seq; + + /** + * tagList + */ + private String tagList; + + /** + * OidList + */ + private String OidList; + + /** + * CRC + */ + private String CRC; + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java index 40a5265..97cc984 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java @@ -40,7 +40,7 @@ String httpContent = msg.toString(Charset.defaultCharset()); log.info(" String : " + msg.toString(Charset.defaultCharset())); String majorContent = httpContent.substring(httpContent.indexOf("{"), httpContent.lastIndexOf("}") + 1); - String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("serviceData")).get("Value")); + String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("RegistryData")).get("Value")); log.info("----------------------------------" + values); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); bufferContent.writeBytes(values.getBytes(Charset.forName("ISO-8859-1"))); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java index 1b132a7..e3ced4b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java @@ -35,7 +35,7 @@ String httpContent = msg.toString(Charset.defaultCharset()); log.info(" String : " + msg.toString(Charset.defaultCharset())); String majorContent = httpContent.substring(httpContent.indexOf("{"), httpContent.lastIndexOf("}") + 1); - String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("serviceData")).get("Value")); + String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("RegistryData")).get("Value")); log.info("----------------------------------" + values); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); bufferContent.writeBytes(values.getBytes(Charset.forName("ISO-8859-1"))); diff --git a/sensorhub-core/src/main/resources/application.properties b/sensorhub-core/src/main/resources/application.properties deleted file mode 100644 index 8b13789..0000000 --- a/sensorhub-core/src/main/resources/application.properties +++ /dev/null @@ -1 +0,0 @@ - diff --git a/sensorhub-core/src/main/resources/config/application-dev.yml b/sensorhub-core/src/main/resources/config/application-dev.yml index 4f897a8..dcc4c2d 100644 --- a/sensorhub-core/src/main/resources/config/application-dev.yml +++ b/sensorhub-core/src/main/resources/config/application-dev.yml @@ -4,9 +4,9 @@ spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true + url: jdbc:mysql://127.0.0.1:3306/sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true username: root - password: Casic203 + password: root session: store-type: redis redis: diff --git a/sensorhub-core/src/main/resources/config/application.yml b/sensorhub-core/src/main/resources/config/application.yml index ae89f9d..7965da1 100644 --- a/sensorhub-core/src/main/resources/config/application.yml +++ b/sensorhub-core/src/main/resources/config/application.yml @@ -30,6 +30,13 @@ port: 6379 password: ew5T4K3#203lwh config-prefix: 'Casic:' +#代码生成器配置 +code: + generate: + #作者 + author: cz + #待生成对象表名 + table-name: bussiness_field_config,combined_field_config sensorhub: config: port: 7091 diff --git a/sensorhub-support/pom.xml b/sensorhub-support/pom.xml index 9a71296..761601c 100644 --- a/sensorhub-support/pom.xml +++ b/sensorhub-support/pom.xml @@ -42,6 +42,12 @@ ${redis.version} + + com.baomidou + mybatis-plus-generator + ${mybatis-plus-generator.version} + + org.reflections diff --git a/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java b/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java new file mode 100644 index 0000000..515ca53 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java @@ -0,0 +1,14 @@ +package com.casic.missiles.enums; + +/** + * @author + * @date + */ +public interface FixedPropertyEnum { + + String FIXED_POSITION = "fixedPosition"; + + String TOTAL_LENGTH = "totalLength"; + + String TAIL_POSITION = "tailPosition"; +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/CombinedFieldMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CombinedFieldMapper.java new file mode 100644 index 0000000..38e8f42 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CombinedFieldMapper.java @@ -0,0 +1,15 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.CombinedFieldConfig; +import org.apache.ibatis.annotations.Mapper; + +/** + * @author cz + * + */ +@Mapper +public interface CombinedFieldMapper extends BaseMapper { + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java new file mode 100644 index 0000000..128b09d --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java @@ -0,0 +1,10 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.CommandEventConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface CommandEventMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java new file mode 100644 index 0000000..042eb3c --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.DatagramEventConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface DatagramEventConfigMapper extends BaseMapper { +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java new file mode 100644 index 0000000..fc95cf4 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java @@ -0,0 +1,8 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.FieldConfig; + +public interface FieldConfigMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldRuleConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldRuleConfigMapper.java new file mode 100644 index 0000000..b310a08 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldRuleConfigMapper.java @@ -0,0 +1,10 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.FieldRuleConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface FieldRuleConfigMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java new file mode 100644 index 0000000..9060a69 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.ProtocolConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface ProtocolConfigMapper extends BaseMapper { +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolFieldConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolFieldConfigMapper.java new file mode 100644 index 0000000..1b47180 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolFieldConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +public interface ProtocolFieldConfigMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java new file mode 100644 index 0000000..6fa6936 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.RuleConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface RuleConfigMapper extends BaseMapper { +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/AbstractFieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/AbstractFieldConfig.java new file mode 100644 index 0000000..ba9aea2 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/AbstractFieldConfig.java @@ -0,0 +1,38 @@ +package com.casic.missiles.pojo; + +import lombok.Data; + +@Data +public class AbstractFieldConfig { + /** + * 字段名称 + */ + private String fieldName; + /** + * 按照字段评估进行字段解析 + */ + private String ruleJson; + /** + * 起始位置(单位byte) + */ + private Integer OriginPositionByte; + /** + * 起始位置,是否需要bit位置(单位bit)小于8, 没有不需要填写 + */ + private String OriginPositionBit; + /** + * 偏移长度 + */ + private Integer offsetLength; + /** + * 偏移单位(bit/byte) + */ + private String offsetUnit; + /** + * 是否需要转存 + */ + private Integer isStorage; + + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/CombinedFieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/CombinedFieldConfig.java new file mode 100644 index 0000000..4f4de6a --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/CombinedFieldConfig.java @@ -0,0 +1,41 @@ +package com.casic.missiles.pojo; + +import lombok.Data; + +import java.util.Date; + +/** + * 组合配置 + * + * @author cz + * @date 20 + */ +@Data +public class CombinedFieldConfig { + + private Long id; + private Long ruleId; + /** + * 前缀编码 + */ + private String prefixCode; + + /** + * 字段动态的id + */ + private Long dynamicLengthId; + /** + * 对应的要解析字段的ids + */ + private String dataFieldIds; + + /** + * 字段动态的id + */ + private String combinedFieldIds; + + private Date lastTime; + + private Date createTime; + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldConfig.java index a07d20d..8304dc6 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldConfig.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldConfig.java @@ -5,31 +5,28 @@ import java.util.Date; +/** + * @author cz + * 1、该表与实际解析的内容实例解析有关 + * 2、该表字段是随机出现的,和帧结构无关,无法预料的 + * 3、该表字段解析根据FieldEvaluatorConfig进行字段解析 + */ @Data -@TableName("field_config") -public class FieldConfig { +@TableName("business_field_config") +public class FieldConfig extends AbstractFieldConfig { private Long id; -// private String preFieldConfig; - private Long protocolId; - - private String isFixed; - private String uploadDeliveryChange; - - private String replyRule; - private String ruleJson; - + /** + * 协议配置id + */ + private Long ruleId; + /** + * 字段名称 + */ private String fieldName; - private String isStorage; - private Integer orignPosition; - private String exactOrignPosition; - - private Integer offsetLength; - private String offsetUnit; private String ownerId; private Date createTime; private Date lastTime; - } diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldRuleConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldRuleConfig.java new file mode 100644 index 0000000..2e09879 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldRuleConfig.java @@ -0,0 +1,20 @@ +package com.casic.missiles.pojo; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +@TableName("field_rule_config") +@Data +public class FieldRuleConfig { + + private Long id; + private String name; + private String desc; + private String condition; + private String excuteOperation; + private Date lasTime; + private Date createTime; + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/Msg.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/Msg.java deleted file mode 100644 index 81a5324..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/Msg.java +++ /dev/null @@ -1,86 +0,0 @@ -package com.casic.missiles.pojo; - -import lombok.Data; - -/** - * 协议 - */ -@Data -public class Msg { - - /** - * 前导码 - */ - private String preamble; - - /** - * 版本号 - */ - private String version; - - /** - * 内容长度 - */ - private int leng; - - /** - * 设备ID - */ - private String deviceId; - - /** - * 通讯方式 - */ - private Integer connType; - - /** - * 加密方式 - */ - private Integer encryType; - - /** - * 目标地址 - */ - private String destAddr; - - /** - * PDUType - */ - private String PDUType; - - /** - * 操作类型 - */ - private Integer operateType; - - /** - * 传输控制位 PDUType.bit7=0时,表示存在后续的访问;当PDUType.bit7=1时,表示无后续的访问。 - */ - private Integer transControlFlag; - - /** - * 设备类型 - */ - private Integer deviceType; - - /** - * 序号 - */ - private Integer seq; - - /** - * tagList - */ - private String tagList; - - /** - * OidList - */ - private String OidList; - - /** - * CRC - */ - private String CRC; - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/PreRuleConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/PreRuleConfig.java deleted file mode 100644 index bfcf914..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/PreRuleConfig.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.casic.missiles.pojo; - -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -import java.util.Date; - -@Data -@TableName("pre_rule_config") -public class PreRuleConfig { - - private Long id; - private String protocolId; - private String ruleFieldId; - private String ownerId; - private Date createTime; - private Date lastTime; -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolConfig.java index 274ad42..bdac11f 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolConfig.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolConfig.java @@ -5,18 +5,52 @@ import java.util.Date; +/** + * 协议配置表,协议配置与帧结构有关 + * 1、层级关系,协议之后是规则,规则对应设备类型的各种上数规则 + * 2、规则对应协议配置的实例流程 + * 3、每种可根据设备类型和操作类型进行上数规则进行区分 + */ @Data @TableName("protocol_config") public class ProtocolConfig { private Long id; + /** + * 前导码 + */ private String preFix; - private String unpackId; - private String totalLengthId; - private String totalLengthFilterField; + /** + * 拆包id + */ + private Long unpackId; + /** + * 总长度id + */ + private Long totalLengthId; + /** + * + */ + private String totalLengthFilterFields; + /** + * 动态长度ids + */ private String dynamicLengthId; + /** + * 动态长度json(预留字段) + */ private String dynamicLengthJson; - private String tailStr; + /** + * 规则字段所解析预准备的字段 + */ + private String rulePrepareFields; + /** + * 结尾标志 + */ + private Long tailStr; + /** + * 备注 + */ private String remark; private String ownerId; private Date createTime; diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolFieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolFieldConfig.java new file mode 100644 index 0000000..db794bd --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolFieldConfig.java @@ -0,0 +1,43 @@ +package com.casic.missiles.pojo; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +/** + * 协议字段配置表 + * 该表用户存放帧结构固定格式的字段 + * 有以下两个用途 + * (1)、固定格式的字段可用于规则匹配 + * (2)、固定格式的字段可用于报文回复 + * @author cz + * @date 2023-06-09 + */ +@Data +@TableName("protocol_field_config") +public class ProtocolFieldConfig extends AbstractFieldConfig{ + + private Long id; + /** + * 协议配置id + */ + private Long protocolId; + /** + * 上传下发是否有变化, 没有变化,可以直接组装 + */ + private String isReplyFix; + /** + * 按照字段评估进行字段解析 + */ + private Long fieldEvaluatorId; + /** + * 回复规则 + */ + private String replyRule; + + private String ownerId; + private Date createTime; + private Date lastTime; + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java index 3b53493..febf835 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java @@ -6,18 +6,40 @@ import java.util.Date; /** - * 加密字段解析和规则有关,事件调到该流程下面 + * @author cz + * todo: 匹配协议对应业务实例 + * 1、一个协议可以多种的流程规则 + * 2、规则可以支持递归规则流程 */ @Data @TableName("rule_config") public class RuleConfig { - private Long id; private String protocolId; - private String isBizField; - private String parseRuleJson; + /** + * 是否完成规则配置,没有完成, + * 则需要根据规则继续匹配 + */ + private String isFinishMatch; + /** + * 待匹配解析规则 + * {“data_field”:"data_value"} + */ + private String matchRuleJson; + /** + * 待解析字段ids + */ private String dataFieldIds; - private String aviatorFilterJson; + + /** + * 待解析组合字段ids + */ + private String combinedFieldIds; + + /** + * aviator + */ + private String conditionExpression; private Date createTime; private Date lastTime; } diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleDict.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleDict.java deleted file mode 100644 index cc7f389..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleDict.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.casic.missiles.pojo; - -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -@Data -@TableName("rule_dict") -public class RuleDict { - - private Long id; - private Long pid; - private String name; - private String code; - private String ownerId; - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleEvaluator.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleEvaluator.java deleted file mode 100644 index ed16610..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleEvaluator.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.pojo; - -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -import java.util.Date; - -@TableName("rule_evaluator") -@Data -public class RuleEvaluator { - - private Long id; - private String name; - private String desc; - private String condition; - private String excuteOperation; - private Date lasTime; - private Date createTime; - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/CombinedFieldConfigRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/CombinedFieldConfigRegistry.java new file mode 100644 index 0000000..fa59b90 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/CombinedFieldConfigRegistry.java @@ -0,0 +1,12 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.CombinedFieldConfig; + +import java.util.List; + +public interface CombinedFieldConfigRegistry { + + List getCombinedFieldConfigList(Long ruleId); + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/CommandEventRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/CommandEventRegistry.java new file mode 100644 index 0000000..fb97d87 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/CommandEventRegistry.java @@ -0,0 +1,8 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.CommandEventConfig; + +public interface CommandEventRegistry { + + CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName); +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/DatagramEventRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/DatagramEventRegistry.java new file mode 100644 index 0000000..fb34641 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/DatagramEventRegistry.java @@ -0,0 +1,11 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.DatagramEventConfig; + +import java.util.List; + +public interface DatagramEventRegistry{ + + List getDatagramEventList(Long ruleId); + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/FieldConfigRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/FieldConfigRegistry.java new file mode 100644 index 0000000..759642e --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/FieldConfigRegistry.java @@ -0,0 +1,20 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.FieldConfig; + +import java.util.List; + +public interface FieldConfigRegistry { + + + List getFieldConfigList(Long ruleId); + + FieldConfig getFieldConfigById(String fieldId); + + List getFieldConfigs(String protocolId, Integer isFixed); + + List getStorageFieldConfig(String protocolId); + + +} + diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/FieldRuleConfigRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/FieldRuleConfigRegistry.java new file mode 100644 index 0000000..33da70c --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/FieldRuleConfigRegistry.java @@ -0,0 +1,11 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.FieldRuleConfig; + +import java.util.List; + +public interface FieldRuleConfigRegistry { + + List getFieldRuleConfigList(Long ruleId); + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/ProtocolConfigRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/ProtocolConfigRegistry.java new file mode 100644 index 0000000..1725189 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/ProtocolConfigRegistry.java @@ -0,0 +1,12 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.ProtocolConfig; + +import java.util.List; + +public interface ProtocolConfigRegistry { + + List getProtocolConfigList(String firstChar); + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/ProtocolFieldConfigRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/ProtocolFieldConfigRegistry.java new file mode 100644 index 0000000..19d1b9a --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/ProtocolFieldConfigRegistry.java @@ -0,0 +1,14 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.ProtocolFieldConfig; + +import java.util.List; + +public interface ProtocolFieldConfigRegistry { + + + List getProtocolFieldConfigList(Long protocolId); + + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/RuleConfigRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/RuleConfigRegistry.java new file mode 100644 index 0000000..3d2a75c --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/RuleConfigRegistry.java @@ -0,0 +1,14 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.RuleConfig; + +import java.util.List; + +public interface RuleConfigRegistry { + + RuleConfig getNextRuleConfig(String ruleFields); + + + List getRuleConfigById(Long protocolId); + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CombinedFieldConfigRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CombinedFieldConfigRegistryImpl.java new file mode 100644 index 0000000..822cac6 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CombinedFieldConfigRegistryImpl.java @@ -0,0 +1,24 @@ +package com.casic.missiles.registry.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.CombinedFieldMapper; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.registry.CombinedFieldConfigRegistry; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class CombinedFieldConfigRegistryImpl extends ServiceImpl implements CombinedFieldConfigRegistry { + + @Override + public List getCombinedFieldConfigList(Long ruleId) { + QueryWrapper queryWrapper = new QueryWrapper() + .eq("rule_id", ruleId); + List combinedFieldConfigs = this.baseMapper.selectList(queryWrapper); + return combinedFieldConfigs; + } + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CommandEventRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CommandEventRegistryImpl.java new file mode 100644 index 0000000..f0d3559 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CommandEventRegistryImpl.java @@ -0,0 +1,25 @@ +package com.casic.missiles.registry.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.CommandEventMapper; +import com.casic.missiles.pojo.CommandEventConfig; +import com.casic.missiles.registry.CommandEventRegistry; + +import java.util.List; +import java.util.Optional; + +public class CommandEventRegistryImpl extends ServiceImpl implements CommandEventRegistry { + + @Override + public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { + QueryWrapper queryWrapper = new QueryWrapper() + .eq("protocol_id", protocolId) + .eq("scene", sceneName) + .eq("enabled", 1); + List commandEventConfig = this.baseMapper.selectList(queryWrapper); + Optional optionalEventConfig = commandEventConfig.stream().findFirst(); + return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; + } + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/DatagramEventRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/DatagramEventRegistryImpl.java new file mode 100644 index 0000000..2e58698 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/DatagramEventRegistryImpl.java @@ -0,0 +1,26 @@ +package com.casic.missiles.registry.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.DatagramEventConfigMapper; +import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.registry.DatagramEventRegistry; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class DatagramEventRegistryImpl extends ServiceImpl implements DatagramEventRegistry { + + + @Override + public List getDatagramEventList(Long ruleId) { + QueryWrapper queryWrapper = new QueryWrapper() + .eq("rule_id", ruleId); + List fieldConfigList = this.baseMapper.selectList(queryWrapper); + return fieldConfigList; + } + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/FieldConfigRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/FieldConfigRegistryImpl.java new file mode 100644 index 0000000..6ae4422 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/FieldConfigRegistryImpl.java @@ -0,0 +1,50 @@ +package com.casic.missiles.registry.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.FieldConfigMapper; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.registry.FieldConfigRegistry; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * @author cz + */ +@Service +public class FieldConfigRegistryImpl extends ServiceImpl implements FieldConfigRegistry { + + @Override + public List getFieldConfigList(Long ruleId) { + QueryWrapper queryWrapper = new QueryWrapper() + .eq("rule_id", ruleId); + List fieldConfigList = this.baseMapper.selectList(queryWrapper); + return fieldConfigList; + } + + @Override + public FieldConfig getFieldConfigById(String fieldId) { + FieldConfig fieldConfig = this.baseMapper.selectById(fieldId); + return fieldConfig; + } + + @Override + public List getFieldConfigs(String protocolId, Integer isFixed) { + QueryWrapper queryWrapper = new QueryWrapper() + .eq("protocol_id", protocolId) + .eq("is_fixed", isFixed); + List fieldConfigList = this.baseMapper.selectList(queryWrapper); + return fieldConfigList; + } + + @Override + public List getStorageFieldConfig(String protocolId) { + QueryWrapper queryWrapper = new QueryWrapper() + .eq("protocol_id", protocolId) + .eq("is_fixed", 1) + .eq("is_storage", 1); + List fieldConfigList = this.baseMapper.selectList(queryWrapper); + return fieldConfigList; + } +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/FieldRuleConfigRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/FieldRuleConfigRegistryImpl.java new file mode 100644 index 0000000..406fe65 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/FieldRuleConfigRegistryImpl.java @@ -0,0 +1,23 @@ +package com.casic.missiles.registry.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.FieldRuleConfigMapper; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.registry.FieldRuleConfigRegistry; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class FieldRuleConfigRegistryImpl extends ServiceImpl implements FieldRuleConfigRegistry { + + @Override + public List getFieldRuleConfigList(Long ruleId) { + QueryWrapper queryWrapper = new QueryWrapper() + .eq("rule_id", ruleId); + List fieldRuleConfigList = this.baseMapper.selectList(queryWrapper); + return fieldRuleConfigList; + } + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/ProtocolConfigRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/ProtocolConfigRegistryImpl.java new file mode 100644 index 0000000..8a516e5 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/ProtocolConfigRegistryImpl.java @@ -0,0 +1,26 @@ +package com.casic.missiles.registry.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.ProtocolConfigMapper; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.registry.ProtocolConfigRegistry; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class ProtocolConfigRegistryImpl extends ServiceImpl implements ProtocolConfigRegistry { + + /** + * 无条件全查询,作为一次加载的初始化查询 + * + * @return + */ + @Override + public List getProtocolConfigList(String firstChar) { + + return this.baseMapper.selectList(null); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java index 608af3a..32cc8a4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java @@ -2,48 +2,47 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.delivery.decorator.ByteDecorator; +import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @AllArgsConstructor public class FieldDecoratorManger { - private final RuleDictDao ruleDictDao; + private final RuleConfigRegistry ruleDictDao; // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 // (1)静态的业务字段是字典里面可以配置的 // (2)动态的业务字段是通过规则生成的 public String contentMerge(String ruleJson, String sceneConent, String dynamicContent) { - List ruleDictList = ruleDictDao.getRuleDictConfig(); - Map ruleDictMap = ruleDictList.stream().collect( - Collectors.toMap(RuleDict::getId, e -> e)); - List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); - for (Map ruleMap : ruleMapList) { - String ruleType = String.valueOf(ruleMap.get("ruleType")); - ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); - NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); - byteDecorator.nodeDecoratorRule(nodeDecoratorParm); - } +// List ruleDictList = ruleDictDao.getRuleDictConfig(); +// Map ruleDictMap = ruleDictList.stream().collect( +// Collectors.toMap(RuleDict::getId, e -> e)); +// List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); +// for (Map ruleMap : ruleMapList) { +// String ruleType = String.valueOf(ruleMap.get("ruleType")); +// ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); +// NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); +// byteDecorator.nodeDecoratorRule(nodeDecoratorParm); +// } return null; } - - private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { - NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() - .contents(sceneConent) - .dynamicContent(dynamicContent) - .ruletypeId(ruletypeId) - .ruleDictMap(ruleDictMap) - .build(); - return nodeDecoratorParm; - } +// +// private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { +// NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() +// .contents(sceneConent) +// .dynamicContent(dynamicContent) +// .ruletypeId(ruletypeId) +// .ruleDictMap(ruleDictMap) +// .build(); +// return nodeDecoratorParm; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java index 652970c..b204ac3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java @@ -1,56 +1,56 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@AllArgsConstructor -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", - JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Component; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Component("logicalDecorator") +//@AllArgsConstructor +//@Slf4j +//public class LogicalShiftDecorator implements ByteDecorator { +// +//// private final FieldRuleEngineMapper fieldRuleEngineMapper; +//// +//// //字节位移 +//// @Override +//// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +//// String logicalValue = ""; +//// RuleEvaluator fieldRuleEngine = new RuleEvaluator(); +//// try { +//// Map env2 = new HashMap(); +//// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +//// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +//// for (String contentId : contentIdList) { +//// RuleDict ruleDict = ruleDictMap.get(contentId); +//// if (ruleDict.getCode().contains("#")) { +//// //使用动态的值 +//// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +//// } +//// env2.put(ruleDict.getName(), ruleDict.getCode()); +//// } +//// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +//// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +//// return null; +//// } +//// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +//// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +//// return values; +//// } catch (Exception ex) { +//// log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", +//// JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +//// return null; +//// } +//// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java index 346468f..822fead 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@AllArgsConstructor -@Slf4j -public class OperationDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("optionDecorator") +//@AllArgsConstructor +//@Slf4j +//public class OperationDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //混合运算,有常量或者乘除的缩放 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java index 50fb0a7..7a8bccb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@AllArgsConstructor -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +////精度计算 +//@AllArgsConstructor +//@Registry("precisionDecorator") +//@Slf4j +//public class PrecisionDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java index da39235..27f9cc7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java @@ -1,54 +1,53 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@AllArgsConstructor -@Slf4j -public class RuleDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("ruleDecorator") +//@AllArgsConstructor +//@Slf4j +//public class RuleDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //吃我一套正则表达式 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (Exception ex) { +// log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java index 7f5cbf3..c043f97 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java @@ -2,6 +2,6 @@ import java.util.Map; -public interface ComandeEventService { +public interface ComandeEventService{ Map loadComandeEventConfig(String protocolId,String scene); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java index 476ad84..aaf1837 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java @@ -2,46 +2,46 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.dao.CommandEventDao; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @Slf4j @AllArgsConstructor -public class ComandeEventServiceImpl implements ComandeEventService { +public class ComandeEventServiceImpl implements ComandeEventRegistry { - private final CommandEventDao commandEventDao; + // private final CommandEventDao commandEventDao; // 加密bean 固定字段出现变化的字段解析,业务字段的有序内容 @Override - public Map loadComandeEventConfig(String protocolId,String sceneName) { - CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); - if (ObjectUtil.isEmpty(commandEventConfig)) { - log.error("协议{},没有配置成功接收回复配置,清排查原因"); - return null; - } - String replyJson = commandEventConfig.getReplyContentJson(); - List> replyMapList = JSONArray.parseObject(replyJson, List.class); - List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); - Map fixMap = fixList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); - List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) - .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) - .collect(Collectors.toList()); - Map commandConfigMap = new HashMap<>(); - commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); - commandConfigMap.put("fixContent", fixMap); - commandConfigMap.put("bizContent", contentList); - return commandConfigMap; + public Map loadComandeEventConfig(String protocolId, String sceneName) { +// CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); +// if (ObjectUtil.isEmpty(commandEventConfig)) { +// log.error("协议{},没有配置成功接收回复配置,清排查原因"); +// return null; +// } +// String replyJson = commandEventConfig.getReplyContentJson(); +// List> replyMapList = JSONArray.parseObject(replyJson, List.class); +// List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); +// Map fixMap = fixList.stream() +// .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); +// List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) +// .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) +// .collect(Collectors.toList()); +// Map commandConfigMap = new HashMap<>(); +// commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); +// commandConfigMap.put("fixContent", fixMap); +// commandConfigMap.put("bizContent", contentList); +// return commandConfigMap; + return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 128b09d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java deleted file mode 100644 index 4016b0b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface DatagramEventMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java deleted file mode 100644 index 597c306..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.apache.ibatis.annotations.Mapper; - -public interface FieldConfigMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java deleted file mode 100644 index a31680a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.PreRuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface PreRuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java deleted file mode 100644 index 9060a69..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface ProtocolConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java deleted file mode 100644 index 6fa6936..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java deleted file mode 100644 index 582a705..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleDict; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleDictMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java deleted file mode 100644 index 6e302c8..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.CommandEventMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Optional; - -@Component -public class CommandEventDao { - - @Resource - private CommandEventMapper commandEventMapper; - - public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId) - .eq("scene", sceneName) - .eq("enabled", 1); - List commandEventConfig = commandEventMapper.selectList(queryWrapper); - Optional optionalEventConfig = commandEventConfig.stream().findFirst(); - return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java deleted file mode 100644 index 9137e4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.FieldConfigMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class FieldConfigDao { - - @Resource - private FieldConfigMapper fieldConfigMapper; - - public FieldConfig getFieldConfigById(String fieldId) { - FieldConfig fieldConfig = fieldConfigMapper.selectById(fieldId); - return fieldConfig; - } - - public List getFieldConfigs(String protocolId,Integer isFixed) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",isFixed); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - - public List getStorageFieldConfig(String protocolId) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",1) - .eq("is_storage",1); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java deleted file mode 100644 index 67bff6b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.mapper.PreRuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class PreRuleConfigDao { - - @Resource - private PreRuleConfigMapper preRuleConfigMapper; - - public List getPreRuleList(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return preRuleConfigMapper.selectList(queryWrapper); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java deleted file mode 100644 index d69ea85..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.RuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleConfigDao { - - @Resource - private RuleConfigMapper ruleConfigMapper; - - public RuleConfig getNextRuleConfig(String ruleFields) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("parse_rule_json", ruleFields); - return ruleConfigMapper.selectOne(queryWrapper); - } - - - public List getRuleConfigById(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return ruleConfigMapper.selectList(queryWrapper); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java deleted file mode 100644 index 932c185..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.RuleDictMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleDictDao { - - @Resource - private RuleDictMapper ruleDictMapper; - - public List getRuleDictConfig() { - List ruleDictList = ruleDictMapper.selectList(null); - return ruleDictList; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java index 9f9e279..43bc4d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java @@ -10,20 +10,15 @@ import io.netty.channel.socket.nio.NioServerSocketChannel; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import javax.annotation.PreDestroy; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static cn.hutool.core.util.ClassUtil.getClasses; /** * SensorhubServer netty服务端 */ @Slf4j -@Service +@Component public class SensorhubServer { /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java index 2c79ff5..9a28c36 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java @@ -11,13 +11,13 @@ import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioSocketChannel; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClient 客户端 */ @Slf4j -@Service +@Registry public final class SensorhubClient { public static void main(String[] args) throws Exception { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java index 9774be0..477c3f7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java @@ -6,12 +6,12 @@ import io.netty.channel.socket.SocketChannel; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientChannelInitialHandler */ -@Service +@Registry public class SensorhubClientChannelInitialHandler extends ChannelInitializer { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java index 346f4b3..73560e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java @@ -5,13 +5,13 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientHandler */ @Slf4j -@Service +@Registry public class SensorhubClientHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java index 5c1c6f2..d990af5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java @@ -4,12 +4,12 @@ import com.casic.missiles.pojo.Msg; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** * SensorhubServerHandler */ -@Service +@Component public class SensorhubServerHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 67283ae..af3172c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,41 +1,37 @@ package com.casic.missiles.parser; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultProtocolConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.*; +import com.casic.missiles.registry.FieldConfigRegistry; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; -import java.nio.charset.Charset; import java.util.HashMap; import java.util.List; import java.util.Map; -@Service("genericProtocolParser") +/** + * @author + */ +@Component("genericProtocolParser") @Slf4j -@AllArgsConstructor +@RequiredArgsConstructor public class GenericProtocolParser implements ProtocolParser { - private final LeadingCodeMatcher leadingCodeMatcher; private final List frameStructDispenserList; - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorInstanceSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; // 匹配首字母前导码=> 帧结构匹配前导码=> // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 @@ -44,18 +40,19 @@ public Boolean doParseProtocol(ByteBuf byteBuf) { String protocolContent = ByteBufUtil.hexDump(byteBuf); //匹配前导码 - List preCodeConfigs = leadingCodeMatcher.matchLeadingCode(protocolContent); + List preCodeConfigs = LeadingCodeMatcher.matchFrameLeadingCode(protocolContent); //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 if (preCodeConfigs.size() == 0) { - return rematch(byteBuf,protocolContent); + return rematch(byteBuf, protocolContent); } - //暂时先取第一个 + //暂时先取第一个,提升速度,使用享元模式, 减少类的创建销毁与构建 ProtocolConfig protocolConfig = preCodeConfigs.get(0); + AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); ByteBuf wholeDatagramByte = null; //通过匹配帧结构获取完整的数据包 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, preCodeConfigs.get(0))) != null) { + if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, protocolFactory)) != null) { break; } } @@ -68,76 +65,78 @@ * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 */ - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId, wholeDatagramByte); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap, protocolId); - //选取规则对应的流程实例 - DatagramEventConfig datagramEventConfig = processorInstanceSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); + //进行规则字段解析,进行匹配规则 + RuleConfig ruleConfig = getRuleConfig(protocolFactory, wholeDatagramByte); + if (ruleConfig == null) { + return false; + } //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, wholeDatagramByte); + ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte); + //以下进行业务的规则解析,同时选定流程实例 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); + DatagramEventProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain, + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText, protocolId); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain); //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); + datagramEventProvider.storeData(bizDataMap); return true; } - private Boolean rematch(ByteBuf byteBuf,String protocolContent) { + /** + * 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 + */ + private Boolean rematch(ByteBuf byteBuf, String protocolContent) { //重置位判断 byteBuf.resetReaderIndex(); //判断重置是否前移,如果没有前移,则直接判为匹配失败 if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { return false; } else { + //递归执行 return doParseProtocol(byteBuf); } } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; + //获取匹配规则->匹配规则 + private RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + //取出其中参与逻辑provider并判空 + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); + String rulePrepareFields = protocolConfig.getRulePrepareFields(); + //固定字段 + if (StringUtils.isNotEmpty(rulePrepareFields)) { + //获取统一固定字段解析 + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + //获取该协议的字段配置,用于协议规则匹配 + List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); + //获取规则 + RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, + rulePrepareFields, protocolFieldConfigs); + return ruleConfig; + } + return null; } - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + //数据构建,获取固定字段的store和业务字段store + private Map buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + Map bizDataMap = new HashMap<>(); + Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); + Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); + bizDataMap.putAll(ruleStoreObjectMap); + bizDataMap.putAll(protocolStoreObjectMap); return bizDataMap; } - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java index 8a46e32..16ce2e5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java @@ -3,6 +3,7 @@ import io.netty.buffer.ByteBuf; public interface ProtocolParser { + Boolean doParseProtocol(ByteBuf byteBuf); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java new file mode 100644 index 0000000..f7814af --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java @@ -0,0 +1,35 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.ProtocolConfigProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.ProtocolConfig; + +/** + * 存放基本协议的的加载信息 + */ +public class AbstractProtocolConfigFactory { + private final ProtocolConfigProvider protocolConfigProvider; + private final ProtocolFieldConfigProvider protocolFieldConfigProvider; + private final RuleConfigProvider ruleConfigProvider; + + public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { + this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); + this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); + this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); + } + + public ProtocolConfigProvider getProtocolConfigProvider() { + return protocolConfigProvider; + } + + public ProtocolFieldConfigProvider getProtocolFieldConfigProvider() { + return protocolFieldConfigProvider; + } + + public RuleConfigProvider getRuleConfigProvider() { + return ruleConfigProvider; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java new file mode 100644 index 0000000..6e36147 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java @@ -0,0 +1,57 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.CombinedFieldConfigProvider; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.FieldConfigProvider; +import com.casic.missiles.parser.provider.FieldRuleConfigProvider; + +/** + * 存放规则相关的的的加载信息 + */ +public class AbstractRuleConfigFactory { + + /** + * 处理字节 + */ + private final FieldConfigProvider fieldConfigProvider; + /** + * 处理组合字节解析的解码器 + */ + private final CombinedFieldConfigProvider combinedFieldConfigProvider; + /** + * 处理负责字节解析的规则配置 + */ + private final FieldRuleConfigProvider fieldRuleConfigProvider; + /** + * 处理实例流程 + */ + private final DatagramEventProvider datagramEventProvider; + + + public AbstractRuleConfigFactory(Long ruleId) { + this.fieldConfigProvider = new FieldConfigProvider(ruleId); + this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); + this.fieldRuleConfigProvider = new FieldRuleConfigProvider(ruleId); + this.datagramEventProvider = new DatagramEventProvider(ruleId); + } + + public FieldConfigProvider getFieldConfigProvider() { + return fieldConfigProvider; + } + + public CombinedFieldConfigProvider getCombinedFieldConfigProvider() { + return combinedFieldConfigProvider; + } + + public FieldRuleConfigProvider getFieldRuleConfigProvider() { + return fieldRuleConfigProvider; + } + + public DatagramEventProvider getDatagramEventProvider() { + return datagramEventProvider; + } + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java deleted file mode 100644 index 6e1719a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.factory; - - -import com.casic.missiles.pojo.ProtocolConfig; - -import java.util.List; - -/** - * 数据库访问优化(暂时未做) - *

- * 1、初始化协议解析配置,并存放到处存放缓存,对协议基本配置进行管理 - * 2、其中流程中所有的配置都经过此类进行管理,进行调用获取,增强解析速度 - */ -public interface DatagramFactory { - - /** - * 初始化 - */ - List datagramInit(); - - /** - * 根据前导码配置匹配,模糊匹配获取所有的报文项 - */ - List match(); - - /** - * 根据前导码匹配,返回报文项 - */ - List filer(); - - /** - * 保证数据的唯一性选择器 - */ - List selectOne(); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java new file mode 100644 index 0000000..87444a0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java @@ -0,0 +1,18 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +import java.util.List; + +/** + * 直接用,还是边用边创建 + */ +public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { + + + public DefaultProtocolConfigFactory(ProtocolConfig protocolConfig) { + super(protocolConfig); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java new file mode 100644 index 0000000..cce0c7c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java @@ -0,0 +1,12 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; + +public class DefaultRuleFactory extends AbstractRuleConfigFactory { + + public DefaultRuleFactory(Long ruleId) { + super(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java deleted file mode 100644 index 9ee97e0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.casic.missiles.parser.instance; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service -@Slf4j -@AllArgsConstructor -public class GeneralProcessor { - - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; - - /** - * 统一固定字段解析=>进行规则的查询的判断 - * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 - * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 - */ - @Deprecated - public boolean parseWholeDatagram(ByteBuf buffer, ProtocolConfig protocolConfig) { - try { - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap,protocolId); - //选取规则对应的流程= - DatagramEventConfig datagramEventConfig = processorSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); - //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); - //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); - //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); - //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); - //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); - return true; - } catch (Exception ex) { - log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", - ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); - return false; - } - } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; - } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); - } - - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); - return bizDataMap; - } - - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java index 25e7ad8..6a5777e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java @@ -1,23 +1,31 @@ package com.casic.missiles.parser.instance.impl; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.mapper.DatagramEventMapper; import com.casic.missiles.pojo.DatagramEventConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.SpringContextUtil; -@Service -@AllArgsConstructor +import java.util.List; +import java.util.Optional; + +/** + * @author cz + * + */ public class DefaultProcessorInstanceSelector implements ProcessorInstanceSelector { - private final DatagramEventMapper datagramEventMapper; + private static List datagramEventConfigs; + + static { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + datagramEventConfigs = datagramEventRegistry.getDatagramEventList(); + } @Override public DatagramEventConfig getProcessorInstance(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("rule_id", protocolId); - return datagramEventMapper.selectOne(queryWrapper); + Optional optionalSelectInstance = datagramEventConfigs.stream() + .filter(e -> e.getId().equals(protocolId)).limit(1).findFirst(); + return optionalSelectInstance.isPresent() ? optionalSelectInstance.get() : null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a778671..7b56a43 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,16 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import io.netty.buffer.ByteBuf; /** - * 分析匹配情况 - * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 - * 2、匹配不成功,有后续帧,可以进行下次匹配。 - * 3、匹配不成功,无后续帧,可以进行丢弃。 + * 分析匹配情况 + * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 + * 2、匹配不成功,有后续帧,可以进行下次匹配。 + * 3、匹配不成功,无后续帧,可以进行丢弃。 */ -public interface FrameStructMatcher{ +public interface FrameStructMatcher { - ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig); + ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 05320ab..8ebea78 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,23 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.ProtocolConfigMapper; +import com.casic.missiles.parser.provider.ProtocolConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Component; import java.util.List; import java.util.stream.Collectors; -@Component -@AllArgsConstructor public class LeadingCodeMatcher { - private final ProtocolConfigMapper protocolMapper; - //** 1、首字母匹配前导码, // 2、以匹配出的前导码是否在报文中条件进行前导码的匹配二次筛选 - public List matchLeadingCode(String protocolContent){ + public static List matchFrameLeadingCode(String protocolContent){ List initialConfigs = initialMatch(protocolContent); List preCodeConfigs = initialConfigs.stream() .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) @@ -26,13 +19,16 @@ } //初始化匹配前导码内容 - private List initialMatch(String protocolContent) { - String protocolStr = protocolContent.charAt(0) + ""; - QueryWrapper queryWrapper = new QueryWrapper() - .likeRight("pre_fix", protocolStr); - List protocolConfigList = protocolMapper.selectList(queryWrapper); - return protocolConfigList; + private static List initialMatch(String protocolContent) { + String firstFrameChar = protocolContent.charAt(0) + ""; + ProtocolConfigProvider protocolConfigProvider=new ProtocolConfigProvider(firstFrameChar); + return protocolConfigProvider.getMatchList(); } + + + + + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index cf2113d..e915877 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -1,32 +1,35 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(0) -@Service +@Component public class FrameLengthMatcher implements FrameStructMatcher { - @Autowired - private FieldParser fieldParser; - //超过长度 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { String dataGramContent = ByteBufUtil.hexDump(byteBuf); - if (StringUtils.isEmpty(protocolConfig.getUnpackId()) && StringUtils.isEmpty(protocolConfig.getTailStr())) { - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + //当不存在结尾标志和拆包标志,可以直接使用长度进行匹配 + if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { if (dataGramContent.length() >= totalLength) {//等于长度返回true,超出长度,切断 - ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, protocolConfig, totalLength); + ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, totalLength); return wholeDatagramByte; } else { //读的标志位前移舍弃 @@ -38,7 +41,7 @@ return null; } - private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, Integer totalLength) { byteBuf.readBytes(totalLength); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, totalLength - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 2bfc213..d527ad0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; @@ -13,7 +13,7 @@ import lombok.AllArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.nio.charset.Charset; import java.util.Map; @@ -22,32 +22,30 @@ * 后续标志验证 */ @Order(1) -@Service +@Component @AllArgsConstructor -public class FrameMarkMatcher implements FrameStructMatcher { - - private final FieldConfigDao fieldConfigDao; - private final FieldParser fieldParser; - private final FieldResolver fieldResolverManger; +public class FrameMarkMatcher implements FrameStructMatcher, FixedPropertyEnum { //帧后续标志=>结束,进行帧的重组=>有后续,1、帧移位判别 2、继续接收帧 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig UnpackConfig = StringUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getUnpackId()); - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); - Integer upback = 0; + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); ByteBuf mergeWholeFrameByte = null; - if (!ObjectUtil.isEmpty(UnpackConfig)) { - while (hasNextFullFrame(byteBuf, protocolConfig)) { - upback = (Integer) fieldResolverManger.filedParserManger(byteBuf, UnpackConfig, null); + if (!ObjectUtil.isEmpty(unpackFlag)) { + while (hasNextFullFrame(byteBuf, protocolConfig, protocolFieldConfigProvider)) { //是否存在后续位 - if (upback == 1) {//使用esayRule + if (unpackFlag == 1) {//使用esayRule //表示可以截取 - mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolConfig, totalLength); + mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolFieldConfigProvider, protocolConfig); return mergeWholeFrameByte; } else { - byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig)); + byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig, protocolFieldConfigProvider)); } } } @@ -56,7 +54,8 @@ //选取第一个帧,将业务内容和后面部分分开 //计算数据报文-业务内容 - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolFieldConfigProvider protocolFieldConfigProvider, ProtocolConfig protocolConfig) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); //截取完整报文 byteBuf.readBytes(totalLength); ByteBuf byteBufContent = byteBuf.slice(0, byteBuf.readerIndex()); @@ -68,15 +67,15 @@ String tail = ""; System.out.println(ByteBufUtil.hexDump(byteBufContent)); //会存在多个帧拼接在一起的的情况,进行合并处理 - while (hasNextFullFrame(byteBufContent, protocolConfig)) { - Integer currentFrameLength = fieldParser.getTotalLength(protocolConfig, byteBufContent); + while (hasNextFullFrame(byteBufContent, protocolConfig, protocolFieldConfigProvider)) { + Integer currentFrameLength = protocolFieldConfigProvider.getTotalLength(byteBufContent, protocolConfig); byteBufContent.readBytes(currentFrameLength); ByteBuf currentbyteBuf = byteBufContent.slice(0, byteBufContent.readerIndex()); byteBufContent.markReaderIndex();//读的标志位前移 System.out.println(ByteBufUtil.hexDump(byteBufContent)); String hexDump = currentbyteBuf.toString(Charset.forName("ISO-8859-1")); //获取当前固定帧结构的关系map - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, currentbyteBuf); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(currentbyteBuf, protocolConfig); if (StringUtils.isEmpty(mergeFrameStr)) { //首次获取业务数据报文 mergeFrameStr += hexDump.substring(0, currentFrameFixedProperty.get("tailPosition")); @@ -95,22 +94,22 @@ /** * 获取平移到下一帧起始位置 */ - public int getNextFrameOffset(ByteBuf buffer, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, buffer); - return currentFrameFixedProperty.get("totalLength"); + public int getNextFrameOffset(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + return currentFrameFixedProperty.get(TOTAL_LENGTH); } /** * 判断是否出错进行整个帧的 */ - public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, byteBuf); + public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); //保证读取位置不在固定位置,是可变的业务内容 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("fixedPosition")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(FIXED_POSITION)) { return false; } //判断读取是否操作帧长度 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("totalLength")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(TOTAL_LENGTH)) { return false; } return true; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 76a3784..c3a1bab 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -1,50 +1,50 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.parser.instance.GeneralProcessor; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; +import io.netty.buffer.ByteBufUtil;; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(2) -@Service +@Component public class FrameTailMatcher implements FrameStructMatcher { - @Resource - private FieldConfigDao fieldConfigDao; - @Autowired - private GeneralProcessor generalProcessor; - //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig tailFieldConfig = StringUtils.isEmpty(protocolConfig.getTailStr()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getTailStr()); - if (!ObjectUtil.isEmpty(tailFieldConfig)) { - String tailStr = tailFieldConfig.getFieldName(); + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfig protocolFieldConfig = ObjectUtils.isEmpty(protocolConfig.getTailStr()) ? null : + fieldConfigProvider.getFieldConfigById(protocolConfig.getTailStr()); + if (!ObjectUtil.isEmpty(protocolFieldConfig)) { + String tailStr = protocolFieldConfig.getFieldName(); String dataGramContent = ByteBufUtil.hexDump(byteBuf); Boolean tailFlag = ByteBufUtil.hexDump(byteBuf).contains(tailStr); if (!tailFlag) { //使用esayRule return null; } else if (dataGramContent.indexOf(tailStr) < dataGramContent.length() - tailStr.length()) { Integer length = dataGramContent.indexOf(tailStr) + tailStr.length(); - ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, protocolConfig, length); + ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, length); return wholeDatagramByte; //存在粘包 } } return null; } - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer length) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, Integer length) { byteBuf.readBytes(length); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, length - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java new file mode 100644 index 0000000..5f1c177 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java @@ -0,0 +1,73 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.combined.GenericCombinedFieldResolver; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.CombinedFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class CombinedFieldConfigProvider { + + + /** + * 作为临时配置列表缓存使用 + */ + private final List combinedFieldConfigList; + private Map storeObjectMap = new HashMap<>(); + + public CombinedFieldConfigProvider(Long ruleId) { + CombinedFieldConfigRegistry combinedFieldConfigRegistry = SpringContextUtil.getBean(CombinedFieldConfigRegistry.class); + combinedFieldConfigList = combinedFieldConfigRegistry.getCombinedFieldConfigList(ruleId); + } + + public void parseDataField(RuleConfig ruleConfig, String clearZeroPlain,Map fieldConfigsMap ) { + if (showSkip()) { + return; + } + //匹配对应的数据,然后进行相关的字段解析 + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver(); + combinedFieldResolver.parseDataField(combinedFieldConfigList, byteBuf, storeObjectMap,fieldConfigsMap); + } + + + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getCombinedFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return combinedFieldConfigList.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public List getCombinedFieldConfigList() { + return combinedFieldConfigList; + } + + /* 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(combinedFieldConfigList) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java new file mode 100644 index 0000000..f3cfedc --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java @@ -0,0 +1,11 @@ +package com.casic.missiles.parser.provider; + +/** + * @author cz + * @date 2023-6-12 + */ +public class CommandEventProvider{ + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java new file mode 100644 index 0000000..70eec5e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java @@ -0,0 +1,77 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.safe.SafeStrategy; +import com.casic.missiles.parser.sender.DataSubscribeProvider; +import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class DatagramEventProvider { + + private final DatagramEventConfig processorInstance; + + public DatagramEventProvider(Long ruleId) { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + List datagramEventConfigList = + datagramEventRegistry.getDatagramEventList(ruleId); + processorInstance = this.getProcessorInstance(datagramEventConfigList); + } + + public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { + if (showSkip()) { + return null; + } + return datagramEventConfigList.get(0); + } + + // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 + public String getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap) { + String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? + processorInstance.getSafeBean() : + fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); + if (!StringUtils.isEmpty(safeName)) { + //需要加密 + SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); + String plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); + return clearComplementZero(plain); + } + return ByteBufUtil.hexDump(bizDataContent); + } + + //解密清零操作 + private String clearComplementZero(String plain) { + plain = plain.substring(0, plain.lastIndexOf("00")); + return plain; + } + + //数据发送,数据发送者暂未构建 + public void storeData(Map bizDataMap) { + DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); +// dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return ObjectUtils.isNotEmpty(processorInstance) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java new file mode 100644 index 0000000..7e1fe0a --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java @@ -0,0 +1,97 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.FieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class FieldConfigProvider { + + + private final List fieldConfigs; + private Map storeObjectMap = new HashMap<>(); +// private Map singleObjects = new ConcurrentHashMap<>(); + + public FieldConfigProvider(Long ruleId) { + FieldConfigRegistry fieldConfigRegistry = SpringContextUtil.getBean(FieldConfigRegistry.class); + fieldConfigs = fieldConfigRegistry.getFieldConfigList(ruleId); + } + + public List getFieldConfigs() { + return fieldConfigs; + } + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public Map parseDataField(RuleConfig ruleConfig, String clearZeroPlain) { + if (showSkip()) { + return null; + } + List prepareFieldConfig = prepareParseField(ruleConfig); + if (CollectionUtils.isNotEmpty(prepareFieldConfig)) { + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(fieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + return fixDataMap; + } + } + return null; + } + + /** + * 得到需要处理的业务内容 + * + * @return + */ + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return fieldConfigs.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public Map getFieldConfigsMap() { + return fieldConfigs.stream().collect( + Collectors.toMap(FieldConfig::getId, e -> e) + ); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(fieldConfigs) ? false : true; + } + + +} + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java new file mode 100644 index 0000000..817bfaf --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java @@ -0,0 +1,19 @@ +package com.casic.missiles.parser.provider; + +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.registry.FieldRuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; + +public class FieldRuleConfigProvider { + + private final List fieldRuleConfigList; + + public FieldRuleConfigProvider(Long ruleId) { + FieldRuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(FieldRuleConfigRegistry.class); + fieldRuleConfigList = ruleConfigRegistry.getFieldRuleConfigList(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java new file mode 100644 index 0000000..99a1b06 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java @@ -0,0 +1,53 @@ +package com.casic.missiles.parser.provider; + + +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.registry.ProtocolConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolConfigProvider { + + private final List protocolConfigList; + + public ProtocolConfigProvider(String firstChar) { + ProtocolConfigRegistry registry = SpringContextUtil.getBean(ProtocolConfigRegistry.class); + protocolConfigList = registry.getProtocolConfigList(firstChar); + } + + public List getMatchList() { + return protocolConfigList; + } + + /** + * 设置当前协议 + * + * @param protocolConfig + */ + public ProtocolConfigProvider(ProtocolConfig protocolConfig) { + List protocolConfigs = new ArrayList<>(); + protocolConfigs.add(protocolConfig); + protocolConfigList = protocolConfigs; + } + + /** + * 获取当前协议 + * + * @return + */ + public ProtocolConfig getCurrentProtocolConfig() { + if (this.protocolConfigList == null) { + return null; + } else { + return protocolConfigList.get(0); + } + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java new file mode 100644 index 0000000..043927d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java @@ -0,0 +1,213 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.registry.ProtocolFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolFieldConfigProvider { + + private static final String FIXED_FIELD_DS = "fixedFieldDs"; + private static final String CONTENT_FIELD_DS = "contentFieldDs"; + private static final String PROTOCOL_LENGTH = "protocolLength"; + private static final String PROTOCOL_FIELD_ID = "protocolFieldId"; + private static final String PROTOCOL_POSITION = "protocolPosition"; + + private final List protocolFieldConfigs; + private Map singleObjects = new ConcurrentHashMap<>(); + private Map storeObjectMap = new HashMap<>(); + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public ProtocolFieldConfigProvider(Long protocolId) { + ProtocolFieldConfigRegistry protocolFieldConfigRegistry = SpringContextUtil.getBean(ProtocolFieldConfigRegistry.class); + protocolFieldConfigs = protocolFieldConfigRegistry.getProtocolFieldConfigList(protocolId); + } + + public List getProtocolFieldConfigs() { + return protocolFieldConfigs; + } + + public ProtocolFieldConfig getFieldConfigById(Long fieldId) { + Optional optionalConfig = protocolFieldConfigs.stream().filter( + e -> e.getId().equals(fieldId) + ).findFirst(); + return optionalConfig.isPresent() ? optionalConfig.get() : null; + } + + public Integer getProtocolFieldValue(Long protocolFieldId, ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_FIELD_ID + protocolFieldId + ByteBufUtil.hexDump(byteBuf); + //获取缓存 + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + //加载固定长度数据集合 + Map fixDataMap = this.getProtocolDataMap(byteBuf); + ProtocolFieldConfig protocolFieldConfig = selectFieldConfig(protocolFieldId); + Integer protocolFieldValue = 0; + //获取约定字段的总长度 + if (fixDataMap.containsKey(protocolFieldConfig.getFieldName())) { + Object appointUnpackObject = fixDataMap.get(protocolFieldConfig.getFieldName()); + if (ObjectUtils.isNotEmpty(appointUnpackObject)) { + protocolFieldValue = (Integer) appointUnpackObject; + } + } + if (protocolFieldValue != null) { + //加入缓存 + if (ObjectUtils.isNotEmpty(protocolFieldValue)) { + this.singleObjects.put(catchKey, protocolFieldValue); + return protocolFieldValue; + } + } + return null; + } + + /** + * 获取帧固定位置信息 + * + * @param byteBuf + * @param protocolConfig + * @return + */ + public Map getFixedProperty(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_POSITION + protocolConfig.getId(); + if (this.singleObjects.containsKey(catchKey)) { + return (Map) singleObjects.get(catchKey); + } + Map fixedPropertyMap = new HashMap<>(); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + fixedPropertyMap = fieldParser.doGetFixedProperty(protocolFieldConfigs, this.getTotalLength(byteBuf,protocolConfig)); + if (CollectionUtils.isNotEmpty(fixedPropertyMap)) { + this.singleObjects.put(catchKey, fixedPropertyMap); + return fixedPropertyMap; + } + return fixedPropertyMap; + } + + /** + * 获取帧结构应有的总长度 + */ + public Integer getTotalLength(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_LENGTH + ByteBufUtil.hexDump(byteBuf); + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + Integer appointFrameLength = getProtocolFieldValue(protocolConfig.getTotalLengthId(), byteBuf); + if (appointFrameLength != null) { + //获取过滤的字段集合总长度 + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Integer totalFilterLength = fieldParser.getTotalFilterLength(protocolConfig, byteBuf, getFixFieldConfigMap()); + //计算总长度 + Integer totalLength = appointFrameLength + totalFilterLength; + //加入缓存 + if (ObjectUtils.isNotEmpty(totalLength)) { + this.singleObjects.put(catchKey, totalLength); + return totalLength; + } + } + return null; + } + + /** + * 获取协议有关字段解析内容 + * storeObjectMap存储代转存的数据 + * + * @return + */ + public Map getProtocolDataMap(ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(FIXED_FIELD_DS)) { + return (Map) singleObjects.get(FIXED_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(protocolFieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + this.singleObjects.put(FIXED_FIELD_DS, fixDataMap); + return fixDataMap; + } + return null; + } + + /** + * 获取业务报文内容的content字节 + * + * @param wholeDatagramByte + * @return + */ + public ByteBuf getDataContentBuf(ByteBuf wholeDatagramByte) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(CONTENT_FIELD_DS)) { + return (ByteBuf) singleObjects.get(CONTENT_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + ByteBuf bizDataByteBuf = fieldParser.getDataContentBuf(protocolFieldConfigs, wholeDatagramByte); + if (bizDataByteBuf != null) { + this.singleObjects.put(CONTENT_FIELD_DS, bizDataByteBuf); + return bizDataByteBuf; + } + return null; + } + + + private ProtocolFieldConfig selectFieldConfig(Long id) { + Optional optionalProtocolFieldConfig = this.protocolFieldConfigs.stream().filter( + e -> e.getId().equals(id) + ).findFirst(); + return optionalProtocolFieldConfig.isPresent() ? optionalProtocolFieldConfig.get() : null; + } + + + private Map getFixFieldConfigMap() { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, e -> e) + ); + return fixDataFieldMap; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(protocolFieldConfigs) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java new file mode 100644 index 0000000..dafba1c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java @@ -0,0 +1,56 @@ +package com.casic.missiles.parser.provider; + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.rule.GenericRuleResolver; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.RuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleConfigProvider { + + private final List ruleConfigs; + + public List getRuleConfigs() { + return ruleConfigs; + } + + public RuleConfigProvider(Long protocolId) { + RuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(RuleConfigRegistry.class); + ruleConfigs = ruleConfigRegistry.getRuleConfigById(protocolId); + } + + /** + * 获取规则匹配结果 + * + * @param parseFixedDataMap + * @param protocolFieldConfigs + * @return + */ + public RuleConfig doGetRule(Map parseFixedDataMap, + String ids, + List protocolFieldConfigs) { + if (showSkip()) { + return null; + } + RuleConfig ruleConfig = GenericRuleResolver.machRule(parseFixedDataMap, ids, protocolFieldConfigs, ruleConfigs); + return ruleConfig; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(ruleConfigs) ? false : true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java index 3c05891..856b399 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java @@ -1,18 +1,11 @@ package com.casic.missiles.parser.resolver; -import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.springframework.web.bind.annotation.RequestBody; -import javax.annotation.Resource; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -20,19 +13,17 @@ @Slf4j public class ByteMergeProvider { - @Resource - private FieldRuleEngineMapper fieldRuleEngineMapper; - //拿到所有的值合并到一个值 - public String resolveByteMerge(List valueList, String ruletypeId, String vaildRange) { + public static String resolveByteMerge(List valueList, String ruleTypeId, String vaildRange) { String values = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Map vaildMap = getValidRangeMap(vaildRange); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(ruletypeId); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } + //暂时不处理 +// fieldRuleEngine = fieldRuleConfigMapper.selectById(ruleTypeId); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } Map env2 = new HashMap(); for (int i = 0; i < valueList.size(); i++) { if (vaildMap.containsKey(i)) { @@ -47,7 +38,7 @@ } } - private Map getValidRangeMap(String vaildRange) { + private static Map getValidRangeMap(String vaildRange) { String[] range = vaildRange.split(","); Map vaildMap = new HashMap(); for (int i = 0; i < range.length; i++) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 8d821cd..85d6bbf 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -1,9 +1,12 @@ package com.casic.missiles.parser.resolver; +import com.casic.missiles.pojo.AbstractFieldConfig; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; import io.netty.buffer.ByteBuf; +import java.util.List; import java.util.Map; /** @@ -11,18 +14,14 @@ */ public interface FieldParser { -// Map fieldProcess(String protocolContent,); - Map dataParser(RuleConfig ruleConfig, String lightText,String protocolId); + Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength); - Map fixDataParser(String protocolId, ByteBuf buffer); + Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap); - Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf); + ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer); - ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer); - - ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer); - - Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer); + Integer getTotalFilterLength(ProtocolConfig protocolConfig, ByteBuf byteBuf, Map protocolFieldConfigMap); } + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java new file mode 100644 index 0000000..9e0c00e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java @@ -0,0 +1,52 @@ +package com.casic.missiles.parser.resolver; + +import com.casic.missiles.pojo.AbstractFieldConfig; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.util.List; + +public class FieldParserSupport { + + //分别计算bit和byte长度=> 合并长度 + protected Integer calculateLength(List fieldConfigList) { + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + Integer fixedLength = bytefixedLength + bitfixedLength / 8; + return fixedLength; + } + + //找到最大值=> 根据最大值计算业务数据下标 + protected Integer calculatePosition(List fieldConfigList) { + String rex = "[0-9]+"; + Integer max = -1; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) + && Integer.valueOf(fieldConfig.getOriginPositionByte()) > max) { + max = Integer.valueOf(fieldConfig.getOriginPositionByte()); + } + } + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) && fieldConfig.getOriginPositionByte().equals(max)) { + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + } + } + Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; + return maxFixedPosition; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java deleted file mode 100644 index dd3a6cd..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java +++ /dev/null @@ -1,170 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.ByteResolverParam; -import io.netty.buffer.ByteBuf; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -/** - * 字段解析管理总类 - */ -@Service -@Slf4j -@AllArgsConstructor -public class FieldResolver extends ByteMergeProvider { - - //1、字段截取 => 2、简单的字节解析和复杂的字节解析 - public Object filedParserManger(ByteBuf byteBuf, FieldConfig fieldConfig, Integer maxFixedPosition) { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - //最大固定位置不为空, - if (!ObjectUtil.isEmpty(maxFixedPosition)) { - orignPosition -= maxFixedPosition; - } - Object fieldValue = 0; - //待优化 - if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { - fieldValue = bitToResolver(byteBuf, fieldConfig); - } else { - ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); - fieldValue = parsingFields(fieldBytes, fieldConfig.getRuleJson()); - } - return fieldValue; - } - - //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, - //目前默认配置的规则设置暂不支持配置化,由实现完成 - private Object parsingFields(ByteBuf byteBuf, String ruleJson) { - Object fieldsResolveValue = null; - List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); - if (ObjectUtil.isEmpty(ruleMapList)) { - fieldsResolveValue = defaultResolveBuilder(byteBuf); - } else { - fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); - } - return fieldsResolveValue; - } - - private Object defaultResolveBuilder(ByteBuf byteBuf) { - Integer defaultResolveValue = 0; - for (int i = 0; i < byteBuf.writerIndex(); i++) { - defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; - } - return defaultResolveValue; - } - - //字段解析构建器(针对字节单位的) - //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 - // 字节归并结束或者规则结束=>继续根据规则进行判断 - private Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { - Object customizeResolveValue = null; - try { - List bytStrList = new ArrayList<>(); - //存放到数组里面 - for (int i = 0; i < byteBuf.writerIndex(); i++) { - bytStrList.add(byteBuf.readByte()); - } - int i = 0; - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - customizeResolveValue = this.resolveByteMerge(bytStrList, ruletypeId,vaildRange); - break; - } else { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - List tempBytStr = new ArrayList<>(); - for (int k = 0; i < bytStrList.size(); i++) { - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(k) - .value(bytStrList.get(k)) - .ruletypeId(ruletypeId).build(); - tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); - } - bytStrList = tempBytStr; - } - i++; - } - //字节归并到一起=>继续根据规则进行判断 - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(customizeResolveValue) - .ruletypeId(ruletypeId).build(); - customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(customizeResolveValue)); - return customizeResolveValue; - } catch (RuntimeException ex) { - log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); - return null; - } - } - - /** - * 1、单个字节情况表示字段 - * 2、多字节情况表示字段(暂未处理) - */ - private Object bitToResolver(ByteBuf byteBuf, FieldConfig fieldConfig) { - Object fieldValue = new Object(); - try { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - byte fields = 0x00; - if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); - } else { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); - } - - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { - if (!StringUtils.isEmpty(fieldConfig.getExactOrignPosition())) { - fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getExactOrignPosition())).byteValue() - >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); - } else { - fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); - } - } else { - fieldValue = Integer.valueOf(fields & 0xff); - } - if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { - return fieldValue; - } - List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); - int i = 0; - //字节归并到一起=>继续根据规则进行判断 - while (i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(fieldValue) - .ruletypeId(ruletypeId).build(); - fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(fieldValue)); - return fieldValue; - } catch (RuntimeException ex) { - log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); - return null; - } - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java new file mode 100644 index 0000000..1d2aeab --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java @@ -0,0 +1,36 @@ +package com.casic.missiles.parser.resolver.bytes; + +import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.mapper.FieldRuleConfigMapper; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.pojo.ByteResolverParam; +import com.googlecode.aviator.AviatorEvaluator; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; +//转换规则 +@Component("convert") +@AllArgsConstructor +@Slf4j +public class ByteRuleResolver implements ByteResolver { + + private final FieldRuleConfigMapper fieldRuleConfigMapper; + + @Override + public Object resolveOperationRule(ByteResolverParam byteResolverParam){ + FieldRuleConfig fieldRuleEngine=fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); + if(ObjectUtil.isEmpty(fieldRuleEngine)){ + return byteResolverParam.getValue(); + } + String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); + Map env2 = new HashMap(); + env2.put("value", (byte) byteResolverParam.getValue()); + String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); + return values; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java index 103821c..786b71c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java @@ -2,34 +2,34 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("logicalShift") +@Component("logicalShift") @AllArgsConstructor @Slf4j public class LogicalShiftResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //字节位移 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { Integer index = byteResolverParam.getIndex(); - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return byteResolverParam.getValue(); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java index 476747d..01149bd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("operation") +@Component("operation") @AllArgsConstructor @Slf4j public class OperationResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //混合运算,有常量或者乘除的缩放 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java index 0b82cf4..79abcce 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.casic.missiles.pojo.ByteResolverParam; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; //精度计算 -@Service("precision") +@Component("precision") @AllArgsConstructor @Slf4j public class PrecisionResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java deleted file mode 100644 index 5c3f332..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; -//转换规则 -@Service("convert") -@AllArgsConstructor -@Slf4j -public class RuleResolver implements ByteResolver { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam){ - RuleEvaluator fieldRuleEngine=fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); - if(ObjectUtil.isEmpty(fieldRuleEngine)){ - return byteResolverParam.getValue(); - } - String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); - Map env2 = new HashMap(); - env2.put("value", (byte) byteResolverParam.getValue()); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java new file mode 100644 index 0000000..d3bbd91 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java @@ -0,0 +1,15 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; + +import java.util.List; +import java.util.Map; +// 前导码匹配->长度字段 +public interface AbstractCombinedFieldProcessor { + + Map invoke(Map map, ByteBuf byteBuf, List combinedFieldConfigList, + Map fieldConfigsMap, Map storeObjectMap); + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java new file mode 100644 index 0000000..03c8480 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java @@ -0,0 +1,59 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-13 + */ +//依次递增进行数据的解析, +public class GenericCombinedFieldResolver { + + + //通过查询,字段长度长度随机 + public void parseDataField(List combinedFieldConfigList, ByteBuf byteBuf, + Map storeObjectMap, Map fieldConfigsMap) { + Integer frameLength = Integer.valueOf(ByteBufUtil.hexDump(byteBuf)); + //添加前置处理器 + com.casic.missiles.util.ClassUtil classUtil = new com.casic.missiles.util.ClassUtil(); + List abstractCombinedProcessors = classUtil.getSubClassList(AbstractCombinedFieldProcessor.class); + + Map fieldFixedMap = combinedFieldLeadCodeMap(combinedFieldConfigList); + //frameLength + Map combinedProcessorFields = null; + while (byteBuf.readableBytes() < frameLength) { + //一直处理 + for (AbstractCombinedFieldProcessor abstractCombinedProcessor : abstractCombinedProcessors) { + combinedProcessorFields = abstractCombinedProcessor.invoke(combinedProcessorFields, byteBuf, + combinedFieldConfigList, + fieldConfigsMap, storeObjectMap); + if (combinedProcessorFields == null || byteBuf.readableBytes() < frameLength) { + return; + } + } + + } + } + + /** + * 取出前导码匹配集合 + */ + private Map combinedFieldLeadCodeMap(List combinedFieldConfigList) { + Map fieldFixedMap = combinedFieldConfigList + .stream() + .collect(Collectors.toMap(CombinedFieldConfig::getPrefixCode, e -> e)); + return fieldFixedMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java new file mode 100644 index 0000000..643a934 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java @@ -0,0 +1,100 @@ +package com.casic.missiles.parser.resolver.fields; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.FieldParserSupport; +import com.casic.missiles.pojo.*; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 保存使用时最基本的信息,并且使用原型模式 + */ +@Slf4j +public class DefaultProtocolFieldParser extends FieldParserSupport implements FieldParser, FixedPropertyEnum { + + //通过传入的配置和报文进行字段解析 + @Override + public Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap) { + Map dataMap = new HashMap<>(); + for (AbstractFieldConfig protocolFieldConfig : protocolFieldConfigs) { + if (!ObjectUtils.isEmpty(protocolFieldConfig.getOriginPositionByte())) { + Object fieldValue = FieldResolver.parseField(buffer, protocolFieldConfig, null); + if (protocolFieldConfig.getIsStorage() == 1) { + storeObjectMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + dataMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + } + return dataMap; + } + + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength) { + Map fixedPropertyMap = new HashMap<>(); + Integer fixedLength = calculateLength(protocolFieldConfigs); + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + fixedPropertyMap.put(FIXED_POSITION, maxFixedPosition); + fixedPropertyMap.put(TOTAL_LENGTH, totalLength); + fixedPropertyMap.put(TAIL_POSITION, totalLength - fixedLength + maxFixedPosition); + return fixedPropertyMap; + } + + //** 获取业务内容的byteBuf + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer) { + //计算固定长度 + Integer fixedLength = calculateLength(protocolFieldConfigs); + //总长度获取 + String lightText = buffer.toString(Charset.forName("ISO-8859-1")); + Integer totalLength = lightText.length(); + //计算固定长度最大长度 + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + //计算数据报文内容 + ByteBuf bizDataFields = buffer.slice(maxFixedPosition - 1, (totalLength - fixedLength)); + return bizDataFields; + } + + /** + * 获取过滤字段的长度 + */ + @Override + public Integer getTotalFilterLength(ProtocolConfig protocolConfig, + ByteBuf byteBuf, + Map protocolFieldConfigMap) { + if (ByteBufUtil.hexDump(byteBuf).equals("")) { + return 0; + } + int totalFilterLength = 0; + String filterFields = protocolConfig.getTotalLengthFilterFields(); + try { + if (!StringUtils.isEmpty(filterFields)) { + String[] filterFieldList = filterFields.split(","); + for (String filterFieldId : filterFieldList) { + if (StringUtils.isNotEmpty(filterFieldId)) { + ProtocolFieldConfig fieldConfig = protocolFieldConfigMap.get(Long.valueOf(filterFieldId)); + //这里都是按字节计算,没有对位进行区分,可能会出现错误 + // 如果对位有需求,需要进一步跟进 + totalFilterLength += fieldConfig.getOffsetLength(); + } + } + } + return totalFilterLength; + } catch (Exception ex) { + log.error("报文确认分发阶段,获取报文总长度过滤长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); + } + return totalFilterLength; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java new file mode 100644 index 0000000..d51e887 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java @@ -0,0 +1,169 @@ +package com.casic.missiles.parser.resolver.fields; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.parser.resolver.ByteMergeProvider; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.AbstractFieldConfig; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.pojo.ByteResolverParam; +import io.netty.buffer.ByteBuf; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * 字段解析管理总类 + */ +@Slf4j +public class FieldResolver extends ByteMergeProvider { + + //1、字段截取 => 2、简单的字节解析和复杂的字节解析 + public static Object parseField(ByteBuf byteBuf,AbstractFieldConfig fieldConfig, Integer maxFixedPosition) { + Integer orignPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + //最大固定位置不为空, + if (!ObjectUtil.isEmpty(maxFixedPosition)) { + orignPosition -= maxFixedPosition; + } + Object fieldValue = 0; + //待优化 + if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { + fieldValue = doParseBitField(byteBuf, fieldConfig); + } else { + ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); + fieldValue = doParseByteField(fieldBytes, fieldConfig.getRuleJson()); + } + return fieldValue; + } + + //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, + //目前默认配置的规则设置暂不支持配置化,由实现完成 + private static Object doParseByteField(ByteBuf byteBuf, String ruleJson) { + Object fieldsResolveValue = null; + List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); + if (ObjectUtil.isEmpty(ruleMapList)) { + fieldsResolveValue = defaultResolveBuilder(byteBuf); + } else { + fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); + } + return fieldsResolveValue; + } + + private static Object defaultResolveBuilder(ByteBuf byteBuf) { + Integer defaultResolveValue = 0; + for (int i = 0; i < byteBuf.writerIndex(); i++) { + defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; + } + return defaultResolveValue; + } + + //字段解析构建器(针对字节单位的) + //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 + // 字节归并结束或者规则结束=>继续根据规则进行判断 + private static Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { + Object customizeResolveValue = null; + try { + List bytStrList = new ArrayList<>(); + //存放到数组里面 + for (int i = 0; i < byteBuf.writerIndex(); i++) { + bytStrList.add(byteBuf.readByte()); + } + int i = 0; + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { + if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + customizeResolveValue = resolveByteMerge(bytStrList, ruletypeId, vaildRange); + break; + } else { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + List tempBytStr = new ArrayList<>(); + for (int k = 0; i < bytStrList.size(); i++) { + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(k) + .value(bytStrList.get(k)) + .ruletypeId(ruletypeId).build(); + tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); + } + bytStrList = tempBytStr; + } + i++; + } + //字节归并到一起=>继续根据规则进行判断 + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(null) + .value(customizeResolveValue) + .ruletypeId(ruletypeId).build(); + customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); + i++; + } + System.out.println(JSON.toJSON(customizeResolveValue)); + return customizeResolveValue; + } catch (RuntimeException ex) { + log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); + return null; + } + } + + /** + * 1、单个字节情况表示字段 + * 2、多字节情况表示字段(暂未处理) + */ + private static Object doParseBitField(ByteBuf byteBuf,AbstractFieldConfig fieldConfig) { + Object fieldValue = new Object(); + try { + Integer orignPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + byte fields = 0x00; + if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { + fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); + } else { + fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); + } + + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { + if (!StringUtils.isEmpty(fieldConfig.getOriginPositionBit())) { + fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getOriginPositionBit())).byteValue() + >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); + } else { + fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); + } + } else { + fieldValue = Integer.valueOf(fields & 0xff); + } + if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { + return fieldValue; + } + List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); + int i = 0; + //字节归并到一起=>继续根据规则进行判断 + while (i < ruleMapList.size()) { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(null) + .value(fieldValue) + .ruletypeId(ruletypeId).build(); + fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); + i++; + } + System.out.println(JSON.toJSON(fieldValue)); + return fieldValue; + } catch (RuntimeException ex) { + log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); + return null; + } + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java deleted file mode 100644 index 35ae3d0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java +++ /dev/null @@ -1,183 +0,0 @@ -package com.casic.missiles.parser.resolver.fields; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufAllocator; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; -import org.springframework.util.ObjectUtils; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service("standard") -@AllArgsConstructor -@Slf4j -public class StandardFieldParser implements FieldParser { - - private final FieldConfigDao fieldConfigDao; - private final FieldResolver fieldResolver; - - //数据解析 - @Override - public Map dataParser(RuleConfig ruleConfig, String lightText, String protocolId) { - String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); - ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); - bufferContent.writeBytes(lightText.getBytes(Charset.forName("ISO-8859-1"))); - Map dataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - for (String dataFieldId : dataFieldIds) { - FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(dataFieldId); - if (!ObjectUtils.isEmpty(fieldConfig)) { - dataMap.put(fieldConfig.getFieldName(), String.valueOf(fieldResolver.filedParserManger(bufferContent, fieldConfig, maxFixedPosition))); - } - } - return dataMap; - } - - //数据解析 - @Override - public Map fixDataParser(String protocolId, ByteBuf buffer) { - List dataFieldIdList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Map dataMap = new HashMap<>(); - for (FieldConfig dataField : dataFieldIdList) { - if (!ObjectUtils.isEmpty(dataField.getOrignPosition())) { - Object fieldValue = (Integer) fieldResolver.filedParserManger(buffer, dataField, null); - dataMap.put(dataField.getFieldName(), fieldValue); - } - } - return dataMap; - } - - @Override - public Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf) { - if (ByteBufUtil.hexDump(byteBuf).equals("")) { - return 0; - } - String filterFields = protocolConfig.getTotalLengthFilterField(); - Integer totalLength = 0; - try { - FieldConfig totalFieldConfig = fieldConfigDao.getFieldConfigById(protocolConfig.getTotalLengthId()); - int totalFilterLength = 0; - if (!StringUtils.isEmpty(filterFields)) { - String[] filterFieldList = filterFields.split(","); - for (String filterField : filterFieldList) { - FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(filterField); - //这里都是按字节计算,没有对位进行区分,可能会出现错误 - - // 如果对位有需求,需要进一步跟进 - totalFilterLength += fieldConfig.getOffsetLength(); - } - } - totalLength = (Integer) fieldResolver.filedParserManger(byteBuf, totalFieldConfig, null) + totalFilterLength; - } catch (Exception ex) { - log.error("报文确认分发阶段,获取报文总长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); - } - return totalLength; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer) { - //业务内容 - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - String protocolId = String.valueOf(protocolConfig.getId()); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - //计算固定长度 - Integer fixedLength = calculateLength(fieldConfigList); -// Integer totalLength = this.getTotalLength(protocolConfig, buffer); - //总长度获取 - Integer totalLength = lightText.length(); - //计算固定长度最大长度 - Integer maxFixedPosition = calculatePosition(fieldConfigList); -// buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - //计算数据报文内容 - ByteBuf bizDataFields = buffer.slice(maxFixedPosition-1, (totalLength - fixedLength)); - return bizDataFields; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer) { - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - String protocolId = String.valueOf(protocolConfig.getId()); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer fixedLength = calculateLength(fieldConfigList); -// Integer totalLength = this.getTotalLength(protocolConfig, buffer); - Integer totalLength = lightText.length(); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - ByteBuf fixDataFields = buffer.slice(0, maxFixedPosition); - return fixDataFields; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer) { - String protocolId = String.valueOf(protocolConfig.getId()); - Map fixedPropertyMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer fixedLength = calculateLength(fieldConfigList); - Integer totalLength = this.getTotalLength(protocolConfig, buffer); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - fixedPropertyMap.put("fixedPosition", maxFixedPosition); - fixedPropertyMap.put("totalLength", totalLength); - fixedPropertyMap.put("tailPosition", totalLength - fixedLength + maxFixedPosition); - return fixedPropertyMap; - } - - //分别计算bit和byte长度=> 合并长度 - private Integer calculateLength(List fieldConfigList) { - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (FieldConfig fieldConfig : fieldConfigList) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - Integer fixedLength = bytefixedLength + bitfixedLength / 8; - return fixedLength; - } - - //找到最大值=> 根据最大值计算业务数据下标 - private Integer calculatePosition(List fieldConfigList) { - String rex = "[0-9]+"; - Integer max = -1; - for (FieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOrignPosition()) - && Integer.valueOf(fieldConfig.getOrignPosition()) > max) { - max = Integer.valueOf(fieldConfig.getOrignPosition()); - } - } - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (FieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOrignPosition()) && fieldConfig.getOrignPosition().equals(max)) { - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - } - } - Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; - return maxFixedPosition; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java new file mode 100644 index 0000000..d4ec6c7 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java @@ -0,0 +1,76 @@ +package com.casic.missiles.parser.rule; + +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import org.apache.commons.lang3.StringUtils; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class GenericRuleResolver { + + //根据前置字段的值,找到指定的规则 + //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 + //=>循环判断=>通过规则得到业务字段 + public static RuleConfig machRule(Map fixDataMap, + String ids, + List protocolFieldConfigs, + List ruleConfigs) { + List preRuleConfigList = getPreRuleList(ids, protocolFieldConfigs); + //获取前置规则字段 + final Map metaDataMap = getPreRuleFields(preRuleConfigList, fixDataMap); + //准备固定的字段集合 + Map fixDataFieldMap = getFixDataFieldMap(protocolFieldConfigs); + return RuleResolverCore.doMachRule(ruleConfigs, metaDataMap, fixDataMap, fixDataFieldMap); + } + + private static Map getFixDataFieldMap(List protocolFieldConfigs) { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, ProtocolFieldConfig::getFieldName) + ); + return fixDataFieldMap; + } + + + /** + * 查询前置规则的字段配置 + * + * @param ids + * @return + */ + private static List getPreRuleList(String ids, List protocolFieldConfigs) { + String[] idList = ids.split(","); + Map prepareMaps = new HashMap<>(); + for (String id : idList) { + if (StringUtils.isNotEmpty(id)) { + prepareMaps.put(Long.valueOf(id), ""); + } + } + List preRuleConfigList = protocolFieldConfigs + .stream() + .filter(e -> prepareMaps.containsKey(e.getId())) + .collect(Collectors.toList()); + return preRuleConfigList; + } + + /** + * 获取前置规则解析字段 + */ + private static Map getPreRuleFields(List preRuleFieldConfigList, Map fixDataMap) { + Map ruleFieldMap = new HashMap<>(); + preRuleFieldConfigList.stream() + .forEach( + preRuleFieldConfig -> { + String fieldName = preRuleFieldConfig.getFieldName(); + if (fixDataMap.containsKey(fieldName)) { + ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); + } + } + ); + return ruleFieldMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java new file mode 100644 index 0000000..baae7e8 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -0,0 +1,68 @@ +package com.casic.missiles.parser.rule; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.casic.missiles.pojo.RuleConfig; + +import java.util.*; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleResolverCore { + + + public static RuleConfig doMachRule(List ruleConfigList, Map metaDataMap, + Map fixDataMap, + Map fixDataFieldMap) { + Optional ruleConfigOptional = ruleConfigList.stream() + .filter(ruleConfig -> machRuleConfig( + JSON.parseObject(ruleConfig.getMatchRuleJson(), Map.class), metaDataMap)) + .findFirst(); + if (ObjectUtil.isEmpty(ruleConfigOptional)) { + return null; + } + String[] ruleFields = ruleConfigOptional.get().getDataFieldIds().split(","); + Map ruleMetaDataMap = getRuleFields(ruleFields, fixDataMap, fixDataFieldMap); + //递归选定解析规则,进行规则解析 + if (!ruleConfigOptional.get().getIsFinishMatch().equals("1")) { + //递归选定规则 + doMachRule(ruleConfigList, ruleMetaDataMap, fixDataMap, fixDataFieldMap); + } + return ruleConfigOptional.get(); + } + + + private static Map getRuleFields(String[] preRuleConfigList, Map fixedDataMap, + Map fixedFieldMap) { + Map ruleFieldMap = new HashMap<>(); + for (String preRuleConfigId : preRuleConfigList) { + String fieldName = fixedFieldMap.get(preRuleConfigId); + if (fixedDataMap.containsKey(fieldName)) { + ruleFieldMap.put(fieldName, String.valueOf(fixedDataMap.get(fieldName))); + } + } + return ruleFieldMap; + } + + + //匹配规则配置 + private static Boolean machRuleConfig(Map ruleMap, Map metaDataMap) { + if (ruleMap == null || metaDataMap == null) { + return null; + } + //所有的字段在规则里面必须有有配置 + for (String key : metaDataMap.keySet()) { + if (ruleMap.containsKey(key)) { + if (!ruleMap.get(key).equals(metaDataMap.get(key))) { + return false; + } + } else { + return false; + } + } + return true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java deleted file mode 100644 index 664088d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java +++ /dev/null @@ -1,92 +0,0 @@ -package com.casic.missiles.parser.rule; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.mapper.dao.PreRuleConfigDao; -import com.casic.missiles.mapper.dao.RuleConfigDao; -import lombok.AllArgsConstructor; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.*; -import java.util.stream.Collectors; - -@Service -@AllArgsConstructor -public class RulerProvider { - - private final FieldConfigDao fieldConfigDao; - private final PreRuleConfigDao preRuleConfigDao; - private final RuleConfigDao ruleConfigDao; - - //根据前置字段的值,找到指定的规则 - //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 - //=>循环判断=>通过规则得到业务字段 - public RuleConfig ruleConfig(Map fixDataMap, String protocolId) { - //批量获取规则 - List preRuleConfigList = preRuleConfigDao.getPreRuleList(protocolId); - //获取固定字段 - Map fixFieldMap = getAllFieldMap(protocolId); - //获取前置规则字段 - final String preRuleFields = getPreRuleFields(preRuleConfigList, fixDataMap, fixFieldMap); - List ruleConfigList = ruleConfigDao.getRuleConfigById(protocolId); - Optional ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig ->preRuleFields.equals( ruleConfig.getParseRuleJson())).findFirst(); - //递归选定解析规则,进行规则解析 - while (!ObjectUtil.isEmpty(ruleConfigOptional) && !ruleConfigOptional.get().getIsBizField().equals("1")) { - String ruleFields = getRuleFields(ruleConfigOptional.get().getDataFieldIds().split(","), fixDataMap, fixFieldMap); - ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig -> ruleConfig.getParseRuleJson().equals(ruleFields)).findFirst(); - } - return ruleConfigOptional.get(); - } - - /** - * 获取前置规则解析字段 - */ - private String getPreRuleFields(List preRuleConfigList, Map fixDataMap, Map fixFieldMap) { - Map ruleFieldMap= new HashMap<>(); - preRuleConfigList.stream() - .forEach( - preRuleConfig -> { - String fieldName = fixFieldMap.get(Long.valueOf(preRuleConfig.getRuleFieldId())); - if (fixDataMap.containsKey(fieldName)) { - ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); - } - } - ); - return JSONObject.toJSONString(ruleFieldMap); - } - - private Map getAllFieldMap(String protocolId) { - List fieldList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Map fixFieldMap = fieldList.stream().collect( - Collectors.toMap(FieldConfig::getId, FieldConfig::getFieldName) - ); - return fixFieldMap; - } - - private String getRuleFields(String[] preRuleConfigList, Map fixDataMap, Map fixFieldMap) { - Map ruleFieldMap= new HashMap<>(); - for (String preRuleConfigId : preRuleConfigList) { - String fieldName = fixFieldMap.get(preRuleConfigId); - if (fixDataMap.containsKey(fieldName)) { - ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); - } - } - return JSONObject.toJSONString(ruleFieldMap); - } - - //弃置 - private String ListToString(List ruleFieldList) { - String ruleFields = ""; - for (String ruleField : ruleFieldList) { - ruleFields += ruleField + ","; - } - ruleFields = StringUtils.isEmpty(ruleFields) ? ruleFields : ruleFields.substring(0, ruleFields.length() - 1); - return ruleFields; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java index 6177e10..bfa87a5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java @@ -2,7 +2,7 @@ public interface SafeStrategy { - String decryption(byte[] bytes); + String decryption(String cipher); String encryption(String lightText); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java index 618716c..6236302 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java @@ -9,9 +9,9 @@ //十六进制的字符串转换成字节数组 byte[] bytes = hexStrToBinaryStr(msg); //计算CRC8 - byte crc8 = CRC8(bytes, 0, bytes.length); - String crc8ToStr = "" + Integer.toHexString(0xff & crc8); - return crc8ToStr; +// String crc8ToStr = "" + Integer.toHexString(0xff & crc8); +// return crc8ToStr; + return null; } /** @@ -33,50 +33,5 @@ return bytes; } - /** - * CRC8 校验 多项式 x8+x2+x+1 - * - * @param b - * @param off - * @param len - * @return - */ - public static byte CRC8(final byte[] b, final int off, final int len) { - byte result = 0x00; - for (int i = 0; i < len; i++) { - result = CHECKSUM_TABLE[(result ^ (b[i + off] & 0xFF)) & 0xFF]; - } - return (byte) (result & 0xFFL); - } - - private final static byte[] CHECKSUM_TABLE = {(byte) 0x00, (byte) 0x07, (byte) 0x0e, (byte) 0x09, (byte) 0x1c, (byte) 0x1b, - (byte) 0x12, (byte) 0x15, (byte) 0x38, (byte) 0x3f, (byte) 0x36, (byte) 0x31, (byte) 0x24, (byte) 0x23, (byte) 0x2a, - (byte) 0x2d, (byte) 0x70, (byte) 0x77, (byte) 0x7e, (byte) 0x79, (byte) 0x6c, (byte) 0x6b, (byte) 0x62, (byte) 0x65, - (byte) 0x48, (byte) 0x4f, (byte) 0x46, (byte) 0x41, (byte) 0x54, (byte) 0x53, (byte) 0x5a, (byte) 0x5d, (byte) 0xe0, - (byte) 0xe7, (byte) 0xee, (byte) 0xe9, (byte) 0xfc, (byte) 0xfb, (byte) 0xf2, (byte) 0xf5, (byte) 0xd8, (byte) 0xdf, - (byte) 0xd6, (byte) 0xd1, (byte) 0xc4, (byte) 0xc3, (byte) 0xca, (byte) 0xcd, (byte) 0x90, (byte) 0x97, (byte) 0x9e, - (byte) 0x99, (byte) 0x8c, (byte) 0x8b, (byte) 0x82, (byte) 0x85, (byte) 0xa8, (byte) 0xaf, (byte) 0xa6, (byte) 0xa1, - (byte) 0xb4, (byte) 0xb3, (byte) 0xba, (byte) 0xbd, (byte) 0xc7, (byte) 0xc0, (byte) 0xc9, (byte) 0xce, (byte) 0xdb, - (byte) 0xdc, (byte) 0xd5, (byte) 0xd2, (byte) 0xff, (byte) 0xf8, (byte) 0xf1, (byte) 0xf6, (byte) 0xe3, (byte) 0xe4, - (byte) 0xed, (byte) 0xea, (byte) 0xb7, (byte) 0xb0, (byte) 0xb9, (byte) 0xbe, (byte) 0xab, (byte) 0xac, (byte) 0xa5, - (byte) 0xa2, (byte) 0x8f, (byte) 0x88, (byte) 0x81, (byte) 0x86, (byte) 0x93, (byte) 0x94, (byte) 0x9d, (byte) 0x9a, - (byte) 0x27, (byte) 0x20, (byte) 0x29, (byte) 0x2e, (byte) 0x3b, (byte) 0x3c, (byte) 0x35, (byte) 0x32, (byte) 0x1f, - (byte) 0x18, (byte) 0x11, (byte) 0x16, (byte) 0x03, (byte) 0x04, (byte) 0x0d, (byte) 0x0a, (byte) 0x57, (byte) 0x50, - (byte) 0x59, (byte) 0x5e, (byte) 0x4b, (byte) 0x4c, (byte) 0x45, (byte) 0x42, (byte) 0x6f, (byte) 0x68, (byte) 0x61, - (byte) 0x66, (byte) 0x73, (byte) 0x74, (byte) 0x7d, (byte) 0x7a, (byte) 0x89, (byte) 0x8e, (byte) 0x87, (byte) 0x80, - (byte) 0x95, (byte) 0x92, (byte) 0x9b, (byte) 0x9c, (byte) 0xb1, (byte) 0xb6, (byte) 0xbf, (byte) 0xb8, (byte) 0xad, - (byte) 0xaa, (byte) 0xa3, (byte) 0xa4, (byte) 0xf9, (byte) 0xfe, (byte) 0xf7, (byte) 0xf0, (byte) 0xe5, (byte) 0xe2, - (byte) 0xeb, (byte) 0xec, (byte) 0xc1, (byte) 0xc6, (byte) 0xcf, (byte) 0xc8, (byte) 0xdd, (byte) 0xda, (byte) 0xd3, - (byte) 0xd4, (byte) 0x69, (byte) 0x6e, (byte) 0x67, (byte) 0x60, (byte) 0x75, (byte) 0x72, (byte) 0x7b, (byte) 0x7c, - (byte) 0x51, (byte) 0x56, (byte) 0x5f, (byte) 0x58, (byte) 0x4d, (byte) 0x4a, (byte) 0x43, (byte) 0x44, (byte) 0x19, - (byte) 0x1e, (byte) 0x17, (byte) 0x10, (byte) 0x05, (byte) 0x02, (byte) 0x0b, (byte) 0x0c, (byte) 0x21, (byte) 0x26, - (byte) 0x2f, (byte) 0x28, (byte) 0x3d, (byte) 0x3a, (byte) 0x33, (byte) 0x34, (byte) 0x4e, (byte) 0x49, (byte) 0x40, - (byte) 0x47, (byte) 0x52, (byte) 0x55, (byte) 0x5c, (byte) 0x5b, (byte) 0x76, (byte) 0x71, (byte) 0x78, (byte) 0x7f, - (byte) 0x6a, (byte) 0x6d, (byte) 0x64, (byte) 0x63, (byte) 0x3e, (byte) 0x39, (byte) 0x30, (byte) 0x37, (byte) 0x22, - (byte) 0x25, (byte) 0x2c, (byte) 0x2b, (byte) 0x06, (byte) 0x01, (byte) 0x08, (byte) 0x0f, (byte) 0x1a, (byte) 0x1d, - (byte) 0x14, (byte) 0x13, (byte) 0xae, (byte) 0xa9, (byte) 0xa0, (byte) 0xa7, (byte) 0xb2, (byte) 0xb5, (byte) 0xbc, - (byte) 0xbb, (byte) 0x96, (byte) 0x91, (byte) 0x98, (byte) 0x9f, (byte) 0x8a, (byte) 0x8d, (byte) 0x84, (byte) 0x83, - (byte) 0xde, (byte) 0xd9, (byte) 0xd0, (byte) 0xd7, (byte) 0xc2, (byte) 0xc5, (byte) 0xcc, (byte) 0xcb, (byte) 0xe6, - (byte) 0xe1, (byte) 0xe8, (byte) 0xef, (byte) 0xfa, (byte) 0xfd, (byte) 0xf4, (byte) 0xf3}; } \ No newline at end of file diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java index 27c2838..6e078a3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java @@ -1,9 +1,6 @@ package com.casic.missiles.parser.safe.impl; -import cn.hutool.core.util.CharsetUtil; -import cn.hutool.crypto.symmetric.SM4; -import cn.hutool.crypto.symmetric.SymmetricCrypto; - +import com.casic.missiles.parser.safe.SafeStrategy; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; @@ -11,19 +8,44 @@ import org.bouncycastle.crypto.engines.SM4Engine; import org.bouncycastle.crypto.params.KeyParameter; import org.bouncycastle.util.encoders.Hex; - -import static cn.hutool.crypto.Mode.ECB; -import static cn.hutool.crypto.Padding.NoPadding; +import org.springframework.stereotype.Component; /** * SM4算法工具类 */ @Slf4j -public class Sm4 { +@Component("sm4") +public class Sm4 implements SafeStrategy { //加解密的字节快大小 public static final int BlockSize = 16; + @Override + public String decryption(String cipher) { + byte[] keyByte = { + 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 + }; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(keyByte); + byte[] in = Hex.decode(cipher); + byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); + String plain = EcbDecrypt(in, keyBytes); + return plain; + } + + @Override + public String encryption(String cipher) { + byte[] keyByte = { + 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 + }; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(keyByte); + byte[] in = Hex.decode(cipher); + byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); + String plain = EcbDecrypt(in, keyBytes); + return plain; + } + /** * SM4ECB加密算法,对内 * @@ -32,8 +54,6 @@ * @return */ private static byte[] ecb_encrypt(byte[] in, byte[] keyBytes) { - - SM4Engine sm4Engine = new SM4Engine(); sm4Engine.init(true, new KeyParameter(keyBytes)); byte[] out = new byte[in.length]; @@ -58,27 +78,6 @@ return cipher; } - - /** - * hutool 解密SM4 - * - * @param encodeContent - * @return - */ - public static String decode(String encodeContent) { - String key = "24ad182507479a5da3ad94d9d78ea203"; - try { - SymmetricCrypto sm4 = new SM4(ECB, NoPadding, key.getBytes()); - String decryptStr = sm4.decryptStr(encodeContent, CharsetUtil.CHARSET_UTF_8); - return decryptStr; - } catch (Exception e) { - e.printStackTrace(); - log.error("SM4解密失败"); - } - return null; - } - - /** * SM4的ECB加密算法 * @@ -129,20 +128,6 @@ return plain; } - /** - * SM4的ECB解密算法 - * - * @param cipher 输入的密文字符串 - * @param key 密钥 - * @return - */ - public static String EcbDecrypt(String cipher, String key) { - byte[] in = Hex.decode(cipher); - byte[] keyBytes = Hex.decode(key); - - String plain = EcbDecrypt(in, keyBytes); - return plain; - } /** * 主函数 @@ -151,28 +136,24 @@ */ public static void main(String[] args) { byte[] ciphertext = { + 0x4B, (byte) 0x8C, (byte) 0x9D, 0x08, (byte) 0xE4, (byte) 0xD3, 0x64, 0x42, (byte) 0xB9, (byte) 0xA5, (byte) 0xFE, (byte) 0xCD, (byte) 0x91, 0x1B, 0x38, (byte) 0xAC, (byte) 0xE9, 0x1C, (byte) 0xCD, 0x53, 0x02, (byte) 0xD7, 0x0C, (byte) 0x9B, (byte) 0x96, 0x30, 0x62, (byte) 0xE8, (byte) 0xFB, (byte) 0xEF, (byte) 0xB9, (byte) 0xFF, (byte) 0xDE, 0x19, (byte) 0x80, 0x35, 0x3E, (byte) 0x90, 0x4F, 0x2F, 0x12, 0x2B, 0x19, (byte) 0x8B, 0x6C, 0x7A, (byte) 0x85, (byte) 0xA1, (byte) 0xB1, (byte) 0x86, (byte) 0xA3, 0x7A, 0x46, 0x0C, 0x2F, (byte) 0x94, 0x4F, 0x7F, 0x2C, 0x56, 0x14, (byte) 0xF3, (byte) 0x89, (byte) 0xC3, - 0x3F, 0x20, (byte) 0xF9, (byte) 0x87, (byte) 0xA1, 0x60, (byte) 0xD9, (byte) 0xA8, (byte) 0xFD, (byte) 0xD7, (byte) 0x9B, 0x4B, 0x26, 0x06, 0x30, 0x44}; + 0x3F, 0x20, (byte) 0xF9, (byte) 0x87, (byte) 0xA1, 0x60, (byte) 0xD9, (byte) 0xA8, (byte) 0xFD, (byte) 0xD7, (byte) 0x9B, 0x4B, 0x26, 0x06, 0x30, 0x44 + }; ByteBuf in = ByteBufAllocator.DEFAULT.heapBuffer(); in.writeBytes(ciphertext); - byte[] keyByte = { 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 }; ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); - key.writeBytes(ciphertext); - String resCipherData = decode(ByteBufUtil.hexDump(in)); - ByteBuf out = ByteBufAllocator.DEFAULT.heapBuffer(); -// out.writeBytes(resCipherData); -// System.out.println(hexBytes); - System.out.println(resCipherData.toString()); -// String resPlainData = EcbDecrypt(resCipherData, key); -// System.out.println("原始明文:" + data); -// System.out.println("解密后明文:" + resPlainData); + key.writeBytes(keyByte); +// String resCipherData = EcbDecrypt(ByteBufUtil.hexDump(in), ByteBufUtil.hexDump(key)); +// System.out.println(resCipherData); } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java index 1395a51..ac5f957 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java @@ -1,7 +1,7 @@ package com.casic.missiles.parser.safe.impl; import io.netty.buffer.ByteBufUtil; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** *

@@ -14,9 +14,8 @@ * @author hyl * @version v1.0: Tea.java, v 0.1 2021/3/12 13:48 $ */ -@Service("tea") -///tea算法类 - +//tea算法类 +@Component("tea") public class Tea { public static byte[] MyTea_Encrypt(byte[] MyTeaContent, int ByteLen, byte[] MyTeakey) { @@ -99,7 +98,6 @@ // for(int i32Index = 0; i32Index < 8; i32Index++) { // System.out.print("0x" + Integer.toHexString(MyContent[i32Index]) + " "); // } - // System.out.println("密钥为:"); // for(int i32Index = 0; i32Index < 16; i32Index++) { // System.out.print("0x" + Integer.toHexString(MyKeys[i32Index]) + " "); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java index bdd0721..bd1516a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java @@ -3,7 +3,7 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.parser.sender.DataSubscribeProvider; import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponents; import org.springframework.web.util.UriComponentsBuilder; @@ -12,7 +12,7 @@ import java.util.Collections; import java.util.Map; -@Service("functionCallback") +@Component("functionCallback") public class FunctionCallback implements DataSubscribeProvider { @Resource diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java index 0b44fb9..7526de2 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.Map; -@Service("middleware") +@Component("middleware") public class MiddlewareSubscribe implements DataSubscribeProvider { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java index 5dcee3f..e2f1192 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.Map; -@Service("nosql") +@Component("nosql") public class NoSqlSubscribe implements DataSubscribeProvider { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java b/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java new file mode 100644 index 0000000..81a5324 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java @@ -0,0 +1,86 @@ +package com.casic.missiles.pojo; + +import lombok.Data; + +/** + * 协议 + */ +@Data +public class Msg { + + /** + * 前导码 + */ + private String preamble; + + /** + * 版本号 + */ + private String version; + + /** + * 内容长度 + */ + private int leng; + + /** + * 设备ID + */ + private String deviceId; + + /** + * 通讯方式 + */ + private Integer connType; + + /** + * 加密方式 + */ + private Integer encryType; + + /** + * 目标地址 + */ + private String destAddr; + + /** + * PDUType + */ + private String PDUType; + + /** + * 操作类型 + */ + private Integer operateType; + + /** + * 传输控制位 PDUType.bit7=0时,表示存在后续的访问;当PDUType.bit7=1时,表示无后续的访问。 + */ + private Integer transControlFlag; + + /** + * 设备类型 + */ + private Integer deviceType; + + /** + * 序号 + */ + private Integer seq; + + /** + * tagList + */ + private String tagList; + + /** + * OidList + */ + private String OidList; + + /** + * CRC + */ + private String CRC; + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java index 40a5265..97cc984 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java @@ -40,7 +40,7 @@ String httpContent = msg.toString(Charset.defaultCharset()); log.info(" String : " + msg.toString(Charset.defaultCharset())); String majorContent = httpContent.substring(httpContent.indexOf("{"), httpContent.lastIndexOf("}") + 1); - String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("serviceData")).get("Value")); + String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("RegistryData")).get("Value")); log.info("----------------------------------" + values); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); bufferContent.writeBytes(values.getBytes(Charset.forName("ISO-8859-1"))); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java index 1b132a7..e3ced4b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java @@ -35,7 +35,7 @@ String httpContent = msg.toString(Charset.defaultCharset()); log.info(" String : " + msg.toString(Charset.defaultCharset())); String majorContent = httpContent.substring(httpContent.indexOf("{"), httpContent.lastIndexOf("}") + 1); - String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("serviceData")).get("Value")); + String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("RegistryData")).get("Value")); log.info("----------------------------------" + values); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); bufferContent.writeBytes(values.getBytes(Charset.forName("ISO-8859-1"))); diff --git a/sensorhub-core/src/main/resources/application.properties b/sensorhub-core/src/main/resources/application.properties deleted file mode 100644 index 8b13789..0000000 --- a/sensorhub-core/src/main/resources/application.properties +++ /dev/null @@ -1 +0,0 @@ - diff --git a/sensorhub-core/src/main/resources/config/application-dev.yml b/sensorhub-core/src/main/resources/config/application-dev.yml index 4f897a8..dcc4c2d 100644 --- a/sensorhub-core/src/main/resources/config/application-dev.yml +++ b/sensorhub-core/src/main/resources/config/application-dev.yml @@ -4,9 +4,9 @@ spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true + url: jdbc:mysql://127.0.0.1:3306/sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true username: root - password: Casic203 + password: root session: store-type: redis redis: diff --git a/sensorhub-core/src/main/resources/config/application.yml b/sensorhub-core/src/main/resources/config/application.yml index ae89f9d..7965da1 100644 --- a/sensorhub-core/src/main/resources/config/application.yml +++ b/sensorhub-core/src/main/resources/config/application.yml @@ -30,6 +30,13 @@ port: 6379 password: ew5T4K3#203lwh config-prefix: 'Casic:' +#代码生成器配置 +code: + generate: + #作者 + author: cz + #待生成对象表名 + table-name: bussiness_field_config,combined_field_config sensorhub: config: port: 7091 diff --git a/sensorhub-support/pom.xml b/sensorhub-support/pom.xml index 9a71296..761601c 100644 --- a/sensorhub-support/pom.xml +++ b/sensorhub-support/pom.xml @@ -42,6 +42,12 @@ ${redis.version} + + com.baomidou + mybatis-plus-generator + ${mybatis-plus-generator.version} + + org.reflections diff --git a/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java b/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java new file mode 100644 index 0000000..515ca53 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java @@ -0,0 +1,14 @@ +package com.casic.missiles.enums; + +/** + * @author + * @date + */ +public interface FixedPropertyEnum { + + String FIXED_POSITION = "fixedPosition"; + + String TOTAL_LENGTH = "totalLength"; + + String TAIL_POSITION = "tailPosition"; +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/CombinedFieldMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CombinedFieldMapper.java new file mode 100644 index 0000000..38e8f42 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CombinedFieldMapper.java @@ -0,0 +1,15 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.CombinedFieldConfig; +import org.apache.ibatis.annotations.Mapper; + +/** + * @author cz + * + */ +@Mapper +public interface CombinedFieldMapper extends BaseMapper { + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java new file mode 100644 index 0000000..128b09d --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java @@ -0,0 +1,10 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.CommandEventConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface CommandEventMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java new file mode 100644 index 0000000..042eb3c --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.DatagramEventConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface DatagramEventConfigMapper extends BaseMapper { +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java new file mode 100644 index 0000000..fc95cf4 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java @@ -0,0 +1,8 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.FieldConfig; + +public interface FieldConfigMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldRuleConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldRuleConfigMapper.java new file mode 100644 index 0000000..b310a08 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldRuleConfigMapper.java @@ -0,0 +1,10 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.FieldRuleConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface FieldRuleConfigMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java new file mode 100644 index 0000000..9060a69 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.ProtocolConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface ProtocolConfigMapper extends BaseMapper { +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolFieldConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolFieldConfigMapper.java new file mode 100644 index 0000000..1b47180 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolFieldConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +public interface ProtocolFieldConfigMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java new file mode 100644 index 0000000..6fa6936 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.RuleConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface RuleConfigMapper extends BaseMapper { +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/AbstractFieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/AbstractFieldConfig.java new file mode 100644 index 0000000..ba9aea2 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/AbstractFieldConfig.java @@ -0,0 +1,38 @@ +package com.casic.missiles.pojo; + +import lombok.Data; + +@Data +public class AbstractFieldConfig { + /** + * 字段名称 + */ + private String fieldName; + /** + * 按照字段评估进行字段解析 + */ + private String ruleJson; + /** + * 起始位置(单位byte) + */ + private Integer OriginPositionByte; + /** + * 起始位置,是否需要bit位置(单位bit)小于8, 没有不需要填写 + */ + private String OriginPositionBit; + /** + * 偏移长度 + */ + private Integer offsetLength; + /** + * 偏移单位(bit/byte) + */ + private String offsetUnit; + /** + * 是否需要转存 + */ + private Integer isStorage; + + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/CombinedFieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/CombinedFieldConfig.java new file mode 100644 index 0000000..4f4de6a --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/CombinedFieldConfig.java @@ -0,0 +1,41 @@ +package com.casic.missiles.pojo; + +import lombok.Data; + +import java.util.Date; + +/** + * 组合配置 + * + * @author cz + * @date 20 + */ +@Data +public class CombinedFieldConfig { + + private Long id; + private Long ruleId; + /** + * 前缀编码 + */ + private String prefixCode; + + /** + * 字段动态的id + */ + private Long dynamicLengthId; + /** + * 对应的要解析字段的ids + */ + private String dataFieldIds; + + /** + * 字段动态的id + */ + private String combinedFieldIds; + + private Date lastTime; + + private Date createTime; + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldConfig.java index a07d20d..8304dc6 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldConfig.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldConfig.java @@ -5,31 +5,28 @@ import java.util.Date; +/** + * @author cz + * 1、该表与实际解析的内容实例解析有关 + * 2、该表字段是随机出现的,和帧结构无关,无法预料的 + * 3、该表字段解析根据FieldEvaluatorConfig进行字段解析 + */ @Data -@TableName("field_config") -public class FieldConfig { +@TableName("business_field_config") +public class FieldConfig extends AbstractFieldConfig { private Long id; -// private String preFieldConfig; - private Long protocolId; - - private String isFixed; - private String uploadDeliveryChange; - - private String replyRule; - private String ruleJson; - + /** + * 协议配置id + */ + private Long ruleId; + /** + * 字段名称 + */ private String fieldName; - private String isStorage; - private Integer orignPosition; - private String exactOrignPosition; - - private Integer offsetLength; - private String offsetUnit; private String ownerId; private Date createTime; private Date lastTime; - } diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldRuleConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldRuleConfig.java new file mode 100644 index 0000000..2e09879 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldRuleConfig.java @@ -0,0 +1,20 @@ +package com.casic.missiles.pojo; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +@TableName("field_rule_config") +@Data +public class FieldRuleConfig { + + private Long id; + private String name; + private String desc; + private String condition; + private String excuteOperation; + private Date lasTime; + private Date createTime; + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/Msg.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/Msg.java deleted file mode 100644 index 81a5324..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/Msg.java +++ /dev/null @@ -1,86 +0,0 @@ -package com.casic.missiles.pojo; - -import lombok.Data; - -/** - * 协议 - */ -@Data -public class Msg { - - /** - * 前导码 - */ - private String preamble; - - /** - * 版本号 - */ - private String version; - - /** - * 内容长度 - */ - private int leng; - - /** - * 设备ID - */ - private String deviceId; - - /** - * 通讯方式 - */ - private Integer connType; - - /** - * 加密方式 - */ - private Integer encryType; - - /** - * 目标地址 - */ - private String destAddr; - - /** - * PDUType - */ - private String PDUType; - - /** - * 操作类型 - */ - private Integer operateType; - - /** - * 传输控制位 PDUType.bit7=0时,表示存在后续的访问;当PDUType.bit7=1时,表示无后续的访问。 - */ - private Integer transControlFlag; - - /** - * 设备类型 - */ - private Integer deviceType; - - /** - * 序号 - */ - private Integer seq; - - /** - * tagList - */ - private String tagList; - - /** - * OidList - */ - private String OidList; - - /** - * CRC - */ - private String CRC; - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/PreRuleConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/PreRuleConfig.java deleted file mode 100644 index bfcf914..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/PreRuleConfig.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.casic.missiles.pojo; - -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -import java.util.Date; - -@Data -@TableName("pre_rule_config") -public class PreRuleConfig { - - private Long id; - private String protocolId; - private String ruleFieldId; - private String ownerId; - private Date createTime; - private Date lastTime; -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolConfig.java index 274ad42..bdac11f 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolConfig.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolConfig.java @@ -5,18 +5,52 @@ import java.util.Date; +/** + * 协议配置表,协议配置与帧结构有关 + * 1、层级关系,协议之后是规则,规则对应设备类型的各种上数规则 + * 2、规则对应协议配置的实例流程 + * 3、每种可根据设备类型和操作类型进行上数规则进行区分 + */ @Data @TableName("protocol_config") public class ProtocolConfig { private Long id; + /** + * 前导码 + */ private String preFix; - private String unpackId; - private String totalLengthId; - private String totalLengthFilterField; + /** + * 拆包id + */ + private Long unpackId; + /** + * 总长度id + */ + private Long totalLengthId; + /** + * + */ + private String totalLengthFilterFields; + /** + * 动态长度ids + */ private String dynamicLengthId; + /** + * 动态长度json(预留字段) + */ private String dynamicLengthJson; - private String tailStr; + /** + * 规则字段所解析预准备的字段 + */ + private String rulePrepareFields; + /** + * 结尾标志 + */ + private Long tailStr; + /** + * 备注 + */ private String remark; private String ownerId; private Date createTime; diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolFieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolFieldConfig.java new file mode 100644 index 0000000..db794bd --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolFieldConfig.java @@ -0,0 +1,43 @@ +package com.casic.missiles.pojo; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +/** + * 协议字段配置表 + * 该表用户存放帧结构固定格式的字段 + * 有以下两个用途 + * (1)、固定格式的字段可用于规则匹配 + * (2)、固定格式的字段可用于报文回复 + * @author cz + * @date 2023-06-09 + */ +@Data +@TableName("protocol_field_config") +public class ProtocolFieldConfig extends AbstractFieldConfig{ + + private Long id; + /** + * 协议配置id + */ + private Long protocolId; + /** + * 上传下发是否有变化, 没有变化,可以直接组装 + */ + private String isReplyFix; + /** + * 按照字段评估进行字段解析 + */ + private Long fieldEvaluatorId; + /** + * 回复规则 + */ + private String replyRule; + + private String ownerId; + private Date createTime; + private Date lastTime; + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java index 3b53493..febf835 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java @@ -6,18 +6,40 @@ import java.util.Date; /** - * 加密字段解析和规则有关,事件调到该流程下面 + * @author cz + * todo: 匹配协议对应业务实例 + * 1、一个协议可以多种的流程规则 + * 2、规则可以支持递归规则流程 */ @Data @TableName("rule_config") public class RuleConfig { - private Long id; private String protocolId; - private String isBizField; - private String parseRuleJson; + /** + * 是否完成规则配置,没有完成, + * 则需要根据规则继续匹配 + */ + private String isFinishMatch; + /** + * 待匹配解析规则 + * {“data_field”:"data_value"} + */ + private String matchRuleJson; + /** + * 待解析字段ids + */ private String dataFieldIds; - private String aviatorFilterJson; + + /** + * 待解析组合字段ids + */ + private String combinedFieldIds; + + /** + * aviator + */ + private String conditionExpression; private Date createTime; private Date lastTime; } diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleDict.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleDict.java deleted file mode 100644 index cc7f389..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleDict.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.casic.missiles.pojo; - -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -@Data -@TableName("rule_dict") -public class RuleDict { - - private Long id; - private Long pid; - private String name; - private String code; - private String ownerId; - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleEvaluator.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleEvaluator.java deleted file mode 100644 index ed16610..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleEvaluator.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.pojo; - -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -import java.util.Date; - -@TableName("rule_evaluator") -@Data -public class RuleEvaluator { - - private Long id; - private String name; - private String desc; - private String condition; - private String excuteOperation; - private Date lasTime; - private Date createTime; - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/CombinedFieldConfigRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/CombinedFieldConfigRegistry.java new file mode 100644 index 0000000..fa59b90 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/CombinedFieldConfigRegistry.java @@ -0,0 +1,12 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.CombinedFieldConfig; + +import java.util.List; + +public interface CombinedFieldConfigRegistry { + + List getCombinedFieldConfigList(Long ruleId); + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/CommandEventRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/CommandEventRegistry.java new file mode 100644 index 0000000..fb97d87 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/CommandEventRegistry.java @@ -0,0 +1,8 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.CommandEventConfig; + +public interface CommandEventRegistry { + + CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName); +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/DatagramEventRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/DatagramEventRegistry.java new file mode 100644 index 0000000..fb34641 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/DatagramEventRegistry.java @@ -0,0 +1,11 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.DatagramEventConfig; + +import java.util.List; + +public interface DatagramEventRegistry{ + + List getDatagramEventList(Long ruleId); + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/FieldConfigRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/FieldConfigRegistry.java new file mode 100644 index 0000000..759642e --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/FieldConfigRegistry.java @@ -0,0 +1,20 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.FieldConfig; + +import java.util.List; + +public interface FieldConfigRegistry { + + + List getFieldConfigList(Long ruleId); + + FieldConfig getFieldConfigById(String fieldId); + + List getFieldConfigs(String protocolId, Integer isFixed); + + List getStorageFieldConfig(String protocolId); + + +} + diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/FieldRuleConfigRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/FieldRuleConfigRegistry.java new file mode 100644 index 0000000..33da70c --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/FieldRuleConfigRegistry.java @@ -0,0 +1,11 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.FieldRuleConfig; + +import java.util.List; + +public interface FieldRuleConfigRegistry { + + List getFieldRuleConfigList(Long ruleId); + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/ProtocolConfigRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/ProtocolConfigRegistry.java new file mode 100644 index 0000000..1725189 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/ProtocolConfigRegistry.java @@ -0,0 +1,12 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.ProtocolConfig; + +import java.util.List; + +public interface ProtocolConfigRegistry { + + List getProtocolConfigList(String firstChar); + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/ProtocolFieldConfigRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/ProtocolFieldConfigRegistry.java new file mode 100644 index 0000000..19d1b9a --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/ProtocolFieldConfigRegistry.java @@ -0,0 +1,14 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.ProtocolFieldConfig; + +import java.util.List; + +public interface ProtocolFieldConfigRegistry { + + + List getProtocolFieldConfigList(Long protocolId); + + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/RuleConfigRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/RuleConfigRegistry.java new file mode 100644 index 0000000..3d2a75c --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/RuleConfigRegistry.java @@ -0,0 +1,14 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.RuleConfig; + +import java.util.List; + +public interface RuleConfigRegistry { + + RuleConfig getNextRuleConfig(String ruleFields); + + + List getRuleConfigById(Long protocolId); + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CombinedFieldConfigRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CombinedFieldConfigRegistryImpl.java new file mode 100644 index 0000000..822cac6 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CombinedFieldConfigRegistryImpl.java @@ -0,0 +1,24 @@ +package com.casic.missiles.registry.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.CombinedFieldMapper; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.registry.CombinedFieldConfigRegistry; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class CombinedFieldConfigRegistryImpl extends ServiceImpl implements CombinedFieldConfigRegistry { + + @Override + public List getCombinedFieldConfigList(Long ruleId) { + QueryWrapper queryWrapper = new QueryWrapper() + .eq("rule_id", ruleId); + List combinedFieldConfigs = this.baseMapper.selectList(queryWrapper); + return combinedFieldConfigs; + } + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CommandEventRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CommandEventRegistryImpl.java new file mode 100644 index 0000000..f0d3559 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CommandEventRegistryImpl.java @@ -0,0 +1,25 @@ +package com.casic.missiles.registry.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.CommandEventMapper; +import com.casic.missiles.pojo.CommandEventConfig; +import com.casic.missiles.registry.CommandEventRegistry; + +import java.util.List; +import java.util.Optional; + +public class CommandEventRegistryImpl extends ServiceImpl implements CommandEventRegistry { + + @Override + public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { + QueryWrapper queryWrapper = new QueryWrapper() + .eq("protocol_id", protocolId) + .eq("scene", sceneName) + .eq("enabled", 1); + List commandEventConfig = this.baseMapper.selectList(queryWrapper); + Optional optionalEventConfig = commandEventConfig.stream().findFirst(); + return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; + } + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/DatagramEventRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/DatagramEventRegistryImpl.java new file mode 100644 index 0000000..2e58698 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/DatagramEventRegistryImpl.java @@ -0,0 +1,26 @@ +package com.casic.missiles.registry.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.DatagramEventConfigMapper; +import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.registry.DatagramEventRegistry; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class DatagramEventRegistryImpl extends ServiceImpl implements DatagramEventRegistry { + + + @Override + public List getDatagramEventList(Long ruleId) { + QueryWrapper queryWrapper = new QueryWrapper() + .eq("rule_id", ruleId); + List fieldConfigList = this.baseMapper.selectList(queryWrapper); + return fieldConfigList; + } + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/FieldConfigRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/FieldConfigRegistryImpl.java new file mode 100644 index 0000000..6ae4422 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/FieldConfigRegistryImpl.java @@ -0,0 +1,50 @@ +package com.casic.missiles.registry.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.FieldConfigMapper; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.registry.FieldConfigRegistry; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * @author cz + */ +@Service +public class FieldConfigRegistryImpl extends ServiceImpl implements FieldConfigRegistry { + + @Override + public List getFieldConfigList(Long ruleId) { + QueryWrapper queryWrapper = new QueryWrapper() + .eq("rule_id", ruleId); + List fieldConfigList = this.baseMapper.selectList(queryWrapper); + return fieldConfigList; + } + + @Override + public FieldConfig getFieldConfigById(String fieldId) { + FieldConfig fieldConfig = this.baseMapper.selectById(fieldId); + return fieldConfig; + } + + @Override + public List getFieldConfigs(String protocolId, Integer isFixed) { + QueryWrapper queryWrapper = new QueryWrapper() + .eq("protocol_id", protocolId) + .eq("is_fixed", isFixed); + List fieldConfigList = this.baseMapper.selectList(queryWrapper); + return fieldConfigList; + } + + @Override + public List getStorageFieldConfig(String protocolId) { + QueryWrapper queryWrapper = new QueryWrapper() + .eq("protocol_id", protocolId) + .eq("is_fixed", 1) + .eq("is_storage", 1); + List fieldConfigList = this.baseMapper.selectList(queryWrapper); + return fieldConfigList; + } +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/FieldRuleConfigRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/FieldRuleConfigRegistryImpl.java new file mode 100644 index 0000000..406fe65 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/FieldRuleConfigRegistryImpl.java @@ -0,0 +1,23 @@ +package com.casic.missiles.registry.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.FieldRuleConfigMapper; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.registry.FieldRuleConfigRegistry; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class FieldRuleConfigRegistryImpl extends ServiceImpl implements FieldRuleConfigRegistry { + + @Override + public List getFieldRuleConfigList(Long ruleId) { + QueryWrapper queryWrapper = new QueryWrapper() + .eq("rule_id", ruleId); + List fieldRuleConfigList = this.baseMapper.selectList(queryWrapper); + return fieldRuleConfigList; + } + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/ProtocolConfigRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/ProtocolConfigRegistryImpl.java new file mode 100644 index 0000000..8a516e5 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/ProtocolConfigRegistryImpl.java @@ -0,0 +1,26 @@ +package com.casic.missiles.registry.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.ProtocolConfigMapper; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.registry.ProtocolConfigRegistry; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class ProtocolConfigRegistryImpl extends ServiceImpl implements ProtocolConfigRegistry { + + /** + * 无条件全查询,作为一次加载的初始化查询 + * + * @return + */ + @Override + public List getProtocolConfigList(String firstChar) { + + return this.baseMapper.selectList(null); + } + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/ProtocolFieldConfigRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/ProtocolFieldConfigRegistryImpl.java new file mode 100644 index 0000000..f4c5a89 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/ProtocolFieldConfigRegistryImpl.java @@ -0,0 +1,26 @@ +package com.casic.missiles.registry.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.ProtocolFieldConfigMapper; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.registry.ProtocolFieldConfigRegistry; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; + +@Service +public class ProtocolFieldConfigRegistryImpl extends ServiceImpl implements ProtocolFieldConfigRegistry { + + @Override + public List getProtocolFieldConfigList(Long protocolId) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("protocol_id", protocolId); + List protocolFieldConfigs = this.baseMapper.selectList(queryWrapper); + return protocolFieldConfigs; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java index 608af3a..32cc8a4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java @@ -2,48 +2,47 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.delivery.decorator.ByteDecorator; +import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @AllArgsConstructor public class FieldDecoratorManger { - private final RuleDictDao ruleDictDao; + private final RuleConfigRegistry ruleDictDao; // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 // (1)静态的业务字段是字典里面可以配置的 // (2)动态的业务字段是通过规则生成的 public String contentMerge(String ruleJson, String sceneConent, String dynamicContent) { - List ruleDictList = ruleDictDao.getRuleDictConfig(); - Map ruleDictMap = ruleDictList.stream().collect( - Collectors.toMap(RuleDict::getId, e -> e)); - List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); - for (Map ruleMap : ruleMapList) { - String ruleType = String.valueOf(ruleMap.get("ruleType")); - ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); - NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); - byteDecorator.nodeDecoratorRule(nodeDecoratorParm); - } +// List ruleDictList = ruleDictDao.getRuleDictConfig(); +// Map ruleDictMap = ruleDictList.stream().collect( +// Collectors.toMap(RuleDict::getId, e -> e)); +// List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); +// for (Map ruleMap : ruleMapList) { +// String ruleType = String.valueOf(ruleMap.get("ruleType")); +// ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); +// NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); +// byteDecorator.nodeDecoratorRule(nodeDecoratorParm); +// } return null; } - - private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { - NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() - .contents(sceneConent) - .dynamicContent(dynamicContent) - .ruletypeId(ruletypeId) - .ruleDictMap(ruleDictMap) - .build(); - return nodeDecoratorParm; - } +// +// private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { +// NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() +// .contents(sceneConent) +// .dynamicContent(dynamicContent) +// .ruletypeId(ruletypeId) +// .ruleDictMap(ruleDictMap) +// .build(); +// return nodeDecoratorParm; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java index 652970c..b204ac3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java @@ -1,56 +1,56 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@AllArgsConstructor -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", - JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Component; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Component("logicalDecorator") +//@AllArgsConstructor +//@Slf4j +//public class LogicalShiftDecorator implements ByteDecorator { +// +//// private final FieldRuleEngineMapper fieldRuleEngineMapper; +//// +//// //字节位移 +//// @Override +//// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +//// String logicalValue = ""; +//// RuleEvaluator fieldRuleEngine = new RuleEvaluator(); +//// try { +//// Map env2 = new HashMap(); +//// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +//// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +//// for (String contentId : contentIdList) { +//// RuleDict ruleDict = ruleDictMap.get(contentId); +//// if (ruleDict.getCode().contains("#")) { +//// //使用动态的值 +//// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +//// } +//// env2.put(ruleDict.getName(), ruleDict.getCode()); +//// } +//// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +//// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +//// return null; +//// } +//// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +//// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +//// return values; +//// } catch (Exception ex) { +//// log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", +//// JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +//// return null; +//// } +//// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java index 346468f..822fead 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@AllArgsConstructor -@Slf4j -public class OperationDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("optionDecorator") +//@AllArgsConstructor +//@Slf4j +//public class OperationDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //混合运算,有常量或者乘除的缩放 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java index 50fb0a7..7a8bccb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@AllArgsConstructor -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +////精度计算 +//@AllArgsConstructor +//@Registry("precisionDecorator") +//@Slf4j +//public class PrecisionDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java index da39235..27f9cc7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java @@ -1,54 +1,53 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@AllArgsConstructor -@Slf4j -public class RuleDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("ruleDecorator") +//@AllArgsConstructor +//@Slf4j +//public class RuleDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //吃我一套正则表达式 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (Exception ex) { +// log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java index 7f5cbf3..c043f97 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java @@ -2,6 +2,6 @@ import java.util.Map; -public interface ComandeEventService { +public interface ComandeEventService{ Map loadComandeEventConfig(String protocolId,String scene); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java index 476ad84..aaf1837 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java @@ -2,46 +2,46 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.dao.CommandEventDao; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @Slf4j @AllArgsConstructor -public class ComandeEventServiceImpl implements ComandeEventService { +public class ComandeEventServiceImpl implements ComandeEventRegistry { - private final CommandEventDao commandEventDao; + // private final CommandEventDao commandEventDao; // 加密bean 固定字段出现变化的字段解析,业务字段的有序内容 @Override - public Map loadComandeEventConfig(String protocolId,String sceneName) { - CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); - if (ObjectUtil.isEmpty(commandEventConfig)) { - log.error("协议{},没有配置成功接收回复配置,清排查原因"); - return null; - } - String replyJson = commandEventConfig.getReplyContentJson(); - List> replyMapList = JSONArray.parseObject(replyJson, List.class); - List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); - Map fixMap = fixList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); - List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) - .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) - .collect(Collectors.toList()); - Map commandConfigMap = new HashMap<>(); - commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); - commandConfigMap.put("fixContent", fixMap); - commandConfigMap.put("bizContent", contentList); - return commandConfigMap; + public Map loadComandeEventConfig(String protocolId, String sceneName) { +// CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); +// if (ObjectUtil.isEmpty(commandEventConfig)) { +// log.error("协议{},没有配置成功接收回复配置,清排查原因"); +// return null; +// } +// String replyJson = commandEventConfig.getReplyContentJson(); +// List> replyMapList = JSONArray.parseObject(replyJson, List.class); +// List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); +// Map fixMap = fixList.stream() +// .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); +// List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) +// .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) +// .collect(Collectors.toList()); +// Map commandConfigMap = new HashMap<>(); +// commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); +// commandConfigMap.put("fixContent", fixMap); +// commandConfigMap.put("bizContent", contentList); +// return commandConfigMap; + return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 128b09d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java deleted file mode 100644 index 4016b0b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface DatagramEventMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java deleted file mode 100644 index 597c306..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.apache.ibatis.annotations.Mapper; - -public interface FieldConfigMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java deleted file mode 100644 index a31680a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.PreRuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface PreRuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java deleted file mode 100644 index 9060a69..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface ProtocolConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java deleted file mode 100644 index 6fa6936..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java deleted file mode 100644 index 582a705..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleDict; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleDictMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java deleted file mode 100644 index 6e302c8..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.CommandEventMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Optional; - -@Component -public class CommandEventDao { - - @Resource - private CommandEventMapper commandEventMapper; - - public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId) - .eq("scene", sceneName) - .eq("enabled", 1); - List commandEventConfig = commandEventMapper.selectList(queryWrapper); - Optional optionalEventConfig = commandEventConfig.stream().findFirst(); - return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java deleted file mode 100644 index 9137e4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.FieldConfigMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class FieldConfigDao { - - @Resource - private FieldConfigMapper fieldConfigMapper; - - public FieldConfig getFieldConfigById(String fieldId) { - FieldConfig fieldConfig = fieldConfigMapper.selectById(fieldId); - return fieldConfig; - } - - public List getFieldConfigs(String protocolId,Integer isFixed) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",isFixed); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - - public List getStorageFieldConfig(String protocolId) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",1) - .eq("is_storage",1); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java deleted file mode 100644 index 67bff6b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.mapper.PreRuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class PreRuleConfigDao { - - @Resource - private PreRuleConfigMapper preRuleConfigMapper; - - public List getPreRuleList(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return preRuleConfigMapper.selectList(queryWrapper); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java deleted file mode 100644 index d69ea85..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.RuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleConfigDao { - - @Resource - private RuleConfigMapper ruleConfigMapper; - - public RuleConfig getNextRuleConfig(String ruleFields) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("parse_rule_json", ruleFields); - return ruleConfigMapper.selectOne(queryWrapper); - } - - - public List getRuleConfigById(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return ruleConfigMapper.selectList(queryWrapper); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java deleted file mode 100644 index 932c185..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.RuleDictMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleDictDao { - - @Resource - private RuleDictMapper ruleDictMapper; - - public List getRuleDictConfig() { - List ruleDictList = ruleDictMapper.selectList(null); - return ruleDictList; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java index 9f9e279..43bc4d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java @@ -10,20 +10,15 @@ import io.netty.channel.socket.nio.NioServerSocketChannel; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import javax.annotation.PreDestroy; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static cn.hutool.core.util.ClassUtil.getClasses; /** * SensorhubServer netty服务端 */ @Slf4j -@Service +@Component public class SensorhubServer { /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java index 2c79ff5..9a28c36 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java @@ -11,13 +11,13 @@ import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioSocketChannel; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClient 客户端 */ @Slf4j -@Service +@Registry public final class SensorhubClient { public static void main(String[] args) throws Exception { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java index 9774be0..477c3f7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java @@ -6,12 +6,12 @@ import io.netty.channel.socket.SocketChannel; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientChannelInitialHandler */ -@Service +@Registry public class SensorhubClientChannelInitialHandler extends ChannelInitializer { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java index 346f4b3..73560e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java @@ -5,13 +5,13 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientHandler */ @Slf4j -@Service +@Registry public class SensorhubClientHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java index 5c1c6f2..d990af5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java @@ -4,12 +4,12 @@ import com.casic.missiles.pojo.Msg; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** * SensorhubServerHandler */ -@Service +@Component public class SensorhubServerHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 67283ae..af3172c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,41 +1,37 @@ package com.casic.missiles.parser; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultProtocolConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.*; +import com.casic.missiles.registry.FieldConfigRegistry; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; -import java.nio.charset.Charset; import java.util.HashMap; import java.util.List; import java.util.Map; -@Service("genericProtocolParser") +/** + * @author + */ +@Component("genericProtocolParser") @Slf4j -@AllArgsConstructor +@RequiredArgsConstructor public class GenericProtocolParser implements ProtocolParser { - private final LeadingCodeMatcher leadingCodeMatcher; private final List frameStructDispenserList; - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorInstanceSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; // 匹配首字母前导码=> 帧结构匹配前导码=> // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 @@ -44,18 +40,19 @@ public Boolean doParseProtocol(ByteBuf byteBuf) { String protocolContent = ByteBufUtil.hexDump(byteBuf); //匹配前导码 - List preCodeConfigs = leadingCodeMatcher.matchLeadingCode(protocolContent); + List preCodeConfigs = LeadingCodeMatcher.matchFrameLeadingCode(protocolContent); //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 if (preCodeConfigs.size() == 0) { - return rematch(byteBuf,protocolContent); + return rematch(byteBuf, protocolContent); } - //暂时先取第一个 + //暂时先取第一个,提升速度,使用享元模式, 减少类的创建销毁与构建 ProtocolConfig protocolConfig = preCodeConfigs.get(0); + AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); ByteBuf wholeDatagramByte = null; //通过匹配帧结构获取完整的数据包 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, preCodeConfigs.get(0))) != null) { + if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, protocolFactory)) != null) { break; } } @@ -68,76 +65,78 @@ * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 */ - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId, wholeDatagramByte); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap, protocolId); - //选取规则对应的流程实例 - DatagramEventConfig datagramEventConfig = processorInstanceSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); + //进行规则字段解析,进行匹配规则 + RuleConfig ruleConfig = getRuleConfig(protocolFactory, wholeDatagramByte); + if (ruleConfig == null) { + return false; + } //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, wholeDatagramByte); + ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte); + //以下进行业务的规则解析,同时选定流程实例 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); + DatagramEventProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain, + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText, protocolId); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain); //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); + datagramEventProvider.storeData(bizDataMap); return true; } - private Boolean rematch(ByteBuf byteBuf,String protocolContent) { + /** + * 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 + */ + private Boolean rematch(ByteBuf byteBuf, String protocolContent) { //重置位判断 byteBuf.resetReaderIndex(); //判断重置是否前移,如果没有前移,则直接判为匹配失败 if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { return false; } else { + //递归执行 return doParseProtocol(byteBuf); } } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; + //获取匹配规则->匹配规则 + private RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + //取出其中参与逻辑provider并判空 + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); + String rulePrepareFields = protocolConfig.getRulePrepareFields(); + //固定字段 + if (StringUtils.isNotEmpty(rulePrepareFields)) { + //获取统一固定字段解析 + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + //获取该协议的字段配置,用于协议规则匹配 + List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); + //获取规则 + RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, + rulePrepareFields, protocolFieldConfigs); + return ruleConfig; + } + return null; } - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + //数据构建,获取固定字段的store和业务字段store + private Map buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + Map bizDataMap = new HashMap<>(); + Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); + Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); + bizDataMap.putAll(ruleStoreObjectMap); + bizDataMap.putAll(protocolStoreObjectMap); return bizDataMap; } - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java index 8a46e32..16ce2e5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java @@ -3,6 +3,7 @@ import io.netty.buffer.ByteBuf; public interface ProtocolParser { + Boolean doParseProtocol(ByteBuf byteBuf); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java new file mode 100644 index 0000000..f7814af --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java @@ -0,0 +1,35 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.ProtocolConfigProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.ProtocolConfig; + +/** + * 存放基本协议的的加载信息 + */ +public class AbstractProtocolConfigFactory { + private final ProtocolConfigProvider protocolConfigProvider; + private final ProtocolFieldConfigProvider protocolFieldConfigProvider; + private final RuleConfigProvider ruleConfigProvider; + + public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { + this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); + this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); + this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); + } + + public ProtocolConfigProvider getProtocolConfigProvider() { + return protocolConfigProvider; + } + + public ProtocolFieldConfigProvider getProtocolFieldConfigProvider() { + return protocolFieldConfigProvider; + } + + public RuleConfigProvider getRuleConfigProvider() { + return ruleConfigProvider; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java new file mode 100644 index 0000000..6e36147 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java @@ -0,0 +1,57 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.CombinedFieldConfigProvider; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.FieldConfigProvider; +import com.casic.missiles.parser.provider.FieldRuleConfigProvider; + +/** + * 存放规则相关的的的加载信息 + */ +public class AbstractRuleConfigFactory { + + /** + * 处理字节 + */ + private final FieldConfigProvider fieldConfigProvider; + /** + * 处理组合字节解析的解码器 + */ + private final CombinedFieldConfigProvider combinedFieldConfigProvider; + /** + * 处理负责字节解析的规则配置 + */ + private final FieldRuleConfigProvider fieldRuleConfigProvider; + /** + * 处理实例流程 + */ + private final DatagramEventProvider datagramEventProvider; + + + public AbstractRuleConfigFactory(Long ruleId) { + this.fieldConfigProvider = new FieldConfigProvider(ruleId); + this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); + this.fieldRuleConfigProvider = new FieldRuleConfigProvider(ruleId); + this.datagramEventProvider = new DatagramEventProvider(ruleId); + } + + public FieldConfigProvider getFieldConfigProvider() { + return fieldConfigProvider; + } + + public CombinedFieldConfigProvider getCombinedFieldConfigProvider() { + return combinedFieldConfigProvider; + } + + public FieldRuleConfigProvider getFieldRuleConfigProvider() { + return fieldRuleConfigProvider; + } + + public DatagramEventProvider getDatagramEventProvider() { + return datagramEventProvider; + } + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java deleted file mode 100644 index 6e1719a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.factory; - - -import com.casic.missiles.pojo.ProtocolConfig; - -import java.util.List; - -/** - * 数据库访问优化(暂时未做) - *

- * 1、初始化协议解析配置,并存放到处存放缓存,对协议基本配置进行管理 - * 2、其中流程中所有的配置都经过此类进行管理,进行调用获取,增强解析速度 - */ -public interface DatagramFactory { - - /** - * 初始化 - */ - List datagramInit(); - - /** - * 根据前导码配置匹配,模糊匹配获取所有的报文项 - */ - List match(); - - /** - * 根据前导码匹配,返回报文项 - */ - List filer(); - - /** - * 保证数据的唯一性选择器 - */ - List selectOne(); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java new file mode 100644 index 0000000..87444a0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java @@ -0,0 +1,18 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +import java.util.List; + +/** + * 直接用,还是边用边创建 + */ +public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { + + + public DefaultProtocolConfigFactory(ProtocolConfig protocolConfig) { + super(protocolConfig); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java new file mode 100644 index 0000000..cce0c7c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java @@ -0,0 +1,12 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; + +public class DefaultRuleFactory extends AbstractRuleConfigFactory { + + public DefaultRuleFactory(Long ruleId) { + super(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java deleted file mode 100644 index 9ee97e0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.casic.missiles.parser.instance; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service -@Slf4j -@AllArgsConstructor -public class GeneralProcessor { - - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; - - /** - * 统一固定字段解析=>进行规则的查询的判断 - * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 - * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 - */ - @Deprecated - public boolean parseWholeDatagram(ByteBuf buffer, ProtocolConfig protocolConfig) { - try { - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap,protocolId); - //选取规则对应的流程= - DatagramEventConfig datagramEventConfig = processorSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); - //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); - //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); - //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); - //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); - //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); - return true; - } catch (Exception ex) { - log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", - ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); - return false; - } - } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; - } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); - } - - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); - return bizDataMap; - } - - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java index 25e7ad8..6a5777e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java @@ -1,23 +1,31 @@ package com.casic.missiles.parser.instance.impl; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.mapper.DatagramEventMapper; import com.casic.missiles.pojo.DatagramEventConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.SpringContextUtil; -@Service -@AllArgsConstructor +import java.util.List; +import java.util.Optional; + +/** + * @author cz + * + */ public class DefaultProcessorInstanceSelector implements ProcessorInstanceSelector { - private final DatagramEventMapper datagramEventMapper; + private static List datagramEventConfigs; + + static { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + datagramEventConfigs = datagramEventRegistry.getDatagramEventList(); + } @Override public DatagramEventConfig getProcessorInstance(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("rule_id", protocolId); - return datagramEventMapper.selectOne(queryWrapper); + Optional optionalSelectInstance = datagramEventConfigs.stream() + .filter(e -> e.getId().equals(protocolId)).limit(1).findFirst(); + return optionalSelectInstance.isPresent() ? optionalSelectInstance.get() : null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a778671..7b56a43 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,16 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import io.netty.buffer.ByteBuf; /** - * 分析匹配情况 - * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 - * 2、匹配不成功,有后续帧,可以进行下次匹配。 - * 3、匹配不成功,无后续帧,可以进行丢弃。 + * 分析匹配情况 + * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 + * 2、匹配不成功,有后续帧,可以进行下次匹配。 + * 3、匹配不成功,无后续帧,可以进行丢弃。 */ -public interface FrameStructMatcher{ +public interface FrameStructMatcher { - ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig); + ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 05320ab..8ebea78 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,23 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.ProtocolConfigMapper; +import com.casic.missiles.parser.provider.ProtocolConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Component; import java.util.List; import java.util.stream.Collectors; -@Component -@AllArgsConstructor public class LeadingCodeMatcher { - private final ProtocolConfigMapper protocolMapper; - //** 1、首字母匹配前导码, // 2、以匹配出的前导码是否在报文中条件进行前导码的匹配二次筛选 - public List matchLeadingCode(String protocolContent){ + public static List matchFrameLeadingCode(String protocolContent){ List initialConfigs = initialMatch(protocolContent); List preCodeConfigs = initialConfigs.stream() .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) @@ -26,13 +19,16 @@ } //初始化匹配前导码内容 - private List initialMatch(String protocolContent) { - String protocolStr = protocolContent.charAt(0) + ""; - QueryWrapper queryWrapper = new QueryWrapper() - .likeRight("pre_fix", protocolStr); - List protocolConfigList = protocolMapper.selectList(queryWrapper); - return protocolConfigList; + private static List initialMatch(String protocolContent) { + String firstFrameChar = protocolContent.charAt(0) + ""; + ProtocolConfigProvider protocolConfigProvider=new ProtocolConfigProvider(firstFrameChar); + return protocolConfigProvider.getMatchList(); } + + + + + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index cf2113d..e915877 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -1,32 +1,35 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(0) -@Service +@Component public class FrameLengthMatcher implements FrameStructMatcher { - @Autowired - private FieldParser fieldParser; - //超过长度 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { String dataGramContent = ByteBufUtil.hexDump(byteBuf); - if (StringUtils.isEmpty(protocolConfig.getUnpackId()) && StringUtils.isEmpty(protocolConfig.getTailStr())) { - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + //当不存在结尾标志和拆包标志,可以直接使用长度进行匹配 + if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { if (dataGramContent.length() >= totalLength) {//等于长度返回true,超出长度,切断 - ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, protocolConfig, totalLength); + ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, totalLength); return wholeDatagramByte; } else { //读的标志位前移舍弃 @@ -38,7 +41,7 @@ return null; } - private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, Integer totalLength) { byteBuf.readBytes(totalLength); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, totalLength - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 2bfc213..d527ad0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; @@ -13,7 +13,7 @@ import lombok.AllArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.nio.charset.Charset; import java.util.Map; @@ -22,32 +22,30 @@ * 后续标志验证 */ @Order(1) -@Service +@Component @AllArgsConstructor -public class FrameMarkMatcher implements FrameStructMatcher { - - private final FieldConfigDao fieldConfigDao; - private final FieldParser fieldParser; - private final FieldResolver fieldResolverManger; +public class FrameMarkMatcher implements FrameStructMatcher, FixedPropertyEnum { //帧后续标志=>结束,进行帧的重组=>有后续,1、帧移位判别 2、继续接收帧 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig UnpackConfig = StringUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getUnpackId()); - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); - Integer upback = 0; + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); ByteBuf mergeWholeFrameByte = null; - if (!ObjectUtil.isEmpty(UnpackConfig)) { - while (hasNextFullFrame(byteBuf, protocolConfig)) { - upback = (Integer) fieldResolverManger.filedParserManger(byteBuf, UnpackConfig, null); + if (!ObjectUtil.isEmpty(unpackFlag)) { + while (hasNextFullFrame(byteBuf, protocolConfig, protocolFieldConfigProvider)) { //是否存在后续位 - if (upback == 1) {//使用esayRule + if (unpackFlag == 1) {//使用esayRule //表示可以截取 - mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolConfig, totalLength); + mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolFieldConfigProvider, protocolConfig); return mergeWholeFrameByte; } else { - byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig)); + byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig, protocolFieldConfigProvider)); } } } @@ -56,7 +54,8 @@ //选取第一个帧,将业务内容和后面部分分开 //计算数据报文-业务内容 - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolFieldConfigProvider protocolFieldConfigProvider, ProtocolConfig protocolConfig) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); //截取完整报文 byteBuf.readBytes(totalLength); ByteBuf byteBufContent = byteBuf.slice(0, byteBuf.readerIndex()); @@ -68,15 +67,15 @@ String tail = ""; System.out.println(ByteBufUtil.hexDump(byteBufContent)); //会存在多个帧拼接在一起的的情况,进行合并处理 - while (hasNextFullFrame(byteBufContent, protocolConfig)) { - Integer currentFrameLength = fieldParser.getTotalLength(protocolConfig, byteBufContent); + while (hasNextFullFrame(byteBufContent, protocolConfig, protocolFieldConfigProvider)) { + Integer currentFrameLength = protocolFieldConfigProvider.getTotalLength(byteBufContent, protocolConfig); byteBufContent.readBytes(currentFrameLength); ByteBuf currentbyteBuf = byteBufContent.slice(0, byteBufContent.readerIndex()); byteBufContent.markReaderIndex();//读的标志位前移 System.out.println(ByteBufUtil.hexDump(byteBufContent)); String hexDump = currentbyteBuf.toString(Charset.forName("ISO-8859-1")); //获取当前固定帧结构的关系map - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, currentbyteBuf); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(currentbyteBuf, protocolConfig); if (StringUtils.isEmpty(mergeFrameStr)) { //首次获取业务数据报文 mergeFrameStr += hexDump.substring(0, currentFrameFixedProperty.get("tailPosition")); @@ -95,22 +94,22 @@ /** * 获取平移到下一帧起始位置 */ - public int getNextFrameOffset(ByteBuf buffer, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, buffer); - return currentFrameFixedProperty.get("totalLength"); + public int getNextFrameOffset(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + return currentFrameFixedProperty.get(TOTAL_LENGTH); } /** * 判断是否出错进行整个帧的 */ - public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, byteBuf); + public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); //保证读取位置不在固定位置,是可变的业务内容 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("fixedPosition")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(FIXED_POSITION)) { return false; } //判断读取是否操作帧长度 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("totalLength")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(TOTAL_LENGTH)) { return false; } return true; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 76a3784..c3a1bab 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -1,50 +1,50 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.parser.instance.GeneralProcessor; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; +import io.netty.buffer.ByteBufUtil;; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(2) -@Service +@Component public class FrameTailMatcher implements FrameStructMatcher { - @Resource - private FieldConfigDao fieldConfigDao; - @Autowired - private GeneralProcessor generalProcessor; - //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig tailFieldConfig = StringUtils.isEmpty(protocolConfig.getTailStr()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getTailStr()); - if (!ObjectUtil.isEmpty(tailFieldConfig)) { - String tailStr = tailFieldConfig.getFieldName(); + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfig protocolFieldConfig = ObjectUtils.isEmpty(protocolConfig.getTailStr()) ? null : + fieldConfigProvider.getFieldConfigById(protocolConfig.getTailStr()); + if (!ObjectUtil.isEmpty(protocolFieldConfig)) { + String tailStr = protocolFieldConfig.getFieldName(); String dataGramContent = ByteBufUtil.hexDump(byteBuf); Boolean tailFlag = ByteBufUtil.hexDump(byteBuf).contains(tailStr); if (!tailFlag) { //使用esayRule return null; } else if (dataGramContent.indexOf(tailStr) < dataGramContent.length() - tailStr.length()) { Integer length = dataGramContent.indexOf(tailStr) + tailStr.length(); - ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, protocolConfig, length); + ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, length); return wholeDatagramByte; //存在粘包 } } return null; } - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer length) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, Integer length) { byteBuf.readBytes(length); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, length - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java new file mode 100644 index 0000000..5f1c177 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java @@ -0,0 +1,73 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.combined.GenericCombinedFieldResolver; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.CombinedFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class CombinedFieldConfigProvider { + + + /** + * 作为临时配置列表缓存使用 + */ + private final List combinedFieldConfigList; + private Map storeObjectMap = new HashMap<>(); + + public CombinedFieldConfigProvider(Long ruleId) { + CombinedFieldConfigRegistry combinedFieldConfigRegistry = SpringContextUtil.getBean(CombinedFieldConfigRegistry.class); + combinedFieldConfigList = combinedFieldConfigRegistry.getCombinedFieldConfigList(ruleId); + } + + public void parseDataField(RuleConfig ruleConfig, String clearZeroPlain,Map fieldConfigsMap ) { + if (showSkip()) { + return; + } + //匹配对应的数据,然后进行相关的字段解析 + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver(); + combinedFieldResolver.parseDataField(combinedFieldConfigList, byteBuf, storeObjectMap,fieldConfigsMap); + } + + + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getCombinedFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return combinedFieldConfigList.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public List getCombinedFieldConfigList() { + return combinedFieldConfigList; + } + + /* 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(combinedFieldConfigList) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java new file mode 100644 index 0000000..f3cfedc --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java @@ -0,0 +1,11 @@ +package com.casic.missiles.parser.provider; + +/** + * @author cz + * @date 2023-6-12 + */ +public class CommandEventProvider{ + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java new file mode 100644 index 0000000..70eec5e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java @@ -0,0 +1,77 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.safe.SafeStrategy; +import com.casic.missiles.parser.sender.DataSubscribeProvider; +import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class DatagramEventProvider { + + private final DatagramEventConfig processorInstance; + + public DatagramEventProvider(Long ruleId) { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + List datagramEventConfigList = + datagramEventRegistry.getDatagramEventList(ruleId); + processorInstance = this.getProcessorInstance(datagramEventConfigList); + } + + public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { + if (showSkip()) { + return null; + } + return datagramEventConfigList.get(0); + } + + // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 + public String getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap) { + String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? + processorInstance.getSafeBean() : + fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); + if (!StringUtils.isEmpty(safeName)) { + //需要加密 + SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); + String plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); + return clearComplementZero(plain); + } + return ByteBufUtil.hexDump(bizDataContent); + } + + //解密清零操作 + private String clearComplementZero(String plain) { + plain = plain.substring(0, plain.lastIndexOf("00")); + return plain; + } + + //数据发送,数据发送者暂未构建 + public void storeData(Map bizDataMap) { + DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); +// dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return ObjectUtils.isNotEmpty(processorInstance) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java new file mode 100644 index 0000000..7e1fe0a --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java @@ -0,0 +1,97 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.FieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class FieldConfigProvider { + + + private final List fieldConfigs; + private Map storeObjectMap = new HashMap<>(); +// private Map singleObjects = new ConcurrentHashMap<>(); + + public FieldConfigProvider(Long ruleId) { + FieldConfigRegistry fieldConfigRegistry = SpringContextUtil.getBean(FieldConfigRegistry.class); + fieldConfigs = fieldConfigRegistry.getFieldConfigList(ruleId); + } + + public List getFieldConfigs() { + return fieldConfigs; + } + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public Map parseDataField(RuleConfig ruleConfig, String clearZeroPlain) { + if (showSkip()) { + return null; + } + List prepareFieldConfig = prepareParseField(ruleConfig); + if (CollectionUtils.isNotEmpty(prepareFieldConfig)) { + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(fieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + return fixDataMap; + } + } + return null; + } + + /** + * 得到需要处理的业务内容 + * + * @return + */ + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return fieldConfigs.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public Map getFieldConfigsMap() { + return fieldConfigs.stream().collect( + Collectors.toMap(FieldConfig::getId, e -> e) + ); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(fieldConfigs) ? false : true; + } + + +} + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java new file mode 100644 index 0000000..817bfaf --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java @@ -0,0 +1,19 @@ +package com.casic.missiles.parser.provider; + +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.registry.FieldRuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; + +public class FieldRuleConfigProvider { + + private final List fieldRuleConfigList; + + public FieldRuleConfigProvider(Long ruleId) { + FieldRuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(FieldRuleConfigRegistry.class); + fieldRuleConfigList = ruleConfigRegistry.getFieldRuleConfigList(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java new file mode 100644 index 0000000..99a1b06 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java @@ -0,0 +1,53 @@ +package com.casic.missiles.parser.provider; + + +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.registry.ProtocolConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolConfigProvider { + + private final List protocolConfigList; + + public ProtocolConfigProvider(String firstChar) { + ProtocolConfigRegistry registry = SpringContextUtil.getBean(ProtocolConfigRegistry.class); + protocolConfigList = registry.getProtocolConfigList(firstChar); + } + + public List getMatchList() { + return protocolConfigList; + } + + /** + * 设置当前协议 + * + * @param protocolConfig + */ + public ProtocolConfigProvider(ProtocolConfig protocolConfig) { + List protocolConfigs = new ArrayList<>(); + protocolConfigs.add(protocolConfig); + protocolConfigList = protocolConfigs; + } + + /** + * 获取当前协议 + * + * @return + */ + public ProtocolConfig getCurrentProtocolConfig() { + if (this.protocolConfigList == null) { + return null; + } else { + return protocolConfigList.get(0); + } + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java new file mode 100644 index 0000000..043927d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java @@ -0,0 +1,213 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.registry.ProtocolFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolFieldConfigProvider { + + private static final String FIXED_FIELD_DS = "fixedFieldDs"; + private static final String CONTENT_FIELD_DS = "contentFieldDs"; + private static final String PROTOCOL_LENGTH = "protocolLength"; + private static final String PROTOCOL_FIELD_ID = "protocolFieldId"; + private static final String PROTOCOL_POSITION = "protocolPosition"; + + private final List protocolFieldConfigs; + private Map singleObjects = new ConcurrentHashMap<>(); + private Map storeObjectMap = new HashMap<>(); + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public ProtocolFieldConfigProvider(Long protocolId) { + ProtocolFieldConfigRegistry protocolFieldConfigRegistry = SpringContextUtil.getBean(ProtocolFieldConfigRegistry.class); + protocolFieldConfigs = protocolFieldConfigRegistry.getProtocolFieldConfigList(protocolId); + } + + public List getProtocolFieldConfigs() { + return protocolFieldConfigs; + } + + public ProtocolFieldConfig getFieldConfigById(Long fieldId) { + Optional optionalConfig = protocolFieldConfigs.stream().filter( + e -> e.getId().equals(fieldId) + ).findFirst(); + return optionalConfig.isPresent() ? optionalConfig.get() : null; + } + + public Integer getProtocolFieldValue(Long protocolFieldId, ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_FIELD_ID + protocolFieldId + ByteBufUtil.hexDump(byteBuf); + //获取缓存 + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + //加载固定长度数据集合 + Map fixDataMap = this.getProtocolDataMap(byteBuf); + ProtocolFieldConfig protocolFieldConfig = selectFieldConfig(protocolFieldId); + Integer protocolFieldValue = 0; + //获取约定字段的总长度 + if (fixDataMap.containsKey(protocolFieldConfig.getFieldName())) { + Object appointUnpackObject = fixDataMap.get(protocolFieldConfig.getFieldName()); + if (ObjectUtils.isNotEmpty(appointUnpackObject)) { + protocolFieldValue = (Integer) appointUnpackObject; + } + } + if (protocolFieldValue != null) { + //加入缓存 + if (ObjectUtils.isNotEmpty(protocolFieldValue)) { + this.singleObjects.put(catchKey, protocolFieldValue); + return protocolFieldValue; + } + } + return null; + } + + /** + * 获取帧固定位置信息 + * + * @param byteBuf + * @param protocolConfig + * @return + */ + public Map getFixedProperty(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_POSITION + protocolConfig.getId(); + if (this.singleObjects.containsKey(catchKey)) { + return (Map) singleObjects.get(catchKey); + } + Map fixedPropertyMap = new HashMap<>(); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + fixedPropertyMap = fieldParser.doGetFixedProperty(protocolFieldConfigs, this.getTotalLength(byteBuf,protocolConfig)); + if (CollectionUtils.isNotEmpty(fixedPropertyMap)) { + this.singleObjects.put(catchKey, fixedPropertyMap); + return fixedPropertyMap; + } + return fixedPropertyMap; + } + + /** + * 获取帧结构应有的总长度 + */ + public Integer getTotalLength(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_LENGTH + ByteBufUtil.hexDump(byteBuf); + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + Integer appointFrameLength = getProtocolFieldValue(protocolConfig.getTotalLengthId(), byteBuf); + if (appointFrameLength != null) { + //获取过滤的字段集合总长度 + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Integer totalFilterLength = fieldParser.getTotalFilterLength(protocolConfig, byteBuf, getFixFieldConfigMap()); + //计算总长度 + Integer totalLength = appointFrameLength + totalFilterLength; + //加入缓存 + if (ObjectUtils.isNotEmpty(totalLength)) { + this.singleObjects.put(catchKey, totalLength); + return totalLength; + } + } + return null; + } + + /** + * 获取协议有关字段解析内容 + * storeObjectMap存储代转存的数据 + * + * @return + */ + public Map getProtocolDataMap(ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(FIXED_FIELD_DS)) { + return (Map) singleObjects.get(FIXED_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(protocolFieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + this.singleObjects.put(FIXED_FIELD_DS, fixDataMap); + return fixDataMap; + } + return null; + } + + /** + * 获取业务报文内容的content字节 + * + * @param wholeDatagramByte + * @return + */ + public ByteBuf getDataContentBuf(ByteBuf wholeDatagramByte) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(CONTENT_FIELD_DS)) { + return (ByteBuf) singleObjects.get(CONTENT_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + ByteBuf bizDataByteBuf = fieldParser.getDataContentBuf(protocolFieldConfigs, wholeDatagramByte); + if (bizDataByteBuf != null) { + this.singleObjects.put(CONTENT_FIELD_DS, bizDataByteBuf); + return bizDataByteBuf; + } + return null; + } + + + private ProtocolFieldConfig selectFieldConfig(Long id) { + Optional optionalProtocolFieldConfig = this.protocolFieldConfigs.stream().filter( + e -> e.getId().equals(id) + ).findFirst(); + return optionalProtocolFieldConfig.isPresent() ? optionalProtocolFieldConfig.get() : null; + } + + + private Map getFixFieldConfigMap() { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, e -> e) + ); + return fixDataFieldMap; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(protocolFieldConfigs) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java new file mode 100644 index 0000000..dafba1c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java @@ -0,0 +1,56 @@ +package com.casic.missiles.parser.provider; + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.rule.GenericRuleResolver; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.RuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleConfigProvider { + + private final List ruleConfigs; + + public List getRuleConfigs() { + return ruleConfigs; + } + + public RuleConfigProvider(Long protocolId) { + RuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(RuleConfigRegistry.class); + ruleConfigs = ruleConfigRegistry.getRuleConfigById(protocolId); + } + + /** + * 获取规则匹配结果 + * + * @param parseFixedDataMap + * @param protocolFieldConfigs + * @return + */ + public RuleConfig doGetRule(Map parseFixedDataMap, + String ids, + List protocolFieldConfigs) { + if (showSkip()) { + return null; + } + RuleConfig ruleConfig = GenericRuleResolver.machRule(parseFixedDataMap, ids, protocolFieldConfigs, ruleConfigs); + return ruleConfig; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(ruleConfigs) ? false : true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java index 3c05891..856b399 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java @@ -1,18 +1,11 @@ package com.casic.missiles.parser.resolver; -import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.springframework.web.bind.annotation.RequestBody; -import javax.annotation.Resource; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -20,19 +13,17 @@ @Slf4j public class ByteMergeProvider { - @Resource - private FieldRuleEngineMapper fieldRuleEngineMapper; - //拿到所有的值合并到一个值 - public String resolveByteMerge(List valueList, String ruletypeId, String vaildRange) { + public static String resolveByteMerge(List valueList, String ruleTypeId, String vaildRange) { String values = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Map vaildMap = getValidRangeMap(vaildRange); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(ruletypeId); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } + //暂时不处理 +// fieldRuleEngine = fieldRuleConfigMapper.selectById(ruleTypeId); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } Map env2 = new HashMap(); for (int i = 0; i < valueList.size(); i++) { if (vaildMap.containsKey(i)) { @@ -47,7 +38,7 @@ } } - private Map getValidRangeMap(String vaildRange) { + private static Map getValidRangeMap(String vaildRange) { String[] range = vaildRange.split(","); Map vaildMap = new HashMap(); for (int i = 0; i < range.length; i++) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 8d821cd..85d6bbf 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -1,9 +1,12 @@ package com.casic.missiles.parser.resolver; +import com.casic.missiles.pojo.AbstractFieldConfig; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; import io.netty.buffer.ByteBuf; +import java.util.List; import java.util.Map; /** @@ -11,18 +14,14 @@ */ public interface FieldParser { -// Map fieldProcess(String protocolContent,); - Map dataParser(RuleConfig ruleConfig, String lightText,String protocolId); + Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength); - Map fixDataParser(String protocolId, ByteBuf buffer); + Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap); - Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf); + ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer); - ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer); - - ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer); - - Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer); + Integer getTotalFilterLength(ProtocolConfig protocolConfig, ByteBuf byteBuf, Map protocolFieldConfigMap); } + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java new file mode 100644 index 0000000..9e0c00e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java @@ -0,0 +1,52 @@ +package com.casic.missiles.parser.resolver; + +import com.casic.missiles.pojo.AbstractFieldConfig; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.util.List; + +public class FieldParserSupport { + + //分别计算bit和byte长度=> 合并长度 + protected Integer calculateLength(List fieldConfigList) { + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + Integer fixedLength = bytefixedLength + bitfixedLength / 8; + return fixedLength; + } + + //找到最大值=> 根据最大值计算业务数据下标 + protected Integer calculatePosition(List fieldConfigList) { + String rex = "[0-9]+"; + Integer max = -1; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) + && Integer.valueOf(fieldConfig.getOriginPositionByte()) > max) { + max = Integer.valueOf(fieldConfig.getOriginPositionByte()); + } + } + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) && fieldConfig.getOriginPositionByte().equals(max)) { + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + } + } + Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; + return maxFixedPosition; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java deleted file mode 100644 index dd3a6cd..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java +++ /dev/null @@ -1,170 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.ByteResolverParam; -import io.netty.buffer.ByteBuf; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -/** - * 字段解析管理总类 - */ -@Service -@Slf4j -@AllArgsConstructor -public class FieldResolver extends ByteMergeProvider { - - //1、字段截取 => 2、简单的字节解析和复杂的字节解析 - public Object filedParserManger(ByteBuf byteBuf, FieldConfig fieldConfig, Integer maxFixedPosition) { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - //最大固定位置不为空, - if (!ObjectUtil.isEmpty(maxFixedPosition)) { - orignPosition -= maxFixedPosition; - } - Object fieldValue = 0; - //待优化 - if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { - fieldValue = bitToResolver(byteBuf, fieldConfig); - } else { - ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); - fieldValue = parsingFields(fieldBytes, fieldConfig.getRuleJson()); - } - return fieldValue; - } - - //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, - //目前默认配置的规则设置暂不支持配置化,由实现完成 - private Object parsingFields(ByteBuf byteBuf, String ruleJson) { - Object fieldsResolveValue = null; - List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); - if (ObjectUtil.isEmpty(ruleMapList)) { - fieldsResolveValue = defaultResolveBuilder(byteBuf); - } else { - fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); - } - return fieldsResolveValue; - } - - private Object defaultResolveBuilder(ByteBuf byteBuf) { - Integer defaultResolveValue = 0; - for (int i = 0; i < byteBuf.writerIndex(); i++) { - defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; - } - return defaultResolveValue; - } - - //字段解析构建器(针对字节单位的) - //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 - // 字节归并结束或者规则结束=>继续根据规则进行判断 - private Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { - Object customizeResolveValue = null; - try { - List bytStrList = new ArrayList<>(); - //存放到数组里面 - for (int i = 0; i < byteBuf.writerIndex(); i++) { - bytStrList.add(byteBuf.readByte()); - } - int i = 0; - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - customizeResolveValue = this.resolveByteMerge(bytStrList, ruletypeId,vaildRange); - break; - } else { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - List tempBytStr = new ArrayList<>(); - for (int k = 0; i < bytStrList.size(); i++) { - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(k) - .value(bytStrList.get(k)) - .ruletypeId(ruletypeId).build(); - tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); - } - bytStrList = tempBytStr; - } - i++; - } - //字节归并到一起=>继续根据规则进行判断 - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(customizeResolveValue) - .ruletypeId(ruletypeId).build(); - customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(customizeResolveValue)); - return customizeResolveValue; - } catch (RuntimeException ex) { - log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); - return null; - } - } - - /** - * 1、单个字节情况表示字段 - * 2、多字节情况表示字段(暂未处理) - */ - private Object bitToResolver(ByteBuf byteBuf, FieldConfig fieldConfig) { - Object fieldValue = new Object(); - try { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - byte fields = 0x00; - if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); - } else { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); - } - - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { - if (!StringUtils.isEmpty(fieldConfig.getExactOrignPosition())) { - fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getExactOrignPosition())).byteValue() - >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); - } else { - fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); - } - } else { - fieldValue = Integer.valueOf(fields & 0xff); - } - if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { - return fieldValue; - } - List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); - int i = 0; - //字节归并到一起=>继续根据规则进行判断 - while (i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(fieldValue) - .ruletypeId(ruletypeId).build(); - fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(fieldValue)); - return fieldValue; - } catch (RuntimeException ex) { - log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); - return null; - } - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java new file mode 100644 index 0000000..1d2aeab --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java @@ -0,0 +1,36 @@ +package com.casic.missiles.parser.resolver.bytes; + +import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.mapper.FieldRuleConfigMapper; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.pojo.ByteResolverParam; +import com.googlecode.aviator.AviatorEvaluator; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; +//转换规则 +@Component("convert") +@AllArgsConstructor +@Slf4j +public class ByteRuleResolver implements ByteResolver { + + private final FieldRuleConfigMapper fieldRuleConfigMapper; + + @Override + public Object resolveOperationRule(ByteResolverParam byteResolverParam){ + FieldRuleConfig fieldRuleEngine=fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); + if(ObjectUtil.isEmpty(fieldRuleEngine)){ + return byteResolverParam.getValue(); + } + String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); + Map env2 = new HashMap(); + env2.put("value", (byte) byteResolverParam.getValue()); + String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); + return values; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java index 103821c..786b71c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java @@ -2,34 +2,34 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("logicalShift") +@Component("logicalShift") @AllArgsConstructor @Slf4j public class LogicalShiftResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //字节位移 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { Integer index = byteResolverParam.getIndex(); - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return byteResolverParam.getValue(); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java index 476747d..01149bd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("operation") +@Component("operation") @AllArgsConstructor @Slf4j public class OperationResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //混合运算,有常量或者乘除的缩放 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java index 0b82cf4..79abcce 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.casic.missiles.pojo.ByteResolverParam; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; //精度计算 -@Service("precision") +@Component("precision") @AllArgsConstructor @Slf4j public class PrecisionResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java deleted file mode 100644 index 5c3f332..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; -//转换规则 -@Service("convert") -@AllArgsConstructor -@Slf4j -public class RuleResolver implements ByteResolver { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam){ - RuleEvaluator fieldRuleEngine=fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); - if(ObjectUtil.isEmpty(fieldRuleEngine)){ - return byteResolverParam.getValue(); - } - String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); - Map env2 = new HashMap(); - env2.put("value", (byte) byteResolverParam.getValue()); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java new file mode 100644 index 0000000..d3bbd91 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java @@ -0,0 +1,15 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; + +import java.util.List; +import java.util.Map; +// 前导码匹配->长度字段 +public interface AbstractCombinedFieldProcessor { + + Map invoke(Map map, ByteBuf byteBuf, List combinedFieldConfigList, + Map fieldConfigsMap, Map storeObjectMap); + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java new file mode 100644 index 0000000..03c8480 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java @@ -0,0 +1,59 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-13 + */ +//依次递增进行数据的解析, +public class GenericCombinedFieldResolver { + + + //通过查询,字段长度长度随机 + public void parseDataField(List combinedFieldConfigList, ByteBuf byteBuf, + Map storeObjectMap, Map fieldConfigsMap) { + Integer frameLength = Integer.valueOf(ByteBufUtil.hexDump(byteBuf)); + //添加前置处理器 + com.casic.missiles.util.ClassUtil classUtil = new com.casic.missiles.util.ClassUtil(); + List abstractCombinedProcessors = classUtil.getSubClassList(AbstractCombinedFieldProcessor.class); + + Map fieldFixedMap = combinedFieldLeadCodeMap(combinedFieldConfigList); + //frameLength + Map combinedProcessorFields = null; + while (byteBuf.readableBytes() < frameLength) { + //一直处理 + for (AbstractCombinedFieldProcessor abstractCombinedProcessor : abstractCombinedProcessors) { + combinedProcessorFields = abstractCombinedProcessor.invoke(combinedProcessorFields, byteBuf, + combinedFieldConfigList, + fieldConfigsMap, storeObjectMap); + if (combinedProcessorFields == null || byteBuf.readableBytes() < frameLength) { + return; + } + } + + } + } + + /** + * 取出前导码匹配集合 + */ + private Map combinedFieldLeadCodeMap(List combinedFieldConfigList) { + Map fieldFixedMap = combinedFieldConfigList + .stream() + .collect(Collectors.toMap(CombinedFieldConfig::getPrefixCode, e -> e)); + return fieldFixedMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java new file mode 100644 index 0000000..643a934 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java @@ -0,0 +1,100 @@ +package com.casic.missiles.parser.resolver.fields; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.FieldParserSupport; +import com.casic.missiles.pojo.*; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 保存使用时最基本的信息,并且使用原型模式 + */ +@Slf4j +public class DefaultProtocolFieldParser extends FieldParserSupport implements FieldParser, FixedPropertyEnum { + + //通过传入的配置和报文进行字段解析 + @Override + public Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap) { + Map dataMap = new HashMap<>(); + for (AbstractFieldConfig protocolFieldConfig : protocolFieldConfigs) { + if (!ObjectUtils.isEmpty(protocolFieldConfig.getOriginPositionByte())) { + Object fieldValue = FieldResolver.parseField(buffer, protocolFieldConfig, null); + if (protocolFieldConfig.getIsStorage() == 1) { + storeObjectMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + dataMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + } + return dataMap; + } + + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength) { + Map fixedPropertyMap = new HashMap<>(); + Integer fixedLength = calculateLength(protocolFieldConfigs); + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + fixedPropertyMap.put(FIXED_POSITION, maxFixedPosition); + fixedPropertyMap.put(TOTAL_LENGTH, totalLength); + fixedPropertyMap.put(TAIL_POSITION, totalLength - fixedLength + maxFixedPosition); + return fixedPropertyMap; + } + + //** 获取业务内容的byteBuf + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer) { + //计算固定长度 + Integer fixedLength = calculateLength(protocolFieldConfigs); + //总长度获取 + String lightText = buffer.toString(Charset.forName("ISO-8859-1")); + Integer totalLength = lightText.length(); + //计算固定长度最大长度 + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + //计算数据报文内容 + ByteBuf bizDataFields = buffer.slice(maxFixedPosition - 1, (totalLength - fixedLength)); + return bizDataFields; + } + + /** + * 获取过滤字段的长度 + */ + @Override + public Integer getTotalFilterLength(ProtocolConfig protocolConfig, + ByteBuf byteBuf, + Map protocolFieldConfigMap) { + if (ByteBufUtil.hexDump(byteBuf).equals("")) { + return 0; + } + int totalFilterLength = 0; + String filterFields = protocolConfig.getTotalLengthFilterFields(); + try { + if (!StringUtils.isEmpty(filterFields)) { + String[] filterFieldList = filterFields.split(","); + for (String filterFieldId : filterFieldList) { + if (StringUtils.isNotEmpty(filterFieldId)) { + ProtocolFieldConfig fieldConfig = protocolFieldConfigMap.get(Long.valueOf(filterFieldId)); + //这里都是按字节计算,没有对位进行区分,可能会出现错误 + // 如果对位有需求,需要进一步跟进 + totalFilterLength += fieldConfig.getOffsetLength(); + } + } + } + return totalFilterLength; + } catch (Exception ex) { + log.error("报文确认分发阶段,获取报文总长度过滤长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); + } + return totalFilterLength; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java new file mode 100644 index 0000000..d51e887 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java @@ -0,0 +1,169 @@ +package com.casic.missiles.parser.resolver.fields; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.parser.resolver.ByteMergeProvider; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.AbstractFieldConfig; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.pojo.ByteResolverParam; +import io.netty.buffer.ByteBuf; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * 字段解析管理总类 + */ +@Slf4j +public class FieldResolver extends ByteMergeProvider { + + //1、字段截取 => 2、简单的字节解析和复杂的字节解析 + public static Object parseField(ByteBuf byteBuf,AbstractFieldConfig fieldConfig, Integer maxFixedPosition) { + Integer orignPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + //最大固定位置不为空, + if (!ObjectUtil.isEmpty(maxFixedPosition)) { + orignPosition -= maxFixedPosition; + } + Object fieldValue = 0; + //待优化 + if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { + fieldValue = doParseBitField(byteBuf, fieldConfig); + } else { + ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); + fieldValue = doParseByteField(fieldBytes, fieldConfig.getRuleJson()); + } + return fieldValue; + } + + //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, + //目前默认配置的规则设置暂不支持配置化,由实现完成 + private static Object doParseByteField(ByteBuf byteBuf, String ruleJson) { + Object fieldsResolveValue = null; + List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); + if (ObjectUtil.isEmpty(ruleMapList)) { + fieldsResolveValue = defaultResolveBuilder(byteBuf); + } else { + fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); + } + return fieldsResolveValue; + } + + private static Object defaultResolveBuilder(ByteBuf byteBuf) { + Integer defaultResolveValue = 0; + for (int i = 0; i < byteBuf.writerIndex(); i++) { + defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; + } + return defaultResolveValue; + } + + //字段解析构建器(针对字节单位的) + //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 + // 字节归并结束或者规则结束=>继续根据规则进行判断 + private static Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { + Object customizeResolveValue = null; + try { + List bytStrList = new ArrayList<>(); + //存放到数组里面 + for (int i = 0; i < byteBuf.writerIndex(); i++) { + bytStrList.add(byteBuf.readByte()); + } + int i = 0; + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { + if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + customizeResolveValue = resolveByteMerge(bytStrList, ruletypeId, vaildRange); + break; + } else { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + List tempBytStr = new ArrayList<>(); + for (int k = 0; i < bytStrList.size(); i++) { + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(k) + .value(bytStrList.get(k)) + .ruletypeId(ruletypeId).build(); + tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); + } + bytStrList = tempBytStr; + } + i++; + } + //字节归并到一起=>继续根据规则进行判断 + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(null) + .value(customizeResolveValue) + .ruletypeId(ruletypeId).build(); + customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); + i++; + } + System.out.println(JSON.toJSON(customizeResolveValue)); + return customizeResolveValue; + } catch (RuntimeException ex) { + log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); + return null; + } + } + + /** + * 1、单个字节情况表示字段 + * 2、多字节情况表示字段(暂未处理) + */ + private static Object doParseBitField(ByteBuf byteBuf,AbstractFieldConfig fieldConfig) { + Object fieldValue = new Object(); + try { + Integer orignPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + byte fields = 0x00; + if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { + fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); + } else { + fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); + } + + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { + if (!StringUtils.isEmpty(fieldConfig.getOriginPositionBit())) { + fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getOriginPositionBit())).byteValue() + >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); + } else { + fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); + } + } else { + fieldValue = Integer.valueOf(fields & 0xff); + } + if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { + return fieldValue; + } + List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); + int i = 0; + //字节归并到一起=>继续根据规则进行判断 + while (i < ruleMapList.size()) { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(null) + .value(fieldValue) + .ruletypeId(ruletypeId).build(); + fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); + i++; + } + System.out.println(JSON.toJSON(fieldValue)); + return fieldValue; + } catch (RuntimeException ex) { + log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); + return null; + } + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java deleted file mode 100644 index 35ae3d0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java +++ /dev/null @@ -1,183 +0,0 @@ -package com.casic.missiles.parser.resolver.fields; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufAllocator; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; -import org.springframework.util.ObjectUtils; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service("standard") -@AllArgsConstructor -@Slf4j -public class StandardFieldParser implements FieldParser { - - private final FieldConfigDao fieldConfigDao; - private final FieldResolver fieldResolver; - - //数据解析 - @Override - public Map dataParser(RuleConfig ruleConfig, String lightText, String protocolId) { - String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); - ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); - bufferContent.writeBytes(lightText.getBytes(Charset.forName("ISO-8859-1"))); - Map dataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - for (String dataFieldId : dataFieldIds) { - FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(dataFieldId); - if (!ObjectUtils.isEmpty(fieldConfig)) { - dataMap.put(fieldConfig.getFieldName(), String.valueOf(fieldResolver.filedParserManger(bufferContent, fieldConfig, maxFixedPosition))); - } - } - return dataMap; - } - - //数据解析 - @Override - public Map fixDataParser(String protocolId, ByteBuf buffer) { - List dataFieldIdList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Map dataMap = new HashMap<>(); - for (FieldConfig dataField : dataFieldIdList) { - if (!ObjectUtils.isEmpty(dataField.getOrignPosition())) { - Object fieldValue = (Integer) fieldResolver.filedParserManger(buffer, dataField, null); - dataMap.put(dataField.getFieldName(), fieldValue); - } - } - return dataMap; - } - - @Override - public Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf) { - if (ByteBufUtil.hexDump(byteBuf).equals("")) { - return 0; - } - String filterFields = protocolConfig.getTotalLengthFilterField(); - Integer totalLength = 0; - try { - FieldConfig totalFieldConfig = fieldConfigDao.getFieldConfigById(protocolConfig.getTotalLengthId()); - int totalFilterLength = 0; - if (!StringUtils.isEmpty(filterFields)) { - String[] filterFieldList = filterFields.split(","); - for (String filterField : filterFieldList) { - FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(filterField); - //这里都是按字节计算,没有对位进行区分,可能会出现错误 - - // 如果对位有需求,需要进一步跟进 - totalFilterLength += fieldConfig.getOffsetLength(); - } - } - totalLength = (Integer) fieldResolver.filedParserManger(byteBuf, totalFieldConfig, null) + totalFilterLength; - } catch (Exception ex) { - log.error("报文确认分发阶段,获取报文总长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); - } - return totalLength; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer) { - //业务内容 - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - String protocolId = String.valueOf(protocolConfig.getId()); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - //计算固定长度 - Integer fixedLength = calculateLength(fieldConfigList); -// Integer totalLength = this.getTotalLength(protocolConfig, buffer); - //总长度获取 - Integer totalLength = lightText.length(); - //计算固定长度最大长度 - Integer maxFixedPosition = calculatePosition(fieldConfigList); -// buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - //计算数据报文内容 - ByteBuf bizDataFields = buffer.slice(maxFixedPosition-1, (totalLength - fixedLength)); - return bizDataFields; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer) { - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - String protocolId = String.valueOf(protocolConfig.getId()); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer fixedLength = calculateLength(fieldConfigList); -// Integer totalLength = this.getTotalLength(protocolConfig, buffer); - Integer totalLength = lightText.length(); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - ByteBuf fixDataFields = buffer.slice(0, maxFixedPosition); - return fixDataFields; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer) { - String protocolId = String.valueOf(protocolConfig.getId()); - Map fixedPropertyMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer fixedLength = calculateLength(fieldConfigList); - Integer totalLength = this.getTotalLength(protocolConfig, buffer); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - fixedPropertyMap.put("fixedPosition", maxFixedPosition); - fixedPropertyMap.put("totalLength", totalLength); - fixedPropertyMap.put("tailPosition", totalLength - fixedLength + maxFixedPosition); - return fixedPropertyMap; - } - - //分别计算bit和byte长度=> 合并长度 - private Integer calculateLength(List fieldConfigList) { - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (FieldConfig fieldConfig : fieldConfigList) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - Integer fixedLength = bytefixedLength + bitfixedLength / 8; - return fixedLength; - } - - //找到最大值=> 根据最大值计算业务数据下标 - private Integer calculatePosition(List fieldConfigList) { - String rex = "[0-9]+"; - Integer max = -1; - for (FieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOrignPosition()) - && Integer.valueOf(fieldConfig.getOrignPosition()) > max) { - max = Integer.valueOf(fieldConfig.getOrignPosition()); - } - } - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (FieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOrignPosition()) && fieldConfig.getOrignPosition().equals(max)) { - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - } - } - Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; - return maxFixedPosition; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java new file mode 100644 index 0000000..d4ec6c7 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java @@ -0,0 +1,76 @@ +package com.casic.missiles.parser.rule; + +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import org.apache.commons.lang3.StringUtils; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class GenericRuleResolver { + + //根据前置字段的值,找到指定的规则 + //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 + //=>循环判断=>通过规则得到业务字段 + public static RuleConfig machRule(Map fixDataMap, + String ids, + List protocolFieldConfigs, + List ruleConfigs) { + List preRuleConfigList = getPreRuleList(ids, protocolFieldConfigs); + //获取前置规则字段 + final Map metaDataMap = getPreRuleFields(preRuleConfigList, fixDataMap); + //准备固定的字段集合 + Map fixDataFieldMap = getFixDataFieldMap(protocolFieldConfigs); + return RuleResolverCore.doMachRule(ruleConfigs, metaDataMap, fixDataMap, fixDataFieldMap); + } + + private static Map getFixDataFieldMap(List protocolFieldConfigs) { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, ProtocolFieldConfig::getFieldName) + ); + return fixDataFieldMap; + } + + + /** + * 查询前置规则的字段配置 + * + * @param ids + * @return + */ + private static List getPreRuleList(String ids, List protocolFieldConfigs) { + String[] idList = ids.split(","); + Map prepareMaps = new HashMap<>(); + for (String id : idList) { + if (StringUtils.isNotEmpty(id)) { + prepareMaps.put(Long.valueOf(id), ""); + } + } + List preRuleConfigList = protocolFieldConfigs + .stream() + .filter(e -> prepareMaps.containsKey(e.getId())) + .collect(Collectors.toList()); + return preRuleConfigList; + } + + /** + * 获取前置规则解析字段 + */ + private static Map getPreRuleFields(List preRuleFieldConfigList, Map fixDataMap) { + Map ruleFieldMap = new HashMap<>(); + preRuleFieldConfigList.stream() + .forEach( + preRuleFieldConfig -> { + String fieldName = preRuleFieldConfig.getFieldName(); + if (fixDataMap.containsKey(fieldName)) { + ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); + } + } + ); + return ruleFieldMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java new file mode 100644 index 0000000..baae7e8 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -0,0 +1,68 @@ +package com.casic.missiles.parser.rule; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.casic.missiles.pojo.RuleConfig; + +import java.util.*; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleResolverCore { + + + public static RuleConfig doMachRule(List ruleConfigList, Map metaDataMap, + Map fixDataMap, + Map fixDataFieldMap) { + Optional ruleConfigOptional = ruleConfigList.stream() + .filter(ruleConfig -> machRuleConfig( + JSON.parseObject(ruleConfig.getMatchRuleJson(), Map.class), metaDataMap)) + .findFirst(); + if (ObjectUtil.isEmpty(ruleConfigOptional)) { + return null; + } + String[] ruleFields = ruleConfigOptional.get().getDataFieldIds().split(","); + Map ruleMetaDataMap = getRuleFields(ruleFields, fixDataMap, fixDataFieldMap); + //递归选定解析规则,进行规则解析 + if (!ruleConfigOptional.get().getIsFinishMatch().equals("1")) { + //递归选定规则 + doMachRule(ruleConfigList, ruleMetaDataMap, fixDataMap, fixDataFieldMap); + } + return ruleConfigOptional.get(); + } + + + private static Map getRuleFields(String[] preRuleConfigList, Map fixedDataMap, + Map fixedFieldMap) { + Map ruleFieldMap = new HashMap<>(); + for (String preRuleConfigId : preRuleConfigList) { + String fieldName = fixedFieldMap.get(preRuleConfigId); + if (fixedDataMap.containsKey(fieldName)) { + ruleFieldMap.put(fieldName, String.valueOf(fixedDataMap.get(fieldName))); + } + } + return ruleFieldMap; + } + + + //匹配规则配置 + private static Boolean machRuleConfig(Map ruleMap, Map metaDataMap) { + if (ruleMap == null || metaDataMap == null) { + return null; + } + //所有的字段在规则里面必须有有配置 + for (String key : metaDataMap.keySet()) { + if (ruleMap.containsKey(key)) { + if (!ruleMap.get(key).equals(metaDataMap.get(key))) { + return false; + } + } else { + return false; + } + } + return true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java deleted file mode 100644 index 664088d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java +++ /dev/null @@ -1,92 +0,0 @@ -package com.casic.missiles.parser.rule; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.mapper.dao.PreRuleConfigDao; -import com.casic.missiles.mapper.dao.RuleConfigDao; -import lombok.AllArgsConstructor; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.*; -import java.util.stream.Collectors; - -@Service -@AllArgsConstructor -public class RulerProvider { - - private final FieldConfigDao fieldConfigDao; - private final PreRuleConfigDao preRuleConfigDao; - private final RuleConfigDao ruleConfigDao; - - //根据前置字段的值,找到指定的规则 - //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 - //=>循环判断=>通过规则得到业务字段 - public RuleConfig ruleConfig(Map fixDataMap, String protocolId) { - //批量获取规则 - List preRuleConfigList = preRuleConfigDao.getPreRuleList(protocolId); - //获取固定字段 - Map fixFieldMap = getAllFieldMap(protocolId); - //获取前置规则字段 - final String preRuleFields = getPreRuleFields(preRuleConfigList, fixDataMap, fixFieldMap); - List ruleConfigList = ruleConfigDao.getRuleConfigById(protocolId); - Optional ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig ->preRuleFields.equals( ruleConfig.getParseRuleJson())).findFirst(); - //递归选定解析规则,进行规则解析 - while (!ObjectUtil.isEmpty(ruleConfigOptional) && !ruleConfigOptional.get().getIsBizField().equals("1")) { - String ruleFields = getRuleFields(ruleConfigOptional.get().getDataFieldIds().split(","), fixDataMap, fixFieldMap); - ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig -> ruleConfig.getParseRuleJson().equals(ruleFields)).findFirst(); - } - return ruleConfigOptional.get(); - } - - /** - * 获取前置规则解析字段 - */ - private String getPreRuleFields(List preRuleConfigList, Map fixDataMap, Map fixFieldMap) { - Map ruleFieldMap= new HashMap<>(); - preRuleConfigList.stream() - .forEach( - preRuleConfig -> { - String fieldName = fixFieldMap.get(Long.valueOf(preRuleConfig.getRuleFieldId())); - if (fixDataMap.containsKey(fieldName)) { - ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); - } - } - ); - return JSONObject.toJSONString(ruleFieldMap); - } - - private Map getAllFieldMap(String protocolId) { - List fieldList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Map fixFieldMap = fieldList.stream().collect( - Collectors.toMap(FieldConfig::getId, FieldConfig::getFieldName) - ); - return fixFieldMap; - } - - private String getRuleFields(String[] preRuleConfigList, Map fixDataMap, Map fixFieldMap) { - Map ruleFieldMap= new HashMap<>(); - for (String preRuleConfigId : preRuleConfigList) { - String fieldName = fixFieldMap.get(preRuleConfigId); - if (fixDataMap.containsKey(fieldName)) { - ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); - } - } - return JSONObject.toJSONString(ruleFieldMap); - } - - //弃置 - private String ListToString(List ruleFieldList) { - String ruleFields = ""; - for (String ruleField : ruleFieldList) { - ruleFields += ruleField + ","; - } - ruleFields = StringUtils.isEmpty(ruleFields) ? ruleFields : ruleFields.substring(0, ruleFields.length() - 1); - return ruleFields; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java index 6177e10..bfa87a5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java @@ -2,7 +2,7 @@ public interface SafeStrategy { - String decryption(byte[] bytes); + String decryption(String cipher); String encryption(String lightText); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java index 618716c..6236302 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java @@ -9,9 +9,9 @@ //十六进制的字符串转换成字节数组 byte[] bytes = hexStrToBinaryStr(msg); //计算CRC8 - byte crc8 = CRC8(bytes, 0, bytes.length); - String crc8ToStr = "" + Integer.toHexString(0xff & crc8); - return crc8ToStr; +// String crc8ToStr = "" + Integer.toHexString(0xff & crc8); +// return crc8ToStr; + return null; } /** @@ -33,50 +33,5 @@ return bytes; } - /** - * CRC8 校验 多项式 x8+x2+x+1 - * - * @param b - * @param off - * @param len - * @return - */ - public static byte CRC8(final byte[] b, final int off, final int len) { - byte result = 0x00; - for (int i = 0; i < len; i++) { - result = CHECKSUM_TABLE[(result ^ (b[i + off] & 0xFF)) & 0xFF]; - } - return (byte) (result & 0xFFL); - } - - private final static byte[] CHECKSUM_TABLE = {(byte) 0x00, (byte) 0x07, (byte) 0x0e, (byte) 0x09, (byte) 0x1c, (byte) 0x1b, - (byte) 0x12, (byte) 0x15, (byte) 0x38, (byte) 0x3f, (byte) 0x36, (byte) 0x31, (byte) 0x24, (byte) 0x23, (byte) 0x2a, - (byte) 0x2d, (byte) 0x70, (byte) 0x77, (byte) 0x7e, (byte) 0x79, (byte) 0x6c, (byte) 0x6b, (byte) 0x62, (byte) 0x65, - (byte) 0x48, (byte) 0x4f, (byte) 0x46, (byte) 0x41, (byte) 0x54, (byte) 0x53, (byte) 0x5a, (byte) 0x5d, (byte) 0xe0, - (byte) 0xe7, (byte) 0xee, (byte) 0xe9, (byte) 0xfc, (byte) 0xfb, (byte) 0xf2, (byte) 0xf5, (byte) 0xd8, (byte) 0xdf, - (byte) 0xd6, (byte) 0xd1, (byte) 0xc4, (byte) 0xc3, (byte) 0xca, (byte) 0xcd, (byte) 0x90, (byte) 0x97, (byte) 0x9e, - (byte) 0x99, (byte) 0x8c, (byte) 0x8b, (byte) 0x82, (byte) 0x85, (byte) 0xa8, (byte) 0xaf, (byte) 0xa6, (byte) 0xa1, - (byte) 0xb4, (byte) 0xb3, (byte) 0xba, (byte) 0xbd, (byte) 0xc7, (byte) 0xc0, (byte) 0xc9, (byte) 0xce, (byte) 0xdb, - (byte) 0xdc, (byte) 0xd5, (byte) 0xd2, (byte) 0xff, (byte) 0xf8, (byte) 0xf1, (byte) 0xf6, (byte) 0xe3, (byte) 0xe4, - (byte) 0xed, (byte) 0xea, (byte) 0xb7, (byte) 0xb0, (byte) 0xb9, (byte) 0xbe, (byte) 0xab, (byte) 0xac, (byte) 0xa5, - (byte) 0xa2, (byte) 0x8f, (byte) 0x88, (byte) 0x81, (byte) 0x86, (byte) 0x93, (byte) 0x94, (byte) 0x9d, (byte) 0x9a, - (byte) 0x27, (byte) 0x20, (byte) 0x29, (byte) 0x2e, (byte) 0x3b, (byte) 0x3c, (byte) 0x35, (byte) 0x32, (byte) 0x1f, - (byte) 0x18, (byte) 0x11, (byte) 0x16, (byte) 0x03, (byte) 0x04, (byte) 0x0d, (byte) 0x0a, (byte) 0x57, (byte) 0x50, - (byte) 0x59, (byte) 0x5e, (byte) 0x4b, (byte) 0x4c, (byte) 0x45, (byte) 0x42, (byte) 0x6f, (byte) 0x68, (byte) 0x61, - (byte) 0x66, (byte) 0x73, (byte) 0x74, (byte) 0x7d, (byte) 0x7a, (byte) 0x89, (byte) 0x8e, (byte) 0x87, (byte) 0x80, - (byte) 0x95, (byte) 0x92, (byte) 0x9b, (byte) 0x9c, (byte) 0xb1, (byte) 0xb6, (byte) 0xbf, (byte) 0xb8, (byte) 0xad, - (byte) 0xaa, (byte) 0xa3, (byte) 0xa4, (byte) 0xf9, (byte) 0xfe, (byte) 0xf7, (byte) 0xf0, (byte) 0xe5, (byte) 0xe2, - (byte) 0xeb, (byte) 0xec, (byte) 0xc1, (byte) 0xc6, (byte) 0xcf, (byte) 0xc8, (byte) 0xdd, (byte) 0xda, (byte) 0xd3, - (byte) 0xd4, (byte) 0x69, (byte) 0x6e, (byte) 0x67, (byte) 0x60, (byte) 0x75, (byte) 0x72, (byte) 0x7b, (byte) 0x7c, - (byte) 0x51, (byte) 0x56, (byte) 0x5f, (byte) 0x58, (byte) 0x4d, (byte) 0x4a, (byte) 0x43, (byte) 0x44, (byte) 0x19, - (byte) 0x1e, (byte) 0x17, (byte) 0x10, (byte) 0x05, (byte) 0x02, (byte) 0x0b, (byte) 0x0c, (byte) 0x21, (byte) 0x26, - (byte) 0x2f, (byte) 0x28, (byte) 0x3d, (byte) 0x3a, (byte) 0x33, (byte) 0x34, (byte) 0x4e, (byte) 0x49, (byte) 0x40, - (byte) 0x47, (byte) 0x52, (byte) 0x55, (byte) 0x5c, (byte) 0x5b, (byte) 0x76, (byte) 0x71, (byte) 0x78, (byte) 0x7f, - (byte) 0x6a, (byte) 0x6d, (byte) 0x64, (byte) 0x63, (byte) 0x3e, (byte) 0x39, (byte) 0x30, (byte) 0x37, (byte) 0x22, - (byte) 0x25, (byte) 0x2c, (byte) 0x2b, (byte) 0x06, (byte) 0x01, (byte) 0x08, (byte) 0x0f, (byte) 0x1a, (byte) 0x1d, - (byte) 0x14, (byte) 0x13, (byte) 0xae, (byte) 0xa9, (byte) 0xa0, (byte) 0xa7, (byte) 0xb2, (byte) 0xb5, (byte) 0xbc, - (byte) 0xbb, (byte) 0x96, (byte) 0x91, (byte) 0x98, (byte) 0x9f, (byte) 0x8a, (byte) 0x8d, (byte) 0x84, (byte) 0x83, - (byte) 0xde, (byte) 0xd9, (byte) 0xd0, (byte) 0xd7, (byte) 0xc2, (byte) 0xc5, (byte) 0xcc, (byte) 0xcb, (byte) 0xe6, - (byte) 0xe1, (byte) 0xe8, (byte) 0xef, (byte) 0xfa, (byte) 0xfd, (byte) 0xf4, (byte) 0xf3}; } \ No newline at end of file diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java index 27c2838..6e078a3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java @@ -1,9 +1,6 @@ package com.casic.missiles.parser.safe.impl; -import cn.hutool.core.util.CharsetUtil; -import cn.hutool.crypto.symmetric.SM4; -import cn.hutool.crypto.symmetric.SymmetricCrypto; - +import com.casic.missiles.parser.safe.SafeStrategy; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; @@ -11,19 +8,44 @@ import org.bouncycastle.crypto.engines.SM4Engine; import org.bouncycastle.crypto.params.KeyParameter; import org.bouncycastle.util.encoders.Hex; - -import static cn.hutool.crypto.Mode.ECB; -import static cn.hutool.crypto.Padding.NoPadding; +import org.springframework.stereotype.Component; /** * SM4算法工具类 */ @Slf4j -public class Sm4 { +@Component("sm4") +public class Sm4 implements SafeStrategy { //加解密的字节快大小 public static final int BlockSize = 16; + @Override + public String decryption(String cipher) { + byte[] keyByte = { + 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 + }; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(keyByte); + byte[] in = Hex.decode(cipher); + byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); + String plain = EcbDecrypt(in, keyBytes); + return plain; + } + + @Override + public String encryption(String cipher) { + byte[] keyByte = { + 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 + }; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(keyByte); + byte[] in = Hex.decode(cipher); + byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); + String plain = EcbDecrypt(in, keyBytes); + return plain; + } + /** * SM4ECB加密算法,对内 * @@ -32,8 +54,6 @@ * @return */ private static byte[] ecb_encrypt(byte[] in, byte[] keyBytes) { - - SM4Engine sm4Engine = new SM4Engine(); sm4Engine.init(true, new KeyParameter(keyBytes)); byte[] out = new byte[in.length]; @@ -58,27 +78,6 @@ return cipher; } - - /** - * hutool 解密SM4 - * - * @param encodeContent - * @return - */ - public static String decode(String encodeContent) { - String key = "24ad182507479a5da3ad94d9d78ea203"; - try { - SymmetricCrypto sm4 = new SM4(ECB, NoPadding, key.getBytes()); - String decryptStr = sm4.decryptStr(encodeContent, CharsetUtil.CHARSET_UTF_8); - return decryptStr; - } catch (Exception e) { - e.printStackTrace(); - log.error("SM4解密失败"); - } - return null; - } - - /** * SM4的ECB加密算法 * @@ -129,20 +128,6 @@ return plain; } - /** - * SM4的ECB解密算法 - * - * @param cipher 输入的密文字符串 - * @param key 密钥 - * @return - */ - public static String EcbDecrypt(String cipher, String key) { - byte[] in = Hex.decode(cipher); - byte[] keyBytes = Hex.decode(key); - - String plain = EcbDecrypt(in, keyBytes); - return plain; - } /** * 主函数 @@ -151,28 +136,24 @@ */ public static void main(String[] args) { byte[] ciphertext = { + 0x4B, (byte) 0x8C, (byte) 0x9D, 0x08, (byte) 0xE4, (byte) 0xD3, 0x64, 0x42, (byte) 0xB9, (byte) 0xA5, (byte) 0xFE, (byte) 0xCD, (byte) 0x91, 0x1B, 0x38, (byte) 0xAC, (byte) 0xE9, 0x1C, (byte) 0xCD, 0x53, 0x02, (byte) 0xD7, 0x0C, (byte) 0x9B, (byte) 0x96, 0x30, 0x62, (byte) 0xE8, (byte) 0xFB, (byte) 0xEF, (byte) 0xB9, (byte) 0xFF, (byte) 0xDE, 0x19, (byte) 0x80, 0x35, 0x3E, (byte) 0x90, 0x4F, 0x2F, 0x12, 0x2B, 0x19, (byte) 0x8B, 0x6C, 0x7A, (byte) 0x85, (byte) 0xA1, (byte) 0xB1, (byte) 0x86, (byte) 0xA3, 0x7A, 0x46, 0x0C, 0x2F, (byte) 0x94, 0x4F, 0x7F, 0x2C, 0x56, 0x14, (byte) 0xF3, (byte) 0x89, (byte) 0xC3, - 0x3F, 0x20, (byte) 0xF9, (byte) 0x87, (byte) 0xA1, 0x60, (byte) 0xD9, (byte) 0xA8, (byte) 0xFD, (byte) 0xD7, (byte) 0x9B, 0x4B, 0x26, 0x06, 0x30, 0x44}; + 0x3F, 0x20, (byte) 0xF9, (byte) 0x87, (byte) 0xA1, 0x60, (byte) 0xD9, (byte) 0xA8, (byte) 0xFD, (byte) 0xD7, (byte) 0x9B, 0x4B, 0x26, 0x06, 0x30, 0x44 + }; ByteBuf in = ByteBufAllocator.DEFAULT.heapBuffer(); in.writeBytes(ciphertext); - byte[] keyByte = { 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 }; ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); - key.writeBytes(ciphertext); - String resCipherData = decode(ByteBufUtil.hexDump(in)); - ByteBuf out = ByteBufAllocator.DEFAULT.heapBuffer(); -// out.writeBytes(resCipherData); -// System.out.println(hexBytes); - System.out.println(resCipherData.toString()); -// String resPlainData = EcbDecrypt(resCipherData, key); -// System.out.println("原始明文:" + data); -// System.out.println("解密后明文:" + resPlainData); + key.writeBytes(keyByte); +// String resCipherData = EcbDecrypt(ByteBufUtil.hexDump(in), ByteBufUtil.hexDump(key)); +// System.out.println(resCipherData); } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java index 1395a51..ac5f957 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java @@ -1,7 +1,7 @@ package com.casic.missiles.parser.safe.impl; import io.netty.buffer.ByteBufUtil; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** *

@@ -14,9 +14,8 @@ * @author hyl * @version v1.0: Tea.java, v 0.1 2021/3/12 13:48 $ */ -@Service("tea") -///tea算法类 - +//tea算法类 +@Component("tea") public class Tea { public static byte[] MyTea_Encrypt(byte[] MyTeaContent, int ByteLen, byte[] MyTeakey) { @@ -99,7 +98,6 @@ // for(int i32Index = 0; i32Index < 8; i32Index++) { // System.out.print("0x" + Integer.toHexString(MyContent[i32Index]) + " "); // } - // System.out.println("密钥为:"); // for(int i32Index = 0; i32Index < 16; i32Index++) { // System.out.print("0x" + Integer.toHexString(MyKeys[i32Index]) + " "); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java index bdd0721..bd1516a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java @@ -3,7 +3,7 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.parser.sender.DataSubscribeProvider; import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponents; import org.springframework.web.util.UriComponentsBuilder; @@ -12,7 +12,7 @@ import java.util.Collections; import java.util.Map; -@Service("functionCallback") +@Component("functionCallback") public class FunctionCallback implements DataSubscribeProvider { @Resource diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java index 0b44fb9..7526de2 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.Map; -@Service("middleware") +@Component("middleware") public class MiddlewareSubscribe implements DataSubscribeProvider { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java index 5dcee3f..e2f1192 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.Map; -@Service("nosql") +@Component("nosql") public class NoSqlSubscribe implements DataSubscribeProvider { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java b/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java new file mode 100644 index 0000000..81a5324 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java @@ -0,0 +1,86 @@ +package com.casic.missiles.pojo; + +import lombok.Data; + +/** + * 协议 + */ +@Data +public class Msg { + + /** + * 前导码 + */ + private String preamble; + + /** + * 版本号 + */ + private String version; + + /** + * 内容长度 + */ + private int leng; + + /** + * 设备ID + */ + private String deviceId; + + /** + * 通讯方式 + */ + private Integer connType; + + /** + * 加密方式 + */ + private Integer encryType; + + /** + * 目标地址 + */ + private String destAddr; + + /** + * PDUType + */ + private String PDUType; + + /** + * 操作类型 + */ + private Integer operateType; + + /** + * 传输控制位 PDUType.bit7=0时,表示存在后续的访问;当PDUType.bit7=1时,表示无后续的访问。 + */ + private Integer transControlFlag; + + /** + * 设备类型 + */ + private Integer deviceType; + + /** + * 序号 + */ + private Integer seq; + + /** + * tagList + */ + private String tagList; + + /** + * OidList + */ + private String OidList; + + /** + * CRC + */ + private String CRC; + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java index 40a5265..97cc984 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java @@ -40,7 +40,7 @@ String httpContent = msg.toString(Charset.defaultCharset()); log.info(" String : " + msg.toString(Charset.defaultCharset())); String majorContent = httpContent.substring(httpContent.indexOf("{"), httpContent.lastIndexOf("}") + 1); - String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("serviceData")).get("Value")); + String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("RegistryData")).get("Value")); log.info("----------------------------------" + values); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); bufferContent.writeBytes(values.getBytes(Charset.forName("ISO-8859-1"))); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java index 1b132a7..e3ced4b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java @@ -35,7 +35,7 @@ String httpContent = msg.toString(Charset.defaultCharset()); log.info(" String : " + msg.toString(Charset.defaultCharset())); String majorContent = httpContent.substring(httpContent.indexOf("{"), httpContent.lastIndexOf("}") + 1); - String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("serviceData")).get("Value")); + String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("RegistryData")).get("Value")); log.info("----------------------------------" + values); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); bufferContent.writeBytes(values.getBytes(Charset.forName("ISO-8859-1"))); diff --git a/sensorhub-core/src/main/resources/application.properties b/sensorhub-core/src/main/resources/application.properties deleted file mode 100644 index 8b13789..0000000 --- a/sensorhub-core/src/main/resources/application.properties +++ /dev/null @@ -1 +0,0 @@ - diff --git a/sensorhub-core/src/main/resources/config/application-dev.yml b/sensorhub-core/src/main/resources/config/application-dev.yml index 4f897a8..dcc4c2d 100644 --- a/sensorhub-core/src/main/resources/config/application-dev.yml +++ b/sensorhub-core/src/main/resources/config/application-dev.yml @@ -4,9 +4,9 @@ spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true + url: jdbc:mysql://127.0.0.1:3306/sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true username: root - password: Casic203 + password: root session: store-type: redis redis: diff --git a/sensorhub-core/src/main/resources/config/application.yml b/sensorhub-core/src/main/resources/config/application.yml index ae89f9d..7965da1 100644 --- a/sensorhub-core/src/main/resources/config/application.yml +++ b/sensorhub-core/src/main/resources/config/application.yml @@ -30,6 +30,13 @@ port: 6379 password: ew5T4K3#203lwh config-prefix: 'Casic:' +#代码生成器配置 +code: + generate: + #作者 + author: cz + #待生成对象表名 + table-name: bussiness_field_config,combined_field_config sensorhub: config: port: 7091 diff --git a/sensorhub-support/pom.xml b/sensorhub-support/pom.xml index 9a71296..761601c 100644 --- a/sensorhub-support/pom.xml +++ b/sensorhub-support/pom.xml @@ -42,6 +42,12 @@ ${redis.version} + + com.baomidou + mybatis-plus-generator + ${mybatis-plus-generator.version} + + org.reflections diff --git a/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java b/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java new file mode 100644 index 0000000..515ca53 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java @@ -0,0 +1,14 @@ +package com.casic.missiles.enums; + +/** + * @author + * @date + */ +public interface FixedPropertyEnum { + + String FIXED_POSITION = "fixedPosition"; + + String TOTAL_LENGTH = "totalLength"; + + String TAIL_POSITION = "tailPosition"; +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/CombinedFieldMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CombinedFieldMapper.java new file mode 100644 index 0000000..38e8f42 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CombinedFieldMapper.java @@ -0,0 +1,15 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.CombinedFieldConfig; +import org.apache.ibatis.annotations.Mapper; + +/** + * @author cz + * + */ +@Mapper +public interface CombinedFieldMapper extends BaseMapper { + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java new file mode 100644 index 0000000..128b09d --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java @@ -0,0 +1,10 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.CommandEventConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface CommandEventMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java new file mode 100644 index 0000000..042eb3c --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.DatagramEventConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface DatagramEventConfigMapper extends BaseMapper { +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java new file mode 100644 index 0000000..fc95cf4 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java @@ -0,0 +1,8 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.FieldConfig; + +public interface FieldConfigMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldRuleConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldRuleConfigMapper.java new file mode 100644 index 0000000..b310a08 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldRuleConfigMapper.java @@ -0,0 +1,10 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.FieldRuleConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface FieldRuleConfigMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java new file mode 100644 index 0000000..9060a69 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.ProtocolConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface ProtocolConfigMapper extends BaseMapper { +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolFieldConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolFieldConfigMapper.java new file mode 100644 index 0000000..1b47180 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolFieldConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +public interface ProtocolFieldConfigMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java new file mode 100644 index 0000000..6fa6936 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.RuleConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface RuleConfigMapper extends BaseMapper { +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/AbstractFieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/AbstractFieldConfig.java new file mode 100644 index 0000000..ba9aea2 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/AbstractFieldConfig.java @@ -0,0 +1,38 @@ +package com.casic.missiles.pojo; + +import lombok.Data; + +@Data +public class AbstractFieldConfig { + /** + * 字段名称 + */ + private String fieldName; + /** + * 按照字段评估进行字段解析 + */ + private String ruleJson; + /** + * 起始位置(单位byte) + */ + private Integer OriginPositionByte; + /** + * 起始位置,是否需要bit位置(单位bit)小于8, 没有不需要填写 + */ + private String OriginPositionBit; + /** + * 偏移长度 + */ + private Integer offsetLength; + /** + * 偏移单位(bit/byte) + */ + private String offsetUnit; + /** + * 是否需要转存 + */ + private Integer isStorage; + + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/CombinedFieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/CombinedFieldConfig.java new file mode 100644 index 0000000..4f4de6a --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/CombinedFieldConfig.java @@ -0,0 +1,41 @@ +package com.casic.missiles.pojo; + +import lombok.Data; + +import java.util.Date; + +/** + * 组合配置 + * + * @author cz + * @date 20 + */ +@Data +public class CombinedFieldConfig { + + private Long id; + private Long ruleId; + /** + * 前缀编码 + */ + private String prefixCode; + + /** + * 字段动态的id + */ + private Long dynamicLengthId; + /** + * 对应的要解析字段的ids + */ + private String dataFieldIds; + + /** + * 字段动态的id + */ + private String combinedFieldIds; + + private Date lastTime; + + private Date createTime; + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldConfig.java index a07d20d..8304dc6 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldConfig.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldConfig.java @@ -5,31 +5,28 @@ import java.util.Date; +/** + * @author cz + * 1、该表与实际解析的内容实例解析有关 + * 2、该表字段是随机出现的,和帧结构无关,无法预料的 + * 3、该表字段解析根据FieldEvaluatorConfig进行字段解析 + */ @Data -@TableName("field_config") -public class FieldConfig { +@TableName("business_field_config") +public class FieldConfig extends AbstractFieldConfig { private Long id; -// private String preFieldConfig; - private Long protocolId; - - private String isFixed; - private String uploadDeliveryChange; - - private String replyRule; - private String ruleJson; - + /** + * 协议配置id + */ + private Long ruleId; + /** + * 字段名称 + */ private String fieldName; - private String isStorage; - private Integer orignPosition; - private String exactOrignPosition; - - private Integer offsetLength; - private String offsetUnit; private String ownerId; private Date createTime; private Date lastTime; - } diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldRuleConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldRuleConfig.java new file mode 100644 index 0000000..2e09879 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldRuleConfig.java @@ -0,0 +1,20 @@ +package com.casic.missiles.pojo; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +@TableName("field_rule_config") +@Data +public class FieldRuleConfig { + + private Long id; + private String name; + private String desc; + private String condition; + private String excuteOperation; + private Date lasTime; + private Date createTime; + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/Msg.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/Msg.java deleted file mode 100644 index 81a5324..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/Msg.java +++ /dev/null @@ -1,86 +0,0 @@ -package com.casic.missiles.pojo; - -import lombok.Data; - -/** - * 协议 - */ -@Data -public class Msg { - - /** - * 前导码 - */ - private String preamble; - - /** - * 版本号 - */ - private String version; - - /** - * 内容长度 - */ - private int leng; - - /** - * 设备ID - */ - private String deviceId; - - /** - * 通讯方式 - */ - private Integer connType; - - /** - * 加密方式 - */ - private Integer encryType; - - /** - * 目标地址 - */ - private String destAddr; - - /** - * PDUType - */ - private String PDUType; - - /** - * 操作类型 - */ - private Integer operateType; - - /** - * 传输控制位 PDUType.bit7=0时,表示存在后续的访问;当PDUType.bit7=1时,表示无后续的访问。 - */ - private Integer transControlFlag; - - /** - * 设备类型 - */ - private Integer deviceType; - - /** - * 序号 - */ - private Integer seq; - - /** - * tagList - */ - private String tagList; - - /** - * OidList - */ - private String OidList; - - /** - * CRC - */ - private String CRC; - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/PreRuleConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/PreRuleConfig.java deleted file mode 100644 index bfcf914..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/PreRuleConfig.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.casic.missiles.pojo; - -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -import java.util.Date; - -@Data -@TableName("pre_rule_config") -public class PreRuleConfig { - - private Long id; - private String protocolId; - private String ruleFieldId; - private String ownerId; - private Date createTime; - private Date lastTime; -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolConfig.java index 274ad42..bdac11f 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolConfig.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolConfig.java @@ -5,18 +5,52 @@ import java.util.Date; +/** + * 协议配置表,协议配置与帧结构有关 + * 1、层级关系,协议之后是规则,规则对应设备类型的各种上数规则 + * 2、规则对应协议配置的实例流程 + * 3、每种可根据设备类型和操作类型进行上数规则进行区分 + */ @Data @TableName("protocol_config") public class ProtocolConfig { private Long id; + /** + * 前导码 + */ private String preFix; - private String unpackId; - private String totalLengthId; - private String totalLengthFilterField; + /** + * 拆包id + */ + private Long unpackId; + /** + * 总长度id + */ + private Long totalLengthId; + /** + * + */ + private String totalLengthFilterFields; + /** + * 动态长度ids + */ private String dynamicLengthId; + /** + * 动态长度json(预留字段) + */ private String dynamicLengthJson; - private String tailStr; + /** + * 规则字段所解析预准备的字段 + */ + private String rulePrepareFields; + /** + * 结尾标志 + */ + private Long tailStr; + /** + * 备注 + */ private String remark; private String ownerId; private Date createTime; diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolFieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolFieldConfig.java new file mode 100644 index 0000000..db794bd --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolFieldConfig.java @@ -0,0 +1,43 @@ +package com.casic.missiles.pojo; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +/** + * 协议字段配置表 + * 该表用户存放帧结构固定格式的字段 + * 有以下两个用途 + * (1)、固定格式的字段可用于规则匹配 + * (2)、固定格式的字段可用于报文回复 + * @author cz + * @date 2023-06-09 + */ +@Data +@TableName("protocol_field_config") +public class ProtocolFieldConfig extends AbstractFieldConfig{ + + private Long id; + /** + * 协议配置id + */ + private Long protocolId; + /** + * 上传下发是否有变化, 没有变化,可以直接组装 + */ + private String isReplyFix; + /** + * 按照字段评估进行字段解析 + */ + private Long fieldEvaluatorId; + /** + * 回复规则 + */ + private String replyRule; + + private String ownerId; + private Date createTime; + private Date lastTime; + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java index 3b53493..febf835 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java @@ -6,18 +6,40 @@ import java.util.Date; /** - * 加密字段解析和规则有关,事件调到该流程下面 + * @author cz + * todo: 匹配协议对应业务实例 + * 1、一个协议可以多种的流程规则 + * 2、规则可以支持递归规则流程 */ @Data @TableName("rule_config") public class RuleConfig { - private Long id; private String protocolId; - private String isBizField; - private String parseRuleJson; + /** + * 是否完成规则配置,没有完成, + * 则需要根据规则继续匹配 + */ + private String isFinishMatch; + /** + * 待匹配解析规则 + * {“data_field”:"data_value"} + */ + private String matchRuleJson; + /** + * 待解析字段ids + */ private String dataFieldIds; - private String aviatorFilterJson; + + /** + * 待解析组合字段ids + */ + private String combinedFieldIds; + + /** + * aviator + */ + private String conditionExpression; private Date createTime; private Date lastTime; } diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleDict.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleDict.java deleted file mode 100644 index cc7f389..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleDict.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.casic.missiles.pojo; - -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -@Data -@TableName("rule_dict") -public class RuleDict { - - private Long id; - private Long pid; - private String name; - private String code; - private String ownerId; - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleEvaluator.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleEvaluator.java deleted file mode 100644 index ed16610..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleEvaluator.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.pojo; - -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -import java.util.Date; - -@TableName("rule_evaluator") -@Data -public class RuleEvaluator { - - private Long id; - private String name; - private String desc; - private String condition; - private String excuteOperation; - private Date lasTime; - private Date createTime; - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/CombinedFieldConfigRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/CombinedFieldConfigRegistry.java new file mode 100644 index 0000000..fa59b90 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/CombinedFieldConfigRegistry.java @@ -0,0 +1,12 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.CombinedFieldConfig; + +import java.util.List; + +public interface CombinedFieldConfigRegistry { + + List getCombinedFieldConfigList(Long ruleId); + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/CommandEventRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/CommandEventRegistry.java new file mode 100644 index 0000000..fb97d87 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/CommandEventRegistry.java @@ -0,0 +1,8 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.CommandEventConfig; + +public interface CommandEventRegistry { + + CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName); +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/DatagramEventRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/DatagramEventRegistry.java new file mode 100644 index 0000000..fb34641 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/DatagramEventRegistry.java @@ -0,0 +1,11 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.DatagramEventConfig; + +import java.util.List; + +public interface DatagramEventRegistry{ + + List getDatagramEventList(Long ruleId); + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/FieldConfigRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/FieldConfigRegistry.java new file mode 100644 index 0000000..759642e --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/FieldConfigRegistry.java @@ -0,0 +1,20 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.FieldConfig; + +import java.util.List; + +public interface FieldConfigRegistry { + + + List getFieldConfigList(Long ruleId); + + FieldConfig getFieldConfigById(String fieldId); + + List getFieldConfigs(String protocolId, Integer isFixed); + + List getStorageFieldConfig(String protocolId); + + +} + diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/FieldRuleConfigRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/FieldRuleConfigRegistry.java new file mode 100644 index 0000000..33da70c --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/FieldRuleConfigRegistry.java @@ -0,0 +1,11 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.FieldRuleConfig; + +import java.util.List; + +public interface FieldRuleConfigRegistry { + + List getFieldRuleConfigList(Long ruleId); + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/ProtocolConfigRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/ProtocolConfigRegistry.java new file mode 100644 index 0000000..1725189 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/ProtocolConfigRegistry.java @@ -0,0 +1,12 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.ProtocolConfig; + +import java.util.List; + +public interface ProtocolConfigRegistry { + + List getProtocolConfigList(String firstChar); + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/ProtocolFieldConfigRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/ProtocolFieldConfigRegistry.java new file mode 100644 index 0000000..19d1b9a --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/ProtocolFieldConfigRegistry.java @@ -0,0 +1,14 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.ProtocolFieldConfig; + +import java.util.List; + +public interface ProtocolFieldConfigRegistry { + + + List getProtocolFieldConfigList(Long protocolId); + + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/RuleConfigRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/RuleConfigRegistry.java new file mode 100644 index 0000000..3d2a75c --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/RuleConfigRegistry.java @@ -0,0 +1,14 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.RuleConfig; + +import java.util.List; + +public interface RuleConfigRegistry { + + RuleConfig getNextRuleConfig(String ruleFields); + + + List getRuleConfigById(Long protocolId); + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CombinedFieldConfigRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CombinedFieldConfigRegistryImpl.java new file mode 100644 index 0000000..822cac6 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CombinedFieldConfigRegistryImpl.java @@ -0,0 +1,24 @@ +package com.casic.missiles.registry.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.CombinedFieldMapper; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.registry.CombinedFieldConfigRegistry; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class CombinedFieldConfigRegistryImpl extends ServiceImpl implements CombinedFieldConfigRegistry { + + @Override + public List getCombinedFieldConfigList(Long ruleId) { + QueryWrapper queryWrapper = new QueryWrapper() + .eq("rule_id", ruleId); + List combinedFieldConfigs = this.baseMapper.selectList(queryWrapper); + return combinedFieldConfigs; + } + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CommandEventRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CommandEventRegistryImpl.java new file mode 100644 index 0000000..f0d3559 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CommandEventRegistryImpl.java @@ -0,0 +1,25 @@ +package com.casic.missiles.registry.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.CommandEventMapper; +import com.casic.missiles.pojo.CommandEventConfig; +import com.casic.missiles.registry.CommandEventRegistry; + +import java.util.List; +import java.util.Optional; + +public class CommandEventRegistryImpl extends ServiceImpl implements CommandEventRegistry { + + @Override + public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { + QueryWrapper queryWrapper = new QueryWrapper() + .eq("protocol_id", protocolId) + .eq("scene", sceneName) + .eq("enabled", 1); + List commandEventConfig = this.baseMapper.selectList(queryWrapper); + Optional optionalEventConfig = commandEventConfig.stream().findFirst(); + return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; + } + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/DatagramEventRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/DatagramEventRegistryImpl.java new file mode 100644 index 0000000..2e58698 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/DatagramEventRegistryImpl.java @@ -0,0 +1,26 @@ +package com.casic.missiles.registry.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.DatagramEventConfigMapper; +import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.registry.DatagramEventRegistry; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class DatagramEventRegistryImpl extends ServiceImpl implements DatagramEventRegistry { + + + @Override + public List getDatagramEventList(Long ruleId) { + QueryWrapper queryWrapper = new QueryWrapper() + .eq("rule_id", ruleId); + List fieldConfigList = this.baseMapper.selectList(queryWrapper); + return fieldConfigList; + } + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/FieldConfigRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/FieldConfigRegistryImpl.java new file mode 100644 index 0000000..6ae4422 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/FieldConfigRegistryImpl.java @@ -0,0 +1,50 @@ +package com.casic.missiles.registry.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.FieldConfigMapper; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.registry.FieldConfigRegistry; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * @author cz + */ +@Service +public class FieldConfigRegistryImpl extends ServiceImpl implements FieldConfigRegistry { + + @Override + public List getFieldConfigList(Long ruleId) { + QueryWrapper queryWrapper = new QueryWrapper() + .eq("rule_id", ruleId); + List fieldConfigList = this.baseMapper.selectList(queryWrapper); + return fieldConfigList; + } + + @Override + public FieldConfig getFieldConfigById(String fieldId) { + FieldConfig fieldConfig = this.baseMapper.selectById(fieldId); + return fieldConfig; + } + + @Override + public List getFieldConfigs(String protocolId, Integer isFixed) { + QueryWrapper queryWrapper = new QueryWrapper() + .eq("protocol_id", protocolId) + .eq("is_fixed", isFixed); + List fieldConfigList = this.baseMapper.selectList(queryWrapper); + return fieldConfigList; + } + + @Override + public List getStorageFieldConfig(String protocolId) { + QueryWrapper queryWrapper = new QueryWrapper() + .eq("protocol_id", protocolId) + .eq("is_fixed", 1) + .eq("is_storage", 1); + List fieldConfigList = this.baseMapper.selectList(queryWrapper); + return fieldConfigList; + } +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/FieldRuleConfigRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/FieldRuleConfigRegistryImpl.java new file mode 100644 index 0000000..406fe65 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/FieldRuleConfigRegistryImpl.java @@ -0,0 +1,23 @@ +package com.casic.missiles.registry.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.FieldRuleConfigMapper; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.registry.FieldRuleConfigRegistry; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class FieldRuleConfigRegistryImpl extends ServiceImpl implements FieldRuleConfigRegistry { + + @Override + public List getFieldRuleConfigList(Long ruleId) { + QueryWrapper queryWrapper = new QueryWrapper() + .eq("rule_id", ruleId); + List fieldRuleConfigList = this.baseMapper.selectList(queryWrapper); + return fieldRuleConfigList; + } + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/ProtocolConfigRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/ProtocolConfigRegistryImpl.java new file mode 100644 index 0000000..8a516e5 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/ProtocolConfigRegistryImpl.java @@ -0,0 +1,26 @@ +package com.casic.missiles.registry.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.ProtocolConfigMapper; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.registry.ProtocolConfigRegistry; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class ProtocolConfigRegistryImpl extends ServiceImpl implements ProtocolConfigRegistry { + + /** + * 无条件全查询,作为一次加载的初始化查询 + * + * @return + */ + @Override + public List getProtocolConfigList(String firstChar) { + + return this.baseMapper.selectList(null); + } + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/ProtocolFieldConfigRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/ProtocolFieldConfigRegistryImpl.java new file mode 100644 index 0000000..f4c5a89 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/ProtocolFieldConfigRegistryImpl.java @@ -0,0 +1,26 @@ +package com.casic.missiles.registry.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.ProtocolFieldConfigMapper; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.registry.ProtocolFieldConfigRegistry; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; + +@Service +public class ProtocolFieldConfigRegistryImpl extends ServiceImpl implements ProtocolFieldConfigRegistry { + + @Override + public List getProtocolFieldConfigList(Long protocolId) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("protocol_id", protocolId); + List protocolFieldConfigs = this.baseMapper.selectList(queryWrapper); + return protocolFieldConfigs; + } + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/RuleConfigRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/RuleConfigRegistryImpl.java new file mode 100644 index 0000000..63865ed --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/RuleConfigRegistryImpl.java @@ -0,0 +1,31 @@ +package com.casic.missiles.registry.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.RuleConfigMapper; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.RuleConfigRegistry; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class RuleConfigRegistryImpl extends ServiceImpl implements RuleConfigRegistry { + + + @Override + public RuleConfig getNextRuleConfig(String ruleFields) { + QueryWrapper queryWrapper = new QueryWrapper() + .eq("parse_rule_json", ruleFields); + return this.baseMapper.selectOne(queryWrapper); + } + + @Override + public List getRuleConfigById(Long protocolId) { + QueryWrapper queryWrapper = new QueryWrapper() + .eq("protocol_id", protocolId); + return this.baseMapper.selectList(queryWrapper); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java index 608af3a..32cc8a4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java @@ -2,48 +2,47 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.delivery.decorator.ByteDecorator; +import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @AllArgsConstructor public class FieldDecoratorManger { - private final RuleDictDao ruleDictDao; + private final RuleConfigRegistry ruleDictDao; // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 // (1)静态的业务字段是字典里面可以配置的 // (2)动态的业务字段是通过规则生成的 public String contentMerge(String ruleJson, String sceneConent, String dynamicContent) { - List ruleDictList = ruleDictDao.getRuleDictConfig(); - Map ruleDictMap = ruleDictList.stream().collect( - Collectors.toMap(RuleDict::getId, e -> e)); - List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); - for (Map ruleMap : ruleMapList) { - String ruleType = String.valueOf(ruleMap.get("ruleType")); - ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); - NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); - byteDecorator.nodeDecoratorRule(nodeDecoratorParm); - } +// List ruleDictList = ruleDictDao.getRuleDictConfig(); +// Map ruleDictMap = ruleDictList.stream().collect( +// Collectors.toMap(RuleDict::getId, e -> e)); +// List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); +// for (Map ruleMap : ruleMapList) { +// String ruleType = String.valueOf(ruleMap.get("ruleType")); +// ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); +// NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); +// byteDecorator.nodeDecoratorRule(nodeDecoratorParm); +// } return null; } - - private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { - NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() - .contents(sceneConent) - .dynamicContent(dynamicContent) - .ruletypeId(ruletypeId) - .ruleDictMap(ruleDictMap) - .build(); - return nodeDecoratorParm; - } +// +// private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { +// NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() +// .contents(sceneConent) +// .dynamicContent(dynamicContent) +// .ruletypeId(ruletypeId) +// .ruleDictMap(ruleDictMap) +// .build(); +// return nodeDecoratorParm; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java index 652970c..b204ac3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java @@ -1,56 +1,56 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@AllArgsConstructor -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", - JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Component; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Component("logicalDecorator") +//@AllArgsConstructor +//@Slf4j +//public class LogicalShiftDecorator implements ByteDecorator { +// +//// private final FieldRuleEngineMapper fieldRuleEngineMapper; +//// +//// //字节位移 +//// @Override +//// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +//// String logicalValue = ""; +//// RuleEvaluator fieldRuleEngine = new RuleEvaluator(); +//// try { +//// Map env2 = new HashMap(); +//// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +//// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +//// for (String contentId : contentIdList) { +//// RuleDict ruleDict = ruleDictMap.get(contentId); +//// if (ruleDict.getCode().contains("#")) { +//// //使用动态的值 +//// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +//// } +//// env2.put(ruleDict.getName(), ruleDict.getCode()); +//// } +//// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +//// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +//// return null; +//// } +//// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +//// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +//// return values; +//// } catch (Exception ex) { +//// log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", +//// JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +//// return null; +//// } +//// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java index 346468f..822fead 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@AllArgsConstructor -@Slf4j -public class OperationDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("optionDecorator") +//@AllArgsConstructor +//@Slf4j +//public class OperationDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //混合运算,有常量或者乘除的缩放 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java index 50fb0a7..7a8bccb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@AllArgsConstructor -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +////精度计算 +//@AllArgsConstructor +//@Registry("precisionDecorator") +//@Slf4j +//public class PrecisionDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java index da39235..27f9cc7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java @@ -1,54 +1,53 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@AllArgsConstructor -@Slf4j -public class RuleDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("ruleDecorator") +//@AllArgsConstructor +//@Slf4j +//public class RuleDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //吃我一套正则表达式 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (Exception ex) { +// log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java index 7f5cbf3..c043f97 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java @@ -2,6 +2,6 @@ import java.util.Map; -public interface ComandeEventService { +public interface ComandeEventService{ Map loadComandeEventConfig(String protocolId,String scene); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java index 476ad84..aaf1837 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java @@ -2,46 +2,46 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.dao.CommandEventDao; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @Slf4j @AllArgsConstructor -public class ComandeEventServiceImpl implements ComandeEventService { +public class ComandeEventServiceImpl implements ComandeEventRegistry { - private final CommandEventDao commandEventDao; + // private final CommandEventDao commandEventDao; // 加密bean 固定字段出现变化的字段解析,业务字段的有序内容 @Override - public Map loadComandeEventConfig(String protocolId,String sceneName) { - CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); - if (ObjectUtil.isEmpty(commandEventConfig)) { - log.error("协议{},没有配置成功接收回复配置,清排查原因"); - return null; - } - String replyJson = commandEventConfig.getReplyContentJson(); - List> replyMapList = JSONArray.parseObject(replyJson, List.class); - List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); - Map fixMap = fixList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); - List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) - .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) - .collect(Collectors.toList()); - Map commandConfigMap = new HashMap<>(); - commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); - commandConfigMap.put("fixContent", fixMap); - commandConfigMap.put("bizContent", contentList); - return commandConfigMap; + public Map loadComandeEventConfig(String protocolId, String sceneName) { +// CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); +// if (ObjectUtil.isEmpty(commandEventConfig)) { +// log.error("协议{},没有配置成功接收回复配置,清排查原因"); +// return null; +// } +// String replyJson = commandEventConfig.getReplyContentJson(); +// List> replyMapList = JSONArray.parseObject(replyJson, List.class); +// List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); +// Map fixMap = fixList.stream() +// .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); +// List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) +// .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) +// .collect(Collectors.toList()); +// Map commandConfigMap = new HashMap<>(); +// commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); +// commandConfigMap.put("fixContent", fixMap); +// commandConfigMap.put("bizContent", contentList); +// return commandConfigMap; + return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 128b09d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java deleted file mode 100644 index 4016b0b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface DatagramEventMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java deleted file mode 100644 index 597c306..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.apache.ibatis.annotations.Mapper; - -public interface FieldConfigMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java deleted file mode 100644 index a31680a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.PreRuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface PreRuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java deleted file mode 100644 index 9060a69..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface ProtocolConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java deleted file mode 100644 index 6fa6936..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java deleted file mode 100644 index 582a705..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleDict; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleDictMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java deleted file mode 100644 index 6e302c8..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.CommandEventMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Optional; - -@Component -public class CommandEventDao { - - @Resource - private CommandEventMapper commandEventMapper; - - public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId) - .eq("scene", sceneName) - .eq("enabled", 1); - List commandEventConfig = commandEventMapper.selectList(queryWrapper); - Optional optionalEventConfig = commandEventConfig.stream().findFirst(); - return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java deleted file mode 100644 index 9137e4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.FieldConfigMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class FieldConfigDao { - - @Resource - private FieldConfigMapper fieldConfigMapper; - - public FieldConfig getFieldConfigById(String fieldId) { - FieldConfig fieldConfig = fieldConfigMapper.selectById(fieldId); - return fieldConfig; - } - - public List getFieldConfigs(String protocolId,Integer isFixed) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",isFixed); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - - public List getStorageFieldConfig(String protocolId) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",1) - .eq("is_storage",1); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java deleted file mode 100644 index 67bff6b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.mapper.PreRuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class PreRuleConfigDao { - - @Resource - private PreRuleConfigMapper preRuleConfigMapper; - - public List getPreRuleList(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return preRuleConfigMapper.selectList(queryWrapper); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java deleted file mode 100644 index d69ea85..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.RuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleConfigDao { - - @Resource - private RuleConfigMapper ruleConfigMapper; - - public RuleConfig getNextRuleConfig(String ruleFields) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("parse_rule_json", ruleFields); - return ruleConfigMapper.selectOne(queryWrapper); - } - - - public List getRuleConfigById(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return ruleConfigMapper.selectList(queryWrapper); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java deleted file mode 100644 index 932c185..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.RuleDictMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleDictDao { - - @Resource - private RuleDictMapper ruleDictMapper; - - public List getRuleDictConfig() { - List ruleDictList = ruleDictMapper.selectList(null); - return ruleDictList; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java index 9f9e279..43bc4d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java @@ -10,20 +10,15 @@ import io.netty.channel.socket.nio.NioServerSocketChannel; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import javax.annotation.PreDestroy; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static cn.hutool.core.util.ClassUtil.getClasses; /** * SensorhubServer netty服务端 */ @Slf4j -@Service +@Component public class SensorhubServer { /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java index 2c79ff5..9a28c36 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java @@ -11,13 +11,13 @@ import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioSocketChannel; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClient 客户端 */ @Slf4j -@Service +@Registry public final class SensorhubClient { public static void main(String[] args) throws Exception { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java index 9774be0..477c3f7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java @@ -6,12 +6,12 @@ import io.netty.channel.socket.SocketChannel; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientChannelInitialHandler */ -@Service +@Registry public class SensorhubClientChannelInitialHandler extends ChannelInitializer { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java index 346f4b3..73560e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java @@ -5,13 +5,13 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientHandler */ @Slf4j -@Service +@Registry public class SensorhubClientHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java index 5c1c6f2..d990af5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java @@ -4,12 +4,12 @@ import com.casic.missiles.pojo.Msg; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** * SensorhubServerHandler */ -@Service +@Component public class SensorhubServerHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 67283ae..af3172c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,41 +1,37 @@ package com.casic.missiles.parser; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultProtocolConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.*; +import com.casic.missiles.registry.FieldConfigRegistry; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; -import java.nio.charset.Charset; import java.util.HashMap; import java.util.List; import java.util.Map; -@Service("genericProtocolParser") +/** + * @author + */ +@Component("genericProtocolParser") @Slf4j -@AllArgsConstructor +@RequiredArgsConstructor public class GenericProtocolParser implements ProtocolParser { - private final LeadingCodeMatcher leadingCodeMatcher; private final List frameStructDispenserList; - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorInstanceSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; // 匹配首字母前导码=> 帧结构匹配前导码=> // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 @@ -44,18 +40,19 @@ public Boolean doParseProtocol(ByteBuf byteBuf) { String protocolContent = ByteBufUtil.hexDump(byteBuf); //匹配前导码 - List preCodeConfigs = leadingCodeMatcher.matchLeadingCode(protocolContent); + List preCodeConfigs = LeadingCodeMatcher.matchFrameLeadingCode(protocolContent); //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 if (preCodeConfigs.size() == 0) { - return rematch(byteBuf,protocolContent); + return rematch(byteBuf, protocolContent); } - //暂时先取第一个 + //暂时先取第一个,提升速度,使用享元模式, 减少类的创建销毁与构建 ProtocolConfig protocolConfig = preCodeConfigs.get(0); + AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); ByteBuf wholeDatagramByte = null; //通过匹配帧结构获取完整的数据包 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, preCodeConfigs.get(0))) != null) { + if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, protocolFactory)) != null) { break; } } @@ -68,76 +65,78 @@ * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 */ - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId, wholeDatagramByte); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap, protocolId); - //选取规则对应的流程实例 - DatagramEventConfig datagramEventConfig = processorInstanceSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); + //进行规则字段解析,进行匹配规则 + RuleConfig ruleConfig = getRuleConfig(protocolFactory, wholeDatagramByte); + if (ruleConfig == null) { + return false; + } //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, wholeDatagramByte); + ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte); + //以下进行业务的规则解析,同时选定流程实例 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); + DatagramEventProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain, + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText, protocolId); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain); //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); + datagramEventProvider.storeData(bizDataMap); return true; } - private Boolean rematch(ByteBuf byteBuf,String protocolContent) { + /** + * 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 + */ + private Boolean rematch(ByteBuf byteBuf, String protocolContent) { //重置位判断 byteBuf.resetReaderIndex(); //判断重置是否前移,如果没有前移,则直接判为匹配失败 if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { return false; } else { + //递归执行 return doParseProtocol(byteBuf); } } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; + //获取匹配规则->匹配规则 + private RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + //取出其中参与逻辑provider并判空 + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); + String rulePrepareFields = protocolConfig.getRulePrepareFields(); + //固定字段 + if (StringUtils.isNotEmpty(rulePrepareFields)) { + //获取统一固定字段解析 + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + //获取该协议的字段配置,用于协议规则匹配 + List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); + //获取规则 + RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, + rulePrepareFields, protocolFieldConfigs); + return ruleConfig; + } + return null; } - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + //数据构建,获取固定字段的store和业务字段store + private Map buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + Map bizDataMap = new HashMap<>(); + Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); + Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); + bizDataMap.putAll(ruleStoreObjectMap); + bizDataMap.putAll(protocolStoreObjectMap); return bizDataMap; } - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java index 8a46e32..16ce2e5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java @@ -3,6 +3,7 @@ import io.netty.buffer.ByteBuf; public interface ProtocolParser { + Boolean doParseProtocol(ByteBuf byteBuf); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java new file mode 100644 index 0000000..f7814af --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java @@ -0,0 +1,35 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.ProtocolConfigProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.ProtocolConfig; + +/** + * 存放基本协议的的加载信息 + */ +public class AbstractProtocolConfigFactory { + private final ProtocolConfigProvider protocolConfigProvider; + private final ProtocolFieldConfigProvider protocolFieldConfigProvider; + private final RuleConfigProvider ruleConfigProvider; + + public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { + this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); + this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); + this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); + } + + public ProtocolConfigProvider getProtocolConfigProvider() { + return protocolConfigProvider; + } + + public ProtocolFieldConfigProvider getProtocolFieldConfigProvider() { + return protocolFieldConfigProvider; + } + + public RuleConfigProvider getRuleConfigProvider() { + return ruleConfigProvider; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java new file mode 100644 index 0000000..6e36147 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java @@ -0,0 +1,57 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.CombinedFieldConfigProvider; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.FieldConfigProvider; +import com.casic.missiles.parser.provider.FieldRuleConfigProvider; + +/** + * 存放规则相关的的的加载信息 + */ +public class AbstractRuleConfigFactory { + + /** + * 处理字节 + */ + private final FieldConfigProvider fieldConfigProvider; + /** + * 处理组合字节解析的解码器 + */ + private final CombinedFieldConfigProvider combinedFieldConfigProvider; + /** + * 处理负责字节解析的规则配置 + */ + private final FieldRuleConfigProvider fieldRuleConfigProvider; + /** + * 处理实例流程 + */ + private final DatagramEventProvider datagramEventProvider; + + + public AbstractRuleConfigFactory(Long ruleId) { + this.fieldConfigProvider = new FieldConfigProvider(ruleId); + this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); + this.fieldRuleConfigProvider = new FieldRuleConfigProvider(ruleId); + this.datagramEventProvider = new DatagramEventProvider(ruleId); + } + + public FieldConfigProvider getFieldConfigProvider() { + return fieldConfigProvider; + } + + public CombinedFieldConfigProvider getCombinedFieldConfigProvider() { + return combinedFieldConfigProvider; + } + + public FieldRuleConfigProvider getFieldRuleConfigProvider() { + return fieldRuleConfigProvider; + } + + public DatagramEventProvider getDatagramEventProvider() { + return datagramEventProvider; + } + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java deleted file mode 100644 index 6e1719a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.factory; - - -import com.casic.missiles.pojo.ProtocolConfig; - -import java.util.List; - -/** - * 数据库访问优化(暂时未做) - *

- * 1、初始化协议解析配置,并存放到处存放缓存,对协议基本配置进行管理 - * 2、其中流程中所有的配置都经过此类进行管理,进行调用获取,增强解析速度 - */ -public interface DatagramFactory { - - /** - * 初始化 - */ - List datagramInit(); - - /** - * 根据前导码配置匹配,模糊匹配获取所有的报文项 - */ - List match(); - - /** - * 根据前导码匹配,返回报文项 - */ - List filer(); - - /** - * 保证数据的唯一性选择器 - */ - List selectOne(); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java new file mode 100644 index 0000000..87444a0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java @@ -0,0 +1,18 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +import java.util.List; + +/** + * 直接用,还是边用边创建 + */ +public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { + + + public DefaultProtocolConfigFactory(ProtocolConfig protocolConfig) { + super(protocolConfig); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java new file mode 100644 index 0000000..cce0c7c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java @@ -0,0 +1,12 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; + +public class DefaultRuleFactory extends AbstractRuleConfigFactory { + + public DefaultRuleFactory(Long ruleId) { + super(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java deleted file mode 100644 index 9ee97e0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.casic.missiles.parser.instance; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service -@Slf4j -@AllArgsConstructor -public class GeneralProcessor { - - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; - - /** - * 统一固定字段解析=>进行规则的查询的判断 - * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 - * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 - */ - @Deprecated - public boolean parseWholeDatagram(ByteBuf buffer, ProtocolConfig protocolConfig) { - try { - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap,protocolId); - //选取规则对应的流程= - DatagramEventConfig datagramEventConfig = processorSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); - //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); - //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); - //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); - //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); - //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); - return true; - } catch (Exception ex) { - log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", - ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); - return false; - } - } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; - } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); - } - - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); - return bizDataMap; - } - - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java index 25e7ad8..6a5777e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java @@ -1,23 +1,31 @@ package com.casic.missiles.parser.instance.impl; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.mapper.DatagramEventMapper; import com.casic.missiles.pojo.DatagramEventConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.SpringContextUtil; -@Service -@AllArgsConstructor +import java.util.List; +import java.util.Optional; + +/** + * @author cz + * + */ public class DefaultProcessorInstanceSelector implements ProcessorInstanceSelector { - private final DatagramEventMapper datagramEventMapper; + private static List datagramEventConfigs; + + static { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + datagramEventConfigs = datagramEventRegistry.getDatagramEventList(); + } @Override public DatagramEventConfig getProcessorInstance(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("rule_id", protocolId); - return datagramEventMapper.selectOne(queryWrapper); + Optional optionalSelectInstance = datagramEventConfigs.stream() + .filter(e -> e.getId().equals(protocolId)).limit(1).findFirst(); + return optionalSelectInstance.isPresent() ? optionalSelectInstance.get() : null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a778671..7b56a43 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,16 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import io.netty.buffer.ByteBuf; /** - * 分析匹配情况 - * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 - * 2、匹配不成功,有后续帧,可以进行下次匹配。 - * 3、匹配不成功,无后续帧,可以进行丢弃。 + * 分析匹配情况 + * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 + * 2、匹配不成功,有后续帧,可以进行下次匹配。 + * 3、匹配不成功,无后续帧,可以进行丢弃。 */ -public interface FrameStructMatcher{ +public interface FrameStructMatcher { - ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig); + ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 05320ab..8ebea78 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,23 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.ProtocolConfigMapper; +import com.casic.missiles.parser.provider.ProtocolConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Component; import java.util.List; import java.util.stream.Collectors; -@Component -@AllArgsConstructor public class LeadingCodeMatcher { - private final ProtocolConfigMapper protocolMapper; - //** 1、首字母匹配前导码, // 2、以匹配出的前导码是否在报文中条件进行前导码的匹配二次筛选 - public List matchLeadingCode(String protocolContent){ + public static List matchFrameLeadingCode(String protocolContent){ List initialConfigs = initialMatch(protocolContent); List preCodeConfigs = initialConfigs.stream() .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) @@ -26,13 +19,16 @@ } //初始化匹配前导码内容 - private List initialMatch(String protocolContent) { - String protocolStr = protocolContent.charAt(0) + ""; - QueryWrapper queryWrapper = new QueryWrapper() - .likeRight("pre_fix", protocolStr); - List protocolConfigList = protocolMapper.selectList(queryWrapper); - return protocolConfigList; + private static List initialMatch(String protocolContent) { + String firstFrameChar = protocolContent.charAt(0) + ""; + ProtocolConfigProvider protocolConfigProvider=new ProtocolConfigProvider(firstFrameChar); + return protocolConfigProvider.getMatchList(); } + + + + + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index cf2113d..e915877 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -1,32 +1,35 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(0) -@Service +@Component public class FrameLengthMatcher implements FrameStructMatcher { - @Autowired - private FieldParser fieldParser; - //超过长度 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { String dataGramContent = ByteBufUtil.hexDump(byteBuf); - if (StringUtils.isEmpty(protocolConfig.getUnpackId()) && StringUtils.isEmpty(protocolConfig.getTailStr())) { - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + //当不存在结尾标志和拆包标志,可以直接使用长度进行匹配 + if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { if (dataGramContent.length() >= totalLength) {//等于长度返回true,超出长度,切断 - ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, protocolConfig, totalLength); + ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, totalLength); return wholeDatagramByte; } else { //读的标志位前移舍弃 @@ -38,7 +41,7 @@ return null; } - private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, Integer totalLength) { byteBuf.readBytes(totalLength); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, totalLength - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 2bfc213..d527ad0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; @@ -13,7 +13,7 @@ import lombok.AllArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.nio.charset.Charset; import java.util.Map; @@ -22,32 +22,30 @@ * 后续标志验证 */ @Order(1) -@Service +@Component @AllArgsConstructor -public class FrameMarkMatcher implements FrameStructMatcher { - - private final FieldConfigDao fieldConfigDao; - private final FieldParser fieldParser; - private final FieldResolver fieldResolverManger; +public class FrameMarkMatcher implements FrameStructMatcher, FixedPropertyEnum { //帧后续标志=>结束,进行帧的重组=>有后续,1、帧移位判别 2、继续接收帧 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig UnpackConfig = StringUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getUnpackId()); - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); - Integer upback = 0; + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); ByteBuf mergeWholeFrameByte = null; - if (!ObjectUtil.isEmpty(UnpackConfig)) { - while (hasNextFullFrame(byteBuf, protocolConfig)) { - upback = (Integer) fieldResolverManger.filedParserManger(byteBuf, UnpackConfig, null); + if (!ObjectUtil.isEmpty(unpackFlag)) { + while (hasNextFullFrame(byteBuf, protocolConfig, protocolFieldConfigProvider)) { //是否存在后续位 - if (upback == 1) {//使用esayRule + if (unpackFlag == 1) {//使用esayRule //表示可以截取 - mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolConfig, totalLength); + mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolFieldConfigProvider, protocolConfig); return mergeWholeFrameByte; } else { - byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig)); + byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig, protocolFieldConfigProvider)); } } } @@ -56,7 +54,8 @@ //选取第一个帧,将业务内容和后面部分分开 //计算数据报文-业务内容 - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolFieldConfigProvider protocolFieldConfigProvider, ProtocolConfig protocolConfig) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); //截取完整报文 byteBuf.readBytes(totalLength); ByteBuf byteBufContent = byteBuf.slice(0, byteBuf.readerIndex()); @@ -68,15 +67,15 @@ String tail = ""; System.out.println(ByteBufUtil.hexDump(byteBufContent)); //会存在多个帧拼接在一起的的情况,进行合并处理 - while (hasNextFullFrame(byteBufContent, protocolConfig)) { - Integer currentFrameLength = fieldParser.getTotalLength(protocolConfig, byteBufContent); + while (hasNextFullFrame(byteBufContent, protocolConfig, protocolFieldConfigProvider)) { + Integer currentFrameLength = protocolFieldConfigProvider.getTotalLength(byteBufContent, protocolConfig); byteBufContent.readBytes(currentFrameLength); ByteBuf currentbyteBuf = byteBufContent.slice(0, byteBufContent.readerIndex()); byteBufContent.markReaderIndex();//读的标志位前移 System.out.println(ByteBufUtil.hexDump(byteBufContent)); String hexDump = currentbyteBuf.toString(Charset.forName("ISO-8859-1")); //获取当前固定帧结构的关系map - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, currentbyteBuf); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(currentbyteBuf, protocolConfig); if (StringUtils.isEmpty(mergeFrameStr)) { //首次获取业务数据报文 mergeFrameStr += hexDump.substring(0, currentFrameFixedProperty.get("tailPosition")); @@ -95,22 +94,22 @@ /** * 获取平移到下一帧起始位置 */ - public int getNextFrameOffset(ByteBuf buffer, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, buffer); - return currentFrameFixedProperty.get("totalLength"); + public int getNextFrameOffset(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + return currentFrameFixedProperty.get(TOTAL_LENGTH); } /** * 判断是否出错进行整个帧的 */ - public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, byteBuf); + public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); //保证读取位置不在固定位置,是可变的业务内容 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("fixedPosition")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(FIXED_POSITION)) { return false; } //判断读取是否操作帧长度 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("totalLength")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(TOTAL_LENGTH)) { return false; } return true; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 76a3784..c3a1bab 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -1,50 +1,50 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.parser.instance.GeneralProcessor; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; +import io.netty.buffer.ByteBufUtil;; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(2) -@Service +@Component public class FrameTailMatcher implements FrameStructMatcher { - @Resource - private FieldConfigDao fieldConfigDao; - @Autowired - private GeneralProcessor generalProcessor; - //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig tailFieldConfig = StringUtils.isEmpty(protocolConfig.getTailStr()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getTailStr()); - if (!ObjectUtil.isEmpty(tailFieldConfig)) { - String tailStr = tailFieldConfig.getFieldName(); + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfig protocolFieldConfig = ObjectUtils.isEmpty(protocolConfig.getTailStr()) ? null : + fieldConfigProvider.getFieldConfigById(protocolConfig.getTailStr()); + if (!ObjectUtil.isEmpty(protocolFieldConfig)) { + String tailStr = protocolFieldConfig.getFieldName(); String dataGramContent = ByteBufUtil.hexDump(byteBuf); Boolean tailFlag = ByteBufUtil.hexDump(byteBuf).contains(tailStr); if (!tailFlag) { //使用esayRule return null; } else if (dataGramContent.indexOf(tailStr) < dataGramContent.length() - tailStr.length()) { Integer length = dataGramContent.indexOf(tailStr) + tailStr.length(); - ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, protocolConfig, length); + ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, length); return wholeDatagramByte; //存在粘包 } } return null; } - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer length) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, Integer length) { byteBuf.readBytes(length); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, length - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java new file mode 100644 index 0000000..5f1c177 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java @@ -0,0 +1,73 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.combined.GenericCombinedFieldResolver; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.CombinedFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class CombinedFieldConfigProvider { + + + /** + * 作为临时配置列表缓存使用 + */ + private final List combinedFieldConfigList; + private Map storeObjectMap = new HashMap<>(); + + public CombinedFieldConfigProvider(Long ruleId) { + CombinedFieldConfigRegistry combinedFieldConfigRegistry = SpringContextUtil.getBean(CombinedFieldConfigRegistry.class); + combinedFieldConfigList = combinedFieldConfigRegistry.getCombinedFieldConfigList(ruleId); + } + + public void parseDataField(RuleConfig ruleConfig, String clearZeroPlain,Map fieldConfigsMap ) { + if (showSkip()) { + return; + } + //匹配对应的数据,然后进行相关的字段解析 + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver(); + combinedFieldResolver.parseDataField(combinedFieldConfigList, byteBuf, storeObjectMap,fieldConfigsMap); + } + + + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getCombinedFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return combinedFieldConfigList.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public List getCombinedFieldConfigList() { + return combinedFieldConfigList; + } + + /* 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(combinedFieldConfigList) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java new file mode 100644 index 0000000..f3cfedc --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java @@ -0,0 +1,11 @@ +package com.casic.missiles.parser.provider; + +/** + * @author cz + * @date 2023-6-12 + */ +public class CommandEventProvider{ + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java new file mode 100644 index 0000000..70eec5e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java @@ -0,0 +1,77 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.safe.SafeStrategy; +import com.casic.missiles.parser.sender.DataSubscribeProvider; +import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class DatagramEventProvider { + + private final DatagramEventConfig processorInstance; + + public DatagramEventProvider(Long ruleId) { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + List datagramEventConfigList = + datagramEventRegistry.getDatagramEventList(ruleId); + processorInstance = this.getProcessorInstance(datagramEventConfigList); + } + + public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { + if (showSkip()) { + return null; + } + return datagramEventConfigList.get(0); + } + + // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 + public String getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap) { + String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? + processorInstance.getSafeBean() : + fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); + if (!StringUtils.isEmpty(safeName)) { + //需要加密 + SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); + String plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); + return clearComplementZero(plain); + } + return ByteBufUtil.hexDump(bizDataContent); + } + + //解密清零操作 + private String clearComplementZero(String plain) { + plain = plain.substring(0, plain.lastIndexOf("00")); + return plain; + } + + //数据发送,数据发送者暂未构建 + public void storeData(Map bizDataMap) { + DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); +// dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return ObjectUtils.isNotEmpty(processorInstance) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java new file mode 100644 index 0000000..7e1fe0a --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java @@ -0,0 +1,97 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.FieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class FieldConfigProvider { + + + private final List fieldConfigs; + private Map storeObjectMap = new HashMap<>(); +// private Map singleObjects = new ConcurrentHashMap<>(); + + public FieldConfigProvider(Long ruleId) { + FieldConfigRegistry fieldConfigRegistry = SpringContextUtil.getBean(FieldConfigRegistry.class); + fieldConfigs = fieldConfigRegistry.getFieldConfigList(ruleId); + } + + public List getFieldConfigs() { + return fieldConfigs; + } + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public Map parseDataField(RuleConfig ruleConfig, String clearZeroPlain) { + if (showSkip()) { + return null; + } + List prepareFieldConfig = prepareParseField(ruleConfig); + if (CollectionUtils.isNotEmpty(prepareFieldConfig)) { + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(fieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + return fixDataMap; + } + } + return null; + } + + /** + * 得到需要处理的业务内容 + * + * @return + */ + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return fieldConfigs.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public Map getFieldConfigsMap() { + return fieldConfigs.stream().collect( + Collectors.toMap(FieldConfig::getId, e -> e) + ); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(fieldConfigs) ? false : true; + } + + +} + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java new file mode 100644 index 0000000..817bfaf --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java @@ -0,0 +1,19 @@ +package com.casic.missiles.parser.provider; + +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.registry.FieldRuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; + +public class FieldRuleConfigProvider { + + private final List fieldRuleConfigList; + + public FieldRuleConfigProvider(Long ruleId) { + FieldRuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(FieldRuleConfigRegistry.class); + fieldRuleConfigList = ruleConfigRegistry.getFieldRuleConfigList(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java new file mode 100644 index 0000000..99a1b06 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java @@ -0,0 +1,53 @@ +package com.casic.missiles.parser.provider; + + +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.registry.ProtocolConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolConfigProvider { + + private final List protocolConfigList; + + public ProtocolConfigProvider(String firstChar) { + ProtocolConfigRegistry registry = SpringContextUtil.getBean(ProtocolConfigRegistry.class); + protocolConfigList = registry.getProtocolConfigList(firstChar); + } + + public List getMatchList() { + return protocolConfigList; + } + + /** + * 设置当前协议 + * + * @param protocolConfig + */ + public ProtocolConfigProvider(ProtocolConfig protocolConfig) { + List protocolConfigs = new ArrayList<>(); + protocolConfigs.add(protocolConfig); + protocolConfigList = protocolConfigs; + } + + /** + * 获取当前协议 + * + * @return + */ + public ProtocolConfig getCurrentProtocolConfig() { + if (this.protocolConfigList == null) { + return null; + } else { + return protocolConfigList.get(0); + } + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java new file mode 100644 index 0000000..043927d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java @@ -0,0 +1,213 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.registry.ProtocolFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolFieldConfigProvider { + + private static final String FIXED_FIELD_DS = "fixedFieldDs"; + private static final String CONTENT_FIELD_DS = "contentFieldDs"; + private static final String PROTOCOL_LENGTH = "protocolLength"; + private static final String PROTOCOL_FIELD_ID = "protocolFieldId"; + private static final String PROTOCOL_POSITION = "protocolPosition"; + + private final List protocolFieldConfigs; + private Map singleObjects = new ConcurrentHashMap<>(); + private Map storeObjectMap = new HashMap<>(); + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public ProtocolFieldConfigProvider(Long protocolId) { + ProtocolFieldConfigRegistry protocolFieldConfigRegistry = SpringContextUtil.getBean(ProtocolFieldConfigRegistry.class); + protocolFieldConfigs = protocolFieldConfigRegistry.getProtocolFieldConfigList(protocolId); + } + + public List getProtocolFieldConfigs() { + return protocolFieldConfigs; + } + + public ProtocolFieldConfig getFieldConfigById(Long fieldId) { + Optional optionalConfig = protocolFieldConfigs.stream().filter( + e -> e.getId().equals(fieldId) + ).findFirst(); + return optionalConfig.isPresent() ? optionalConfig.get() : null; + } + + public Integer getProtocolFieldValue(Long protocolFieldId, ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_FIELD_ID + protocolFieldId + ByteBufUtil.hexDump(byteBuf); + //获取缓存 + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + //加载固定长度数据集合 + Map fixDataMap = this.getProtocolDataMap(byteBuf); + ProtocolFieldConfig protocolFieldConfig = selectFieldConfig(protocolFieldId); + Integer protocolFieldValue = 0; + //获取约定字段的总长度 + if (fixDataMap.containsKey(protocolFieldConfig.getFieldName())) { + Object appointUnpackObject = fixDataMap.get(protocolFieldConfig.getFieldName()); + if (ObjectUtils.isNotEmpty(appointUnpackObject)) { + protocolFieldValue = (Integer) appointUnpackObject; + } + } + if (protocolFieldValue != null) { + //加入缓存 + if (ObjectUtils.isNotEmpty(protocolFieldValue)) { + this.singleObjects.put(catchKey, protocolFieldValue); + return protocolFieldValue; + } + } + return null; + } + + /** + * 获取帧固定位置信息 + * + * @param byteBuf + * @param protocolConfig + * @return + */ + public Map getFixedProperty(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_POSITION + protocolConfig.getId(); + if (this.singleObjects.containsKey(catchKey)) { + return (Map) singleObjects.get(catchKey); + } + Map fixedPropertyMap = new HashMap<>(); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + fixedPropertyMap = fieldParser.doGetFixedProperty(protocolFieldConfigs, this.getTotalLength(byteBuf,protocolConfig)); + if (CollectionUtils.isNotEmpty(fixedPropertyMap)) { + this.singleObjects.put(catchKey, fixedPropertyMap); + return fixedPropertyMap; + } + return fixedPropertyMap; + } + + /** + * 获取帧结构应有的总长度 + */ + public Integer getTotalLength(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_LENGTH + ByteBufUtil.hexDump(byteBuf); + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + Integer appointFrameLength = getProtocolFieldValue(protocolConfig.getTotalLengthId(), byteBuf); + if (appointFrameLength != null) { + //获取过滤的字段集合总长度 + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Integer totalFilterLength = fieldParser.getTotalFilterLength(protocolConfig, byteBuf, getFixFieldConfigMap()); + //计算总长度 + Integer totalLength = appointFrameLength + totalFilterLength; + //加入缓存 + if (ObjectUtils.isNotEmpty(totalLength)) { + this.singleObjects.put(catchKey, totalLength); + return totalLength; + } + } + return null; + } + + /** + * 获取协议有关字段解析内容 + * storeObjectMap存储代转存的数据 + * + * @return + */ + public Map getProtocolDataMap(ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(FIXED_FIELD_DS)) { + return (Map) singleObjects.get(FIXED_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(protocolFieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + this.singleObjects.put(FIXED_FIELD_DS, fixDataMap); + return fixDataMap; + } + return null; + } + + /** + * 获取业务报文内容的content字节 + * + * @param wholeDatagramByte + * @return + */ + public ByteBuf getDataContentBuf(ByteBuf wholeDatagramByte) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(CONTENT_FIELD_DS)) { + return (ByteBuf) singleObjects.get(CONTENT_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + ByteBuf bizDataByteBuf = fieldParser.getDataContentBuf(protocolFieldConfigs, wholeDatagramByte); + if (bizDataByteBuf != null) { + this.singleObjects.put(CONTENT_FIELD_DS, bizDataByteBuf); + return bizDataByteBuf; + } + return null; + } + + + private ProtocolFieldConfig selectFieldConfig(Long id) { + Optional optionalProtocolFieldConfig = this.protocolFieldConfigs.stream().filter( + e -> e.getId().equals(id) + ).findFirst(); + return optionalProtocolFieldConfig.isPresent() ? optionalProtocolFieldConfig.get() : null; + } + + + private Map getFixFieldConfigMap() { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, e -> e) + ); + return fixDataFieldMap; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(protocolFieldConfigs) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java new file mode 100644 index 0000000..dafba1c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java @@ -0,0 +1,56 @@ +package com.casic.missiles.parser.provider; + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.rule.GenericRuleResolver; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.RuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleConfigProvider { + + private final List ruleConfigs; + + public List getRuleConfigs() { + return ruleConfigs; + } + + public RuleConfigProvider(Long protocolId) { + RuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(RuleConfigRegistry.class); + ruleConfigs = ruleConfigRegistry.getRuleConfigById(protocolId); + } + + /** + * 获取规则匹配结果 + * + * @param parseFixedDataMap + * @param protocolFieldConfigs + * @return + */ + public RuleConfig doGetRule(Map parseFixedDataMap, + String ids, + List protocolFieldConfigs) { + if (showSkip()) { + return null; + } + RuleConfig ruleConfig = GenericRuleResolver.machRule(parseFixedDataMap, ids, protocolFieldConfigs, ruleConfigs); + return ruleConfig; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(ruleConfigs) ? false : true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java index 3c05891..856b399 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java @@ -1,18 +1,11 @@ package com.casic.missiles.parser.resolver; -import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.springframework.web.bind.annotation.RequestBody; -import javax.annotation.Resource; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -20,19 +13,17 @@ @Slf4j public class ByteMergeProvider { - @Resource - private FieldRuleEngineMapper fieldRuleEngineMapper; - //拿到所有的值合并到一个值 - public String resolveByteMerge(List valueList, String ruletypeId, String vaildRange) { + public static String resolveByteMerge(List valueList, String ruleTypeId, String vaildRange) { String values = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Map vaildMap = getValidRangeMap(vaildRange); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(ruletypeId); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } + //暂时不处理 +// fieldRuleEngine = fieldRuleConfigMapper.selectById(ruleTypeId); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } Map env2 = new HashMap(); for (int i = 0; i < valueList.size(); i++) { if (vaildMap.containsKey(i)) { @@ -47,7 +38,7 @@ } } - private Map getValidRangeMap(String vaildRange) { + private static Map getValidRangeMap(String vaildRange) { String[] range = vaildRange.split(","); Map vaildMap = new HashMap(); for (int i = 0; i < range.length; i++) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 8d821cd..85d6bbf 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -1,9 +1,12 @@ package com.casic.missiles.parser.resolver; +import com.casic.missiles.pojo.AbstractFieldConfig; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; import io.netty.buffer.ByteBuf; +import java.util.List; import java.util.Map; /** @@ -11,18 +14,14 @@ */ public interface FieldParser { -// Map fieldProcess(String protocolContent,); - Map dataParser(RuleConfig ruleConfig, String lightText,String protocolId); + Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength); - Map fixDataParser(String protocolId, ByteBuf buffer); + Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap); - Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf); + ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer); - ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer); - - ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer); - - Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer); + Integer getTotalFilterLength(ProtocolConfig protocolConfig, ByteBuf byteBuf, Map protocolFieldConfigMap); } + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java new file mode 100644 index 0000000..9e0c00e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java @@ -0,0 +1,52 @@ +package com.casic.missiles.parser.resolver; + +import com.casic.missiles.pojo.AbstractFieldConfig; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.util.List; + +public class FieldParserSupport { + + //分别计算bit和byte长度=> 合并长度 + protected Integer calculateLength(List fieldConfigList) { + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + Integer fixedLength = bytefixedLength + bitfixedLength / 8; + return fixedLength; + } + + //找到最大值=> 根据最大值计算业务数据下标 + protected Integer calculatePosition(List fieldConfigList) { + String rex = "[0-9]+"; + Integer max = -1; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) + && Integer.valueOf(fieldConfig.getOriginPositionByte()) > max) { + max = Integer.valueOf(fieldConfig.getOriginPositionByte()); + } + } + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) && fieldConfig.getOriginPositionByte().equals(max)) { + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + } + } + Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; + return maxFixedPosition; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java deleted file mode 100644 index dd3a6cd..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java +++ /dev/null @@ -1,170 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.ByteResolverParam; -import io.netty.buffer.ByteBuf; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -/** - * 字段解析管理总类 - */ -@Service -@Slf4j -@AllArgsConstructor -public class FieldResolver extends ByteMergeProvider { - - //1、字段截取 => 2、简单的字节解析和复杂的字节解析 - public Object filedParserManger(ByteBuf byteBuf, FieldConfig fieldConfig, Integer maxFixedPosition) { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - //最大固定位置不为空, - if (!ObjectUtil.isEmpty(maxFixedPosition)) { - orignPosition -= maxFixedPosition; - } - Object fieldValue = 0; - //待优化 - if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { - fieldValue = bitToResolver(byteBuf, fieldConfig); - } else { - ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); - fieldValue = parsingFields(fieldBytes, fieldConfig.getRuleJson()); - } - return fieldValue; - } - - //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, - //目前默认配置的规则设置暂不支持配置化,由实现完成 - private Object parsingFields(ByteBuf byteBuf, String ruleJson) { - Object fieldsResolveValue = null; - List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); - if (ObjectUtil.isEmpty(ruleMapList)) { - fieldsResolveValue = defaultResolveBuilder(byteBuf); - } else { - fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); - } - return fieldsResolveValue; - } - - private Object defaultResolveBuilder(ByteBuf byteBuf) { - Integer defaultResolveValue = 0; - for (int i = 0; i < byteBuf.writerIndex(); i++) { - defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; - } - return defaultResolveValue; - } - - //字段解析构建器(针对字节单位的) - //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 - // 字节归并结束或者规则结束=>继续根据规则进行判断 - private Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { - Object customizeResolveValue = null; - try { - List bytStrList = new ArrayList<>(); - //存放到数组里面 - for (int i = 0; i < byteBuf.writerIndex(); i++) { - bytStrList.add(byteBuf.readByte()); - } - int i = 0; - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - customizeResolveValue = this.resolveByteMerge(bytStrList, ruletypeId,vaildRange); - break; - } else { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - List tempBytStr = new ArrayList<>(); - for (int k = 0; i < bytStrList.size(); i++) { - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(k) - .value(bytStrList.get(k)) - .ruletypeId(ruletypeId).build(); - tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); - } - bytStrList = tempBytStr; - } - i++; - } - //字节归并到一起=>继续根据规则进行判断 - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(customizeResolveValue) - .ruletypeId(ruletypeId).build(); - customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(customizeResolveValue)); - return customizeResolveValue; - } catch (RuntimeException ex) { - log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); - return null; - } - } - - /** - * 1、单个字节情况表示字段 - * 2、多字节情况表示字段(暂未处理) - */ - private Object bitToResolver(ByteBuf byteBuf, FieldConfig fieldConfig) { - Object fieldValue = new Object(); - try { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - byte fields = 0x00; - if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); - } else { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); - } - - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { - if (!StringUtils.isEmpty(fieldConfig.getExactOrignPosition())) { - fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getExactOrignPosition())).byteValue() - >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); - } else { - fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); - } - } else { - fieldValue = Integer.valueOf(fields & 0xff); - } - if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { - return fieldValue; - } - List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); - int i = 0; - //字节归并到一起=>继续根据规则进行判断 - while (i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(fieldValue) - .ruletypeId(ruletypeId).build(); - fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(fieldValue)); - return fieldValue; - } catch (RuntimeException ex) { - log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); - return null; - } - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java new file mode 100644 index 0000000..1d2aeab --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java @@ -0,0 +1,36 @@ +package com.casic.missiles.parser.resolver.bytes; + +import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.mapper.FieldRuleConfigMapper; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.pojo.ByteResolverParam; +import com.googlecode.aviator.AviatorEvaluator; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; +//转换规则 +@Component("convert") +@AllArgsConstructor +@Slf4j +public class ByteRuleResolver implements ByteResolver { + + private final FieldRuleConfigMapper fieldRuleConfigMapper; + + @Override + public Object resolveOperationRule(ByteResolverParam byteResolverParam){ + FieldRuleConfig fieldRuleEngine=fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); + if(ObjectUtil.isEmpty(fieldRuleEngine)){ + return byteResolverParam.getValue(); + } + String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); + Map env2 = new HashMap(); + env2.put("value", (byte) byteResolverParam.getValue()); + String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); + return values; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java index 103821c..786b71c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java @@ -2,34 +2,34 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("logicalShift") +@Component("logicalShift") @AllArgsConstructor @Slf4j public class LogicalShiftResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //字节位移 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { Integer index = byteResolverParam.getIndex(); - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return byteResolverParam.getValue(); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java index 476747d..01149bd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("operation") +@Component("operation") @AllArgsConstructor @Slf4j public class OperationResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //混合运算,有常量或者乘除的缩放 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java index 0b82cf4..79abcce 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.casic.missiles.pojo.ByteResolverParam; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; //精度计算 -@Service("precision") +@Component("precision") @AllArgsConstructor @Slf4j public class PrecisionResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java deleted file mode 100644 index 5c3f332..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; -//转换规则 -@Service("convert") -@AllArgsConstructor -@Slf4j -public class RuleResolver implements ByteResolver { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam){ - RuleEvaluator fieldRuleEngine=fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); - if(ObjectUtil.isEmpty(fieldRuleEngine)){ - return byteResolverParam.getValue(); - } - String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); - Map env2 = new HashMap(); - env2.put("value", (byte) byteResolverParam.getValue()); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java new file mode 100644 index 0000000..d3bbd91 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java @@ -0,0 +1,15 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; + +import java.util.List; +import java.util.Map; +// 前导码匹配->长度字段 +public interface AbstractCombinedFieldProcessor { + + Map invoke(Map map, ByteBuf byteBuf, List combinedFieldConfigList, + Map fieldConfigsMap, Map storeObjectMap); + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java new file mode 100644 index 0000000..03c8480 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java @@ -0,0 +1,59 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-13 + */ +//依次递增进行数据的解析, +public class GenericCombinedFieldResolver { + + + //通过查询,字段长度长度随机 + public void parseDataField(List combinedFieldConfigList, ByteBuf byteBuf, + Map storeObjectMap, Map fieldConfigsMap) { + Integer frameLength = Integer.valueOf(ByteBufUtil.hexDump(byteBuf)); + //添加前置处理器 + com.casic.missiles.util.ClassUtil classUtil = new com.casic.missiles.util.ClassUtil(); + List abstractCombinedProcessors = classUtil.getSubClassList(AbstractCombinedFieldProcessor.class); + + Map fieldFixedMap = combinedFieldLeadCodeMap(combinedFieldConfigList); + //frameLength + Map combinedProcessorFields = null; + while (byteBuf.readableBytes() < frameLength) { + //一直处理 + for (AbstractCombinedFieldProcessor abstractCombinedProcessor : abstractCombinedProcessors) { + combinedProcessorFields = abstractCombinedProcessor.invoke(combinedProcessorFields, byteBuf, + combinedFieldConfigList, + fieldConfigsMap, storeObjectMap); + if (combinedProcessorFields == null || byteBuf.readableBytes() < frameLength) { + return; + } + } + + } + } + + /** + * 取出前导码匹配集合 + */ + private Map combinedFieldLeadCodeMap(List combinedFieldConfigList) { + Map fieldFixedMap = combinedFieldConfigList + .stream() + .collect(Collectors.toMap(CombinedFieldConfig::getPrefixCode, e -> e)); + return fieldFixedMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java new file mode 100644 index 0000000..643a934 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java @@ -0,0 +1,100 @@ +package com.casic.missiles.parser.resolver.fields; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.FieldParserSupport; +import com.casic.missiles.pojo.*; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 保存使用时最基本的信息,并且使用原型模式 + */ +@Slf4j +public class DefaultProtocolFieldParser extends FieldParserSupport implements FieldParser, FixedPropertyEnum { + + //通过传入的配置和报文进行字段解析 + @Override + public Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap) { + Map dataMap = new HashMap<>(); + for (AbstractFieldConfig protocolFieldConfig : protocolFieldConfigs) { + if (!ObjectUtils.isEmpty(protocolFieldConfig.getOriginPositionByte())) { + Object fieldValue = FieldResolver.parseField(buffer, protocolFieldConfig, null); + if (protocolFieldConfig.getIsStorage() == 1) { + storeObjectMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + dataMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + } + return dataMap; + } + + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength) { + Map fixedPropertyMap = new HashMap<>(); + Integer fixedLength = calculateLength(protocolFieldConfigs); + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + fixedPropertyMap.put(FIXED_POSITION, maxFixedPosition); + fixedPropertyMap.put(TOTAL_LENGTH, totalLength); + fixedPropertyMap.put(TAIL_POSITION, totalLength - fixedLength + maxFixedPosition); + return fixedPropertyMap; + } + + //** 获取业务内容的byteBuf + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer) { + //计算固定长度 + Integer fixedLength = calculateLength(protocolFieldConfigs); + //总长度获取 + String lightText = buffer.toString(Charset.forName("ISO-8859-1")); + Integer totalLength = lightText.length(); + //计算固定长度最大长度 + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + //计算数据报文内容 + ByteBuf bizDataFields = buffer.slice(maxFixedPosition - 1, (totalLength - fixedLength)); + return bizDataFields; + } + + /** + * 获取过滤字段的长度 + */ + @Override + public Integer getTotalFilterLength(ProtocolConfig protocolConfig, + ByteBuf byteBuf, + Map protocolFieldConfigMap) { + if (ByteBufUtil.hexDump(byteBuf).equals("")) { + return 0; + } + int totalFilterLength = 0; + String filterFields = protocolConfig.getTotalLengthFilterFields(); + try { + if (!StringUtils.isEmpty(filterFields)) { + String[] filterFieldList = filterFields.split(","); + for (String filterFieldId : filterFieldList) { + if (StringUtils.isNotEmpty(filterFieldId)) { + ProtocolFieldConfig fieldConfig = protocolFieldConfigMap.get(Long.valueOf(filterFieldId)); + //这里都是按字节计算,没有对位进行区分,可能会出现错误 + // 如果对位有需求,需要进一步跟进 + totalFilterLength += fieldConfig.getOffsetLength(); + } + } + } + return totalFilterLength; + } catch (Exception ex) { + log.error("报文确认分发阶段,获取报文总长度过滤长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); + } + return totalFilterLength; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java new file mode 100644 index 0000000..d51e887 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java @@ -0,0 +1,169 @@ +package com.casic.missiles.parser.resolver.fields; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.parser.resolver.ByteMergeProvider; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.AbstractFieldConfig; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.pojo.ByteResolverParam; +import io.netty.buffer.ByteBuf; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * 字段解析管理总类 + */ +@Slf4j +public class FieldResolver extends ByteMergeProvider { + + //1、字段截取 => 2、简单的字节解析和复杂的字节解析 + public static Object parseField(ByteBuf byteBuf,AbstractFieldConfig fieldConfig, Integer maxFixedPosition) { + Integer orignPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + //最大固定位置不为空, + if (!ObjectUtil.isEmpty(maxFixedPosition)) { + orignPosition -= maxFixedPosition; + } + Object fieldValue = 0; + //待优化 + if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { + fieldValue = doParseBitField(byteBuf, fieldConfig); + } else { + ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); + fieldValue = doParseByteField(fieldBytes, fieldConfig.getRuleJson()); + } + return fieldValue; + } + + //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, + //目前默认配置的规则设置暂不支持配置化,由实现完成 + private static Object doParseByteField(ByteBuf byteBuf, String ruleJson) { + Object fieldsResolveValue = null; + List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); + if (ObjectUtil.isEmpty(ruleMapList)) { + fieldsResolveValue = defaultResolveBuilder(byteBuf); + } else { + fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); + } + return fieldsResolveValue; + } + + private static Object defaultResolveBuilder(ByteBuf byteBuf) { + Integer defaultResolveValue = 0; + for (int i = 0; i < byteBuf.writerIndex(); i++) { + defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; + } + return defaultResolveValue; + } + + //字段解析构建器(针对字节单位的) + //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 + // 字节归并结束或者规则结束=>继续根据规则进行判断 + private static Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { + Object customizeResolveValue = null; + try { + List bytStrList = new ArrayList<>(); + //存放到数组里面 + for (int i = 0; i < byteBuf.writerIndex(); i++) { + bytStrList.add(byteBuf.readByte()); + } + int i = 0; + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { + if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + customizeResolveValue = resolveByteMerge(bytStrList, ruletypeId, vaildRange); + break; + } else { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + List tempBytStr = new ArrayList<>(); + for (int k = 0; i < bytStrList.size(); i++) { + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(k) + .value(bytStrList.get(k)) + .ruletypeId(ruletypeId).build(); + tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); + } + bytStrList = tempBytStr; + } + i++; + } + //字节归并到一起=>继续根据规则进行判断 + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(null) + .value(customizeResolveValue) + .ruletypeId(ruletypeId).build(); + customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); + i++; + } + System.out.println(JSON.toJSON(customizeResolveValue)); + return customizeResolveValue; + } catch (RuntimeException ex) { + log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); + return null; + } + } + + /** + * 1、单个字节情况表示字段 + * 2、多字节情况表示字段(暂未处理) + */ + private static Object doParseBitField(ByteBuf byteBuf,AbstractFieldConfig fieldConfig) { + Object fieldValue = new Object(); + try { + Integer orignPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + byte fields = 0x00; + if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { + fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); + } else { + fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); + } + + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { + if (!StringUtils.isEmpty(fieldConfig.getOriginPositionBit())) { + fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getOriginPositionBit())).byteValue() + >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); + } else { + fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); + } + } else { + fieldValue = Integer.valueOf(fields & 0xff); + } + if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { + return fieldValue; + } + List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); + int i = 0; + //字节归并到一起=>继续根据规则进行判断 + while (i < ruleMapList.size()) { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(null) + .value(fieldValue) + .ruletypeId(ruletypeId).build(); + fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); + i++; + } + System.out.println(JSON.toJSON(fieldValue)); + return fieldValue; + } catch (RuntimeException ex) { + log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); + return null; + } + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java deleted file mode 100644 index 35ae3d0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java +++ /dev/null @@ -1,183 +0,0 @@ -package com.casic.missiles.parser.resolver.fields; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufAllocator; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; -import org.springframework.util.ObjectUtils; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service("standard") -@AllArgsConstructor -@Slf4j -public class StandardFieldParser implements FieldParser { - - private final FieldConfigDao fieldConfigDao; - private final FieldResolver fieldResolver; - - //数据解析 - @Override - public Map dataParser(RuleConfig ruleConfig, String lightText, String protocolId) { - String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); - ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); - bufferContent.writeBytes(lightText.getBytes(Charset.forName("ISO-8859-1"))); - Map dataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - for (String dataFieldId : dataFieldIds) { - FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(dataFieldId); - if (!ObjectUtils.isEmpty(fieldConfig)) { - dataMap.put(fieldConfig.getFieldName(), String.valueOf(fieldResolver.filedParserManger(bufferContent, fieldConfig, maxFixedPosition))); - } - } - return dataMap; - } - - //数据解析 - @Override - public Map fixDataParser(String protocolId, ByteBuf buffer) { - List dataFieldIdList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Map dataMap = new HashMap<>(); - for (FieldConfig dataField : dataFieldIdList) { - if (!ObjectUtils.isEmpty(dataField.getOrignPosition())) { - Object fieldValue = (Integer) fieldResolver.filedParserManger(buffer, dataField, null); - dataMap.put(dataField.getFieldName(), fieldValue); - } - } - return dataMap; - } - - @Override - public Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf) { - if (ByteBufUtil.hexDump(byteBuf).equals("")) { - return 0; - } - String filterFields = protocolConfig.getTotalLengthFilterField(); - Integer totalLength = 0; - try { - FieldConfig totalFieldConfig = fieldConfigDao.getFieldConfigById(protocolConfig.getTotalLengthId()); - int totalFilterLength = 0; - if (!StringUtils.isEmpty(filterFields)) { - String[] filterFieldList = filterFields.split(","); - for (String filterField : filterFieldList) { - FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(filterField); - //这里都是按字节计算,没有对位进行区分,可能会出现错误 - - // 如果对位有需求,需要进一步跟进 - totalFilterLength += fieldConfig.getOffsetLength(); - } - } - totalLength = (Integer) fieldResolver.filedParserManger(byteBuf, totalFieldConfig, null) + totalFilterLength; - } catch (Exception ex) { - log.error("报文确认分发阶段,获取报文总长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); - } - return totalLength; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer) { - //业务内容 - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - String protocolId = String.valueOf(protocolConfig.getId()); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - //计算固定长度 - Integer fixedLength = calculateLength(fieldConfigList); -// Integer totalLength = this.getTotalLength(protocolConfig, buffer); - //总长度获取 - Integer totalLength = lightText.length(); - //计算固定长度最大长度 - Integer maxFixedPosition = calculatePosition(fieldConfigList); -// buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - //计算数据报文内容 - ByteBuf bizDataFields = buffer.slice(maxFixedPosition-1, (totalLength - fixedLength)); - return bizDataFields; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer) { - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - String protocolId = String.valueOf(protocolConfig.getId()); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer fixedLength = calculateLength(fieldConfigList); -// Integer totalLength = this.getTotalLength(protocolConfig, buffer); - Integer totalLength = lightText.length(); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - ByteBuf fixDataFields = buffer.slice(0, maxFixedPosition); - return fixDataFields; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer) { - String protocolId = String.valueOf(protocolConfig.getId()); - Map fixedPropertyMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer fixedLength = calculateLength(fieldConfigList); - Integer totalLength = this.getTotalLength(protocolConfig, buffer); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - fixedPropertyMap.put("fixedPosition", maxFixedPosition); - fixedPropertyMap.put("totalLength", totalLength); - fixedPropertyMap.put("tailPosition", totalLength - fixedLength + maxFixedPosition); - return fixedPropertyMap; - } - - //分别计算bit和byte长度=> 合并长度 - private Integer calculateLength(List fieldConfigList) { - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (FieldConfig fieldConfig : fieldConfigList) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - Integer fixedLength = bytefixedLength + bitfixedLength / 8; - return fixedLength; - } - - //找到最大值=> 根据最大值计算业务数据下标 - private Integer calculatePosition(List fieldConfigList) { - String rex = "[0-9]+"; - Integer max = -1; - for (FieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOrignPosition()) - && Integer.valueOf(fieldConfig.getOrignPosition()) > max) { - max = Integer.valueOf(fieldConfig.getOrignPosition()); - } - } - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (FieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOrignPosition()) && fieldConfig.getOrignPosition().equals(max)) { - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - } - } - Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; - return maxFixedPosition; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java new file mode 100644 index 0000000..d4ec6c7 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java @@ -0,0 +1,76 @@ +package com.casic.missiles.parser.rule; + +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import org.apache.commons.lang3.StringUtils; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class GenericRuleResolver { + + //根据前置字段的值,找到指定的规则 + //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 + //=>循环判断=>通过规则得到业务字段 + public static RuleConfig machRule(Map fixDataMap, + String ids, + List protocolFieldConfigs, + List ruleConfigs) { + List preRuleConfigList = getPreRuleList(ids, protocolFieldConfigs); + //获取前置规则字段 + final Map metaDataMap = getPreRuleFields(preRuleConfigList, fixDataMap); + //准备固定的字段集合 + Map fixDataFieldMap = getFixDataFieldMap(protocolFieldConfigs); + return RuleResolverCore.doMachRule(ruleConfigs, metaDataMap, fixDataMap, fixDataFieldMap); + } + + private static Map getFixDataFieldMap(List protocolFieldConfigs) { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, ProtocolFieldConfig::getFieldName) + ); + return fixDataFieldMap; + } + + + /** + * 查询前置规则的字段配置 + * + * @param ids + * @return + */ + private static List getPreRuleList(String ids, List protocolFieldConfigs) { + String[] idList = ids.split(","); + Map prepareMaps = new HashMap<>(); + for (String id : idList) { + if (StringUtils.isNotEmpty(id)) { + prepareMaps.put(Long.valueOf(id), ""); + } + } + List preRuleConfigList = protocolFieldConfigs + .stream() + .filter(e -> prepareMaps.containsKey(e.getId())) + .collect(Collectors.toList()); + return preRuleConfigList; + } + + /** + * 获取前置规则解析字段 + */ + private static Map getPreRuleFields(List preRuleFieldConfigList, Map fixDataMap) { + Map ruleFieldMap = new HashMap<>(); + preRuleFieldConfigList.stream() + .forEach( + preRuleFieldConfig -> { + String fieldName = preRuleFieldConfig.getFieldName(); + if (fixDataMap.containsKey(fieldName)) { + ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); + } + } + ); + return ruleFieldMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java new file mode 100644 index 0000000..baae7e8 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -0,0 +1,68 @@ +package com.casic.missiles.parser.rule; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.casic.missiles.pojo.RuleConfig; + +import java.util.*; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleResolverCore { + + + public static RuleConfig doMachRule(List ruleConfigList, Map metaDataMap, + Map fixDataMap, + Map fixDataFieldMap) { + Optional ruleConfigOptional = ruleConfigList.stream() + .filter(ruleConfig -> machRuleConfig( + JSON.parseObject(ruleConfig.getMatchRuleJson(), Map.class), metaDataMap)) + .findFirst(); + if (ObjectUtil.isEmpty(ruleConfigOptional)) { + return null; + } + String[] ruleFields = ruleConfigOptional.get().getDataFieldIds().split(","); + Map ruleMetaDataMap = getRuleFields(ruleFields, fixDataMap, fixDataFieldMap); + //递归选定解析规则,进行规则解析 + if (!ruleConfigOptional.get().getIsFinishMatch().equals("1")) { + //递归选定规则 + doMachRule(ruleConfigList, ruleMetaDataMap, fixDataMap, fixDataFieldMap); + } + return ruleConfigOptional.get(); + } + + + private static Map getRuleFields(String[] preRuleConfigList, Map fixedDataMap, + Map fixedFieldMap) { + Map ruleFieldMap = new HashMap<>(); + for (String preRuleConfigId : preRuleConfigList) { + String fieldName = fixedFieldMap.get(preRuleConfigId); + if (fixedDataMap.containsKey(fieldName)) { + ruleFieldMap.put(fieldName, String.valueOf(fixedDataMap.get(fieldName))); + } + } + return ruleFieldMap; + } + + + //匹配规则配置 + private static Boolean machRuleConfig(Map ruleMap, Map metaDataMap) { + if (ruleMap == null || metaDataMap == null) { + return null; + } + //所有的字段在规则里面必须有有配置 + for (String key : metaDataMap.keySet()) { + if (ruleMap.containsKey(key)) { + if (!ruleMap.get(key).equals(metaDataMap.get(key))) { + return false; + } + } else { + return false; + } + } + return true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java deleted file mode 100644 index 664088d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java +++ /dev/null @@ -1,92 +0,0 @@ -package com.casic.missiles.parser.rule; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.mapper.dao.PreRuleConfigDao; -import com.casic.missiles.mapper.dao.RuleConfigDao; -import lombok.AllArgsConstructor; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.*; -import java.util.stream.Collectors; - -@Service -@AllArgsConstructor -public class RulerProvider { - - private final FieldConfigDao fieldConfigDao; - private final PreRuleConfigDao preRuleConfigDao; - private final RuleConfigDao ruleConfigDao; - - //根据前置字段的值,找到指定的规则 - //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 - //=>循环判断=>通过规则得到业务字段 - public RuleConfig ruleConfig(Map fixDataMap, String protocolId) { - //批量获取规则 - List preRuleConfigList = preRuleConfigDao.getPreRuleList(protocolId); - //获取固定字段 - Map fixFieldMap = getAllFieldMap(protocolId); - //获取前置规则字段 - final String preRuleFields = getPreRuleFields(preRuleConfigList, fixDataMap, fixFieldMap); - List ruleConfigList = ruleConfigDao.getRuleConfigById(protocolId); - Optional ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig ->preRuleFields.equals( ruleConfig.getParseRuleJson())).findFirst(); - //递归选定解析规则,进行规则解析 - while (!ObjectUtil.isEmpty(ruleConfigOptional) && !ruleConfigOptional.get().getIsBizField().equals("1")) { - String ruleFields = getRuleFields(ruleConfigOptional.get().getDataFieldIds().split(","), fixDataMap, fixFieldMap); - ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig -> ruleConfig.getParseRuleJson().equals(ruleFields)).findFirst(); - } - return ruleConfigOptional.get(); - } - - /** - * 获取前置规则解析字段 - */ - private String getPreRuleFields(List preRuleConfigList, Map fixDataMap, Map fixFieldMap) { - Map ruleFieldMap= new HashMap<>(); - preRuleConfigList.stream() - .forEach( - preRuleConfig -> { - String fieldName = fixFieldMap.get(Long.valueOf(preRuleConfig.getRuleFieldId())); - if (fixDataMap.containsKey(fieldName)) { - ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); - } - } - ); - return JSONObject.toJSONString(ruleFieldMap); - } - - private Map getAllFieldMap(String protocolId) { - List fieldList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Map fixFieldMap = fieldList.stream().collect( - Collectors.toMap(FieldConfig::getId, FieldConfig::getFieldName) - ); - return fixFieldMap; - } - - private String getRuleFields(String[] preRuleConfigList, Map fixDataMap, Map fixFieldMap) { - Map ruleFieldMap= new HashMap<>(); - for (String preRuleConfigId : preRuleConfigList) { - String fieldName = fixFieldMap.get(preRuleConfigId); - if (fixDataMap.containsKey(fieldName)) { - ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); - } - } - return JSONObject.toJSONString(ruleFieldMap); - } - - //弃置 - private String ListToString(List ruleFieldList) { - String ruleFields = ""; - for (String ruleField : ruleFieldList) { - ruleFields += ruleField + ","; - } - ruleFields = StringUtils.isEmpty(ruleFields) ? ruleFields : ruleFields.substring(0, ruleFields.length() - 1); - return ruleFields; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java index 6177e10..bfa87a5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java @@ -2,7 +2,7 @@ public interface SafeStrategy { - String decryption(byte[] bytes); + String decryption(String cipher); String encryption(String lightText); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java index 618716c..6236302 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java @@ -9,9 +9,9 @@ //十六进制的字符串转换成字节数组 byte[] bytes = hexStrToBinaryStr(msg); //计算CRC8 - byte crc8 = CRC8(bytes, 0, bytes.length); - String crc8ToStr = "" + Integer.toHexString(0xff & crc8); - return crc8ToStr; +// String crc8ToStr = "" + Integer.toHexString(0xff & crc8); +// return crc8ToStr; + return null; } /** @@ -33,50 +33,5 @@ return bytes; } - /** - * CRC8 校验 多项式 x8+x2+x+1 - * - * @param b - * @param off - * @param len - * @return - */ - public static byte CRC8(final byte[] b, final int off, final int len) { - byte result = 0x00; - for (int i = 0; i < len; i++) { - result = CHECKSUM_TABLE[(result ^ (b[i + off] & 0xFF)) & 0xFF]; - } - return (byte) (result & 0xFFL); - } - - private final static byte[] CHECKSUM_TABLE = {(byte) 0x00, (byte) 0x07, (byte) 0x0e, (byte) 0x09, (byte) 0x1c, (byte) 0x1b, - (byte) 0x12, (byte) 0x15, (byte) 0x38, (byte) 0x3f, (byte) 0x36, (byte) 0x31, (byte) 0x24, (byte) 0x23, (byte) 0x2a, - (byte) 0x2d, (byte) 0x70, (byte) 0x77, (byte) 0x7e, (byte) 0x79, (byte) 0x6c, (byte) 0x6b, (byte) 0x62, (byte) 0x65, - (byte) 0x48, (byte) 0x4f, (byte) 0x46, (byte) 0x41, (byte) 0x54, (byte) 0x53, (byte) 0x5a, (byte) 0x5d, (byte) 0xe0, - (byte) 0xe7, (byte) 0xee, (byte) 0xe9, (byte) 0xfc, (byte) 0xfb, (byte) 0xf2, (byte) 0xf5, (byte) 0xd8, (byte) 0xdf, - (byte) 0xd6, (byte) 0xd1, (byte) 0xc4, (byte) 0xc3, (byte) 0xca, (byte) 0xcd, (byte) 0x90, (byte) 0x97, (byte) 0x9e, - (byte) 0x99, (byte) 0x8c, (byte) 0x8b, (byte) 0x82, (byte) 0x85, (byte) 0xa8, (byte) 0xaf, (byte) 0xa6, (byte) 0xa1, - (byte) 0xb4, (byte) 0xb3, (byte) 0xba, (byte) 0xbd, (byte) 0xc7, (byte) 0xc0, (byte) 0xc9, (byte) 0xce, (byte) 0xdb, - (byte) 0xdc, (byte) 0xd5, (byte) 0xd2, (byte) 0xff, (byte) 0xf8, (byte) 0xf1, (byte) 0xf6, (byte) 0xe3, (byte) 0xe4, - (byte) 0xed, (byte) 0xea, (byte) 0xb7, (byte) 0xb0, (byte) 0xb9, (byte) 0xbe, (byte) 0xab, (byte) 0xac, (byte) 0xa5, - (byte) 0xa2, (byte) 0x8f, (byte) 0x88, (byte) 0x81, (byte) 0x86, (byte) 0x93, (byte) 0x94, (byte) 0x9d, (byte) 0x9a, - (byte) 0x27, (byte) 0x20, (byte) 0x29, (byte) 0x2e, (byte) 0x3b, (byte) 0x3c, (byte) 0x35, (byte) 0x32, (byte) 0x1f, - (byte) 0x18, (byte) 0x11, (byte) 0x16, (byte) 0x03, (byte) 0x04, (byte) 0x0d, (byte) 0x0a, (byte) 0x57, (byte) 0x50, - (byte) 0x59, (byte) 0x5e, (byte) 0x4b, (byte) 0x4c, (byte) 0x45, (byte) 0x42, (byte) 0x6f, (byte) 0x68, (byte) 0x61, - (byte) 0x66, (byte) 0x73, (byte) 0x74, (byte) 0x7d, (byte) 0x7a, (byte) 0x89, (byte) 0x8e, (byte) 0x87, (byte) 0x80, - (byte) 0x95, (byte) 0x92, (byte) 0x9b, (byte) 0x9c, (byte) 0xb1, (byte) 0xb6, (byte) 0xbf, (byte) 0xb8, (byte) 0xad, - (byte) 0xaa, (byte) 0xa3, (byte) 0xa4, (byte) 0xf9, (byte) 0xfe, (byte) 0xf7, (byte) 0xf0, (byte) 0xe5, (byte) 0xe2, - (byte) 0xeb, (byte) 0xec, (byte) 0xc1, (byte) 0xc6, (byte) 0xcf, (byte) 0xc8, (byte) 0xdd, (byte) 0xda, (byte) 0xd3, - (byte) 0xd4, (byte) 0x69, (byte) 0x6e, (byte) 0x67, (byte) 0x60, (byte) 0x75, (byte) 0x72, (byte) 0x7b, (byte) 0x7c, - (byte) 0x51, (byte) 0x56, (byte) 0x5f, (byte) 0x58, (byte) 0x4d, (byte) 0x4a, (byte) 0x43, (byte) 0x44, (byte) 0x19, - (byte) 0x1e, (byte) 0x17, (byte) 0x10, (byte) 0x05, (byte) 0x02, (byte) 0x0b, (byte) 0x0c, (byte) 0x21, (byte) 0x26, - (byte) 0x2f, (byte) 0x28, (byte) 0x3d, (byte) 0x3a, (byte) 0x33, (byte) 0x34, (byte) 0x4e, (byte) 0x49, (byte) 0x40, - (byte) 0x47, (byte) 0x52, (byte) 0x55, (byte) 0x5c, (byte) 0x5b, (byte) 0x76, (byte) 0x71, (byte) 0x78, (byte) 0x7f, - (byte) 0x6a, (byte) 0x6d, (byte) 0x64, (byte) 0x63, (byte) 0x3e, (byte) 0x39, (byte) 0x30, (byte) 0x37, (byte) 0x22, - (byte) 0x25, (byte) 0x2c, (byte) 0x2b, (byte) 0x06, (byte) 0x01, (byte) 0x08, (byte) 0x0f, (byte) 0x1a, (byte) 0x1d, - (byte) 0x14, (byte) 0x13, (byte) 0xae, (byte) 0xa9, (byte) 0xa0, (byte) 0xa7, (byte) 0xb2, (byte) 0xb5, (byte) 0xbc, - (byte) 0xbb, (byte) 0x96, (byte) 0x91, (byte) 0x98, (byte) 0x9f, (byte) 0x8a, (byte) 0x8d, (byte) 0x84, (byte) 0x83, - (byte) 0xde, (byte) 0xd9, (byte) 0xd0, (byte) 0xd7, (byte) 0xc2, (byte) 0xc5, (byte) 0xcc, (byte) 0xcb, (byte) 0xe6, - (byte) 0xe1, (byte) 0xe8, (byte) 0xef, (byte) 0xfa, (byte) 0xfd, (byte) 0xf4, (byte) 0xf3}; } \ No newline at end of file diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java index 27c2838..6e078a3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java @@ -1,9 +1,6 @@ package com.casic.missiles.parser.safe.impl; -import cn.hutool.core.util.CharsetUtil; -import cn.hutool.crypto.symmetric.SM4; -import cn.hutool.crypto.symmetric.SymmetricCrypto; - +import com.casic.missiles.parser.safe.SafeStrategy; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; @@ -11,19 +8,44 @@ import org.bouncycastle.crypto.engines.SM4Engine; import org.bouncycastle.crypto.params.KeyParameter; import org.bouncycastle.util.encoders.Hex; - -import static cn.hutool.crypto.Mode.ECB; -import static cn.hutool.crypto.Padding.NoPadding; +import org.springframework.stereotype.Component; /** * SM4算法工具类 */ @Slf4j -public class Sm4 { +@Component("sm4") +public class Sm4 implements SafeStrategy { //加解密的字节快大小 public static final int BlockSize = 16; + @Override + public String decryption(String cipher) { + byte[] keyByte = { + 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 + }; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(keyByte); + byte[] in = Hex.decode(cipher); + byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); + String plain = EcbDecrypt(in, keyBytes); + return plain; + } + + @Override + public String encryption(String cipher) { + byte[] keyByte = { + 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 + }; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(keyByte); + byte[] in = Hex.decode(cipher); + byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); + String plain = EcbDecrypt(in, keyBytes); + return plain; + } + /** * SM4ECB加密算法,对内 * @@ -32,8 +54,6 @@ * @return */ private static byte[] ecb_encrypt(byte[] in, byte[] keyBytes) { - - SM4Engine sm4Engine = new SM4Engine(); sm4Engine.init(true, new KeyParameter(keyBytes)); byte[] out = new byte[in.length]; @@ -58,27 +78,6 @@ return cipher; } - - /** - * hutool 解密SM4 - * - * @param encodeContent - * @return - */ - public static String decode(String encodeContent) { - String key = "24ad182507479a5da3ad94d9d78ea203"; - try { - SymmetricCrypto sm4 = new SM4(ECB, NoPadding, key.getBytes()); - String decryptStr = sm4.decryptStr(encodeContent, CharsetUtil.CHARSET_UTF_8); - return decryptStr; - } catch (Exception e) { - e.printStackTrace(); - log.error("SM4解密失败"); - } - return null; - } - - /** * SM4的ECB加密算法 * @@ -129,20 +128,6 @@ return plain; } - /** - * SM4的ECB解密算法 - * - * @param cipher 输入的密文字符串 - * @param key 密钥 - * @return - */ - public static String EcbDecrypt(String cipher, String key) { - byte[] in = Hex.decode(cipher); - byte[] keyBytes = Hex.decode(key); - - String plain = EcbDecrypt(in, keyBytes); - return plain; - } /** * 主函数 @@ -151,28 +136,24 @@ */ public static void main(String[] args) { byte[] ciphertext = { + 0x4B, (byte) 0x8C, (byte) 0x9D, 0x08, (byte) 0xE4, (byte) 0xD3, 0x64, 0x42, (byte) 0xB9, (byte) 0xA5, (byte) 0xFE, (byte) 0xCD, (byte) 0x91, 0x1B, 0x38, (byte) 0xAC, (byte) 0xE9, 0x1C, (byte) 0xCD, 0x53, 0x02, (byte) 0xD7, 0x0C, (byte) 0x9B, (byte) 0x96, 0x30, 0x62, (byte) 0xE8, (byte) 0xFB, (byte) 0xEF, (byte) 0xB9, (byte) 0xFF, (byte) 0xDE, 0x19, (byte) 0x80, 0x35, 0x3E, (byte) 0x90, 0x4F, 0x2F, 0x12, 0x2B, 0x19, (byte) 0x8B, 0x6C, 0x7A, (byte) 0x85, (byte) 0xA1, (byte) 0xB1, (byte) 0x86, (byte) 0xA3, 0x7A, 0x46, 0x0C, 0x2F, (byte) 0x94, 0x4F, 0x7F, 0x2C, 0x56, 0x14, (byte) 0xF3, (byte) 0x89, (byte) 0xC3, - 0x3F, 0x20, (byte) 0xF9, (byte) 0x87, (byte) 0xA1, 0x60, (byte) 0xD9, (byte) 0xA8, (byte) 0xFD, (byte) 0xD7, (byte) 0x9B, 0x4B, 0x26, 0x06, 0x30, 0x44}; + 0x3F, 0x20, (byte) 0xF9, (byte) 0x87, (byte) 0xA1, 0x60, (byte) 0xD9, (byte) 0xA8, (byte) 0xFD, (byte) 0xD7, (byte) 0x9B, 0x4B, 0x26, 0x06, 0x30, 0x44 + }; ByteBuf in = ByteBufAllocator.DEFAULT.heapBuffer(); in.writeBytes(ciphertext); - byte[] keyByte = { 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 }; ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); - key.writeBytes(ciphertext); - String resCipherData = decode(ByteBufUtil.hexDump(in)); - ByteBuf out = ByteBufAllocator.DEFAULT.heapBuffer(); -// out.writeBytes(resCipherData); -// System.out.println(hexBytes); - System.out.println(resCipherData.toString()); -// String resPlainData = EcbDecrypt(resCipherData, key); -// System.out.println("原始明文:" + data); -// System.out.println("解密后明文:" + resPlainData); + key.writeBytes(keyByte); +// String resCipherData = EcbDecrypt(ByteBufUtil.hexDump(in), ByteBufUtil.hexDump(key)); +// System.out.println(resCipherData); } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java index 1395a51..ac5f957 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java @@ -1,7 +1,7 @@ package com.casic.missiles.parser.safe.impl; import io.netty.buffer.ByteBufUtil; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** *

@@ -14,9 +14,8 @@ * @author hyl * @version v1.0: Tea.java, v 0.1 2021/3/12 13:48 $ */ -@Service("tea") -///tea算法类 - +//tea算法类 +@Component("tea") public class Tea { public static byte[] MyTea_Encrypt(byte[] MyTeaContent, int ByteLen, byte[] MyTeakey) { @@ -99,7 +98,6 @@ // for(int i32Index = 0; i32Index < 8; i32Index++) { // System.out.print("0x" + Integer.toHexString(MyContent[i32Index]) + " "); // } - // System.out.println("密钥为:"); // for(int i32Index = 0; i32Index < 16; i32Index++) { // System.out.print("0x" + Integer.toHexString(MyKeys[i32Index]) + " "); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java index bdd0721..bd1516a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java @@ -3,7 +3,7 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.parser.sender.DataSubscribeProvider; import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponents; import org.springframework.web.util.UriComponentsBuilder; @@ -12,7 +12,7 @@ import java.util.Collections; import java.util.Map; -@Service("functionCallback") +@Component("functionCallback") public class FunctionCallback implements DataSubscribeProvider { @Resource diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java index 0b44fb9..7526de2 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.Map; -@Service("middleware") +@Component("middleware") public class MiddlewareSubscribe implements DataSubscribeProvider { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java index 5dcee3f..e2f1192 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.Map; -@Service("nosql") +@Component("nosql") public class NoSqlSubscribe implements DataSubscribeProvider { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java b/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java new file mode 100644 index 0000000..81a5324 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java @@ -0,0 +1,86 @@ +package com.casic.missiles.pojo; + +import lombok.Data; + +/** + * 协议 + */ +@Data +public class Msg { + + /** + * 前导码 + */ + private String preamble; + + /** + * 版本号 + */ + private String version; + + /** + * 内容长度 + */ + private int leng; + + /** + * 设备ID + */ + private String deviceId; + + /** + * 通讯方式 + */ + private Integer connType; + + /** + * 加密方式 + */ + private Integer encryType; + + /** + * 目标地址 + */ + private String destAddr; + + /** + * PDUType + */ + private String PDUType; + + /** + * 操作类型 + */ + private Integer operateType; + + /** + * 传输控制位 PDUType.bit7=0时,表示存在后续的访问;当PDUType.bit7=1时,表示无后续的访问。 + */ + private Integer transControlFlag; + + /** + * 设备类型 + */ + private Integer deviceType; + + /** + * 序号 + */ + private Integer seq; + + /** + * tagList + */ + private String tagList; + + /** + * OidList + */ + private String OidList; + + /** + * CRC + */ + private String CRC; + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java index 40a5265..97cc984 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java @@ -40,7 +40,7 @@ String httpContent = msg.toString(Charset.defaultCharset()); log.info(" String : " + msg.toString(Charset.defaultCharset())); String majorContent = httpContent.substring(httpContent.indexOf("{"), httpContent.lastIndexOf("}") + 1); - String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("serviceData")).get("Value")); + String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("RegistryData")).get("Value")); log.info("----------------------------------" + values); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); bufferContent.writeBytes(values.getBytes(Charset.forName("ISO-8859-1"))); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java index 1b132a7..e3ced4b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java @@ -35,7 +35,7 @@ String httpContent = msg.toString(Charset.defaultCharset()); log.info(" String : " + msg.toString(Charset.defaultCharset())); String majorContent = httpContent.substring(httpContent.indexOf("{"), httpContent.lastIndexOf("}") + 1); - String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("serviceData")).get("Value")); + String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("RegistryData")).get("Value")); log.info("----------------------------------" + values); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); bufferContent.writeBytes(values.getBytes(Charset.forName("ISO-8859-1"))); diff --git a/sensorhub-core/src/main/resources/application.properties b/sensorhub-core/src/main/resources/application.properties deleted file mode 100644 index 8b13789..0000000 --- a/sensorhub-core/src/main/resources/application.properties +++ /dev/null @@ -1 +0,0 @@ - diff --git a/sensorhub-core/src/main/resources/config/application-dev.yml b/sensorhub-core/src/main/resources/config/application-dev.yml index 4f897a8..dcc4c2d 100644 --- a/sensorhub-core/src/main/resources/config/application-dev.yml +++ b/sensorhub-core/src/main/resources/config/application-dev.yml @@ -4,9 +4,9 @@ spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true + url: jdbc:mysql://127.0.0.1:3306/sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true username: root - password: Casic203 + password: root session: store-type: redis redis: diff --git a/sensorhub-core/src/main/resources/config/application.yml b/sensorhub-core/src/main/resources/config/application.yml index ae89f9d..7965da1 100644 --- a/sensorhub-core/src/main/resources/config/application.yml +++ b/sensorhub-core/src/main/resources/config/application.yml @@ -30,6 +30,13 @@ port: 6379 password: ew5T4K3#203lwh config-prefix: 'Casic:' +#代码生成器配置 +code: + generate: + #作者 + author: cz + #待生成对象表名 + table-name: bussiness_field_config,combined_field_config sensorhub: config: port: 7091 diff --git a/sensorhub-support/pom.xml b/sensorhub-support/pom.xml index 9a71296..761601c 100644 --- a/sensorhub-support/pom.xml +++ b/sensorhub-support/pom.xml @@ -42,6 +42,12 @@ ${redis.version} + + com.baomidou + mybatis-plus-generator + ${mybatis-plus-generator.version} + + org.reflections diff --git a/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java b/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java new file mode 100644 index 0000000..515ca53 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java @@ -0,0 +1,14 @@ +package com.casic.missiles.enums; + +/** + * @author + * @date + */ +public interface FixedPropertyEnum { + + String FIXED_POSITION = "fixedPosition"; + + String TOTAL_LENGTH = "totalLength"; + + String TAIL_POSITION = "tailPosition"; +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/CombinedFieldMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CombinedFieldMapper.java new file mode 100644 index 0000000..38e8f42 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CombinedFieldMapper.java @@ -0,0 +1,15 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.CombinedFieldConfig; +import org.apache.ibatis.annotations.Mapper; + +/** + * @author cz + * + */ +@Mapper +public interface CombinedFieldMapper extends BaseMapper { + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java new file mode 100644 index 0000000..128b09d --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java @@ -0,0 +1,10 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.CommandEventConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface CommandEventMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java new file mode 100644 index 0000000..042eb3c --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.DatagramEventConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface DatagramEventConfigMapper extends BaseMapper { +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java new file mode 100644 index 0000000..fc95cf4 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java @@ -0,0 +1,8 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.FieldConfig; + +public interface FieldConfigMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldRuleConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldRuleConfigMapper.java new file mode 100644 index 0000000..b310a08 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldRuleConfigMapper.java @@ -0,0 +1,10 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.FieldRuleConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface FieldRuleConfigMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java new file mode 100644 index 0000000..9060a69 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.ProtocolConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface ProtocolConfigMapper extends BaseMapper { +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolFieldConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolFieldConfigMapper.java new file mode 100644 index 0000000..1b47180 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolFieldConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +public interface ProtocolFieldConfigMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java new file mode 100644 index 0000000..6fa6936 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.RuleConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface RuleConfigMapper extends BaseMapper { +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/AbstractFieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/AbstractFieldConfig.java new file mode 100644 index 0000000..ba9aea2 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/AbstractFieldConfig.java @@ -0,0 +1,38 @@ +package com.casic.missiles.pojo; + +import lombok.Data; + +@Data +public class AbstractFieldConfig { + /** + * 字段名称 + */ + private String fieldName; + /** + * 按照字段评估进行字段解析 + */ + private String ruleJson; + /** + * 起始位置(单位byte) + */ + private Integer OriginPositionByte; + /** + * 起始位置,是否需要bit位置(单位bit)小于8, 没有不需要填写 + */ + private String OriginPositionBit; + /** + * 偏移长度 + */ + private Integer offsetLength; + /** + * 偏移单位(bit/byte) + */ + private String offsetUnit; + /** + * 是否需要转存 + */ + private Integer isStorage; + + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/CombinedFieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/CombinedFieldConfig.java new file mode 100644 index 0000000..4f4de6a --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/CombinedFieldConfig.java @@ -0,0 +1,41 @@ +package com.casic.missiles.pojo; + +import lombok.Data; + +import java.util.Date; + +/** + * 组合配置 + * + * @author cz + * @date 20 + */ +@Data +public class CombinedFieldConfig { + + private Long id; + private Long ruleId; + /** + * 前缀编码 + */ + private String prefixCode; + + /** + * 字段动态的id + */ + private Long dynamicLengthId; + /** + * 对应的要解析字段的ids + */ + private String dataFieldIds; + + /** + * 字段动态的id + */ + private String combinedFieldIds; + + private Date lastTime; + + private Date createTime; + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldConfig.java index a07d20d..8304dc6 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldConfig.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldConfig.java @@ -5,31 +5,28 @@ import java.util.Date; +/** + * @author cz + * 1、该表与实际解析的内容实例解析有关 + * 2、该表字段是随机出现的,和帧结构无关,无法预料的 + * 3、该表字段解析根据FieldEvaluatorConfig进行字段解析 + */ @Data -@TableName("field_config") -public class FieldConfig { +@TableName("business_field_config") +public class FieldConfig extends AbstractFieldConfig { private Long id; -// private String preFieldConfig; - private Long protocolId; - - private String isFixed; - private String uploadDeliveryChange; - - private String replyRule; - private String ruleJson; - + /** + * 协议配置id + */ + private Long ruleId; + /** + * 字段名称 + */ private String fieldName; - private String isStorage; - private Integer orignPosition; - private String exactOrignPosition; - - private Integer offsetLength; - private String offsetUnit; private String ownerId; private Date createTime; private Date lastTime; - } diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldRuleConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldRuleConfig.java new file mode 100644 index 0000000..2e09879 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldRuleConfig.java @@ -0,0 +1,20 @@ +package com.casic.missiles.pojo; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +@TableName("field_rule_config") +@Data +public class FieldRuleConfig { + + private Long id; + private String name; + private String desc; + private String condition; + private String excuteOperation; + private Date lasTime; + private Date createTime; + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/Msg.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/Msg.java deleted file mode 100644 index 81a5324..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/Msg.java +++ /dev/null @@ -1,86 +0,0 @@ -package com.casic.missiles.pojo; - -import lombok.Data; - -/** - * 协议 - */ -@Data -public class Msg { - - /** - * 前导码 - */ - private String preamble; - - /** - * 版本号 - */ - private String version; - - /** - * 内容长度 - */ - private int leng; - - /** - * 设备ID - */ - private String deviceId; - - /** - * 通讯方式 - */ - private Integer connType; - - /** - * 加密方式 - */ - private Integer encryType; - - /** - * 目标地址 - */ - private String destAddr; - - /** - * PDUType - */ - private String PDUType; - - /** - * 操作类型 - */ - private Integer operateType; - - /** - * 传输控制位 PDUType.bit7=0时,表示存在后续的访问;当PDUType.bit7=1时,表示无后续的访问。 - */ - private Integer transControlFlag; - - /** - * 设备类型 - */ - private Integer deviceType; - - /** - * 序号 - */ - private Integer seq; - - /** - * tagList - */ - private String tagList; - - /** - * OidList - */ - private String OidList; - - /** - * CRC - */ - private String CRC; - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/PreRuleConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/PreRuleConfig.java deleted file mode 100644 index bfcf914..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/PreRuleConfig.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.casic.missiles.pojo; - -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -import java.util.Date; - -@Data -@TableName("pre_rule_config") -public class PreRuleConfig { - - private Long id; - private String protocolId; - private String ruleFieldId; - private String ownerId; - private Date createTime; - private Date lastTime; -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolConfig.java index 274ad42..bdac11f 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolConfig.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolConfig.java @@ -5,18 +5,52 @@ import java.util.Date; +/** + * 协议配置表,协议配置与帧结构有关 + * 1、层级关系,协议之后是规则,规则对应设备类型的各种上数规则 + * 2、规则对应协议配置的实例流程 + * 3、每种可根据设备类型和操作类型进行上数规则进行区分 + */ @Data @TableName("protocol_config") public class ProtocolConfig { private Long id; + /** + * 前导码 + */ private String preFix; - private String unpackId; - private String totalLengthId; - private String totalLengthFilterField; + /** + * 拆包id + */ + private Long unpackId; + /** + * 总长度id + */ + private Long totalLengthId; + /** + * + */ + private String totalLengthFilterFields; + /** + * 动态长度ids + */ private String dynamicLengthId; + /** + * 动态长度json(预留字段) + */ private String dynamicLengthJson; - private String tailStr; + /** + * 规则字段所解析预准备的字段 + */ + private String rulePrepareFields; + /** + * 结尾标志 + */ + private Long tailStr; + /** + * 备注 + */ private String remark; private String ownerId; private Date createTime; diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolFieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolFieldConfig.java new file mode 100644 index 0000000..db794bd --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolFieldConfig.java @@ -0,0 +1,43 @@ +package com.casic.missiles.pojo; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +/** + * 协议字段配置表 + * 该表用户存放帧结构固定格式的字段 + * 有以下两个用途 + * (1)、固定格式的字段可用于规则匹配 + * (2)、固定格式的字段可用于报文回复 + * @author cz + * @date 2023-06-09 + */ +@Data +@TableName("protocol_field_config") +public class ProtocolFieldConfig extends AbstractFieldConfig{ + + private Long id; + /** + * 协议配置id + */ + private Long protocolId; + /** + * 上传下发是否有变化, 没有变化,可以直接组装 + */ + private String isReplyFix; + /** + * 按照字段评估进行字段解析 + */ + private Long fieldEvaluatorId; + /** + * 回复规则 + */ + private String replyRule; + + private String ownerId; + private Date createTime; + private Date lastTime; + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java index 3b53493..febf835 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java @@ -6,18 +6,40 @@ import java.util.Date; /** - * 加密字段解析和规则有关,事件调到该流程下面 + * @author cz + * todo: 匹配协议对应业务实例 + * 1、一个协议可以多种的流程规则 + * 2、规则可以支持递归规则流程 */ @Data @TableName("rule_config") public class RuleConfig { - private Long id; private String protocolId; - private String isBizField; - private String parseRuleJson; + /** + * 是否完成规则配置,没有完成, + * 则需要根据规则继续匹配 + */ + private String isFinishMatch; + /** + * 待匹配解析规则 + * {“data_field”:"data_value"} + */ + private String matchRuleJson; + /** + * 待解析字段ids + */ private String dataFieldIds; - private String aviatorFilterJson; + + /** + * 待解析组合字段ids + */ + private String combinedFieldIds; + + /** + * aviator + */ + private String conditionExpression; private Date createTime; private Date lastTime; } diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleDict.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleDict.java deleted file mode 100644 index cc7f389..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleDict.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.casic.missiles.pojo; - -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -@Data -@TableName("rule_dict") -public class RuleDict { - - private Long id; - private Long pid; - private String name; - private String code; - private String ownerId; - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleEvaluator.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleEvaluator.java deleted file mode 100644 index ed16610..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleEvaluator.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.pojo; - -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -import java.util.Date; - -@TableName("rule_evaluator") -@Data -public class RuleEvaluator { - - private Long id; - private String name; - private String desc; - private String condition; - private String excuteOperation; - private Date lasTime; - private Date createTime; - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/CombinedFieldConfigRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/CombinedFieldConfigRegistry.java new file mode 100644 index 0000000..fa59b90 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/CombinedFieldConfigRegistry.java @@ -0,0 +1,12 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.CombinedFieldConfig; + +import java.util.List; + +public interface CombinedFieldConfigRegistry { + + List getCombinedFieldConfigList(Long ruleId); + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/CommandEventRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/CommandEventRegistry.java new file mode 100644 index 0000000..fb97d87 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/CommandEventRegistry.java @@ -0,0 +1,8 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.CommandEventConfig; + +public interface CommandEventRegistry { + + CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName); +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/DatagramEventRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/DatagramEventRegistry.java new file mode 100644 index 0000000..fb34641 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/DatagramEventRegistry.java @@ -0,0 +1,11 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.DatagramEventConfig; + +import java.util.List; + +public interface DatagramEventRegistry{ + + List getDatagramEventList(Long ruleId); + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/FieldConfigRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/FieldConfigRegistry.java new file mode 100644 index 0000000..759642e --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/FieldConfigRegistry.java @@ -0,0 +1,20 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.FieldConfig; + +import java.util.List; + +public interface FieldConfigRegistry { + + + List getFieldConfigList(Long ruleId); + + FieldConfig getFieldConfigById(String fieldId); + + List getFieldConfigs(String protocolId, Integer isFixed); + + List getStorageFieldConfig(String protocolId); + + +} + diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/FieldRuleConfigRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/FieldRuleConfigRegistry.java new file mode 100644 index 0000000..33da70c --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/FieldRuleConfigRegistry.java @@ -0,0 +1,11 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.FieldRuleConfig; + +import java.util.List; + +public interface FieldRuleConfigRegistry { + + List getFieldRuleConfigList(Long ruleId); + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/ProtocolConfigRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/ProtocolConfigRegistry.java new file mode 100644 index 0000000..1725189 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/ProtocolConfigRegistry.java @@ -0,0 +1,12 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.ProtocolConfig; + +import java.util.List; + +public interface ProtocolConfigRegistry { + + List getProtocolConfigList(String firstChar); + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/ProtocolFieldConfigRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/ProtocolFieldConfigRegistry.java new file mode 100644 index 0000000..19d1b9a --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/ProtocolFieldConfigRegistry.java @@ -0,0 +1,14 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.ProtocolFieldConfig; + +import java.util.List; + +public interface ProtocolFieldConfigRegistry { + + + List getProtocolFieldConfigList(Long protocolId); + + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/RuleConfigRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/RuleConfigRegistry.java new file mode 100644 index 0000000..3d2a75c --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/RuleConfigRegistry.java @@ -0,0 +1,14 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.RuleConfig; + +import java.util.List; + +public interface RuleConfigRegistry { + + RuleConfig getNextRuleConfig(String ruleFields); + + + List getRuleConfigById(Long protocolId); + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CombinedFieldConfigRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CombinedFieldConfigRegistryImpl.java new file mode 100644 index 0000000..822cac6 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CombinedFieldConfigRegistryImpl.java @@ -0,0 +1,24 @@ +package com.casic.missiles.registry.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.CombinedFieldMapper; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.registry.CombinedFieldConfigRegistry; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class CombinedFieldConfigRegistryImpl extends ServiceImpl implements CombinedFieldConfigRegistry { + + @Override + public List getCombinedFieldConfigList(Long ruleId) { + QueryWrapper queryWrapper = new QueryWrapper() + .eq("rule_id", ruleId); + List combinedFieldConfigs = this.baseMapper.selectList(queryWrapper); + return combinedFieldConfigs; + } + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CommandEventRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CommandEventRegistryImpl.java new file mode 100644 index 0000000..f0d3559 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CommandEventRegistryImpl.java @@ -0,0 +1,25 @@ +package com.casic.missiles.registry.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.CommandEventMapper; +import com.casic.missiles.pojo.CommandEventConfig; +import com.casic.missiles.registry.CommandEventRegistry; + +import java.util.List; +import java.util.Optional; + +public class CommandEventRegistryImpl extends ServiceImpl implements CommandEventRegistry { + + @Override + public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { + QueryWrapper queryWrapper = new QueryWrapper() + .eq("protocol_id", protocolId) + .eq("scene", sceneName) + .eq("enabled", 1); + List commandEventConfig = this.baseMapper.selectList(queryWrapper); + Optional optionalEventConfig = commandEventConfig.stream().findFirst(); + return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; + } + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/DatagramEventRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/DatagramEventRegistryImpl.java new file mode 100644 index 0000000..2e58698 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/DatagramEventRegistryImpl.java @@ -0,0 +1,26 @@ +package com.casic.missiles.registry.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.DatagramEventConfigMapper; +import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.registry.DatagramEventRegistry; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class DatagramEventRegistryImpl extends ServiceImpl implements DatagramEventRegistry { + + + @Override + public List getDatagramEventList(Long ruleId) { + QueryWrapper queryWrapper = new QueryWrapper() + .eq("rule_id", ruleId); + List fieldConfigList = this.baseMapper.selectList(queryWrapper); + return fieldConfigList; + } + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/FieldConfigRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/FieldConfigRegistryImpl.java new file mode 100644 index 0000000..6ae4422 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/FieldConfigRegistryImpl.java @@ -0,0 +1,50 @@ +package com.casic.missiles.registry.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.FieldConfigMapper; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.registry.FieldConfigRegistry; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * @author cz + */ +@Service +public class FieldConfigRegistryImpl extends ServiceImpl implements FieldConfigRegistry { + + @Override + public List getFieldConfigList(Long ruleId) { + QueryWrapper queryWrapper = new QueryWrapper() + .eq("rule_id", ruleId); + List fieldConfigList = this.baseMapper.selectList(queryWrapper); + return fieldConfigList; + } + + @Override + public FieldConfig getFieldConfigById(String fieldId) { + FieldConfig fieldConfig = this.baseMapper.selectById(fieldId); + return fieldConfig; + } + + @Override + public List getFieldConfigs(String protocolId, Integer isFixed) { + QueryWrapper queryWrapper = new QueryWrapper() + .eq("protocol_id", protocolId) + .eq("is_fixed", isFixed); + List fieldConfigList = this.baseMapper.selectList(queryWrapper); + return fieldConfigList; + } + + @Override + public List getStorageFieldConfig(String protocolId) { + QueryWrapper queryWrapper = new QueryWrapper() + .eq("protocol_id", protocolId) + .eq("is_fixed", 1) + .eq("is_storage", 1); + List fieldConfigList = this.baseMapper.selectList(queryWrapper); + return fieldConfigList; + } +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/FieldRuleConfigRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/FieldRuleConfigRegistryImpl.java new file mode 100644 index 0000000..406fe65 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/FieldRuleConfigRegistryImpl.java @@ -0,0 +1,23 @@ +package com.casic.missiles.registry.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.FieldRuleConfigMapper; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.registry.FieldRuleConfigRegistry; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class FieldRuleConfigRegistryImpl extends ServiceImpl implements FieldRuleConfigRegistry { + + @Override + public List getFieldRuleConfigList(Long ruleId) { + QueryWrapper queryWrapper = new QueryWrapper() + .eq("rule_id", ruleId); + List fieldRuleConfigList = this.baseMapper.selectList(queryWrapper); + return fieldRuleConfigList; + } + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/ProtocolConfigRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/ProtocolConfigRegistryImpl.java new file mode 100644 index 0000000..8a516e5 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/ProtocolConfigRegistryImpl.java @@ -0,0 +1,26 @@ +package com.casic.missiles.registry.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.ProtocolConfigMapper; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.registry.ProtocolConfigRegistry; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class ProtocolConfigRegistryImpl extends ServiceImpl implements ProtocolConfigRegistry { + + /** + * 无条件全查询,作为一次加载的初始化查询 + * + * @return + */ + @Override + public List getProtocolConfigList(String firstChar) { + + return this.baseMapper.selectList(null); + } + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/ProtocolFieldConfigRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/ProtocolFieldConfigRegistryImpl.java new file mode 100644 index 0000000..f4c5a89 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/ProtocolFieldConfigRegistryImpl.java @@ -0,0 +1,26 @@ +package com.casic.missiles.registry.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.ProtocolFieldConfigMapper; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.registry.ProtocolFieldConfigRegistry; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; + +@Service +public class ProtocolFieldConfigRegistryImpl extends ServiceImpl implements ProtocolFieldConfigRegistry { + + @Override + public List getProtocolFieldConfigList(Long protocolId) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("protocol_id", protocolId); + List protocolFieldConfigs = this.baseMapper.selectList(queryWrapper); + return protocolFieldConfigs; + } + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/RuleConfigRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/RuleConfigRegistryImpl.java new file mode 100644 index 0000000..63865ed --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/RuleConfigRegistryImpl.java @@ -0,0 +1,31 @@ +package com.casic.missiles.registry.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.RuleConfigMapper; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.RuleConfigRegistry; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class RuleConfigRegistryImpl extends ServiceImpl implements RuleConfigRegistry { + + + @Override + public RuleConfig getNextRuleConfig(String ruleFields) { + QueryWrapper queryWrapper = new QueryWrapper() + .eq("parse_rule_json", ruleFields); + return this.baseMapper.selectOne(queryWrapper); + } + + @Override + public List getRuleConfigById(Long protocolId) { + QueryWrapper queryWrapper = new QueryWrapper() + .eq("protocol_id", protocolId); + return this.baseMapper.selectList(queryWrapper); + } + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/util/AutoCodeGenerator.java b/sensorhub-support/src/main/java/com/casic/missiles/util/AutoCodeGenerator.java new file mode 100644 index 0000000..d3079d1 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/util/AutoCodeGenerator.java @@ -0,0 +1,104 @@ +package com.casic.missiles.util; + +import com.baomidou.mybatisplus.generator.FastAutoGenerator; +import com.baomidou.mybatisplus.generator.config.DataSourceConfig; +import com.baomidou.mybatisplus.generator.config.rules.DateType; +import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy; +import org.springframework.core.env.Environment; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * @Description: mybatis-plus代码生成器 + * @Author: wangpeng + * @Date: 2022/8/11 17:52 + */ +@RestController +@RequestMapping("/code") +public class AutoCodeGenerator { + + private static String driverClassName; // 驱动名称 + private static String username; // 数据库用户名 + private static String password; // 数据库用户密码 + private static String url; // 数据库连接URL + private static String author; // 作者 + private static String tableName; // 待生成对象表名 + + /** + * 读取 application.properties 配置文件 + */ + private static void readProperty() { + Environment environment = SpringContextUtil.getApplicationContext().getEnvironment(); + driverClassName = environment.getProperty("spring.datasource.driver-class-name"); + username = environment.getProperty("spring.datasource.username"); + password = environment.getProperty("spring.datasource.password"); + url = environment.getProperty("spring.datasource.url"); + author = environment.getProperty("code.generate.author"); + tableName = environment.getProperty("code.generate.table-name"); + } + + /** + * MyBatis-Plus 代码生成器「新」 + * 适用版本:mybatis-plus-generator 3.5.1 及其以上版本,对历史版本不兼容 + */ + @GetMapping("generator") + public static void main(String [] args) { + // 加载数据库配置 + readProperty(); + // 项目路径 + String projectPath = System.getProperty("user.dir"); + // 根据数据源信息,创建文件,生成代码 + FastAutoGenerator.create(new DataSourceConfig.Builder(url,username,password)) + // 全局配置 + .globalConfig(builder -> builder + // 作者 + .author(author) + // 输出路径 + .outputDir(projectPath + "/target/generated-sources") + .dateType(DateType.TIME_PACK) + ) + // 包配置 + .packageConfig(builder -> builder + // 指定父包名 + .parent("com.casic.missiles") + .entity("model") + .Registry("Registry") + .ServiceImpl("Registry.impl") + .mapper("mapper") + .controller("controller")) + // 模版配置 +// .templateConfig(builder -> builder +// .entity("/templates/entity.java") +// .Registry("/templates/Registry.java") +// .ServiceImpl("/templates/ServiceImpl.java") +// .mapper("/templates/mapper.java") +// .controller("/templates/controller.java")) + // 策略配置 + .strategyConfig(builder -> builder + // 指定表名,用逗号分隔 + .addInclude(tableName.split(",")) + // 先开启 Controller 配置 + .controllerBuilder() + // 开启生成 @RestController 控制器 + .enableRestStyle() + // 开启驼峰转连字符 + .enableHyphenStyle() + // 先开启 Entity 配置 + .entityBuilder() + // 开启主键自增 +// .idType(IdType.AUTO) + // 数据库表映射到实体的命名策略,驼峰命名 + .naming(NamingStrategy.underline_to_camel) + // 数据库表字段映射到实体的命名策略,驼峰命名 + .columnNaming(NamingStrategy.underline_to_camel) + // 开启生成实体时生成字段注解 + .enableTableFieldAnnotation() + .enableLombok() + .mapperBuilder() + .enableBaseResultMap() + .enableBaseColumnList()) + // 执行 + .execute(); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java index 608af3a..32cc8a4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java @@ -2,48 +2,47 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.delivery.decorator.ByteDecorator; +import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @AllArgsConstructor public class FieldDecoratorManger { - private final RuleDictDao ruleDictDao; + private final RuleConfigRegistry ruleDictDao; // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 // (1)静态的业务字段是字典里面可以配置的 // (2)动态的业务字段是通过规则生成的 public String contentMerge(String ruleJson, String sceneConent, String dynamicContent) { - List ruleDictList = ruleDictDao.getRuleDictConfig(); - Map ruleDictMap = ruleDictList.stream().collect( - Collectors.toMap(RuleDict::getId, e -> e)); - List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); - for (Map ruleMap : ruleMapList) { - String ruleType = String.valueOf(ruleMap.get("ruleType")); - ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); - NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); - byteDecorator.nodeDecoratorRule(nodeDecoratorParm); - } +// List ruleDictList = ruleDictDao.getRuleDictConfig(); +// Map ruleDictMap = ruleDictList.stream().collect( +// Collectors.toMap(RuleDict::getId, e -> e)); +// List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); +// for (Map ruleMap : ruleMapList) { +// String ruleType = String.valueOf(ruleMap.get("ruleType")); +// ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); +// NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); +// byteDecorator.nodeDecoratorRule(nodeDecoratorParm); +// } return null; } - - private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { - NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() - .contents(sceneConent) - .dynamicContent(dynamicContent) - .ruletypeId(ruletypeId) - .ruleDictMap(ruleDictMap) - .build(); - return nodeDecoratorParm; - } +// +// private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { +// NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() +// .contents(sceneConent) +// .dynamicContent(dynamicContent) +// .ruletypeId(ruletypeId) +// .ruleDictMap(ruleDictMap) +// .build(); +// return nodeDecoratorParm; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java index 652970c..b204ac3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java @@ -1,56 +1,56 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@AllArgsConstructor -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", - JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Component; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Component("logicalDecorator") +//@AllArgsConstructor +//@Slf4j +//public class LogicalShiftDecorator implements ByteDecorator { +// +//// private final FieldRuleEngineMapper fieldRuleEngineMapper; +//// +//// //字节位移 +//// @Override +//// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +//// String logicalValue = ""; +//// RuleEvaluator fieldRuleEngine = new RuleEvaluator(); +//// try { +//// Map env2 = new HashMap(); +//// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +//// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +//// for (String contentId : contentIdList) { +//// RuleDict ruleDict = ruleDictMap.get(contentId); +//// if (ruleDict.getCode().contains("#")) { +//// //使用动态的值 +//// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +//// } +//// env2.put(ruleDict.getName(), ruleDict.getCode()); +//// } +//// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +//// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +//// return null; +//// } +//// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +//// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +//// return values; +//// } catch (Exception ex) { +//// log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", +//// JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +//// return null; +//// } +//// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java index 346468f..822fead 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@AllArgsConstructor -@Slf4j -public class OperationDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("optionDecorator") +//@AllArgsConstructor +//@Slf4j +//public class OperationDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //混合运算,有常量或者乘除的缩放 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java index 50fb0a7..7a8bccb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@AllArgsConstructor -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +////精度计算 +//@AllArgsConstructor +//@Registry("precisionDecorator") +//@Slf4j +//public class PrecisionDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java index da39235..27f9cc7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java @@ -1,54 +1,53 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@AllArgsConstructor -@Slf4j -public class RuleDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("ruleDecorator") +//@AllArgsConstructor +//@Slf4j +//public class RuleDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //吃我一套正则表达式 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (Exception ex) { +// log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java index 7f5cbf3..c043f97 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java @@ -2,6 +2,6 @@ import java.util.Map; -public interface ComandeEventService { +public interface ComandeEventService{ Map loadComandeEventConfig(String protocolId,String scene); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java index 476ad84..aaf1837 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java @@ -2,46 +2,46 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.dao.CommandEventDao; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @Slf4j @AllArgsConstructor -public class ComandeEventServiceImpl implements ComandeEventService { +public class ComandeEventServiceImpl implements ComandeEventRegistry { - private final CommandEventDao commandEventDao; + // private final CommandEventDao commandEventDao; // 加密bean 固定字段出现变化的字段解析,业务字段的有序内容 @Override - public Map loadComandeEventConfig(String protocolId,String sceneName) { - CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); - if (ObjectUtil.isEmpty(commandEventConfig)) { - log.error("协议{},没有配置成功接收回复配置,清排查原因"); - return null; - } - String replyJson = commandEventConfig.getReplyContentJson(); - List> replyMapList = JSONArray.parseObject(replyJson, List.class); - List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); - Map fixMap = fixList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); - List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) - .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) - .collect(Collectors.toList()); - Map commandConfigMap = new HashMap<>(); - commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); - commandConfigMap.put("fixContent", fixMap); - commandConfigMap.put("bizContent", contentList); - return commandConfigMap; + public Map loadComandeEventConfig(String protocolId, String sceneName) { +// CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); +// if (ObjectUtil.isEmpty(commandEventConfig)) { +// log.error("协议{},没有配置成功接收回复配置,清排查原因"); +// return null; +// } +// String replyJson = commandEventConfig.getReplyContentJson(); +// List> replyMapList = JSONArray.parseObject(replyJson, List.class); +// List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); +// Map fixMap = fixList.stream() +// .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); +// List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) +// .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) +// .collect(Collectors.toList()); +// Map commandConfigMap = new HashMap<>(); +// commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); +// commandConfigMap.put("fixContent", fixMap); +// commandConfigMap.put("bizContent", contentList); +// return commandConfigMap; + return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 128b09d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java deleted file mode 100644 index 4016b0b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface DatagramEventMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java deleted file mode 100644 index 597c306..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.apache.ibatis.annotations.Mapper; - -public interface FieldConfigMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java deleted file mode 100644 index a31680a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.PreRuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface PreRuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java deleted file mode 100644 index 9060a69..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface ProtocolConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java deleted file mode 100644 index 6fa6936..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java deleted file mode 100644 index 582a705..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleDict; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleDictMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java deleted file mode 100644 index 6e302c8..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.CommandEventMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Optional; - -@Component -public class CommandEventDao { - - @Resource - private CommandEventMapper commandEventMapper; - - public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId) - .eq("scene", sceneName) - .eq("enabled", 1); - List commandEventConfig = commandEventMapper.selectList(queryWrapper); - Optional optionalEventConfig = commandEventConfig.stream().findFirst(); - return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java deleted file mode 100644 index 9137e4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.FieldConfigMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class FieldConfigDao { - - @Resource - private FieldConfigMapper fieldConfigMapper; - - public FieldConfig getFieldConfigById(String fieldId) { - FieldConfig fieldConfig = fieldConfigMapper.selectById(fieldId); - return fieldConfig; - } - - public List getFieldConfigs(String protocolId,Integer isFixed) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",isFixed); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - - public List getStorageFieldConfig(String protocolId) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",1) - .eq("is_storage",1); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java deleted file mode 100644 index 67bff6b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.mapper.PreRuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class PreRuleConfigDao { - - @Resource - private PreRuleConfigMapper preRuleConfigMapper; - - public List getPreRuleList(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return preRuleConfigMapper.selectList(queryWrapper); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java deleted file mode 100644 index d69ea85..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.RuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleConfigDao { - - @Resource - private RuleConfigMapper ruleConfigMapper; - - public RuleConfig getNextRuleConfig(String ruleFields) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("parse_rule_json", ruleFields); - return ruleConfigMapper.selectOne(queryWrapper); - } - - - public List getRuleConfigById(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return ruleConfigMapper.selectList(queryWrapper); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java deleted file mode 100644 index 932c185..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.RuleDictMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleDictDao { - - @Resource - private RuleDictMapper ruleDictMapper; - - public List getRuleDictConfig() { - List ruleDictList = ruleDictMapper.selectList(null); - return ruleDictList; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java index 9f9e279..43bc4d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java @@ -10,20 +10,15 @@ import io.netty.channel.socket.nio.NioServerSocketChannel; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import javax.annotation.PreDestroy; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static cn.hutool.core.util.ClassUtil.getClasses; /** * SensorhubServer netty服务端 */ @Slf4j -@Service +@Component public class SensorhubServer { /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java index 2c79ff5..9a28c36 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java @@ -11,13 +11,13 @@ import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioSocketChannel; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClient 客户端 */ @Slf4j -@Service +@Registry public final class SensorhubClient { public static void main(String[] args) throws Exception { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java index 9774be0..477c3f7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java @@ -6,12 +6,12 @@ import io.netty.channel.socket.SocketChannel; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientChannelInitialHandler */ -@Service +@Registry public class SensorhubClientChannelInitialHandler extends ChannelInitializer { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java index 346f4b3..73560e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java @@ -5,13 +5,13 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientHandler */ @Slf4j -@Service +@Registry public class SensorhubClientHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java index 5c1c6f2..d990af5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java @@ -4,12 +4,12 @@ import com.casic.missiles.pojo.Msg; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** * SensorhubServerHandler */ -@Service +@Component public class SensorhubServerHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 67283ae..af3172c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,41 +1,37 @@ package com.casic.missiles.parser; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultProtocolConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.*; +import com.casic.missiles.registry.FieldConfigRegistry; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; -import java.nio.charset.Charset; import java.util.HashMap; import java.util.List; import java.util.Map; -@Service("genericProtocolParser") +/** + * @author + */ +@Component("genericProtocolParser") @Slf4j -@AllArgsConstructor +@RequiredArgsConstructor public class GenericProtocolParser implements ProtocolParser { - private final LeadingCodeMatcher leadingCodeMatcher; private final List frameStructDispenserList; - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorInstanceSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; // 匹配首字母前导码=> 帧结构匹配前导码=> // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 @@ -44,18 +40,19 @@ public Boolean doParseProtocol(ByteBuf byteBuf) { String protocolContent = ByteBufUtil.hexDump(byteBuf); //匹配前导码 - List preCodeConfigs = leadingCodeMatcher.matchLeadingCode(protocolContent); + List preCodeConfigs = LeadingCodeMatcher.matchFrameLeadingCode(protocolContent); //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 if (preCodeConfigs.size() == 0) { - return rematch(byteBuf,protocolContent); + return rematch(byteBuf, protocolContent); } - //暂时先取第一个 + //暂时先取第一个,提升速度,使用享元模式, 减少类的创建销毁与构建 ProtocolConfig protocolConfig = preCodeConfigs.get(0); + AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); ByteBuf wholeDatagramByte = null; //通过匹配帧结构获取完整的数据包 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, preCodeConfigs.get(0))) != null) { + if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, protocolFactory)) != null) { break; } } @@ -68,76 +65,78 @@ * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 */ - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId, wholeDatagramByte); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap, protocolId); - //选取规则对应的流程实例 - DatagramEventConfig datagramEventConfig = processorInstanceSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); + //进行规则字段解析,进行匹配规则 + RuleConfig ruleConfig = getRuleConfig(protocolFactory, wholeDatagramByte); + if (ruleConfig == null) { + return false; + } //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, wholeDatagramByte); + ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte); + //以下进行业务的规则解析,同时选定流程实例 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); + DatagramEventProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain, + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText, protocolId); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain); //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); + datagramEventProvider.storeData(bizDataMap); return true; } - private Boolean rematch(ByteBuf byteBuf,String protocolContent) { + /** + * 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 + */ + private Boolean rematch(ByteBuf byteBuf, String protocolContent) { //重置位判断 byteBuf.resetReaderIndex(); //判断重置是否前移,如果没有前移,则直接判为匹配失败 if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { return false; } else { + //递归执行 return doParseProtocol(byteBuf); } } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; + //获取匹配规则->匹配规则 + private RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + //取出其中参与逻辑provider并判空 + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); + String rulePrepareFields = protocolConfig.getRulePrepareFields(); + //固定字段 + if (StringUtils.isNotEmpty(rulePrepareFields)) { + //获取统一固定字段解析 + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + //获取该协议的字段配置,用于协议规则匹配 + List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); + //获取规则 + RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, + rulePrepareFields, protocolFieldConfigs); + return ruleConfig; + } + return null; } - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + //数据构建,获取固定字段的store和业务字段store + private Map buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + Map bizDataMap = new HashMap<>(); + Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); + Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); + bizDataMap.putAll(ruleStoreObjectMap); + bizDataMap.putAll(protocolStoreObjectMap); return bizDataMap; } - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java index 8a46e32..16ce2e5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java @@ -3,6 +3,7 @@ import io.netty.buffer.ByteBuf; public interface ProtocolParser { + Boolean doParseProtocol(ByteBuf byteBuf); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java new file mode 100644 index 0000000..f7814af --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java @@ -0,0 +1,35 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.ProtocolConfigProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.ProtocolConfig; + +/** + * 存放基本协议的的加载信息 + */ +public class AbstractProtocolConfigFactory { + private final ProtocolConfigProvider protocolConfigProvider; + private final ProtocolFieldConfigProvider protocolFieldConfigProvider; + private final RuleConfigProvider ruleConfigProvider; + + public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { + this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); + this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); + this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); + } + + public ProtocolConfigProvider getProtocolConfigProvider() { + return protocolConfigProvider; + } + + public ProtocolFieldConfigProvider getProtocolFieldConfigProvider() { + return protocolFieldConfigProvider; + } + + public RuleConfigProvider getRuleConfigProvider() { + return ruleConfigProvider; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java new file mode 100644 index 0000000..6e36147 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java @@ -0,0 +1,57 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.CombinedFieldConfigProvider; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.FieldConfigProvider; +import com.casic.missiles.parser.provider.FieldRuleConfigProvider; + +/** + * 存放规则相关的的的加载信息 + */ +public class AbstractRuleConfigFactory { + + /** + * 处理字节 + */ + private final FieldConfigProvider fieldConfigProvider; + /** + * 处理组合字节解析的解码器 + */ + private final CombinedFieldConfigProvider combinedFieldConfigProvider; + /** + * 处理负责字节解析的规则配置 + */ + private final FieldRuleConfigProvider fieldRuleConfigProvider; + /** + * 处理实例流程 + */ + private final DatagramEventProvider datagramEventProvider; + + + public AbstractRuleConfigFactory(Long ruleId) { + this.fieldConfigProvider = new FieldConfigProvider(ruleId); + this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); + this.fieldRuleConfigProvider = new FieldRuleConfigProvider(ruleId); + this.datagramEventProvider = new DatagramEventProvider(ruleId); + } + + public FieldConfigProvider getFieldConfigProvider() { + return fieldConfigProvider; + } + + public CombinedFieldConfigProvider getCombinedFieldConfigProvider() { + return combinedFieldConfigProvider; + } + + public FieldRuleConfigProvider getFieldRuleConfigProvider() { + return fieldRuleConfigProvider; + } + + public DatagramEventProvider getDatagramEventProvider() { + return datagramEventProvider; + } + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java deleted file mode 100644 index 6e1719a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.factory; - - -import com.casic.missiles.pojo.ProtocolConfig; - -import java.util.List; - -/** - * 数据库访问优化(暂时未做) - *

- * 1、初始化协议解析配置,并存放到处存放缓存,对协议基本配置进行管理 - * 2、其中流程中所有的配置都经过此类进行管理,进行调用获取,增强解析速度 - */ -public interface DatagramFactory { - - /** - * 初始化 - */ - List datagramInit(); - - /** - * 根据前导码配置匹配,模糊匹配获取所有的报文项 - */ - List match(); - - /** - * 根据前导码匹配,返回报文项 - */ - List filer(); - - /** - * 保证数据的唯一性选择器 - */ - List selectOne(); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java new file mode 100644 index 0000000..87444a0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java @@ -0,0 +1,18 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +import java.util.List; + +/** + * 直接用,还是边用边创建 + */ +public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { + + + public DefaultProtocolConfigFactory(ProtocolConfig protocolConfig) { + super(protocolConfig); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java new file mode 100644 index 0000000..cce0c7c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java @@ -0,0 +1,12 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; + +public class DefaultRuleFactory extends AbstractRuleConfigFactory { + + public DefaultRuleFactory(Long ruleId) { + super(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java deleted file mode 100644 index 9ee97e0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.casic.missiles.parser.instance; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service -@Slf4j -@AllArgsConstructor -public class GeneralProcessor { - - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; - - /** - * 统一固定字段解析=>进行规则的查询的判断 - * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 - * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 - */ - @Deprecated - public boolean parseWholeDatagram(ByteBuf buffer, ProtocolConfig protocolConfig) { - try { - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap,protocolId); - //选取规则对应的流程= - DatagramEventConfig datagramEventConfig = processorSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); - //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); - //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); - //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); - //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); - //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); - return true; - } catch (Exception ex) { - log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", - ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); - return false; - } - } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; - } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); - } - - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); - return bizDataMap; - } - - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java index 25e7ad8..6a5777e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java @@ -1,23 +1,31 @@ package com.casic.missiles.parser.instance.impl; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.mapper.DatagramEventMapper; import com.casic.missiles.pojo.DatagramEventConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.SpringContextUtil; -@Service -@AllArgsConstructor +import java.util.List; +import java.util.Optional; + +/** + * @author cz + * + */ public class DefaultProcessorInstanceSelector implements ProcessorInstanceSelector { - private final DatagramEventMapper datagramEventMapper; + private static List datagramEventConfigs; + + static { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + datagramEventConfigs = datagramEventRegistry.getDatagramEventList(); + } @Override public DatagramEventConfig getProcessorInstance(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("rule_id", protocolId); - return datagramEventMapper.selectOne(queryWrapper); + Optional optionalSelectInstance = datagramEventConfigs.stream() + .filter(e -> e.getId().equals(protocolId)).limit(1).findFirst(); + return optionalSelectInstance.isPresent() ? optionalSelectInstance.get() : null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a778671..7b56a43 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,16 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import io.netty.buffer.ByteBuf; /** - * 分析匹配情况 - * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 - * 2、匹配不成功,有后续帧,可以进行下次匹配。 - * 3、匹配不成功,无后续帧,可以进行丢弃。 + * 分析匹配情况 + * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 + * 2、匹配不成功,有后续帧,可以进行下次匹配。 + * 3、匹配不成功,无后续帧,可以进行丢弃。 */ -public interface FrameStructMatcher{ +public interface FrameStructMatcher { - ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig); + ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 05320ab..8ebea78 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,23 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.ProtocolConfigMapper; +import com.casic.missiles.parser.provider.ProtocolConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Component; import java.util.List; import java.util.stream.Collectors; -@Component -@AllArgsConstructor public class LeadingCodeMatcher { - private final ProtocolConfigMapper protocolMapper; - //** 1、首字母匹配前导码, // 2、以匹配出的前导码是否在报文中条件进行前导码的匹配二次筛选 - public List matchLeadingCode(String protocolContent){ + public static List matchFrameLeadingCode(String protocolContent){ List initialConfigs = initialMatch(protocolContent); List preCodeConfigs = initialConfigs.stream() .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) @@ -26,13 +19,16 @@ } //初始化匹配前导码内容 - private List initialMatch(String protocolContent) { - String protocolStr = protocolContent.charAt(0) + ""; - QueryWrapper queryWrapper = new QueryWrapper() - .likeRight("pre_fix", protocolStr); - List protocolConfigList = protocolMapper.selectList(queryWrapper); - return protocolConfigList; + private static List initialMatch(String protocolContent) { + String firstFrameChar = protocolContent.charAt(0) + ""; + ProtocolConfigProvider protocolConfigProvider=new ProtocolConfigProvider(firstFrameChar); + return protocolConfigProvider.getMatchList(); } + + + + + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index cf2113d..e915877 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -1,32 +1,35 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(0) -@Service +@Component public class FrameLengthMatcher implements FrameStructMatcher { - @Autowired - private FieldParser fieldParser; - //超过长度 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { String dataGramContent = ByteBufUtil.hexDump(byteBuf); - if (StringUtils.isEmpty(protocolConfig.getUnpackId()) && StringUtils.isEmpty(protocolConfig.getTailStr())) { - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + //当不存在结尾标志和拆包标志,可以直接使用长度进行匹配 + if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { if (dataGramContent.length() >= totalLength) {//等于长度返回true,超出长度,切断 - ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, protocolConfig, totalLength); + ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, totalLength); return wholeDatagramByte; } else { //读的标志位前移舍弃 @@ -38,7 +41,7 @@ return null; } - private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, Integer totalLength) { byteBuf.readBytes(totalLength); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, totalLength - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 2bfc213..d527ad0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; @@ -13,7 +13,7 @@ import lombok.AllArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.nio.charset.Charset; import java.util.Map; @@ -22,32 +22,30 @@ * 后续标志验证 */ @Order(1) -@Service +@Component @AllArgsConstructor -public class FrameMarkMatcher implements FrameStructMatcher { - - private final FieldConfigDao fieldConfigDao; - private final FieldParser fieldParser; - private final FieldResolver fieldResolverManger; +public class FrameMarkMatcher implements FrameStructMatcher, FixedPropertyEnum { //帧后续标志=>结束,进行帧的重组=>有后续,1、帧移位判别 2、继续接收帧 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig UnpackConfig = StringUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getUnpackId()); - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); - Integer upback = 0; + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); ByteBuf mergeWholeFrameByte = null; - if (!ObjectUtil.isEmpty(UnpackConfig)) { - while (hasNextFullFrame(byteBuf, protocolConfig)) { - upback = (Integer) fieldResolverManger.filedParserManger(byteBuf, UnpackConfig, null); + if (!ObjectUtil.isEmpty(unpackFlag)) { + while (hasNextFullFrame(byteBuf, protocolConfig, protocolFieldConfigProvider)) { //是否存在后续位 - if (upback == 1) {//使用esayRule + if (unpackFlag == 1) {//使用esayRule //表示可以截取 - mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolConfig, totalLength); + mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolFieldConfigProvider, protocolConfig); return mergeWholeFrameByte; } else { - byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig)); + byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig, protocolFieldConfigProvider)); } } } @@ -56,7 +54,8 @@ //选取第一个帧,将业务内容和后面部分分开 //计算数据报文-业务内容 - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolFieldConfigProvider protocolFieldConfigProvider, ProtocolConfig protocolConfig) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); //截取完整报文 byteBuf.readBytes(totalLength); ByteBuf byteBufContent = byteBuf.slice(0, byteBuf.readerIndex()); @@ -68,15 +67,15 @@ String tail = ""; System.out.println(ByteBufUtil.hexDump(byteBufContent)); //会存在多个帧拼接在一起的的情况,进行合并处理 - while (hasNextFullFrame(byteBufContent, protocolConfig)) { - Integer currentFrameLength = fieldParser.getTotalLength(protocolConfig, byteBufContent); + while (hasNextFullFrame(byteBufContent, protocolConfig, protocolFieldConfigProvider)) { + Integer currentFrameLength = protocolFieldConfigProvider.getTotalLength(byteBufContent, protocolConfig); byteBufContent.readBytes(currentFrameLength); ByteBuf currentbyteBuf = byteBufContent.slice(0, byteBufContent.readerIndex()); byteBufContent.markReaderIndex();//读的标志位前移 System.out.println(ByteBufUtil.hexDump(byteBufContent)); String hexDump = currentbyteBuf.toString(Charset.forName("ISO-8859-1")); //获取当前固定帧结构的关系map - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, currentbyteBuf); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(currentbyteBuf, protocolConfig); if (StringUtils.isEmpty(mergeFrameStr)) { //首次获取业务数据报文 mergeFrameStr += hexDump.substring(0, currentFrameFixedProperty.get("tailPosition")); @@ -95,22 +94,22 @@ /** * 获取平移到下一帧起始位置 */ - public int getNextFrameOffset(ByteBuf buffer, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, buffer); - return currentFrameFixedProperty.get("totalLength"); + public int getNextFrameOffset(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + return currentFrameFixedProperty.get(TOTAL_LENGTH); } /** * 判断是否出错进行整个帧的 */ - public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, byteBuf); + public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); //保证读取位置不在固定位置,是可变的业务内容 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("fixedPosition")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(FIXED_POSITION)) { return false; } //判断读取是否操作帧长度 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("totalLength")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(TOTAL_LENGTH)) { return false; } return true; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 76a3784..c3a1bab 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -1,50 +1,50 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.parser.instance.GeneralProcessor; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; +import io.netty.buffer.ByteBufUtil;; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(2) -@Service +@Component public class FrameTailMatcher implements FrameStructMatcher { - @Resource - private FieldConfigDao fieldConfigDao; - @Autowired - private GeneralProcessor generalProcessor; - //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig tailFieldConfig = StringUtils.isEmpty(protocolConfig.getTailStr()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getTailStr()); - if (!ObjectUtil.isEmpty(tailFieldConfig)) { - String tailStr = tailFieldConfig.getFieldName(); + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfig protocolFieldConfig = ObjectUtils.isEmpty(protocolConfig.getTailStr()) ? null : + fieldConfigProvider.getFieldConfigById(protocolConfig.getTailStr()); + if (!ObjectUtil.isEmpty(protocolFieldConfig)) { + String tailStr = protocolFieldConfig.getFieldName(); String dataGramContent = ByteBufUtil.hexDump(byteBuf); Boolean tailFlag = ByteBufUtil.hexDump(byteBuf).contains(tailStr); if (!tailFlag) { //使用esayRule return null; } else if (dataGramContent.indexOf(tailStr) < dataGramContent.length() - tailStr.length()) { Integer length = dataGramContent.indexOf(tailStr) + tailStr.length(); - ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, protocolConfig, length); + ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, length); return wholeDatagramByte; //存在粘包 } } return null; } - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer length) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, Integer length) { byteBuf.readBytes(length); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, length - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java new file mode 100644 index 0000000..5f1c177 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java @@ -0,0 +1,73 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.combined.GenericCombinedFieldResolver; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.CombinedFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class CombinedFieldConfigProvider { + + + /** + * 作为临时配置列表缓存使用 + */ + private final List combinedFieldConfigList; + private Map storeObjectMap = new HashMap<>(); + + public CombinedFieldConfigProvider(Long ruleId) { + CombinedFieldConfigRegistry combinedFieldConfigRegistry = SpringContextUtil.getBean(CombinedFieldConfigRegistry.class); + combinedFieldConfigList = combinedFieldConfigRegistry.getCombinedFieldConfigList(ruleId); + } + + public void parseDataField(RuleConfig ruleConfig, String clearZeroPlain,Map fieldConfigsMap ) { + if (showSkip()) { + return; + } + //匹配对应的数据,然后进行相关的字段解析 + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver(); + combinedFieldResolver.parseDataField(combinedFieldConfigList, byteBuf, storeObjectMap,fieldConfigsMap); + } + + + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getCombinedFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return combinedFieldConfigList.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public List getCombinedFieldConfigList() { + return combinedFieldConfigList; + } + + /* 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(combinedFieldConfigList) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java new file mode 100644 index 0000000..f3cfedc --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java @@ -0,0 +1,11 @@ +package com.casic.missiles.parser.provider; + +/** + * @author cz + * @date 2023-6-12 + */ +public class CommandEventProvider{ + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java new file mode 100644 index 0000000..70eec5e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java @@ -0,0 +1,77 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.safe.SafeStrategy; +import com.casic.missiles.parser.sender.DataSubscribeProvider; +import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class DatagramEventProvider { + + private final DatagramEventConfig processorInstance; + + public DatagramEventProvider(Long ruleId) { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + List datagramEventConfigList = + datagramEventRegistry.getDatagramEventList(ruleId); + processorInstance = this.getProcessorInstance(datagramEventConfigList); + } + + public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { + if (showSkip()) { + return null; + } + return datagramEventConfigList.get(0); + } + + // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 + public String getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap) { + String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? + processorInstance.getSafeBean() : + fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); + if (!StringUtils.isEmpty(safeName)) { + //需要加密 + SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); + String plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); + return clearComplementZero(plain); + } + return ByteBufUtil.hexDump(bizDataContent); + } + + //解密清零操作 + private String clearComplementZero(String plain) { + plain = plain.substring(0, plain.lastIndexOf("00")); + return plain; + } + + //数据发送,数据发送者暂未构建 + public void storeData(Map bizDataMap) { + DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); +// dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return ObjectUtils.isNotEmpty(processorInstance) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java new file mode 100644 index 0000000..7e1fe0a --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java @@ -0,0 +1,97 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.FieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class FieldConfigProvider { + + + private final List fieldConfigs; + private Map storeObjectMap = new HashMap<>(); +// private Map singleObjects = new ConcurrentHashMap<>(); + + public FieldConfigProvider(Long ruleId) { + FieldConfigRegistry fieldConfigRegistry = SpringContextUtil.getBean(FieldConfigRegistry.class); + fieldConfigs = fieldConfigRegistry.getFieldConfigList(ruleId); + } + + public List getFieldConfigs() { + return fieldConfigs; + } + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public Map parseDataField(RuleConfig ruleConfig, String clearZeroPlain) { + if (showSkip()) { + return null; + } + List prepareFieldConfig = prepareParseField(ruleConfig); + if (CollectionUtils.isNotEmpty(prepareFieldConfig)) { + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(fieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + return fixDataMap; + } + } + return null; + } + + /** + * 得到需要处理的业务内容 + * + * @return + */ + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return fieldConfigs.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public Map getFieldConfigsMap() { + return fieldConfigs.stream().collect( + Collectors.toMap(FieldConfig::getId, e -> e) + ); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(fieldConfigs) ? false : true; + } + + +} + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java new file mode 100644 index 0000000..817bfaf --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java @@ -0,0 +1,19 @@ +package com.casic.missiles.parser.provider; + +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.registry.FieldRuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; + +public class FieldRuleConfigProvider { + + private final List fieldRuleConfigList; + + public FieldRuleConfigProvider(Long ruleId) { + FieldRuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(FieldRuleConfigRegistry.class); + fieldRuleConfigList = ruleConfigRegistry.getFieldRuleConfigList(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java new file mode 100644 index 0000000..99a1b06 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java @@ -0,0 +1,53 @@ +package com.casic.missiles.parser.provider; + + +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.registry.ProtocolConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolConfigProvider { + + private final List protocolConfigList; + + public ProtocolConfigProvider(String firstChar) { + ProtocolConfigRegistry registry = SpringContextUtil.getBean(ProtocolConfigRegistry.class); + protocolConfigList = registry.getProtocolConfigList(firstChar); + } + + public List getMatchList() { + return protocolConfigList; + } + + /** + * 设置当前协议 + * + * @param protocolConfig + */ + public ProtocolConfigProvider(ProtocolConfig protocolConfig) { + List protocolConfigs = new ArrayList<>(); + protocolConfigs.add(protocolConfig); + protocolConfigList = protocolConfigs; + } + + /** + * 获取当前协议 + * + * @return + */ + public ProtocolConfig getCurrentProtocolConfig() { + if (this.protocolConfigList == null) { + return null; + } else { + return protocolConfigList.get(0); + } + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java new file mode 100644 index 0000000..043927d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java @@ -0,0 +1,213 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.registry.ProtocolFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolFieldConfigProvider { + + private static final String FIXED_FIELD_DS = "fixedFieldDs"; + private static final String CONTENT_FIELD_DS = "contentFieldDs"; + private static final String PROTOCOL_LENGTH = "protocolLength"; + private static final String PROTOCOL_FIELD_ID = "protocolFieldId"; + private static final String PROTOCOL_POSITION = "protocolPosition"; + + private final List protocolFieldConfigs; + private Map singleObjects = new ConcurrentHashMap<>(); + private Map storeObjectMap = new HashMap<>(); + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public ProtocolFieldConfigProvider(Long protocolId) { + ProtocolFieldConfigRegistry protocolFieldConfigRegistry = SpringContextUtil.getBean(ProtocolFieldConfigRegistry.class); + protocolFieldConfigs = protocolFieldConfigRegistry.getProtocolFieldConfigList(protocolId); + } + + public List getProtocolFieldConfigs() { + return protocolFieldConfigs; + } + + public ProtocolFieldConfig getFieldConfigById(Long fieldId) { + Optional optionalConfig = protocolFieldConfigs.stream().filter( + e -> e.getId().equals(fieldId) + ).findFirst(); + return optionalConfig.isPresent() ? optionalConfig.get() : null; + } + + public Integer getProtocolFieldValue(Long protocolFieldId, ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_FIELD_ID + protocolFieldId + ByteBufUtil.hexDump(byteBuf); + //获取缓存 + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + //加载固定长度数据集合 + Map fixDataMap = this.getProtocolDataMap(byteBuf); + ProtocolFieldConfig protocolFieldConfig = selectFieldConfig(protocolFieldId); + Integer protocolFieldValue = 0; + //获取约定字段的总长度 + if (fixDataMap.containsKey(protocolFieldConfig.getFieldName())) { + Object appointUnpackObject = fixDataMap.get(protocolFieldConfig.getFieldName()); + if (ObjectUtils.isNotEmpty(appointUnpackObject)) { + protocolFieldValue = (Integer) appointUnpackObject; + } + } + if (protocolFieldValue != null) { + //加入缓存 + if (ObjectUtils.isNotEmpty(protocolFieldValue)) { + this.singleObjects.put(catchKey, protocolFieldValue); + return protocolFieldValue; + } + } + return null; + } + + /** + * 获取帧固定位置信息 + * + * @param byteBuf + * @param protocolConfig + * @return + */ + public Map getFixedProperty(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_POSITION + protocolConfig.getId(); + if (this.singleObjects.containsKey(catchKey)) { + return (Map) singleObjects.get(catchKey); + } + Map fixedPropertyMap = new HashMap<>(); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + fixedPropertyMap = fieldParser.doGetFixedProperty(protocolFieldConfigs, this.getTotalLength(byteBuf,protocolConfig)); + if (CollectionUtils.isNotEmpty(fixedPropertyMap)) { + this.singleObjects.put(catchKey, fixedPropertyMap); + return fixedPropertyMap; + } + return fixedPropertyMap; + } + + /** + * 获取帧结构应有的总长度 + */ + public Integer getTotalLength(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_LENGTH + ByteBufUtil.hexDump(byteBuf); + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + Integer appointFrameLength = getProtocolFieldValue(protocolConfig.getTotalLengthId(), byteBuf); + if (appointFrameLength != null) { + //获取过滤的字段集合总长度 + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Integer totalFilterLength = fieldParser.getTotalFilterLength(protocolConfig, byteBuf, getFixFieldConfigMap()); + //计算总长度 + Integer totalLength = appointFrameLength + totalFilterLength; + //加入缓存 + if (ObjectUtils.isNotEmpty(totalLength)) { + this.singleObjects.put(catchKey, totalLength); + return totalLength; + } + } + return null; + } + + /** + * 获取协议有关字段解析内容 + * storeObjectMap存储代转存的数据 + * + * @return + */ + public Map getProtocolDataMap(ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(FIXED_FIELD_DS)) { + return (Map) singleObjects.get(FIXED_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(protocolFieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + this.singleObjects.put(FIXED_FIELD_DS, fixDataMap); + return fixDataMap; + } + return null; + } + + /** + * 获取业务报文内容的content字节 + * + * @param wholeDatagramByte + * @return + */ + public ByteBuf getDataContentBuf(ByteBuf wholeDatagramByte) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(CONTENT_FIELD_DS)) { + return (ByteBuf) singleObjects.get(CONTENT_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + ByteBuf bizDataByteBuf = fieldParser.getDataContentBuf(protocolFieldConfigs, wholeDatagramByte); + if (bizDataByteBuf != null) { + this.singleObjects.put(CONTENT_FIELD_DS, bizDataByteBuf); + return bizDataByteBuf; + } + return null; + } + + + private ProtocolFieldConfig selectFieldConfig(Long id) { + Optional optionalProtocolFieldConfig = this.protocolFieldConfigs.stream().filter( + e -> e.getId().equals(id) + ).findFirst(); + return optionalProtocolFieldConfig.isPresent() ? optionalProtocolFieldConfig.get() : null; + } + + + private Map getFixFieldConfigMap() { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, e -> e) + ); + return fixDataFieldMap; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(protocolFieldConfigs) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java new file mode 100644 index 0000000..dafba1c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java @@ -0,0 +1,56 @@ +package com.casic.missiles.parser.provider; + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.rule.GenericRuleResolver; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.RuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleConfigProvider { + + private final List ruleConfigs; + + public List getRuleConfigs() { + return ruleConfigs; + } + + public RuleConfigProvider(Long protocolId) { + RuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(RuleConfigRegistry.class); + ruleConfigs = ruleConfigRegistry.getRuleConfigById(protocolId); + } + + /** + * 获取规则匹配结果 + * + * @param parseFixedDataMap + * @param protocolFieldConfigs + * @return + */ + public RuleConfig doGetRule(Map parseFixedDataMap, + String ids, + List protocolFieldConfigs) { + if (showSkip()) { + return null; + } + RuleConfig ruleConfig = GenericRuleResolver.machRule(parseFixedDataMap, ids, protocolFieldConfigs, ruleConfigs); + return ruleConfig; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(ruleConfigs) ? false : true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java index 3c05891..856b399 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java @@ -1,18 +1,11 @@ package com.casic.missiles.parser.resolver; -import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.springframework.web.bind.annotation.RequestBody; -import javax.annotation.Resource; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -20,19 +13,17 @@ @Slf4j public class ByteMergeProvider { - @Resource - private FieldRuleEngineMapper fieldRuleEngineMapper; - //拿到所有的值合并到一个值 - public String resolveByteMerge(List valueList, String ruletypeId, String vaildRange) { + public static String resolveByteMerge(List valueList, String ruleTypeId, String vaildRange) { String values = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Map vaildMap = getValidRangeMap(vaildRange); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(ruletypeId); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } + //暂时不处理 +// fieldRuleEngine = fieldRuleConfigMapper.selectById(ruleTypeId); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } Map env2 = new HashMap(); for (int i = 0; i < valueList.size(); i++) { if (vaildMap.containsKey(i)) { @@ -47,7 +38,7 @@ } } - private Map getValidRangeMap(String vaildRange) { + private static Map getValidRangeMap(String vaildRange) { String[] range = vaildRange.split(","); Map vaildMap = new HashMap(); for (int i = 0; i < range.length; i++) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 8d821cd..85d6bbf 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -1,9 +1,12 @@ package com.casic.missiles.parser.resolver; +import com.casic.missiles.pojo.AbstractFieldConfig; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; import io.netty.buffer.ByteBuf; +import java.util.List; import java.util.Map; /** @@ -11,18 +14,14 @@ */ public interface FieldParser { -// Map fieldProcess(String protocolContent,); - Map dataParser(RuleConfig ruleConfig, String lightText,String protocolId); + Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength); - Map fixDataParser(String protocolId, ByteBuf buffer); + Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap); - Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf); + ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer); - ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer); - - ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer); - - Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer); + Integer getTotalFilterLength(ProtocolConfig protocolConfig, ByteBuf byteBuf, Map protocolFieldConfigMap); } + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java new file mode 100644 index 0000000..9e0c00e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java @@ -0,0 +1,52 @@ +package com.casic.missiles.parser.resolver; + +import com.casic.missiles.pojo.AbstractFieldConfig; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.util.List; + +public class FieldParserSupport { + + //分别计算bit和byte长度=> 合并长度 + protected Integer calculateLength(List fieldConfigList) { + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + Integer fixedLength = bytefixedLength + bitfixedLength / 8; + return fixedLength; + } + + //找到最大值=> 根据最大值计算业务数据下标 + protected Integer calculatePosition(List fieldConfigList) { + String rex = "[0-9]+"; + Integer max = -1; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) + && Integer.valueOf(fieldConfig.getOriginPositionByte()) > max) { + max = Integer.valueOf(fieldConfig.getOriginPositionByte()); + } + } + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) && fieldConfig.getOriginPositionByte().equals(max)) { + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + } + } + Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; + return maxFixedPosition; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java deleted file mode 100644 index dd3a6cd..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java +++ /dev/null @@ -1,170 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.ByteResolverParam; -import io.netty.buffer.ByteBuf; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -/** - * 字段解析管理总类 - */ -@Service -@Slf4j -@AllArgsConstructor -public class FieldResolver extends ByteMergeProvider { - - //1、字段截取 => 2、简单的字节解析和复杂的字节解析 - public Object filedParserManger(ByteBuf byteBuf, FieldConfig fieldConfig, Integer maxFixedPosition) { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - //最大固定位置不为空, - if (!ObjectUtil.isEmpty(maxFixedPosition)) { - orignPosition -= maxFixedPosition; - } - Object fieldValue = 0; - //待优化 - if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { - fieldValue = bitToResolver(byteBuf, fieldConfig); - } else { - ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); - fieldValue = parsingFields(fieldBytes, fieldConfig.getRuleJson()); - } - return fieldValue; - } - - //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, - //目前默认配置的规则设置暂不支持配置化,由实现完成 - private Object parsingFields(ByteBuf byteBuf, String ruleJson) { - Object fieldsResolveValue = null; - List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); - if (ObjectUtil.isEmpty(ruleMapList)) { - fieldsResolveValue = defaultResolveBuilder(byteBuf); - } else { - fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); - } - return fieldsResolveValue; - } - - private Object defaultResolveBuilder(ByteBuf byteBuf) { - Integer defaultResolveValue = 0; - for (int i = 0; i < byteBuf.writerIndex(); i++) { - defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; - } - return defaultResolveValue; - } - - //字段解析构建器(针对字节单位的) - //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 - // 字节归并结束或者规则结束=>继续根据规则进行判断 - private Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { - Object customizeResolveValue = null; - try { - List bytStrList = new ArrayList<>(); - //存放到数组里面 - for (int i = 0; i < byteBuf.writerIndex(); i++) { - bytStrList.add(byteBuf.readByte()); - } - int i = 0; - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - customizeResolveValue = this.resolveByteMerge(bytStrList, ruletypeId,vaildRange); - break; - } else { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - List tempBytStr = new ArrayList<>(); - for (int k = 0; i < bytStrList.size(); i++) { - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(k) - .value(bytStrList.get(k)) - .ruletypeId(ruletypeId).build(); - tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); - } - bytStrList = tempBytStr; - } - i++; - } - //字节归并到一起=>继续根据规则进行判断 - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(customizeResolveValue) - .ruletypeId(ruletypeId).build(); - customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(customizeResolveValue)); - return customizeResolveValue; - } catch (RuntimeException ex) { - log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); - return null; - } - } - - /** - * 1、单个字节情况表示字段 - * 2、多字节情况表示字段(暂未处理) - */ - private Object bitToResolver(ByteBuf byteBuf, FieldConfig fieldConfig) { - Object fieldValue = new Object(); - try { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - byte fields = 0x00; - if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); - } else { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); - } - - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { - if (!StringUtils.isEmpty(fieldConfig.getExactOrignPosition())) { - fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getExactOrignPosition())).byteValue() - >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); - } else { - fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); - } - } else { - fieldValue = Integer.valueOf(fields & 0xff); - } - if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { - return fieldValue; - } - List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); - int i = 0; - //字节归并到一起=>继续根据规则进行判断 - while (i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(fieldValue) - .ruletypeId(ruletypeId).build(); - fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(fieldValue)); - return fieldValue; - } catch (RuntimeException ex) { - log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); - return null; - } - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java new file mode 100644 index 0000000..1d2aeab --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java @@ -0,0 +1,36 @@ +package com.casic.missiles.parser.resolver.bytes; + +import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.mapper.FieldRuleConfigMapper; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.pojo.ByteResolverParam; +import com.googlecode.aviator.AviatorEvaluator; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; +//转换规则 +@Component("convert") +@AllArgsConstructor +@Slf4j +public class ByteRuleResolver implements ByteResolver { + + private final FieldRuleConfigMapper fieldRuleConfigMapper; + + @Override + public Object resolveOperationRule(ByteResolverParam byteResolverParam){ + FieldRuleConfig fieldRuleEngine=fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); + if(ObjectUtil.isEmpty(fieldRuleEngine)){ + return byteResolverParam.getValue(); + } + String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); + Map env2 = new HashMap(); + env2.put("value", (byte) byteResolverParam.getValue()); + String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); + return values; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java index 103821c..786b71c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java @@ -2,34 +2,34 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("logicalShift") +@Component("logicalShift") @AllArgsConstructor @Slf4j public class LogicalShiftResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //字节位移 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { Integer index = byteResolverParam.getIndex(); - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return byteResolverParam.getValue(); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java index 476747d..01149bd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("operation") +@Component("operation") @AllArgsConstructor @Slf4j public class OperationResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //混合运算,有常量或者乘除的缩放 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java index 0b82cf4..79abcce 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.casic.missiles.pojo.ByteResolverParam; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; //精度计算 -@Service("precision") +@Component("precision") @AllArgsConstructor @Slf4j public class PrecisionResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java deleted file mode 100644 index 5c3f332..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; -//转换规则 -@Service("convert") -@AllArgsConstructor -@Slf4j -public class RuleResolver implements ByteResolver { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam){ - RuleEvaluator fieldRuleEngine=fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); - if(ObjectUtil.isEmpty(fieldRuleEngine)){ - return byteResolverParam.getValue(); - } - String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); - Map env2 = new HashMap(); - env2.put("value", (byte) byteResolverParam.getValue()); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java new file mode 100644 index 0000000..d3bbd91 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java @@ -0,0 +1,15 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; + +import java.util.List; +import java.util.Map; +// 前导码匹配->长度字段 +public interface AbstractCombinedFieldProcessor { + + Map invoke(Map map, ByteBuf byteBuf, List combinedFieldConfigList, + Map fieldConfigsMap, Map storeObjectMap); + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java new file mode 100644 index 0000000..03c8480 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java @@ -0,0 +1,59 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-13 + */ +//依次递增进行数据的解析, +public class GenericCombinedFieldResolver { + + + //通过查询,字段长度长度随机 + public void parseDataField(List combinedFieldConfigList, ByteBuf byteBuf, + Map storeObjectMap, Map fieldConfigsMap) { + Integer frameLength = Integer.valueOf(ByteBufUtil.hexDump(byteBuf)); + //添加前置处理器 + com.casic.missiles.util.ClassUtil classUtil = new com.casic.missiles.util.ClassUtil(); + List abstractCombinedProcessors = classUtil.getSubClassList(AbstractCombinedFieldProcessor.class); + + Map fieldFixedMap = combinedFieldLeadCodeMap(combinedFieldConfigList); + //frameLength + Map combinedProcessorFields = null; + while (byteBuf.readableBytes() < frameLength) { + //一直处理 + for (AbstractCombinedFieldProcessor abstractCombinedProcessor : abstractCombinedProcessors) { + combinedProcessorFields = abstractCombinedProcessor.invoke(combinedProcessorFields, byteBuf, + combinedFieldConfigList, + fieldConfigsMap, storeObjectMap); + if (combinedProcessorFields == null || byteBuf.readableBytes() < frameLength) { + return; + } + } + + } + } + + /** + * 取出前导码匹配集合 + */ + private Map combinedFieldLeadCodeMap(List combinedFieldConfigList) { + Map fieldFixedMap = combinedFieldConfigList + .stream() + .collect(Collectors.toMap(CombinedFieldConfig::getPrefixCode, e -> e)); + return fieldFixedMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java new file mode 100644 index 0000000..643a934 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java @@ -0,0 +1,100 @@ +package com.casic.missiles.parser.resolver.fields; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.FieldParserSupport; +import com.casic.missiles.pojo.*; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 保存使用时最基本的信息,并且使用原型模式 + */ +@Slf4j +public class DefaultProtocolFieldParser extends FieldParserSupport implements FieldParser, FixedPropertyEnum { + + //通过传入的配置和报文进行字段解析 + @Override + public Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap) { + Map dataMap = new HashMap<>(); + for (AbstractFieldConfig protocolFieldConfig : protocolFieldConfigs) { + if (!ObjectUtils.isEmpty(protocolFieldConfig.getOriginPositionByte())) { + Object fieldValue = FieldResolver.parseField(buffer, protocolFieldConfig, null); + if (protocolFieldConfig.getIsStorage() == 1) { + storeObjectMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + dataMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + } + return dataMap; + } + + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength) { + Map fixedPropertyMap = new HashMap<>(); + Integer fixedLength = calculateLength(protocolFieldConfigs); + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + fixedPropertyMap.put(FIXED_POSITION, maxFixedPosition); + fixedPropertyMap.put(TOTAL_LENGTH, totalLength); + fixedPropertyMap.put(TAIL_POSITION, totalLength - fixedLength + maxFixedPosition); + return fixedPropertyMap; + } + + //** 获取业务内容的byteBuf + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer) { + //计算固定长度 + Integer fixedLength = calculateLength(protocolFieldConfigs); + //总长度获取 + String lightText = buffer.toString(Charset.forName("ISO-8859-1")); + Integer totalLength = lightText.length(); + //计算固定长度最大长度 + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + //计算数据报文内容 + ByteBuf bizDataFields = buffer.slice(maxFixedPosition - 1, (totalLength - fixedLength)); + return bizDataFields; + } + + /** + * 获取过滤字段的长度 + */ + @Override + public Integer getTotalFilterLength(ProtocolConfig protocolConfig, + ByteBuf byteBuf, + Map protocolFieldConfigMap) { + if (ByteBufUtil.hexDump(byteBuf).equals("")) { + return 0; + } + int totalFilterLength = 0; + String filterFields = protocolConfig.getTotalLengthFilterFields(); + try { + if (!StringUtils.isEmpty(filterFields)) { + String[] filterFieldList = filterFields.split(","); + for (String filterFieldId : filterFieldList) { + if (StringUtils.isNotEmpty(filterFieldId)) { + ProtocolFieldConfig fieldConfig = protocolFieldConfigMap.get(Long.valueOf(filterFieldId)); + //这里都是按字节计算,没有对位进行区分,可能会出现错误 + // 如果对位有需求,需要进一步跟进 + totalFilterLength += fieldConfig.getOffsetLength(); + } + } + } + return totalFilterLength; + } catch (Exception ex) { + log.error("报文确认分发阶段,获取报文总长度过滤长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); + } + return totalFilterLength; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java new file mode 100644 index 0000000..d51e887 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java @@ -0,0 +1,169 @@ +package com.casic.missiles.parser.resolver.fields; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.parser.resolver.ByteMergeProvider; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.AbstractFieldConfig; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.pojo.ByteResolverParam; +import io.netty.buffer.ByteBuf; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * 字段解析管理总类 + */ +@Slf4j +public class FieldResolver extends ByteMergeProvider { + + //1、字段截取 => 2、简单的字节解析和复杂的字节解析 + public static Object parseField(ByteBuf byteBuf,AbstractFieldConfig fieldConfig, Integer maxFixedPosition) { + Integer orignPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + //最大固定位置不为空, + if (!ObjectUtil.isEmpty(maxFixedPosition)) { + orignPosition -= maxFixedPosition; + } + Object fieldValue = 0; + //待优化 + if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { + fieldValue = doParseBitField(byteBuf, fieldConfig); + } else { + ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); + fieldValue = doParseByteField(fieldBytes, fieldConfig.getRuleJson()); + } + return fieldValue; + } + + //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, + //目前默认配置的规则设置暂不支持配置化,由实现完成 + private static Object doParseByteField(ByteBuf byteBuf, String ruleJson) { + Object fieldsResolveValue = null; + List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); + if (ObjectUtil.isEmpty(ruleMapList)) { + fieldsResolveValue = defaultResolveBuilder(byteBuf); + } else { + fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); + } + return fieldsResolveValue; + } + + private static Object defaultResolveBuilder(ByteBuf byteBuf) { + Integer defaultResolveValue = 0; + for (int i = 0; i < byteBuf.writerIndex(); i++) { + defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; + } + return defaultResolveValue; + } + + //字段解析构建器(针对字节单位的) + //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 + // 字节归并结束或者规则结束=>继续根据规则进行判断 + private static Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { + Object customizeResolveValue = null; + try { + List bytStrList = new ArrayList<>(); + //存放到数组里面 + for (int i = 0; i < byteBuf.writerIndex(); i++) { + bytStrList.add(byteBuf.readByte()); + } + int i = 0; + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { + if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + customizeResolveValue = resolveByteMerge(bytStrList, ruletypeId, vaildRange); + break; + } else { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + List tempBytStr = new ArrayList<>(); + for (int k = 0; i < bytStrList.size(); i++) { + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(k) + .value(bytStrList.get(k)) + .ruletypeId(ruletypeId).build(); + tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); + } + bytStrList = tempBytStr; + } + i++; + } + //字节归并到一起=>继续根据规则进行判断 + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(null) + .value(customizeResolveValue) + .ruletypeId(ruletypeId).build(); + customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); + i++; + } + System.out.println(JSON.toJSON(customizeResolveValue)); + return customizeResolveValue; + } catch (RuntimeException ex) { + log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); + return null; + } + } + + /** + * 1、单个字节情况表示字段 + * 2、多字节情况表示字段(暂未处理) + */ + private static Object doParseBitField(ByteBuf byteBuf,AbstractFieldConfig fieldConfig) { + Object fieldValue = new Object(); + try { + Integer orignPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + byte fields = 0x00; + if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { + fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); + } else { + fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); + } + + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { + if (!StringUtils.isEmpty(fieldConfig.getOriginPositionBit())) { + fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getOriginPositionBit())).byteValue() + >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); + } else { + fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); + } + } else { + fieldValue = Integer.valueOf(fields & 0xff); + } + if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { + return fieldValue; + } + List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); + int i = 0; + //字节归并到一起=>继续根据规则进行判断 + while (i < ruleMapList.size()) { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(null) + .value(fieldValue) + .ruletypeId(ruletypeId).build(); + fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); + i++; + } + System.out.println(JSON.toJSON(fieldValue)); + return fieldValue; + } catch (RuntimeException ex) { + log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); + return null; + } + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java deleted file mode 100644 index 35ae3d0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java +++ /dev/null @@ -1,183 +0,0 @@ -package com.casic.missiles.parser.resolver.fields; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufAllocator; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; -import org.springframework.util.ObjectUtils; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service("standard") -@AllArgsConstructor -@Slf4j -public class StandardFieldParser implements FieldParser { - - private final FieldConfigDao fieldConfigDao; - private final FieldResolver fieldResolver; - - //数据解析 - @Override - public Map dataParser(RuleConfig ruleConfig, String lightText, String protocolId) { - String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); - ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); - bufferContent.writeBytes(lightText.getBytes(Charset.forName("ISO-8859-1"))); - Map dataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - for (String dataFieldId : dataFieldIds) { - FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(dataFieldId); - if (!ObjectUtils.isEmpty(fieldConfig)) { - dataMap.put(fieldConfig.getFieldName(), String.valueOf(fieldResolver.filedParserManger(bufferContent, fieldConfig, maxFixedPosition))); - } - } - return dataMap; - } - - //数据解析 - @Override - public Map fixDataParser(String protocolId, ByteBuf buffer) { - List dataFieldIdList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Map dataMap = new HashMap<>(); - for (FieldConfig dataField : dataFieldIdList) { - if (!ObjectUtils.isEmpty(dataField.getOrignPosition())) { - Object fieldValue = (Integer) fieldResolver.filedParserManger(buffer, dataField, null); - dataMap.put(dataField.getFieldName(), fieldValue); - } - } - return dataMap; - } - - @Override - public Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf) { - if (ByteBufUtil.hexDump(byteBuf).equals("")) { - return 0; - } - String filterFields = protocolConfig.getTotalLengthFilterField(); - Integer totalLength = 0; - try { - FieldConfig totalFieldConfig = fieldConfigDao.getFieldConfigById(protocolConfig.getTotalLengthId()); - int totalFilterLength = 0; - if (!StringUtils.isEmpty(filterFields)) { - String[] filterFieldList = filterFields.split(","); - for (String filterField : filterFieldList) { - FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(filterField); - //这里都是按字节计算,没有对位进行区分,可能会出现错误 - - // 如果对位有需求,需要进一步跟进 - totalFilterLength += fieldConfig.getOffsetLength(); - } - } - totalLength = (Integer) fieldResolver.filedParserManger(byteBuf, totalFieldConfig, null) + totalFilterLength; - } catch (Exception ex) { - log.error("报文确认分发阶段,获取报文总长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); - } - return totalLength; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer) { - //业务内容 - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - String protocolId = String.valueOf(protocolConfig.getId()); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - //计算固定长度 - Integer fixedLength = calculateLength(fieldConfigList); -// Integer totalLength = this.getTotalLength(protocolConfig, buffer); - //总长度获取 - Integer totalLength = lightText.length(); - //计算固定长度最大长度 - Integer maxFixedPosition = calculatePosition(fieldConfigList); -// buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - //计算数据报文内容 - ByteBuf bizDataFields = buffer.slice(maxFixedPosition-1, (totalLength - fixedLength)); - return bizDataFields; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer) { - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - String protocolId = String.valueOf(protocolConfig.getId()); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer fixedLength = calculateLength(fieldConfigList); -// Integer totalLength = this.getTotalLength(protocolConfig, buffer); - Integer totalLength = lightText.length(); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - ByteBuf fixDataFields = buffer.slice(0, maxFixedPosition); - return fixDataFields; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer) { - String protocolId = String.valueOf(protocolConfig.getId()); - Map fixedPropertyMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer fixedLength = calculateLength(fieldConfigList); - Integer totalLength = this.getTotalLength(protocolConfig, buffer); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - fixedPropertyMap.put("fixedPosition", maxFixedPosition); - fixedPropertyMap.put("totalLength", totalLength); - fixedPropertyMap.put("tailPosition", totalLength - fixedLength + maxFixedPosition); - return fixedPropertyMap; - } - - //分别计算bit和byte长度=> 合并长度 - private Integer calculateLength(List fieldConfigList) { - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (FieldConfig fieldConfig : fieldConfigList) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - Integer fixedLength = bytefixedLength + bitfixedLength / 8; - return fixedLength; - } - - //找到最大值=> 根据最大值计算业务数据下标 - private Integer calculatePosition(List fieldConfigList) { - String rex = "[0-9]+"; - Integer max = -1; - for (FieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOrignPosition()) - && Integer.valueOf(fieldConfig.getOrignPosition()) > max) { - max = Integer.valueOf(fieldConfig.getOrignPosition()); - } - } - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (FieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOrignPosition()) && fieldConfig.getOrignPosition().equals(max)) { - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - } - } - Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; - return maxFixedPosition; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java new file mode 100644 index 0000000..d4ec6c7 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java @@ -0,0 +1,76 @@ +package com.casic.missiles.parser.rule; + +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import org.apache.commons.lang3.StringUtils; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class GenericRuleResolver { + + //根据前置字段的值,找到指定的规则 + //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 + //=>循环判断=>通过规则得到业务字段 + public static RuleConfig machRule(Map fixDataMap, + String ids, + List protocolFieldConfigs, + List ruleConfigs) { + List preRuleConfigList = getPreRuleList(ids, protocolFieldConfigs); + //获取前置规则字段 + final Map metaDataMap = getPreRuleFields(preRuleConfigList, fixDataMap); + //准备固定的字段集合 + Map fixDataFieldMap = getFixDataFieldMap(protocolFieldConfigs); + return RuleResolverCore.doMachRule(ruleConfigs, metaDataMap, fixDataMap, fixDataFieldMap); + } + + private static Map getFixDataFieldMap(List protocolFieldConfigs) { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, ProtocolFieldConfig::getFieldName) + ); + return fixDataFieldMap; + } + + + /** + * 查询前置规则的字段配置 + * + * @param ids + * @return + */ + private static List getPreRuleList(String ids, List protocolFieldConfigs) { + String[] idList = ids.split(","); + Map prepareMaps = new HashMap<>(); + for (String id : idList) { + if (StringUtils.isNotEmpty(id)) { + prepareMaps.put(Long.valueOf(id), ""); + } + } + List preRuleConfigList = protocolFieldConfigs + .stream() + .filter(e -> prepareMaps.containsKey(e.getId())) + .collect(Collectors.toList()); + return preRuleConfigList; + } + + /** + * 获取前置规则解析字段 + */ + private static Map getPreRuleFields(List preRuleFieldConfigList, Map fixDataMap) { + Map ruleFieldMap = new HashMap<>(); + preRuleFieldConfigList.stream() + .forEach( + preRuleFieldConfig -> { + String fieldName = preRuleFieldConfig.getFieldName(); + if (fixDataMap.containsKey(fieldName)) { + ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); + } + } + ); + return ruleFieldMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java new file mode 100644 index 0000000..baae7e8 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -0,0 +1,68 @@ +package com.casic.missiles.parser.rule; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.casic.missiles.pojo.RuleConfig; + +import java.util.*; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleResolverCore { + + + public static RuleConfig doMachRule(List ruleConfigList, Map metaDataMap, + Map fixDataMap, + Map fixDataFieldMap) { + Optional ruleConfigOptional = ruleConfigList.stream() + .filter(ruleConfig -> machRuleConfig( + JSON.parseObject(ruleConfig.getMatchRuleJson(), Map.class), metaDataMap)) + .findFirst(); + if (ObjectUtil.isEmpty(ruleConfigOptional)) { + return null; + } + String[] ruleFields = ruleConfigOptional.get().getDataFieldIds().split(","); + Map ruleMetaDataMap = getRuleFields(ruleFields, fixDataMap, fixDataFieldMap); + //递归选定解析规则,进行规则解析 + if (!ruleConfigOptional.get().getIsFinishMatch().equals("1")) { + //递归选定规则 + doMachRule(ruleConfigList, ruleMetaDataMap, fixDataMap, fixDataFieldMap); + } + return ruleConfigOptional.get(); + } + + + private static Map getRuleFields(String[] preRuleConfigList, Map fixedDataMap, + Map fixedFieldMap) { + Map ruleFieldMap = new HashMap<>(); + for (String preRuleConfigId : preRuleConfigList) { + String fieldName = fixedFieldMap.get(preRuleConfigId); + if (fixedDataMap.containsKey(fieldName)) { + ruleFieldMap.put(fieldName, String.valueOf(fixedDataMap.get(fieldName))); + } + } + return ruleFieldMap; + } + + + //匹配规则配置 + private static Boolean machRuleConfig(Map ruleMap, Map metaDataMap) { + if (ruleMap == null || metaDataMap == null) { + return null; + } + //所有的字段在规则里面必须有有配置 + for (String key : metaDataMap.keySet()) { + if (ruleMap.containsKey(key)) { + if (!ruleMap.get(key).equals(metaDataMap.get(key))) { + return false; + } + } else { + return false; + } + } + return true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java deleted file mode 100644 index 664088d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java +++ /dev/null @@ -1,92 +0,0 @@ -package com.casic.missiles.parser.rule; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.mapper.dao.PreRuleConfigDao; -import com.casic.missiles.mapper.dao.RuleConfigDao; -import lombok.AllArgsConstructor; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.*; -import java.util.stream.Collectors; - -@Service -@AllArgsConstructor -public class RulerProvider { - - private final FieldConfigDao fieldConfigDao; - private final PreRuleConfigDao preRuleConfigDao; - private final RuleConfigDao ruleConfigDao; - - //根据前置字段的值,找到指定的规则 - //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 - //=>循环判断=>通过规则得到业务字段 - public RuleConfig ruleConfig(Map fixDataMap, String protocolId) { - //批量获取规则 - List preRuleConfigList = preRuleConfigDao.getPreRuleList(protocolId); - //获取固定字段 - Map fixFieldMap = getAllFieldMap(protocolId); - //获取前置规则字段 - final String preRuleFields = getPreRuleFields(preRuleConfigList, fixDataMap, fixFieldMap); - List ruleConfigList = ruleConfigDao.getRuleConfigById(protocolId); - Optional ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig ->preRuleFields.equals( ruleConfig.getParseRuleJson())).findFirst(); - //递归选定解析规则,进行规则解析 - while (!ObjectUtil.isEmpty(ruleConfigOptional) && !ruleConfigOptional.get().getIsBizField().equals("1")) { - String ruleFields = getRuleFields(ruleConfigOptional.get().getDataFieldIds().split(","), fixDataMap, fixFieldMap); - ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig -> ruleConfig.getParseRuleJson().equals(ruleFields)).findFirst(); - } - return ruleConfigOptional.get(); - } - - /** - * 获取前置规则解析字段 - */ - private String getPreRuleFields(List preRuleConfigList, Map fixDataMap, Map fixFieldMap) { - Map ruleFieldMap= new HashMap<>(); - preRuleConfigList.stream() - .forEach( - preRuleConfig -> { - String fieldName = fixFieldMap.get(Long.valueOf(preRuleConfig.getRuleFieldId())); - if (fixDataMap.containsKey(fieldName)) { - ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); - } - } - ); - return JSONObject.toJSONString(ruleFieldMap); - } - - private Map getAllFieldMap(String protocolId) { - List fieldList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Map fixFieldMap = fieldList.stream().collect( - Collectors.toMap(FieldConfig::getId, FieldConfig::getFieldName) - ); - return fixFieldMap; - } - - private String getRuleFields(String[] preRuleConfigList, Map fixDataMap, Map fixFieldMap) { - Map ruleFieldMap= new HashMap<>(); - for (String preRuleConfigId : preRuleConfigList) { - String fieldName = fixFieldMap.get(preRuleConfigId); - if (fixDataMap.containsKey(fieldName)) { - ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); - } - } - return JSONObject.toJSONString(ruleFieldMap); - } - - //弃置 - private String ListToString(List ruleFieldList) { - String ruleFields = ""; - for (String ruleField : ruleFieldList) { - ruleFields += ruleField + ","; - } - ruleFields = StringUtils.isEmpty(ruleFields) ? ruleFields : ruleFields.substring(0, ruleFields.length() - 1); - return ruleFields; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java index 6177e10..bfa87a5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java @@ -2,7 +2,7 @@ public interface SafeStrategy { - String decryption(byte[] bytes); + String decryption(String cipher); String encryption(String lightText); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java index 618716c..6236302 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java @@ -9,9 +9,9 @@ //十六进制的字符串转换成字节数组 byte[] bytes = hexStrToBinaryStr(msg); //计算CRC8 - byte crc8 = CRC8(bytes, 0, bytes.length); - String crc8ToStr = "" + Integer.toHexString(0xff & crc8); - return crc8ToStr; +// String crc8ToStr = "" + Integer.toHexString(0xff & crc8); +// return crc8ToStr; + return null; } /** @@ -33,50 +33,5 @@ return bytes; } - /** - * CRC8 校验 多项式 x8+x2+x+1 - * - * @param b - * @param off - * @param len - * @return - */ - public static byte CRC8(final byte[] b, final int off, final int len) { - byte result = 0x00; - for (int i = 0; i < len; i++) { - result = CHECKSUM_TABLE[(result ^ (b[i + off] & 0xFF)) & 0xFF]; - } - return (byte) (result & 0xFFL); - } - - private final static byte[] CHECKSUM_TABLE = {(byte) 0x00, (byte) 0x07, (byte) 0x0e, (byte) 0x09, (byte) 0x1c, (byte) 0x1b, - (byte) 0x12, (byte) 0x15, (byte) 0x38, (byte) 0x3f, (byte) 0x36, (byte) 0x31, (byte) 0x24, (byte) 0x23, (byte) 0x2a, - (byte) 0x2d, (byte) 0x70, (byte) 0x77, (byte) 0x7e, (byte) 0x79, (byte) 0x6c, (byte) 0x6b, (byte) 0x62, (byte) 0x65, - (byte) 0x48, (byte) 0x4f, (byte) 0x46, (byte) 0x41, (byte) 0x54, (byte) 0x53, (byte) 0x5a, (byte) 0x5d, (byte) 0xe0, - (byte) 0xe7, (byte) 0xee, (byte) 0xe9, (byte) 0xfc, (byte) 0xfb, (byte) 0xf2, (byte) 0xf5, (byte) 0xd8, (byte) 0xdf, - (byte) 0xd6, (byte) 0xd1, (byte) 0xc4, (byte) 0xc3, (byte) 0xca, (byte) 0xcd, (byte) 0x90, (byte) 0x97, (byte) 0x9e, - (byte) 0x99, (byte) 0x8c, (byte) 0x8b, (byte) 0x82, (byte) 0x85, (byte) 0xa8, (byte) 0xaf, (byte) 0xa6, (byte) 0xa1, - (byte) 0xb4, (byte) 0xb3, (byte) 0xba, (byte) 0xbd, (byte) 0xc7, (byte) 0xc0, (byte) 0xc9, (byte) 0xce, (byte) 0xdb, - (byte) 0xdc, (byte) 0xd5, (byte) 0xd2, (byte) 0xff, (byte) 0xf8, (byte) 0xf1, (byte) 0xf6, (byte) 0xe3, (byte) 0xe4, - (byte) 0xed, (byte) 0xea, (byte) 0xb7, (byte) 0xb0, (byte) 0xb9, (byte) 0xbe, (byte) 0xab, (byte) 0xac, (byte) 0xa5, - (byte) 0xa2, (byte) 0x8f, (byte) 0x88, (byte) 0x81, (byte) 0x86, (byte) 0x93, (byte) 0x94, (byte) 0x9d, (byte) 0x9a, - (byte) 0x27, (byte) 0x20, (byte) 0x29, (byte) 0x2e, (byte) 0x3b, (byte) 0x3c, (byte) 0x35, (byte) 0x32, (byte) 0x1f, - (byte) 0x18, (byte) 0x11, (byte) 0x16, (byte) 0x03, (byte) 0x04, (byte) 0x0d, (byte) 0x0a, (byte) 0x57, (byte) 0x50, - (byte) 0x59, (byte) 0x5e, (byte) 0x4b, (byte) 0x4c, (byte) 0x45, (byte) 0x42, (byte) 0x6f, (byte) 0x68, (byte) 0x61, - (byte) 0x66, (byte) 0x73, (byte) 0x74, (byte) 0x7d, (byte) 0x7a, (byte) 0x89, (byte) 0x8e, (byte) 0x87, (byte) 0x80, - (byte) 0x95, (byte) 0x92, (byte) 0x9b, (byte) 0x9c, (byte) 0xb1, (byte) 0xb6, (byte) 0xbf, (byte) 0xb8, (byte) 0xad, - (byte) 0xaa, (byte) 0xa3, (byte) 0xa4, (byte) 0xf9, (byte) 0xfe, (byte) 0xf7, (byte) 0xf0, (byte) 0xe5, (byte) 0xe2, - (byte) 0xeb, (byte) 0xec, (byte) 0xc1, (byte) 0xc6, (byte) 0xcf, (byte) 0xc8, (byte) 0xdd, (byte) 0xda, (byte) 0xd3, - (byte) 0xd4, (byte) 0x69, (byte) 0x6e, (byte) 0x67, (byte) 0x60, (byte) 0x75, (byte) 0x72, (byte) 0x7b, (byte) 0x7c, - (byte) 0x51, (byte) 0x56, (byte) 0x5f, (byte) 0x58, (byte) 0x4d, (byte) 0x4a, (byte) 0x43, (byte) 0x44, (byte) 0x19, - (byte) 0x1e, (byte) 0x17, (byte) 0x10, (byte) 0x05, (byte) 0x02, (byte) 0x0b, (byte) 0x0c, (byte) 0x21, (byte) 0x26, - (byte) 0x2f, (byte) 0x28, (byte) 0x3d, (byte) 0x3a, (byte) 0x33, (byte) 0x34, (byte) 0x4e, (byte) 0x49, (byte) 0x40, - (byte) 0x47, (byte) 0x52, (byte) 0x55, (byte) 0x5c, (byte) 0x5b, (byte) 0x76, (byte) 0x71, (byte) 0x78, (byte) 0x7f, - (byte) 0x6a, (byte) 0x6d, (byte) 0x64, (byte) 0x63, (byte) 0x3e, (byte) 0x39, (byte) 0x30, (byte) 0x37, (byte) 0x22, - (byte) 0x25, (byte) 0x2c, (byte) 0x2b, (byte) 0x06, (byte) 0x01, (byte) 0x08, (byte) 0x0f, (byte) 0x1a, (byte) 0x1d, - (byte) 0x14, (byte) 0x13, (byte) 0xae, (byte) 0xa9, (byte) 0xa0, (byte) 0xa7, (byte) 0xb2, (byte) 0xb5, (byte) 0xbc, - (byte) 0xbb, (byte) 0x96, (byte) 0x91, (byte) 0x98, (byte) 0x9f, (byte) 0x8a, (byte) 0x8d, (byte) 0x84, (byte) 0x83, - (byte) 0xde, (byte) 0xd9, (byte) 0xd0, (byte) 0xd7, (byte) 0xc2, (byte) 0xc5, (byte) 0xcc, (byte) 0xcb, (byte) 0xe6, - (byte) 0xe1, (byte) 0xe8, (byte) 0xef, (byte) 0xfa, (byte) 0xfd, (byte) 0xf4, (byte) 0xf3}; } \ No newline at end of file diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java index 27c2838..6e078a3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java @@ -1,9 +1,6 @@ package com.casic.missiles.parser.safe.impl; -import cn.hutool.core.util.CharsetUtil; -import cn.hutool.crypto.symmetric.SM4; -import cn.hutool.crypto.symmetric.SymmetricCrypto; - +import com.casic.missiles.parser.safe.SafeStrategy; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; @@ -11,19 +8,44 @@ import org.bouncycastle.crypto.engines.SM4Engine; import org.bouncycastle.crypto.params.KeyParameter; import org.bouncycastle.util.encoders.Hex; - -import static cn.hutool.crypto.Mode.ECB; -import static cn.hutool.crypto.Padding.NoPadding; +import org.springframework.stereotype.Component; /** * SM4算法工具类 */ @Slf4j -public class Sm4 { +@Component("sm4") +public class Sm4 implements SafeStrategy { //加解密的字节快大小 public static final int BlockSize = 16; + @Override + public String decryption(String cipher) { + byte[] keyByte = { + 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 + }; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(keyByte); + byte[] in = Hex.decode(cipher); + byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); + String plain = EcbDecrypt(in, keyBytes); + return plain; + } + + @Override + public String encryption(String cipher) { + byte[] keyByte = { + 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 + }; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(keyByte); + byte[] in = Hex.decode(cipher); + byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); + String plain = EcbDecrypt(in, keyBytes); + return plain; + } + /** * SM4ECB加密算法,对内 * @@ -32,8 +54,6 @@ * @return */ private static byte[] ecb_encrypt(byte[] in, byte[] keyBytes) { - - SM4Engine sm4Engine = new SM4Engine(); sm4Engine.init(true, new KeyParameter(keyBytes)); byte[] out = new byte[in.length]; @@ -58,27 +78,6 @@ return cipher; } - - /** - * hutool 解密SM4 - * - * @param encodeContent - * @return - */ - public static String decode(String encodeContent) { - String key = "24ad182507479a5da3ad94d9d78ea203"; - try { - SymmetricCrypto sm4 = new SM4(ECB, NoPadding, key.getBytes()); - String decryptStr = sm4.decryptStr(encodeContent, CharsetUtil.CHARSET_UTF_8); - return decryptStr; - } catch (Exception e) { - e.printStackTrace(); - log.error("SM4解密失败"); - } - return null; - } - - /** * SM4的ECB加密算法 * @@ -129,20 +128,6 @@ return plain; } - /** - * SM4的ECB解密算法 - * - * @param cipher 输入的密文字符串 - * @param key 密钥 - * @return - */ - public static String EcbDecrypt(String cipher, String key) { - byte[] in = Hex.decode(cipher); - byte[] keyBytes = Hex.decode(key); - - String plain = EcbDecrypt(in, keyBytes); - return plain; - } /** * 主函数 @@ -151,28 +136,24 @@ */ public static void main(String[] args) { byte[] ciphertext = { + 0x4B, (byte) 0x8C, (byte) 0x9D, 0x08, (byte) 0xE4, (byte) 0xD3, 0x64, 0x42, (byte) 0xB9, (byte) 0xA5, (byte) 0xFE, (byte) 0xCD, (byte) 0x91, 0x1B, 0x38, (byte) 0xAC, (byte) 0xE9, 0x1C, (byte) 0xCD, 0x53, 0x02, (byte) 0xD7, 0x0C, (byte) 0x9B, (byte) 0x96, 0x30, 0x62, (byte) 0xE8, (byte) 0xFB, (byte) 0xEF, (byte) 0xB9, (byte) 0xFF, (byte) 0xDE, 0x19, (byte) 0x80, 0x35, 0x3E, (byte) 0x90, 0x4F, 0x2F, 0x12, 0x2B, 0x19, (byte) 0x8B, 0x6C, 0x7A, (byte) 0x85, (byte) 0xA1, (byte) 0xB1, (byte) 0x86, (byte) 0xA3, 0x7A, 0x46, 0x0C, 0x2F, (byte) 0x94, 0x4F, 0x7F, 0x2C, 0x56, 0x14, (byte) 0xF3, (byte) 0x89, (byte) 0xC3, - 0x3F, 0x20, (byte) 0xF9, (byte) 0x87, (byte) 0xA1, 0x60, (byte) 0xD9, (byte) 0xA8, (byte) 0xFD, (byte) 0xD7, (byte) 0x9B, 0x4B, 0x26, 0x06, 0x30, 0x44}; + 0x3F, 0x20, (byte) 0xF9, (byte) 0x87, (byte) 0xA1, 0x60, (byte) 0xD9, (byte) 0xA8, (byte) 0xFD, (byte) 0xD7, (byte) 0x9B, 0x4B, 0x26, 0x06, 0x30, 0x44 + }; ByteBuf in = ByteBufAllocator.DEFAULT.heapBuffer(); in.writeBytes(ciphertext); - byte[] keyByte = { 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 }; ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); - key.writeBytes(ciphertext); - String resCipherData = decode(ByteBufUtil.hexDump(in)); - ByteBuf out = ByteBufAllocator.DEFAULT.heapBuffer(); -// out.writeBytes(resCipherData); -// System.out.println(hexBytes); - System.out.println(resCipherData.toString()); -// String resPlainData = EcbDecrypt(resCipherData, key); -// System.out.println("原始明文:" + data); -// System.out.println("解密后明文:" + resPlainData); + key.writeBytes(keyByte); +// String resCipherData = EcbDecrypt(ByteBufUtil.hexDump(in), ByteBufUtil.hexDump(key)); +// System.out.println(resCipherData); } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java index 1395a51..ac5f957 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java @@ -1,7 +1,7 @@ package com.casic.missiles.parser.safe.impl; import io.netty.buffer.ByteBufUtil; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** *

@@ -14,9 +14,8 @@ * @author hyl * @version v1.0: Tea.java, v 0.1 2021/3/12 13:48 $ */ -@Service("tea") -///tea算法类 - +//tea算法类 +@Component("tea") public class Tea { public static byte[] MyTea_Encrypt(byte[] MyTeaContent, int ByteLen, byte[] MyTeakey) { @@ -99,7 +98,6 @@ // for(int i32Index = 0; i32Index < 8; i32Index++) { // System.out.print("0x" + Integer.toHexString(MyContent[i32Index]) + " "); // } - // System.out.println("密钥为:"); // for(int i32Index = 0; i32Index < 16; i32Index++) { // System.out.print("0x" + Integer.toHexString(MyKeys[i32Index]) + " "); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java index bdd0721..bd1516a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java @@ -3,7 +3,7 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.parser.sender.DataSubscribeProvider; import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponents; import org.springframework.web.util.UriComponentsBuilder; @@ -12,7 +12,7 @@ import java.util.Collections; import java.util.Map; -@Service("functionCallback") +@Component("functionCallback") public class FunctionCallback implements DataSubscribeProvider { @Resource diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java index 0b44fb9..7526de2 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.Map; -@Service("middleware") +@Component("middleware") public class MiddlewareSubscribe implements DataSubscribeProvider { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java index 5dcee3f..e2f1192 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.Map; -@Service("nosql") +@Component("nosql") public class NoSqlSubscribe implements DataSubscribeProvider { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java b/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java new file mode 100644 index 0000000..81a5324 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java @@ -0,0 +1,86 @@ +package com.casic.missiles.pojo; + +import lombok.Data; + +/** + * 协议 + */ +@Data +public class Msg { + + /** + * 前导码 + */ + private String preamble; + + /** + * 版本号 + */ + private String version; + + /** + * 内容长度 + */ + private int leng; + + /** + * 设备ID + */ + private String deviceId; + + /** + * 通讯方式 + */ + private Integer connType; + + /** + * 加密方式 + */ + private Integer encryType; + + /** + * 目标地址 + */ + private String destAddr; + + /** + * PDUType + */ + private String PDUType; + + /** + * 操作类型 + */ + private Integer operateType; + + /** + * 传输控制位 PDUType.bit7=0时,表示存在后续的访问;当PDUType.bit7=1时,表示无后续的访问。 + */ + private Integer transControlFlag; + + /** + * 设备类型 + */ + private Integer deviceType; + + /** + * 序号 + */ + private Integer seq; + + /** + * tagList + */ + private String tagList; + + /** + * OidList + */ + private String OidList; + + /** + * CRC + */ + private String CRC; + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java index 40a5265..97cc984 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java @@ -40,7 +40,7 @@ String httpContent = msg.toString(Charset.defaultCharset()); log.info(" String : " + msg.toString(Charset.defaultCharset())); String majorContent = httpContent.substring(httpContent.indexOf("{"), httpContent.lastIndexOf("}") + 1); - String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("serviceData")).get("Value")); + String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("RegistryData")).get("Value")); log.info("----------------------------------" + values); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); bufferContent.writeBytes(values.getBytes(Charset.forName("ISO-8859-1"))); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java index 1b132a7..e3ced4b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java @@ -35,7 +35,7 @@ String httpContent = msg.toString(Charset.defaultCharset()); log.info(" String : " + msg.toString(Charset.defaultCharset())); String majorContent = httpContent.substring(httpContent.indexOf("{"), httpContent.lastIndexOf("}") + 1); - String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("serviceData")).get("Value")); + String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("RegistryData")).get("Value")); log.info("----------------------------------" + values); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); bufferContent.writeBytes(values.getBytes(Charset.forName("ISO-8859-1"))); diff --git a/sensorhub-core/src/main/resources/application.properties b/sensorhub-core/src/main/resources/application.properties deleted file mode 100644 index 8b13789..0000000 --- a/sensorhub-core/src/main/resources/application.properties +++ /dev/null @@ -1 +0,0 @@ - diff --git a/sensorhub-core/src/main/resources/config/application-dev.yml b/sensorhub-core/src/main/resources/config/application-dev.yml index 4f897a8..dcc4c2d 100644 --- a/sensorhub-core/src/main/resources/config/application-dev.yml +++ b/sensorhub-core/src/main/resources/config/application-dev.yml @@ -4,9 +4,9 @@ spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true + url: jdbc:mysql://127.0.0.1:3306/sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true username: root - password: Casic203 + password: root session: store-type: redis redis: diff --git a/sensorhub-core/src/main/resources/config/application.yml b/sensorhub-core/src/main/resources/config/application.yml index ae89f9d..7965da1 100644 --- a/sensorhub-core/src/main/resources/config/application.yml +++ b/sensorhub-core/src/main/resources/config/application.yml @@ -30,6 +30,13 @@ port: 6379 password: ew5T4K3#203lwh config-prefix: 'Casic:' +#代码生成器配置 +code: + generate: + #作者 + author: cz + #待生成对象表名 + table-name: bussiness_field_config,combined_field_config sensorhub: config: port: 7091 diff --git a/sensorhub-support/pom.xml b/sensorhub-support/pom.xml index 9a71296..761601c 100644 --- a/sensorhub-support/pom.xml +++ b/sensorhub-support/pom.xml @@ -42,6 +42,12 @@ ${redis.version} + + com.baomidou + mybatis-plus-generator + ${mybatis-plus-generator.version} + + org.reflections diff --git a/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java b/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java new file mode 100644 index 0000000..515ca53 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java @@ -0,0 +1,14 @@ +package com.casic.missiles.enums; + +/** + * @author + * @date + */ +public interface FixedPropertyEnum { + + String FIXED_POSITION = "fixedPosition"; + + String TOTAL_LENGTH = "totalLength"; + + String TAIL_POSITION = "tailPosition"; +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/CombinedFieldMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CombinedFieldMapper.java new file mode 100644 index 0000000..38e8f42 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CombinedFieldMapper.java @@ -0,0 +1,15 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.CombinedFieldConfig; +import org.apache.ibatis.annotations.Mapper; + +/** + * @author cz + * + */ +@Mapper +public interface CombinedFieldMapper extends BaseMapper { + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java new file mode 100644 index 0000000..128b09d --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java @@ -0,0 +1,10 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.CommandEventConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface CommandEventMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java new file mode 100644 index 0000000..042eb3c --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.DatagramEventConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface DatagramEventConfigMapper extends BaseMapper { +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java new file mode 100644 index 0000000..fc95cf4 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java @@ -0,0 +1,8 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.FieldConfig; + +public interface FieldConfigMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldRuleConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldRuleConfigMapper.java new file mode 100644 index 0000000..b310a08 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldRuleConfigMapper.java @@ -0,0 +1,10 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.FieldRuleConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface FieldRuleConfigMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java new file mode 100644 index 0000000..9060a69 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.ProtocolConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface ProtocolConfigMapper extends BaseMapper { +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolFieldConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolFieldConfigMapper.java new file mode 100644 index 0000000..1b47180 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolFieldConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +public interface ProtocolFieldConfigMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java new file mode 100644 index 0000000..6fa6936 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.RuleConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface RuleConfigMapper extends BaseMapper { +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/AbstractFieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/AbstractFieldConfig.java new file mode 100644 index 0000000..ba9aea2 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/AbstractFieldConfig.java @@ -0,0 +1,38 @@ +package com.casic.missiles.pojo; + +import lombok.Data; + +@Data +public class AbstractFieldConfig { + /** + * 字段名称 + */ + private String fieldName; + /** + * 按照字段评估进行字段解析 + */ + private String ruleJson; + /** + * 起始位置(单位byte) + */ + private Integer OriginPositionByte; + /** + * 起始位置,是否需要bit位置(单位bit)小于8, 没有不需要填写 + */ + private String OriginPositionBit; + /** + * 偏移长度 + */ + private Integer offsetLength; + /** + * 偏移单位(bit/byte) + */ + private String offsetUnit; + /** + * 是否需要转存 + */ + private Integer isStorage; + + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/CombinedFieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/CombinedFieldConfig.java new file mode 100644 index 0000000..4f4de6a --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/CombinedFieldConfig.java @@ -0,0 +1,41 @@ +package com.casic.missiles.pojo; + +import lombok.Data; + +import java.util.Date; + +/** + * 组合配置 + * + * @author cz + * @date 20 + */ +@Data +public class CombinedFieldConfig { + + private Long id; + private Long ruleId; + /** + * 前缀编码 + */ + private String prefixCode; + + /** + * 字段动态的id + */ + private Long dynamicLengthId; + /** + * 对应的要解析字段的ids + */ + private String dataFieldIds; + + /** + * 字段动态的id + */ + private String combinedFieldIds; + + private Date lastTime; + + private Date createTime; + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldConfig.java index a07d20d..8304dc6 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldConfig.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldConfig.java @@ -5,31 +5,28 @@ import java.util.Date; +/** + * @author cz + * 1、该表与实际解析的内容实例解析有关 + * 2、该表字段是随机出现的,和帧结构无关,无法预料的 + * 3、该表字段解析根据FieldEvaluatorConfig进行字段解析 + */ @Data -@TableName("field_config") -public class FieldConfig { +@TableName("business_field_config") +public class FieldConfig extends AbstractFieldConfig { private Long id; -// private String preFieldConfig; - private Long protocolId; - - private String isFixed; - private String uploadDeliveryChange; - - private String replyRule; - private String ruleJson; - + /** + * 协议配置id + */ + private Long ruleId; + /** + * 字段名称 + */ private String fieldName; - private String isStorage; - private Integer orignPosition; - private String exactOrignPosition; - - private Integer offsetLength; - private String offsetUnit; private String ownerId; private Date createTime; private Date lastTime; - } diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldRuleConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldRuleConfig.java new file mode 100644 index 0000000..2e09879 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldRuleConfig.java @@ -0,0 +1,20 @@ +package com.casic.missiles.pojo; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +@TableName("field_rule_config") +@Data +public class FieldRuleConfig { + + private Long id; + private String name; + private String desc; + private String condition; + private String excuteOperation; + private Date lasTime; + private Date createTime; + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/Msg.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/Msg.java deleted file mode 100644 index 81a5324..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/Msg.java +++ /dev/null @@ -1,86 +0,0 @@ -package com.casic.missiles.pojo; - -import lombok.Data; - -/** - * 协议 - */ -@Data -public class Msg { - - /** - * 前导码 - */ - private String preamble; - - /** - * 版本号 - */ - private String version; - - /** - * 内容长度 - */ - private int leng; - - /** - * 设备ID - */ - private String deviceId; - - /** - * 通讯方式 - */ - private Integer connType; - - /** - * 加密方式 - */ - private Integer encryType; - - /** - * 目标地址 - */ - private String destAddr; - - /** - * PDUType - */ - private String PDUType; - - /** - * 操作类型 - */ - private Integer operateType; - - /** - * 传输控制位 PDUType.bit7=0时,表示存在后续的访问;当PDUType.bit7=1时,表示无后续的访问。 - */ - private Integer transControlFlag; - - /** - * 设备类型 - */ - private Integer deviceType; - - /** - * 序号 - */ - private Integer seq; - - /** - * tagList - */ - private String tagList; - - /** - * OidList - */ - private String OidList; - - /** - * CRC - */ - private String CRC; - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/PreRuleConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/PreRuleConfig.java deleted file mode 100644 index bfcf914..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/PreRuleConfig.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.casic.missiles.pojo; - -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -import java.util.Date; - -@Data -@TableName("pre_rule_config") -public class PreRuleConfig { - - private Long id; - private String protocolId; - private String ruleFieldId; - private String ownerId; - private Date createTime; - private Date lastTime; -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolConfig.java index 274ad42..bdac11f 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolConfig.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolConfig.java @@ -5,18 +5,52 @@ import java.util.Date; +/** + * 协议配置表,协议配置与帧结构有关 + * 1、层级关系,协议之后是规则,规则对应设备类型的各种上数规则 + * 2、规则对应协议配置的实例流程 + * 3、每种可根据设备类型和操作类型进行上数规则进行区分 + */ @Data @TableName("protocol_config") public class ProtocolConfig { private Long id; + /** + * 前导码 + */ private String preFix; - private String unpackId; - private String totalLengthId; - private String totalLengthFilterField; + /** + * 拆包id + */ + private Long unpackId; + /** + * 总长度id + */ + private Long totalLengthId; + /** + * + */ + private String totalLengthFilterFields; + /** + * 动态长度ids + */ private String dynamicLengthId; + /** + * 动态长度json(预留字段) + */ private String dynamicLengthJson; - private String tailStr; + /** + * 规则字段所解析预准备的字段 + */ + private String rulePrepareFields; + /** + * 结尾标志 + */ + private Long tailStr; + /** + * 备注 + */ private String remark; private String ownerId; private Date createTime; diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolFieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolFieldConfig.java new file mode 100644 index 0000000..db794bd --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolFieldConfig.java @@ -0,0 +1,43 @@ +package com.casic.missiles.pojo; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +/** + * 协议字段配置表 + * 该表用户存放帧结构固定格式的字段 + * 有以下两个用途 + * (1)、固定格式的字段可用于规则匹配 + * (2)、固定格式的字段可用于报文回复 + * @author cz + * @date 2023-06-09 + */ +@Data +@TableName("protocol_field_config") +public class ProtocolFieldConfig extends AbstractFieldConfig{ + + private Long id; + /** + * 协议配置id + */ + private Long protocolId; + /** + * 上传下发是否有变化, 没有变化,可以直接组装 + */ + private String isReplyFix; + /** + * 按照字段评估进行字段解析 + */ + private Long fieldEvaluatorId; + /** + * 回复规则 + */ + private String replyRule; + + private String ownerId; + private Date createTime; + private Date lastTime; + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java index 3b53493..febf835 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java @@ -6,18 +6,40 @@ import java.util.Date; /** - * 加密字段解析和规则有关,事件调到该流程下面 + * @author cz + * todo: 匹配协议对应业务实例 + * 1、一个协议可以多种的流程规则 + * 2、规则可以支持递归规则流程 */ @Data @TableName("rule_config") public class RuleConfig { - private Long id; private String protocolId; - private String isBizField; - private String parseRuleJson; + /** + * 是否完成规则配置,没有完成, + * 则需要根据规则继续匹配 + */ + private String isFinishMatch; + /** + * 待匹配解析规则 + * {“data_field”:"data_value"} + */ + private String matchRuleJson; + /** + * 待解析字段ids + */ private String dataFieldIds; - private String aviatorFilterJson; + + /** + * 待解析组合字段ids + */ + private String combinedFieldIds; + + /** + * aviator + */ + private String conditionExpression; private Date createTime; private Date lastTime; } diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleDict.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleDict.java deleted file mode 100644 index cc7f389..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleDict.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.casic.missiles.pojo; - -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -@Data -@TableName("rule_dict") -public class RuleDict { - - private Long id; - private Long pid; - private String name; - private String code; - private String ownerId; - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleEvaluator.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleEvaluator.java deleted file mode 100644 index ed16610..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleEvaluator.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.pojo; - -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -import java.util.Date; - -@TableName("rule_evaluator") -@Data -public class RuleEvaluator { - - private Long id; - private String name; - private String desc; - private String condition; - private String excuteOperation; - private Date lasTime; - private Date createTime; - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/CombinedFieldConfigRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/CombinedFieldConfigRegistry.java new file mode 100644 index 0000000..fa59b90 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/CombinedFieldConfigRegistry.java @@ -0,0 +1,12 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.CombinedFieldConfig; + +import java.util.List; + +public interface CombinedFieldConfigRegistry { + + List getCombinedFieldConfigList(Long ruleId); + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/CommandEventRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/CommandEventRegistry.java new file mode 100644 index 0000000..fb97d87 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/CommandEventRegistry.java @@ -0,0 +1,8 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.CommandEventConfig; + +public interface CommandEventRegistry { + + CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName); +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/DatagramEventRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/DatagramEventRegistry.java new file mode 100644 index 0000000..fb34641 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/DatagramEventRegistry.java @@ -0,0 +1,11 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.DatagramEventConfig; + +import java.util.List; + +public interface DatagramEventRegistry{ + + List getDatagramEventList(Long ruleId); + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/FieldConfigRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/FieldConfigRegistry.java new file mode 100644 index 0000000..759642e --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/FieldConfigRegistry.java @@ -0,0 +1,20 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.FieldConfig; + +import java.util.List; + +public interface FieldConfigRegistry { + + + List getFieldConfigList(Long ruleId); + + FieldConfig getFieldConfigById(String fieldId); + + List getFieldConfigs(String protocolId, Integer isFixed); + + List getStorageFieldConfig(String protocolId); + + +} + diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/FieldRuleConfigRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/FieldRuleConfigRegistry.java new file mode 100644 index 0000000..33da70c --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/FieldRuleConfigRegistry.java @@ -0,0 +1,11 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.FieldRuleConfig; + +import java.util.List; + +public interface FieldRuleConfigRegistry { + + List getFieldRuleConfigList(Long ruleId); + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/ProtocolConfigRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/ProtocolConfigRegistry.java new file mode 100644 index 0000000..1725189 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/ProtocolConfigRegistry.java @@ -0,0 +1,12 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.ProtocolConfig; + +import java.util.List; + +public interface ProtocolConfigRegistry { + + List getProtocolConfigList(String firstChar); + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/ProtocolFieldConfigRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/ProtocolFieldConfigRegistry.java new file mode 100644 index 0000000..19d1b9a --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/ProtocolFieldConfigRegistry.java @@ -0,0 +1,14 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.ProtocolFieldConfig; + +import java.util.List; + +public interface ProtocolFieldConfigRegistry { + + + List getProtocolFieldConfigList(Long protocolId); + + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/RuleConfigRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/RuleConfigRegistry.java new file mode 100644 index 0000000..3d2a75c --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/RuleConfigRegistry.java @@ -0,0 +1,14 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.RuleConfig; + +import java.util.List; + +public interface RuleConfigRegistry { + + RuleConfig getNextRuleConfig(String ruleFields); + + + List getRuleConfigById(Long protocolId); + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CombinedFieldConfigRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CombinedFieldConfigRegistryImpl.java new file mode 100644 index 0000000..822cac6 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CombinedFieldConfigRegistryImpl.java @@ -0,0 +1,24 @@ +package com.casic.missiles.registry.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.CombinedFieldMapper; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.registry.CombinedFieldConfigRegistry; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class CombinedFieldConfigRegistryImpl extends ServiceImpl implements CombinedFieldConfigRegistry { + + @Override + public List getCombinedFieldConfigList(Long ruleId) { + QueryWrapper queryWrapper = new QueryWrapper() + .eq("rule_id", ruleId); + List combinedFieldConfigs = this.baseMapper.selectList(queryWrapper); + return combinedFieldConfigs; + } + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CommandEventRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CommandEventRegistryImpl.java new file mode 100644 index 0000000..f0d3559 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CommandEventRegistryImpl.java @@ -0,0 +1,25 @@ +package com.casic.missiles.registry.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.CommandEventMapper; +import com.casic.missiles.pojo.CommandEventConfig; +import com.casic.missiles.registry.CommandEventRegistry; + +import java.util.List; +import java.util.Optional; + +public class CommandEventRegistryImpl extends ServiceImpl implements CommandEventRegistry { + + @Override + public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { + QueryWrapper queryWrapper = new QueryWrapper() + .eq("protocol_id", protocolId) + .eq("scene", sceneName) + .eq("enabled", 1); + List commandEventConfig = this.baseMapper.selectList(queryWrapper); + Optional optionalEventConfig = commandEventConfig.stream().findFirst(); + return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; + } + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/DatagramEventRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/DatagramEventRegistryImpl.java new file mode 100644 index 0000000..2e58698 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/DatagramEventRegistryImpl.java @@ -0,0 +1,26 @@ +package com.casic.missiles.registry.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.DatagramEventConfigMapper; +import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.registry.DatagramEventRegistry; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class DatagramEventRegistryImpl extends ServiceImpl implements DatagramEventRegistry { + + + @Override + public List getDatagramEventList(Long ruleId) { + QueryWrapper queryWrapper = new QueryWrapper() + .eq("rule_id", ruleId); + List fieldConfigList = this.baseMapper.selectList(queryWrapper); + return fieldConfigList; + } + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/FieldConfigRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/FieldConfigRegistryImpl.java new file mode 100644 index 0000000..6ae4422 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/FieldConfigRegistryImpl.java @@ -0,0 +1,50 @@ +package com.casic.missiles.registry.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.FieldConfigMapper; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.registry.FieldConfigRegistry; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * @author cz + */ +@Service +public class FieldConfigRegistryImpl extends ServiceImpl implements FieldConfigRegistry { + + @Override + public List getFieldConfigList(Long ruleId) { + QueryWrapper queryWrapper = new QueryWrapper() + .eq("rule_id", ruleId); + List fieldConfigList = this.baseMapper.selectList(queryWrapper); + return fieldConfigList; + } + + @Override + public FieldConfig getFieldConfigById(String fieldId) { + FieldConfig fieldConfig = this.baseMapper.selectById(fieldId); + return fieldConfig; + } + + @Override + public List getFieldConfigs(String protocolId, Integer isFixed) { + QueryWrapper queryWrapper = new QueryWrapper() + .eq("protocol_id", protocolId) + .eq("is_fixed", isFixed); + List fieldConfigList = this.baseMapper.selectList(queryWrapper); + return fieldConfigList; + } + + @Override + public List getStorageFieldConfig(String protocolId) { + QueryWrapper queryWrapper = new QueryWrapper() + .eq("protocol_id", protocolId) + .eq("is_fixed", 1) + .eq("is_storage", 1); + List fieldConfigList = this.baseMapper.selectList(queryWrapper); + return fieldConfigList; + } +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/FieldRuleConfigRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/FieldRuleConfigRegistryImpl.java new file mode 100644 index 0000000..406fe65 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/FieldRuleConfigRegistryImpl.java @@ -0,0 +1,23 @@ +package com.casic.missiles.registry.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.FieldRuleConfigMapper; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.registry.FieldRuleConfigRegistry; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class FieldRuleConfigRegistryImpl extends ServiceImpl implements FieldRuleConfigRegistry { + + @Override + public List getFieldRuleConfigList(Long ruleId) { + QueryWrapper queryWrapper = new QueryWrapper() + .eq("rule_id", ruleId); + List fieldRuleConfigList = this.baseMapper.selectList(queryWrapper); + return fieldRuleConfigList; + } + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/ProtocolConfigRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/ProtocolConfigRegistryImpl.java new file mode 100644 index 0000000..8a516e5 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/ProtocolConfigRegistryImpl.java @@ -0,0 +1,26 @@ +package com.casic.missiles.registry.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.ProtocolConfigMapper; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.registry.ProtocolConfigRegistry; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class ProtocolConfigRegistryImpl extends ServiceImpl implements ProtocolConfigRegistry { + + /** + * 无条件全查询,作为一次加载的初始化查询 + * + * @return + */ + @Override + public List getProtocolConfigList(String firstChar) { + + return this.baseMapper.selectList(null); + } + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/ProtocolFieldConfigRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/ProtocolFieldConfigRegistryImpl.java new file mode 100644 index 0000000..f4c5a89 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/ProtocolFieldConfigRegistryImpl.java @@ -0,0 +1,26 @@ +package com.casic.missiles.registry.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.ProtocolFieldConfigMapper; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.registry.ProtocolFieldConfigRegistry; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; + +@Service +public class ProtocolFieldConfigRegistryImpl extends ServiceImpl implements ProtocolFieldConfigRegistry { + + @Override + public List getProtocolFieldConfigList(Long protocolId) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("protocol_id", protocolId); + List protocolFieldConfigs = this.baseMapper.selectList(queryWrapper); + return protocolFieldConfigs; + } + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/RuleConfigRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/RuleConfigRegistryImpl.java new file mode 100644 index 0000000..63865ed --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/RuleConfigRegistryImpl.java @@ -0,0 +1,31 @@ +package com.casic.missiles.registry.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.RuleConfigMapper; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.RuleConfigRegistry; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class RuleConfigRegistryImpl extends ServiceImpl implements RuleConfigRegistry { + + + @Override + public RuleConfig getNextRuleConfig(String ruleFields) { + QueryWrapper queryWrapper = new QueryWrapper() + .eq("parse_rule_json", ruleFields); + return this.baseMapper.selectOne(queryWrapper); + } + + @Override + public List getRuleConfigById(Long protocolId) { + QueryWrapper queryWrapper = new QueryWrapper() + .eq("protocol_id", protocolId); + return this.baseMapper.selectList(queryWrapper); + } + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/util/AutoCodeGenerator.java b/sensorhub-support/src/main/java/com/casic/missiles/util/AutoCodeGenerator.java new file mode 100644 index 0000000..d3079d1 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/util/AutoCodeGenerator.java @@ -0,0 +1,104 @@ +package com.casic.missiles.util; + +import com.baomidou.mybatisplus.generator.FastAutoGenerator; +import com.baomidou.mybatisplus.generator.config.DataSourceConfig; +import com.baomidou.mybatisplus.generator.config.rules.DateType; +import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy; +import org.springframework.core.env.Environment; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * @Description: mybatis-plus代码生成器 + * @Author: wangpeng + * @Date: 2022/8/11 17:52 + */ +@RestController +@RequestMapping("/code") +public class AutoCodeGenerator { + + private static String driverClassName; // 驱动名称 + private static String username; // 数据库用户名 + private static String password; // 数据库用户密码 + private static String url; // 数据库连接URL + private static String author; // 作者 + private static String tableName; // 待生成对象表名 + + /** + * 读取 application.properties 配置文件 + */ + private static void readProperty() { + Environment environment = SpringContextUtil.getApplicationContext().getEnvironment(); + driverClassName = environment.getProperty("spring.datasource.driver-class-name"); + username = environment.getProperty("spring.datasource.username"); + password = environment.getProperty("spring.datasource.password"); + url = environment.getProperty("spring.datasource.url"); + author = environment.getProperty("code.generate.author"); + tableName = environment.getProperty("code.generate.table-name"); + } + + /** + * MyBatis-Plus 代码生成器「新」 + * 适用版本:mybatis-plus-generator 3.5.1 及其以上版本,对历史版本不兼容 + */ + @GetMapping("generator") + public static void main(String [] args) { + // 加载数据库配置 + readProperty(); + // 项目路径 + String projectPath = System.getProperty("user.dir"); + // 根据数据源信息,创建文件,生成代码 + FastAutoGenerator.create(new DataSourceConfig.Builder(url,username,password)) + // 全局配置 + .globalConfig(builder -> builder + // 作者 + .author(author) + // 输出路径 + .outputDir(projectPath + "/target/generated-sources") + .dateType(DateType.TIME_PACK) + ) + // 包配置 + .packageConfig(builder -> builder + // 指定父包名 + .parent("com.casic.missiles") + .entity("model") + .Registry("Registry") + .ServiceImpl("Registry.impl") + .mapper("mapper") + .controller("controller")) + // 模版配置 +// .templateConfig(builder -> builder +// .entity("/templates/entity.java") +// .Registry("/templates/Registry.java") +// .ServiceImpl("/templates/ServiceImpl.java") +// .mapper("/templates/mapper.java") +// .controller("/templates/controller.java")) + // 策略配置 + .strategyConfig(builder -> builder + // 指定表名,用逗号分隔 + .addInclude(tableName.split(",")) + // 先开启 Controller 配置 + .controllerBuilder() + // 开启生成 @RestController 控制器 + .enableRestStyle() + // 开启驼峰转连字符 + .enableHyphenStyle() + // 先开启 Entity 配置 + .entityBuilder() + // 开启主键自增 +// .idType(IdType.AUTO) + // 数据库表映射到实体的命名策略,驼峰命名 + .naming(NamingStrategy.underline_to_camel) + // 数据库表字段映射到实体的命名策略,驼峰命名 + .columnNaming(NamingStrategy.underline_to_camel) + // 开启生成实体时生成字段注解 + .enableTableFieldAnnotation() + .enableLombok() + .mapperBuilder() + .enableBaseResultMap() + .enableBaseColumnList()) + // 执行 + .execute(); + } +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/util/MsgUtil.java b/sensorhub-support/src/main/java/com/casic/missiles/util/MsgUtil.java index a6915f1..ab41f1e 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/util/MsgUtil.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/util/MsgUtil.java @@ -1,6 +1,5 @@ package com.casic.missiles.util; -import com.casic.missiles.pojo.Msg; import com.casic.missiles.enums.FrameAttributeEnums; import com.casic.missiles.enums.FrameStructEnum; import com.casic.missiles.enums.OperatorTypeEnum; @@ -251,21 +250,21 @@ return false; } - public static Msg getMsg() { - Msg msg = new Msg(); - msg.setPreamble("A3"); - msg.setVersion("V2.0"); - String tagList = "hello world"; - int byteLeng = tagList.getBytes().length; - msg.setLeng(byteLeng); - msg.setDeviceId("122121"); - msg.setConnType(1); - msg.setOperateType(3); - msg.setDeviceType(1); - msg.setTransControlFlag(0); - msg.setDestAddr("111111"); - msg.setSeq(1); - msg.setTagList(tagList); - return msg; - } +// public static Msg getMsg() { +// Msg msg = new Msg(); +// msg.setPreamble("A3"); +// msg.setVersion("V2.0"); +// String tagList = "hello world"; +// int byteLeng = tagList.getBytes().length; +// msg.setLeng(byteLeng); +// msg.setDeviceId("122121"); +// msg.setConnType(1); +// msg.setOperateType(3); +// msg.setDeviceType(1); +// msg.setTransControlFlag(0); +// msg.setDestAddr("111111"); +// msg.setSeq(1); +// msg.setTagList(tagList); +// return msg; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java index 9779606..a2d4ff1 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/CommandDelivery.java @@ -1,7 +1,7 @@ package com.casic.missiles.delivery; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.parser.safe.SafeStrategy; import com.casic.missiles.util.ApplicationContextUtil; import com.casic.missiles.mapper.dao.FieldConfigDao; @@ -12,26 +12,26 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Registry @Slf4j @AllArgsConstructor public class CommandDelivery { private final FieldConfigDao fieldConfigDao; private final FieldDecoratorManger fieldDecoratorManger; - private final ComandeEventService comandeEventService; + private final ComandeEventRegistry comandeEventRegistry; //数据下发=>重组数据存在头和尾(固定字段是否有区分下发字段下发的)=>重组=>构建业务字段内容=>计算长度=>返回完整帧 public ByteBuf deliveryManger(String preBizContent, String tail, String protocolId) { ByteBuf replyBytes = ByteBufAllocator.DEFAULT.buffer(); - Map commandConfigMap = comandeEventService.loadComandeEventConfig(protocolId, "success_reply"); + Map commandConfigMap = comandeEventRegistry.loadComandeEventConfig(protocolId, "success_reply"); if (ObjectUtil.isEmpty(commandConfigMap)) { return null; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java index 608af3a..32cc8a4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/FieldDecoratorManger.java @@ -2,48 +2,47 @@ import com.alibaba.fastjson.JSONArray; import com.casic.missiles.delivery.decorator.ByteDecorator; +import com.casic.missiles.registry.RuleConfigRegistry; import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.dao.RuleDictDao; import com.casic.missiles.pojo.NodeDecoratorParm; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @AllArgsConstructor public class FieldDecoratorManger { - private final RuleDictDao ruleDictDao; + private final RuleConfigRegistry ruleDictDao; // 处理非完整的字节字段处理方式,动态的业务字段和静态的业务字段 // (1)静态的业务字段是字典里面可以配置的 // (2)动态的业务字段是通过规则生成的 public String contentMerge(String ruleJson, String sceneConent, String dynamicContent) { - List ruleDictList = ruleDictDao.getRuleDictConfig(); - Map ruleDictMap = ruleDictList.stream().collect( - Collectors.toMap(RuleDict::getId, e -> e)); - List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); - for (Map ruleMap : ruleMapList) { - String ruleType = String.valueOf(ruleMap.get("ruleType")); - ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); - NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); - byteDecorator.nodeDecoratorRule(nodeDecoratorParm); - } +// List ruleDictList = ruleDictDao.getRuleDictConfig(); +// Map ruleDictMap = ruleDictList.stream().collect( +// Collectors.toMap(RuleDict::getId, e -> e)); +// List> ruleMapList = JSONArray.parseObject(ruleJson, List.class); +// for (Map ruleMap : ruleMapList) { +// String ruleType = String.valueOf(ruleMap.get("ruleType")); +// ByteDecorator byteDecorator = (ByteDecorator) ApplicationContextUtil.getBean(ruleType); +// NodeDecoratorParm nodeDecoratorParm = initNodeDecoratorRuleParam(ruleDictMap, sceneConent, dynamicContent, String.valueOf(ruleMap.get("ruleTypeId"))); +// byteDecorator.nodeDecoratorRule(nodeDecoratorParm); +// } return null; } - - private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { - NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() - .contents(sceneConent) - .dynamicContent(dynamicContent) - .ruletypeId(ruletypeId) - .ruleDictMap(ruleDictMap) - .build(); - return nodeDecoratorParm; - } +// +// private NodeDecoratorParm initNodeDecoratorRuleParam(Map ruleDictMap, String sceneConent, String dynamicContent, String ruletypeId) { +// NodeDecoratorParm nodeDecoratorParm = NodeDecoratorParm.builder() +// .contents(sceneConent) +// .dynamicContent(dynamicContent) +// .ruletypeId(ruletypeId) +// .ruleDictMap(ruleDictMap) +// .build(); +// return nodeDecoratorParm; +// } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java index 652970c..b204ac3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/LogicalShiftDecorator.java @@ -1,56 +1,56 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("logicalDecorator") -@AllArgsConstructor -@Slf4j -public class LogicalShiftDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //字节位移 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", - JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Component; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Component("logicalDecorator") +//@AllArgsConstructor +//@Slf4j +//public class LogicalShiftDecorator implements ByteDecorator { +// +//// private final FieldRuleEngineMapper fieldRuleEngineMapper; +//// +//// //字节位移 +//// @Override +//// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +//// String logicalValue = ""; +//// RuleEvaluator fieldRuleEngine = new RuleEvaluator(); +//// try { +//// Map env2 = new HashMap(); +//// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +//// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +//// for (String contentId : contentIdList) { +//// RuleDict ruleDict = ruleDictMap.get(contentId); +//// if (ruleDict.getCode().contains("#")) { +//// //使用动态的值 +//// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +//// } +//// env2.put(ruleDict.getName(), ruleDict.getCode()); +//// } +//// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +//// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +//// return null; +//// } +//// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +//// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +//// return values; +//// } catch (Exception ex) { +//// log.error("字节逻辑移位解析出现异常,字段解析配置内容{},业务内容字段为{},异常信息为{}", +//// JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +//// return null; +//// } +//// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java index 346468f..822fead 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/OperationDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("optionDecorator") -@AllArgsConstructor -@Slf4j -public class OperationDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //混合运算,有常量或者乘除的缩放 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("optionDecorator") +//@AllArgsConstructor +//@Slf4j +//public class OperationDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //混合运算,有常量或者乘除的缩放 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm){ +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节运算解析出现异常,字段解析配置内容{},异常信息为{}",JSONObject.toJSON(fieldRuleEngine), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java index 50fb0a7..7a8bccb 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/PrecisionDecorator.java @@ -1,55 +1,54 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -//精度计算 -@AllArgsConstructor -@Service("precisionDecorator") -@Slf4j -public class PrecisionDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (ExpressionNotFoundException enf) { - log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import com.googlecode.aviator.exception.ExpressionNotFoundException; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +////精度计算 +//@AllArgsConstructor +//@Registry("precisionDecorator") +//@Slf4j +//public class PrecisionDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (ExpressionNotFoundException enf) { +// log.error("字节合并运算出现异常,字段解析配置内容{},内容为{} ,异常信息为{}", JSONObject.toJSON(fieldRuleEngine), nodeDecoratorParm.getContents(), enf.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java index da39235..27f9cc7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/decorator/impl/RuleDecorator.java @@ -1,54 +1,53 @@ -package com.casic.missiles.delivery.decorator.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.NodeDecoratorParm; -import com.casic.missiles.delivery.decorator.ByteDecorator; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service("ruleDecorator") -@AllArgsConstructor -@Slf4j -public class RuleDecorator implements ByteDecorator { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - //吃我一套正则表达式 - @Override - public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { - RuleEvaluator fieldRuleEngine = null; - try { - Map env2 = new HashMap(); - Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); - String[] contentIdList = nodeDecoratorParm.getContents().split(","); - for (String contentId : contentIdList) { - RuleDict ruleDict = ruleDictMap.get(contentId); - if (ruleDict.getCode().contains("#")) { - //使用动态的值 - env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); - } - env2.put(ruleDict.getName(), ruleDict.getCode()); - } - fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } - String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } catch (Exception ex) { - log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); - return null; - } - } - -} +//package com.casic.missiles.delivery.decorator.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.casic.missiles.pojo.RuleEvaluator; +//import com.casic.missiles.mapper.FieldRuleEngineMapper; +//import com.casic.missiles.pojo.NodeDecoratorParm; +//import com.casic.missiles.delivery.decorator.ByteDecorator; +//import com.googlecode.aviator.AviatorEvaluator; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Registry; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Registry("ruleDecorator") +//@AllArgsConstructor +//@Slf4j +//public class RuleDecorator implements ByteDecorator { +// +// private final FieldRuleEngineMapper fieldRuleEngineMapper; +// +// //吃我一套正则表达式 +// @Override +// public Object nodeDecoratorRule(NodeDecoratorParm nodeDecoratorParm) { +// RuleEvaluator fieldRuleEngine = null; +// try { +// Map env2 = new HashMap(); +// Map ruleDictMap = nodeDecoratorParm.getRuleDictMap(); +// String[] contentIdList = nodeDecoratorParm.getContents().split(","); +// for (String contentId : contentIdList) { +// RuleDict ruleDict = ruleDictMap.get(contentId); +// if (ruleDict.getCode().contains("#")) { +// //使用动态的值 +// env2.put(ruleDict.getName(), nodeDecoratorParm.getDynamicContent()); +// } +// env2.put(ruleDict.getName(), ruleDict.getCode()); +// } +// fieldRuleEngine = fieldRuleEngineMapper.selectById(nodeDecoratorParm.getRuletypeId()); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } +// String aviatorExpressTion = fieldRuleEngine.getExcuteOperation(); +// String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); +// return values; +// } catch (Exception ex) { +// log.error("字节规则出现异常,规则引擎{},液位内容值为{} ,异常信息为{}", JSONObject.toJSONString(fieldRuleEngine), nodeDecoratorParm.getContents(), ex.getMessage()); +// return null; +// } +// } +// +//} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java index 7f5cbf3..c043f97 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/ComandeEventService.java @@ -2,6 +2,6 @@ import java.util.Map; -public interface ComandeEventService { +public interface ComandeEventService{ Map loadComandeEventConfig(String protocolId,String scene); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java index 476ad84..aaf1837 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/delivery/service/impl/ComandeEventServiceImpl.java @@ -2,46 +2,46 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; -import com.casic.missiles.delivery.service.ComandeEventService; +import com.casic.missiles.delivery.Registry.ComandeEventRegistry; import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.dao.CommandEventDao; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Service +@Component @Slf4j @AllArgsConstructor -public class ComandeEventServiceImpl implements ComandeEventService { +public class ComandeEventServiceImpl implements ComandeEventRegistry { - private final CommandEventDao commandEventDao; + // private final CommandEventDao commandEventDao; // 加密bean 固定字段出现变化的字段解析,业务字段的有序内容 @Override - public Map loadComandeEventConfig(String protocolId,String sceneName) { - CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); - if (ObjectUtil.isEmpty(commandEventConfig)) { - log.error("协议{},没有配置成功接收回复配置,清排查原因"); - return null; - } - String replyJson = commandEventConfig.getReplyContentJson(); - List> replyMapList = JSONArray.parseObject(replyJson, List.class); - List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); - Map fixMap = fixList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); - List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) - .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) - .collect(Collectors.toList()); - Map commandConfigMap = new HashMap<>(); - commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); - commandConfigMap.put("fixContent", fixMap); - commandConfigMap.put("bizContent", contentList); - return commandConfigMap; + public Map loadComandeEventConfig(String protocolId, String sceneName) { +// CommandEventConfig commandEventConfig = commandEventDao.getCommandEventByIdName(protocolId, sceneName); +// if (ObjectUtil.isEmpty(commandEventConfig)) { +// log.error("协议{},没有配置成功接收回复配置,清排查原因"); +// return null; +// } +// String replyJson = commandEventConfig.getReplyContentJson(); +// List> replyMapList = JSONArray.parseObject(replyJson, List.class); +// List> fixList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))).collect(Collectors.toList()); +// Map fixMap = fixList.stream() +// .collect(Collectors.toMap(e -> String.valueOf(e.get("filedConfigId")), e -> String.valueOf(e.get("dictId")))); +// List> contentList = replyMapList.stream().filter(e -> StringUtils.isEmpty(e.get("sort"))) +// .sorted((o1, o2) -> (Integer.valueOf(o1.get("sort")) - Integer.valueOf(o2.get("sort")))) +// .collect(Collectors.toList()); +// Map commandConfigMap = new HashMap<>(); +// commandConfigMap.put("safeBean", commandEventConfig.getSafeBean()); +// commandConfigMap.put("fixContent", fixMap); +// commandConfigMap.put("bizContent", contentList); +// return commandConfigMap; + return null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java deleted file mode 100644 index 128b09d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.CommandEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface CommandEventMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java deleted file mode 100644 index 4016b0b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/DatagramEventMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.DatagramEventConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface DatagramEventMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java deleted file mode 100644 index 597c306..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.apache.ibatis.annotations.Mapper; - -public interface FieldConfigMapper extends BaseMapper { - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java deleted file mode 100644 index a31680a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/PreRuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.PreRuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface PreRuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java deleted file mode 100644 index 9060a69..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.ProtocolConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface ProtocolConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java deleted file mode 100644 index 6fa6936..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleConfig; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleConfigMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java deleted file mode 100644 index 582a705..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.missiles.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.casic.missiles.pojo.RuleDict; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface RuleDictMapper extends BaseMapper { -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java deleted file mode 100644 index 6e302c8..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/CommandEventDao.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.CommandEventConfig; -import com.casic.missiles.mapper.CommandEventMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Optional; - -@Component -public class CommandEventDao { - - @Resource - private CommandEventMapper commandEventMapper; - - public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId) - .eq("scene", sceneName) - .eq("enabled", 1); - List commandEventConfig = commandEventMapper.selectList(queryWrapper); - Optional optionalEventConfig = commandEventConfig.stream().findFirst(); - return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java deleted file mode 100644 index 9137e4f..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/FieldConfigDao.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.FieldConfigMapper; -import com.casic.missiles.pojo.FieldConfig; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class FieldConfigDao { - - @Resource - private FieldConfigMapper fieldConfigMapper; - - public FieldConfig getFieldConfigById(String fieldId) { - FieldConfig fieldConfig = fieldConfigMapper.selectById(fieldId); - return fieldConfig; - } - - public List getFieldConfigs(String protocolId,Integer isFixed) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",isFixed); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - - public List getStorageFieldConfig(String protocolId) { - QueryWrapper queryWrapper=new QueryWrapper() - .eq("protocol_id",protocolId) - .eq("is_fixed",1) - .eq("is_storage",1); - List fieldConfigList = fieldConfigMapper.selectList(queryWrapper); - return fieldConfigList; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java deleted file mode 100644 index 67bff6b..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/PreRuleConfigDao.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.mapper.PreRuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class PreRuleConfigDao { - - @Resource - private PreRuleConfigMapper preRuleConfigMapper; - - public List getPreRuleList(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return preRuleConfigMapper.selectList(queryWrapper); - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java deleted file mode 100644 index d69ea85..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleConfigDao.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.RuleConfigMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleConfigDao { - - @Resource - private RuleConfigMapper ruleConfigMapper; - - public RuleConfig getNextRuleConfig(String ruleFields) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("parse_rule_json", ruleFields); - return ruleConfigMapper.selectOne(queryWrapper); - } - - - public List getRuleConfigById(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("protocol_id", protocolId); - return ruleConfigMapper.selectList(queryWrapper); - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java b/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java deleted file mode 100644 index 932c185..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/mapper/dao/RuleDictDao.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.mapper.dao; - -import com.casic.missiles.pojo.RuleDict; -import com.casic.missiles.mapper.RuleDictMapper; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -@Component -public class RuleDictDao { - - @Resource - private RuleDictMapper ruleDictMapper; - - public List getRuleDictConfig() { - List ruleDictList = ruleDictMapper.selectList(null); - return ruleDictList; - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java index 9f9e279..43bc4d4 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java @@ -10,20 +10,15 @@ import io.netty.channel.socket.nio.NioServerSocketChannel; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import javax.annotation.PreDestroy; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static cn.hutool.core.util.ClassUtil.getClasses; /** * SensorhubServer netty服务端 */ @Slf4j -@Service +@Component public class SensorhubServer { /** diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java index 2c79ff5..9a28c36 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/SensorhubClient.java @@ -11,13 +11,13 @@ import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioSocketChannel; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClient 客户端 */ @Slf4j -@Service +@Registry public final class SensorhubClient { public static void main(String[] args) throws Exception { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java index 9774be0..477c3f7 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientChannelInitialHandler.java @@ -6,12 +6,12 @@ import io.netty.channel.socket.SocketChannel; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientChannelInitialHandler */ -@Service +@Registry public class SensorhubClientChannelInitialHandler extends ChannelInitializer { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java index 346f4b3..73560e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/client/handler/SensorhubClientHandler.java @@ -5,13 +5,13 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Registry; /** * SensorhubClientHandler */ @Slf4j -@Service +@Registry public class SensorhubClientHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java index 5c1c6f2..d990af5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerHandler.java @@ -4,12 +4,12 @@ import com.casic.missiles.pojo.Msg; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** * SensorhubServerHandler */ -@Service +@Component public class SensorhubServerHandler extends SimpleChannelInboundHandler { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java index 67283ae..af3172c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java @@ -1,41 +1,37 @@ package com.casic.missiles.parser; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultProtocolConfigFactory; +import com.casic.missiles.parser.factory.impl.DefaultRuleFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; import com.casic.missiles.parser.matcher.LeadingCodeMatcher; -import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.*; +import com.casic.missiles.registry.FieldConfigRegistry; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; -import java.nio.charset.Charset; import java.util.HashMap; import java.util.List; import java.util.Map; -@Service("genericProtocolParser") +/** + * @author + */ +@Component("genericProtocolParser") @Slf4j -@AllArgsConstructor +@RequiredArgsConstructor public class GenericProtocolParser implements ProtocolParser { - private final LeadingCodeMatcher leadingCodeMatcher; private final List frameStructDispenserList; - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorInstanceSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; // 匹配首字母前导码=> 帧结构匹配前导码=> // 1、如果没有该协议,会存在拆包问题,缓存数组重置,经过帧结构判断进行数据分发 @@ -44,18 +40,19 @@ public Boolean doParseProtocol(ByteBuf byteBuf) { String protocolContent = ByteBufUtil.hexDump(byteBuf); //匹配前导码 - List preCodeConfigs = leadingCodeMatcher.matchLeadingCode(protocolContent); + List preCodeConfigs = LeadingCodeMatcher.matchFrameLeadingCode(protocolContent); //如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配 if (preCodeConfigs.size() == 0) { - return rematch(byteBuf,protocolContent); + return rematch(byteBuf, protocolContent); } - //暂时先取第一个 + //暂时先取第一个,提升速度,使用享元模式, 减少类的创建销毁与构建 ProtocolConfig protocolConfig = preCodeConfigs.get(0); + AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig); ByteBuf wholeDatagramByte = null; //通过匹配帧结构获取完整的数据包 for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) { //帧结构该协议,经过帧结构判断选定帧协议完整的数据报文 - if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, preCodeConfigs.get(0))) != null) { + if ((wholeDatagramByte = frameStructMatcher.getWholeDatagram(byteBuf, protocolFactory)) != null) { break; } } @@ -68,76 +65,78 @@ * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 */ - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId, wholeDatagramByte); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap, protocolId); - //选取规则对应的流程实例 - DatagramEventConfig datagramEventConfig = processorInstanceSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); + //进行规则字段解析,进行匹配规则 + RuleConfig ruleConfig = getRuleConfig(protocolFactory, wholeDatagramByte); + if (ruleConfig == null) { + return false; + } //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, wholeDatagramByte); + ByteBuf bizDataContentBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeDatagramByte); + //以下进行业务的规则解析,同时选定流程实例 + AbstractRuleConfigFactory ruleConfigFactory = new DefaultRuleFactory(ruleConfig.getId()); + DatagramEventProvider datagramEventProvider = ruleConfigFactory.getDatagramEventProvider(); //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); + String clearZeroPlain = datagramEventProvider.getSafeDatagram(bizDataContentBuf,ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); + ruleConfigFactory.getCombinedFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain, + ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap()); //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText, protocolId); + ruleConfigFactory.getFieldConfigProvider().parseDataField(ruleConfig, clearZeroPlain); //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); + Map bizDataMap = buildStoreData(ruleConfigFactory, protocolFactory); //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); + datagramEventProvider.storeData(bizDataMap); return true; } - private Boolean rematch(ByteBuf byteBuf,String protocolContent) { + /** + * 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配 + */ + private Boolean rematch(ByteBuf byteBuf, String protocolContent) { //重置位判断 byteBuf.resetReaderIndex(); //判断重置是否前移,如果没有前移,则直接判为匹配失败 if (protocolContent.equals(ByteBufUtil.hexDump(byteBuf))) { return false; } else { + //递归执行 return doParseProtocol(byteBuf); } } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; + //获取匹配规则->匹配规则 + private RuleConfig getRuleConfig(AbstractProtocolConfigFactory protocolFactory, ByteBuf wholeDatagramByte) { + //取出其中参与逻辑provider并判空 + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + RuleConfigProvider ruleConfigProvider = protocolFactory.getRuleConfigProvider(); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (ObjectUtils.isEmpty(protocolFieldConfigProvider) + || ObjectUtils.isEmpty(ruleConfigProvider) || ObjectUtils.isEmpty(protocolConfig)) { + return null; } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); + String rulePrepareFields = protocolConfig.getRulePrepareFields(); + //固定字段 + if (StringUtils.isNotEmpty(rulePrepareFields)) { + //获取统一固定字段解析 + Map parseFixedDataMap = protocolFieldConfigProvider.getProtocolDataMap(wholeDatagramByte); + //获取该协议的字段配置,用于协议规则匹配 + List protocolFieldConfigs = protocolFieldConfigProvider.getProtocolFieldConfigs(); + //获取规则 + RuleConfig ruleConfig = ruleConfigProvider.doGetRule(parseFixedDataMap, + rulePrepareFields, protocolFieldConfigs); + return ruleConfig; + } + return null; } - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { + //数据构建,获取固定字段的store和业务字段store + private Map buildStoreData(AbstractRuleConfigFactory ruleConfigFactory, AbstractProtocolConfigFactory protocolFactory) { + Map bizDataMap = new HashMap<>(); + Map protocolStoreObjectMap = protocolFactory.getProtocolFieldConfigProvider().getStoreObjectMap(); + Map ruleStoreObjectMap = ruleConfigFactory.getFieldConfigProvider().getStoreObjectMap(); //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); + bizDataMap.putAll(ruleStoreObjectMap); + bizDataMap.putAll(protocolStoreObjectMap); return bizDataMap; } - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java index 8a46e32..16ce2e5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/ProtocolParser.java @@ -3,6 +3,7 @@ import io.netty.buffer.ByteBuf; public interface ProtocolParser { + Boolean doParseProtocol(ByteBuf byteBuf); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java new file mode 100644 index 0000000..f7814af --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractProtocolConfigFactory.java @@ -0,0 +1,35 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.ProtocolConfigProvider; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; +import com.casic.missiles.parser.provider.RuleConfigProvider; +import com.casic.missiles.pojo.ProtocolConfig; + +/** + * 存放基本协议的的加载信息 + */ +public class AbstractProtocolConfigFactory { + private final ProtocolConfigProvider protocolConfigProvider; + private final ProtocolFieldConfigProvider protocolFieldConfigProvider; + private final RuleConfigProvider ruleConfigProvider; + + public AbstractProtocolConfigFactory(ProtocolConfig protocolConfig) { + this.protocolConfigProvider = new ProtocolConfigProvider(protocolConfig); + this.protocolFieldConfigProvider = new ProtocolFieldConfigProvider(protocolConfig.getId()); + this.ruleConfigProvider = new RuleConfigProvider(protocolConfig.getId()); + } + + public ProtocolConfigProvider getProtocolConfigProvider() { + return protocolConfigProvider; + } + + public ProtocolFieldConfigProvider getProtocolFieldConfigProvider() { + return protocolFieldConfigProvider; + } + + public RuleConfigProvider getRuleConfigProvider() { + return ruleConfigProvider; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java new file mode 100644 index 0000000..6e36147 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/AbstractRuleConfigFactory.java @@ -0,0 +1,57 @@ +package com.casic.missiles.parser.factory; + + +import com.casic.missiles.parser.provider.CombinedFieldConfigProvider; +import com.casic.missiles.parser.provider.DatagramEventProvider; +import com.casic.missiles.parser.provider.FieldConfigProvider; +import com.casic.missiles.parser.provider.FieldRuleConfigProvider; + +/** + * 存放规则相关的的的加载信息 + */ +public class AbstractRuleConfigFactory { + + /** + * 处理字节 + */ + private final FieldConfigProvider fieldConfigProvider; + /** + * 处理组合字节解析的解码器 + */ + private final CombinedFieldConfigProvider combinedFieldConfigProvider; + /** + * 处理负责字节解析的规则配置 + */ + private final FieldRuleConfigProvider fieldRuleConfigProvider; + /** + * 处理实例流程 + */ + private final DatagramEventProvider datagramEventProvider; + + + public AbstractRuleConfigFactory(Long ruleId) { + this.fieldConfigProvider = new FieldConfigProvider(ruleId); + this.combinedFieldConfigProvider = new CombinedFieldConfigProvider(ruleId); + this.fieldRuleConfigProvider = new FieldRuleConfigProvider(ruleId); + this.datagramEventProvider = new DatagramEventProvider(ruleId); + } + + public FieldConfigProvider getFieldConfigProvider() { + return fieldConfigProvider; + } + + public CombinedFieldConfigProvider getCombinedFieldConfigProvider() { + return combinedFieldConfigProvider; + } + + public FieldRuleConfigProvider getFieldRuleConfigProvider() { + return fieldRuleConfigProvider; + } + + public DatagramEventProvider getDatagramEventProvider() { + return datagramEventProvider; + } + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java deleted file mode 100644 index 6e1719a..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/DatagramFactory.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.factory; - - -import com.casic.missiles.pojo.ProtocolConfig; - -import java.util.List; - -/** - * 数据库访问优化(暂时未做) - *

- * 1、初始化协议解析配置,并存放到处存放缓存,对协议基本配置进行管理 - * 2、其中流程中所有的配置都经过此类进行管理,进行调用获取,增强解析速度 - */ -public interface DatagramFactory { - - /** - * 初始化 - */ - List datagramInit(); - - /** - * 根据前导码配置匹配,模糊匹配获取所有的报文项 - */ - List match(); - - /** - * 根据前导码匹配,返回报文项 - */ - List filer(); - - /** - * 保证数据的唯一性选择器 - */ - List selectOne(); - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java new file mode 100644 index 0000000..87444a0 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultProtocolConfigFactory.java @@ -0,0 +1,18 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +import java.util.List; + +/** + * 直接用,还是边用边创建 + */ +public class DefaultProtocolConfigFactory extends AbstractProtocolConfigFactory { + + + public DefaultProtocolConfigFactory(ProtocolConfig protocolConfig) { + super(protocolConfig); + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java new file mode 100644 index 0000000..cce0c7c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/factory/impl/DefaultRuleFactory.java @@ -0,0 +1,12 @@ +package com.casic.missiles.parser.factory.impl; + +import com.casic.missiles.parser.factory.AbstractRuleConfigFactory; + +public class DefaultRuleFactory extends AbstractRuleConfigFactory { + + public DefaultRuleFactory(Long ruleId) { + super(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java deleted file mode 100644 index 9ee97e0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/GeneralProcessor.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.casic.missiles.parser.instance; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.rule.RulerProvider; -import com.casic.missiles.parser.safe.SafeStrategy; -import com.casic.missiles.parser.sender.DataSubscribeProvider; -import com.casic.missiles.pojo.DatagramEventConfig; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service -@Slf4j -@AllArgsConstructor -public class GeneralProcessor { - - private final FieldConfigDao fieldConfigDao; - private final ProcessorInstanceSelector processorSelector; - private final RulerProvider rulerProvider; - private final FieldParser fieldParser; - - /** - * 统一固定字段解析=>进行规则的查询的判断 - * 计算固定字段业务值及对应管理=> 规则解析,规则循环匹配 =>选取规则对应的流程=>选定业务字段内容=>执行加密/解密=> 选定业务数据包内容 - * =>业务字段解析=> 数据验证=>数据构建=> 数据发送 - */ - @Deprecated - public boolean parseWholeDatagram(ByteBuf buffer, ProtocolConfig protocolConfig) { - try { - String protocolId = String.valueOf(protocolConfig.getId()); - //统一固定字段解析 - Map fixDataMap = fieldParser.fixDataParser(protocolId,buffer); - //规则解析,规则循环匹配 - RuleConfig ruleConfig = rulerProvider.ruleConfig(fixDataMap,protocolId); - //选取规则对应的流程= - DatagramEventConfig datagramEventConfig = processorSelector.getProcessorInstance(String.valueOf(ruleConfig.getId())); - //选定业务字段内容 - ByteBuf bizDataContent = fieldParser.getDataContent(protocolConfig, buffer); - //密文解析 - String lightText = getSafeDatagram(datagramEventConfig, bizDataContent); - //解析业务字段 - Map bizDataMap = fieldParser.dataParser(ruleConfig, lightText,protocolId); - //构建发送解析任务 - Map senderDataMap = buildStoreData(datagramEventConfig, bizDataMap, protocolId); - //数据发送 - storeData(datagramEventConfig, senderDataMap, protocolId); - return true; - } catch (Exception ex) { - log.debug("选定流程出现异常,异常数据报文内容{},协议内容{},异常信息为{}", - ByteBufUtil.hexDump(buffer), JSONObject.toJSON(protocolConfig), ex.getMessage()); - return false; - } - } - - // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 - private String getSafeDatagram(DatagramEventConfig datagramEventConfig, ByteBuf bizDataContent) { - String safeName = StringUtils.isEmpty(datagramEventConfig.getSafeFieldId()) ? datagramEventConfig.getSafeBean() - : fieldConfigDao.getFieldConfigById(datagramEventConfig.getSafeFieldId()).getFieldName(); - if (!StringUtils.isEmpty(safeName)) { - //需要加密 - SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); - String lightText = ""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); - return lightText; - } - return bizDataContent.toString(Charset.forName("ISO-8859-1")); - } - - //数据发送 - private void storeData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - DataSubscribeProvider dataSubscribeProvider = (DataSubscribeProvider) ApplicationContextUtil.getBean(datagramEventConfig.getSubscribeBean()); - dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); - - } - - //数据构建 - private Map buildStoreData(DatagramEventConfig datagramEventConfig, Map bizDataMap, String protocolId) { - //加上固定字段的数据 - bizDataMap.putAll(getFixedField(protocolId)); - return bizDataMap; - } - - //获取固定字段 - private Map getFixedField(String protocolId) { - Map fixedDataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - fieldConfigList.stream().forEach( - fieldConfig -> { - fixedDataMap.put(fieldConfig.getFieldName(), ""); - } - ); - return fixedDataMap; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java index 25e7ad8..6a5777e 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/instance/impl/DefaultProcessorInstanceSelector.java @@ -1,23 +1,31 @@ package com.casic.missiles.parser.instance.impl; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.parser.instance.ProcessorInstanceSelector; -import com.casic.missiles.mapper.DatagramEventMapper; import com.casic.missiles.pojo.DatagramEventConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.SpringContextUtil; -@Service -@AllArgsConstructor +import java.util.List; +import java.util.Optional; + +/** + * @author cz + * + */ public class DefaultProcessorInstanceSelector implements ProcessorInstanceSelector { - private final DatagramEventMapper datagramEventMapper; + private static List datagramEventConfigs; + + static { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + datagramEventConfigs = datagramEventRegistry.getDatagramEventList(); + } @Override public DatagramEventConfig getProcessorInstance(String protocolId) { - QueryWrapper queryWrapper = new QueryWrapper() - .eq("rule_id", protocolId); - return datagramEventMapper.selectOne(queryWrapper); + Optional optionalSelectInstance = datagramEventConfigs.stream() + .filter(e -> e.getId().equals(protocolId)).limit(1).findFirst(); + return optionalSelectInstance.isPresent() ? optionalSelectInstance.get() : null; } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java index a778671..7b56a43 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/FrameStructMatcher.java @@ -1,16 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import io.netty.buffer.ByteBuf; /** - * 分析匹配情况 - * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 - * 2、匹配不成功,有后续帧,可以进行下次匹配。 - * 3、匹配不成功,无后续帧,可以进行丢弃。 + * 分析匹配情况 + * 1、匹配成功,直接返回帧结构,截取完整的数据,可以进行下次匹配。 + * 2、匹配不成功,有后续帧,可以进行下次匹配。 + * 3、匹配不成功,无后续帧,可以进行丢弃。 */ -public interface FrameStructMatcher{ +public interface FrameStructMatcher { - ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig); + ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java index 05320ab..8ebea78 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/LeadingCodeMatcher.java @@ -1,23 +1,16 @@ package com.casic.missiles.parser.matcher; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.casic.missiles.mapper.ProtocolConfigMapper; +import com.casic.missiles.parser.provider.ProtocolConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Component; import java.util.List; import java.util.stream.Collectors; -@Component -@AllArgsConstructor public class LeadingCodeMatcher { - private final ProtocolConfigMapper protocolMapper; - //** 1、首字母匹配前导码, // 2、以匹配出的前导码是否在报文中条件进行前导码的匹配二次筛选 - public List matchLeadingCode(String protocolContent){ + public static List matchFrameLeadingCode(String protocolContent){ List initialConfigs = initialMatch(protocolContent); List preCodeConfigs = initialConfigs.stream() .filter(protocolConfig -> protocolContent.contains(protocolConfig.getPreFix().toLowerCase())) @@ -26,13 +19,16 @@ } //初始化匹配前导码内容 - private List initialMatch(String protocolContent) { - String protocolStr = protocolContent.charAt(0) + ""; - QueryWrapper queryWrapper = new QueryWrapper() - .likeRight("pre_fix", protocolStr); - List protocolConfigList = protocolMapper.selectList(queryWrapper); - return protocolConfigList; + private static List initialMatch(String protocolContent) { + String firstFrameChar = protocolContent.charAt(0) + ""; + ProtocolConfigProvider protocolConfigProvider=new ProtocolConfigProvider(firstFrameChar); + return protocolConfigProvider.getMatchList(); } + + + + + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java index cf2113d..e915877 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameLengthMatcher.java @@ -1,32 +1,35 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(0) -@Service +@Component public class FrameLengthMatcher implements FrameStructMatcher { - @Autowired - private FieldParser fieldParser; - //超过长度 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { String dataGramContent = ByteBufUtil.hexDump(byteBuf); - if (StringUtils.isEmpty(protocolConfig.getUnpackId()) && StringUtils.isEmpty(protocolConfig.getTailStr())) { - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + //当不存在结尾标志和拆包标志,可以直接使用长度进行匹配 + if (ObjectUtils.isEmpty(protocolConfig.getUnpackId()) && ObjectUtils.isEmpty(protocolConfig.getTailStr())) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); if (ObjectUtil.isEmpty(totalLength)) { if (dataGramContent.length() >= totalLength) {//等于长度返回true,超出长度,切断 - ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, protocolConfig, totalLength); + ByteBuf wholeDatagramByte = this.doGetWholeDatagramByte(byteBuf, totalLength); return wholeDatagramByte; } else { //读的标志位前移舍弃 @@ -38,7 +41,7 @@ return null; } - private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf doGetWholeDatagramByte(ByteBuf byteBuf, Integer totalLength) { byteBuf.readBytes(totalLength); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, totalLength - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java index 2bfc213..d527ad0 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameMarkMatcher.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; @@ -13,7 +13,7 @@ import lombok.AllArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.nio.charset.Charset; import java.util.Map; @@ -22,32 +22,30 @@ * 后续标志验证 */ @Order(1) -@Service +@Component @AllArgsConstructor -public class FrameMarkMatcher implements FrameStructMatcher { - - private final FieldConfigDao fieldConfigDao; - private final FieldParser fieldParser; - private final FieldResolver fieldResolverManger; +public class FrameMarkMatcher implements FrameStructMatcher, FixedPropertyEnum { //帧后续标志=>结束,进行帧的重组=>有后续,1、帧移位判别 2、继续接收帧 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig UnpackConfig = StringUtils.isEmpty(protocolConfig.getUnpackId()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getUnpackId()); - Integer totalLength = fieldParser.getTotalLength(protocolConfig, byteBuf); - Integer upback = 0; + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + ProtocolFieldConfigProvider protocolFieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null || protocolFieldConfigProvider == null) { + return null; + } + Integer unpackFlag = ObjectUtils.isEmpty(protocolConfig.getUnpackId()) ? null : + protocolFieldConfigProvider.getProtocolFieldValue(protocolConfig.getUnpackId(), byteBuf); ByteBuf mergeWholeFrameByte = null; - if (!ObjectUtil.isEmpty(UnpackConfig)) { - while (hasNextFullFrame(byteBuf, protocolConfig)) { - upback = (Integer) fieldResolverManger.filedParserManger(byteBuf, UnpackConfig, null); + if (!ObjectUtil.isEmpty(unpackFlag)) { + while (hasNextFullFrame(byteBuf, protocolConfig, protocolFieldConfigProvider)) { //是否存在后续位 - if (upback == 1) {//使用esayRule + if (unpackFlag == 1) {//使用esayRule //表示可以截取 - mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolConfig, totalLength); + mergeWholeFrameByte = getWholeDatagramByte(byteBuf, protocolFieldConfigProvider, protocolConfig); return mergeWholeFrameByte; } else { - byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig)); + byteBuf.readerIndex(byteBuf.readerIndex() + getNextFrameOffset(byteBuf, protocolConfig, protocolFieldConfigProvider)); } } } @@ -56,7 +54,8 @@ //选取第一个帧,将业务内容和后面部分分开 //计算数据报文-业务内容 - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer totalLength) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolFieldConfigProvider protocolFieldConfigProvider, ProtocolConfig protocolConfig) { + Integer totalLength = protocolFieldConfigProvider.getTotalLength(byteBuf, protocolConfig); //截取完整报文 byteBuf.readBytes(totalLength); ByteBuf byteBufContent = byteBuf.slice(0, byteBuf.readerIndex()); @@ -68,15 +67,15 @@ String tail = ""; System.out.println(ByteBufUtil.hexDump(byteBufContent)); //会存在多个帧拼接在一起的的情况,进行合并处理 - while (hasNextFullFrame(byteBufContent, protocolConfig)) { - Integer currentFrameLength = fieldParser.getTotalLength(protocolConfig, byteBufContent); + while (hasNextFullFrame(byteBufContent, protocolConfig, protocolFieldConfigProvider)) { + Integer currentFrameLength = protocolFieldConfigProvider.getTotalLength(byteBufContent, protocolConfig); byteBufContent.readBytes(currentFrameLength); ByteBuf currentbyteBuf = byteBufContent.slice(0, byteBufContent.readerIndex()); byteBufContent.markReaderIndex();//读的标志位前移 System.out.println(ByteBufUtil.hexDump(byteBufContent)); String hexDump = currentbyteBuf.toString(Charset.forName("ISO-8859-1")); //获取当前固定帧结构的关系map - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, currentbyteBuf); + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(currentbyteBuf, protocolConfig); if (StringUtils.isEmpty(mergeFrameStr)) { //首次获取业务数据报文 mergeFrameStr += hexDump.substring(0, currentFrameFixedProperty.get("tailPosition")); @@ -95,22 +94,22 @@ /** * 获取平移到下一帧起始位置 */ - public int getNextFrameOffset(ByteBuf buffer, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, buffer); - return currentFrameFixedProperty.get("totalLength"); + public int getNextFrameOffset(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); + return currentFrameFixedProperty.get(TOTAL_LENGTH); } /** * 判断是否出错进行整个帧的 */ - public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - Map currentFrameFixedProperty = fieldParser.getFixedProperty(protocolConfig, byteBuf); + public boolean hasNextFullFrame(ByteBuf byteBuf, ProtocolConfig protocolConfig, ProtocolFieldConfigProvider protocolFieldConfigProvider) { + Map currentFrameFixedProperty = protocolFieldConfigProvider.getFixedProperty(byteBuf, protocolConfig); //保证读取位置不在固定位置,是可变的业务内容 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("fixedPosition")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(FIXED_POSITION)) { return false; } //判断读取是否操作帧长度 - if (byteBuf.readableBytes() < currentFrameFixedProperty.get("totalLength")) { + if (byteBuf.readableBytes() < currentFrameFixedProperty.get(TOTAL_LENGTH)) { return false; } return true; diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java index 76a3784..c3a1bab 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/matcher/impl/FrameTailMatcher.java @@ -1,50 +1,50 @@ package com.casic.missiles.parser.matcher.impl; import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.parser.instance.GeneralProcessor; +import com.casic.missiles.parser.factory.AbstractProtocolConfigFactory; import com.casic.missiles.parser.matcher.FrameStructMatcher; -import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.parser.provider.ProtocolFieldConfigProvider; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; +import io.netty.buffer.ByteBufUtil;; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; @Order(2) -@Service +@Component public class FrameTailMatcher implements FrameStructMatcher { - @Resource - private FieldConfigDao fieldConfigDao; - @Autowired - private GeneralProcessor generalProcessor; - //结尾标志位后面还有数据怎么办 @Override - public ByteBuf getWholeDatagram(ByteBuf byteBuf, ProtocolConfig protocolConfig) { - FieldConfig tailFieldConfig = StringUtils.isEmpty(protocolConfig.getTailStr()) ? null : - fieldConfigDao.getFieldConfigById(protocolConfig.getTailStr()); - if (!ObjectUtil.isEmpty(tailFieldConfig)) { - String tailStr = tailFieldConfig.getFieldName(); + public ByteBuf getWholeDatagram(ByteBuf byteBuf, AbstractProtocolConfigFactory protocolFactory) { + ProtocolConfig protocolConfig = protocolFactory.getProtocolConfigProvider().getCurrentProtocolConfig(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfigProvider fieldConfigProvider = protocolFactory.getProtocolFieldConfigProvider(); + if (protocolConfig == null) { + return null; + } + ProtocolFieldConfig protocolFieldConfig = ObjectUtils.isEmpty(protocolConfig.getTailStr()) ? null : + fieldConfigProvider.getFieldConfigById(protocolConfig.getTailStr()); + if (!ObjectUtil.isEmpty(protocolFieldConfig)) { + String tailStr = protocolFieldConfig.getFieldName(); String dataGramContent = ByteBufUtil.hexDump(byteBuf); Boolean tailFlag = ByteBufUtil.hexDump(byteBuf).contains(tailStr); if (!tailFlag) { //使用esayRule return null; } else if (dataGramContent.indexOf(tailStr) < dataGramContent.length() - tailStr.length()) { Integer length = dataGramContent.indexOf(tailStr) + tailStr.length(); - ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, protocolConfig, length); + ByteBuf wholeDatagramByte = getWholeDatagramByte(byteBuf, length); return wholeDatagramByte; //存在粘包 } } return null; } - private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, ProtocolConfig protocolConfig, Integer length) { + private ByteBuf getWholeDatagramByte(ByteBuf byteBuf, Integer length) { byteBuf.readBytes(length); byteBuf.markReaderIndex();//读的标志位前移 ByteBuf wholeDatagramByte = byteBuf.slice(0, length - 1); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java new file mode 100644 index 0000000..5f1c177 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CombinedFieldConfigProvider.java @@ -0,0 +1,73 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.combined.GenericCombinedFieldResolver; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.CombinedFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class CombinedFieldConfigProvider { + + + /** + * 作为临时配置列表缓存使用 + */ + private final List combinedFieldConfigList; + private Map storeObjectMap = new HashMap<>(); + + public CombinedFieldConfigProvider(Long ruleId) { + CombinedFieldConfigRegistry combinedFieldConfigRegistry = SpringContextUtil.getBean(CombinedFieldConfigRegistry.class); + combinedFieldConfigList = combinedFieldConfigRegistry.getCombinedFieldConfigList(ruleId); + } + + public void parseDataField(RuleConfig ruleConfig, String clearZeroPlain,Map fieldConfigsMap ) { + if (showSkip()) { + return; + } + //匹配对应的数据,然后进行相关的字段解析 + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + GenericCombinedFieldResolver combinedFieldResolver = new GenericCombinedFieldResolver(); + combinedFieldResolver.parseDataField(combinedFieldConfigList, byteBuf, storeObjectMap,fieldConfigsMap); + } + + + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getCombinedFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return combinedFieldConfigList.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public List getCombinedFieldConfigList() { + return combinedFieldConfigList; + } + + /* 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(combinedFieldConfigList) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java new file mode 100644 index 0000000..f3cfedc --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/CommandEventProvider.java @@ -0,0 +1,11 @@ +package com.casic.missiles.parser.provider; + +/** + * @author cz + * @date 2023-6-12 + */ +public class CommandEventProvider{ + + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java new file mode 100644 index 0000000..70eec5e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/DatagramEventProvider.java @@ -0,0 +1,77 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.safe.SafeStrategy; +import com.casic.missiles.parser.sender.DataSubscribeProvider; +import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.registry.DatagramEventRegistry; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class DatagramEventProvider { + + private final DatagramEventConfig processorInstance; + + public DatagramEventProvider(Long ruleId) { + DatagramEventRegistry datagramEventRegistry = SpringContextUtil.getBean(DatagramEventRegistry.class); + List datagramEventConfigList = + datagramEventRegistry.getDatagramEventList(ruleId); + processorInstance = this.getProcessorInstance(datagramEventConfigList); + } + + public DatagramEventConfig getProcessorInstance(List datagramEventConfigList) { + if (showSkip()) { + return null; + } + return datagramEventConfigList.get(0); + } + + // 是否有动态bean,没有去设置的bean,有则取之=>bean不为空,进行解密操作,否则返回原文 + public String getSafeDatagram(ByteBuf bizDataContent, Map fieldConfigMap) { + String safeName = StringUtils.isEmpty(processorInstance.getSafeFieldId()) ? + processorInstance.getSafeBean() : + fieldConfigMap.get(processorInstance.getSafeFieldId()).getFieldName(); + if (!StringUtils.isEmpty(safeName)) { + //需要加密 + SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); + String plain = safeStrategy.decryption(ByteBufUtil.hexDump(bizDataContent)); + return clearComplementZero(plain); + } + return ByteBufUtil.hexDump(bizDataContent); + } + + //解密清零操作 + private String clearComplementZero(String plain) { + plain = plain.substring(0, plain.lastIndexOf("00")); + return plain; + } + + //数据发送,数据发送者暂未构建 + public void storeData(Map bizDataMap) { + DataSubscribeProvider dataSubscribeProvider = SpringContextUtil.getBean(processorInstance.getSubscribeBean()); +// dataSubscribeProvider.dataSenderSubscribe(bizDataMap, protocolId); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return ObjectUtils.isNotEmpty(processorInstance) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java new file mode 100644 index 0000000..7e1fe0a --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldConfigProvider.java @@ -0,0 +1,97 @@ +package com.casic.missiles.parser.provider; + +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.FieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class FieldConfigProvider { + + + private final List fieldConfigs; + private Map storeObjectMap = new HashMap<>(); +// private Map singleObjects = new ConcurrentHashMap<>(); + + public FieldConfigProvider(Long ruleId) { + FieldConfigRegistry fieldConfigRegistry = SpringContextUtil.getBean(FieldConfigRegistry.class); + fieldConfigs = fieldConfigRegistry.getFieldConfigList(ruleId); + } + + public List getFieldConfigs() { + return fieldConfigs; + } + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public Map parseDataField(RuleConfig ruleConfig, String clearZeroPlain) { + if (showSkip()) { + return null; + } + List prepareFieldConfig = prepareParseField(ruleConfig); + if (CollectionUtils.isNotEmpty(prepareFieldConfig)) { + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(clearZeroPlain.getBytes(Charset.forName("ISO-8859-1"))); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(fieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + return fixDataMap; + } + } + return null; + } + + /** + * 得到需要处理的业务内容 + * + * @return + */ + private List prepareParseField(RuleConfig ruleConfig) { + if (StringUtils.isEmpty(ruleConfig.getDataFieldIds())) { + return null; + } + Map dataFieldIdMap = new HashMap<>(); + String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); + for (String dataFieldId : dataFieldIds) { + dataFieldIdMap.put(dataFieldId, ""); + } + return fieldConfigs.stream().filter( + e -> dataFieldIdMap.containsKey(String.valueOf(e.getId())) + ).collect(Collectors.toList()); + } + + public Map getFieldConfigsMap() { + return fieldConfigs.stream().collect( + Collectors.toMap(FieldConfig::getId, e -> e) + ); + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(fieldConfigs) ? false : true; + } + + +} + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java new file mode 100644 index 0000000..817bfaf --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/FieldRuleConfigProvider.java @@ -0,0 +1,19 @@ +package com.casic.missiles.parser.provider; + +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.registry.FieldRuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; + +public class FieldRuleConfigProvider { + + private final List fieldRuleConfigList; + + public FieldRuleConfigProvider(Long ruleId) { + FieldRuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(FieldRuleConfigRegistry.class); + fieldRuleConfigList = ruleConfigRegistry.getFieldRuleConfigList(ruleId); + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java new file mode 100644 index 0000000..99a1b06 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolConfigProvider.java @@ -0,0 +1,53 @@ +package com.casic.missiles.parser.provider; + + +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.registry.ProtocolConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolConfigProvider { + + private final List protocolConfigList; + + public ProtocolConfigProvider(String firstChar) { + ProtocolConfigRegistry registry = SpringContextUtil.getBean(ProtocolConfigRegistry.class); + protocolConfigList = registry.getProtocolConfigList(firstChar); + } + + public List getMatchList() { + return protocolConfigList; + } + + /** + * 设置当前协议 + * + * @param protocolConfig + */ + public ProtocolConfigProvider(ProtocolConfig protocolConfig) { + List protocolConfigs = new ArrayList<>(); + protocolConfigs.add(protocolConfig); + protocolConfigList = protocolConfigs; + } + + /** + * 获取当前协议 + * + * @return + */ + public ProtocolConfig getCurrentProtocolConfig() { + if (this.protocolConfigList == null) { + return null; + } else { + return protocolConfigList.get(0); + } + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java new file mode 100644 index 0000000..043927d --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/ProtocolFieldConfigProvider.java @@ -0,0 +1,213 @@ +package com.casic.missiles.parser.provider; + + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.registry.ProtocolFieldConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-12 + */ +public class ProtocolFieldConfigProvider { + + private static final String FIXED_FIELD_DS = "fixedFieldDs"; + private static final String CONTENT_FIELD_DS = "contentFieldDs"; + private static final String PROTOCOL_LENGTH = "protocolLength"; + private static final String PROTOCOL_FIELD_ID = "protocolFieldId"; + private static final String PROTOCOL_POSITION = "protocolPosition"; + + private final List protocolFieldConfigs; + private Map singleObjects = new ConcurrentHashMap<>(); + private Map storeObjectMap = new HashMap<>(); + + public Map getStoreObjectMap() { + return storeObjectMap; + } + + public ProtocolFieldConfigProvider(Long protocolId) { + ProtocolFieldConfigRegistry protocolFieldConfigRegistry = SpringContextUtil.getBean(ProtocolFieldConfigRegistry.class); + protocolFieldConfigs = protocolFieldConfigRegistry.getProtocolFieldConfigList(protocolId); + } + + public List getProtocolFieldConfigs() { + return protocolFieldConfigs; + } + + public ProtocolFieldConfig getFieldConfigById(Long fieldId) { + Optional optionalConfig = protocolFieldConfigs.stream().filter( + e -> e.getId().equals(fieldId) + ).findFirst(); + return optionalConfig.isPresent() ? optionalConfig.get() : null; + } + + public Integer getProtocolFieldValue(Long protocolFieldId, ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_FIELD_ID + protocolFieldId + ByteBufUtil.hexDump(byteBuf); + //获取缓存 + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + //加载固定长度数据集合 + Map fixDataMap = this.getProtocolDataMap(byteBuf); + ProtocolFieldConfig protocolFieldConfig = selectFieldConfig(protocolFieldId); + Integer protocolFieldValue = 0; + //获取约定字段的总长度 + if (fixDataMap.containsKey(protocolFieldConfig.getFieldName())) { + Object appointUnpackObject = fixDataMap.get(protocolFieldConfig.getFieldName()); + if (ObjectUtils.isNotEmpty(appointUnpackObject)) { + protocolFieldValue = (Integer) appointUnpackObject; + } + } + if (protocolFieldValue != null) { + //加入缓存 + if (ObjectUtils.isNotEmpty(protocolFieldValue)) { + this.singleObjects.put(catchKey, protocolFieldValue); + return protocolFieldValue; + } + } + return null; + } + + /** + * 获取帧固定位置信息 + * + * @param byteBuf + * @param protocolConfig + * @return + */ + public Map getFixedProperty(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_POSITION + protocolConfig.getId(); + if (this.singleObjects.containsKey(catchKey)) { + return (Map) singleObjects.get(catchKey); + } + Map fixedPropertyMap = new HashMap<>(); + FieldParser fieldParser = new DefaultProtocolFieldParser(); + fixedPropertyMap = fieldParser.doGetFixedProperty(protocolFieldConfigs, this.getTotalLength(byteBuf,protocolConfig)); + if (CollectionUtils.isNotEmpty(fixedPropertyMap)) { + this.singleObjects.put(catchKey, fixedPropertyMap); + return fixedPropertyMap; + } + return fixedPropertyMap; + } + + /** + * 获取帧结构应有的总长度 + */ + public Integer getTotalLength(ByteBuf byteBuf, ProtocolConfig protocolConfig) { + if (showSkip()) { + return null; + } + //获取缓存 + String catchKey = PROTOCOL_LENGTH + ByteBufUtil.hexDump(byteBuf); + if (this.singleObjects.containsKey(catchKey)) { + return (Integer) singleObjects.get(catchKey); + } + Integer appointFrameLength = getProtocolFieldValue(protocolConfig.getTotalLengthId(), byteBuf); + if (appointFrameLength != null) { + //获取过滤的字段集合总长度 + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Integer totalFilterLength = fieldParser.getTotalFilterLength(protocolConfig, byteBuf, getFixFieldConfigMap()); + //计算总长度 + Integer totalLength = appointFrameLength + totalFilterLength; + //加入缓存 + if (ObjectUtils.isNotEmpty(totalLength)) { + this.singleObjects.put(catchKey, totalLength); + return totalLength; + } + } + return null; + } + + /** + * 获取协议有关字段解析内容 + * storeObjectMap存储代转存的数据 + * + * @return + */ + public Map getProtocolDataMap(ByteBuf byteBuf) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(FIXED_FIELD_DS)) { + return (Map) singleObjects.get(FIXED_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + Map fixDataMap = fieldParser.doGetParseField(protocolFieldConfigs, byteBuf, storeObjectMap); + if (CollectionUtils.isNotEmpty(fixDataMap)) { + this.singleObjects.put(FIXED_FIELD_DS, fixDataMap); + return fixDataMap; + } + return null; + } + + /** + * 获取业务报文内容的content字节 + * + * @param wholeDatagramByte + * @return + */ + public ByteBuf getDataContentBuf(ByteBuf wholeDatagramByte) { + if (showSkip()) { + return null; + } + //获取缓存 + if (this.singleObjects.containsKey(CONTENT_FIELD_DS)) { + return (ByteBuf) singleObjects.get(CONTENT_FIELD_DS); + } + FieldParser fieldParser = new DefaultProtocolFieldParser(); + ByteBuf bizDataByteBuf = fieldParser.getDataContentBuf(protocolFieldConfigs, wholeDatagramByte); + if (bizDataByteBuf != null) { + this.singleObjects.put(CONTENT_FIELD_DS, bizDataByteBuf); + return bizDataByteBuf; + } + return null; + } + + + private ProtocolFieldConfig selectFieldConfig(Long id) { + Optional optionalProtocolFieldConfig = this.protocolFieldConfigs.stream().filter( + e -> e.getId().equals(id) + ).findFirst(); + return optionalProtocolFieldConfig.isPresent() ? optionalProtocolFieldConfig.get() : null; + } + + + private Map getFixFieldConfigMap() { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, e -> e) + ); + return fixDataFieldMap; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(protocolFieldConfigs) ? false : true; + } + + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java new file mode 100644 index 0000000..dafba1c --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/provider/RuleConfigProvider.java @@ -0,0 +1,56 @@ +package com.casic.missiles.parser.provider; + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.casic.missiles.parser.rule.GenericRuleResolver; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.RuleConfigRegistry; +import com.casic.missiles.util.SpringContextUtil; + +import java.util.List; +import java.util.Map; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleConfigProvider { + + private final List ruleConfigs; + + public List getRuleConfigs() { + return ruleConfigs; + } + + public RuleConfigProvider(Long protocolId) { + RuleConfigRegistry ruleConfigRegistry = SpringContextUtil.getBean(RuleConfigRegistry.class); + ruleConfigs = ruleConfigRegistry.getRuleConfigById(protocolId); + } + + /** + * 获取规则匹配结果 + * + * @param parseFixedDataMap + * @param protocolFieldConfigs + * @return + */ + public RuleConfig doGetRule(Map parseFixedDataMap, + String ids, + List protocolFieldConfigs) { + if (showSkip()) { + return null; + } + RuleConfig ruleConfig = GenericRuleResolver.machRule(parseFixedDataMap, ids, protocolFieldConfigs, ruleConfigs); + return ruleConfig; + } + + /** + * 是否应该跳过 + * + * @return + */ + private Boolean showSkip() { + return CollectionUtils.isNotEmpty(ruleConfigs) ? false : true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java index 3c05891..856b399 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/ByteMergeProvider.java @@ -1,18 +1,11 @@ package com.casic.missiles.parser.resolver; -import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; -import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.springframework.web.bind.annotation.RequestBody; -import javax.annotation.Resource; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -20,19 +13,17 @@ @Slf4j public class ByteMergeProvider { - @Resource - private FieldRuleEngineMapper fieldRuleEngineMapper; - //拿到所有的值合并到一个值 - public String resolveByteMerge(List valueList, String ruletypeId, String vaildRange) { + public static String resolveByteMerge(List valueList, String ruleTypeId, String vaildRange) { String values = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Map vaildMap = getValidRangeMap(vaildRange); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(ruletypeId); - if (ObjectUtil.isEmpty(fieldRuleEngine)) { - return null; - } + //暂时不处理 +// fieldRuleEngine = fieldRuleConfigMapper.selectById(ruleTypeId); +// if (ObjectUtil.isEmpty(fieldRuleEngine)) { +// return null; +// } Map env2 = new HashMap(); for (int i = 0; i < valueList.size(); i++) { if (vaildMap.containsKey(i)) { @@ -47,7 +38,7 @@ } } - private Map getValidRangeMap(String vaildRange) { + private static Map getValidRangeMap(String vaildRange) { String[] range = vaildRange.split(","); Map vaildMap = new HashMap(); for (int i = 0; i < range.length; i++) { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java index 8d821cd..85d6bbf 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParser.java @@ -1,9 +1,12 @@ package com.casic.missiles.parser.resolver; +import com.casic.missiles.pojo.AbstractFieldConfig; import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; import com.casic.missiles.pojo.RuleConfig; import io.netty.buffer.ByteBuf; +import java.util.List; import java.util.Map; /** @@ -11,18 +14,14 @@ */ public interface FieldParser { -// Map fieldProcess(String protocolContent,); - Map dataParser(RuleConfig ruleConfig, String lightText,String protocolId); + Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength); - Map fixDataParser(String protocolId, ByteBuf buffer); + Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap); - Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf); + ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer); - ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer); - - ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer); - - Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer); + Integer getTotalFilterLength(ProtocolConfig protocolConfig, ByteBuf byteBuf, Map protocolFieldConfigMap); } + diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java new file mode 100644 index 0000000..9e0c00e --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldParserSupport.java @@ -0,0 +1,52 @@ +package com.casic.missiles.parser.resolver; + +import com.casic.missiles.pojo.AbstractFieldConfig; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.util.List; + +public class FieldParserSupport { + + //分别计算bit和byte长度=> 合并长度 + protected Integer calculateLength(List fieldConfigList) { + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + Integer fixedLength = bytefixedLength + bitfixedLength / 8; + return fixedLength; + } + + //找到最大值=> 根据最大值计算业务数据下标 + protected Integer calculatePosition(List fieldConfigList) { + String rex = "[0-9]+"; + Integer max = -1; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) + && Integer.valueOf(fieldConfig.getOriginPositionByte()) > max) { + max = Integer.valueOf(fieldConfig.getOriginPositionByte()); + } + } + Integer bitfixedLength = 0; + Integer bytefixedLength = 0; + for (AbstractFieldConfig fieldConfig : fieldConfigList) { + if (!ObjectUtils.isEmpty(fieldConfig.getOriginPositionByte()) && fieldConfig.getOriginPositionByte().equals(max)) { + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { + if (fieldConfig.getOffsetUnit().equals("bit")) { + bitfixedLength += fieldConfig.getOffsetLength(); + } else if (fieldConfig.getOffsetUnit().equals("byte")) { + bytefixedLength += fieldConfig.getOffsetLength(); + } + } + } + } + Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; + return maxFixedPosition; + } +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java deleted file mode 100644 index dd3a6cd..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/FieldResolver.java +++ /dev/null @@ -1,170 +0,0 @@ -package com.casic.missiles.parser.resolver; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.util.ApplicationContextUtil; -import com.casic.missiles.pojo.ByteResolverParam; -import io.netty.buffer.ByteBuf; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -/** - * 字段解析管理总类 - */ -@Service -@Slf4j -@AllArgsConstructor -public class FieldResolver extends ByteMergeProvider { - - //1、字段截取 => 2、简单的字节解析和复杂的字节解析 - public Object filedParserManger(ByteBuf byteBuf, FieldConfig fieldConfig, Integer maxFixedPosition) { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - //最大固定位置不为空, - if (!ObjectUtil.isEmpty(maxFixedPosition)) { - orignPosition -= maxFixedPosition; - } - Object fieldValue = 0; - //待优化 - if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { - fieldValue = bitToResolver(byteBuf, fieldConfig); - } else { - ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); - fieldValue = parsingFields(fieldBytes, fieldConfig.getRuleJson()); - } - return fieldValue; - } - - //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, - //目前默认配置的规则设置暂不支持配置化,由实现完成 - private Object parsingFields(ByteBuf byteBuf, String ruleJson) { - Object fieldsResolveValue = null; - List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); - if (ObjectUtil.isEmpty(ruleMapList)) { - fieldsResolveValue = defaultResolveBuilder(byteBuf); - } else { - fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); - } - return fieldsResolveValue; - } - - private Object defaultResolveBuilder(ByteBuf byteBuf) { - Integer defaultResolveValue = 0; - for (int i = 0; i < byteBuf.writerIndex(); i++) { - defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; - } - return defaultResolveValue; - } - - //字段解析构建器(针对字节单位的) - //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 - // 字节归并结束或者规则结束=>继续根据规则进行判断 - private Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { - Object customizeResolveValue = null; - try { - List bytStrList = new ArrayList<>(); - //存放到数组里面 - for (int i = 0; i < byteBuf.writerIndex(); i++) { - bytStrList.add(byteBuf.readByte()); - } - int i = 0; - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - customizeResolveValue = this.resolveByteMerge(bytStrList, ruletypeId,vaildRange); - break; - } else { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - List tempBytStr = new ArrayList<>(); - for (int k = 0; i < bytStrList.size(); i++) { - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(k) - .value(bytStrList.get(k)) - .ruletypeId(ruletypeId).build(); - tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); - } - bytStrList = tempBytStr; - } - i++; - } - //字节归并到一起=>继续根据规则进行判断 - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(customizeResolveValue) - .ruletypeId(ruletypeId).build(); - customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(customizeResolveValue)); - return customizeResolveValue; - } catch (RuntimeException ex) { - log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); - return null; - } - } - - /** - * 1、单个字节情况表示字段 - * 2、多字节情况表示字段(暂未处理) - */ - private Object bitToResolver(ByteBuf byteBuf, FieldConfig fieldConfig) { - Object fieldValue = new Object(); - try { - Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); - byte fields = 0x00; - if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); - } else { - fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); - } - - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { - if (!StringUtils.isEmpty(fieldConfig.getExactOrignPosition())) { - fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getExactOrignPosition())).byteValue() - >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); - } else { - fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); - } - } else { - fieldValue = Integer.valueOf(fields & 0xff); - } - if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { - return fieldValue; - } - List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); - int i = 0; - //字节归并到一起=>继续根据规则进行判断 - while (i < ruleMapList.size()) { - String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); - ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); - String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - ByteResolverParam byteResolverParam = ByteResolverParam.builder() - .index(null) - .value(fieldValue) - .ruletypeId(ruletypeId).build(); - fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(fieldValue)); - return fieldValue; - } catch (RuntimeException ex) { - log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); - return null; - } - } -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java new file mode 100644 index 0000000..1d2aeab --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/ByteRuleResolver.java @@ -0,0 +1,36 @@ +package com.casic.missiles.parser.resolver.bytes; + +import cn.hutool.core.util.ObjectUtil; +import com.casic.missiles.mapper.FieldRuleConfigMapper; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.pojo.ByteResolverParam; +import com.googlecode.aviator.AviatorEvaluator; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; +//转换规则 +@Component("convert") +@AllArgsConstructor +@Slf4j +public class ByteRuleResolver implements ByteResolver { + + private final FieldRuleConfigMapper fieldRuleConfigMapper; + + @Override + public Object resolveOperationRule(ByteResolverParam byteResolverParam){ + FieldRuleConfig fieldRuleEngine=fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); + if(ObjectUtil.isEmpty(fieldRuleEngine)){ + return byteResolverParam.getValue(); + } + String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); + Map env2 = new HashMap(); + env2.put("value", (byte) byteResolverParam.getValue()); + String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); + return values; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java index 103821c..786b71c 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/LogicalShiftResolver.java @@ -2,34 +2,34 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("logicalShift") +@Component("logicalShift") @AllArgsConstructor @Slf4j public class LogicalShiftResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //字节位移 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { String logicalValue = ""; - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { Integer index = byteResolverParam.getIndex(); - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return byteResolverParam.getValue(); } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java index 476747d..01149bd 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/OperationResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.pojo.FieldRuleConfig; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -@Service("operation") +@Component("operation") @AllArgsConstructor @Slf4j public class OperationResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; //混合运算,有常量或者乘除的缩放 @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java index 0b82cf4..79abcce 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/PrecisionResolver.java @@ -2,33 +2,33 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.mapper.FieldRuleConfigMapper; import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; +import com.casic.missiles.pojo.FieldRuleConfig; import com.casic.missiles.pojo.ByteResolverParam; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.exception.ExpressionNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; //精度计算 -@Service("precision") +@Component("precision") @AllArgsConstructor @Slf4j public class PrecisionResolver implements ByteResolver { - private final FieldRuleEngineMapper fieldRuleEngineMapper; + private final FieldRuleConfigMapper fieldRuleConfigMapper; @Override public Object resolveOperationRule(ByteResolverParam byteResolverParam) { - RuleEvaluator fieldRuleEngine = new RuleEvaluator(); + FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); Object value = byteResolverParam.getValue(); try { - fieldRuleEngine = fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); + fieldRuleEngine = fieldRuleConfigMapper.selectById(byteResolverParam.getRuletypeId()); if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java deleted file mode 100644 index 5c3f332..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/RuleResolver.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.parser.resolver.bytes; - -import cn.hutool.core.util.ObjectUtil; -import com.casic.missiles.parser.resolver.ByteResolver; -import com.casic.missiles.pojo.RuleEvaluator; -import com.casic.missiles.mapper.FieldRuleEngineMapper; -import com.casic.missiles.pojo.ByteResolverParam; -import com.googlecode.aviator.AviatorEvaluator; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; -//转换规则 -@Service("convert") -@AllArgsConstructor -@Slf4j -public class RuleResolver implements ByteResolver { - - private final FieldRuleEngineMapper fieldRuleEngineMapper; - - @Override - public Object resolveOperationRule(ByteResolverParam byteResolverParam){ - RuleEvaluator fieldRuleEngine=fieldRuleEngineMapper.selectById(byteResolverParam.getRuletypeId()); - if(ObjectUtil.isEmpty(fieldRuleEngine)){ - return byteResolverParam.getValue(); - } - String aviatorExpressTion=fieldRuleEngine.getExcuteOperation(); - Map env2 = new HashMap(); - env2.put("value", (byte) byteResolverParam.getValue()); - String values = String.valueOf(AviatorEvaluator.execute("Double.longBitsToDouble(value)", env2)); - return values; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java new file mode 100644 index 0000000..d3bbd91 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/AbstractCombinedFieldProcessor.java @@ -0,0 +1,15 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; + +import java.util.List; +import java.util.Map; +// 前导码匹配->长度字段 +public interface AbstractCombinedFieldProcessor { + + Map invoke(Map map, ByteBuf byteBuf, List combinedFieldConfigList, + Map fieldConfigsMap, Map storeObjectMap); + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java new file mode 100644 index 0000000..03c8480 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/combined/GenericCombinedFieldResolver.java @@ -0,0 +1,59 @@ +package com.casic.missiles.parser.resolver.combined; + +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.fields.DefaultProtocolFieldParser; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.pojo.FieldConfig; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * @author cz + * @date 2023-6-13 + */ +//依次递增进行数据的解析, +public class GenericCombinedFieldResolver { + + + //通过查询,字段长度长度随机 + public void parseDataField(List combinedFieldConfigList, ByteBuf byteBuf, + Map storeObjectMap, Map fieldConfigsMap) { + Integer frameLength = Integer.valueOf(ByteBufUtil.hexDump(byteBuf)); + //添加前置处理器 + com.casic.missiles.util.ClassUtil classUtil = new com.casic.missiles.util.ClassUtil(); + List abstractCombinedProcessors = classUtil.getSubClassList(AbstractCombinedFieldProcessor.class); + + Map fieldFixedMap = combinedFieldLeadCodeMap(combinedFieldConfigList); + //frameLength + Map combinedProcessorFields = null; + while (byteBuf.readableBytes() < frameLength) { + //一直处理 + for (AbstractCombinedFieldProcessor abstractCombinedProcessor : abstractCombinedProcessors) { + combinedProcessorFields = abstractCombinedProcessor.invoke(combinedProcessorFields, byteBuf, + combinedFieldConfigList, + fieldConfigsMap, storeObjectMap); + if (combinedProcessorFields == null || byteBuf.readableBytes() < frameLength) { + return; + } + } + + } + } + + /** + * 取出前导码匹配集合 + */ + private Map combinedFieldLeadCodeMap(List combinedFieldConfigList) { + Map fieldFixedMap = combinedFieldConfigList + .stream() + .collect(Collectors.toMap(CombinedFieldConfig::getPrefixCode, e -> e)); + return fieldFixedMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java new file mode 100644 index 0000000..643a934 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/DefaultProtocolFieldParser.java @@ -0,0 +1,100 @@ +package com.casic.missiles.parser.resolver.fields; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.FixedPropertyEnum; +import com.casic.missiles.parser.resolver.FieldParser; +import com.casic.missiles.parser.resolver.FieldParserSupport; +import com.casic.missiles.pojo.*; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 保存使用时最基本的信息,并且使用原型模式 + */ +@Slf4j +public class DefaultProtocolFieldParser extends FieldParserSupport implements FieldParser, FixedPropertyEnum { + + //通过传入的配置和报文进行字段解析 + @Override + public Map doGetParseField(List protocolFieldConfigs, ByteBuf buffer, Map storeObjectMap) { + Map dataMap = new HashMap<>(); + for (AbstractFieldConfig protocolFieldConfig : protocolFieldConfigs) { + if (!ObjectUtils.isEmpty(protocolFieldConfig.getOriginPositionByte())) { + Object fieldValue = FieldResolver.parseField(buffer, protocolFieldConfig, null); + if (protocolFieldConfig.getIsStorage() == 1) { + storeObjectMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + dataMap.put(protocolFieldConfig.getFieldName(), fieldValue); + } + } + return dataMap; + } + + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public Map doGetFixedProperty(List protocolFieldConfigs, Integer totalLength) { + Map fixedPropertyMap = new HashMap<>(); + Integer fixedLength = calculateLength(protocolFieldConfigs); + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + fixedPropertyMap.put(FIXED_POSITION, maxFixedPosition); + fixedPropertyMap.put(TOTAL_LENGTH, totalLength); + fixedPropertyMap.put(TAIL_POSITION, totalLength - fixedLength + maxFixedPosition); + return fixedPropertyMap; + } + + //** 获取业务内容的byteBuf + // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 + @Override + public ByteBuf getDataContentBuf(List protocolFieldConfigs, ByteBuf buffer) { + //计算固定长度 + Integer fixedLength = calculateLength(protocolFieldConfigs); + //总长度获取 + String lightText = buffer.toString(Charset.forName("ISO-8859-1")); + Integer totalLength = lightText.length(); + //计算固定长度最大长度 + Integer maxFixedPosition = calculatePosition(protocolFieldConfigs); + //计算数据报文内容 + ByteBuf bizDataFields = buffer.slice(maxFixedPosition - 1, (totalLength - fixedLength)); + return bizDataFields; + } + + /** + * 获取过滤字段的长度 + */ + @Override + public Integer getTotalFilterLength(ProtocolConfig protocolConfig, + ByteBuf byteBuf, + Map protocolFieldConfigMap) { + if (ByteBufUtil.hexDump(byteBuf).equals("")) { + return 0; + } + int totalFilterLength = 0; + String filterFields = protocolConfig.getTotalLengthFilterFields(); + try { + if (!StringUtils.isEmpty(filterFields)) { + String[] filterFieldList = filterFields.split(","); + for (String filterFieldId : filterFieldList) { + if (StringUtils.isNotEmpty(filterFieldId)) { + ProtocolFieldConfig fieldConfig = protocolFieldConfigMap.get(Long.valueOf(filterFieldId)); + //这里都是按字节计算,没有对位进行区分,可能会出现错误 + // 如果对位有需求,需要进一步跟进 + totalFilterLength += fieldConfig.getOffsetLength(); + } + } + } + return totalFilterLength; + } catch (Exception ex) { + log.error("报文确认分发阶段,获取报文总长度过滤长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); + } + return totalFilterLength; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java new file mode 100644 index 0000000..d51e887 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/FieldResolver.java @@ -0,0 +1,169 @@ +package com.casic.missiles.parser.resolver.fields; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.parser.resolver.ByteMergeProvider; +import com.casic.missiles.parser.resolver.ByteResolver; +import com.casic.missiles.pojo.AbstractFieldConfig; +import com.casic.missiles.util.ApplicationContextUtil; +import com.casic.missiles.pojo.ByteResolverParam; +import io.netty.buffer.ByteBuf; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * 字段解析管理总类 + */ +@Slf4j +public class FieldResolver extends ByteMergeProvider { + + //1、字段截取 => 2、简单的字节解析和复杂的字节解析 + public static Object parseField(ByteBuf byteBuf,AbstractFieldConfig fieldConfig, Integer maxFixedPosition) { + Integer orignPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + //最大固定位置不为空, + if (!ObjectUtil.isEmpty(maxFixedPosition)) { + orignPosition -= maxFixedPosition; + } + Object fieldValue = 0; + //待优化 + if (fieldConfig.getOffsetLength() == 1 || fieldConfig.getOffsetUnit().equals("bit")) { + fieldValue = doParseBitField(byteBuf, fieldConfig); + } else { + ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); + fieldValue = doParseByteField(fieldBytes, fieldConfig.getRuleJson()); + } + return fieldValue; + } + + //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, + //目前默认配置的规则设置暂不支持配置化,由实现完成 + private static Object doParseByteField(ByteBuf byteBuf, String ruleJson) { + Object fieldsResolveValue = null; + List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); + if (ObjectUtil.isEmpty(ruleMapList)) { + fieldsResolveValue = defaultResolveBuilder(byteBuf); + } else { + fieldsResolveValue = customizeResolveBuilder(byteBuf, ruleMapList); + } + return fieldsResolveValue; + } + + private static Object defaultResolveBuilder(ByteBuf byteBuf) { + Integer defaultResolveValue = 0; + for (int i = 0; i < byteBuf.writerIndex(); i++) { + defaultResolveValue = defaultResolveValue * 256 + byteBuf.readByte() & 0xff; + } + return defaultResolveValue; + } + + //字段解析构建器(针对字节单位的) + //转化数组=>去查询规则=> 获取bean,规则语句id,对范围进行过滤 =>直到规则结束或者遇到字节归并规则进行字节数据统一 + // 字节归并结束或者规则结束=>继续根据规则进行判断 + private static Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { + Object customizeResolveValue = null; + try { + List bytStrList = new ArrayList<>(); + //存放到数组里面 + for (int i = 0; i < byteBuf.writerIndex(); i++) { + bytStrList.add(byteBuf.readByte()); + } + int i = 0; + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { + if (ruleMapList.get(i).get("ruleType").equals("combine")) { //合并 + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + customizeResolveValue = resolveByteMerge(bytStrList, ruletypeId, vaildRange); + break; + } else { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + List tempBytStr = new ArrayList<>(); + for (int k = 0; i < bytStrList.size(); i++) { + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(k) + .value(bytStrList.get(k)) + .ruletypeId(ruletypeId).build(); + tempBytStr.add(byteResolverBean.resolveOperationRule(byteResolverParam)); + } + bytStrList = tempBytStr; + } + i++; + } + //字节归并到一起=>继续根据规则进行判断 + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(null) + .value(customizeResolveValue) + .ruletypeId(ruletypeId).build(); + customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); + i++; + } + System.out.println(JSON.toJSON(customizeResolveValue)); + return customizeResolveValue; + } catch (RuntimeException ex) { + log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); + return null; + } + } + + /** + * 1、单个字节情况表示字段 + * 2、多字节情况表示字段(暂未处理) + */ + private static Object doParseBitField(ByteBuf byteBuf,AbstractFieldConfig fieldConfig) { + Object fieldValue = new Object(); + try { + Integer orignPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); + byte fields = 0x00; + if (fieldConfig.getOffsetLength() == 2 && fieldConfig.getOffsetUnit().equals("byte")) { + fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition + 1); + } else { + fields = byteBuf.getByte(byteBuf.readerIndex() + orignPosition); + } + + if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit()) && fieldConfig.getOffsetUnit().equals("bit")) { + if (!StringUtils.isEmpty(fieldConfig.getOriginPositionBit())) { + fieldValue = Integer.valueOf((fields & 0xff) << Integer.valueOf(fieldConfig.getOriginPositionBit())).byteValue() + >> Integer.valueOf(8 - fieldConfig.getOffsetLength()); + } else { + fieldValue = Integer.valueOf((fields & 0xff) >> Integer.valueOf(8 - fieldConfig.getOffsetLength())); + } + } else { + fieldValue = Integer.valueOf(fields & 0xff); + } + if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { + return fieldValue; + } + List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); + int i = 0; + //字节归并到一起=>继续根据规则进行判断 + while (i < ruleMapList.size()) { + String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); + ByteResolver byteResolverBean = (ByteResolver) ApplicationContextUtil.getBean(vaildRange); + String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); + ByteResolverParam byteResolverParam = ByteResolverParam.builder() + .index(null) + .value(fieldValue) + .ruletypeId(ruletypeId).build(); + fieldValue = byteResolverBean.resolveOperationRule(byteResolverParam); + i++; + } + System.out.println(JSON.toJSON(fieldValue)); + return fieldValue; + } catch (RuntimeException ex) { + log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); + return null; + } + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java deleted file mode 100644 index 35ae3d0..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/StandardFieldParser.java +++ /dev/null @@ -1,183 +0,0 @@ -package com.casic.missiles.parser.resolver.fields; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.resolver.FieldParser; -import com.casic.missiles.parser.resolver.FieldResolver; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.ProtocolConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufAllocator; -import io.netty.buffer.ByteBufUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; -import org.springframework.util.ObjectUtils; - -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service("standard") -@AllArgsConstructor -@Slf4j -public class StandardFieldParser implements FieldParser { - - private final FieldConfigDao fieldConfigDao; - private final FieldResolver fieldResolver; - - //数据解析 - @Override - public Map dataParser(RuleConfig ruleConfig, String lightText, String protocolId) { - String[] dataFieldIds = ruleConfig.getDataFieldIds().split(","); - ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); - bufferContent.writeBytes(lightText.getBytes(Charset.forName("ISO-8859-1"))); - Map dataMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - for (String dataFieldId : dataFieldIds) { - FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(dataFieldId); - if (!ObjectUtils.isEmpty(fieldConfig)) { - dataMap.put(fieldConfig.getFieldName(), String.valueOf(fieldResolver.filedParserManger(bufferContent, fieldConfig, maxFixedPosition))); - } - } - return dataMap; - } - - //数据解析 - @Override - public Map fixDataParser(String protocolId, ByteBuf buffer) { - List dataFieldIdList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Map dataMap = new HashMap<>(); - for (FieldConfig dataField : dataFieldIdList) { - if (!ObjectUtils.isEmpty(dataField.getOrignPosition())) { - Object fieldValue = (Integer) fieldResolver.filedParserManger(buffer, dataField, null); - dataMap.put(dataField.getFieldName(), fieldValue); - } - } - return dataMap; - } - - @Override - public Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf) { - if (ByteBufUtil.hexDump(byteBuf).equals("")) { - return 0; - } - String filterFields = protocolConfig.getTotalLengthFilterField(); - Integer totalLength = 0; - try { - FieldConfig totalFieldConfig = fieldConfigDao.getFieldConfigById(protocolConfig.getTotalLengthId()); - int totalFilterLength = 0; - if (!StringUtils.isEmpty(filterFields)) { - String[] filterFieldList = filterFields.split(","); - for (String filterField : filterFieldList) { - FieldConfig fieldConfig = fieldConfigDao.getFieldConfigById(filterField); - //这里都是按字节计算,没有对位进行区分,可能会出现错误 - - // 如果对位有需求,需要进一步跟进 - totalFilterLength += fieldConfig.getOffsetLength(); - } - } - totalLength = (Integer) fieldResolver.filedParserManger(byteBuf, totalFieldConfig, null) + totalFilterLength; - } catch (Exception ex) { - log.error("报文确认分发阶段,获取报文总长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); - } - return totalLength; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer) { - //业务内容 - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - String protocolId = String.valueOf(protocolConfig.getId()); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - //计算固定长度 - Integer fixedLength = calculateLength(fieldConfigList); -// Integer totalLength = this.getTotalLength(protocolConfig, buffer); - //总长度获取 - Integer totalLength = lightText.length(); - //计算固定长度最大长度 - Integer maxFixedPosition = calculatePosition(fieldConfigList); -// buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - //计算数据报文内容 - ByteBuf bizDataFields = buffer.slice(maxFixedPosition-1, (totalLength - fixedLength)); - return bizDataFields; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public ByteBuf getFixedData(ProtocolConfig protocolConfig, ByteBuf buffer) { - String lightText = buffer.toString(Charset.forName("ISO-8859-1")); - String protocolId = String.valueOf(protocolConfig.getId()); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer fixedLength = calculateLength(fieldConfigList); -// Integer totalLength = this.getTotalLength(protocolConfig, buffer); - Integer totalLength = lightText.length(); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - ByteBuf fixDataFields = buffer.slice(0, maxFixedPosition); - return fixDataFields; - } - - // 固定字段列表=> 计算固定字段长度=> 计算业务内容起始位置=>结合总长度,计算业务内容长度=>得到业务内容 - @Override - public Map getFixedProperty(ProtocolConfig protocolConfig, ByteBuf buffer) { - String protocolId = String.valueOf(protocolConfig.getId()); - Map fixedPropertyMap = new HashMap<>(); - List fieldConfigList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Integer fixedLength = calculateLength(fieldConfigList); - Integer totalLength = this.getTotalLength(protocolConfig, buffer); - Integer maxFixedPosition = calculatePosition(fieldConfigList); - fixedPropertyMap.put("fixedPosition", maxFixedPosition); - fixedPropertyMap.put("totalLength", totalLength); - fixedPropertyMap.put("tailPosition", totalLength - fixedLength + maxFixedPosition); - return fixedPropertyMap; - } - - //分别计算bit和byte长度=> 合并长度 - private Integer calculateLength(List fieldConfigList) { - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (FieldConfig fieldConfig : fieldConfigList) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - Integer fixedLength = bytefixedLength + bitfixedLength / 8; - return fixedLength; - } - - //找到最大值=> 根据最大值计算业务数据下标 - private Integer calculatePosition(List fieldConfigList) { - String rex = "[0-9]+"; - Integer max = -1; - for (FieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOrignPosition()) - && Integer.valueOf(fieldConfig.getOrignPosition()) > max) { - max = Integer.valueOf(fieldConfig.getOrignPosition()); - } - } - Integer bitfixedLength = 0; - Integer bytefixedLength = 0; - for (FieldConfig fieldConfig : fieldConfigList) { - if (!ObjectUtils.isEmpty(fieldConfig.getOrignPosition()) && fieldConfig.getOrignPosition().equals(max)) { - if (!StringUtils.isEmpty(fieldConfig.getOffsetUnit())) { - if (fieldConfig.getOffsetUnit().equals("bit")) { - bitfixedLength += fieldConfig.getOffsetLength(); - } else if (fieldConfig.getOffsetUnit().equals("byte")) { - bytefixedLength += fieldConfig.getOffsetLength(); - } - } - } - } - Integer maxFixedPosition = max + bytefixedLength + bitfixedLength / 8; - return maxFixedPosition; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java new file mode 100644 index 0000000..d4ec6c7 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/GenericRuleResolver.java @@ -0,0 +1,76 @@ +package com.casic.missiles.parser.rule; + +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.pojo.RuleConfig; +import org.apache.commons.lang3.StringUtils; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class GenericRuleResolver { + + //根据前置字段的值,找到指定的规则 + //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 + //=>循环判断=>通过规则得到业务字段 + public static RuleConfig machRule(Map fixDataMap, + String ids, + List protocolFieldConfigs, + List ruleConfigs) { + List preRuleConfigList = getPreRuleList(ids, protocolFieldConfigs); + //获取前置规则字段 + final Map metaDataMap = getPreRuleFields(preRuleConfigList, fixDataMap); + //准备固定的字段集合 + Map fixDataFieldMap = getFixDataFieldMap(protocolFieldConfigs); + return RuleResolverCore.doMachRule(ruleConfigs, metaDataMap, fixDataMap, fixDataFieldMap); + } + + private static Map getFixDataFieldMap(List protocolFieldConfigs) { + Map fixDataFieldMap = protocolFieldConfigs.stream() + .collect( + Collectors.toMap(ProtocolFieldConfig::getId, ProtocolFieldConfig::getFieldName) + ); + return fixDataFieldMap; + } + + + /** + * 查询前置规则的字段配置 + * + * @param ids + * @return + */ + private static List getPreRuleList(String ids, List protocolFieldConfigs) { + String[] idList = ids.split(","); + Map prepareMaps = new HashMap<>(); + for (String id : idList) { + if (StringUtils.isNotEmpty(id)) { + prepareMaps.put(Long.valueOf(id), ""); + } + } + List preRuleConfigList = protocolFieldConfigs + .stream() + .filter(e -> prepareMaps.containsKey(e.getId())) + .collect(Collectors.toList()); + return preRuleConfigList; + } + + /** + * 获取前置规则解析字段 + */ + private static Map getPreRuleFields(List preRuleFieldConfigList, Map fixDataMap) { + Map ruleFieldMap = new HashMap<>(); + preRuleFieldConfigList.stream() + .forEach( + preRuleFieldConfig -> { + String fieldName = preRuleFieldConfig.getFieldName(); + if (fixDataMap.containsKey(fieldName)) { + ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); + } + } + ); + return ruleFieldMap; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java new file mode 100644 index 0000000..baae7e8 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RuleResolverCore.java @@ -0,0 +1,68 @@ +package com.casic.missiles.parser.rule; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.casic.missiles.pojo.RuleConfig; + +import java.util.*; + +/** + * @author cz + * @date 2023-6-12 + */ +public class RuleResolverCore { + + + public static RuleConfig doMachRule(List ruleConfigList, Map metaDataMap, + Map fixDataMap, + Map fixDataFieldMap) { + Optional ruleConfigOptional = ruleConfigList.stream() + .filter(ruleConfig -> machRuleConfig( + JSON.parseObject(ruleConfig.getMatchRuleJson(), Map.class), metaDataMap)) + .findFirst(); + if (ObjectUtil.isEmpty(ruleConfigOptional)) { + return null; + } + String[] ruleFields = ruleConfigOptional.get().getDataFieldIds().split(","); + Map ruleMetaDataMap = getRuleFields(ruleFields, fixDataMap, fixDataFieldMap); + //递归选定解析规则,进行规则解析 + if (!ruleConfigOptional.get().getIsFinishMatch().equals("1")) { + //递归选定规则 + doMachRule(ruleConfigList, ruleMetaDataMap, fixDataMap, fixDataFieldMap); + } + return ruleConfigOptional.get(); + } + + + private static Map getRuleFields(String[] preRuleConfigList, Map fixedDataMap, + Map fixedFieldMap) { + Map ruleFieldMap = new HashMap<>(); + for (String preRuleConfigId : preRuleConfigList) { + String fieldName = fixedFieldMap.get(preRuleConfigId); + if (fixedDataMap.containsKey(fieldName)) { + ruleFieldMap.put(fieldName, String.valueOf(fixedDataMap.get(fieldName))); + } + } + return ruleFieldMap; + } + + + //匹配规则配置 + private static Boolean machRuleConfig(Map ruleMap, Map metaDataMap) { + if (ruleMap == null || metaDataMap == null) { + return null; + } + //所有的字段在规则里面必须有有配置 + for (String key : metaDataMap.keySet()) { + if (ruleMap.containsKey(key)) { + if (!ruleMap.get(key).equals(metaDataMap.get(key))) { + return false; + } + } else { + return false; + } + } + return true; + } + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java deleted file mode 100644 index 664088d..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/rule/RulerProvider.java +++ /dev/null @@ -1,92 +0,0 @@ -package com.casic.missiles.parser.rule; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.pojo.FieldConfig; -import com.casic.missiles.pojo.PreRuleConfig; -import com.casic.missiles.pojo.RuleConfig; -import com.casic.missiles.mapper.dao.FieldConfigDao; -import com.casic.missiles.mapper.dao.PreRuleConfigDao; -import com.casic.missiles.mapper.dao.RuleConfigDao; -import lombok.AllArgsConstructor; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.*; -import java.util.stream.Collectors; - -@Service -@AllArgsConstructor -public class RulerProvider { - - private final FieldConfigDao fieldConfigDao; - private final PreRuleConfigDao preRuleConfigDao; - private final RuleConfigDao ruleConfigDao; - - //根据前置字段的值,找到指定的规则 - //批量取出前置字段列表=>批量取出固定字段列表 =>批量规则列表=> 通过前置字段id查询字段列表的字段属性及值 - //=>循环判断=>通过规则得到业务字段 - public RuleConfig ruleConfig(Map fixDataMap, String protocolId) { - //批量获取规则 - List preRuleConfigList = preRuleConfigDao.getPreRuleList(protocolId); - //获取固定字段 - Map fixFieldMap = getAllFieldMap(protocolId); - //获取前置规则字段 - final String preRuleFields = getPreRuleFields(preRuleConfigList, fixDataMap, fixFieldMap); - List ruleConfigList = ruleConfigDao.getRuleConfigById(protocolId); - Optional ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig ->preRuleFields.equals( ruleConfig.getParseRuleJson())).findFirst(); - //递归选定解析规则,进行规则解析 - while (!ObjectUtil.isEmpty(ruleConfigOptional) && !ruleConfigOptional.get().getIsBizField().equals("1")) { - String ruleFields = getRuleFields(ruleConfigOptional.get().getDataFieldIds().split(","), fixDataMap, fixFieldMap); - ruleConfigOptional = ruleConfigList.stream().filter(ruleConfig -> ruleConfig.getParseRuleJson().equals(ruleFields)).findFirst(); - } - return ruleConfigOptional.get(); - } - - /** - * 获取前置规则解析字段 - */ - private String getPreRuleFields(List preRuleConfigList, Map fixDataMap, Map fixFieldMap) { - Map ruleFieldMap= new HashMap<>(); - preRuleConfigList.stream() - .forEach( - preRuleConfig -> { - String fieldName = fixFieldMap.get(Long.valueOf(preRuleConfig.getRuleFieldId())); - if (fixDataMap.containsKey(fieldName)) { - ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); - } - } - ); - return JSONObject.toJSONString(ruleFieldMap); - } - - private Map getAllFieldMap(String protocolId) { - List fieldList = fieldConfigDao.getFieldConfigs(protocolId, 1); - Map fixFieldMap = fieldList.stream().collect( - Collectors.toMap(FieldConfig::getId, FieldConfig::getFieldName) - ); - return fixFieldMap; - } - - private String getRuleFields(String[] preRuleConfigList, Map fixDataMap, Map fixFieldMap) { - Map ruleFieldMap= new HashMap<>(); - for (String preRuleConfigId : preRuleConfigList) { - String fieldName = fixFieldMap.get(preRuleConfigId); - if (fixDataMap.containsKey(fieldName)) { - ruleFieldMap.put(fieldName, String.valueOf(fixDataMap.get(fieldName))); - } - } - return JSONObject.toJSONString(ruleFieldMap); - } - - //弃置 - private String ListToString(List ruleFieldList) { - String ruleFields = ""; - for (String ruleField : ruleFieldList) { - ruleFields += ruleField + ","; - } - ruleFields = StringUtils.isEmpty(ruleFields) ? ruleFields : ruleFields.substring(0, ruleFields.length() - 1); - return ruleFields; - } - -} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java index 6177e10..bfa87a5 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/SafeStrategy.java @@ -2,7 +2,7 @@ public interface SafeStrategy { - String decryption(byte[] bytes); + String decryption(String cipher); String encryption(String lightText); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java index 618716c..6236302 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/CRCUtil.java @@ -9,9 +9,9 @@ //十六进制的字符串转换成字节数组 byte[] bytes = hexStrToBinaryStr(msg); //计算CRC8 - byte crc8 = CRC8(bytes, 0, bytes.length); - String crc8ToStr = "" + Integer.toHexString(0xff & crc8); - return crc8ToStr; +// String crc8ToStr = "" + Integer.toHexString(0xff & crc8); +// return crc8ToStr; + return null; } /** @@ -33,50 +33,5 @@ return bytes; } - /** - * CRC8 校验 多项式 x8+x2+x+1 - * - * @param b - * @param off - * @param len - * @return - */ - public static byte CRC8(final byte[] b, final int off, final int len) { - byte result = 0x00; - for (int i = 0; i < len; i++) { - result = CHECKSUM_TABLE[(result ^ (b[i + off] & 0xFF)) & 0xFF]; - } - return (byte) (result & 0xFFL); - } - - private final static byte[] CHECKSUM_TABLE = {(byte) 0x00, (byte) 0x07, (byte) 0x0e, (byte) 0x09, (byte) 0x1c, (byte) 0x1b, - (byte) 0x12, (byte) 0x15, (byte) 0x38, (byte) 0x3f, (byte) 0x36, (byte) 0x31, (byte) 0x24, (byte) 0x23, (byte) 0x2a, - (byte) 0x2d, (byte) 0x70, (byte) 0x77, (byte) 0x7e, (byte) 0x79, (byte) 0x6c, (byte) 0x6b, (byte) 0x62, (byte) 0x65, - (byte) 0x48, (byte) 0x4f, (byte) 0x46, (byte) 0x41, (byte) 0x54, (byte) 0x53, (byte) 0x5a, (byte) 0x5d, (byte) 0xe0, - (byte) 0xe7, (byte) 0xee, (byte) 0xe9, (byte) 0xfc, (byte) 0xfb, (byte) 0xf2, (byte) 0xf5, (byte) 0xd8, (byte) 0xdf, - (byte) 0xd6, (byte) 0xd1, (byte) 0xc4, (byte) 0xc3, (byte) 0xca, (byte) 0xcd, (byte) 0x90, (byte) 0x97, (byte) 0x9e, - (byte) 0x99, (byte) 0x8c, (byte) 0x8b, (byte) 0x82, (byte) 0x85, (byte) 0xa8, (byte) 0xaf, (byte) 0xa6, (byte) 0xa1, - (byte) 0xb4, (byte) 0xb3, (byte) 0xba, (byte) 0xbd, (byte) 0xc7, (byte) 0xc0, (byte) 0xc9, (byte) 0xce, (byte) 0xdb, - (byte) 0xdc, (byte) 0xd5, (byte) 0xd2, (byte) 0xff, (byte) 0xf8, (byte) 0xf1, (byte) 0xf6, (byte) 0xe3, (byte) 0xe4, - (byte) 0xed, (byte) 0xea, (byte) 0xb7, (byte) 0xb0, (byte) 0xb9, (byte) 0xbe, (byte) 0xab, (byte) 0xac, (byte) 0xa5, - (byte) 0xa2, (byte) 0x8f, (byte) 0x88, (byte) 0x81, (byte) 0x86, (byte) 0x93, (byte) 0x94, (byte) 0x9d, (byte) 0x9a, - (byte) 0x27, (byte) 0x20, (byte) 0x29, (byte) 0x2e, (byte) 0x3b, (byte) 0x3c, (byte) 0x35, (byte) 0x32, (byte) 0x1f, - (byte) 0x18, (byte) 0x11, (byte) 0x16, (byte) 0x03, (byte) 0x04, (byte) 0x0d, (byte) 0x0a, (byte) 0x57, (byte) 0x50, - (byte) 0x59, (byte) 0x5e, (byte) 0x4b, (byte) 0x4c, (byte) 0x45, (byte) 0x42, (byte) 0x6f, (byte) 0x68, (byte) 0x61, - (byte) 0x66, (byte) 0x73, (byte) 0x74, (byte) 0x7d, (byte) 0x7a, (byte) 0x89, (byte) 0x8e, (byte) 0x87, (byte) 0x80, - (byte) 0x95, (byte) 0x92, (byte) 0x9b, (byte) 0x9c, (byte) 0xb1, (byte) 0xb6, (byte) 0xbf, (byte) 0xb8, (byte) 0xad, - (byte) 0xaa, (byte) 0xa3, (byte) 0xa4, (byte) 0xf9, (byte) 0xfe, (byte) 0xf7, (byte) 0xf0, (byte) 0xe5, (byte) 0xe2, - (byte) 0xeb, (byte) 0xec, (byte) 0xc1, (byte) 0xc6, (byte) 0xcf, (byte) 0xc8, (byte) 0xdd, (byte) 0xda, (byte) 0xd3, - (byte) 0xd4, (byte) 0x69, (byte) 0x6e, (byte) 0x67, (byte) 0x60, (byte) 0x75, (byte) 0x72, (byte) 0x7b, (byte) 0x7c, - (byte) 0x51, (byte) 0x56, (byte) 0x5f, (byte) 0x58, (byte) 0x4d, (byte) 0x4a, (byte) 0x43, (byte) 0x44, (byte) 0x19, - (byte) 0x1e, (byte) 0x17, (byte) 0x10, (byte) 0x05, (byte) 0x02, (byte) 0x0b, (byte) 0x0c, (byte) 0x21, (byte) 0x26, - (byte) 0x2f, (byte) 0x28, (byte) 0x3d, (byte) 0x3a, (byte) 0x33, (byte) 0x34, (byte) 0x4e, (byte) 0x49, (byte) 0x40, - (byte) 0x47, (byte) 0x52, (byte) 0x55, (byte) 0x5c, (byte) 0x5b, (byte) 0x76, (byte) 0x71, (byte) 0x78, (byte) 0x7f, - (byte) 0x6a, (byte) 0x6d, (byte) 0x64, (byte) 0x63, (byte) 0x3e, (byte) 0x39, (byte) 0x30, (byte) 0x37, (byte) 0x22, - (byte) 0x25, (byte) 0x2c, (byte) 0x2b, (byte) 0x06, (byte) 0x01, (byte) 0x08, (byte) 0x0f, (byte) 0x1a, (byte) 0x1d, - (byte) 0x14, (byte) 0x13, (byte) 0xae, (byte) 0xa9, (byte) 0xa0, (byte) 0xa7, (byte) 0xb2, (byte) 0xb5, (byte) 0xbc, - (byte) 0xbb, (byte) 0x96, (byte) 0x91, (byte) 0x98, (byte) 0x9f, (byte) 0x8a, (byte) 0x8d, (byte) 0x84, (byte) 0x83, - (byte) 0xde, (byte) 0xd9, (byte) 0xd0, (byte) 0xd7, (byte) 0xc2, (byte) 0xc5, (byte) 0xcc, (byte) 0xcb, (byte) 0xe6, - (byte) 0xe1, (byte) 0xe8, (byte) 0xef, (byte) 0xfa, (byte) 0xfd, (byte) 0xf4, (byte) 0xf3}; } \ No newline at end of file diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java index 27c2838..6e078a3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Sm4.java @@ -1,9 +1,6 @@ package com.casic.missiles.parser.safe.impl; -import cn.hutool.core.util.CharsetUtil; -import cn.hutool.crypto.symmetric.SM4; -import cn.hutool.crypto.symmetric.SymmetricCrypto; - +import com.casic.missiles.parser.safe.SafeStrategy; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; @@ -11,19 +8,44 @@ import org.bouncycastle.crypto.engines.SM4Engine; import org.bouncycastle.crypto.params.KeyParameter; import org.bouncycastle.util.encoders.Hex; - -import static cn.hutool.crypto.Mode.ECB; -import static cn.hutool.crypto.Padding.NoPadding; +import org.springframework.stereotype.Component; /** * SM4算法工具类 */ @Slf4j -public class Sm4 { +@Component("sm4") +public class Sm4 implements SafeStrategy { //加解密的字节快大小 public static final int BlockSize = 16; + @Override + public String decryption(String cipher) { + byte[] keyByte = { + 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 + }; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(keyByte); + byte[] in = Hex.decode(cipher); + byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); + String plain = EcbDecrypt(in, keyBytes); + return plain; + } + + @Override + public String encryption(String cipher) { + byte[] keyByte = { + 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 + }; + ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); + key.writeBytes(keyByte); + byte[] in = Hex.decode(cipher); + byte[] keyBytes = Hex.decode(ByteBufUtil.hexDump(key)); + String plain = EcbDecrypt(in, keyBytes); + return plain; + } + /** * SM4ECB加密算法,对内 * @@ -32,8 +54,6 @@ * @return */ private static byte[] ecb_encrypt(byte[] in, byte[] keyBytes) { - - SM4Engine sm4Engine = new SM4Engine(); sm4Engine.init(true, new KeyParameter(keyBytes)); byte[] out = new byte[in.length]; @@ -58,27 +78,6 @@ return cipher; } - - /** - * hutool 解密SM4 - * - * @param encodeContent - * @return - */ - public static String decode(String encodeContent) { - String key = "24ad182507479a5da3ad94d9d78ea203"; - try { - SymmetricCrypto sm4 = new SM4(ECB, NoPadding, key.getBytes()); - String decryptStr = sm4.decryptStr(encodeContent, CharsetUtil.CHARSET_UTF_8); - return decryptStr; - } catch (Exception e) { - e.printStackTrace(); - log.error("SM4解密失败"); - } - return null; - } - - /** * SM4的ECB加密算法 * @@ -129,20 +128,6 @@ return plain; } - /** - * SM4的ECB解密算法 - * - * @param cipher 输入的密文字符串 - * @param key 密钥 - * @return - */ - public static String EcbDecrypt(String cipher, String key) { - byte[] in = Hex.decode(cipher); - byte[] keyBytes = Hex.decode(key); - - String plain = EcbDecrypt(in, keyBytes); - return plain; - } /** * 主函数 @@ -151,28 +136,24 @@ */ public static void main(String[] args) { byte[] ciphertext = { + 0x4B, (byte) 0x8C, (byte) 0x9D, 0x08, (byte) 0xE4, (byte) 0xD3, 0x64, 0x42, (byte) 0xB9, (byte) 0xA5, (byte) 0xFE, (byte) 0xCD, (byte) 0x91, 0x1B, 0x38, (byte) 0xAC, (byte) 0xE9, 0x1C, (byte) 0xCD, 0x53, 0x02, (byte) 0xD7, 0x0C, (byte) 0x9B, (byte) 0x96, 0x30, 0x62, (byte) 0xE8, (byte) 0xFB, (byte) 0xEF, (byte) 0xB9, (byte) 0xFF, (byte) 0xDE, 0x19, (byte) 0x80, 0x35, 0x3E, (byte) 0x90, 0x4F, 0x2F, 0x12, 0x2B, 0x19, (byte) 0x8B, 0x6C, 0x7A, (byte) 0x85, (byte) 0xA1, (byte) 0xB1, (byte) 0x86, (byte) 0xA3, 0x7A, 0x46, 0x0C, 0x2F, (byte) 0x94, 0x4F, 0x7F, 0x2C, 0x56, 0x14, (byte) 0xF3, (byte) 0x89, (byte) 0xC3, - 0x3F, 0x20, (byte) 0xF9, (byte) 0x87, (byte) 0xA1, 0x60, (byte) 0xD9, (byte) 0xA8, (byte) 0xFD, (byte) 0xD7, (byte) 0x9B, 0x4B, 0x26, 0x06, 0x30, 0x44}; + 0x3F, 0x20, (byte) 0xF9, (byte) 0x87, (byte) 0xA1, 0x60, (byte) 0xD9, (byte) 0xA8, (byte) 0xFD, (byte) 0xD7, (byte) 0x9B, 0x4B, 0x26, 0x06, 0x30, 0x44 + }; ByteBuf in = ByteBufAllocator.DEFAULT.heapBuffer(); in.writeBytes(ciphertext); - byte[] keyByte = { 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03 }; ByteBuf key = ByteBufAllocator.DEFAULT.heapBuffer(); - key.writeBytes(ciphertext); - String resCipherData = decode(ByteBufUtil.hexDump(in)); - ByteBuf out = ByteBufAllocator.DEFAULT.heapBuffer(); -// out.writeBytes(resCipherData); -// System.out.println(hexBytes); - System.out.println(resCipherData.toString()); -// String resPlainData = EcbDecrypt(resCipherData, key); -// System.out.println("原始明文:" + data); -// System.out.println("解密后明文:" + resPlainData); + key.writeBytes(keyByte); +// String resCipherData = EcbDecrypt(ByteBufUtil.hexDump(in), ByteBufUtil.hexDump(key)); +// System.out.println(resCipherData); } + } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java index 1395a51..ac5f957 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java @@ -1,7 +1,7 @@ package com.casic.missiles.parser.safe.impl; import io.netty.buffer.ByteBufUtil; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; /** *

@@ -14,9 +14,8 @@ * @author hyl * @version v1.0: Tea.java, v 0.1 2021/3/12 13:48 $ */ -@Service("tea") -///tea算法类 - +//tea算法类 +@Component("tea") public class Tea { public static byte[] MyTea_Encrypt(byte[] MyTeaContent, int ByteLen, byte[] MyTeakey) { @@ -99,7 +98,6 @@ // for(int i32Index = 0; i32Index < 8; i32Index++) { // System.out.print("0x" + Integer.toHexString(MyContent[i32Index]) + " "); // } - // System.out.println("密钥为:"); // for(int i32Index = 0; i32Index < 16; i32Index++) { // System.out.print("0x" + Integer.toHexString(MyKeys[i32Index]) + " "); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java index bdd0721..bd1516a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/FunctionCallback.java @@ -3,7 +3,7 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.parser.sender.DataSubscribeProvider; import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponents; import org.springframework.web.util.UriComponentsBuilder; @@ -12,7 +12,7 @@ import java.util.Collections; import java.util.Map; -@Service("functionCallback") +@Component("functionCallback") public class FunctionCallback implements DataSubscribeProvider { @Resource diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java index 0b44fb9..7526de2 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/MiddlewareSubscribe.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.Map; -@Service("middleware") +@Component("middleware") public class MiddlewareSubscribe implements DataSubscribeProvider { diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java index 5dcee3f..e2f1192 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/sender/impl/NoSqlSubscribe.java @@ -1,11 +1,11 @@ package com.casic.missiles.parser.sender.impl; import com.casic.missiles.parser.sender.DataSubscribeProvider; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.Map; -@Service("nosql") +@Component("nosql") public class NoSqlSubscribe implements DataSubscribeProvider { @Override diff --git a/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java b/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java new file mode 100644 index 0000000..81a5324 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/pojo/Msg.java @@ -0,0 +1,86 @@ +package com.casic.missiles.pojo; + +import lombok.Data; + +/** + * 协议 + */ +@Data +public class Msg { + + /** + * 前导码 + */ + private String preamble; + + /** + * 版本号 + */ + private String version; + + /** + * 内容长度 + */ + private int leng; + + /** + * 设备ID + */ + private String deviceId; + + /** + * 通讯方式 + */ + private Integer connType; + + /** + * 加密方式 + */ + private Integer encryType; + + /** + * 目标地址 + */ + private String destAddr; + + /** + * PDUType + */ + private String PDUType; + + /** + * 操作类型 + */ + private Integer operateType; + + /** + * 传输控制位 PDUType.bit7=0时,表示存在后续的访问;当PDUType.bit7=1时,表示无后续的访问。 + */ + private Integer transControlFlag; + + /** + * 设备类型 + */ + private Integer deviceType; + + /** + * 序号 + */ + private Integer seq; + + /** + * tagList + */ + private String tagList; + + /** + * OidList + */ + private String OidList; + + /** + * CRC + */ + private String CRC; + +} diff --git a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java index 40a5265..97cc984 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/AepPreprocessing.java @@ -40,7 +40,7 @@ String httpContent = msg.toString(Charset.defaultCharset()); log.info(" String : " + msg.toString(Charset.defaultCharset())); String majorContent = httpContent.substring(httpContent.indexOf("{"), httpContent.lastIndexOf("}") + 1); - String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("serviceData")).get("Value")); + String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("RegistryData")).get("Value")); log.info("----------------------------------" + values); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); bufferContent.writeBytes(values.getBytes(Charset.forName("ISO-8859-1"))); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java index 1b132a7..e3ced4b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/predecodec/impl/NbPreprocessing.java @@ -35,7 +35,7 @@ String httpContent = msg.toString(Charset.defaultCharset()); log.info(" String : " + msg.toString(Charset.defaultCharset())); String majorContent = httpContent.substring(httpContent.indexOf("{"), httpContent.lastIndexOf("}") + 1); - String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("serviceData")).get("Value")); + String values = String.valueOf(((JSONObject) ((JSONObject) JSON.parseObject(majorContent).get("payload")).get("RegistryData")).get("Value")); log.info("----------------------------------" + values); ByteBuf bufferContent = ByteBufAllocator.DEFAULT.buffer(); bufferContent.writeBytes(values.getBytes(Charset.forName("ISO-8859-1"))); diff --git a/sensorhub-core/src/main/resources/application.properties b/sensorhub-core/src/main/resources/application.properties deleted file mode 100644 index 8b13789..0000000 --- a/sensorhub-core/src/main/resources/application.properties +++ /dev/null @@ -1 +0,0 @@ - diff --git a/sensorhub-core/src/main/resources/config/application-dev.yml b/sensorhub-core/src/main/resources/config/application-dev.yml index 4f897a8..dcc4c2d 100644 --- a/sensorhub-core/src/main/resources/config/application-dev.yml +++ b/sensorhub-core/src/main/resources/config/application-dev.yml @@ -4,9 +4,9 @@ spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/smartwell_sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true + url: jdbc:mysql://127.0.0.1:3306/sensorhub?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&&useSSL=true username: root - password: Casic203 + password: root session: store-type: redis redis: diff --git a/sensorhub-core/src/main/resources/config/application.yml b/sensorhub-core/src/main/resources/config/application.yml index ae89f9d..7965da1 100644 --- a/sensorhub-core/src/main/resources/config/application.yml +++ b/sensorhub-core/src/main/resources/config/application.yml @@ -30,6 +30,13 @@ port: 6379 password: ew5T4K3#203lwh config-prefix: 'Casic:' +#代码生成器配置 +code: + generate: + #作者 + author: cz + #待生成对象表名 + table-name: bussiness_field_config,combined_field_config sensorhub: config: port: 7091 diff --git a/sensorhub-support/pom.xml b/sensorhub-support/pom.xml index 9a71296..761601c 100644 --- a/sensorhub-support/pom.xml +++ b/sensorhub-support/pom.xml @@ -42,6 +42,12 @@ ${redis.version} + + com.baomidou + mybatis-plus-generator + ${mybatis-plus-generator.version} + + org.reflections diff --git a/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java b/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java new file mode 100644 index 0000000..515ca53 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/enums/FixedPropertyEnum.java @@ -0,0 +1,14 @@ +package com.casic.missiles.enums; + +/** + * @author + * @date + */ +public interface FixedPropertyEnum { + + String FIXED_POSITION = "fixedPosition"; + + String TOTAL_LENGTH = "totalLength"; + + String TAIL_POSITION = "tailPosition"; +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/CombinedFieldMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CombinedFieldMapper.java new file mode 100644 index 0000000..38e8f42 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CombinedFieldMapper.java @@ -0,0 +1,15 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.CombinedFieldConfig; +import org.apache.ibatis.annotations.Mapper; + +/** + * @author cz + * + */ +@Mapper +public interface CombinedFieldMapper extends BaseMapper { + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java new file mode 100644 index 0000000..128b09d --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java @@ -0,0 +1,10 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.CommandEventConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface CommandEventMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java new file mode 100644 index 0000000..042eb3c --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/DatagramEventConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.DatagramEventConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface DatagramEventConfigMapper extends BaseMapper { +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java new file mode 100644 index 0000000..fc95cf4 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldConfigMapper.java @@ -0,0 +1,8 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.FieldConfig; + +public interface FieldConfigMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldRuleConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldRuleConfigMapper.java new file mode 100644 index 0000000..b310a08 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/FieldRuleConfigMapper.java @@ -0,0 +1,10 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.FieldRuleConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface FieldRuleConfigMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java new file mode 100644 index 0000000..9060a69 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.ProtocolConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface ProtocolConfigMapper extends BaseMapper { +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolFieldConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolFieldConfigMapper.java new file mode 100644 index 0000000..1b47180 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/ProtocolFieldConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.pojo.ProtocolFieldConfig; + +public interface ProtocolFieldConfigMapper extends BaseMapper { + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java b/sensorhub-support/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java new file mode 100644 index 0000000..6fa6936 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/mapper/RuleConfigMapper.java @@ -0,0 +1,9 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.pojo.RuleConfig; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface RuleConfigMapper extends BaseMapper { +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/AbstractFieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/AbstractFieldConfig.java new file mode 100644 index 0000000..ba9aea2 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/AbstractFieldConfig.java @@ -0,0 +1,38 @@ +package com.casic.missiles.pojo; + +import lombok.Data; + +@Data +public class AbstractFieldConfig { + /** + * 字段名称 + */ + private String fieldName; + /** + * 按照字段评估进行字段解析 + */ + private String ruleJson; + /** + * 起始位置(单位byte) + */ + private Integer OriginPositionByte; + /** + * 起始位置,是否需要bit位置(单位bit)小于8, 没有不需要填写 + */ + private String OriginPositionBit; + /** + * 偏移长度 + */ + private Integer offsetLength; + /** + * 偏移单位(bit/byte) + */ + private String offsetUnit; + /** + * 是否需要转存 + */ + private Integer isStorage; + + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/CombinedFieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/CombinedFieldConfig.java new file mode 100644 index 0000000..4f4de6a --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/CombinedFieldConfig.java @@ -0,0 +1,41 @@ +package com.casic.missiles.pojo; + +import lombok.Data; + +import java.util.Date; + +/** + * 组合配置 + * + * @author cz + * @date 20 + */ +@Data +public class CombinedFieldConfig { + + private Long id; + private Long ruleId; + /** + * 前缀编码 + */ + private String prefixCode; + + /** + * 字段动态的id + */ + private Long dynamicLengthId; + /** + * 对应的要解析字段的ids + */ + private String dataFieldIds; + + /** + * 字段动态的id + */ + private String combinedFieldIds; + + private Date lastTime; + + private Date createTime; + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldConfig.java index a07d20d..8304dc6 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldConfig.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldConfig.java @@ -5,31 +5,28 @@ import java.util.Date; +/** + * @author cz + * 1、该表与实际解析的内容实例解析有关 + * 2、该表字段是随机出现的,和帧结构无关,无法预料的 + * 3、该表字段解析根据FieldEvaluatorConfig进行字段解析 + */ @Data -@TableName("field_config") -public class FieldConfig { +@TableName("business_field_config") +public class FieldConfig extends AbstractFieldConfig { private Long id; -// private String preFieldConfig; - private Long protocolId; - - private String isFixed; - private String uploadDeliveryChange; - - private String replyRule; - private String ruleJson; - + /** + * 协议配置id + */ + private Long ruleId; + /** + * 字段名称 + */ private String fieldName; - private String isStorage; - private Integer orignPosition; - private String exactOrignPosition; - - private Integer offsetLength; - private String offsetUnit; private String ownerId; private Date createTime; private Date lastTime; - } diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldRuleConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldRuleConfig.java new file mode 100644 index 0000000..2e09879 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/FieldRuleConfig.java @@ -0,0 +1,20 @@ +package com.casic.missiles.pojo; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +@TableName("field_rule_config") +@Data +public class FieldRuleConfig { + + private Long id; + private String name; + private String desc; + private String condition; + private String excuteOperation; + private Date lasTime; + private Date createTime; + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/Msg.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/Msg.java deleted file mode 100644 index 81a5324..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/Msg.java +++ /dev/null @@ -1,86 +0,0 @@ -package com.casic.missiles.pojo; - -import lombok.Data; - -/** - * 协议 - */ -@Data -public class Msg { - - /** - * 前导码 - */ - private String preamble; - - /** - * 版本号 - */ - private String version; - - /** - * 内容长度 - */ - private int leng; - - /** - * 设备ID - */ - private String deviceId; - - /** - * 通讯方式 - */ - private Integer connType; - - /** - * 加密方式 - */ - private Integer encryType; - - /** - * 目标地址 - */ - private String destAddr; - - /** - * PDUType - */ - private String PDUType; - - /** - * 操作类型 - */ - private Integer operateType; - - /** - * 传输控制位 PDUType.bit7=0时,表示存在后续的访问;当PDUType.bit7=1时,表示无后续的访问。 - */ - private Integer transControlFlag; - - /** - * 设备类型 - */ - private Integer deviceType; - - /** - * 序号 - */ - private Integer seq; - - /** - * tagList - */ - private String tagList; - - /** - * OidList - */ - private String OidList; - - /** - * CRC - */ - private String CRC; - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/PreRuleConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/PreRuleConfig.java deleted file mode 100644 index bfcf914..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/PreRuleConfig.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.casic.missiles.pojo; - -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -import java.util.Date; - -@Data -@TableName("pre_rule_config") -public class PreRuleConfig { - - private Long id; - private String protocolId; - private String ruleFieldId; - private String ownerId; - private Date createTime; - private Date lastTime; -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolConfig.java index 274ad42..bdac11f 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolConfig.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolConfig.java @@ -5,18 +5,52 @@ import java.util.Date; +/** + * 协议配置表,协议配置与帧结构有关 + * 1、层级关系,协议之后是规则,规则对应设备类型的各种上数规则 + * 2、规则对应协议配置的实例流程 + * 3、每种可根据设备类型和操作类型进行上数规则进行区分 + */ @Data @TableName("protocol_config") public class ProtocolConfig { private Long id; + /** + * 前导码 + */ private String preFix; - private String unpackId; - private String totalLengthId; - private String totalLengthFilterField; + /** + * 拆包id + */ + private Long unpackId; + /** + * 总长度id + */ + private Long totalLengthId; + /** + * + */ + private String totalLengthFilterFields; + /** + * 动态长度ids + */ private String dynamicLengthId; + /** + * 动态长度json(预留字段) + */ private String dynamicLengthJson; - private String tailStr; + /** + * 规则字段所解析预准备的字段 + */ + private String rulePrepareFields; + /** + * 结尾标志 + */ + private Long tailStr; + /** + * 备注 + */ private String remark; private String ownerId; private Date createTime; diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolFieldConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolFieldConfig.java new file mode 100644 index 0000000..db794bd --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/ProtocolFieldConfig.java @@ -0,0 +1,43 @@ +package com.casic.missiles.pojo; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +/** + * 协议字段配置表 + * 该表用户存放帧结构固定格式的字段 + * 有以下两个用途 + * (1)、固定格式的字段可用于规则匹配 + * (2)、固定格式的字段可用于报文回复 + * @author cz + * @date 2023-06-09 + */ +@Data +@TableName("protocol_field_config") +public class ProtocolFieldConfig extends AbstractFieldConfig{ + + private Long id; + /** + * 协议配置id + */ + private Long protocolId; + /** + * 上传下发是否有变化, 没有变化,可以直接组装 + */ + private String isReplyFix; + /** + * 按照字段评估进行字段解析 + */ + private Long fieldEvaluatorId; + /** + * 回复规则 + */ + private String replyRule; + + private String ownerId; + private Date createTime; + private Date lastTime; + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java index 3b53493..febf835 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleConfig.java @@ -6,18 +6,40 @@ import java.util.Date; /** - * 加密字段解析和规则有关,事件调到该流程下面 + * @author cz + * todo: 匹配协议对应业务实例 + * 1、一个协议可以多种的流程规则 + * 2、规则可以支持递归规则流程 */ @Data @TableName("rule_config") public class RuleConfig { - private Long id; private String protocolId; - private String isBizField; - private String parseRuleJson; + /** + * 是否完成规则配置,没有完成, + * 则需要根据规则继续匹配 + */ + private String isFinishMatch; + /** + * 待匹配解析规则 + * {“data_field”:"data_value"} + */ + private String matchRuleJson; + /** + * 待解析字段ids + */ private String dataFieldIds; - private String aviatorFilterJson; + + /** + * 待解析组合字段ids + */ + private String combinedFieldIds; + + /** + * aviator + */ + private String conditionExpression; private Date createTime; private Date lastTime; } diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleDict.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleDict.java deleted file mode 100644 index cc7f389..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleDict.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.casic.missiles.pojo; - -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -@Data -@TableName("rule_dict") -public class RuleDict { - - private Long id; - private Long pid; - private String name; - private String code; - private String ownerId; - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleEvaluator.java b/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleEvaluator.java deleted file mode 100644 index ed16610..0000000 --- a/sensorhub-support/src/main/java/com/casic/missiles/pojo/RuleEvaluator.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.pojo; - -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -import java.util.Date; - -@TableName("rule_evaluator") -@Data -public class RuleEvaluator { - - private Long id; - private String name; - private String desc; - private String condition; - private String excuteOperation; - private Date lasTime; - private Date createTime; - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/CombinedFieldConfigRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/CombinedFieldConfigRegistry.java new file mode 100644 index 0000000..fa59b90 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/CombinedFieldConfigRegistry.java @@ -0,0 +1,12 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.CombinedFieldConfig; + +import java.util.List; + +public interface CombinedFieldConfigRegistry { + + List getCombinedFieldConfigList(Long ruleId); + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/CommandEventRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/CommandEventRegistry.java new file mode 100644 index 0000000..fb97d87 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/CommandEventRegistry.java @@ -0,0 +1,8 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.CommandEventConfig; + +public interface CommandEventRegistry { + + CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName); +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/DatagramEventRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/DatagramEventRegistry.java new file mode 100644 index 0000000..fb34641 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/DatagramEventRegistry.java @@ -0,0 +1,11 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.DatagramEventConfig; + +import java.util.List; + +public interface DatagramEventRegistry{ + + List getDatagramEventList(Long ruleId); + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/FieldConfigRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/FieldConfigRegistry.java new file mode 100644 index 0000000..759642e --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/FieldConfigRegistry.java @@ -0,0 +1,20 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.FieldConfig; + +import java.util.List; + +public interface FieldConfigRegistry { + + + List getFieldConfigList(Long ruleId); + + FieldConfig getFieldConfigById(String fieldId); + + List getFieldConfigs(String protocolId, Integer isFixed); + + List getStorageFieldConfig(String protocolId); + + +} + diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/FieldRuleConfigRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/FieldRuleConfigRegistry.java new file mode 100644 index 0000000..33da70c --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/FieldRuleConfigRegistry.java @@ -0,0 +1,11 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.FieldRuleConfig; + +import java.util.List; + +public interface FieldRuleConfigRegistry { + + List getFieldRuleConfigList(Long ruleId); + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/ProtocolConfigRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/ProtocolConfigRegistry.java new file mode 100644 index 0000000..1725189 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/ProtocolConfigRegistry.java @@ -0,0 +1,12 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.ProtocolConfig; + +import java.util.List; + +public interface ProtocolConfigRegistry { + + List getProtocolConfigList(String firstChar); + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/ProtocolFieldConfigRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/ProtocolFieldConfigRegistry.java new file mode 100644 index 0000000..19d1b9a --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/ProtocolFieldConfigRegistry.java @@ -0,0 +1,14 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.ProtocolFieldConfig; + +import java.util.List; + +public interface ProtocolFieldConfigRegistry { + + + List getProtocolFieldConfigList(Long protocolId); + + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/RuleConfigRegistry.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/RuleConfigRegistry.java new file mode 100644 index 0000000..3d2a75c --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/RuleConfigRegistry.java @@ -0,0 +1,14 @@ +package com.casic.missiles.registry; + +import com.casic.missiles.pojo.RuleConfig; + +import java.util.List; + +public interface RuleConfigRegistry { + + RuleConfig getNextRuleConfig(String ruleFields); + + + List getRuleConfigById(Long protocolId); + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CombinedFieldConfigRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CombinedFieldConfigRegistryImpl.java new file mode 100644 index 0000000..822cac6 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CombinedFieldConfigRegistryImpl.java @@ -0,0 +1,24 @@ +package com.casic.missiles.registry.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.CombinedFieldMapper; +import com.casic.missiles.pojo.CombinedFieldConfig; +import com.casic.missiles.registry.CombinedFieldConfigRegistry; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class CombinedFieldConfigRegistryImpl extends ServiceImpl implements CombinedFieldConfigRegistry { + + @Override + public List getCombinedFieldConfigList(Long ruleId) { + QueryWrapper queryWrapper = new QueryWrapper() + .eq("rule_id", ruleId); + List combinedFieldConfigs = this.baseMapper.selectList(queryWrapper); + return combinedFieldConfigs; + } + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CommandEventRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CommandEventRegistryImpl.java new file mode 100644 index 0000000..f0d3559 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/CommandEventRegistryImpl.java @@ -0,0 +1,25 @@ +package com.casic.missiles.registry.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.CommandEventMapper; +import com.casic.missiles.pojo.CommandEventConfig; +import com.casic.missiles.registry.CommandEventRegistry; + +import java.util.List; +import java.util.Optional; + +public class CommandEventRegistryImpl extends ServiceImpl implements CommandEventRegistry { + + @Override + public CommandEventConfig getCommandEventByIdName(String protocolId, String sceneName) { + QueryWrapper queryWrapper = new QueryWrapper() + .eq("protocol_id", protocolId) + .eq("scene", sceneName) + .eq("enabled", 1); + List commandEventConfig = this.baseMapper.selectList(queryWrapper); + Optional optionalEventConfig = commandEventConfig.stream().findFirst(); + return optionalEventConfig.isPresent() ? optionalEventConfig.get() : null; + } + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/DatagramEventRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/DatagramEventRegistryImpl.java new file mode 100644 index 0000000..2e58698 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/DatagramEventRegistryImpl.java @@ -0,0 +1,26 @@ +package com.casic.missiles.registry.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.DatagramEventConfigMapper; +import com.casic.missiles.pojo.DatagramEventConfig; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.registry.DatagramEventRegistry; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class DatagramEventRegistryImpl extends ServiceImpl implements DatagramEventRegistry { + + + @Override + public List getDatagramEventList(Long ruleId) { + QueryWrapper queryWrapper = new QueryWrapper() + .eq("rule_id", ruleId); + List fieldConfigList = this.baseMapper.selectList(queryWrapper); + return fieldConfigList; + } + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/FieldConfigRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/FieldConfigRegistryImpl.java new file mode 100644 index 0000000..6ae4422 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/FieldConfigRegistryImpl.java @@ -0,0 +1,50 @@ +package com.casic.missiles.registry.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.FieldConfigMapper; +import com.casic.missiles.pojo.FieldConfig; +import com.casic.missiles.registry.FieldConfigRegistry; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * @author cz + */ +@Service +public class FieldConfigRegistryImpl extends ServiceImpl implements FieldConfigRegistry { + + @Override + public List getFieldConfigList(Long ruleId) { + QueryWrapper queryWrapper = new QueryWrapper() + .eq("rule_id", ruleId); + List fieldConfigList = this.baseMapper.selectList(queryWrapper); + return fieldConfigList; + } + + @Override + public FieldConfig getFieldConfigById(String fieldId) { + FieldConfig fieldConfig = this.baseMapper.selectById(fieldId); + return fieldConfig; + } + + @Override + public List getFieldConfigs(String protocolId, Integer isFixed) { + QueryWrapper queryWrapper = new QueryWrapper() + .eq("protocol_id", protocolId) + .eq("is_fixed", isFixed); + List fieldConfigList = this.baseMapper.selectList(queryWrapper); + return fieldConfigList; + } + + @Override + public List getStorageFieldConfig(String protocolId) { + QueryWrapper queryWrapper = new QueryWrapper() + .eq("protocol_id", protocolId) + .eq("is_fixed", 1) + .eq("is_storage", 1); + List fieldConfigList = this.baseMapper.selectList(queryWrapper); + return fieldConfigList; + } +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/FieldRuleConfigRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/FieldRuleConfigRegistryImpl.java new file mode 100644 index 0000000..406fe65 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/FieldRuleConfigRegistryImpl.java @@ -0,0 +1,23 @@ +package com.casic.missiles.registry.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.FieldRuleConfigMapper; +import com.casic.missiles.pojo.FieldRuleConfig; +import com.casic.missiles.registry.FieldRuleConfigRegistry; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class FieldRuleConfigRegistryImpl extends ServiceImpl implements FieldRuleConfigRegistry { + + @Override + public List getFieldRuleConfigList(Long ruleId) { + QueryWrapper queryWrapper = new QueryWrapper() + .eq("rule_id", ruleId); + List fieldRuleConfigList = this.baseMapper.selectList(queryWrapper); + return fieldRuleConfigList; + } + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/ProtocolConfigRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/ProtocolConfigRegistryImpl.java new file mode 100644 index 0000000..8a516e5 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/ProtocolConfigRegistryImpl.java @@ -0,0 +1,26 @@ +package com.casic.missiles.registry.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.ProtocolConfigMapper; +import com.casic.missiles.pojo.ProtocolConfig; +import com.casic.missiles.registry.ProtocolConfigRegistry; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class ProtocolConfigRegistryImpl extends ServiceImpl implements ProtocolConfigRegistry { + + /** + * 无条件全查询,作为一次加载的初始化查询 + * + * @return + */ + @Override + public List getProtocolConfigList(String firstChar) { + + return this.baseMapper.selectList(null); + } + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/ProtocolFieldConfigRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/ProtocolFieldConfigRegistryImpl.java new file mode 100644 index 0000000..f4c5a89 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/ProtocolFieldConfigRegistryImpl.java @@ -0,0 +1,26 @@ +package com.casic.missiles.registry.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.ProtocolFieldConfigMapper; +import com.casic.missiles.pojo.ProtocolFieldConfig; +import com.casic.missiles.registry.ProtocolFieldConfigRegistry; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; + +@Service +public class ProtocolFieldConfigRegistryImpl extends ServiceImpl implements ProtocolFieldConfigRegistry { + + @Override + public List getProtocolFieldConfigList(Long protocolId) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("protocol_id", protocolId); + List protocolFieldConfigs = this.baseMapper.selectList(queryWrapper); + return protocolFieldConfigs; + } + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/RuleConfigRegistryImpl.java b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/RuleConfigRegistryImpl.java new file mode 100644 index 0000000..63865ed --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/registry/impl/RuleConfigRegistryImpl.java @@ -0,0 +1,31 @@ +package com.casic.missiles.registry.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.RuleConfigMapper; +import com.casic.missiles.pojo.RuleConfig; +import com.casic.missiles.registry.RuleConfigRegistry; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class RuleConfigRegistryImpl extends ServiceImpl implements RuleConfigRegistry { + + + @Override + public RuleConfig getNextRuleConfig(String ruleFields) { + QueryWrapper queryWrapper = new QueryWrapper() + .eq("parse_rule_json", ruleFields); + return this.baseMapper.selectOne(queryWrapper); + } + + @Override + public List getRuleConfigById(Long protocolId) { + QueryWrapper queryWrapper = new QueryWrapper() + .eq("protocol_id", protocolId); + return this.baseMapper.selectList(queryWrapper); + } + + +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/util/AutoCodeGenerator.java b/sensorhub-support/src/main/java/com/casic/missiles/util/AutoCodeGenerator.java new file mode 100644 index 0000000..d3079d1 --- /dev/null +++ b/sensorhub-support/src/main/java/com/casic/missiles/util/AutoCodeGenerator.java @@ -0,0 +1,104 @@ +package com.casic.missiles.util; + +import com.baomidou.mybatisplus.generator.FastAutoGenerator; +import com.baomidou.mybatisplus.generator.config.DataSourceConfig; +import com.baomidou.mybatisplus.generator.config.rules.DateType; +import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy; +import org.springframework.core.env.Environment; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * @Description: mybatis-plus代码生成器 + * @Author: wangpeng + * @Date: 2022/8/11 17:52 + */ +@RestController +@RequestMapping("/code") +public class AutoCodeGenerator { + + private static String driverClassName; // 驱动名称 + private static String username; // 数据库用户名 + private static String password; // 数据库用户密码 + private static String url; // 数据库连接URL + private static String author; // 作者 + private static String tableName; // 待生成对象表名 + + /** + * 读取 application.properties 配置文件 + */ + private static void readProperty() { + Environment environment = SpringContextUtil.getApplicationContext().getEnvironment(); + driverClassName = environment.getProperty("spring.datasource.driver-class-name"); + username = environment.getProperty("spring.datasource.username"); + password = environment.getProperty("spring.datasource.password"); + url = environment.getProperty("spring.datasource.url"); + author = environment.getProperty("code.generate.author"); + tableName = environment.getProperty("code.generate.table-name"); + } + + /** + * MyBatis-Plus 代码生成器「新」 + * 适用版本:mybatis-plus-generator 3.5.1 及其以上版本,对历史版本不兼容 + */ + @GetMapping("generator") + public static void main(String [] args) { + // 加载数据库配置 + readProperty(); + // 项目路径 + String projectPath = System.getProperty("user.dir"); + // 根据数据源信息,创建文件,生成代码 + FastAutoGenerator.create(new DataSourceConfig.Builder(url,username,password)) + // 全局配置 + .globalConfig(builder -> builder + // 作者 + .author(author) + // 输出路径 + .outputDir(projectPath + "/target/generated-sources") + .dateType(DateType.TIME_PACK) + ) + // 包配置 + .packageConfig(builder -> builder + // 指定父包名 + .parent("com.casic.missiles") + .entity("model") + .Registry("Registry") + .ServiceImpl("Registry.impl") + .mapper("mapper") + .controller("controller")) + // 模版配置 +// .templateConfig(builder -> builder +// .entity("/templates/entity.java") +// .Registry("/templates/Registry.java") +// .ServiceImpl("/templates/ServiceImpl.java") +// .mapper("/templates/mapper.java") +// .controller("/templates/controller.java")) + // 策略配置 + .strategyConfig(builder -> builder + // 指定表名,用逗号分隔 + .addInclude(tableName.split(",")) + // 先开启 Controller 配置 + .controllerBuilder() + // 开启生成 @RestController 控制器 + .enableRestStyle() + // 开启驼峰转连字符 + .enableHyphenStyle() + // 先开启 Entity 配置 + .entityBuilder() + // 开启主键自增 +// .idType(IdType.AUTO) + // 数据库表映射到实体的命名策略,驼峰命名 + .naming(NamingStrategy.underline_to_camel) + // 数据库表字段映射到实体的命名策略,驼峰命名 + .columnNaming(NamingStrategy.underline_to_camel) + // 开启生成实体时生成字段注解 + .enableTableFieldAnnotation() + .enableLombok() + .mapperBuilder() + .enableBaseResultMap() + .enableBaseColumnList()) + // 执行 + .execute(); + } +} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/util/MsgUtil.java b/sensorhub-support/src/main/java/com/casic/missiles/util/MsgUtil.java index a6915f1..ab41f1e 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/util/MsgUtil.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/util/MsgUtil.java @@ -1,6 +1,5 @@ package com.casic.missiles.util; -import com.casic.missiles.pojo.Msg; import com.casic.missiles.enums.FrameAttributeEnums; import com.casic.missiles.enums.FrameStructEnum; import com.casic.missiles.enums.OperatorTypeEnum; @@ -251,21 +250,21 @@ return false; } - public static Msg getMsg() { - Msg msg = new Msg(); - msg.setPreamble("A3"); - msg.setVersion("V2.0"); - String tagList = "hello world"; - int byteLeng = tagList.getBytes().length; - msg.setLeng(byteLeng); - msg.setDeviceId("122121"); - msg.setConnType(1); - msg.setOperateType(3); - msg.setDeviceType(1); - msg.setTransControlFlag(0); - msg.setDestAddr("111111"); - msg.setSeq(1); - msg.setTagList(tagList); - return msg; - } +// public static Msg getMsg() { +// Msg msg = new Msg(); +// msg.setPreamble("A3"); +// msg.setVersion("V2.0"); +// String tagList = "hello world"; +// int byteLeng = tagList.getBytes().length; +// msg.setLeng(byteLeng); +// msg.setDeviceId("122121"); +// msg.setConnType(1); +// msg.setOperateType(3); +// msg.setDeviceType(1); +// msg.setTransControlFlag(0); +// msg.setDestAddr("111111"); +// msg.setSeq(1); +// msg.setTagList(tagList); +// return msg; +// } } diff --git a/sensorhub-support/src/main/java/com/casic/missiles/util/RedisCommon.java b/sensorhub-support/src/main/java/com/casic/missiles/util/RedisCommon.java index 828daa0..1358c21 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/util/RedisCommon.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/util/RedisCommon.java @@ -5,7 +5,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.data.redis.core.RedisTemplate; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.Map; import java.util.concurrent.TimeUnit; @@ -13,7 +13,7 @@ /** * Created by test203 on 2019/5/30. */ -@Service +@Component public class RedisCommon { @Autowired